agent-passport-system 4.1.0 → 4.2.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.
Files changed (122) hide show
  1. package/README.md +37 -34
  2. package/dist/src/adapters/oauth-id-jag/import-v1.d.ts +74 -0
  3. package/dist/src/adapters/oauth-id-jag/import-v1.d.ts.map +1 -0
  4. package/dist/src/adapters/oauth-id-jag/import-v1.js +243 -0
  5. package/dist/src/adapters/oauth-id-jag/import-v1.js.map +1 -0
  6. package/dist/src/index.d.ts +3 -0
  7. package/dist/src/index.d.ts.map +1 -1
  8. package/dist/src/index.js +6 -0
  9. package/dist/src/index.js.map +1 -1
  10. package/dist/src/profiles/a2a/identity-v1.d.ts +44 -0
  11. package/dist/src/profiles/a2a/identity-v1.d.ts.map +1 -0
  12. package/dist/src/profiles/a2a/identity-v1.js +208 -0
  13. package/dist/src/profiles/a2a/identity-v1.js.map +1 -0
  14. package/dist/src/profiles/a2a/index.d.ts +2 -0
  15. package/dist/src/profiles/a2a/index.d.ts.map +1 -0
  16. package/dist/src/profiles/a2a/index.js +2 -0
  17. package/dist/src/profiles/a2a/index.js.map +1 -0
  18. package/dist/src/profiles/mcp/authorization-v1.d.ts +88 -0
  19. package/dist/src/profiles/mcp/authorization-v1.d.ts.map +1 -0
  20. package/dist/src/profiles/mcp/authorization-v1.js +215 -0
  21. package/dist/src/profiles/mcp/authorization-v1.js.map +1 -0
  22. package/dist/src/profiles/mcp/index.d.ts +2 -0
  23. package/dist/src/profiles/mcp/index.d.ts.map +1 -0
  24. package/dist/src/profiles/mcp/index.js +2 -0
  25. package/dist/src/profiles/mcp/index.js.map +1 -0
  26. package/dist/src/v2/action-reference/index.d.ts +2 -0
  27. package/dist/src/v2/action-reference/index.d.ts.map +1 -0
  28. package/dist/src/v2/action-reference/index.js +2 -0
  29. package/dist/src/v2/action-reference/index.js.map +1 -0
  30. package/dist/src/v2/action-reference/v2.d.ts +23 -0
  31. package/dist/src/v2/action-reference/v2.d.ts.map +1 -0
  32. package/dist/src/v2/action-reference/v2.js +57 -0
  33. package/dist/src/v2/action-reference/v2.js.map +1 -0
  34. package/dist/src/v2/authority-delegation/budget.d.ts +20 -0
  35. package/dist/src/v2/authority-delegation/budget.d.ts.map +1 -0
  36. package/dist/src/v2/authority-delegation/budget.js +141 -0
  37. package/dist/src/v2/authority-delegation/budget.js.map +1 -0
  38. package/dist/src/v2/authority-delegation/canonical.d.ts +12 -0
  39. package/dist/src/v2/authority-delegation/canonical.d.ts.map +1 -0
  40. package/dist/src/v2/authority-delegation/canonical.js +33 -0
  41. package/dist/src/v2/authority-delegation/canonical.js.map +1 -0
  42. package/dist/src/v2/authority-delegation/compare.d.ts +4 -0
  43. package/dist/src/v2/authority-delegation/compare.d.ts.map +1 -0
  44. package/dist/src/v2/authority-delegation/compare.js +67 -0
  45. package/dist/src/v2/authority-delegation/compare.js.map +1 -0
  46. package/dist/src/v2/authority-delegation/index.d.ts +10 -0
  47. package/dist/src/v2/authority-delegation/index.d.ts.map +1 -0
  48. package/dist/src/v2/authority-delegation/index.js +12 -0
  49. package/dist/src/v2/authority-delegation/index.js.map +1 -0
  50. package/dist/src/v2/authority-delegation/issue.d.ts +10 -0
  51. package/dist/src/v2/authority-delegation/issue.d.ts.map +1 -0
  52. package/dist/src/v2/authority-delegation/issue.js +52 -0
  53. package/dist/src/v2/authority-delegation/issue.js.map +1 -0
  54. package/dist/src/v2/authority-delegation/parse.d.ts +4 -0
  55. package/dist/src/v2/authority-delegation/parse.d.ts.map +1 -0
  56. package/dist/src/v2/authority-delegation/parse.js +96 -0
  57. package/dist/src/v2/authority-delegation/parse.js.map +1 -0
  58. package/dist/src/v2/authority-delegation/schema.d.ts +7 -0
  59. package/dist/src/v2/authority-delegation/schema.d.ts.map +1 -0
  60. package/dist/src/v2/authority-delegation/schema.js +177 -0
  61. package/dist/src/v2/authority-delegation/schema.js.map +1 -0
  62. package/dist/src/v2/authority-delegation/scope.d.ts +6 -0
  63. package/dist/src/v2/authority-delegation/scope.d.ts.map +1 -0
  64. package/dist/src/v2/authority-delegation/scope.js +50 -0
  65. package/dist/src/v2/authority-delegation/scope.js.map +1 -0
  66. package/dist/src/v2/authority-delegation/types.d.ts +98 -0
  67. package/dist/src/v2/authority-delegation/types.d.ts.map +1 -0
  68. package/dist/src/v2/authority-delegation/types.js +10 -0
  69. package/dist/src/v2/authority-delegation/types.js.map +1 -0
  70. package/dist/src/v2/authority-delegation/verify.d.ts +5 -0
  71. package/dist/src/v2/authority-delegation/verify.d.ts.map +1 -0
  72. package/dist/src/v2/authority-delegation/verify.js +124 -0
  73. package/dist/src/v2/authority-delegation/verify.js.map +1 -0
  74. package/dist/src/v2/identity-binding/did-aps.d.ts +12 -0
  75. package/dist/src/v2/identity-binding/did-aps.d.ts.map +1 -0
  76. package/dist/src/v2/identity-binding/did-aps.js +53 -0
  77. package/dist/src/v2/identity-binding/did-aps.js.map +1 -0
  78. package/dist/src/v2/identity-binding/index.d.ts +6 -0
  79. package/dist/src/v2/identity-binding/index.d.ts.map +1 -0
  80. package/dist/src/v2/identity-binding/index.js +6 -0
  81. package/dist/src/v2/identity-binding/index.js.map +1 -0
  82. package/dist/src/v2/identity-binding/passport.d.ts +18 -0
  83. package/dist/src/v2/identity-binding/passport.d.ts.map +1 -0
  84. package/dist/src/v2/identity-binding/passport.js +144 -0
  85. package/dist/src/v2/identity-binding/passport.js.map +1 -0
  86. package/dist/src/v2/identity-binding/principal-binding.d.ts +20 -0
  87. package/dist/src/v2/identity-binding/principal-binding.d.ts.map +1 -0
  88. package/dist/src/v2/identity-binding/principal-binding.js +128 -0
  89. package/dist/src/v2/identity-binding/principal-binding.js.map +1 -0
  90. package/dist/src/v2/identity-binding/revocation.d.ts +12 -0
  91. package/dist/src/v2/identity-binding/revocation.d.ts.map +1 -0
  92. package/dist/src/v2/identity-binding/revocation.js +97 -0
  93. package/dist/src/v2/identity-binding/revocation.js.map +1 -0
  94. package/dist/src/v2/identity-binding/types.d.ts +72 -0
  95. package/dist/src/v2/identity-binding/types.d.ts.map +1 -0
  96. package/dist/src/v2/identity-binding/types.js +4 -0
  97. package/dist/src/v2/identity-binding/types.js.map +1 -0
  98. package/dist/src/v2/identity-binding/validation.d.ts +9 -0
  99. package/dist/src/v2/identity-binding/validation.d.ts.map +1 -0
  100. package/dist/src/v2/identity-binding/validation.js +104 -0
  101. package/dist/src/v2/identity-binding/validation.js.map +1 -0
  102. package/dist/src/v2/receipt-core/decision-ref.d.ts +23 -0
  103. package/dist/src/v2/receipt-core/decision-ref.d.ts.map +1 -0
  104. package/dist/src/v2/receipt-core/decision-ref.js +75 -0
  105. package/dist/src/v2/receipt-core/decision-ref.js.map +1 -0
  106. package/dist/src/v2/receipt-core/jcs.d.ts +15 -0
  107. package/dist/src/v2/receipt-core/jcs.d.ts.map +1 -0
  108. package/dist/src/v2/receipt-core/jcs.js +198 -0
  109. package/dist/src/v2/receipt-core/jcs.js.map +1 -0
  110. package/dist/src/v2/receipt-core/receipt.d.ts +21 -0
  111. package/dist/src/v2/receipt-core/receipt.d.ts.map +1 -0
  112. package/dist/src/v2/receipt-core/receipt.js +132 -0
  113. package/dist/src/v2/receipt-core/receipt.js.map +1 -0
  114. package/dist/src/v2/receipt-core/supporting-record.d.ts +55 -0
  115. package/dist/src/v2/receipt-core/supporting-record.d.ts.map +1 -0
  116. package/dist/src/v2/receipt-core/supporting-record.js +243 -0
  117. package/dist/src/v2/receipt-core/supporting-record.js.map +1 -0
  118. package/dist/src/v2/receipt-core/types.d.ts +94 -0
  119. package/dist/src/v2/receipt-core/types.d.ts.map +1 -0
  120. package/dist/src/v2/receipt-core/types.js +4 -0
  121. package/dist/src/v2/receipt-core/types.js.map +1 -0
  122. package/package.json +6 -6
