@agenticprimitives/delegation 1.0.0-alpha.45 → 1.0.0-alpha.47

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.
Files changed (53) hide show
  1. package/README.md +21 -7
  2. package/dist/authority-chain.d.ts +77 -7
  3. package/dist/authority-chain.d.ts.map +1 -1
  4. package/dist/authority-chain.js +144 -18
  5. package/dist/authority-chain.js.map +1 -1
  6. package/dist/caveats.d.ts +166 -3
  7. package/dist/caveats.d.ts.map +1 -1
  8. package/dist/caveats.js +65 -7
  9. package/dist/caveats.js.map +1 -1
  10. package/dist/evaluator.d.ts.map +1 -1
  11. package/dist/evaluator.js +9 -7
  12. package/dist/evaluator.js.map +1 -1
  13. package/dist/hash.d.ts +8 -0
  14. package/dist/hash.d.ts.map +1 -1
  15. package/dist/hash.js +17 -0
  16. package/dist/hash.js.map +1 -1
  17. package/dist/index.d.ts +11 -8
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +14 -5
  20. package/dist/index.js.map +1 -1
  21. package/dist/invocation-proof.d.ts.map +1 -1
  22. package/dist/invocation-proof.js +2 -0
  23. package/dist/invocation-proof.js.map +1 -1
  24. package/dist/mandate-handlers.d.ts.map +1 -1
  25. package/dist/mandate-handlers.js +2 -0
  26. package/dist/mandate-handlers.js.map +1 -1
  27. package/dist/mandate.d.ts +106 -1
  28. package/dist/mandate.d.ts.map +1 -1
  29. package/dist/mandate.js +189 -34
  30. package/dist/mandate.js.map +1 -1
  31. package/dist/method-authorization.d.ts +6 -0
  32. package/dist/method-authorization.d.ts.map +1 -1
  33. package/dist/method-authorization.js.map +1 -1
  34. package/dist/onchain.d.ts +150 -1
  35. package/dist/onchain.d.ts.map +1 -1
  36. package/dist/onchain.js +94 -2
  37. package/dist/onchain.js.map +1 -1
  38. package/dist/presentation-release.d.ts +7 -0
  39. package/dist/presentation-release.d.ts.map +1 -1
  40. package/dist/presentation-release.js +49 -17
  41. package/dist/presentation-release.js.map +1 -1
  42. package/dist/quorum.d.ts +71 -3
  43. package/dist/quorum.d.ts.map +1 -1
  44. package/dist/quorum.js +112 -22
  45. package/dist/quorum.js.map +1 -1
  46. package/dist/standing.d.ts.map +1 -1
  47. package/dist/standing.js +10 -4
  48. package/dist/standing.js.map +1 -1
  49. package/dist/token.d.ts +23 -14
  50. package/dist/token.d.ts.map +1 -1
  51. package/dist/token.js +46 -17
  52. package/dist/token.js.map +1 -1
  53. package/package.json +6 -6
package/dist/quorum.d.ts CHANGED
@@ -1,8 +1,70 @@
1
1
  import { type Address, type Hex } from 'viem';
