sealbridge 0.2.2 → 0.3.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 (251) hide show
  1. package/README.ja.md +492 -30
  2. package/README.md +522 -109
  3. package/dist/cli/dist/accept.d.ts +13 -0
  4. package/dist/cli/dist/accept.js +115 -0
  5. package/dist/cli/dist/accept.js.map +1 -0
  6. package/dist/cli/dist/approval-summary.d.ts +1 -1
  7. package/dist/cli/dist/board.d.ts +10 -9
  8. package/dist/cli/dist/board.js +62 -31
  9. package/dist/cli/dist/board.js.map +1 -1
  10. package/dist/cli/dist/command-identity.d.ts +6 -0
  11. package/dist/cli/dist/command-identity.js +13 -0
  12. package/dist/cli/dist/command-identity.js.map +1 -0
  13. package/dist/cli/dist/config.d.ts +3 -0
  14. package/dist/cli/dist/config.js +29 -0
  15. package/dist/cli/dist/config.js.map +1 -0
  16. package/dist/cli/dist/connections.d.ts +15 -0
  17. package/dist/cli/dist/connections.js +191 -0
  18. package/dist/cli/dist/connections.js.map +1 -0
  19. package/dist/cli/dist/contacts.d.ts +4 -3
  20. package/dist/cli/dist/contacts.js +39 -28
  21. package/dist/cli/dist/contacts.js.map +1 -1
  22. package/dist/cli/dist/doctor.d.ts +9 -0
  23. package/dist/cli/dist/doctor.js +46 -5
  24. package/dist/cli/dist/doctor.js.map +1 -1
  25. package/dist/cli/dist/error-messages.js +22 -0
  26. package/dist/cli/dist/error-messages.js.map +1 -1
  27. package/dist/cli/dist/index.js +44 -6
  28. package/dist/cli/dist/index.js.map +1 -1
  29. package/dist/cli/dist/invite-output.d.ts +14 -0
  30. package/dist/cli/dist/invite-output.js +66 -0
  31. package/dist/cli/dist/invite-output.js.map +1 -0
  32. package/dist/cli/dist/invite-share.d.ts +6 -3
  33. package/dist/cli/dist/invite-share.js +40 -15
  34. package/dist/cli/dist/invite-share.js.map +1 -1
  35. package/dist/cli/dist/invites-migrate.d.ts +3 -0
  36. package/dist/cli/dist/invites-migrate.js +33 -0
  37. package/dist/cli/dist/invites-migrate.js.map +1 -0
  38. package/dist/cli/dist/mcp.d.ts +7 -5
  39. package/dist/cli/dist/mcp.js +23 -18
  40. package/dist/cli/dist/mcp.js.map +1 -1
  41. package/dist/cli/dist/network.d.ts +11 -1
  42. package/dist/cli/dist/network.js +150 -87
  43. package/dist/cli/dist/network.js.map +1 -1
  44. package/dist/cli/dist/pending.d.ts +8 -0
  45. package/dist/cli/dist/pending.js +50 -0
  46. package/dist/cli/dist/pending.js.map +1 -0
  47. package/dist/cli/dist/public-settings.d.ts +5 -4
  48. package/dist/cli/dist/public-settings.js +13 -15
  49. package/dist/cli/dist/public-settings.js.map +1 -1
  50. package/dist/cli/dist/receipt.d.ts +1 -1
  51. package/dist/cli/dist/relay-auth.d.ts +3 -0
  52. package/dist/cli/dist/relay-auth.js +23 -0
  53. package/dist/cli/dist/relay-auth.js.map +1 -0
  54. package/dist/cli/dist/requests.d.ts +10 -0
  55. package/dist/cli/dist/requests.js +91 -0
  56. package/dist/cli/dist/requests.js.map +1 -0
  57. package/dist/cli/dist/sdk.d.ts +10 -0
  58. package/dist/cli/dist/sdk.js +7 -0
  59. package/dist/cli/dist/sdk.js.map +1 -0
  60. package/dist/cli/dist/setup-files.d.ts +24 -0
  61. package/dist/cli/dist/setup-files.js +190 -0
  62. package/dist/cli/dist/setup-files.js.map +1 -0
  63. package/dist/cli/dist/setup-hosts.d.ts +29 -0
  64. package/dist/cli/dist/setup-hosts.js +75 -0
  65. package/dist/cli/dist/setup-hosts.js.map +1 -0
  66. package/dist/cli/dist/setup.d.ts +61 -0
  67. package/dist/cli/dist/setup.js +243 -0
  68. package/dist/cli/dist/setup.js.map +1 -0
  69. package/dist/cli/dist/task-input.d.ts +1 -1
  70. package/dist/cli/dist/wake-hook.d.ts +1 -1
  71. package/dist/cli/dist/worker-json.d.ts +4 -0
  72. package/dist/cli/dist/worker-json.js +87 -0
  73. package/dist/cli/dist/worker-json.js.map +1 -0
  74. package/dist/examples/two-owner-demo/dist/run-demo.d.ts +13 -13
  75. package/dist/package.json +1 -1
  76. package/dist/packages/adapters/dist/command.d.ts +2 -2
  77. package/dist/packages/adapters/dist/credential-proxy.d.ts +2 -2
  78. package/dist/packages/adapters/dist/index.d.ts +1 -1
  79. package/dist/packages/adapters/dist/mcp.d.ts +2 -2
  80. package/dist/packages/adapters/dist/openai.d.ts +2 -2
  81. package/dist/packages/adapters/dist/sandbox.d.ts +2 -2
  82. package/dist/packages/core/dist/connection.d.ts +58 -0
  83. package/dist/packages/core/dist/connection.js +132 -0
  84. package/dist/packages/core/dist/connection.js.map +1 -0
  85. package/dist/packages/core/dist/delivery-status.d.ts +22 -0
  86. package/dist/packages/core/dist/delivery-status.js +53 -0
  87. package/dist/packages/core/dist/delivery-status.js.map +1 -0
  88. package/dist/packages/core/dist/discovery.d.ts +7 -6
  89. package/dist/packages/core/dist/discovery.js +19 -20
  90. package/dist/packages/core/dist/discovery.js.map +1 -1
  91. package/dist/packages/core/dist/edge.d.ts +1 -0
  92. package/dist/packages/core/dist/edge.js +1 -0
  93. package/dist/packages/core/dist/edge.js.map +1 -1
  94. package/dist/packages/core/dist/index.d.ts +3 -0
  95. package/dist/packages/core/dist/index.js +3 -0
  96. package/dist/packages/core/dist/index.js.map +1 -1
  97. package/dist/packages/core/dist/protocol.d.ts +24 -0
  98. package/dist/packages/core/dist/protocol.js +54 -0
  99. package/dist/packages/core/dist/protocol.js.map +1 -0
  100. package/dist/packages/core/dist/receipts.d.ts +1 -0
  101. package/dist/packages/core/dist/receipts.js +1 -1
  102. package/dist/packages/core/dist/receipts.js.map +1 -1
  103. package/dist/packages/core/dist/schema.d.ts +1 -0
  104. package/dist/packages/core/dist/schema.js +13 -2
  105. package/dist/packages/core/dist/schema.js.map +1 -1
  106. package/dist/packages/ledger/dist/index.d.ts +1 -1
  107. package/dist/packages/relay/dist/admission.d.ts +14 -0
  108. package/dist/packages/relay/dist/admission.js +70 -0
  109. package/dist/packages/relay/dist/admission.js.map +1 -0
  110. package/dist/packages/relay/dist/fetch.d.ts +8 -2
  111. package/dist/packages/relay/dist/fetch.js +41 -12
  112. package/dist/packages/relay/dist/fetch.js.map +1 -1
  113. package/dist/packages/relay/dist/index.d.ts +23 -12
  114. package/dist/packages/relay/dist/index.js +130 -78
  115. package/dist/packages/relay/dist/index.js.map +1 -1
  116. package/dist/packages/relay/dist/journal.d.ts +1 -1
  117. package/dist/packages/relay/dist/notifications.d.ts +1 -1
  118. package/dist/packages/relay/dist/retry.d.ts +23 -0
  119. package/dist/packages/relay/dist/retry.js +43 -1
  120. package/dist/packages/relay/dist/retry.js.map +1 -1
  121. package/dist/packages/relay/dist/ssrf.d.ts +3 -2
  122. package/dist/packages/relay/dist/ssrf.js.map +1 -1
  123. package/dist/packages/relay/dist/worker.js +1 -1
  124. package/dist/packages/relay/dist/worker.js.map +1 -1
  125. package/dist/packages/runtime/dist/a2a.d.ts +1 -1
  126. package/dist/packages/runtime/dist/a2a.js +1 -1
  127. package/dist/packages/runtime/dist/adapter.d.ts +2 -2
  128. package/dist/packages/runtime/dist/application-config.d.ts +20 -0
  129. package/dist/packages/runtime/dist/application-config.js +222 -0
  130. package/dist/packages/runtime/dist/application-config.js.map +1 -0
  131. package/dist/packages/runtime/dist/approval-providers.d.ts +24 -3
  132. package/dist/packages/runtime/dist/approval-providers.js +79 -3
  133. package/dist/packages/runtime/dist/approval-providers.js.map +1 -1
  134. package/dist/packages/runtime/dist/connection-admission-review.d.ts +39 -0
  135. package/dist/packages/runtime/dist/connection-admission-review.js +86 -0
  136. package/dist/packages/runtime/dist/connection-admission-review.js.map +1 -0
  137. package/dist/packages/runtime/dist/connection-persistence.d.ts +35 -0
  138. package/dist/packages/runtime/dist/connection-persistence.js +181 -0
  139. package/dist/packages/runtime/dist/connection-persistence.js.map +1 -0
  140. package/dist/packages/runtime/dist/connection-records.d.ts +167 -0
  141. package/dist/packages/runtime/dist/connection-records.js +132 -0
  142. package/dist/packages/runtime/dist/connection-records.js.map +1 -0
  143. package/dist/packages/runtime/dist/connection-router.d.ts +45 -0
  144. package/dist/packages/runtime/dist/connection-router.js +130 -0
  145. package/dist/packages/runtime/dist/connection-router.js.map +1 -0
  146. package/dist/packages/runtime/dist/connection-service.d.ts +159 -0
  147. package/dist/packages/runtime/dist/connection-service.js +239 -0
  148. package/dist/packages/runtime/dist/connection-service.js.map +1 -0
  149. package/dist/packages/runtime/dist/connection-transport.d.ts +14 -0
  150. package/dist/packages/runtime/dist/connection-transport.js +89 -0
  151. package/dist/packages/runtime/dist/connection-transport.js.map +1 -0
  152. package/dist/packages/runtime/dist/delivery-records.d.ts +180 -0
  153. package/dist/packages/runtime/dist/delivery-records.js +205 -0
  154. package/dist/packages/runtime/dist/delivery-records.js.map +1 -0
  155. package/dist/packages/runtime/dist/delivery-status-router.d.ts +27 -0
  156. package/dist/packages/runtime/dist/delivery-status-router.js +150 -0
  157. package/dist/packages/runtime/dist/delivery-status-router.js.map +1 -0
  158. package/dist/packages/runtime/dist/delivery-status.d.ts +43 -0
  159. package/dist/packages/runtime/dist/delivery-status.js +193 -0
  160. package/dist/packages/runtime/dist/delivery-status.js.map +1 -0
  161. package/dist/packages/runtime/dist/delivery-store.d.ts +125 -0
  162. package/dist/packages/runtime/dist/delivery-store.js +1047 -0
  163. package/dist/packages/runtime/dist/delivery-store.js.map +1 -0
  164. package/dist/packages/runtime/dist/gateway.d.ts +4 -3
  165. package/dist/packages/runtime/dist/gateway.js.map +1 -1
  166. package/dist/packages/runtime/dist/held-request-review.d.ts +49 -0
  167. package/dist/packages/runtime/dist/held-request-review.js +122 -0
  168. package/dist/packages/runtime/dist/held-request-review.js.map +1 -0
  169. package/dist/packages/runtime/dist/held-request-store.d.ts +112 -0
  170. package/dist/packages/runtime/dist/held-request-store.js +290 -0
  171. package/dist/packages/runtime/dist/held-request-store.js.map +1 -0
  172. package/dist/packages/runtime/dist/idempotency-store.d.ts +53 -0
  173. package/dist/packages/runtime/dist/idempotency-store.js +331 -0
  174. package/dist/packages/runtime/dist/idempotency-store.js.map +1 -0
  175. package/dist/packages/runtime/dist/inbox.d.ts +1 -1
  176. package/dist/packages/runtime/dist/index.d.ts +27 -1
  177. package/dist/packages/runtime/dist/index.js +26 -0
  178. package/dist/packages/runtime/dist/index.js.map +1 -1
  179. package/dist/packages/runtime/dist/invite-store.d.ts +76 -0
  180. package/dist/packages/runtime/dist/invite-store.js +337 -0
  181. package/dist/packages/runtime/dist/invite-store.js.map +1 -0
  182. package/dist/packages/runtime/dist/key-store.d.ts +77 -0
  183. package/dist/packages/runtime/dist/key-store.js +226 -0
  184. package/dist/packages/runtime/dist/key-store.js.map +1 -0
  185. package/dist/packages/runtime/dist/local-identity.d.ts +33 -0
  186. package/dist/packages/runtime/dist/local-identity.js +278 -0
  187. package/dist/packages/runtime/dist/local-identity.js.map +1 -0
  188. package/dist/packages/runtime/dist/mcp-rpc.d.ts +19 -0
  189. package/dist/packages/runtime/dist/mcp-rpc.js +175 -0
  190. package/dist/packages/runtime/dist/mcp-rpc.js.map +1 -0
  191. package/dist/packages/runtime/dist/mcp-server.d.ts +46 -19
  192. package/dist/packages/runtime/dist/mcp-server.js +427 -184
  193. package/dist/packages/runtime/dist/mcp-server.js.map +1 -1
  194. package/dist/packages/runtime/dist/mcp-tool-catalog.d.ts +1 -1
  195. package/dist/packages/runtime/dist/mcp-tool-catalog.js +172 -13
  196. package/dist/packages/runtime/dist/mcp-tool-catalog.js.map +1 -1
  197. package/dist/packages/runtime/dist/mcp.d.ts +2 -2
  198. package/dist/packages/runtime/dist/message-status.d.ts +32 -0
  199. package/dist/packages/runtime/dist/message-status.js +29 -0
  200. package/dist/packages/runtime/dist/message-status.js.map +1 -0
  201. package/dist/packages/runtime/dist/outbox.d.ts +91 -0
  202. package/dist/packages/runtime/dist/outbox.js +462 -0
  203. package/dist/packages/runtime/dist/outbox.js.map +1 -0
  204. package/dist/packages/runtime/dist/policy.d.ts +1 -1
  205. package/dist/packages/runtime/dist/protocol-peer-store.d.ts +40 -0
  206. package/dist/packages/runtime/dist/protocol-peer-store.js +176 -0
  207. package/dist/packages/runtime/dist/protocol-peer-store.js.map +1 -0
  208. package/dist/packages/runtime/dist/protocol-release.d.ts +26 -0
  209. package/dist/packages/runtime/dist/protocol-release.js +76 -0
  210. package/dist/packages/runtime/dist/protocol-release.js.map +1 -0
  211. package/dist/packages/runtime/dist/quota.d.ts +1 -1
  212. package/dist/packages/runtime/dist/relay-selection.d.ts +20 -0
  213. package/dist/packages/runtime/dist/relay-selection.js +34 -0
  214. package/dist/packages/runtime/dist/relay-selection.js.map +1 -0
  215. package/dist/packages/runtime/dist/requester-pending-store.d.ts +59 -0
  216. package/dist/packages/runtime/dist/requester-pending-store.js +266 -0
  217. package/dist/packages/runtime/dist/requester-pending-store.js.map +1 -0
  218. package/dist/packages/runtime/dist/secret-store.d.ts +19 -0
  219. package/dist/packages/runtime/dist/secret-store.js +51 -0
  220. package/dist/packages/runtime/dist/secret-store.js.map +1 -0
  221. package/dist/packages/runtime/dist/session-audit.d.ts +29 -7
  222. package/dist/packages/runtime/dist/session-audit.js +149 -29
  223. package/dist/packages/runtime/dist/session-audit.js.map +1 -1
  224. package/dist/packages/runtime/dist/session.d.ts +101 -9
  225. package/dist/packages/runtime/dist/session.js +696 -96
  226. package/dist/packages/runtime/dist/session.js.map +1 -1
  227. package/dist/packages/runtime/dist/task-journal.d.ts +18 -3
  228. package/dist/packages/runtime/dist/task-journal.js +271 -18
  229. package/dist/packages/runtime/dist/task-journal.js.map +1 -1
  230. package/dist/packages/runtime/dist/verifier.d.ts +3 -2
  231. package/dist/packages/runtime/dist/verifier.js +1 -0
  232. package/dist/packages/runtime/dist/verifier.js.map +1 -1
  233. package/dist/packages/runtime/dist/worker-trust-store.d.ts +111 -0
  234. package/dist/packages/runtime/dist/worker-trust-store.js +592 -0
  235. package/dist/packages/runtime/dist/worker-trust-store.js.map +1 -0
  236. package/dist/packages/sandbox/dist/container.d.ts +1 -1
  237. package/dist/packages/sandbox/dist/index.d.ts +1 -1
  238. package/dist/spec/README.ja.md +21 -1
  239. package/dist/spec/README.md +20 -1
  240. package/dist/spec/agent-card.schema.json +11 -1
  241. package/dist/spec/delivery-status.schema.json +106 -0
  242. package/dist/spec/examples/protocol-versions/sample-agent-card.json +35 -0
  243. package/dist/spec/examples/sample-delivery-status.json +21 -0
  244. package/dist/spec/examples/sample-task-manifest.0.1.0.json +173 -0
  245. package/dist/spec/examples/sample-task-manifest.0.2.0.json +173 -0
  246. package/dist/spec/task-manifest.0.1.0.schema.json +422 -0
  247. package/dist/spec/task-manifest.0.2.0.schema.json +422 -0
  248. package/dist/spec/task-manifest.schema.json +9 -418
  249. package/docs/sdk.ja.md +133 -0
  250. package/docs/sdk.md +138 -0
  251. package/package.json +15 -3
