@orangecheck/agent-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +127 -0
- package/dist/canonical.d.mts +27 -0
- package/dist/canonical.d.ts +27 -0
- package/dist/canonical.js +263 -0
- package/dist/canonical.js.map +1 -0
- package/dist/canonical.mjs +237 -0
- package/dist/canonical.mjs.map +1 -0
- package/dist/index.d.mts +38 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.js +671 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +633 -0
- package/dist/index.mjs.map +1 -0
- package/dist/scope.d.mts +28 -0
- package/dist/scope.d.ts +28 -0
- package/dist/scope.js +249 -0
- package/dist/scope.js.map +1 -0
- package/dist/scope.mjs +241 -0
- package/dist/scope.mjs.map +1 -0
- package/dist/types.d.mts +127 -0
- package/dist/types.d.ts +127 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/types.mjs +6 -0
- package/dist/types.mjs.map +1 -0
- package/package.json +75 -0
- package/src/canonical.test.ts +95 -0
- package/src/canonical.ts +155 -0
- package/src/index.ts +45 -0
- package/src/scope.test.ts +162 -0
- package/src/scope.ts +330 -0
- package/src/test-vectors.test.ts +199 -0
- package/src/types.ts +189 -0
- package/src/verify.ts +460 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/scope.ts","../src/canonical.ts","../src/verify.ts"],"names":["hexEncode","sha256","canonicalize"],"mappings":"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","file":"index.js","sourcesContent":["// Wire types for OC Agent v1 envelopes. See SPEC.md §4, §5, §9.\n\nexport const ENVELOPE_VERSION = 1 as const;\n\nexport type EnvelopeKind = 'agent-delegation' | 'agent-action' | 'agent-revocation';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Shared building blocks\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ActorRef {\n /** mainnet Bitcoin address (P2WPKH, P2TR, or P2PKH). */\n address: string;\n alg: 'bip322';\n}\n\nexport interface Signature {\n alg: 'bip322';\n pubkey: string; // equals the producing actor's address\n value: string; // base64 BIP-322 signature over hex(id)\n}\n\nexport type RevocationHolder = 'principal' | 'agent';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Delegation (SPEC §4)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface DelegationBond {\n /** Non-negative sats declared as bonded at issuance time. */\n sats: number;\n /** SHA-256 hex of the OrangeCheck canonical message signed by principal.address. */\n attestation_id: string;\n}\n\nexport interface DelegationRevocationRef {\n /** Who MAY publish a revocation. Default [\"principal\"]. */\n holders: RevocationHolder[];\n /** Optional Nostr-addressable pointer to a published revocation. Non-cryptographic. */\n ref: string | null;\n}\n\nexport interface DelegationEnvelope {\n v: typeof ENVELOPE_VERSION;\n kind: 'agent-delegation';\n id: string; // 64-hex sha256(canonical_message)\n principal: ActorRef;\n agent: ActorRef;\n /** Sorted lexicographically in the canonical message; stored in sorted order on the envelope too. */\n scopes: string[];\n bond: DelegationBond | null;\n issued_at: string; // ISO 8601 UTC\n expires_at: string; // ISO 8601 UTC\n nonce: string; // 32-hex random\n revocation: DelegationRevocationRef;\n sig: Signature;\n}\n\nexport interface DelegationCanonicalInput {\n principal: string;\n agent: string;\n scopes: string[]; // pre-canonicalized, pre-sorted\n bond_sats: number;\n /** 64-hex attestation id or the literal string \"none\". */\n bond_attestation: string;\n issued_at: string;\n expires_at: string;\n nonce: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Agent-action (SPEC §5) — strict extension of OC Stamp\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ActionContent {\n hash: string; // \"sha256:<64-hex>\"\n length: number;\n mime: string;\n ref: string | null;\n}\n\nexport interface ActionOts {\n status: 'pending' | 'confirmed';\n proof: string;\n calendars: string[];\n block_height: number | null;\n block_hash: string | null;\n upgraded_at: string | null;\n}\n\nexport interface ActionEnvelope {\n v: typeof ENVELOPE_VERSION;\n kind: 'agent-action';\n id: string;\n content: ActionContent;\n signer: ActorRef; // agent\n signed_at: string;\n delegation_id: string; // 64-hex\n scope_exercised: string; // a sub-scope of some granted scope\n ots: ActionOts | null;\n sig: Signature;\n}\n\nexport interface ActionCanonicalInput {\n address: string; // agent address\n content_hash: string;\n content_length: number;\n content_mime: string;\n signed_at: string;\n delegation_id: string;\n scope_exercised: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Revocation (SPEC §9)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface RevocationEnvelope {\n v: typeof ENVELOPE_VERSION;\n kind: 'agent-revocation';\n id: string;\n delegation_id: string;\n signer: ActorRef;\n /** Short ASCII rationale, <= 128 bytes. Empty string if omitted. */\n reason: string;\n signed_at: string;\n ots: ActionOts | null;\n sig: Signature;\n}\n\nexport interface RevocationCanonicalInput {\n address: string;\n delegation_id: string;\n reason: string;\n signed_at: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Error codes (SPEC §11)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type AgentErrorCode =\n | 'E_UNSUPPORTED_VERSION'\n | 'E_MALFORMED'\n | 'E_BAD_ID'\n | 'E_BAD_SIG'\n | 'E_BAD_SCOPE_GRAMMAR'\n | 'E_NOT_YET_VALID'\n | 'E_EXPIRED'\n | 'E_REVOKED'\n | 'E_DELEGATION_MISMATCH'\n | 'E_AGENT_MISMATCH'\n | 'E_OUT_OF_WINDOW'\n | 'E_SCOPE_DENIED'\n | 'E_BAD_ACTION_STAMP'\n | 'E_NO_BOND'\n | 'E_BOND_UNMET'\n | 'E_BOND_UNVERIFIED'\n | 'E_REVOKER_UNAUTHORIZED'\n | 'E_CALENDAR_UNREACHABLE';\n\nexport interface VerifyOk<T> {\n ok: true;\n envelope: T;\n canonicalMessage: string;\n id: string;\n}\n\nexport interface VerifyErr {\n ok: false;\n code: AgentErrorCode;\n message: string;\n}\n\nexport type VerifyDelegationResult = VerifyOk<DelegationEnvelope> | VerifyErr;\nexport type VerifyRevocationResult = VerifyOk<RevocationEnvelope> | VerifyErr;\n\nexport interface VerifyActionOkExtra {\n delegation: DelegationEnvelope;\n scopeExercised: string;\n anchor:\n | { status: 'none' }\n | { status: 'pending' }\n | { status: 'confirmed'; blockHeight: number; blockHash: string; verified: boolean };\n}\n\nexport type VerifyActionResult =\n | (VerifyOk<ActionEnvelope> & VerifyActionOkExtra)\n | VerifyErr;\n","// Scope grammar, canonicalization, and sub-scope relation. See SPEC.md §7.\n//\n// A scope is <product>:<verb>(<constraint-list>).\n// Constraints are <key><op><value>, op ∈ { =, !=, <, <=, >, >=, * }.\n// Canonical form: constraints sorted by key; no whitespace.\n\nexport type ScopeOp = '=' | '!=' | '<' | '<=' | '>' | '>=' | '*';\n\nexport interface ScopeConstraint {\n key: string;\n op: ScopeOp;\n /** `undefined` for the wildcard `*` op; otherwise the raw textual value (unquoted). */\n value: string | undefined;\n /** True if the value was supplied as a quoted string; preserved for round-trip fidelity. */\n quoted: boolean;\n}\n\nexport interface Scope {\n product: string;\n verb: string;\n constraints: ScopeConstraint[];\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Registered products/verbs (SPEC §7.3) and constraint keys (SPEC §7.6).\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const REGISTERED_SCOPES: Record<string, { keys: string[] }> = {\n 'lock:seal': { keys: ['recipient', 'mime', 'max_bytes'] },\n 'lock:chat': { keys: ['recipient', 'max_bytes_per_msg', 'max_msgs'] },\n 'stamp:sign': { keys: ['mime', 'max_bytes', 'content_hash_prefix'] },\n 'vote:cast': { keys: ['poll_id', 'choice'] },\n 'nostr:publish': { keys: ['kind', 'relay', 'max_bytes'] },\n 'http:request': { keys: ['origin', 'method', 'max_rps', 'max_bytes_out'] },\n 'ln:send': { keys: ['max_sats', 'node', 'max_fee_sats'] },\n 'mcp:invoke': { keys: ['server', 'tool', 'max_invocations'] },\n};\n\n/** Keys whose values are compared numerically for sub-scope ordering. */\nconst NUMERIC_KEYS = new Set<string>([\n 'max_bytes',\n 'max_bytes_per_msg',\n 'max_msgs',\n 'max_bytes_out',\n 'max_rps',\n 'max_sats',\n 'max_fee_sats',\n 'max_invocations',\n 'kind',\n]);\n\nconst IDENT_RE = /^[a-z][a-z0-9_]*$/;\nconst BARE_TOKEN_RE = /^[A-Za-z0-9_.:/@+\\-]+$/;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Parse\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport class ScopeParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ScopeParseError';\n }\n}\n\nexport function parseScope(input: string): Scope {\n if (typeof input !== 'string' || input.length === 0) {\n throw new ScopeParseError('scope must be a non-empty string');\n }\n if (/\\s/.test(input)) {\n throw new ScopeParseError(`scope may not contain whitespace: ${JSON.stringify(input)}`);\n }\n\n const colonIdx = input.indexOf(':');\n if (colonIdx < 0) throw new ScopeParseError('scope missing \"product:verb\" separator');\n\n const product = input.slice(0, colonIdx);\n if (!IDENT_RE.test(product)) throw new ScopeParseError(`invalid product: ${product}`);\n\n const rest = input.slice(colonIdx + 1);\n const parenIdx = rest.indexOf('(');\n\n let verb: string;\n let constraintText = '';\n if (parenIdx < 0) {\n verb = rest;\n } else {\n verb = rest.slice(0, parenIdx);\n if (!rest.endsWith(')')) throw new ScopeParseError('scope constraint list must end with \")\"');\n constraintText = rest.slice(parenIdx + 1, -1);\n }\n if (!IDENT_RE.test(verb)) throw new ScopeParseError(`invalid verb: ${verb}`);\n\n const constraints: ScopeConstraint[] = [];\n if (constraintText.length > 0) {\n for (const piece of splitTopLevelCommas(constraintText)) {\n constraints.push(parseConstraint(piece));\n }\n }\n\n // No duplicate keys.\n const seen = new Set<string>();\n for (const c of constraints) {\n if (seen.has(c.key)) throw new ScopeParseError(`duplicate constraint key: ${c.key}`);\n seen.add(c.key);\n }\n\n return { product, verb, constraints };\n}\n\nfunction splitTopLevelCommas(text: string): string[] {\n const out: string[] = [];\n let depth = 0;\n let inQuotes = false;\n let start = 0;\n for (let i = 0; i < text.length; i++) {\n const ch = text[i];\n if (inQuotes) {\n if (ch === '\\\\' && i + 1 < text.length) {\n i++;\n continue;\n }\n if (ch === '\"') inQuotes = false;\n continue;\n }\n if (ch === '\"') {\n inQuotes = true;\n continue;\n }\n if (ch === '(') depth++;\n else if (ch === ')') depth--;\n else if (ch === ',' && depth === 0) {\n out.push(text.slice(start, i));\n start = i + 1;\n }\n }\n out.push(text.slice(start));\n return out;\n}\n\nfunction parseConstraint(piece: string): ScopeConstraint {\n if (piece.length === 0) throw new ScopeParseError('empty constraint');\n\n // The `*` op (wildcard) is an op with no value. Recognized by \"key=*\" form.\n // SPEC uses \"key=*\"; we also accept \"key*\" as legacy alias.\n // Ops in descending length so \">=\" beats \">\" and \"!=\" beats \"!\".\n const OPS: ScopeOp[] = ['>=', '<=', '!=', '=', '>', '<'];\n\n // Special-case wildcard: \"key=*\" or \"key*\".\n const wildcardMatch = /^([a-z][a-z0-9_]*)(?:=\\*|\\*)$/.exec(piece);\n if (wildcardMatch) {\n return { key: wildcardMatch[1]!, op: '*', value: undefined, quoted: false };\n }\n\n for (const op of OPS) {\n const idx = piece.indexOf(op);\n if (idx <= 0) continue; // key must come first and be non-empty\n const key = piece.slice(0, idx);\n if (!IDENT_RE.test(key)) continue;\n const raw = piece.slice(idx + op.length);\n const { value, quoted } = parseValue(raw);\n return { key, op, value, quoted };\n }\n throw new ScopeParseError(`constraint missing operator: ${piece}`);\n}\n\nfunction parseValue(raw: string): { value: string; quoted: boolean } {\n if (raw.length === 0) throw new ScopeParseError('constraint value is empty');\n if (raw.startsWith('\"')) {\n if (!raw.endsWith('\"') || raw.length < 2) {\n throw new ScopeParseError(`unterminated quoted value: ${raw}`);\n }\n let v = '';\n for (let i = 1; i < raw.length - 1; i++) {\n const ch = raw[i]!;\n if (ch === '\\\\' && i + 1 < raw.length - 1) {\n const next = raw[++i]!;\n v += next;\n } else if (ch === '\"') {\n throw new ScopeParseError(`unescaped quote in value: ${raw}`);\n } else {\n v += ch;\n }\n }\n return { value: v, quoted: true };\n }\n if (!BARE_TOKEN_RE.test(raw)) {\n throw new ScopeParseError(`invalid bare-token value: ${JSON.stringify(raw)}`);\n }\n return { value: raw, quoted: false };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Canonicalize\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function canonicalizeScope(scope: Scope): string {\n const sorted = [...scope.constraints].sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));\n const parts = sorted.map(serializeConstraint);\n const inner = parts.join(',');\n return `${scope.product}:${scope.verb}${parts.length === 0 ? '' : `(${inner})`}`;\n}\n\nexport function canonicalizeScopeString(input: string): string {\n return canonicalizeScope(parseScope(input));\n}\n\nfunction serializeConstraint(c: ScopeConstraint): string {\n if (c.op === '*') return `${c.key}=*`;\n const v = c.quoted ? quoteValue(c.value ?? '') : c.value ?? '';\n return `${c.key}${c.op}${v}`;\n}\n\nfunction quoteValue(v: string): string {\n let out = '\"';\n for (const ch of v) {\n if (ch === '\"' || ch === '\\\\') out += '\\\\' + ch;\n else out += ch;\n }\n out += '\"';\n return out;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Registry-based validation\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ValidationOptions {\n /**\n * Strict: reject unknown products/verbs and unknown constraint keys.\n * Permissive: accept unknown products/verbs; ignore unknown keys without treating them as wider.\n * Default: 'strict'.\n */\n mode?: 'strict' | 'permissive';\n}\n\nexport function validateScope(scope: Scope, options: ValidationOptions = {}): void {\n const mode = options.mode ?? 'strict';\n const reg = REGISTERED_SCOPES[`${scope.product}:${scope.verb}`];\n if (!reg) {\n if (mode === 'strict') {\n throw new ScopeParseError(`unregistered scope: ${scope.product}:${scope.verb}`);\n }\n return; // permissive: no further checks\n }\n const registered = new Set(reg.keys);\n for (const c of scope.constraints) {\n if (!registered.has(c.key)) {\n if (mode === 'strict') {\n throw new ScopeParseError(\n `unregistered constraint key for ${scope.product}:${scope.verb}: ${c.key}`\n );\n }\n // permissive: ignore\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Sub-scope relation (SPEC §7.4)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Is `exercised` a sub-scope of `granted`?\n * Returns true iff every constraint of `granted` admits the corresponding constraint\n * (or absence) in `exercised`, per SPEC §7.4.\n */\nexport function isSubScope(exercised: Scope, granted: Scope): boolean {\n if (exercised.product !== granted.product) return false;\n if (exercised.verb !== granted.verb) return false;\n\n const exIndex = new Map<string, ScopeConstraint>();\n for (const c of exercised.constraints) exIndex.set(c.key, c);\n\n for (const g of granted.constraints) {\n const ex = exIndex.get(g.key);\n if (g.op === '*') continue; // wildcard: no requirement\n\n if (g.op === '=') {\n if (!ex) return false;\n if (ex.op !== '=' || ex.value !== g.value) return false;\n continue;\n }\n\n if (g.op === '!=') {\n if (!ex) return false;\n if (ex.op === '=' && ex.value !== g.value) continue;\n if (ex.op === '!=' && ex.value === g.value) continue;\n return false;\n }\n\n // Ordered ops: >=, <=, >, <. Exercised's implied range must be ⊆ granted's.\n if (g.op === '<' || g.op === '<=' || g.op === '>' || g.op === '>=') {\n if (!ex) return false;\n if (!NUMERIC_KEYS.has(g.key)) return false;\n if (ex.op === '*') return false;\n if (ex.value === undefined || g.value === undefined) return false;\n if (!rangeSubset(ex, g)) return false;\n continue;\n }\n }\n return true;\n}\n\nfunction rangeSubset(ex: ScopeConstraint, g: ScopeConstraint): boolean {\n const exRange = opToRange(ex);\n const gRange = opToRange(g);\n if (!exRange || !gRange) return false;\n return gRange.lo <= exRange.lo && exRange.hi <= gRange.hi;\n}\n\nfunction opToRange(c: ScopeConstraint): { lo: number; hi: number } | null {\n if (c.value === undefined) return null;\n const n = Number(c.value);\n if (!Number.isFinite(n)) return null;\n switch (c.op) {\n case '=':\n return { lo: n, hi: n };\n case '<':\n return { lo: -Infinity, hi: n - 1 }; // integers only\n case '<=':\n return { lo: -Infinity, hi: n };\n case '>':\n return { lo: n + 1, hi: Infinity };\n case '>=':\n return { lo: n, hi: Infinity };\n default:\n return null;\n }\n}\n","// Canonical messages + envelope canonicalization for OC Agent. SPEC §4.1, §5.1, §9.1.\n//\n// Three canonical-message builders live here — one per envelope kind. Each one\n// produces the exact byte sequence a signer signs via BIP-322 and the hash\n// input for the envelope id.\n//\n// The RFC 8785 JSON canonicalizer and hex utilities are re-exported from\n// @orangecheck/stamp-core so OC Agent and OC Stamp are guaranteed to produce\n// identical bytes for identical structural inputs.\n\nimport { sha256 } from '@noble/hashes/sha256';\nimport { canonicalize, hexEncode } from '@orangecheck/stamp-core/canonical';\n\nimport { canonicalizeScope, parseScope, type Scope } from './scope.js';\nimport type {\n ActionCanonicalInput,\n ActionEnvelope,\n DelegationCanonicalInput,\n DelegationEnvelope,\n RevocationCanonicalInput,\n RevocationEnvelope,\n} from './types.js';\n\nexport { canonicalize, hexEncode };\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Scope sorting + serialization\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Canonicalize and sort a list of scope strings for the delegation canonical\n * message. Each scope is first parsed, then re-emitted in canonical form\n * (constraints sorted by key), and the whole list is sorted lexicographically.\n */\nexport function canonicalizeScopes(scopes: string[]): string[] {\n const canonical = scopes.map((s) => canonicalizeScope(parseScope(s)));\n return [...canonical].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n}\n\n/**\n * Same as `canonicalizeScopes` but returns `Scope` objects too, for callers\n * that need them.\n */\nexport function parseAndCanonicalizeScopes(scopes: string[]): { canonical: string[]; parsed: Scope[] } {\n const parsed = scopes.map(parseScope);\n const canonicalStrings = parsed.map(canonicalizeScope);\n const indexed = canonicalStrings.map((s, i) => ({ s, p: parsed[i]! }));\n indexed.sort((a, b) => (a.s < b.s ? -1 : a.s > b.s ? 1 : 0));\n return {\n canonical: indexed.map((x) => x.s),\n parsed: indexed.map((x) => x.p),\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Canonical messages (SPEC §4.1, §5.1, §9.1)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function delegationCanonicalMessage(input: DelegationCanonicalInput): string {\n const scopeField = input.scopes.join(',');\n return [\n 'oc-agent:delegation:v1',\n `principal: ${input.principal}`,\n `agent: ${input.agent}`,\n `scopes: ${scopeField}`,\n `bond_sats: ${input.bond_sats}`,\n `bond_attestation: ${input.bond_attestation}`,\n `issued_at: ${input.issued_at}`,\n `expires_at: ${input.expires_at}`,\n `nonce: ${input.nonce}`,\n ].join('\\n');\n}\n\nexport function actionCanonicalMessage(input: ActionCanonicalInput): string {\n return [\n 'oc-agent:action:v1',\n `address: ${input.address}`,\n `content_hash: ${input.content_hash}`,\n `content_length: ${input.content_length}`,\n `content_mime: ${input.content_mime}`,\n `signed_at: ${input.signed_at}`,\n `delegation_id: ${input.delegation_id}`,\n `scope_exercised: ${input.scope_exercised}`,\n ].join('\\n');\n}\n\nexport function revocationCanonicalMessage(input: RevocationCanonicalInput): string {\n return [\n 'oc-agent:revocation:v1',\n `address: ${input.address}`,\n `delegation_id: ${input.delegation_id}`,\n `reason: ${input.reason}`,\n `signed_at: ${input.signed_at}`,\n ].join('\\n');\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Bytes + ids\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function delegationCanonicalBytes(input: DelegationCanonicalInput): Uint8Array {\n return new TextEncoder().encode(delegationCanonicalMessage(input));\n}\n\nexport function actionCanonicalBytes(input: ActionCanonicalInput): Uint8Array {\n return new TextEncoder().encode(actionCanonicalMessage(input));\n}\n\nexport function revocationCanonicalBytes(input: RevocationCanonicalInput): Uint8Array {\n return new TextEncoder().encode(revocationCanonicalMessage(input));\n}\n\nexport function computeDelegationId(input: DelegationCanonicalInput): string {\n return hexEncode(sha256(delegationCanonicalBytes(input)));\n}\n\nexport function computeActionId(input: ActionCanonicalInput): string {\n return hexEncode(sha256(actionCanonicalBytes(input)));\n}\n\nexport function computeRevocationId(input: RevocationCanonicalInput): string {\n return hexEncode(sha256(revocationCanonicalBytes(input)));\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Envelope canonicalization (SPEC §6; RFC 8785 + scope-sorting)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function canonicalizeDelegation(env: DelegationEnvelope): string {\n return canonicalize(env as unknown as Parameters<typeof canonicalize>[0]);\n}\n\nexport function canonicalizeAction(env: ActionEnvelope): string {\n return canonicalize(env as unknown as Parameters<typeof canonicalize>[0]);\n}\n\nexport function canonicalizeRevocation(env: RevocationEnvelope): string {\n return canonicalize(env as unknown as Parameters<typeof canonicalize>[0]);\n}\n\nexport function canonicalDelegationBytes(env: DelegationEnvelope): Uint8Array {\n return new TextEncoder().encode(canonicalizeDelegation(env) + '\\n');\n}\n\nexport function canonicalActionBytes(env: ActionEnvelope): Uint8Array {\n return new TextEncoder().encode(canonicalizeAction(env) + '\\n');\n}\n\nexport function canonicalRevocationBytes(env: RevocationEnvelope): Uint8Array {\n return new TextEncoder().encode(canonicalizeRevocation(env) + '\\n');\n}\n\nexport function sha256Hex(bytes: Uint8Array): string {\n return hexEncode(sha256(bytes));\n}\n","// verifyDelegation / verifyAction / verifyRevocation — reference implementation\n// of OC Agent v1 verification. SPEC §8.\n\nimport { sha256 } from '@noble/hashes/sha256';\n\nimport {\n actionCanonicalBytes,\n actionCanonicalMessage,\n canonicalizeScopes,\n delegationCanonicalBytes,\n delegationCanonicalMessage,\n hexEncode,\n revocationCanonicalBytes,\n revocationCanonicalMessage,\n} from './canonical.js';\nimport {\n canonicalizeScope,\n isSubScope,\n parseScope,\n ScopeParseError,\n validateScope,\n type ValidationOptions,\n} from './scope.js';\nimport {\n ENVELOPE_VERSION,\n type ActionEnvelope,\n type AgentErrorCode,\n type DelegationEnvelope,\n type RevocationEnvelope,\n type VerifyActionResult,\n type VerifyDelegationResult,\n type VerifyRevocationResult,\n} from './types.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Shared options\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface VerifyBase {\n verifyBip322?: (msg: string, signatureB64: string, address: string) => Promise<boolean>;\n skipSignatureVerification?: boolean;\n scopeMode?: ValidationOptions['mode'];\n}\n\nexport class AgentError extends Error {\n code: AgentErrorCode;\n constructor(code: AgentErrorCode, message: string) {\n super(message);\n this.code = code;\n this.name = 'AgentError';\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Delegation (SPEC §8.1)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface VerifyDelegationInput extends VerifyBase {\n envelope: DelegationEnvelope;\n /** Current time for temporal checks; defaults to new Date(). */\n now?: Date;\n /** Skip temporal checks entirely (useful for inspecting historical envelopes). */\n skipTemporalCheck?: boolean;\n}\n\nexport async function verifyDelegation(input: VerifyDelegationInput): Promise<VerifyDelegationResult> {\n const env = input.envelope;\n\n if (env.v !== ENVELOPE_VERSION) {\n return err('E_UNSUPPORTED_VERSION', `delegation version ${env.v} not supported`);\n }\n\n const shape = checkDelegationShape(env);\n if (shape) return shape;\n\n // Scope grammar.\n let canonicalScopes: string[];\n try {\n for (const s of env.scopes) validateScope(parseScope(s), { mode: input.scopeMode ?? 'strict' });\n canonicalScopes = canonicalizeScopes(env.scopes);\n } catch (e) {\n const msg = e instanceof ScopeParseError ? e.message : (e as Error).message;\n return err('E_BAD_SCOPE_GRAMMAR', msg);\n }\n\n // The envelope's `scopes` array must already be in canonical sorted order.\n for (let i = 0; i < canonicalScopes.length; i++) {\n if (env.scopes[i] !== canonicalScopes[i]) {\n return err(\n 'E_BAD_SCOPE_GRAMMAR',\n `scope at index ${i} not in canonical form; expected ${canonicalScopes[i]} got ${env.scopes[i]}`\n );\n }\n }\n\n // Canonical message reconstruction.\n const bondSats = env.bond?.sats ?? 0;\n const bondAttestation = env.bond?.attestation_id ?? 'none';\n const canonInput = {\n principal: env.principal.address,\n agent: env.agent.address,\n scopes: canonicalScopes,\n bond_sats: bondSats,\n bond_attestation: bondAttestation,\n issued_at: env.issued_at,\n expires_at: env.expires_at,\n nonce: env.nonce,\n };\n const reconstructedMessage = delegationCanonicalMessage(canonInput);\n const reconstructedId = hexEncode(sha256(delegationCanonicalBytes(canonInput)));\n if (reconstructedId !== env.id) {\n return err(\n 'E_BAD_ID',\n `reconstructed id (${reconstructedId}) does not match envelope.id (${env.id})`\n );\n }\n\n // Signature.\n if (!input.skipSignatureVerification) {\n if (!input.verifyBip322) return err('E_BAD_SIG', 'no BIP-322 verifier supplied');\n const ok = await input.verifyBip322(env.id, env.sig.value, env.principal.address);\n if (!ok) return err('E_BAD_SIG', 'BIP-322 signature did not verify');\n }\n\n // Temporal.\n if (!input.skipTemporalCheck) {\n const now = input.now ?? new Date();\n const issued = new Date(env.issued_at);\n const expires = new Date(env.expires_at);\n if (expires <= issued) return err('E_MALFORMED', 'expires_at <= issued_at');\n if (now < issued) return err('E_NOT_YET_VALID', `delegation not valid until ${env.issued_at}`);\n if (now >= expires) return err('E_EXPIRED', `delegation expired at ${env.expires_at}`);\n }\n\n return {\n ok: true,\n envelope: env,\n canonicalMessage: reconstructedMessage,\n id: env.id,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Action (SPEC §8.2–8.3)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface VerifyActionInput extends VerifyBase {\n action: ActionEnvelope;\n /** The delegation cited by action.delegation_id. Required. */\n delegation: DelegationEnvelope;\n /**\n * Known revocations targeting the delegation. The verifier scans for one whose\n * effective time precedes the action (SPEC §9.3).\n */\n revocations?: RevocationEnvelope[];\n content?: Uint8Array;\n verifyOtsAnchor?: (proofB64: string, blockHeight: number, blockHash: string) => Promise<boolean>;\n /** If action and revocation are both OTS-anchored, pass a function that returns the comparable block height of each via proof parsing. Defaults: use envelope.ots.block_height. */\n resolveAnchorBlockHeight?: (env: ActionEnvelope | RevocationEnvelope) => number | null;\n}\n\nexport async function verifyAction(input: VerifyActionInput): Promise<VerifyActionResult> {\n const a = input.action;\n const d = input.delegation;\n\n // 1. First verify the delegation.\n const dr = await verifyDelegation({\n envelope: d,\n verifyBip322: input.verifyBip322,\n skipSignatureVerification: input.skipSignatureVerification,\n scopeMode: input.scopeMode,\n skipTemporalCheck: true, // action window check dominates\n });\n if (!dr.ok) return dr;\n\n // 2. Core action checks.\n if (a.v !== ENVELOPE_VERSION) {\n return err('E_UNSUPPORTED_VERSION', `action version ${a.v} not supported`);\n }\n const shape = checkActionShape(a);\n if (shape) return shape;\n\n const canonInput = {\n address: a.signer.address,\n content_hash: a.content.hash,\n content_length: a.content.length,\n content_mime: a.content.mime,\n signed_at: a.signed_at,\n delegation_id: a.delegation_id,\n scope_exercised: a.scope_exercised,\n };\n const reconstructedMessage = actionCanonicalMessage(canonInput);\n const reconstructedId = hexEncode(sha256(actionCanonicalBytes(canonInput)));\n if (reconstructedId !== a.id) {\n return err('E_BAD_ID', `reconstructed id (${reconstructedId}) does not match action.id (${a.id})`);\n }\n\n if (!input.skipSignatureVerification) {\n if (!input.verifyBip322) return err('E_BAD_SIG', 'no BIP-322 verifier supplied');\n const ok = await input.verifyBip322(a.id, a.sig.value, a.signer.address);\n if (!ok) return err('E_BAD_ACTION_STAMP', 'action BIP-322 signature did not verify');\n }\n\n // 3. Authority chain.\n if (a.delegation_id !== d.id) {\n return err('E_DELEGATION_MISMATCH', `action.delegation_id (${a.delegation_id}) != delegation.id (${d.id})`);\n }\n if (a.signer.address !== d.agent.address) {\n return err('E_AGENT_MISMATCH', `action signer (${a.signer.address}) != delegation.agent (${d.agent.address})`);\n }\n\n // 4. Window.\n const issued = new Date(d.issued_at).getTime();\n const expires = new Date(d.expires_at).getTime();\n const signed = new Date(a.signed_at).getTime();\n if (Number.isNaN(issued) || Number.isNaN(expires) || Number.isNaN(signed)) {\n return err('E_MALFORMED', 'unparseable ISO 8601 timestamp');\n }\n if (signed < issued || signed >= expires) {\n return err('E_OUT_OF_WINDOW', `action.signed_at ${a.signed_at} is outside delegation window [${d.issued_at}, ${d.expires_at})`);\n }\n\n // 5. Scope containment.\n let exercised, accepted;\n try {\n exercised = canonicalizeScope(parseScope(a.scope_exercised));\n const granted = d.scopes.map((s) => parseScope(s));\n const exercisedParsed = parseScope(a.scope_exercised);\n validateScope(exercisedParsed, { mode: input.scopeMode ?? 'strict' });\n accepted = granted.some((g) => isSubScope(exercisedParsed, g));\n } catch (e) {\n const msg = e instanceof ScopeParseError ? e.message : (e as Error).message;\n return err('E_BAD_SCOPE_GRAMMAR', msg);\n }\n if (!accepted) return err('E_SCOPE_DENIED', `scope_exercised (${exercised}) not a sub-scope of any granted scope`);\n\n // 6. Revocation check.\n if (input.revocations && input.revocations.length > 0) {\n for (const rev of input.revocations) {\n if (rev.delegation_id !== d.id) continue;\n // Verify the revocation itself (signature + canonical) with the same BIP-322 verifier.\n const rr = await verifyRevocation({\n envelope: rev,\n delegation: d,\n verifyBip322: input.verifyBip322,\n skipSignatureVerification: input.skipSignatureVerification,\n });\n if (!rr.ok) continue; // malformed revocations don't affect the action\n const effective = effectiveRevocationTime(rev, input.resolveAnchorBlockHeight);\n const actionTime = actionEffectiveTime(a, input.resolveAnchorBlockHeight);\n if (compareTimes(effective, actionTime) <= 0) {\n return err('E_REVOKED', `delegation was revoked by ${rev.id} before action was signed`);\n }\n }\n }\n\n // 7. Content check.\n if (input.content) {\n const actualHash = 'sha256:' + hexEncode(sha256(input.content));\n if (actualHash !== a.content.hash) {\n return err('E_BAD_ACTION_STAMP', `content hash (${actualHash}) != action.content.hash (${a.content.hash})`);\n }\n }\n\n // 8. Anchor info.\n let anchor: VerifyActionResult extends infer R ? R extends { anchor: infer X } ? X : never : never;\n if (a.ots === null) {\n anchor = { status: 'none' } as typeof anchor;\n } else if (a.ots.status === 'pending') {\n anchor = { status: 'pending' } as typeof anchor;\n } else {\n const h = a.ots.block_height;\n const hash = a.ots.block_hash;\n if (h === null || hash === null) {\n return err('E_MALFORMED', 'confirmed OTS proof missing block_height or block_hash');\n }\n let verified = false;\n if (input.verifyOtsAnchor) {\n try {\n verified = await input.verifyOtsAnchor(a.ots.proof, h, hash);\n } catch (e) {\n return err('E_MALFORMED', `anchor verifier threw: ${(e as Error).message}`);\n }\n }\n anchor = { status: 'confirmed', blockHeight: h, blockHash: hash, verified } as typeof anchor;\n }\n\n return {\n ok: true,\n envelope: a,\n canonicalMessage: reconstructedMessage,\n id: a.id,\n delegation: d,\n scopeExercised: exercised,\n anchor,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Revocation (SPEC §9, §8 transitive)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface VerifyRevocationInput extends VerifyBase {\n envelope: RevocationEnvelope;\n /** The delegation targeted by the revocation. Required to check signer is authorized. */\n delegation: DelegationEnvelope;\n}\n\nexport async function verifyRevocation(input: VerifyRevocationInput): Promise<VerifyRevocationResult> {\n const env = input.envelope;\n const d = input.delegation;\n\n if (env.v !== ENVELOPE_VERSION) {\n return err('E_UNSUPPORTED_VERSION', `revocation version ${env.v} not supported`);\n }\n const shape = checkRevocationShape(env);\n if (shape) return shape;\n\n if (env.delegation_id !== d.id) {\n return err('E_DELEGATION_MISMATCH', `revocation.delegation_id (${env.delegation_id}) != delegation.id (${d.id})`);\n }\n\n // Signer must be authorized per delegation.revocation.holders.\n const holders = d.revocation?.holders ?? ['principal'];\n const holderAddrs = new Set<string>();\n if (holders.includes('principal')) holderAddrs.add(d.principal.address);\n if (holders.includes('agent')) holderAddrs.add(d.agent.address);\n if (!holderAddrs.has(env.signer.address)) {\n return err('E_REVOKER_UNAUTHORIZED', `revocation signer ${env.signer.address} not in delegation holders`);\n }\n\n const canonInput = {\n address: env.signer.address,\n delegation_id: env.delegation_id,\n reason: env.reason,\n signed_at: env.signed_at,\n };\n const reconstructedMessage = revocationCanonicalMessage(canonInput);\n const reconstructedId = hexEncode(sha256(revocationCanonicalBytes(canonInput)));\n if (reconstructedId !== env.id) {\n return err('E_BAD_ID', `reconstructed id (${reconstructedId}) does not match revocation.id (${env.id})`);\n }\n\n if (!input.skipSignatureVerification) {\n if (!input.verifyBip322) return err('E_BAD_SIG', 'no BIP-322 verifier supplied');\n const ok = await input.verifyBip322(env.id, env.sig.value, env.signer.address);\n if (!ok) return err('E_BAD_SIG', 'revocation BIP-322 signature did not verify');\n }\n\n return { ok: true, envelope: env, canonicalMessage: reconstructedMessage, id: env.id };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Shape checks\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction checkDelegationShape(env: DelegationEnvelope): VerifyDelegationResult | null {\n if (env.kind !== 'agent-delegation') return err('E_MALFORMED', 'kind must be \"agent-delegation\"');\n if (!isHex64(env.id)) return err('E_MALFORMED', 'id must be 64 lowercase hex chars');\n if (!env.principal?.address || env.principal.alg !== 'bip322') return err('E_MALFORMED', 'principal invalid');\n if (!env.agent?.address || env.agent.alg !== 'bip322') return err('E_MALFORMED', 'agent invalid');\n if (!Array.isArray(env.scopes) || env.scopes.length === 0) return err('E_MALFORMED', 'scopes must be non-empty array');\n if (env.bond !== null) {\n if (!Number.isInteger(env.bond.sats) || env.bond.sats < 0) return err('E_MALFORMED', 'bond.sats must be non-negative integer');\n if (!isHex64(env.bond.attestation_id)) return err('E_MALFORMED', 'bond.attestation_id must be 64-hex');\n }\n if (!isIsoUtc(env.issued_at)) return err('E_MALFORMED', 'issued_at must be ISO 8601 UTC');\n if (!isIsoUtc(env.expires_at)) return err('E_MALFORMED', 'expires_at must be ISO 8601 UTC');\n if (!/^[0-9a-f]{32}$/.test(env.nonce)) return err('E_MALFORMED', 'nonce must be 32 lowercase hex chars');\n if (env.sig?.alg !== 'bip322' || typeof env.sig.value !== 'string') return err('E_MALFORMED', 'sig invalid');\n if (env.sig.pubkey !== env.principal.address) return err('E_MALFORMED', 'sig.pubkey must equal principal.address');\n return null;\n}\n\nfunction checkActionShape(a: ActionEnvelope): VerifyActionResult | null {\n if (a.kind !== 'agent-action') return err('E_MALFORMED', 'kind must be \"agent-action\"');\n if (!isHex64(a.id)) return err('E_MALFORMED', 'id must be 64 lowercase hex chars');\n if (!a.content || typeof a.content.hash !== 'string' || !a.content.hash.startsWith('sha256:')) {\n return err('E_MALFORMED', 'content.hash must start with \"sha256:\"');\n }\n if (!Number.isInteger(a.content.length) || a.content.length < 0) return err('E_MALFORMED', 'content.length invalid');\n if (!a.signer?.address || a.signer.alg !== 'bip322') return err('E_MALFORMED', 'signer invalid');\n if (!isIsoUtc(a.signed_at)) return err('E_MALFORMED', 'signed_at must be ISO 8601 UTC');\n if (!isHex64(a.delegation_id)) return err('E_MALFORMED', 'delegation_id must be 64-hex');\n if (typeof a.scope_exercised !== 'string' || a.scope_exercised.length === 0) return err('E_MALFORMED', 'scope_exercised required');\n if (a.sig?.alg !== 'bip322' || typeof a.sig.value !== 'string') return err('E_MALFORMED', 'sig invalid');\n if (a.sig.pubkey !== a.signer.address) return err('E_MALFORMED', 'sig.pubkey must equal signer.address');\n return null;\n}\n\nfunction checkRevocationShape(env: RevocationEnvelope): VerifyRevocationResult | null {\n if (env.kind !== 'agent-revocation') return err('E_MALFORMED', 'kind must be \"agent-revocation\"');\n if (!isHex64(env.id)) return err('E_MALFORMED', 'id must be 64 lowercase hex chars');\n if (!isHex64(env.delegation_id)) return err('E_MALFORMED', 'delegation_id must be 64-hex');\n if (!env.signer?.address || env.signer.alg !== 'bip322') return err('E_MALFORMED', 'signer invalid');\n if (typeof env.reason !== 'string' || env.reason.length > 128) return err('E_MALFORMED', 'reason must be a string <=128 bytes');\n if (!isIsoUtc(env.signed_at)) return err('E_MALFORMED', 'signed_at must be ISO 8601 UTC');\n if (env.sig?.alg !== 'bip322' || typeof env.sig.value !== 'string') return err('E_MALFORMED', 'sig invalid');\n if (env.sig.pubkey !== env.signer.address) return err('E_MALFORMED', 'sig.pubkey must equal signer.address');\n return null;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Time comparison for revocation vs action (SPEC §9.3)\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype EffectiveTime =\n | { kind: 'anchor'; blockHeight: number }\n | { kind: 'signed'; ms: number };\n\nfunction actionEffectiveTime(\n a: ActionEnvelope,\n resolve?: (env: ActionEnvelope | RevocationEnvelope) => number | null\n): EffectiveTime {\n if (a.ots?.status === 'confirmed') {\n const h = resolve ? resolve(a) : a.ots.block_height;\n if (h !== null && h !== undefined) return { kind: 'anchor', blockHeight: h };\n }\n return { kind: 'signed', ms: new Date(a.signed_at).getTime() };\n}\n\nfunction effectiveRevocationTime(\n r: RevocationEnvelope,\n resolve?: (env: ActionEnvelope | RevocationEnvelope) => number | null\n): EffectiveTime {\n if (r.ots?.status === 'confirmed') {\n const h = resolve ? resolve(r) : r.ots.block_height;\n if (h !== null && h !== undefined) return { kind: 'anchor', blockHeight: h };\n }\n return { kind: 'signed', ms: new Date(r.signed_at).getTime() };\n}\n\n/** Returns <0 if a < b, 0 if equal, >0 if a > b. Anchored always beats signed-only. */\nfunction compareTimes(a: EffectiveTime, b: EffectiveTime): number {\n if (a.kind === 'anchor' && b.kind === 'anchor') return a.blockHeight - b.blockHeight;\n // If only one anchored, the anchored one is authoritative: an unanchored action cannot\n // prove priority against an anchored revocation, so the anchored side is treated as \"earlier\".\n if (a.kind === 'anchor') return -1;\n if (b.kind === 'anchor') return 1;\n return a.ms - b.ms;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction err(code: AgentErrorCode, message: string): VerifyErrResult {\n return { ok: false, code, message };\n}\n\ntype VerifyErrResult = { ok: false; code: AgentErrorCode; message: string };\n\nfunction isHex64(s: unknown): s is string {\n return typeof s === 'string' && /^[0-9a-f]{64}$/.test(s);\n}\n\nfunction isIsoUtc(s: unknown): s is string {\n return (\n typeof s === 'string' &&\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$/.test(s)\n );\n}\n"]}
|