sealbridge 0.0.1 → 0.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 (208) hide show
  1. package/NOTICE +43 -0
  2. package/README.ja.md +397 -0
  3. package/README.md +567 -1
  4. package/dist/cli/dist/acp.d.ts +2 -0
  5. package/dist/cli/dist/acp.js +6 -0
  6. package/dist/cli/dist/acp.js.map +1 -0
  7. package/dist/cli/dist/approval-summary.d.ts +2 -0
  8. package/dist/cli/dist/approval-summary.js +32 -0
  9. package/dist/cli/dist/approval-summary.js.map +1 -0
  10. package/dist/cli/dist/board.d.ts +47 -0
  11. package/dist/cli/dist/board.js +255 -0
  12. package/dist/cli/dist/board.js.map +1 -0
  13. package/dist/cli/dist/contacts.d.ts +18 -0
  14. package/dist/cli/dist/contacts.js +154 -0
  15. package/dist/cli/dist/contacts.js.map +1 -0
  16. package/dist/cli/dist/doctor.d.ts +13 -0
  17. package/dist/cli/dist/doctor.js +30 -0
  18. package/dist/cli/dist/doctor.js.map +1 -0
  19. package/dist/cli/dist/error-messages.d.ts +2 -0
  20. package/dist/cli/dist/error-messages.js +24 -0
  21. package/dist/cli/dist/error-messages.js.map +1 -0
  22. package/dist/cli/dist/index.d.ts +2 -0
  23. package/dist/cli/dist/index.js +194 -0
  24. package/dist/cli/dist/index.js.map +1 -0
  25. package/dist/cli/dist/invite-share.d.ts +16 -0
  26. package/dist/cli/dist/invite-share.js +163 -0
  27. package/dist/cli/dist/invite-share.js.map +1 -0
  28. package/dist/cli/dist/mcp.d.ts +17 -0
  29. package/dist/cli/dist/mcp.js +105 -0
  30. package/dist/cli/dist/mcp.js.map +1 -0
  31. package/dist/cli/dist/network.d.ts +1 -0
  32. package/dist/cli/dist/network.js +396 -0
  33. package/dist/cli/dist/network.js.map +1 -0
  34. package/dist/cli/dist/public-settings.d.ts +27 -0
  35. package/dist/cli/dist/public-settings.js +33 -0
  36. package/dist/cli/dist/public-settings.js.map +1 -0
  37. package/dist/cli/dist/receipt.d.ts +39 -0
  38. package/dist/cli/dist/receipt.js +90 -0
  39. package/dist/cli/dist/receipt.js.map +1 -0
  40. package/dist/cli/dist/receive-hook.d.ts +2 -0
  41. package/dist/cli/dist/receive-hook.js +35 -0
  42. package/dist/cli/dist/receive-hook.js.map +1 -0
  43. package/dist/cli/dist/task-input.d.ts +2 -0
  44. package/dist/cli/dist/task-input.js +19 -0
  45. package/dist/cli/dist/task-input.js.map +1 -0
  46. package/dist/cli/dist/wake-hook.d.ts +3 -0
  47. package/dist/cli/dist/wake-hook.js +32 -0
  48. package/dist/cli/dist/wake-hook.js.map +1 -0
  49. package/dist/examples/two-owner-demo/alice-policy.json +4 -0
  50. package/dist/examples/two-owner-demo/bob-policy.json +4 -0
  51. package/dist/examples/two-owner-demo/dist/run-demo.d.ts +71 -0
  52. package/dist/examples/two-owner-demo/dist/run-demo.js +383 -0
  53. package/dist/examples/two-owner-demo/dist/run-demo.js.map +1 -0
  54. package/dist/package.json +1 -0
  55. package/dist/packages/adapters/dist/command.d.ts +122 -0
  56. package/dist/packages/adapters/dist/command.js +378 -0
  57. package/dist/packages/adapters/dist/command.js.map +1 -0
  58. package/dist/packages/adapters/dist/credential-proxy.d.ts +37 -0
  59. package/dist/packages/adapters/dist/credential-proxy.js +363 -0
  60. package/dist/packages/adapters/dist/credential-proxy.js.map +1 -0
  61. package/dist/packages/adapters/dist/index.d.ts +6 -0
  62. package/dist/packages/adapters/dist/index.js +6 -0
  63. package/dist/packages/adapters/dist/index.js.map +1 -0
  64. package/dist/packages/adapters/dist/mcp.d.ts +32 -0
  65. package/dist/packages/adapters/dist/mcp.js +87 -0
  66. package/dist/packages/adapters/dist/mcp.js.map +1 -0
  67. package/dist/packages/adapters/dist/openai.d.ts +23 -0
  68. package/dist/packages/adapters/dist/openai.js +81 -0
  69. package/dist/packages/adapters/dist/openai.js.map +1 -0
  70. package/dist/packages/adapters/dist/sandbox.d.ts +45 -0
  71. package/dist/packages/adapters/dist/sandbox.js +60 -0
  72. package/dist/packages/adapters/dist/sandbox.js.map +1 -0
  73. package/dist/packages/core/dist/capability.d.ts +36 -0
  74. package/dist/packages/core/dist/capability.js +203 -0
  75. package/dist/packages/core/dist/capability.js.map +1 -0
  76. package/dist/packages/core/dist/contract.d.ts +33 -0
  77. package/dist/packages/core/dist/contract.js +97 -0
  78. package/dist/packages/core/dist/contract.js.map +1 -0
  79. package/dist/packages/core/dist/crypto.d.ts +34 -0
  80. package/dist/packages/core/dist/crypto.js +329 -0
  81. package/dist/packages/core/dist/crypto.js.map +1 -0
  82. package/dist/packages/core/dist/discovery.d.ts +129 -0
  83. package/dist/packages/core/dist/discovery.js +527 -0
  84. package/dist/packages/core/dist/discovery.js.map +1 -0
  85. package/dist/packages/core/dist/edge.d.ts +4 -0
  86. package/dist/packages/core/dist/edge.js +6 -0
  87. package/dist/packages/core/dist/edge.js.map +1 -0
  88. package/dist/packages/core/dist/index.d.ts +9 -0
  89. package/dist/packages/core/dist/index.js +10 -0
  90. package/dist/packages/core/dist/index.js.map +1 -0
  91. package/dist/packages/core/dist/receipts.d.ts +9 -0
  92. package/dist/packages/core/dist/receipts.js +67 -0
  93. package/dist/packages/core/dist/receipts.js.map +1 -0
  94. package/dist/packages/core/dist/relay-auth.d.ts +40 -0
  95. package/dist/packages/core/dist/relay-auth.js +106 -0
  96. package/dist/packages/core/dist/relay-auth.js.map +1 -0
  97. package/dist/packages/core/dist/revocation.d.ts +58 -0
  98. package/dist/packages/core/dist/revocation.js +112 -0
  99. package/dist/packages/core/dist/revocation.js.map +1 -0
  100. package/dist/packages/core/dist/schema.d.ts +11 -0
  101. package/dist/packages/core/dist/schema.js +48 -0
  102. package/dist/packages/core/dist/schema.js.map +1 -0
  103. package/dist/packages/core/dist/types.d.ts +172 -0
  104. package/dist/packages/core/dist/types.js +2 -0
  105. package/dist/packages/core/dist/types.js.map +1 -0
  106. package/dist/packages/ledger/dist/index.d.ts +84 -0
  107. package/dist/packages/ledger/dist/index.js +269 -0
  108. package/dist/packages/ledger/dist/index.js.map +1 -0
  109. package/dist/packages/relay/dist/fetch.d.ts +250 -0
  110. package/dist/packages/relay/dist/fetch.js +1401 -0
  111. package/dist/packages/relay/dist/fetch.js.map +1 -0
  112. package/dist/packages/relay/dist/index.d.ts +103 -0
  113. package/dist/packages/relay/dist/index.js +855 -0
  114. package/dist/packages/relay/dist/index.js.map +1 -0
  115. package/dist/packages/relay/dist/journal.d.ts +77 -0
  116. package/dist/packages/relay/dist/journal.js +339 -0
  117. package/dist/packages/relay/dist/journal.js.map +1 -0
  118. package/dist/packages/relay/dist/notifications.d.ts +63 -0
  119. package/dist/packages/relay/dist/notifications.js +55 -0
  120. package/dist/packages/relay/dist/notifications.js.map +1 -0
  121. package/dist/packages/relay/dist/retry.d.ts +12 -0
  122. package/dist/packages/relay/dist/retry.js +59 -0
  123. package/dist/packages/relay/dist/retry.js.map +1 -0
  124. package/dist/packages/relay/dist/ssrf.d.ts +32 -0
  125. package/dist/packages/relay/dist/ssrf.js +213 -0
  126. package/dist/packages/relay/dist/ssrf.js.map +1 -0
  127. package/dist/packages/relay/dist/worker.d.ts +92 -0
  128. package/dist/packages/relay/dist/worker.js +460 -0
  129. package/dist/packages/relay/dist/worker.js.map +1 -0
  130. package/dist/packages/runtime/dist/a2a.d.ts +8 -0
  131. package/dist/packages/runtime/dist/a2a.js +69 -0
  132. package/dist/packages/runtime/dist/a2a.js.map +1 -0
  133. package/dist/packages/runtime/dist/adapter.d.ts +51 -0
  134. package/dist/packages/runtime/dist/adapter.js +2 -0
  135. package/dist/packages/runtime/dist/adapter.js.map +1 -0
  136. package/dist/packages/runtime/dist/approval-providers.d.ts +99 -0
  137. package/dist/packages/runtime/dist/approval-providers.js +269 -0
  138. package/dist/packages/runtime/dist/approval-providers.js.map +1 -0
  139. package/dist/packages/runtime/dist/daily-limit.d.ts +2 -0
  140. package/dist/packages/runtime/dist/daily-limit.js +54 -0
  141. package/dist/packages/runtime/dist/daily-limit.js.map +1 -0
  142. package/dist/packages/runtime/dist/gateway.d.ts +35 -0
  143. package/dist/packages/runtime/dist/gateway.js +92 -0
  144. package/dist/packages/runtime/dist/gateway.js.map +1 -0
  145. package/dist/packages/runtime/dist/inbox.d.ts +10 -0
  146. package/dist/packages/runtime/dist/inbox.js +24 -0
  147. package/dist/packages/runtime/dist/inbox.js.map +1 -0
  148. package/dist/packages/runtime/dist/index.d.ts +13 -0
  149. package/dist/packages/runtime/dist/index.js +14 -0
  150. package/dist/packages/runtime/dist/index.js.map +1 -0
  151. package/dist/packages/runtime/dist/mcp-server.d.ts +90 -0
  152. package/dist/packages/runtime/dist/mcp-server.js +647 -0
  153. package/dist/packages/runtime/dist/mcp-server.js.map +1 -0
  154. package/dist/packages/runtime/dist/mcp-tool-catalog.d.ts +3 -0
  155. package/dist/packages/runtime/dist/mcp-tool-catalog.js +507 -0
  156. package/dist/packages/runtime/dist/mcp-tool-catalog.js.map +1 -0
  157. package/dist/packages/runtime/dist/mcp.d.ts +73 -0
  158. package/dist/packages/runtime/dist/mcp.js +67 -0
  159. package/dist/packages/runtime/dist/mcp.js.map +1 -0
  160. package/dist/packages/runtime/dist/policy.d.ts +19 -0
  161. package/dist/packages/runtime/dist/policy.js +41 -0
  162. package/dist/packages/runtime/dist/policy.js.map +1 -0
  163. package/dist/packages/runtime/dist/quota.d.ts +39 -0
  164. package/dist/packages/runtime/dist/quota.js +147 -0
  165. package/dist/packages/runtime/dist/quota.js.map +1 -0
  166. package/dist/packages/runtime/dist/session-audit.d.ts +107 -0
  167. package/dist/packages/runtime/dist/session-audit.js +520 -0
  168. package/dist/packages/runtime/dist/session-audit.js.map +1 -0
  169. package/dist/packages/runtime/dist/session-timeouts.d.ts +33 -0
  170. package/dist/packages/runtime/dist/session-timeouts.js +62 -0
  171. package/dist/packages/runtime/dist/session-timeouts.js.map +1 -0
  172. package/dist/packages/runtime/dist/session.d.ts +323 -0
  173. package/dist/packages/runtime/dist/session.js +2252 -0
  174. package/dist/packages/runtime/dist/session.js.map +1 -0
  175. package/dist/packages/runtime/dist/task-journal.d.ts +36 -0
  176. package/dist/packages/runtime/dist/task-journal.js +104 -0
  177. package/dist/packages/runtime/dist/task-journal.js.map +1 -0
  178. package/dist/packages/runtime/dist/verifier.d.ts +64 -0
  179. package/dist/packages/runtime/dist/verifier.js +109 -0
  180. package/dist/packages/runtime/dist/verifier.js.map +1 -0
  181. package/dist/packages/sandbox/dist/container.d.ts +33 -0
  182. package/dist/packages/sandbox/dist/container.js +189 -0
  183. package/dist/packages/sandbox/dist/container.js.map +1 -0
  184. package/dist/packages/sandbox/dist/index.d.ts +34 -0
  185. package/dist/packages/sandbox/dist/index.js +179 -0
  186. package/dist/packages/sandbox/dist/index.js.map +1 -0
  187. package/dist/packages/sandbox/dist/permission.d.ts +58 -0
  188. package/dist/packages/sandbox/dist/permission.js +90 -0
  189. package/dist/packages/sandbox/dist/permission.js.map +1 -0
  190. package/dist/spec/README.ja.md +76 -0
  191. package/dist/spec/README.md +135 -0
  192. package/dist/spec/ack-receipt.schema.json +77 -0
  193. package/dist/spec/agent-card.schema.json +83 -0
  194. package/dist/spec/approval-receipt.schema.json +94 -0
  195. package/dist/spec/audit-entry.schema.json +101 -0
  196. package/dist/spec/capability-token.schema.json +133 -0
  197. package/dist/spec/envelope.schema.json +197 -0
  198. package/dist/spec/examples/sample-ack-receipt.json +16 -0
  199. package/dist/spec/examples/sample-agent-card.json +35 -0
  200. package/dist/spec/examples/sample-approval-receipt.json +18 -0
  201. package/dist/spec/examples/sample-audit-entry.json +37 -0
  202. package/dist/spec/examples/sample-capability-token.json +39 -0
  203. package/dist/spec/examples/sample-envelope.json +21 -0
  204. package/dist/spec/examples/sample-task-manifest.json +141 -0
  205. package/dist/spec/examples/sample-usage-receipt.json +19 -0
  206. package/dist/spec/task-manifest.schema.json +422 -0
  207. package/dist/spec/usage-receipt.schema.json +91 -0
  208. package/package.json +61 -5