2
+ /** `QuorumEnforcer.QUORUM_ACTION_TYPEHASH`'s type string — compared to the live Solidity source cross-stack. */
3
+ export declare const QUORUM_ACTION_TYPE = "QuorumAction(uint256 chainId,address enforcer,bytes32 delegationHash,address delegator,address redeemer,address target,uint256 value,bytes32 callDataHash)";
4
+ export declare const QUORUM_ACTION_TYPEHASH: Hex;
5
+ export interface OnChainQuorumAction {
6
+ chainId: number;
7
+ /** The deployed QuorumEnforcer (`address(this)` on chain). */
8
+ enforcer: Address;
9
+ delegationHash: Hex;
10
+ delegator: Address;
11
+ redeemer: Address;
12
+ target: Address;
13
+ value: bigint;
14
+ callData: Hex;
15
+ }
16
+ /** Byte-for-byte `QuorumEnforcer.computeQuorumPayloadHash` — what quorum signers sign for a call that REDEEMS. */
17
+ export declare function computeQuorumPayloadHash(a: OnChainQuorumAction): Hex;
18
+ export declare const OFF_CHAIN_QUORUM_DOMAIN_NAME = "AgenticQuorumAction";
19
+ export declare const OFF_CHAIN_QUORUM_DOMAIN_VERSION = "1";
20
+ export declare const OFF_CHAIN_QUORUM_EIP712_TYPES: {
21
+ readonly OffChainQuorumAction: readonly [{
22
+ readonly name: "delegationHash";
23
+ readonly type: "bytes32";
24
+ }, {
25
+ readonly name: "delegator";
26
+ readonly type: "address";
27
+ }, {
28
+ readonly name: "audience";
29
+ readonly type: "string";
30
+ }, {
31
+ readonly name: "operation";
32
+ readonly type: "string";
33
+ }, {
34
+ readonly name: "argumentsHash";
35
+ readonly type: "bytes32";
36
+ }, {
37
+ readonly name: "expiresAt";
38
+ readonly type: "uint256";
39
+ }];
40
+ };
41
+ /** THE ACTION a quorum approves off chain. Every field is the verifier's own fact about the call it is about
42
+ * to authorize — recomputed server-side, never read from the proof. */
43
+ export interface OffChainQuorumAction {
44
+ chainId: number;
45
+ /** The QuorumEnforcer address the delegation's QuorumCaveat names (the EIP-712 `verifyingContract`). */
46
+ enforcer: Address;
47
+ /** `hashDelegation(delegation, chainId, delegationManager)`. */
48
+ delegationHash: Hex;
49
+ delegator: Address;
50
+ /** The resource server the call is addressed to (the token's `aud`). */
51
+ audience: string;
52
+ /** The tool / operation name. */
53
+ operation: string;
54
+ /** `canonicalArgumentsHash(args)` over the arguments ACTUALLY received. */
55
+ argumentsHash: Hex;
56
+ /** Unix seconds after which the approval is void. Signed; chosen by the signers. */
57
+ expiresAt: number;
58
+ }
59
+ /** The digest quorum signers sign to approve one off-chain action (wallets: `signTypedData`). */
60
+ export declare function computeOffChainQuorumPayloadHash(a: OffChainQuorumAction): Hex;
2
61
  export interface OffChainQuorumProof {
3
62
  mode: 'off-chain';
4
- /** The hash the signers signed — MUST equal the bound payload (the delegation hash). */
63
+ /** The hash the signers signed — MUST equal `computeOffChainQuorumPayloadHash` of the action being
64
+ * authorized. Carried so a mismatch is reported as `payload_unbound`; it is never what is verified against. */
5
65
  payloadHash: Hex;
66
+ /** Unix seconds the approval is good until — a SIGNED field of the payload. */
67
+ expiresAt: number;
6
68
  /** Concatenated 65-byte ECDSA/packed signatures (Safe-style packing). */
7
69
  packedSignatures: Hex;
8
70
  }
@@ -10,14 +72,20 @@ export interface VerifyOffChainQuorumInput {
10
72
  /** The QuorumCaveat `terms`: abi(address[] signers, uint8 threshold, address approvedHashRegistry). */
11
73
  caveatTerms: Hex;
12
74
  proof: OffChainQuorumProof;
13
- /** The hash the quorum MUST have signed (bound to this delegation). */
14
- expectedPayloadHash: Hex;
75
+ /** THE ACTION being authorized, as the verifier knows it (`expiresAt` comes from the proof and is signed). */
76
+ action: Omit<OffChainQuorumAction, 'expiresAt'>;
77
+ /** The delegation's own issuance signature. It is never a quorum signature: a slot carrying it is refused
78
+ * outright (it could not verify over the action digest anyway — this makes the refusal explicit and named). */
79
+ delegationSignature: Hex;
80
+ /** Unix seconds. */
81
+ now: number;
15
82
  /** Connection-agnostic signature verifier (token.ts wires `verifyUniversalSignature`). */
16
83
  verifySignature: (signer: Address, digest: Hex, signature: Hex) => Promise<boolean>;
17
84
  }
