Fame
Facade for Agent Memory — a config-driven entity server over PDT. Memory types and agent identities are defined as TOML configs and served by one generic entity engine: no hardcoded handlers, no schema migrations when you add an entity.
Entities are stored as PDT assets, scoped per caller via the X-Instance-Id header, and
authorized per request by Cedar policies.
Entities
| Entity | Slug | Default tags | Purpose |
|---|---|---|---|
| Semantic memory | semantic-memory |
type:agent-memory, memory-type:semantic |
Long-term facts and knowledge |
| Episodic memory | episodic-memory |
type:agent-memory, memory-type:episodic |
Events and experiences |
| Procedural memory | procedural-memory |
type:agent-memory, memory-type:procedural |
How-to procedures and skills |
| Agent identity | agent-identity |
type:agent-identity |
An agent's charter / self-model |
Entity behavior lives in entities/*.toml: slug, default tags, Cedar actions, field
mappings (text / markdown / tag_array / enum / metadata / date), and list/detail view
layouts. Adding an entity is a config change, not a code change — the list/get engine
filters by the entity's full default-tag set.
API
GET /api/v1/{slug}s # list (X-Instance-Id scoped)
POST /api/v1/{slug}s # create
GET /api/v1/{slug}s/{id} # get
PATCH /api/v1/{slug}s/{id}/status # status update
PATCH /api/v1/{slug}s/{id}/content # content update (agent-identity only)
GET /health # {status, service, version}
GET /swagger-ui # OpenAPI UI
Authentication and authorization
Fame validates OIDC bearer tokens through
pep (JWKS signature, expiry, audience, optional userinfo
enrichment) and enforces policies/rbac.cedar per request with a default-deny
posture. Roles travel as a role attribute on the principal, built from JWT claims.
Authorization is attribute-based and defined per entity in the TOML configs — e.g. an
agent may edit its own identity but not another's: the identity is stamped at birth with
an admin_group (mem-<agent>), and the edit permit requires that group in the caller's
claims. Memory assets are likewise born with an auth_context so their owner group can
read them.
Failure contract: a rejected token answers 401 with
WWW-Authenticate: Bearer error="invalid_token" and a retryable JSON body — never a
silent downgrade to a role-less principal.
⚠️
dev_mode = trueinjects admin claims into any request that carries no bearer token — including when auth is enabled. Never enable it outside local development.
Configuration
Loaded from fame.toml (path override: FAME_CONFIG_PATH) with FAME_-prefixed
environment overrides (nest with __, e.g. FAME_AUTH__ENABLED=true):
= "0.0.0.0"
= 8628
= "http://localhost:8090" # PDT API base URL
= "entities"
[]
= false # OIDC enforcement
= "http://localhost:8080"
= true # see warning above
[]
= true # boot fails loudly if init fails while enabled
= "./policies"
= "./policies/schema.cedarschema"
= true
FAME_HOST, FAME_PORT, FAME_PDT_URL, FAME_ENTITY_DIR cover the top level; CEDAR_*
and AUTH_* environment variables provide fallbacks for the sections above. See
fame.env.example.
Development
FAME_IT_PDT_BIN=/path/to/pdt
The two-tier harness exists because wire details matter: the mock persists auth_context
exactly like real PDT at create, so test-green means wire-green. Policies are compiled
into the binary via include_str! — scripts/check_policies.sh validates the on-disk
sources exactly as a release would.
License
Dual-licensed under MIT or Apache-2.0, at your option.