@@ -0,0 +1,215 @@
1
+ // Copyright (c) 2026 Tymofii Pidlisnyi
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { createHash } from 'node:crypto';
4
+ import { canonicalizeJCS } from '../../core/canonical-jcs.js';
5
+ import { sign, verify } from '../../crypto/keys.js';
6
+ import { computeActionRefV2, createActionReferenceInputV2, } from '../../v2/action-reference/v2.js';
7
+ import { assertExactKeys, assertHex, assertIJson, assertPlainRecord, assertSortedUnique, assertUtcMilliseconds, sortedUnique, } from '../../v2/identity-binding/validation.js';
8
+ export const APS_MCP_AUTHORIZATION_META = 'org.agent-passport/authorization';
9
+ export const APS_MCP_RECEIPT_META = 'org.agent-passport/receipt';
10
+ const INTENT_DOMAIN = 'APS-MCP-INTENT-V1\0';
11
+ const ARGUMENTS_DOMAIN = 'APS-MCP-ARGUMENTS-V1\0';
12
+ export class ApsMcpAuthorizationError extends Error {
13
+ code;
14
+ constructor(code) {
15
+ super(code);
16
+ this.code = code;
17
+ this.name = 'ApsMcpAuthorizationError';
18
+ }
19
+ }
20
+ export function computeMcpArgumentsHashV1(argumentsValue) {
21
+ assertIJson(argumentsValue);
22
+ return createHash('sha256')
23
+ .update(ARGUMENTS_DOMAIN + canonicalizeJCS(argumentsValue), 'utf8')
24
+ .digest('hex');
25
+ }
26
+ export function issueApsMcpAuthorizationV1(input) {
27
+ const server = canonicalMcpServerUri(input.mcp_server);
28
+ const argumentsHash = computeMcpArgumentsHashV1(input.arguments);
29
+ const scopes = sortedUnique(input.scope_required.map((scope) => scope.normalize('NFC')), 'scope_required');
30
+ const actionRef = computeActionRefV2(createActionReferenceInputV2({
31
+ agent_id: input.agent_id,
32
+ action_type: 'mcp:tools/call',
33
+ target: `${server}#tool=${encodeURIComponent(input.tool_name)}`,
34
+ payload_ref: argumentsHash,
35
+ scope_required: scopes,
36
+ issued_at: input.issued_at,
37
+ nonce: input.nonce,
38
+ }));
39
+ const unsigned = {
40
+ profile: 'aps-mcp-1',
41
+ agent_id: input.agent_id,
42
+ verification_method: input.verification_method,
43
+ delegation_ref: input.delegation_ref,
44
+ mcp_server: server,
45
+ method: 'tools/call',
46
+ tool_name: input.tool_name,
47
+ arguments_hash: argumentsHash,
48
+ scope_required: scopes,
49
+ ...(input.spend === undefined ? {} : { spend: input.spend }),
50
+ nonce: input.nonce,
51
+ issued_at: input.issued_at,
52
+ expires_at: input.expires_at,
53
+ action_ref: actionRef,
54
+ };
55
+ validateAuthorizationUnsigned(unsigned);
56
+ return {
57
+ ...unsigned,
58
+ signature: sign(INTENT_DOMAIN + canonicalizeJCS(unsigned), input.private_key_hex),
59
+ };
60
+ }
61
+ export async function verifyApsMcpAuthorizationV1(candidate, expected) {
62
+ let authorization;
63
+ try {
64
+ authorization = validateAuthorization(candidate);
65
+ }
66
+ catch {
67
+ return { state: 'invalid', code: 'MCP_AUTHORIZATION_MALFORMED' };
68
+ }
69
+ const expectedServer = canonicalMcpServerUri(expected.mcp_server);
70
+ if (authorization.mcp_server !== expectedServer || authorization.tool_name !== expected.tool_name) {
71
+ return { state: 'invalid', code: 'MCP_TARGET_MISMATCH' };
72
+ }
73
+ const argumentsHash = computeMcpArgumentsHashV1(expected.arguments);
74
+ if (argumentsHash !== authorization.arguments_hash) {
75
+ return { state: 'invalid', code: 'MCP_ARGUMENTS_MISMATCH' };
76
+ }
77
+ const recomputedActionRef = computeActionRefV2(createActionReferenceInputV2({
78
+ agent_id: authorization.agent_id,
79
+ action_type: 'mcp:tools/call',
80
+ target: `${authorization.mcp_server}#tool=${encodeURIComponent(authorization.tool_name)}`,
81
+ payload_ref: authorization.arguments_hash,
82
+ scope_required: authorization.scope_required,
83
+ issued_at: authorization.issued_at,
84
+ nonce: authorization.nonce,
85
+ }));
86
+ if (recomputedActionRef !== authorization.action_ref) {
87
+ return { state: 'invalid', code: 'MCP_ACTION_REF_MISMATCH' };
88
+ }
89
+ const now = expected.now ?? new Date().toISOString();
90
+ if (now < authorization.issued_at || now >= authorization.expires_at) {
91
+ return { state: 'invalid', code: 'MCP_AUTHORIZATION_NOT_CURRENT' };
92
+ }
93
+ const resolution = await expected.resolve_key({
94
+ controller: authorization.agent_id,
95
+ verification_method: authorization.verification_method,
96
+ at: authorization.issued_at,
97
+ });
98
+ if (resolution.state !== 'resolved' || !resolution.public_key_hex) {
99
+ return {
100
+ state: resolution.state === 'unreachable' ? 'indeterminate' : 'invalid',
101
+ code: `MCP_SIGNING_KEY_${resolution.state.toUpperCase()}`,
102
+ };
103
+ }
104
+ const unsigned = omit(authorization, ['signature']);
105
+ if (!verify(INTENT_DOMAIN + canonicalizeJCS(unsigned), authorization.signature, resolution.public_key_hex)) {
106
+ return { state: 'invalid', code: 'MCP_SIGNATURE_INVALID' };
107
+ }
108
+ return { state: 'valid', code: 'OK', authorization };
109
+ }
110
+ /**
111
+ * Creates an unavoidable pre-dispatch guard for an MCP tools/call handler.
112
+ * Transport OAuth is checked first. The APS intent, replay claim, authority
113
+ * decision, and budget reservation all complete before dispatch is invoked.
114
+ */
115
+ export function createApsMcpToolCallMiddleware(options) {
116
+ return async function apsMcpToolCall(request, context, dispatch) {
117
+ if (!context.transport_authenticated)
118
+ throw new ApsMcpAuthorizationError('MCP_TRANSPORT_UNAUTHENTICATED');
119
+ if (request.method !== 'tools/call')
120
+ throw new ApsMcpAuthorizationError('MCP_METHOD_UNSUPPORTED');
121
+ const metadata = request.params._meta;
122
+ const candidate = metadata?.[APS_MCP_AUTHORIZATION_META];
123
+ const verification = await verifyApsMcpAuthorizationV1(candidate, {
124
+ mcp_server: options.mcp_server,
125
+ tool_name: request.params.name,
126
+ arguments: request.params.arguments ?? {},
127
+ resolve_key: options.resolve_key,
128
+ });
129
+ if (verification.state !== 'valid' || !verification.authorization) {
130
+ throw new ApsMcpAuthorizationError(verification.code);
131
+ }
132
+ if (!await options.consume_action_ref(verification.authorization.action_ref, verification.authorization.expires_at))
133
+ throw new ApsMcpAuthorizationError('MCP_ACTION_REPLAY');
134
+ const authority = await options.evaluate_authority(verification.authorization, request);
135
+ if (authority.state !== 'permit')
136
+ throw new ApsMcpAuthorizationError(authority.code);
137
+ const dispatched = await dispatch(request);
138
+ const receipt = await options.emit_receipt(verification.authorization, authority, dispatched);
139
+ return {
140
+ ...dispatched,
141
+ _meta: {
142
+ ...(dispatched._meta ?? {}),
143
+ [APS_MCP_RECEIPT_META]: receipt,
144
+ },
145
+ };
146
+ };
147
+ }
148
+ export function canonicalMcpServerUri(value) {
149
+ const parsed = new URL(value);
150
+ if (!['https:', 'http:'].includes(parsed.protocol) || parsed.username || parsed.password || parsed.hash) {
151
+ throw new Error('Invalid MCP server resource URI');
152
+ }
153
+ if (parsed.protocol === 'http:' && !['localhost', '127.0.0.1', '[::1]'].includes(parsed.hostname)) {
154
+ throw new Error('MCP server resource URI requires HTTPS outside localhost');
155
+ }
156
+ if (parsed.pathname === '/' && !parsed.search)
157
+ parsed.pathname = '';
158
+ return parsed.toString().replace(/\/$/, '');
159
+ }
160
+ function validateAuthorization(candidate) {
161
+ assertPlainRecord(candidate, 'MCP authorization');
162
+ assertExactKeys(candidate, [
163
+ 'profile', 'agent_id', 'verification_method', 'delegation_ref', 'mcp_server',
164
+ 'method', 'tool_name', 'arguments_hash', 'scope_required', 'nonce',
165
+ 'issued_at', 'expires_at', 'action_ref', 'signature',
166
+ ], ['spend'], 'MCP authorization');
167
+ const unsigned = omit(candidate, ['signature']);
168
+ validateAuthorizationUnsigned(unsigned);
169
+ assertHex(String(candidate.signature), 128, 'signature');
170
+ return candidate;
171
+ }
172
+ function validateAuthorizationUnsigned(value) {
173
+ assertIJson(value);
174
+ if (value.profile !== 'aps-mcp-1' || value.method !== 'tools/call')
175
+ throw new Error('MCP profile');
176
+ if (!/^did:[a-z0-9]+:.+$/.test(value.agent_id))
177
+ throw new Error('agent_id');
178
+ if (!value.verification_method.startsWith(`${value.agent_id}#`))
179
+ throw new Error('verification_method');
180
+ if (typeof value.delegation_ref !== 'string' || value.delegation_ref.length === 0)
181
+ throw new Error('delegation_ref');
182
+ if (canonicalMcpServerUri(value.mcp_server) !== value.mcp_server)
183
+ throw new Error('non-canonical mcp_server');
184
+ if (!/^[A-Za-z0-9_.-]{1,128}$/.test(value.tool_name))
185
+ throw new Error('tool_name');
186
+ assertHex(value.arguments_hash, 64, 'arguments_hash');
187
+ if (!Array.isArray(value.scope_required))
188
+ throw new Error('scope_required');
189
+ assertSortedUnique(value.scope_required, 'scope_required');
190
+ for (const scope of value.scope_required)
191
+ if (scope !== scope.normalize('NFC'))
192
+ throw new Error('scope_required NFC');
193
+ if (value.spend !== undefined) {
194
+ assertPlainRecord(value.spend, 'spend');
195
+ assertExactKeys(value.spend, ['unit', 'amount'], [], 'spend');
196
+ if (!/^[A-Za-z0-9:._-]{1,64}$/.test(value.spend.unit))
197
+ throw new Error('spend unit');
198
+ if (!/^(0|[1-9]\d{0,18})$/.test(value.spend.amount))
199
+ throw new Error('spend amount');
200
+ }
201
+ assertHex(value.nonce, 32, 'nonce');
202
+ assertUtcMilliseconds(value.issued_at, 'issued_at');
203
+ assertUtcMilliseconds(value.expires_at, 'expires_at');
204
+ if (value.issued_at >= value.expires_at)
205
+ throw new Error('authorization time window');
206
+ assertHex(value.action_ref, 64, 'action_ref');
207
+ }
208
+ function omit(value, keys) {
209
+ const result = {};
210
+ for (const [key, entry] of Object.entries(value))
211
+ if (!keys.includes(key))
212
+ result[key] = entry;
213
+ return result;
214
+ }
215
+ //# sourceMappingURL=authorization-v1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization-v1.js","sourceRoot":"","sources":["../../../../src/profiles/mcp/authorization-v1.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './authorization-v1.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/profiles/mcp/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './authorization-v1.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/profiles/mcp/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './v2.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/v2/action-reference/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './v2.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/v2/action-reference/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA"}
@@ -0,0 +1,23 @@
1
+ export interface ActionReferenceInputV2 {
2
+ profile: 'aps-action-ref-v2';
3
+ agent_id: string;
4
+ action_type: string;
5
+ target: string;
6
+ payload_ref: string;
7
+ scope_required: string[];
8
+ issued_at: string;
9
+ nonce: string;
10
+ }
11
+ export declare function createActionReferenceInputV2(input: {
12
+ agent_id: string;
13
+ action_type: string;
14
+ target: string;
15
+ payload_ref: string;
16
+ scope_required: readonly string[];
17
+ issued_at: string;
18
+ nonce: string;
19
+ }): ActionReferenceInputV2;
20
+ export declare function computeActionRefV2(input: ActionReferenceInputV2): string;
21
+ export declare function computePayloadRefV1(payload: unknown): string;
22
+ export declare function validateActionReferenceInputV2(candidate: unknown): asserts candidate is ActionReferenceInputV2;
23
+ //# sourceMappingURL=v2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v2.d.ts","sourceRoot":"","sources":["../../../../src/v2/action-reference/v2.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,mBAAmB,CAAA;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE;IAClD,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;CACd,GAAG,sBAAsB,CAgBzB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAGxE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAK5D;AAED,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,IAAI,sBAAsB,CAmB9G"}
@@ -0,0 +1,57 @@
1
+ // Copyright (c) 2026 Tymofii Pidlisnyi
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { createHash } from 'node:crypto';
4
+ import { canonicalizeJCS } from '../../core/canonical-jcs.js';
5
+ import { assertExactKeys, assertHex, assertIJson, assertPlainRecord, assertSortedUnique, assertUtcMilliseconds, sortedUnique, } from '../identity-binding/validation.js';
6
+ const DOMAIN = 'APS-ACTION-REF-V2\0';
7
+ export function createActionReferenceInputV2(input) {
8
+ const value = {
9
+ profile: 'aps-action-ref-v2',
10
+ agent_id: input.agent_id,
11
+ action_type: input.action_type,
12
+ target: input.target,
13
+ payload_ref: input.payload_ref,
14
+ scope_required: sortedUnique(input.scope_required.map((scope) => scope.normalize('NFC')), 'scope_required'),
15
+ issued_at: input.issued_at,
16
+ nonce: input.nonce,
17
+ };
18
+ validateActionReferenceInputV2(value);
19
+ return value;
20
+ }
21
+ export function computeActionRefV2(input) {
22
+ validateActionReferenceInputV2(input);
23
+ return createHash('sha256').update(DOMAIN + canonicalizeJCS(input), 'utf8').digest('hex');
24
+ }
25
+ export function computePayloadRefV1(payload) {
26
+ assertIJson(payload);
27
+ return createHash('sha256')
28
+ .update('APS-ACTION-PAYLOAD-V1\0' + canonicalizeJCS(payload), 'utf8')
29
+ .digest('hex');
30
+ }
31
+ export function validateActionReferenceInputV2(candidate) {
32
+ assertPlainRecord(candidate, 'action reference');
33
+ assertExactKeys(candidate, [
34
+ 'profile', 'agent_id', 'action_type', 'target', 'payload_ref',
35
+ 'scope_required', 'issued_at', 'nonce',
36
+ ], [], 'action reference');
37
+ assertIJson(candidate);
38
+ if (candidate.profile !== 'aps-action-ref-v2')
39
+ throw new Error('action reference profile');
40
+ if (typeof candidate.agent_id !== 'string' || candidate.agent_id.length === 0)
41
+ throw new Error('agent_id');
42
+ if (typeof candidate.action_type !== 'string' || candidate.action_type.length === 0)
43
+ throw new Error('action_type');
44
+ if (typeof candidate.target !== 'string' || candidate.target.length === 0)
45
+ throw new Error('target');
46
+ assertHex(String(candidate.payload_ref), 64, 'payload_ref');
47
+ if (!Array.isArray(candidate.scope_required))
48
+ throw new Error('scope_required');
49
+ assertSortedUnique(candidate.scope_required, 'scope_required');
50
+ for (const scope of candidate.scope_required) {
51
+ if (scope !== scope.normalize('NFC'))
52
+ throw new Error('scope_required: non-NFC value');
53
+ }
54
+ assertUtcMilliseconds(String(candidate.issued_at), 'issued_at');
55
+ assertHex(String(candidate.nonce), 32, 'nonce');
56
+ }
57
+ //# sourceMappingURL=v2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v2.js","sourceRoot":"","sources":["../../../../src/v2/action-reference/v2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { AuthorityDelegationV1, BudgetOperationResult } from './types.js';
2
+ /**
3
+ * Reference linearizable ledger for one JavaScript process. Each mutation is a
4
+ * single synchronous critical section. Distributed deployments must replace it
5
+ * with a store providing the same all-ancestors atomicity and idempotency.
6
+ */
7
+ export declare class InMemoryAuthorityBudgetLedger {
8
+ private readonly counters;
9
+ private readonly reservations;
10
+ reserve(verifiedChain: readonly AuthorityDelegationV1[], actionRef: string, unit: string, amountString: string): BudgetOperationResult;
11
+ markDispatched(actionRef: string): BudgetOperationResult;
12
+ commit(actionRef: string): BudgetOperationResult;
13
+ /** Cancellation is allowed only before dispatch. */
14
+ cancel(actionRef: string): BudgetOperationResult;
15
+ counter(delegationId: string): {
16
+ reserved: string;
17
+ committed: string;
18
+ };
19
+ }
20
+ //# sourceMappingURL=budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../../../../src/v2/authority-delegation/budget.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,qBAAqB,EACrB,qBAAqB,EAEtB,MAAM,YAAY,CAAA;AAiBnB;;;;GAIG;AACH,qBAAa,6BAA6B;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiC;IAE9D,OAAO,CACL,aAAa,EAAE,SAAS,qBAAqB,EAAE,EAC/C,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,GACnB,qBAAqB,CA+DvB;IAED,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,qBAAqB,CAOvD;IAED,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,qBAAqB,CAoB/C;IAED,oDAAoD;IACpD,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,qBAAqB,CAgB/C;IAED,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAGrE;CACF"}
@@ -0,0 +1,141 @@
1
+ // Copyright (c) 2026 Tymofii Pidlisnyi
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { isCanonicalQuantity, validateAuthorityDelegationShape } from './schema.js';
4
+ import { authorityDelegationBody, computeAuthorityDelegationId } from './canonical.js';
5
+ const ACTION_REF = /^[0-9a-f]{64}$/;
6
+ /**
7
+ * Reference linearizable ledger for one JavaScript process. Each mutation is a
8
+ * single synchronous critical section. Distributed deployments must replace it
9
+ * with a store providing the same all-ancestors atomicity and idempotency.
10
+ */
11
+ export class InMemoryAuthorityBudgetLedger {
12
+ counters = new Map();
13
+ reservations = new Map();
14
+ reserve(verifiedChain, actionRef, unit, amountString) {
15
+ if (!ACTION_REF.test(actionRef) || !isCanonicalQuantity(amountString)) {
16
+ return { ok: false, code: 'CONFLICT' };
17
+ }
18
+ if (verifiedChain.length === 0 || verifiedChain.length > 256) {
19
+ return { ok: false, code: 'CONFLICT' };
20
+ }
21
+ const seen = new Set();
22
+ for (let i = 0; i < verifiedChain.length; i++) {
23
+ const current = verifiedChain[i];
24
+ if (validateAuthorityDelegationShape(current).length > 0 ||
25
+ computeAuthorityDelegationId(authorityDelegationBody(current)) !== current.delegation_id ||
26
+ seen.has(current.delegation_id)) {
27
+ return { ok: false, code: 'CONFLICT' };
28
+ }
29
+ seen.add(current.delegation_id);
30
+ if (i === 0) {
31
+ if (current.parent_delegation_id !== null)
32
+ return { ok: false, code: 'CONFLICT' };
33
+ }
34
+ else {
35
+ const parent = verifiedChain[i - 1];
36
+ if (current.parent_delegation_id !== parent.delegation_id || current.issuer !== parent.subject) {
37
+ return { ok: false, code: 'CONFLICT' };
38
+ }
39
+ }
40
+ }
41
+ const amount = BigInt(amountString);
42
+ const bounded = verifiedChain.filter(item => item.authority.spend.mode === 'bounded');
43
+ const ids = bounded.map(item => item.delegation_id);
44
+ const prior = this.reservations.get(actionRef);
45
+ if (prior) {
46
+ const identical = prior.unit === unit && prior.amount === amount &&
47
+ prior.delegationIds.length === ids.length &&
48
+ prior.delegationIds.every((id, index) => id === ids[index]);
49
+ return identical
50
+ ? { ok: true, code: 'IDEMPOTENT', state: prior.state }
51
+ : { ok: false, code: 'CONFLICT', state: prior.state };
52
+ }
53
+ for (const delegation of bounded) {
54
+ const spend = delegation.authority.spend;
55
+ if (spend.mode !== 'bounded')
56
+ continue;
57
+ if (spend.unit !== unit)
58
+ return { ok: false, code: 'UNIT_MISMATCH' };
59
+ if (amount > BigInt(spend.per_action))
60
+ return { ok: false, code: 'PER_ACTION_EXCEEDED' };
61
+ const counter = this.counters.get(delegation.delegation_id) ?? { reserved: 0n, committed: 0n };
62
+ if (counter.reserved + counter.committed + amount > BigInt(spend.cumulative)) {
63
+ return { ok: false, code: 'CUMULATIVE_EXCEEDED' };
64
+ }
65
+ }
66
+ // All checks completed before any counter is changed.
67
+ for (const delegation of bounded) {
68
+ const counter = this.counters.get(delegation.delegation_id) ?? { reserved: 0n, committed: 0n };
69
+ counter.reserved += amount;
70
+ this.counters.set(delegation.delegation_id, counter);
71
+ }
72
+ this.reservations.set(actionRef, {
73
+ actionRef,
74
+ unit,
75
+ amount,
76
+ delegationIds: ids,
77
+ state: 'reserved',
78
+ });
79
+ return { ok: true, code: 'RESERVED', state: 'reserved' };
80
+ }
81
+ markDispatched(actionRef) {
82
+ const reservation = this.reservations.get(actionRef);
83
+ if (!reservation)
84
+ return { ok: false, code: 'NOT_FOUND' };
85
+ if (reservation.state === 'dispatched')
86
+ return { ok: true, code: 'IDEMPOTENT', state: 'dispatched' };
87
+ if (reservation.state !== 'reserved')
88
+ return { ok: false, code: 'INVALID_STATE', state: reservation.state };
89
+ reservation.state = 'dispatched';
90
+ return { ok: true, code: 'DISPATCHED', state: 'dispatched' };
91
+ }
92
+ commit(actionRef) {
93
+ const reservation = this.reservations.get(actionRef);
94
+ if (!reservation)
95
+ return { ok: false, code: 'NOT_FOUND' };
96
+ if (reservation.state === 'committed')
97
+ return { ok: true, code: 'IDEMPOTENT', state: 'committed' };
98
+ if (reservation.state !== 'reserved' && reservation.state !== 'dispatched') {
99
+ return { ok: false, code: 'INVALID_STATE', state: reservation.state };
100
+ }
101
+ for (const id of reservation.delegationIds) {
102
+ const counter = this.counters.get(id);
103
+ if (!counter || counter.reserved < reservation.amount) {
104
+ return { ok: false, code: 'INVALID_STATE', state: reservation.state };
105
+ }
106
+ }
107
+ for (const id of reservation.delegationIds) {
108
+ const counter = this.counters.get(id);
109
+ counter.reserved -= reservation.amount;
110
+ counter.committed += reservation.amount;
111
+ }
112
+ reservation.state = 'committed';
113
+ return { ok: true, code: 'COMMITTED', state: 'committed' };
114
+ }
115
+ /** Cancellation is allowed only before dispatch. */
116
+ cancel(actionRef) {
117
+ const reservation = this.reservations.get(actionRef);
118
+ if (!reservation)
119
+ return { ok: false, code: 'NOT_FOUND' };
120
+ if (reservation.state === 'cancelled')
121
+ return { ok: true, code: 'IDEMPOTENT', state: 'cancelled' };
122
+ if (reservation.state !== 'reserved')
123
+ return { ok: false, code: 'INVALID_STATE', state: reservation.state };
124
+ for (const id of reservation.delegationIds) {
125
+ const counter = this.counters.get(id);
126
+ if (!counter || counter.reserved < reservation.amount) {
127
+ return { ok: false, code: 'INVALID_STATE', state: reservation.state };
128
+ }
129
+ }
130
+ for (const id of reservation.delegationIds) {
131
+ this.counters.get(id).reserved -= reservation.amount;
132
+ }
133
+ reservation.state = 'cancelled';
134
+ return { ok: true, code: 'CANCELLED', state: 'cancelled' };
135
+ }
136
+ counter(delegationId) {
137
+ const counter = this.counters.get(delegationId) ?? { reserved: 0n, committed: 0n };
138
+ return { reserved: counter.reserved.toString(), committed: counter.committed.toString() };
139
+ }
140
+ }
141
+ //# sourceMappingURL=budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.js","sourceRoot":"","sources":["../../../../src/v2/authority-delegation/budget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { AuthorityDelegationBodyV1, AuthorityDelegationV1 } from './types.js';
2
+ export declare const AUTHORITY_DELEGATION_ID_DOMAIN = "APS-AUTHORITY-DELEGATION-ID-V1\0";
3
+ export declare const AUTHORITY_DELEGATION_SIGNATURE_DOMAIN = "APS-AUTHORITY-DELEGATION-SIGNATURE-V1\0";
4
+ /** Exact RFC 8785 input used to derive delegation_id. */
5
+ export declare function authorityDelegationIdInput(body: AuthorityDelegationBodyV1): string;
6
+ export declare function computeAuthorityDelegationId(body: AuthorityDelegationBodyV1): string;
7
+ /** Exact Ed25519 input: domain plus JCS(record without signature). */
8
+ export declare function authorityDelegationSignatureInput(delegation: Omit<AuthorityDelegationV1, 'signature'>): string;
9
+ export declare function signAuthorityDelegation(delegation: Omit<AuthorityDelegationV1, 'signature'>, privateKey: string): string;
10
+ export declare function verifyAuthorityDelegationSignature(delegation: AuthorityDelegationV1, publicKey: string): boolean;
11
+ export declare function authorityDelegationBody(delegation: AuthorityDelegationV1): AuthorityDelegationBodyV1;
12
+ //# sourceMappingURL=canonical.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../../../../src/v2/authority-delegation/canonical.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAElF,eAAO,MAAM,8BAA8B,qCAAqC,CAAA;AAChF,eAAO,MAAM,qCAAqC,4CAA4C,CAAA;AAM9F,yDAAyD;AACzD,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,yBAAyB,GAAG,MAAM,CAElF;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,yBAAyB,GAAG,MAAM,CAEpF;AAED,sEAAsE;AACtE,wBAAgB,iCAAiC,CAC/C,UAAU,EAAE,IAAI,CAAC,qBAAqB,EAAE,WAAW,CAAC,GACnD,MAAM,CAER;AAED,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,IAAI,CAAC,qBAAqB,EAAE,WAAW,CAAC,EACpD,UAAU,EAAE,MAAM,GACjB,MAAM,CAER;AAED,wBAAgB,kCAAkC,CAChD,UAAU,EAAE,qBAAqB,EACjC,SAAS,EAAE,MAAM,GAChB,OAAO,CAGT;AAED,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,qBAAqB,GAChC,yBAAyB,CAG3B"}
@@ -0,0 +1,33 @@
1
+ // Copyright (c) 2026 Tymofii Pidlisnyi
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { createHash } from 'node:crypto';
4
+ import { canonicalizeJCS } from '../../core/canonical-jcs.js';
5
+ import { sign, verify } from '../../crypto/keys.js';
6
+ export const AUTHORITY_DELEGATION_ID_DOMAIN = 'APS-AUTHORITY-DELEGATION-ID-V1\0';
7
+ export const AUTHORITY_DELEGATION_SIGNATURE_DOMAIN = 'APS-AUTHORITY-DELEGATION-SIGNATURE-V1\0';
8
+ function sha256Hex(value) {
9
+ return createHash('sha256').update(value, 'utf8').digest('hex');
10
+ }
11
+ /** Exact RFC 8785 input used to derive delegation_id. */
12
+ export function authorityDelegationIdInput(body) {
13
+ return AUTHORITY_DELEGATION_ID_DOMAIN + canonicalizeJCS(body);
14
+ }
15
+ export function computeAuthorityDelegationId(body) {
16
+ return `sha256:${sha256Hex(authorityDelegationIdInput(body))}`;
17
+ }
18
+ /** Exact Ed25519 input: domain plus JCS(record without signature). */
19
+ export function authorityDelegationSignatureInput(delegation) {
20
+ return AUTHORITY_DELEGATION_SIGNATURE_DOMAIN + canonicalizeJCS(delegation);
21
+ }
22
+ export function signAuthorityDelegation(delegation, privateKey) {
23
+ return sign(authorityDelegationSignatureInput(delegation), privateKey);
24
+ }
25
+ export function verifyAuthorityDelegationSignature(delegation, publicKey) {
26
+ const { signature, ...unsigned } = delegation;
27
+ return verify(authorityDelegationSignatureInput(unsigned), signature, publicKey);
28
+ }
29
+ export function authorityDelegationBody(delegation) {
30
+ const { delegation_id: _delegationId, signature: _signature, ...body } = delegation;
31
+ return body;
32
+ }
33
+ //# sourceMappingURL=canonical.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../../../src/v2/authority-delegation/canonical.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,sCAAsC;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAGnD,MAAM,CAAC,MAAM,8BAA8B,GAAG,kCAAkC,CAAA;AAChF,MAAM,CAAC,MAAM,qCAAqC,GAAG,yCAAyC,CAAA;AAE9F,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACjE,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,0BAA0B,CAAC,IAA+B;IACxE,OAAO,8BAA8B,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;AAC/D,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,IAA+B;IAC1E,OAAO,UAAU,SAAS,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC,EAAE,CAAA;AAChE,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,iCAAiC,CAC/C,UAAoD;IAEpD,OAAO,qCAAqC,GAAG,eAAe,CAAC,UAAU,CAAC,CAAA;AAC5E,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,UAAoD,EACpD,UAAkB;IAElB,OAAO,IAAI,CAAC,iCAAiC,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAA;AACxE,CAAC;AAED,MAAM,UAAU,kCAAkC,CAChD,UAAiC,EACjC,SAAiB;IAEjB,MAAM,EAAE,SAAS,EAAE,GAAG,QAAQ,EAAE,GAAG,UAAU,CAAA;IAC7C,OAAO,MAAM,CAAC,iCAAiC,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,CAAA;AAClF,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,UAAiC;IAEjC,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,GAAG,UAAU,CAAA;IACnF,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { AuthorityFailure, AuthorityVectorV1 } from './types.js';
2
+ /** Compare a child against its immediate parent in the seven-facet partial order. */
3
+ export declare function compareAuthority(parent: AuthorityVectorV1, child: AuthorityVectorV1): AuthorityFailure[];
4
+ //# sourceMappingURL=compare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../../../src/v2/authority-delegation/compare.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAwB,MAAM,YAAY,CAAA;AAiB3F,qFAAqF;AACrF,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,iBAAiB,GACvB,gBAAgB,EAAE,CAsDpB"}