18
85
  export type OffChainQuorumResult = {
19
86
  ok: true;
20
87
  matched: Address[];
88
+ payloadHash: Hex;
21
89
  } | {
22
90
  ok: false;
23
91
  reason: string;
@@ -1 +1 @@
1
- {"version":3,"file":"quorum.d.ts","sourceRoot":"","sources":["../src/quorum.ts"],"names":[],"mappings":"AAeA,OAAO,EAAuB,KAAK,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AAEnE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,WAAW,CAAC;IAClB,wFAAwF;IACxF,WAAW,EAAE,GAAG,CAAC;IACjB,yEAAyE;IACzE,gBAAgB,EAAE,GAAG,CAAC;CACvB;AAED,MAAM,WAAW,yBAAyB;IACxC,uGAAuG;IACvG,WAAW,EAAE,GAAG,CAAC;IACjB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,uEAAuE;IACvE,mBAAmB,EAAE,GAAG,CAAC;IACzB,0FAA0F;IAC1F,eAAe,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACrF;AAED,MAAM,MAAM,oBAAoB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAWpG,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAoD1G"}
1
+ {"version":3,"file":"quorum.d.ts","sourceRoot":"","sources":["../src/quorum.ts"],"names":[],"mappings":"AAgCA,OAAO,EAA+E,KAAK,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AAQ3H,gHAAgH;AAChH,eAAO,MAAM,kBAAkB,+JAC+H,CAAC;AAC/J,eAAO,MAAM,sBAAsB,EAAE,GAA4C,CAAC;AAElF,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,GAAG,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,GAAG,CAAC;CACf;AAED,kHAAkH;AAClH,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,mBAAmB,GAAG,GAAG,CAQpE;AAID,eAAO,MAAM,4BAA4B,wBAAwB,CAAC;AAClE,eAAO,MAAM,+BAA+B,MAAM,CAAC;AACnD,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;CAShC,CAAC;AAEX;wEACwE;AACxE,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,wGAAwG;IACxG,QAAQ,EAAE,OAAO,CAAC;IAClB,gEAAgE;IAChE,cAAc,EAAE,GAAG,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,wEAAwE;IACxE,QAAQ,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,aAAa,EAAE,GAAG,CAAC;IACnB,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,iGAAiG;AACjG,wBAAgB,gCAAgC,CAAC,CAAC,EAAE,oBAAoB,GAAG,GAAG,CAe7E;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,WAAW,CAAC;IAClB;oHACgH;IAChH,WAAW,EAAE,GAAG,CAAC;IACjB,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,gBAAgB,EAAE,GAAG,CAAC;CACvB;AAED,MAAM,WAAW,yBAAyB;IACxC,uGAAuG;IACvG,WAAW,EAAE,GAAG,CAAC;IACjB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,8GAA8G;IAC9G,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC;IAChD;oHACgH;IAChH,mBAAmB,EAAE,GAAG,CAAC;IACzB,oBAAoB;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,0FAA0F;IAC1F,eAAe,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACrF;AAED,MAAM,MAAM,oBAAoB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,EAAE,CAAC;IAAC,WAAW,EAAE,GAAG,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAYtH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAuE1G"}
package/dist/quorum.js CHANGED
@@ -1,22 +1,90 @@
1
- // Off-chain quorum verification (spec 291 §6b). For MCP-only operations that never
2
- // redeem on chain, verify a QuorumCaveat off-chain: threshold satisfied, every
3
- // signer authorized (in the caveat whitelist), every signature valid over the
4
- // bound payload — via the connection-agnostic signature verifier (EOA ECDSA /
5
- // ERC-1271 / ERC-6492). Fail-closed: any decode error, unbound payload, or
6
- // sub-threshold match rejects.
1
+ // Off-chain quorum verification (spec 291 §6b; rebound to the ACTION by spec 445 / AUTH-4, 2026-11-10).
2
+ // For MCP-only operations that never redeem on chain, verify a QuorumCaveat off chain: threshold satisfied by
3
+ // DISTINCT members of the caveat's signer set, every signature valid over the bound payload — via the
4
+ // connection-agnostic signature verifier (EOA ECDSA / ERC-1271 / ERC-6492). Fail-closed: any decode error,
5
+ // unbound payload, expired approval or sub-threshold match rejects.
7
6
  //
8
- // Binding: the quorum signs over `expectedPayloadHash` (the delegation's EIP-712
9
- // hash) — i.e. the quorum approves THIS exact delegation. A proof minted for one
10
- // delegation cannot be replayed onto another (each has a unique hash).
7
+ // THE PROPERTY (stated over the whole object): a quorum signature is an approval of ONE ACTION under ONE
8
+ // delegation on ONE chain at ONE enforcer, and it is a different kind of signature from the one that ISSUES a
9
+ // delegation. So the payload is the EIP-712 digest of
11
10
  //
12
- // Port: smart-agent RecoveryEnforcer.sol (guardian threshold + per-signer +
13
- // intent-bound). Divergence: that verifies on-chain at redeem; this is the
14
- // off-chain equivalent for tools that never redeem.
15
- import { decodeAbiParameters } from 'viem';
11
+ // domain { name: "AgenticQuorumAction", version: "1", chainId, verifyingContract: <the QuorumEnforcer> }
12
+ // OffChainQuorumAction(bytes32 delegationHash,address delegator,string audience,string operation,
13
+ // bytes32 argumentsHash,uint256 expiresAt)
14
+ //
15
+ // and the VERIFIER computes it from what it is about to authorize — it is never taken from the proof.
16
+ //
17
+ // WHAT THIS REPLACED (AUTH-4): the quorum signed the bare delegation hash — the same 32 bytes the issuing
18
+ // custodian signs to issue the delegation, with no domain separation. `delegation.signature`, which travels in
19
+ // clear inside every token, was therefore itself a valid quorum signature whenever the issuer sat in the signer
20
+ // set (the natural configuration), and one proof authorized every quorum-gated tool for the delegation's life.
21
+ //
22
+ // ON CHAIN IS A DIFFERENT DIGEST, DELIBERATELY. `QuorumEnforcer.beforeHook` binds
23
+ // `keccak256(abi.encode(QUORUM_ACTION_TYPEHASH, chainid, enforcer, delegationHash, delegator, redeemer, target,
24
+ // value, keccak256(callData)))` — an EVM call. An off-chain action is a tool call (audience, operation,
25
+ // arguments): it has no redeemer, target, value or calldata, and an off-chain proof is never redeemed on chain
26
+ // (`quorumProof.mode: 'off-chain'` is for tools that never reach the enforcer). The two are domain-separated so
27
+ // neither can stand in for the other; `computeQuorumPayloadHash` below is the byte-for-byte mirror of the
28
+ // on-chain one for callers that DO redeem (cross-stack test: test/integration/cross-stack-typehashes.test.ts).
29
+ //
30
+ // Port: smart-agent RecoveryEnforcer.sol (guardian threshold + per-signer + intent-bound). Divergence: that
31
+ // verifies on-chain at redeem; this is the off-chain equivalent for tools that never redeem.
32
+ import { decodeAbiParameters, encodeAbiParameters, hashTypedData, keccak256, toBytes } from 'viem';
33
+ import { assertChainId } from './hash.js';
34
+ const ADDRESS = /^0x[0-9a-fA-F]{40}$/;
35
+ const BYTES32 = /^0x[0-9a-fA-F]{64}$/;
36
+ // ─── The on-chain payload (mirror of QuorumEnforcer.sol) ───────────────────────────────────────────
37
+ /** `QuorumEnforcer.QUORUM_ACTION_TYPEHASH`'s type string — compared to the live Solidity source cross-stack. */
38
+ export const QUORUM_ACTION_TYPE = 'QuorumAction(uint256 chainId,address enforcer,bytes32 delegationHash,address delegator,address redeemer,address target,uint256 value,bytes32 callDataHash)';
39
+ export const QUORUM_ACTION_TYPEHASH = keccak256(toBytes(QUORUM_ACTION_TYPE));
40
+ /** Byte-for-byte `QuorumEnforcer.computeQuorumPayloadHash` — what quorum signers sign for a call that REDEEMS. */
41
+ export function computeQuorumPayloadHash(a) {
42
+ assertChainId(a.chainId, 'computeQuorumPayloadHash');
43
+ return keccak256(encodeAbiParameters([{ type: 'bytes32' }, { type: 'uint256' }, { type: 'address' }, { type: 'bytes32' }, { type: 'address' }, { type: 'address' }, { type: 'address' }, { type: 'uint256' }, { type: 'bytes32' }], [QUORUM_ACTION_TYPEHASH, BigInt(a.chainId), a.enforcer, a.delegationHash, a.delegator, a.redeemer, a.target, a.value, keccak256(a.callData)]));
44
+ }
45
+ // ─── The off-chain payload ─────────────────────────────────────────────────────────────────────────
46
+ export const OFF_CHAIN_QUORUM_DOMAIN_NAME = 'AgenticQuorumAction';
47
+ export const OFF_CHAIN_QUORUM_DOMAIN_VERSION = '1';
48
+ export const OFF_CHAIN_QUORUM_EIP712_TYPES = {
49
+ OffChainQuorumAction: [
50
+ { name: 'delegationHash', type: 'bytes32' },
51
+ { name: 'delegator', type: 'address' },
52
+ { name: 'audience', type: 'string' },
53
+ { name: 'operation', type: 'string' },
54
+ { name: 'argumentsHash', type: 'bytes32' },
55
+ { name: 'expiresAt', type: 'uint256' },
56
+ ],
57
+ };
58
+ /** The digest quorum signers sign to approve one off-chain action (wallets: `signTypedData`). */
59
+ export function computeOffChainQuorumPayloadHash(a) {
60
+ assertChainId(a.chainId, 'computeOffChainQuorumPayloadHash');
61
+ if (!ADDRESS.test(a.enforcer ?? ''))
62
+ throw new Error('computeOffChainQuorumPayloadHash: enforcer must be an address');
63
+ if (!ADDRESS.test(a.delegator ?? ''))
64
+ throw new Error('computeOffChainQuorumPayloadHash: delegator must be an address');
65
+ if (!BYTES32.test(a.delegationHash ?? ''))
66
+ throw new Error('computeOffChainQuorumPayloadHash: delegationHash must be bytes32');
67
+ if (!BYTES32.test(a.argumentsHash ?? ''))
68
+ throw new Error('computeOffChainQuorumPayloadHash: argumentsHash must be bytes32');
69
+ if (typeof a.audience !== 'string' || !a.audience)
70
+ throw new Error('computeOffChainQuorumPayloadHash: audience is required');
71
+ if (typeof a.operation !== 'string' || !a.operation)
72
+ throw new Error('computeOffChainQuorumPayloadHash: operation is required');
73
+ if (!Number.isSafeInteger(a.expiresAt) || a.expiresAt <= 0)
74
+ throw new Error('computeOffChainQuorumPayloadHash: expiresAt must be unix seconds');
75
+ return hashTypedData({
76
+ domain: { name: OFF_CHAIN_QUORUM_DOMAIN_NAME, version: OFF_CHAIN_QUORUM_DOMAIN_VERSION, chainId: a.chainId, verifyingContract: a.enforcer },
77
+ types: OFF_CHAIN_QUORUM_EIP712_TYPES,
78
+ primaryType: 'OffChainQuorumAction',
79
+ message: { delegationHash: a.delegationHash, delegator: a.delegator, audience: a.audience, operation: a.operation, argumentsHash: a.argumentsHash, expiresAt: BigInt(a.expiresAt) },
80
+ });
81
+ }
16
82
  /** Split a 0x-prefixed blob of concatenated 65-byte signatures; null if malformed. */
17
83
  function splitPackedSignatures(packed) {
84
+ if (typeof packed !== 'string')
85
+ return null;
18
86
  const hex = packed.startsWith('0x') ? packed.slice(2) : packed;
19
- if (hex.length === 0 || hex.length % 130 !== 0)
87
+ if (hex.length === 0 || hex.length % 130 !== 0 || !/^[0-9a-fA-F]+$/.test(hex))
20
88
  return null; // 65 bytes = 130 hex chars
21
89
  const out = [];
22
90
  for (let i = 0; i < hex.length; i += 130)
@@ -24,8 +92,24 @@ function splitPackedSignatures(packed) {
24
92
  return out;
25
93
  }
26
94
  export async function verifyOffChainQuorum(input) {
27
- // 1. Payload binding — the quorum must have signed THIS delegation's hash.
28
- if (input.proof.payloadHash.toLowerCase() !== input.expectedPayloadHash.toLowerCase()) {
95
+ // 1. Payload binding — computed HERE from the action; the proof's own claim is only compared to it.
96
+ const proof = input.proof;
97
+ if (!proof || typeof proof.expiresAt !== 'number' || !Number.isSafeInteger(proof.expiresAt))
98
+ return { ok: false, reason: 'bad_expiry' };
99
+ if (!Number.isFinite(input.now) || proof.expiresAt < input.now)
100
+ return { ok: false, reason: 'quorum_approval_expired' };
101
+ let expected;
102
+ try {
103
+ expected = computeOffChainQuorumPayloadHash({ ...input.action, expiresAt: proof.expiresAt });
104
+ }
105
+ catch (e) {
106
+ return { ok: false, reason: `action_unbound (${e instanceof Error ? e.message : 'invalid action'})` };
107
+ }
108
+ if (typeof proof.payloadHash !== 'string' || proof.payloadHash.toLowerCase() !== expected.toLowerCase()) {
109
+ // Named separately: the pre-445 proof shape (the quorum "approving the delegation") is the commonest way here.
110
+ if (typeof proof.payloadHash === 'string' && proof.payloadHash.toLowerCase() === input.action.delegationHash.toLowerCase()) {
111
+ return { ok: false, reason: 'payload_is_delegation_hash' };
112
+ }
29
113
  return { ok: false, reason: 'payload_unbound' };
30
114
  }
31
115
  // 2. Decode the caveat's authorized signer set + threshold.
@@ -33,23 +117,29 @@ export async function verifyOffChainQuorum(input) {
33
117
  let threshold;
34
118
  try {
35
119
  const [s, t] = decodeAbiParameters([{ type: 'address[]' }, { type: 'uint8' }, { type: 'address' }], input.caveatTerms);
36
- signers = s.map((a) => a);
120
+ // The SET: an address listed twice is one member (it can sign once).
121
+ signers = [...new Map(s.map((a) => [a.toLowerCase(), a])).values()];
37
122
  threshold = Number(t);
38
123
  }
39
124
  catch {
40
125
  return { ok: false, reason: 'bad_caveat_terms' };
41
126
  }
42
- if (!Number.isFinite(threshold) || threshold <= 0)
127
+ // EN-11 parity with QuorumEnforcer: threshold 0 would pass with zero signatures — refused, never defaulted.
128
+ if (!Number.isInteger(threshold) || threshold <= 0)
43
129
  return { ok: false, reason: 'bad_threshold' };
44
130
  if (signers.length < threshold)
45
131
  return { ok: false, reason: 'whitelist_smaller_than_threshold' };
46
132
  // 3. Split the packed signatures.
47
- const sigs = splitPackedSignatures(input.proof.packedSignatures);
133
+ const sigs = splitPackedSignatures(proof.packedSignatures);
48
134
  if (sigs === null)
49
135
  return { ok: false, reason: 'bad_signatures' };
136
+ const issuance = typeof input.delegationSignature === 'string' ? input.delegationSignature.toLowerCase() : '';
137
+ if (issuance.length > 2 && sigs.some((s) => s.toLowerCase() === issuance)) {
138
+ return { ok: false, reason: 'delegation_signature_in_quorum_slot' };
139
+ }
50
140
  if (sigs.length < threshold)
51
141
  return { ok: false, reason: 'insufficient_signatures' };
52
- // 4. Match each signature to a UNIQUE authorized signer (no double-count).
142
+ // 4. Match each signature to a UNIQUE authorized signer (no double-count) over the COMPUTED digest.
53
143
  const remaining = new Set(signers.map((a) => a.toLowerCase()));
54
144
  const matched = [];
55
145
  for (const sig of sigs) {
@@ -58,7 +148,7 @@ export async function verifyOffChainQuorum(input) {
58
148
  continue;
59
149
  let ok = false;
60
150
  try {
61
- ok = await input.verifySignature(signer, input.proof.payloadHash, sig);
151
+ ok = (await input.verifySignature(signer, expected, sig)) === true;
62
152
  }
63
153
  catch {
64
154
  ok = false; // a throwing verifier is a failed check (fail-closed)
@@ -75,6 +165,6 @@ export async function verifyOffChainQuorum(input) {
75
165
  if (matched.length < threshold) {
76
166
  return { ok: false, reason: `threshold_unmet (${matched.length}/${threshold})` };
77
167
  }
78
- return { ok: true, matched };
168
+ return { ok: true, matched, payloadHash: expected };
79
169
  }
80
170
  //# sourceMappingURL=quorum.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"quorum.js","sourceRoot":"","sources":["../src/quorum.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"quorum.js","sourceRoot":"","sources":["../src/quorum.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"standing.d.ts","sourceRoot":"","sources":["../src/standing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standing.d.ts","sourceRoot":"","sources":["../src/standing.ts"],"names":[],"mappings":"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"}
package/dist/standing.js CHANGED
@@ -6,10 +6,16 @@
6
6
  //
7
7
  // When a run parks `authority_required`, the holder of the delegate key DERIVES the mandate the run asked for: a
8
8
  // child of the standing wire bound to exactly that intent (`deriveMandate`, subset-checked by the capability's own
9
- // handler), signs it with the delegate key, and presents the chain [child, standing]. The harness verifies every
10
- // link — the standing wire's signature against the principal (ERC-1271 / approved digest), its revocation on chain,
11
- // the child ⊆ parent, the intent and plan binding — before the step acts. Revoke the standing wire on chain and the
12
- // next derivation is refused everywhere.
9
+ // handler), signs it with the delegate key, and presents the chain [child, standing].
10
+ //
11
+ // WHO HOLDS THE CHILD TO THE WIRE (spec 445 §3.1). Not this file: `deriveFromStanding` is the honest minter's
12
+ // early refusal, and the holder of the delegate key can sign a child without calling it. The VERIFIER does —
13
+ // `verifyAuthorityChain`, run by the harness composition before every step and by the presentation release before
14
+ // every signature: the root delegator is the principal the step needs; the standing wire is signed by her (ERC-1271
15
+ // / approved digest), unrevoked on chain, in window; the child ⊆ the wire by the capability's handler; and the step
16
+ // itself is within the WIRE's caveats, not only the child's. Revoke the standing wire on chain and the next step,
17
+ // and the next presentation, are refused. (Before spec 445 this paragraph claimed "the harness verifies … the child
18
+ // ⊆ parent"; it verified the wire was live and read the child alone — audit H-7 / AUTH-1, H-8 / AUTH-2.)
13
19
  //
14
20
  // What a standing wire is NOT: a session, a bearer, a wildcard (never `A2A_ANY_SKILL`), or a pre-approval of
15
21
  // anything but the named capability within the window and the cap. One wire, one capability selector.
@@ -1 +1 @@
1
- {"version":3,"file":"standing.js","sourceRoot":"","sources":["../src/standing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standing.js","sourceRoot":"","sources":["../src/standing.ts"],"names":[],"mappings":"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"}
package/dist/token.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { type Address, type Hex } from 'viem';
2
2
  import type { Delegation, DelegationTokenClaims, VerifyError, VerifyOpts, DataScopeGrant, VaultRecordScopeGrant } from './types.js';
3
+ import { type OffChainQuorumProof } from './quorum.js';
3
4
  import { type AuditSink } from '@agenticprimitives/audit';
4
5
  /** Sorted-key JSON; BigInt → numeric string. Both sides must produce the
5
6
  * exact same bytes for the signature to round-trip.
@@ -171,17 +172,19 @@ export interface VerifyOptsExt extends VerifyOpts {
171
172
  * Use this for any flow that actually broadcasts a UserOp /
172
173
  * transaction that hits the on-chain enforcer.
173
174
  *
174
- * - `{ mode: 'off-chain', payloadHash, packedSignatures }` — for
175
+ * - `{ mode: 'off-chain', payloadHash, expiresAt, packedSignatures }` — for
175
176
  * MCP-only / data-tool flows that never reach the on-chain
176
- * enforcer. The verifier MUST validate the packed signatures
177
- * off-chain against `payloadHash` (which the caller binds to
178
- * the tool/action context) AND against the signer set encoded
179
- * in the QuorumCaveat terms. This mode currently throws with
180
- * `quorum_off_chain_not_implemented` — wire-format is reserved
181
- * so consumers can plan migration; the verification logic
182
- * ships in a follow-up wave once the bound payload format is
183
- * spec'd in `specs/207-smart-account-threshold-policy.md` §
184
- * "off-chain quorum".
177
+ * enforcer. The quorum signs ONE ACTION: the EIP-712 digest
178
+ * `computeOffChainQuorumPayloadHash({ chainId, enforcer,
179
+ * delegationHash, delegator, audience, operation, argumentsHash,
180
+ * expiresAt })` (domain `AgenticQuorumAction`, distinct from the
181
+ * delegation's own). The verifier RECOMPUTES that digest from
182
+ * `quorumAction` + this call's audience / tool / delegation and
183
+ * checks the packed signatures against it and against the signer
184
+ * set in the QuorumCaveat terms — distinct members, threshold ≥ 1.
185
+ * Spec 445 / AUTH-4: a proof over the bare delegation hash (the
186
+ * pre-445 shape), a proof for another action, and the delegation's
187
+ * own signature in a slot are all refused.
185
188
  *
186
189
  * If `requireQuorumCaveat` is set without a `quorumProof`, the
187
190
  * verifier rejects. This makes the off-chain enforcement gap
@@ -190,10 +193,16 @@ export interface VerifyOptsExt extends VerifyOpts {
190
193
  */
191
194
  quorumProof?: {
192
195
  mode: 'on-chain-redeemed';
193
- } | {
194
- mode: 'off-chain';
195
- payloadHash: Hex;
196
- packedSignatures: Hex;
196
+ } | OffChainQuorumProof;
197
+ /**
198
+ * Spec 445 / AUTH-4 — THE ACTION an off-chain quorum proof must have approved: the canonical hash of the
199
+ * arguments this call ACTUALLY carries (`canonicalArgumentsHash(args)`, recomputed by the resource server —
200
+ * never the client's stated value). The operation is `toolName`, the audience is `audience`. REQUIRED with
201
+ * `quorumProof.mode: 'off-chain'`: absent ⇒ the verifier rejects (`quorum_off_chain_requires_action`) —
202
+ * a quorum that is not told what it approves approves nothing.
203
+ */
204
+ quorumAction?: {
205
+ argumentsHash: Hex;
197
206
  };
198
207
  /**
199
208
  * Usage-accounting mode for the delegation token's `usageLimit`/JTI (spec 290 §3).
@@ -1 +1 @@
1
- {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../src/token.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../src/token.ts"],"names":[],"mappings":"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"}
package/dist/token.js CHANGED
@@ -619,7 +619,14 @@ export async function verifyDelegationToken(token, opts) {
619
619
  // inert sentinels denies with `'context-required'` rather than silently
620
620
  // permitting. Callers who genuinely will redeem on-chain (a separate
621
621
  // redeem path) call `evaluateCaveats` directly with `{ enforceOnChain: true }`.
622
- const verdicts = evaluateCaveats(claims.delegation.caveats, { timestamp: now, mcpTool: opts.toolName }, opts.enforcerMap, { enforceOnChain: opts.enforceOnChain === true });
622
+ // Spec 445 / AUTH-4 — THE QUORUM CAVEAT HAS ONE JUDGE. The evaluator has no entry for the QuorumEnforcer (it
623
+ // cannot check signatures), so a delegation carrying one is `unknown enforcer` ⇒ denied — which is right for
624
+ // every verifier that does not verify the quorum, and is why the off-chain gate below was unreachable through
625
+ // this function before. ONLY when this call verifies the quorum's signatures itself (step 4.5, `off-chain`
626
+ // mode) are that enforcer's caveats handed to that gate instead; `on-chain-redeemed` is a caller's assertion,
627
+ // verifies nothing here, and so leaves the caveat with the evaluator (denied unless the map knows it).
628
+ const quorumJudgedHere = opts.requireQuorumCaveat && opts.quorumProof?.mode === 'off-chain' ? opts.requireQuorumCaveat.enforcer.toLowerCase() : null;
629
+ const verdicts = evaluateCaveats(quorumJudgedHere ? claims.delegation.caveats.filter((c) => c.enforcer.toLowerCase() !== quorumJudgedHere) : claims.delegation.caveats, { timestamp: now, mcpTool: opts.toolName }, opts.enforcerMap, { enforceOnChain: opts.enforceOnChain === true });
623
630
  for (const v of verdicts) {
624
631
  if (!v.allowed) {
625
632
  return rejectWith(`caveat denied (${v.reason})`, claims.delegation.delegator, eip712Hash);
@@ -645,34 +652,56 @@ export async function verifyDelegationToken(token, opts) {
645
652
  }
646
653
  if (opts.quorumProof.mode === 'off-chain') {
647
654
  // Spec 291 §6b — verify the QuorumCaveat off-chain (threshold + authorized
648
- // signers + signatures bound to THIS delegation's hash). For tools that
655
+ // signers + signatures bound to THIS ACTION under this delegation). For tools that
649
656
  // never redeem on chain. Requires the UniversalSignatureValidator surface
650
657
  // so any signer credential strategy (EOA / ERC-1271 / ERC-6492) works.
651
658
  if (!opts.universalSignatureValidator) {
652
659
  return rejectWith('quorum_off_chain_requires_universalSignatureValidator', claims.delegation.delegator, eip712Hash);
653
660
  }
654
661
  const usv = opts.universalSignatureValidator;
655
- const quorumCaveat = claims.delegation.caveats.find((c) => c.enforcer.toLowerCase() === target);
656
- if (!quorumCaveat) {
662
+ // EVERY caveat of that enforcer must be satisfied (they were all taken from the evaluator above).
663
+ const quorumCaveats = claims.delegation.caveats.filter((c) => c.enforcer.toLowerCase() === target);
664
+ if (quorumCaveats.length === 0) {
657
665
  // Defensive — hasQuorum above already guaranteed presence.
658
666
  return rejectWith('quorum caveat vanished', claims.delegation.delegator, eip712Hash);
659
667
  }
660
- const quorumResult = await verifyOffChainQuorum({
661
- caveatTerms: quorumCaveat.terms,
662
- proof: opts.quorumProof,
663
- // Bind the quorum to THIS delegation (its EIP-712 hash) — replay onto a
664
- // different delegation fails the payload-binding check.
665
- expectedPayloadHash: eip712Hash,
666
- verifySignature: (signer, digest, signature) => verifyUniversalSignature({ signer, digest, signature, rpcUrl: opts.rpcUrl, universalSignatureValidator: usv }),
667
- });
668
- if (!quorumResult.ok) {
669
- return rejectWith(`quorum_off_chain: ${quorumResult.reason}`, claims.delegation.delegator, eip712Hash);
668
+ // Spec 445 / AUTH-4 — the quorum approves THIS ACTION, not "this delegation": the digest is recomputed
669
+ // here from the tool, the arguments received, the audience, the delegation, the chain and the enforcer.
670
+ // The proof's own `payloadHash` is only compared to it. Absent facts are a refusal, never a default.
671
+ if (!opts.toolName) {
672
+ return rejectWith('quorum_off_chain_requires_toolName', claims.delegation.delegator, eip712Hash);
673
+ }
674
+ if (!opts.quorumAction || !/^0x[0-9a-fA-F]{64}$/.test(opts.quorumAction.argumentsHash ?? '')) {
675
+ return rejectWith('quorum_off_chain_requires_action', claims.delegation.delegator, eip712Hash);
676
+ }
677
+ for (const quorumCaveat of quorumCaveats) {
678
+ const quorumResult = await verifyOffChainQuorum({
679
+ caveatTerms: quorumCaveat.terms,
680
+ proof: opts.quorumProof,
681
+ action: {
682
+ chainId: opts.chainId,
683
+ enforcer: opts.requireQuorumCaveat.enforcer,
684
+ delegationHash: eip712Hash,
685
+ delegator: claims.delegation.delegator,
686
+ audience: opts.audience,
687
+ operation: opts.toolName,
688
+ argumentsHash: opts.quorumAction.argumentsHash,
689
+ },
690
+ // The issuance signature travels in clear in every token; it is never a quorum signature.
691
+ delegationSignature: claims.delegation.signature,
692
+ now,
693
+ verifySignature: (signer, digest, signature) => verifyUniversalSignature({ signer, digest, signature, rpcUrl: opts.rpcUrl, universalSignatureValidator: usv }),
694
+ });
695
+ if (!quorumResult.ok) {
696
+ return rejectWith(`quorum_off_chain: ${quorumResult.reason}`, claims.delegation.delegator, eip712Hash);
697
+ }
670
698
  }
671
699
  // Verified — fall through to the rest of the pipeline.
672
700
  }
673
- // mode === 'on-chain-redeemed' — caller asserts the call will
674
- // pass through QuorumEnforcer.beforeHook on chain. Accept; the
675
- // on-chain layer is responsible for the actual signature check.
701
+ // mode === 'on-chain-redeemed' — the caller asserts the call will pass through
702
+ // QuorumEnforcer.beforeHook on chain, where the signatures are checked against the
703
+ // CALL (`computeQuorumPayloadHash`). Nothing is verified here on that assertion, so the
704
+ // quorum caveat stayed with the evaluator above (step 4), which has no judge for it.
676
705
  }
677
706
  // - requireAcceptedOnChain: account.hasAcceptedSessionDelegation(hash)
678
707
  // must return true. Spec § 6 high-risk gate. Single extra chain