@@ -5,5 +5,6 @@ export declare function signUsage(payload: Usage, key: KeyPair): import("./types
5
5
  export declare function signAck(payload: Ack, key: KeyPair): import("./types.js").Signed<Ack>;
6
6
  export declare function signEnvelope(payload: Omit<Envelope, 'type' | 'envelopeId' | 'senderDid'>, key: KeyPair, options?: {
7
7
  encrypt?: boolean;
8
+ signedAt?: string;
8
9
  }): SignedEnvelope;
9
10
  export declare function verifyEnvelope(envelope: SignedEnvelope, recipientDid?: string): boolean;
@@ -52,7 +52,7 @@ export function signEnvelope(payload, key, options) {
52
52
  senderDid: envelope.senderDid,
53
53
  recipientDid: envelope.recipientDid,
54
54
  });
55
- return signPayload(envelope, key);
55
+ return signPayload(envelope, key, options?.signedAt);
56
56
  }
57
57
  export function verifyEnvelope(envelope, recipientDid) {
58
58
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"receipts.js","sourceRoot":"","sources":["../src/receipts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"receipts.js","sourceRoot":"","sources":["../src/receipts.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { Ajv2020 } from 'ajv/dist/2020.js';
2
2
  import type { TaskManifest, Schema } from './types.js';
3
3
  export declare function createAjv(): Ajv2020;
4
4
  export declare const specDirectory: URL;
5
+ export declare const SCHEMA_NAMES: readonly ["task-manifest", "task-manifest.0.1.0", "task-manifest.0.2.0", "agent-card", "delivery-status", "envelope", "usage-receipt", "ack-receipt", "capability-token", "approval-receipt", "audit-entry"];
5
6
  export declare function loadSchema(name: string): Schema;
6
7
  /** Spec files are static. Rebuilding Ajv for every envelope check dominates a session. */
7
8
  export declare function schemaRegistry(): Ajv2020;
@@ -2,14 +2,19 @@
2
2
  import { readFileSync, readdirSync } from 'node:fs';
3
3
  import { Ajv2020 } from 'ajv/dist/2020.js';
4
4
  import formats from 'ajv-formats';
5
+ import { isManifestProtocolVersion } from './protocol.js';
5
6
  export function createAjv() {
6
7
  const ajv = new Ajv2020({ allErrors: true, strict: false, validateFormats: true });
7
8
  formats(ajv);
8
9
  return ajv;
9
10
  }
10
11
  export const specDirectory = new URL('../../../spec/', import.meta.url);
12
+ export const SCHEMA_NAMES = [
13
+ 'task-manifest', 'task-manifest.0.1.0', 'task-manifest.0.2.0', 'agent-card',
14
+ 'delivery-status', 'envelope', 'usage-receipt', 'ack-receipt', 'capability-token', 'approval-receipt', 'audit-entry',
15
+ ];
11
16
  export function loadSchema(name) {
12
- if (!/^[a-z-]+$/.test(name))
17
+ if (!SCHEMA_NAMES.some(known => known === name))
13
18
  throw new Error('INVALID_SCHEMA_NAME');
14
19
  return JSON.parse(readFileSync(new URL(name + '.schema.json', specDirectory), 'utf8'));
15
20
  }
@@ -25,13 +30,19 @@ export function schemaRegistry() {
25
30
  return ajv;
26
31
  }
27
32
  export function validateSchema(name, value) {
33
+ if (!SCHEMA_NAMES.some(known => known === name))
34
+ throw new Error('INVALID_SCHEMA_NAME');
28
35
  const ajv = schemaRegistry();
29
36
  const validate = ajv.getSchema(name);
30
37
  if (!validate(value))
31
38
  throw new Error('SCHEMA_VIOLATION: ' + ajv.errorsText(validate.errors));
32
39
  }
33
40
  export function validateManifest(value) {
34
- validateSchema('task-manifest', value);
41
+ const version = value && typeof value === 'object' && !Array.isArray(value)
42
+ ? value.protocolVersion : undefined;
43
+ if (version !== undefined && !isManifestProtocolVersion(version))
44
+ throw new Error('PROTOCOL_VERSION_UNSUPPORTED');
45
+ validateSchema(isManifestProtocolVersion(version) ? 'task-manifest.' + version : 'task-manifest', value);
35
46
  }
36
47
  export function assertSynchronousSchema(schema) {
37
48
  if (!schema || typeof schema !== 'object')
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,OAAO,MAAM,aAAa,CAAC;AAElC,MAAM,UAAU,SAAS;IACvB,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;IAClF,OAA2C,CAAC,GAAG,CAAC,CAAC;IAClD,OAAO,GAAG,CAAC;AACb,CAAC;AACD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxE,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACpE,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,cAAc,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAW,CAAC;AACnG,CAAC;AACD,IAAI,cAAwD,CAAC;AAC7D,0FAA0F;AAC1F,MAAM,UAAU,cAAc;IAC5B,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IAC1C,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAClF,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9D,cAAc,GAAG,GAAG,CAAC;IACrB,OAAO,GAAG,CAAC;AACb,CAAC;AACD,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,KAAc;IACzD,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,CAAE,CAAC;IACtC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAChG,CAAC;AACD,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,cAAc,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC;AACD,MAAM,UAAU,uBAAuB,CAAC,MAAe;IACrD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO;IAClD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC/E,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;QAAE,uBAAuB,CAAC,KAAK,CAAC,CAAC;AAC5E,CAAC;AACD,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,KAAc;IAC3D,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,OAAO,SAAS,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;AACrD,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { Json, Signature, AckReceipt, KeyPair, Signed } from '@acp/core';
1
+ import type { Json, Signature, AckReceipt, KeyPair, Signed } from '../../core/dist/index.js';
2
2
  export interface AuditBody {
3
3
  taskId: string;
4
4
  seq: number;
@@ -0,0 +1,14 @@
1
+ /** Status-only send failures; response text is never included in diagnostics. */
2
+ export declare class RelayAdmissionError extends Error {
3
+ readonly status: number;
4
+ readonly retryAfterMs?: number | undefined;
5
+ readonly code = "RELAY_RETRY_LATER";
6
+ constructor(status: number, retryAfterMs?: number | undefined);
7
+ }
8
+ export declare class RelayDuplicateEnvelopeError extends Error {
9
+ readonly status: number;
10
+ readonly code = "REPLAYED_ENVELOPE";
11
+ constructor(status?: number);
12
+ }
13
+ /** Decode at most 1 KiB and only the two documented admission responses. */
14
+ export declare function decodeAdmissionError(response: Response): Promise<Error>;
@@ -0,0 +1,70 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ /** Status-only send failures; response text is never included in diagnostics. */
3
+ export class RelayAdmissionError extends Error {
4
+ status;
5
+ retryAfterMs;
6
+ code = 'RELAY_RETRY_LATER';
7
+ constructor(status, retryAfterMs) {
8
+ super('RELAY_REJECTED: ' + status);
9
+ this.status = status;
10
+ this.retryAfterMs = retryAfterMs;
11
+ this.name = 'RelayAdmissionError';
12
+ }
13
+ }
14
+ export class RelayDuplicateEnvelopeError extends Error {
15
+ status;
16
+ code = 'REPLAYED_ENVELOPE';
17
+ constructor(status = 400) {
18
+ super('RELAY_REJECTED: ' + status);
19
+ this.status = status;
20
+ this.name = 'RelayDuplicateEnvelopeError';
21
+ }
22
+ }
23
+ /** Decode at most 1 KiB and only the two documented admission responses. */
24
+ export async function decodeAdmissionError(response) {
25
+ let value;
26
+ const reader = response.body?.getReader();
27
+ if (reader) {
28
+ try {
29
+ const chunks = [];
30
+ let size = 0;
31
+ for (;;) {
32
+ const part = await reader.read();
33
+ if (part.done)
34
+ break;
35
+ size += part.value.byteLength;
36
+ if (size > 1024)
37
+ break;
38
+ chunks.push(part.value);
39
+ }
40
+ if (size <= 1024) {
41
+ const bytes = new Uint8Array(size);
42
+ let offset = 0;
43
+ for (const chunk of chunks) {
44
+ bytes.set(chunk, offset);
45
+ offset += chunk.length;
46
+ }
47
+ const parsed = JSON.parse(new TextDecoder().decode(bytes));
48
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed))
49
+ value = parsed;
50
+ }
51
+ }
52
+ catch { /* Malformed responses retain status-only behavior. */ }
53
+ finally {
54
+ await reader.cancel().catch(() => { });
55
+ reader.releaseLock();
56
+ }
57
+ }
58
+ if (response.status === 400 && value?.error === 'REPLAYED_ENVELOPE' &&
59
+ Object.keys(value).join(',') === 'error')
60
+ return new RelayDuplicateEnvelopeError();
61
+ if (response.status === 429) {
62
+ const hint = value?.error === 'RELAY_RETRY_LATER' && value.retryable === true &&
63
+ Object.keys(value).sort().join(',') === 'error,retryAfterMs,retryable' &&
64
+ Number.isSafeInteger(value.retryAfterMs) && Number(value.retryAfterMs) > 0 && Number(value.retryAfterMs) <= 3_600_000
65
+ ? Number(value.retryAfterMs) : undefined;
66
+ return new RelayAdmissionError(429, hint);
67
+ }
68
+ return new Error('RELAY_REJECTED: ' + response.status);
69
+ }
70
+ //# sourceMappingURL=admission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admission.js","sourceRoot":"","sources":["../src/admission.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { SignedEnvelope, SignedAgentCard, RelayAuthAction, KeyPair } from '@acp/core/edge';
1
+ import type { SignedEnvelope, SignedAgentCard, RelayAuthAction, KeyPair } from '../../core/dist/edge.js';
2
2
  import type { RelayWakeOptions, RelayWakeAttempt, RelayOperation, SignedRelayDeliveryStatus } from './notifications.js';
3
3
  export * from './notifications.js';
4
4
  export declare function verifyRelayEnvelope(e: SignedEnvelope, recipient?: string): boolean;
@@ -203,7 +203,7 @@ export declare function relayHttpHeaders(kind?: 'json' | 'empty' | 'sse'): Recor
203
203
  * Names that the live relay does not throw today stay listed so a later
204
204
  * constant code is not replaced by RELAY_INTERNAL_ERROR.
205
205
  */
206
- export declare const KNOWN_RELAY_ERROR_CODES: readonly ["INVALID_ENVELOPE", "INVALID_SIGNED_ENVELOPE", "ENVELOPE_EXPIRED", "REPLAYED_ENVELOPE", "DUPLICATE_ENVELOPE_ID", "ENVELOPE_TOO_LARGE", "RELAY_CAPACITY", "RELAY_QUEUE_FULL", "QUEUE_BYTES_EXCEEDED", "QUEUE_LIMIT_EXCEEDED", "RELAY_BYTE_BUDGET_EXCEEDED", "SENDER_QUOTA_EXCEEDED", "INVALID_RECIPIENT_DID", "MISSING_RECIPIENT_DID", "INVALID_DID", "RELAY_TAMPERING_DETECTED", "INVALID_AGENT_CARD", "INVALID_AGENT_SNAPSHOT", "AMBIGUOUS_AGENT_CARD_OWNER", "AGENT_CARD_EXPIRED", "AGENT_CARD_EXPIRY_TOO_LONG", "AGENT_CARD_DELEGATION_REQUIRED", "AGENT_DELEGATION_REQUIRED", "AGENT_CARD_DELEGATION_INVALID", "AGENT_CARD_TOO_LARGE", "AGENT_REGISTRY_FULL", "AGENT_CARD_TTL_INVALID", "AGENT_OWNER_OR_VERSION_MISMATCH", "NO_AGENT_REGISTERED", "RELAY_UNAUTHORIZED", "RELAY_AUTH_REQUIRED", "RELAY_AUTH_INVALID", "RELAY_AUTH_SIGNATURE_INVALID", "RELAY_AUTH_RECIPIENT_MISMATCH", "RELAY_AUTH_ACTION_MISMATCH", "RELAY_AUTH_EXPIRED", "RELAY_AUTH_FUTURE_ISSUED_AT", "RELAY_AUTH_REPLAYED", "RELAY_AUTH_NONCE_INVALID", "RELAY_AUTH_ORIGIN_REQUIRED", "RELAY_AUTH_ORIGIN_MISMATCH", "RELAY_QUERY_AUTH_DISABLED", "INVALID_RELAY_ORIGIN", "RATE_LIMITED", "RATE_LIMITER_UNAVAILABLE", "PAYLOAD_TOO_LARGE", "BODY_TOO_LARGE", "MISSING_BODY", "INVALID_JSON", "INVALID_UNICODE", "INVALID_LIMIT", "INVALID_RELAY_LIMIT", "INVALID_TIMEOUT", "INVALID_WAIT", "MISSING_ENVELOPE_ID", "UNSUPPORTED_METHOD", "NOT_FOUND", "WEBSOCKET_UPGRADE_REQUIRED", "INVALID_REQUEST", "INVALID_RELAY_SNAPSHOT", "RELAY_INTERNAL_ERROR"];
206
+ export declare const KNOWN_RELAY_ERROR_CODES: readonly ["INVALID_ENVELOPE", "INVALID_SIGNED_ENVELOPE", "ENVELOPE_EXPIRED", "REPLAYED_ENVELOPE", "DUPLICATE_ENVELOPE_ID", "ENVELOPE_TOO_LARGE", "RELAY_CAPACITY", "RELAY_RETRY_LATER", "RELAY_QUEUE_FULL", "QUEUE_BYTES_EXCEEDED", "QUEUE_LIMIT_EXCEEDED", "RELAY_BYTE_BUDGET_EXCEEDED", "SENDER_QUOTA_EXCEEDED", "INVALID_RECIPIENT_DID", "MISSING_RECIPIENT_DID", "INVALID_DID", "RELAY_TAMPERING_DETECTED", "INVALID_AGENT_CARD", "INVALID_AGENT_SNAPSHOT", "AMBIGUOUS_AGENT_CARD_OWNER", "AGENT_CARD_EXPIRED", "AGENT_CARD_EXPIRY_TOO_LONG", "AGENT_CARD_DELEGATION_REQUIRED", "AGENT_DELEGATION_REQUIRED", "AGENT_CARD_DELEGATION_INVALID", "AGENT_CARD_TOO_LARGE", "AGENT_REGISTRY_FULL", "AGENT_CARD_TTL_INVALID", "AGENT_OWNER_OR_VERSION_MISMATCH", "NO_AGENT_REGISTERED", "RELAY_UNAUTHORIZED", "RELAY_AUTH_REQUIRED", "RELAY_AUTH_INVALID", "RELAY_AUTH_SIGNATURE_INVALID", "RELAY_AUTH_RECIPIENT_MISMATCH", "RELAY_AUTH_ACTION_MISMATCH", "RELAY_AUTH_EXPIRED", "RELAY_AUTH_FUTURE_ISSUED_AT", "RELAY_AUTH_REPLAYED", "RELAY_AUTH_NONCE_INVALID", "RELAY_AUTH_ORIGIN_REQUIRED", "RELAY_AUTH_ORIGIN_MISMATCH", "RELAY_QUERY_AUTH_DISABLED", "INVALID_RELAY_ORIGIN", "RATE_LIMITED", "RATE_LIMITER_UNAVAILABLE", "PAYLOAD_TOO_LARGE", "BODY_TOO_LARGE", "MISSING_BODY", "INVALID_JSON", "INVALID_UNICODE", "INVALID_LIMIT", "INVALID_RELAY_LIMIT", "INVALID_TIMEOUT", "INVALID_WAIT", "MISSING_ENVELOPE_ID", "UNSUPPORTED_METHOD", "NOT_FOUND", "WEBSOCKET_UPGRADE_REQUIRED", "INVALID_REQUEST", "INVALID_RELAY_SNAPSHOT", "RELAY_INTERNAL_ERROR"];
207
207
  /**
208
208
  * Public error code for an untrusted caller.
209
209
  * Parser and URL failures become INVALID_REQUEST. Any other message is returned
@@ -219,6 +219,12 @@ export interface MappedRelayError {
219
219
  export declare function mapRelayError(error: unknown): MappedRelayError;
220
220
  /** Auth failures that must stay 401s with a stable error code. */
221
221
  export declare function relayAuthFailure(error: unknown): string | undefined;
222
+ /** Shared HTTP and WebSocket admission error fields. */
223
+ export declare function relayErrorBody(error: unknown): {
224
+ error: string;
225
+ retryable?: true;
226
+ retryAfterMs?: number;
227
+ };
222
228
  export declare function relayErrorResponse(error: unknown, relay?: InMemoryRelay): Response;
223
229
  /**
224
230
  * Bearer credential for a relay request.
@@ -29,7 +29,7 @@ export const DEFAULT_MAX_ENVELOPE_BYTES = 256 * 1024;
29
29
  export const DEFAULT_MAX_QUEUE_SIZE = 256;
30
30
  /** Sum of queued envelope JSON sizes for one recipient. */
31
31
  export const DEFAULT_MAX_QUEUE_BYTES_PER_RECIPIENT = 4 * 1024 * 1024;
32
- export const DEFAULT_ENVELOPE_TTL_MS = 10 * 60 * 1000;
32
+ export const DEFAULT_ENVELOPE_TTL_MS = 24 * 60 * 60 * 1000;
33
33
  export const DEFAULT_SEEN_TTL_MS = 60 * 60 * 1000;
34
34
  export const DEFAULT_AUTH_SEEN_TTL_MS = 10 * 60 * 1000;
35
35
  export const DEFAULT_AGENT_CARD_TTL_MS = 60 * 60 * 1000;
@@ -37,7 +37,13 @@ export const DEFAULT_AGENT_CARD_TTL_MS = 60 * 60 * 1000;
37
37
  export const DEFAULT_MAX_SEEN_ENTRIES = 4096;
38
38
  export const DEFAULT_MAX_QUEUES = 10000;
39
39
  export const DEFAULT_MAX_AGENTS = 10000;
40
+ const CONNECTION_CONTROL_EVENTS = new Set([
41
+ 'CONNECTION_REQUEST',
42
+ 'CONNECTION_ACCEPTED',
43
+ 'CONNECTION_ACK',
44
+ ]);
40
45
  const WORKER_PRIMARY_EVENTS = new Set([
46
+ ...CONNECTION_CONTROL_EVENTS,
41
47
  'PROPOSE',
42
48
  'REVOKE',
43
49
  'VERIFY_ACCEPT',
@@ -69,6 +75,11 @@ const BILATERAL_AUDIT_EVENTS = new Set([
69
75
  ]);
70
76
  export function classifyEnvelopeRole(envelope, state) {
71
77
  const { eventType: type, seq, senderDid, recipientDid } = envelope.payload;
78
+ // Control delivery does not participate in bilateral task role/sequence inference.
79
+ if (type === 'DELIVERY_STATUS')
80
+ return 'requester';
81
+ if (CONNECTION_CONTROL_EVENTS.has(type))
82
+ return 'worker';
72
83
  const cross = senderDid !== recipientDid;
73
84
  if (WORKER_PRIMARY_EVENTS.has(type)) {
74
85
  if (state) {
@@ -619,21 +630,25 @@ export class InMemoryRelay {
619
630
  if (!verifyRelayEnvelope(envelope))
620
631
  throw new Error('INVALID_ENVELOPE');
621
632
  this.evictExpired();
622
- if (this.seen.has(envelope.payload.envelopeId) || this.operations.has('expiry:' + envelope.payload.envelopeId))
633
+ const id = envelope.payload.envelopeId;
634
+ if (this.seen.has(id) || this.operations.has('expiry:' + id) ||
635
+ [...this.queues.values()].some(queue => queue.some(item => item.envelope.payload.envelopeId === id)))
623
636
  throw new Error('REPLAYED_ENVELOPE');
624
637
  const did = envelope.payload.recipientDid;
625
638
  const queue = this.queues.get(did) ?? [];
626
639
  const bytes = Buffer.byteLength(JSON.stringify(envelope));
627
- if (!this.queues.has(did) && this.queues.size >= this.maxQueues)
628
- throw new Error('RELAY_CAPACITY');
629
- if (queue.length >= this.maxQueueSize || bytes > this.maxEnvelopeBytes)
630
- throw new Error('RELAY_CAPACITY');
640
+ if (bytes > this.maxEnvelopeBytes || bytes > this.maxQueueBytesPerRecipient)
641
+ throw new Error('ENVELOPE_TOO_LARGE');
642
+ if ((!this.queues.has(did) && this.queues.size >= this.maxQueues) ||
643
+ queue.length >= this.maxQueueSize)
644
+ throw new Error('RELAY_RETRY_LATER');
631
645
  if (this.queuedBytes(queue) + bytes > this.maxQueueBytesPerRecipient)
632
- throw new Error('QUEUE_BYTES_EXCEEDED');
646
+ throw new Error('RELAY_RETRY_LATER');
633
647
  if (this.senderCount(queue, envelope.payload.senderDid) >= this.maxEnvelopesPerSender)
634
- throw new Error('SENDER_QUOTA_EXCEEDED');
648
+ throw new Error('RELAY_RETRY_LATER');
635
649
  this.remember(this.seen, envelope.payload.envelopeId, this.maxSeenEntries, this.seenTtlMs);
636
- const role = classifyEnvelopeRole(envelope, this.stateForTask(envelope.payload.taskId));
650
+ const role = classifyEnvelopeRole(envelope, CONNECTION_CONTROL_EVENTS.has(envelope.payload.eventType)
651
+ ? undefined : this.stateForTask(envelope.payload.taskId));
637
652
  const wire = structuredClone(envelope);
638
653
  const stored = this.tamper ? this.tamper(wire) : wire;
639
654
  queue.push({
@@ -879,7 +894,8 @@ export class InMemoryRelay {
879
894
  leasedUntil: leaseExpiry.get(envelope.payload.envelopeId),
880
895
  bytes: Buffer.byteLength(JSON.stringify(envelope)),
881
896
  expiresAt: envelopeExpiry.get(envelope.payload.envelopeId) ?? this.now() + this.envelopeTtlMs,
882
- role: classifyEnvelopeRole(envelope, this.stateForTask(envelope.payload.taskId)),
897
+ role: classifyEnvelopeRole(envelope, CONNECTION_CONTROL_EVENTS.has(envelope.payload.eventType)
898
+ ? undefined : this.stateForTask(envelope.payload.taskId)),
883
899
  })));
884
900
  }
885
901
  this.seen = new Map(snapshot.seen.map((id) => [id, seenExpiry.get(id) ?? this.now() + this.seenTtlMs]));
@@ -969,6 +985,7 @@ export const KNOWN_RELAY_ERROR_CODES = [
969
985
  'DUPLICATE_ENVELOPE_ID',
970
986
  'ENVELOPE_TOO_LARGE',
971
987
  'RELAY_CAPACITY',
988
+ 'RELAY_RETRY_LATER',
972
989
  'RELAY_QUEUE_FULL',
973
990
  'QUEUE_BYTES_EXCEEDED',
974
991
  'QUEUE_LIMIT_EXCEEDED',
@@ -1034,6 +1051,7 @@ const RELAY_ERROR_STATUS = {
1034
1051
  DUPLICATE_ENVELOPE_ID: 400,
1035
1052
  ENVELOPE_TOO_LARGE: 400,
1036
1053
  RELAY_CAPACITY: 400,
1054
+ RELAY_RETRY_LATER: 429,
1037
1055
  RELAY_QUEUE_FULL: 400,
1038
1056
  INVALID_RECIPIENT_DID: 400,
1039
1057
  MISSING_RECIPIENT_DID: 400,
@@ -1124,14 +1142,25 @@ export function relayAuthFailure(error) {
1124
1142
  const code = sanitizeRelayErrorCode(error);
1125
1143
  return RELAY_ERROR_STATUS[code] === 401 ? code : undefined;
1126
1144
  }
1145
+ /** Shared HTTP and WebSocket admission error fields. */
1146
+ export function relayErrorBody(error) {
1147
+ const code = sanitizeRelayErrorCode(error);
1148
+ return code === 'RELAY_RETRY_LATER'
1149
+ ? { error: code, retryable: true, retryAfterMs: 60_000 }
1150
+ : { error: code };
1151
+ }
1127
1152
  export function relayErrorResponse(error, relay) {
1128
1153
  const mapped = mapRelayError(error);
1154
+ const body = relayErrorBody(error);
1129
1155
  if (mapped.status === 429) {
1130
- return Response.json({ error: mapped.error }, {
1156
+ const retryAfter = body.retryAfterMs !== undefined
1157
+ ? Math.ceil(body.retryAfterMs / 1000)
1158
+ : (relay?.retryAfterSeconds() ?? 60);
1159
+ return Response.json(body, {
1131
1160
  status: 429,
1132
1161
  headers: {
1133
1162
  ...relayHttpHeaders('json'),
1134
- 'retry-after': String(relay?.retryAfterSeconds() ?? 60),
1163
+ 'retry-after': String(retryAfter),
1135
1164
  },
1136
1165
  });
1137
1166
  }