@@ -0,0 +1,329 @@
1
+ // SPDX-License-Identifier: Apache-2.0 AND MIT
2
+ // Adapted from newtro/delegateos src/core/crypto.ts (MIT), Scott Smith.
3
+ // ACP uses Node Ed25519, SHA-256 and did:key; it is not DelegateOS SJT wire format.
4
+ import { createCipheriv, createDecipheriv, createHash, createPrivateKey, createPublicKey, diffieHellman, generateKeyPairSync, hkdfSync, randomBytes, sign, verify, } from 'node:crypto';
5
+ import canonicalizeJson from 'canonicalize';
6
+ const alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
7
+ function base58(bytes) {
8
+ let n = BigInt('0x' + Buffer.from(bytes).toString('hex'));
9
+ let s = '';
10
+ while (n) {
11
+ s = alphabet[Number(n % 58n)] + s;
12
+ n /= 58n;
13
+ }
14
+ for (const b of bytes) {
15
+ if (b !== 0)
16
+ break;
17
+ s = '1' + s;
18
+ }
19
+ return s;
20
+ }
21
+ function unbase58(s) {
22
+ if (!s || s.length > 128)
23
+ throw new Error('INVALID_DID');
24
+ let n = 0n;
25
+ for (const c of s) {
26
+ const i = alphabet.indexOf(c);
27
+ if (i < 0)
28
+ throw new Error('INVALID_DID');
29
+ n = n * 58n + BigInt(i);
30
+ }
31
+ let hex = n.toString(16);
32
+ if (hex.length % 2)
33
+ hex = '0' + hex;
34
+ return Buffer.concat([
35
+ Buffer.alloc(s.match(/^1*/)?.[0].length ?? 0),
36
+ n ? Buffer.from(hex, 'hex') : Buffer.alloc(0),
37
+ ]);
38
+ }
39
+ function assertJson(v, seen = new Set()) {
40
+ if (v === null || typeof v === 'boolean')
41
+ return;
42
+ if (typeof v === 'string') {
43
+ if (/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/u.test(v))
44
+ throw new Error('INVALID_UNICODE');
45
+ return;
46
+ }
47
+ if (typeof v === 'number' && Number.isFinite(v))
48
+ return;
49
+ if (typeof v !== 'object' || seen.has(v))
50
+ throw new Error('INVALID_JSON');
51
+ if (!Array.isArray(v) &&
52
+ Object.getPrototypeOf(v) !== Object.prototype &&
53
+ Object.getPrototypeOf(v) !== null)
54
+ throw new Error('INVALID_JSON');
55
+ seen.add(v);
56
+ if (Array.isArray(v)) {
57
+ for (let i = 0; i < v.length; i++)
58
+ assertJson(v[i], seen);
59
+ }
60
+ else
61
+ for (const [k, x] of Object.entries(v)) {
62
+ assertJson(k);
63
+ assertJson(x, seen);
64
+ }
65
+ seen.delete(v);
66
+ }
67
+ export function canonicalize(v) {
68
+ assertJson(v);
69
+ const s = canonicalizeJson(v);
70
+ if (s === undefined)
71
+ throw new Error('INVALID_JSON');
72
+ return s;
73
+ }
74
+ export function digestBytes(v) {
75
+ return 'sha256:' + createHash('sha256').update(v).digest('hex');
76
+ }
77
+ export function digest(v) {
78
+ return digestBytes(canonicalize(v));
79
+ }
80
+ export function generateKeyPair() {
81
+ const kp = generateKeyPairSync('ed25519');
82
+ const raw = kp.publicKey.export({ format: 'der', type: 'spki' }).subarray(-32);
83
+ return {
84
+ did: 'did:key:z' + base58(Buffer.concat([Buffer.from([0xed, 0x01]), raw])),
85
+ privateKey: kp.privateKey.export({ type: 'pkcs8', format: 'pem' }).toString(),
86
+ };
87
+ }
88
+ export function resolveDid(did) {
89
+ if (!did.startsWith('did:key:z'))
90
+ throw new Error('INVALID_DID');
91
+ const raw = unbase58(did.slice(9));
92
+ if (raw.length !== 34 || raw[0] !== 0xed || raw[1] !== 1 || base58(raw) !== did.slice(9))
93
+ throw new Error('INVALID_DID');
94
+ return createPublicKey({
95
+ format: 'der',
96
+ type: 'spki',
97
+ key: Buffer.concat([Buffer.from('302a300506032b6570032100', 'hex'), raw.subarray(2)]),
98
+ });
99
+ }
100
+ export function signPayload(payload, key, signedAt = new Date().toISOString()) {
101
+ const payloadDigest = digest(payload);
102
+ const metadata = {
103
+ signerDid: key.did,
104
+ canonicalization: 'RFC8785-JCS',
105
+ payloadDigest,
106
+ signedAt,
107
+ };
108
+ // Metadata is covered as well as the payload, preventing signer/time substitution.
109
+ const signature = 'ed25519:' +
110
+ sign(null, Buffer.from(canonicalize({ payload, ...metadata })), createPrivateKey(key.privateKey)).toString('base64url');
111
+ const result = { payload: structuredClone(payload), signature: { ...metadata, signature } };
112
+ if (!verifySigned(result, key.did))
113
+ throw new Error('KEY_DID_MISMATCH');
114
+ return result;
115
+ }
116
+ export function verifySigned(value, expectedDid) {
117
+ try {
118
+ const { signature, ...metadata } = value.signature;
119
+ if (!/^ed25519:[A-Za-z0-9_-]{86}$/.test(signature))
120
+ return false;
121
+ const encoded = signature.slice(8);
122
+ const decoded = Buffer.from(encoded, 'base64url');
123
+ const canonical = decoded.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
124
+ if (decoded.length !== 64 || canonical !== encoded)
125
+ return false;
126
+ return ((!expectedDid || metadata.signerDid === expectedDid) &&
127
+ metadata.canonicalization === 'RFC8785-JCS' &&
128
+ Number.isFinite(Date.parse(metadata.signedAt)) &&
129
+ metadata.payloadDigest === digest(value.payload) &&
130
+ verify(null, Buffer.from(canonicalize({ payload: value.payload, ...metadata })), resolveDid(metadata.signerDid), decoded));
131
+ }
132
+ catch {
133
+ return false;
134
+ }
135
+ }
136
+ export function verifySignature(payload, signature, expectedDid) {
137
+ return verifySigned({ payload, signature }, expectedDid);
138
+ }
139
+ const X25519_P = (1n << 255n) - 19n;
140
+ const X25519_SPKI_PREFIX = Buffer.from('302a300506032b656e032100', 'hex');
141
+ const X25519_PKCS8_PREFIX = Buffer.from('302e020100300506032b656e04220420', 'hex');
142
+ function mod(n, p) {
143
+ const r = n % p;
144
+ return r >= 0n ? r : r + p;
145
+ }
146
+ function modInverse(a, p) {
147
+ let result = 1n;
148
+ let base = mod(a, p);
149
+ let exp = p - 2n;
150
+ while (exp > 0n) {
151
+ if (exp & 1n)
152
+ result = (result * base) % p;
153
+ base = (base * base) % p;
154
+ exp >>= 1n;
155
+ }
156
+ return result;
157
+ }
158
+ function readLe(bytes) {
159
+ let n = 0n;
160
+ for (let i = bytes.length - 1; i >= 0; i--)
161
+ n = (n << 8n) + BigInt(bytes[i]);
162
+ return n;
163
+ }
164
+ function writeLe(value, length = 32) {
165
+ const out = Buffer.alloc(length);
166
+ let n = value;
167
+ for (let i = 0; i < length; i++) {
168
+ out[i] = Number(n & 0xffn);
169
+ n >>= 8n;
170
+ }
171
+ return out;
172
+ }
173
+ /**
174
+ * Montgomery u from an Ed25519 public key. RFC 8032 encodes y little-endian
175
+ * with the x sign in bit 255; RFC 7748 uses u = (1 + y) / (1 - y).
176
+ */
177
+ function x25519PublicFromDid(did) {
178
+ const y = readLe(resolveDid(did).export({ format: 'der', type: 'spki' }).subarray(-32)) &
179
+ ((1n << 255n) - 1n);
180
+ const yMod = y % X25519_P;
181
+ const denom = mod(1n - yMod, X25519_P);
182
+ if (denom === 0n)
183
+ throw new Error('INVALID_DID');
184
+ const u = mod((1n + yMod) * modInverse(denom, X25519_P), X25519_P);
185
+ return createPublicKey({
186
+ key: Buffer.concat([X25519_SPKI_PREFIX, writeLe(u)]),
187
+ format: 'der',
188
+ type: 'spki',
189
+ });
190
+ }
191
+ /** Ed25519 seed to the clamped X25519 scalar from the SHA-512 prefix. */
192
+ function x25519PrivateFromKey(key) {
193
+ const seed = createPrivateKey(key.privateKey)
194
+ .export({ format: 'der', type: 'pkcs8' })
195
+ .subarray(-32);
196
+ const scalar = Buffer.from(createHash('sha512').update(seed).digest().subarray(0, 32));
197
+ scalar[0] &= 248;
198
+ scalar[31] &= 127;
199
+ scalar[31] |= 64;
200
+ return createPrivateKey({
201
+ key: Buffer.concat([X25519_PKCS8_PREFIX, scalar]),
202
+ format: 'der',
203
+ type: 'pkcs8',
204
+ });
205
+ }
206
+ function envelopeAad(context) {
207
+ return Buffer.from(canonicalize({
208
+ taskId: context.taskId,
209
+ seq: context.seq,
210
+ eventType: context.eventType,
211
+ senderDid: context.senderDid,
212
+ recipientDid: context.recipientDid,
213
+ }));
214
+ }
215
+ function rawX25519PublicKey(key) {
216
+ const raw = key.export({ format: 'der', type: 'spki' }).subarray(-32);
217
+ if (raw.length !== 32)
218
+ throw new Error('INVALID_PUBLIC_KEY');
219
+ return Buffer.from(raw);
220
+ }
221
+ /**
222
+ * HKDF-SHA256 info for envelope payload encryption.
223
+ * Binds the canonical header to the ephemeral X25519 public key and the
224
+ * recipient static X25519 public key so the AES key is tied to this
225
+ * Diffie-Hellman transcript as well as the header. Both keys are the raw
226
+ * 32-byte values, encoded base64url. AES-GCM additional data stays the
227
+ * header alone, and the 12-byte nonce stays the HKDF salt.
228
+ */
229
+ export function envelopeHkdfInfo(context, ephemeralPublicKey, recipientPublicKey) {
230
+ if (ephemeralPublicKey.length !== 32 || recipientPublicKey.length !== 32)
231
+ throw new Error('INVALID_PUBLIC_KEY');
232
+ return Buffer.from(canonicalize({
233
+ taskId: context.taskId,
234
+ seq: context.seq,
235
+ eventType: context.eventType,
236
+ senderDid: context.senderDid,
237
+ recipientDid: context.recipientDid,
238
+ ephemeralPublicKey: Buffer.from(ephemeralPublicKey).toString('base64url'),
239
+ recipientPublicKey: Buffer.from(recipientPublicKey).toString('base64url'),
240
+ }), 'utf8');
241
+ }
242
+ function importEphemeralPublic(encoded) {
243
+ const raw = Buffer.from(encoded, 'base64url');
244
+ const der = raw.length === 32 ? Buffer.concat([X25519_SPKI_PREFIX, raw]) : raw;
245
+ return createPublicKey({ key: der, format: 'der', type: 'spki' });
246
+ }
247
+ export function isEncryptedEnvelopePayload(payload) {
248
+ if (!payload || typeof payload !== 'object' || Array.isArray(payload))
249
+ return false;
250
+ const value = payload;
251
+ return (value.__acpEncrypted === 'X25519-HKDF-AES256GCM' &&
252
+ typeof value.ephemeralPublicKey === 'string' &&
253
+ typeof value.iv === 'string' &&
254
+ typeof value.ciphertext === 'string' &&
255
+ typeof value.tag === 'string');
256
+ }
257
+ export function encryptEnvelopePayload(payload, context) {
258
+ const ephemeral = generateKeyPairSync('x25519');
259
+ const recipientPublic = x25519PublicFromDid(context.recipientDid);
260
+ const shared = diffieHellman({
261
+ privateKey: ephemeral.privateKey,
262
+ publicKey: recipientPublic,
263
+ });
264
+ const iv = randomBytes(12);
265
+ const aad = envelopeAad(context);
266
+ const info = envelopeHkdfInfo(context, rawX25519PublicKey(ephemeral.publicKey), rawX25519PublicKey(recipientPublic));
267
+ // The nonce remains the HKDF salt. Info binds the header and both X25519 public keys.
268
+ const key = Buffer.from(hkdfSync('sha256', shared, iv, info, 32));
269
+ const cipher = createCipheriv('aes-256-gcm', key, iv);
270
+ cipher.setAAD(aad);
271
+ const ciphertext = Buffer.concat([
272
+ cipher.update(Buffer.from(JSON.stringify(payload), 'utf8')),
273
+ cipher.final(),
274
+ ]);
275
+ return {
276
+ __acpEncrypted: 'X25519-HKDF-AES256GCM',
277
+ ephemeralPublicKey: ephemeral.publicKey
278
+ .export({ format: 'der', type: 'spki' })
279
+ .toString('base64url'),
280
+ iv: iv.toString('base64url'),
281
+ ciphertext: ciphertext.toString('base64url'),
282
+ tag: cipher.getAuthTag().toString('base64url'),
283
+ };
284
+ }
285
+ export function decryptEnvelopePayload(payload, recipient, context, options = {}) {
286
+ // Session peers must opt in to cleartext. A missing flag rejects it.
287
+ const requireEncrypted = options.requireEncrypted ?? true;
288
+ if (!isEncryptedEnvelopePayload(payload)) {
289
+ if (requireEncrypted)
290
+ throw new Error('UNENCRYPTED_ENVELOPE_REJECTED');
291
+ return payload;
292
+ }
293
+ try {
294
+ const iv = Buffer.from(payload.iv, 'base64url');
295
+ const aad = envelopeAad(context);
296
+ const ephemeralPublic = importEphemeralPublic(payload.ephemeralPublicKey);
297
+ const recipientPublic = x25519PublicFromDid(context.recipientDid);
298
+ const shared = diffieHellman({
299
+ privateKey: x25519PrivateFromKey(recipient),
300
+ publicKey: ephemeralPublic,
301
+ });
302
+ const info = envelopeHkdfInfo(context, rawX25519PublicKey(ephemeralPublic), rawX25519PublicKey(recipientPublic));
303
+ // The nonce remains the HKDF salt. Info binds the header and both X25519 public keys.
304
+ const key = Buffer.from(hkdfSync('sha256', shared, iv, info, 32));
305
+ const decipher = createDecipheriv('aes-256-gcm', key, iv);
306
+ decipher.setAAD(aad);
307
+ decipher.setAuthTag(Buffer.from(payload.tag, 'base64url'));
308
+ const plain = Buffer.concat([
309
+ decipher.update(Buffer.from(payload.ciphertext, 'base64url')),
310
+ decipher.final(),
311
+ ]);
312
+ return JSON.parse(plain.toString('utf8'));
313
+ }
314
+ catch (error) {
315
+ if (error instanceof Error && error.message === 'ENVELOPE_DECRYPTION_FAILED')
316
+ throw error;
317
+ throw new Error('ENVELOPE_DECRYPTION_FAILED');
318
+ }
319
+ }
320
+ export function openEnvelope(envelope, recipient, options = {}) {
321
+ return decryptEnvelopePayload(envelope.payload.payload, recipient, {
322
+ taskId: envelope.payload.taskId,
323
+ seq: envelope.payload.seq,
324
+ eventType: envelope.payload.eventType,
325
+ senderDid: envelope.payload.senderDid,
326
+ recipientDid: envelope.payload.recipientDid,
327
+ }, { requireEncrypted: options.requireEncrypted ?? true });
328
+ }
329
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,129 @@
1
+ import type { BudgetSpec, Json, KeyPair, Signature, Signed } from './types.js';
2
+ export interface AgentSkill {
3
+ id: string;
4
+ name: string;
5
+ description?: string;
6
+ taskTypes?: string[];
7
+ inputSchema?: Json;
8
+ outputSchema?: Json;
9
+ }
10
+ /** Lifetime applied when createSignedAgentCard is not given an explicit expiresAt. */
11
+ export declare const DEFAULT_AGENT_CARD_EXPIRY_MS: number;
12
+ /** Longest allowed expiresAt - signedAt window. Matches the invite TTL cap of 30 days. */
13
+ export declare const MAX_AGENT_CARD_EXPIRY_MS: number;
14
+ /** Allowed future clock skew for newly minted invites, capability tokens, and task manifests. */
15
+ export declare const DEFAULT_CLOCK_SKEW_MS = 60000;
16
+ /**
17
+ * Statement signed by agentDid's key when the card owner is a different DID.
18
+ * Binds ownerDid, agentDid, relayEndpoint, and expiresAt. A signature for one tuple
19
+ * does not authorize a different owner, agent, relay, or expiry.
20
+ */
21
+ export interface AgentCardDelegation {
22
+ type: 'AgentCardDelegation';
23
+ ownerDid: string;
24
+ agentDid: string;
25
+ relayEndpoint: string;
26
+ expiresAt: string;
27
+ }
28
+ export declare function agentCardDelegationStatement(fields: {
29
+ ownerDid: string;
30
+ agentDid: string;
31
+ relayEndpoint: string;
32
+ expiresAt: string;
33
+ }): AgentCardDelegation;
34
+ export type OpenPolicy = Partial<Pick<BudgetSpec, 'maxInputTokens' | 'maxOutputTokens' | 'maxToolInvocations' | 'maxWallClockSeconds'>>;
35
+ export declare const OPEN_POLICY_FIELDS: readonly ["maxInputTokens", "maxOutputTokens", "maxToolInvocations", "maxWallClockSeconds"];
36
+ export interface DiscoveryAgentCard {
37
+ type: 'AgentCard';
38
+ accessMode?: 'invite-only' | 'open';
39
+ openPolicy?: OpenPolicy;
40
+ name: string;
41
+ description: string;
42
+ ownerDid: string;
43
+ agentDid: string;
44
+ relayEndpoint: string;
45
+ skills: AgentSkill[];
46
+ costModes: BudgetSpec['costBearer'][];
47
+ version: string;
48
+ /** ISO-8601 timestamp after which the card must be rejected. */
49
+ expiresAt: string;
50
+ /**
51
+ * Signature by agentDid over agentCardDelegationStatement.
52
+ * Required when agentDid differs from ownerDid, and absent when they are the same key.
53
+ */
54
+ agentDelegation?: Signature;
55
+ }
56
+ export type CreateAgentCardOptions = Omit<DiscoveryAgentCard, 'type' | 'ownerDid' | 'version' | 'description' | 'costModes' | 'expiresAt' | 'agentDelegation'> & Partial<Pick<DiscoveryAgentCard, 'version' | 'description' | 'costModes' | 'expiresAt'>> & {
57
+ /** Key that controls agentDid. Required when agentDid is not owner.did. */
58
+ agentKey?: KeyPair;
59
+ };
60
+ export type SignedAgentCard = Signed<DiscoveryAgentCard>;
61
+ export interface RelayEndpointPolicy {
62
+ /** Private and loopback relays are blocked unless this is exactly true. */
63
+ allowPrivateRelay?: boolean;
64
+ }
65
+ /** Reject an IP address that must not be used as a relay destination. */
66
+ export declare function validateIpAddress(ip: string, options?: RelayEndpointPolicy): void;
67
+ /** Validate literal endpoints before using an untrusted invite as a network destination. */
68
+ export declare function validateRelayEndpointUrl(value: string, options?: RelayEndpointPolicy): void;
69
+ export declare function createSignedAgentCard(options: CreateAgentCardOptions, owner: KeyPair, agentKey?: KeyPair): SignedAgentCard;
70
+ export declare function verifySignedAgentCard(card: SignedAgentCard, now?: number): boolean;
71
+ /** Select a verified card independently of directory order. Exact agent DIDs win. */
72
+ export declare function findDiscoveredAgentCard(rawCards: unknown, targetDid: string, now?: number): SignedAgentCard | undefined;
73
+ export declare function toA2AAgentCard(card: SignedAgentCard): {
74
+ name: string;
75
+ description: string;
76
+ url: string;
77
+ version: string;
78
+ protocolVersion: string;
79
+ capabilities: {
80
+ streaming: boolean;
81
+ };
82
+ defaultInputModes: string[];
83
+ defaultOutputModes: string[];
84
+ skills: {
85
+ description: string;
86
+ tags: string[];
87
+ id: string;
88
+ name: string;
89
+ taskTypes?: string[];
90
+ inputSchema?: Json;
91
+ outputSchema?: Json;
92
+ }[];
93
+ ownerDid: string;
94
+ agentDid: string;
95
+ relayEndpoint: string;
96
+ expiresAt: string;
97
+ costModes: ("worker_byok" | "bilateral_quota" | "external_settlement_plugin")[];
98
+ signedAgentCard: SignedAgentCard;
99
+ };
100
+ export interface Invite {
101
+ type: 'AgentInvite';
102
+ ownerDid: string;
103
+ agentDid: string;
104
+ relayUrl: string;
105
+ agentCard: SignedAgentCard;
106
+ issuedAt: string;
107
+ expiresAt: string;
108
+ }
109
+ export declare function createInviteToken(options: {
110
+ agentCard: SignedAgentCard;
111
+ expiresInSeconds?: number;
112
+ issuedAt?: string;
113
+ format?: 'acp-invite' | 'acp';
114
+ }, owner: KeyPair): string;
115
+ /** Extract invitation material locally; HTTPS links are never fetched. */
116
+ export declare function inviteTokenFromUri(uri: string): string;
117
+ export declare function isInviteTarget(value: string): boolean;
118
+ export declare function parseAndVerifyInviteToken(uri: string, now?: number, options?: {
119
+ allowPrivateRelay?: boolean;
120
+ /** Verify historical invites for revocation lookup without requiring current validity. */
121
+ allowExpired?: boolean;
122
+ }): Invite;
123
+ /** Resolve current signed cards before filtering, so stale advertisements cannot reopen access. */
124
+ export declare function discoverAgentCards(rawCards: unknown, query?: {
125
+ did?: string;
126
+ skillId?: string;
127
+ taskType?: string;
128
+ accessMode?: 'invite-only' | 'open';
129
+ }, now?: number): SignedAgentCard[];