Skip to content

Architecture

agent-passport composes three layers on top of did:key identities: an operator-signed passport (a VC with scopes), agent-signed actions, and a verifier that checks the chain.

flowchart LR
  OP["operator DID"] -- issuePassport --> P["Passport (VC)<br/>name · model · scopes"]
  P -- about --> AG["agent DID"]
  AG -- signAction --> ACT["Action (JWT)"]
  P --> VF{{"verifier"}}
  ACT --> VF
  VF --> OK["trusted if:<br/>action→agent · passport→trusted operator · scope covers action"]

Module map

Module Responsibility
did.ts Ed25519 did:key identities (operators & agents)
passport.ts Issue/verify the scoped passport VC; scope helpers
action.ts Sign/verify individual agent actions (did-jwt)

Design principles

  • Attestation, not enforcement — it proves identity/authority; you enforce assertScope at your tool boundary and log signed actions to your audit store.
  • Tamper-evident — actions are signed by the agent's key, so a compromised server can't forge them.
  • Trust is rooted in operators — verifiers keep an allow-list of operator DIDs they accept.
  • Offlinedid:key resolves locally; use short expiresIn since there's no revocation.