Content-addressable storage: blobs on disk, addressed by content hash
(fjs/cas/module.f.mjs). The store is type-agnostic — it keeps
raw bytes only, sharded by cBase32 hash under ~/.cas/ — and never records a
mutable pointer or a per-blob type tag; both are recovered at the edges that
need them.
- fjs/mcp — an MCP front end for agents, including read-time
media-type detection:
cas_add/cas_get/cas_listplus fjs/cas/evo'sevo_list/evo_head/evo_revision/evo_add, all served from one process. casCLI — direct filesystem access for content larger than the MCP inline-content cap.- fjs/cas/evo — the Evo API: subjects and revision heads (vnd.fjs.revision) cached in memory over this store.
Because the store is type-agnostic, a blob's format is recovered on read, not
declared on write. fjs/media does that recovery: byte-signature
sniffing (PNG/JPEG/GIF/WebP/PDF/ZIP, fjs/media/type) plus, for JSON blobs
that opt in, a self-describing dialect tag validated against an rtti
schema.
- vnd.fjs.revision — one step in the evolution of a
mutable object (a document, a config, any mutable state referenced by a
stable name) on top of this immutable store: it links back to its parent
revision(s) (a DAG, so concurrent edits can merge) and carries the full
materialized content of that step. Served as
application/vnd.fjs.revision+json; see fjs/media/revision/README.md for the full spec. - vnd.fjs.lock — a revision's
lockmap stored on its own, so several revisions can point at one agreed dependency resolution instead of each carrying a copy. History-free by design: history for lock content is an ordinary revision whosesnapshotis one of these blobs. Served asapplication/vnd.fjs.lock+json; see fjs/media/lock/README.md for the full spec.