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,460 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ import { resolveDid, generateKeyPair } from '../../core/dist/edge.js';
3
+ import { beginDurableLongPoll, canonicalRelayPath, createRelayFetchHandler, DEFAULT_MAX_ENVELOPE_BYTES, inboxRecipientFromRequest, InMemoryRelay, relayErrorResponse, relayHttpHeaders, relayLimitsFromEnv, } from './fetch.js';
4
+ import { relayWakeFromEnv } from './notifications.js';
5
+ import { emptyCursor, emptyRelaySnapshot, loadRelayState, planJournal, } from './journal.js';
6
+ /**
7
+ * One inbox or the registry. Storage is granular: a POST writes the new
8
+ * envelope, its seen-id slot, and the fixed-size meta record. Write cost does
9
+ * not grow with the number of queued envelopes or registered agents.
10
+ */
11
+ export class RelayDurableObject {
12
+ state;
13
+ relay;
14
+ handler;
15
+ ready;
16
+ /** Serializes handler mutation, snapshot write, and rollback for every request. */
17
+ turn = Promise.resolve();
18
+ persistedVersion = 0;
19
+ notifications;
20
+ notificationKey;
21
+ configuredNotificationKey;
22
+ committedSnapshot;
23
+ cursor;
24
+ constructor(state, env) {
25
+ this.state = state;
26
+ this.configuredNotificationKey = typeof env?.ACP_NOTIFICATION_KEY === 'string'
27
+ ? JSON.parse(env.ACP_NOTIFICATION_KEY) : undefined;
28
+ this.relay = new InMemoryRelay({ ...relayLimitsFromEnv(env),
29
+ // Channels are supplied by the embedding operator, never by an HTTP request.
30
+ wake: env?.ACP_WAKE ?? relayWakeFromEnv(env),
31
+ });
32
+ this.handler = createRelayFetchHandler({ relay: this.relay, deferNotifications: true });
33
+ this.cursor = emptyCursor(this.relay.maxSeenEntries, this.relay.maxAuthSeenEntries);
34
+ this.committedSnapshot = emptyRelaySnapshot();
35
+ this.ready = state.blockConcurrencyWhile(() => this.bootstrap());
36
+ }
37
+ async bootstrap() {
38
+ const meta = await this.state.storage.get('meta');
39
+ const key = this.configuredNotificationKey ?? meta?.notificationKey ?? generateKeyPair();
40
+ this.notificationKey = key;
41
+ this.relay.setNotificationKey(key);
42
+ const loaded = await loadRelayState(this.state.storage, Date.now(), {
43
+ seenMod: this.relay.maxSeenEntries,
44
+ authMod: this.relay.maxAuthSeenEntries,
45
+ });
46
+ this.cursor = loaded.cursor;
47
+ if (loaded.snapshot)
48
+ this.relay.restore(loaded.snapshot);
49
+ this.committedSnapshot = loaded.snapshot ?? emptyRelaySnapshot();
50
+ this.persistedVersion = -1;
51
+ if (loaded.legacy)
52
+ await this.migrateLegacy(loaded.legacy);
53
+ await this.writeSnapshot();
54
+ }
55
+ /** Rewrite a pre-sharding blob into per-key records once, then drop the blob. */
56
+ async migrateLegacy(legacy) {
57
+ const next = this.relay.snapshot();
58
+ const plan = planJournal(emptyCursor(this.relay.maxSeenEntries, this.relay.maxAuthSeenEntries), emptyRelaySnapshot(), next);
59
+ await this.commitPlan(plan, next, this.relay.mutationVersion);
60
+ if (!this.state.storage.delete)
61
+ return;
62
+ await this.state.storage.delete('relay-head');
63
+ for (let i = 0; i < legacy.count; i++)
64
+ await this.state.storage.delete('relay:' + legacy.generation + ':' + i);
65
+ }
66
+ /** Queue one turn. A rejection stays on that turn and does not poison the next one. */
67
+ enqueue(work) {
68
+ const run = this.turn.catch(() => undefined).then(work);
69
+ this.turn = run.then(() => undefined, () => undefined);
70
+ return run;
71
+ }
72
+ /**
73
+ * Persist the current relay. Caller must already hold the request turn.
74
+ * A single POST /envelopes or DELETE /envelopes/:id commits a constant
75
+ * number of keys (the touched envelope, its replay slot, and `meta`).
76
+ * The fixed-size `meta` record is independent of inbox and registry length.
77
+ */
78
+ async writeSnapshot() {
79
+ this.relay.evictExpired();
80
+ if (this.persistedVersion === this.relay.mutationVersion) {
81
+ await this.bestEffortAlarm();
82
+ return;
83
+ }
84
+ const next = this.relay.snapshot();
85
+ const version = this.relay.mutationVersion;
86
+ const plan = planJournal(this.cursor, this.committedSnapshot, next);
87
+ if (plan.puts.length === 0 && plan.deletes.length === 0) {
88
+ this.cursor = plan.cursor;
89
+ this.persistedVersion = version;
90
+ this.committedSnapshot = next;
91
+ await this.bestEffortAlarm();
92
+ return;
93
+ }
94
+ const rollback = this.committedSnapshot;
95
+ let committed = false;
96
+ try {
97
+ // Item keys first, then meta. A crash before meta leaves unreachable
98
+ // orphans; the previous meta still describes the last committed inbox.
99
+ for (const put of plan.puts)
100
+ await this.state.storage.put(put.key, put.value);
101
+ await this.state.storage.put('meta', { ...plan.meta, notificationKey: this.notificationKey });
102
+ this.cursor = plan.cursor;
103
+ this.persistedVersion = version;
104
+ this.committedSnapshot = next;
105
+ committed = true;
106
+ if (this.state.storage.delete)
107
+ for (const key of plan.deletes)
108
+ await this.state.storage.delete(key);
109
+ }
110
+ catch (error) {
111
+ // A failed put must not leave memory ahead of the last durable meta record.
112
+ if (!committed && this.relay.mutationVersion === version)
113
+ this.relay.restore(rollback);
114
+ throw error;
115
+ }
116
+ await this.bestEffortAlarm();
117
+ }
118
+ async commitPlan(plan, next, version) {
119
+ for (const put of plan.puts)
120
+ await this.state.storage.put(put.key, put.value);
121
+ await this.state.storage.put('meta', { ...plan.meta, notificationKey: this.notificationKey });
122
+ this.cursor = plan.cursor;
123
+ this.persistedVersion = version;
124
+ this.committedSnapshot = next;
125
+ if (!this.state.storage.delete)
126
+ return;
127
+ for (const key of plan.deletes)
128
+ await this.state.storage.delete(key);
129
+ }
130
+ async bestEffortAlarm() {
131
+ const setAlarm = this.state.storage.setAlarm;
132
+ if (!setAlarm)
133
+ return;
134
+ try {
135
+ const next = this.relay.nextExpiry();
136
+ if (next === undefined) {
137
+ await this.state.storage.deleteAlarm?.();
138
+ return;
139
+ }
140
+ await setAlarm(next);
141
+ }
142
+ catch {
143
+ /* A committed mutation must not fail because the alarm could not be set. */
144
+ }
145
+ }
146
+ /** Later SSE pulls persist after the request turn has released this lock. */
147
+ persist() {
148
+ return this.enqueue(() => this.writeSnapshot());
149
+ }
150
+ /** Claims and completions are serialized; external notification delivery never holds the inbox turn. */
151
+ runNotifications() {
152
+ if (this.notifications)
153
+ return this.notifications;
154
+ this.notifications = (async () => {
155
+ for (;;) {
156
+ const attempt = await this.enqueue(async () => {
157
+ this.relay.evictExpired();
158
+ const next = this.relay.claimWakeNotification();
159
+ await this.writeSnapshot();
160
+ return next;
161
+ });
162
+ if (!attempt)
163
+ return;
164
+ const delivered = await this.relay.deliverWakeNotification(attempt);
165
+ await this.enqueue(async () => {
166
+ this.relay.completeWakeNotification(attempt, delivered);
167
+ await this.writeSnapshot();
168
+ });
169
+ }
170
+ })().finally(() => { this.notifications = undefined; });
171
+ return this.notifications;
172
+ }
173
+ scheduleNotifications() {
174
+ const work = this.runNotifications();
175
+ this.state.waitUntil?.(work);
176
+ // A failed storage turn is retried on the next request/alarm, without failing an admitted POST.
177
+ void work.catch(() => { });
178
+ }
179
+ async alarm() {
180
+ await this.ready;
181
+ await this.enqueue(() => this.writeSnapshot());
182
+ await this.runNotifications();
183
+ }
184
+ async fetch(request) {
185
+ await this.ready;
186
+ if (this.longPollWait(request) !== undefined)
187
+ return this.handleLongPoll(request);
188
+ return this.enqueue(() => this.handle(request));
189
+ }
190
+ /** Positive waitMs on GET /envelopes. Invalid values stay on the normal handler path. */
191
+ longPollWait(request) {
192
+ if (request.method !== 'GET')
193
+ return undefined;
194
+ const url = new URL(request.url);
195
+ const path = canonicalRelayPath(url.pathname);
196
+ if ((path !== '/envelopes' && !path.startsWith('/inbox/')) ||
197
+ !url.searchParams.has('waitMs'))
198
+ return undefined;
199
+ const ms = Number(url.searchParams.get('waitMs'));
200
+ if (!Number.isFinite(ms) || ms <= 0)
201
+ return undefined;
202
+ return ms;
203
+ }
204
+ emptyPoll() {
205
+ return Response.json({ envelopes: [] }, { headers: relayHttpHeaders('json') });
206
+ }
207
+ /**
208
+ * Authenticate and pop inside the mutation turn, then release that turn while
209
+ * relay.wait is pending so a POST can wake the poll.
210
+ */
211
+ async handleLongPoll(request) {
212
+ const opened = await this.enqueue(() => this.openLongPoll(request));
213
+ if (opened.mode === 'response')
214
+ return opened.response;
215
+ await this.relay.wait(opened.recipient, opened.waitMs, request.signal, opened.filter);
216
+ // send() wakes wait before the POST snapshot finishes. A disconnect in that gap must not dequeue.
217
+ if (request.signal.aborted)
218
+ return this.emptyPoll();
219
+ return this.enqueue(() => this.finishLongPoll(opened.receive, request.signal));
220
+ }
221
+ async openLongPoll(request) {
222
+ const started = beginDurableLongPoll(this.relay, request);
223
+ if (started.mode === 'response') {
224
+ if (started.response.ok)
225
+ await this.writeSnapshot();
226
+ return started;
227
+ }
228
+ await this.writeSnapshot();
229
+ return started;
230
+ }
231
+ async finishLongPoll(receive, signal) {
232
+ // Abort can land while this turn waits behind the POST storage.put.
233
+ if (signal.aborted)
234
+ return this.emptyPoll();
235
+ const envelopes = [];
236
+ try {
237
+ let envelope;
238
+ while ((envelope = receive()))
239
+ envelopes.push(envelope);
240
+ }
241
+ catch (error) {
242
+ return relayErrorResponse(error, this.relay);
243
+ }
244
+ await this.writeSnapshot();
245
+ return Response.json({ envelopes }, { headers: relayHttpHeaders('json') });
246
+ }
247
+ async handle(request) {
248
+ const response = await this.handler(request);
249
+ const path = canonicalRelayPath(new URL(request.url).pathname);
250
+ if (!response.ok)
251
+ return response;
252
+ if (request.method === 'GET' && path === '/stream' && response.body) {
253
+ await this.writeSnapshot();
254
+ const reader = response.body.getReader();
255
+ const persist = () => this.persist();
256
+ return new Response(new ReadableStream({
257
+ async pull(controller) {
258
+ const { value, done } = await reader.read();
259
+ if (done)
260
+ controller.close();
261
+ else {
262
+ await persist();
263
+ controller.enqueue(value);
264
+ }
265
+ },
266
+ async cancel() {
267
+ await reader.cancel();
268
+ },
269
+ }), { status: response.status, headers: response.headers });
270
+ }
271
+ if ((request.method === 'POST' && ['/agents', '/envelopes'].includes(path)) ||
272
+ (request.method === 'DELETE' &&
273
+ (path === '/envelopes' || path.startsWith('/envelopes/'))) ||
274
+ (request.method === 'GET' && (path === '/envelopes' || path.startsWith('/inbox/'))) ||
275
+ this.persistedVersion !== this.relay.mutationVersion)
276
+ await this.writeSnapshot();
277
+ this.scheduleNotifications();
278
+ return response;
279
+ }
280
+ }
281
+ export const DEFAULT_RATE_LIMIT_MAX = 300;
282
+ export const DEFAULT_RATE_LIMIT_WINDOW_MS = 60_000;
283
+ const buckets = new Map();
284
+ /** Test hook. Production isolates keep this map for the life of the isolate. */
285
+ export function resetRelayRateLimits() {
286
+ buckets.clear();
287
+ }
288
+ function envString(env, key) {
289
+ const value = env?.[key];
290
+ return typeof value === 'string' ? value : undefined;
291
+ }
292
+ function envInt(env, key, fallback) {
293
+ const value = envString(env, key);
294
+ if (value === undefined || value === '')
295
+ return fallback;
296
+ const parsed = Number(value);
297
+ return Number.isSafeInteger(parsed) && parsed >= 1 ? parsed : fallback;
298
+ }
299
+ /** CF-Connecting-IP wins. X-Forwarded-For is only a fallback for local tests. */
300
+ export function clientIp(request) {
301
+ const cf = request.headers.get('cf-connecting-ip')?.trim();
302
+ if (cf)
303
+ return cf;
304
+ const forwarded = request.headers.get('x-forwarded-for');
305
+ if (forwarded) {
306
+ const first = forwarded.split(',')[0]?.trim();
307
+ if (first)
308
+ return first;
309
+ }
310
+ return 'unknown';
311
+ }
312
+ function rateBucket(method, path) {
313
+ if (path === '/wake' || path === '/delivery-status')
314
+ return 'notifications';
315
+ if (method === 'POST' && path === '/envelopes')
316
+ return 'post-envelope';
317
+ if (method === 'GET' && (path === '/envelopes' || path.startsWith('/inbox/')))
318
+ return 'get-envelope';
319
+ if (method === 'POST' && path === '/agents')
320
+ return 'post-agent';
321
+ return undefined;
322
+ }
323
+ function slidingWindow(key, max, windowMs, now) {
324
+ const fresh = (buckets.get(key) ?? []).filter((stamp) => now - stamp < windowMs);
325
+ if (fresh.length >= max) {
326
+ buckets.set(key, fresh);
327
+ const retryAfterSeconds = Math.max(1, Math.ceil((fresh[0] + windowMs - now) / 1000));
328
+ return { allowed: false, retryAfterSeconds };
329
+ }
330
+ fresh.push(now);
331
+ buckets.set(key, fresh);
332
+ if (buckets.size > 20000) {
333
+ const oldest = buckets.keys().next().value;
334
+ if (oldest !== undefined)
335
+ buckets.delete(oldest);
336
+ }
337
+ return { allowed: true, retryAfterSeconds: 0 };
338
+ }
339
+ function tooMany(retryAfterSeconds) {
340
+ return Response.json({ error: 'RATE_LIMITED' }, {
341
+ status: 429,
342
+ headers: { ...relayHttpHeaders('json'), 'retry-after': String(retryAfterSeconds) },
343
+ });
344
+ }
345
+ async function applyRateLimit(request, env, bucket) {
346
+ const ip = clientIp(request);
347
+ const decision = slidingWindow(bucket + '\n' + ip, envInt(env, 'ACP_RATE_LIMIT_MAX', DEFAULT_RATE_LIMIT_MAX), envInt(env, 'ACP_RATE_LIMIT_WINDOW_MS', DEFAULT_RATE_LIMIT_WINDOW_MS), Date.now());
348
+ if (!decision.allowed)
349
+ return tooMany(decision.retryAfterSeconds);
350
+ const limiter = env?.RATE_LIMITER;
351
+ if (!limiter)
352
+ return undefined;
353
+ try {
354
+ const result = await limiter.limit({ key: ip + ':' + bucket });
355
+ if (!result.success)
356
+ return tooMany(60);
357
+ }
358
+ catch {
359
+ return Response.json({ error: 'RATE_LIMITER_UNAVAILABLE' }, { status: 503, headers: relayHttpHeaders('json') });
360
+ }
361
+ return undefined;
362
+ }
363
+ function recipientOf(value) {
364
+ if (!value || typeof value !== 'object')
365
+ return undefined;
366
+ const payload = value.payload;
367
+ if (!payload || typeof payload !== 'object')
368
+ return undefined;
369
+ const did = payload.recipientDid;
370
+ return typeof did === 'string' ? did : undefined;
371
+ }
372
+ async function readBody(request, limit) {
373
+ if (Number(request.headers.get('content-length')) > limit)
374
+ throw new Error('BODY_TOO_LARGE');
375
+ const reader = request.body?.getReader();
376
+ if (!reader)
377
+ throw new Error('MISSING_BODY');
378
+ const chunks = [];
379
+ let size = 0;
380
+ try {
381
+ while (true) {
382
+ const { value, done } = await reader.read();
383
+ if (done)
384
+ break;
385
+ size += value.byteLength;
386
+ if (size > limit) {
387
+ await reader.cancel();
388
+ throw new Error('BODY_TOO_LARGE');
389
+ }
390
+ chunks.push(value);
391
+ }
392
+ }
393
+ finally {
394
+ reader.releaseLock();
395
+ }
396
+ return Buffer.concat(chunks).toString('utf8');
397
+ }
398
+ function forward(request, body) {
399
+ const url = new URL(request.url);
400
+ url.pathname = canonicalRelayPath(url.pathname);
401
+ if (body === undefined)
402
+ return new Request(url, request);
403
+ return new Request(url, { method: request.method, headers: request.headers, body });
404
+ }
405
+ function inboxRoutes(method, path) {
406
+ if (path === '/wake' || path === '/delivery-status')
407
+ return true;
408
+ if (method === 'POST' && path === '/envelopes')
409
+ return true;
410
+ if (method === 'GET' &&
411
+ (path === '/envelopes' || path === '/stream' || path.startsWith('/inbox/')))
412
+ return true;
413
+ return method === 'DELETE' && (path === '/envelopes' || path.startsWith('/envelopes/'));
414
+ }
415
+ const localHandler = createRelayFetchHandler();
416
+ export async function handleRelayEdge(request, env) {
417
+ const url = new URL(request.url);
418
+ const path = canonicalRelayPath(url.pathname);
419
+ if (request.method === 'GET' && path === '/health')
420
+ return Response.json({ status: 'ok' }, { headers: relayHttpHeaders('json') });
421
+ const bucket = rateBucket(request.method, path);
422
+ if (bucket) {
423
+ const limited = await applyRateLimit(request, env, bucket);
424
+ if (limited)
425
+ return limited;
426
+ }
427
+ if (!env?.RELAY)
428
+ return localHandler(request);
429
+ try {
430
+ if (!inboxRoutes(request.method, path))
431
+ return env.RELAY.get(env.RELAY.idFromName('registry')).fetch(forward(request));
432
+ let body;
433
+ let recipient = '';
434
+ if (request.method === 'POST' && path === '/envelopes') {
435
+ body = await readBody(request, envInt(env, 'ACP_MAX_ENVELOPE_BYTES', DEFAULT_MAX_ENVELOPE_BYTES));
436
+ let parsed;
437
+ try {
438
+ parsed = JSON.parse(body);
439
+ }
440
+ catch {
441
+ throw new Error('INVALID_ENVELOPE');
442
+ }
443
+ recipient = recipientOf(parsed) ?? '';
444
+ }
445
+ else
446
+ recipient = inboxRecipientFromRequest(path, url) ?? url.searchParams.get('recipient') ?? '';
447
+ // Validate before idFromName so a missing or forged DID cannot mint an object.
448
+ resolveDid(recipient);
449
+ return env.RELAY.get(env.RELAY.idFromName('inbox:' + recipient)).fetch(forward(request, body));
450
+ }
451
+ catch (error) {
452
+ return relayErrorResponse(error);
453
+ }
454
+ }
455
+ export default {
456
+ fetch(request, env) {
457
+ return handleRelayEdge(request, env);
458
+ },
459
+ };
460
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { AgentCard, Task, Message, Artifact } from '@a2a-js/sdk';
2
+ import type { KeyPair, SignedEnvelope, State } from '@acp/core';
3
+ export type { AgentCard, Task, Message, Artifact } from '@a2a-js/sdk';
4
+ export declare function agentCard(name: string, url: string): AgentCard;
5
+ export declare function a2aTask(taskId: string, state: State, data?: Record<string, unknown>): Task;
6
+ export declare function a2aMessage(taskId: string, messageId: string, data: Record<string, unknown>): Message;
7
+ export declare function wrapA2A(wire: Task | Message | Artifact, taskId: string, recipientDid: string, seq: number, key: KeyPair): SignedEnvelope;
8
+ export declare function unwrapA2A(envelope: SignedEnvelope, recipientDid: string): Task | Message | Artifact;
@@ -0,0 +1,69 @@
1
+ import { signEnvelope, verifyEnvelope } from '../../core/dist/index.js';
2
+ export function agentCard(name, url) {
3
+ return {
4
+ name,
5
+ description: 'Sealbridge owner gateway',
6
+ url,
7
+ version: '0.2.0',
8
+ protocolVersion: '0.3.0',
9
+ capabilities: { streaming: false },
10
+ defaultInputModes: ['application/json'],
11
+ defaultOutputModes: ['application/json'],
12
+ skills: [
13
+ {
14
+ id: 'acp-task',
15
+ name: 'Contract-bound collaboration',
16
+ description: 'Signed contracts and capability-constrained execution',
17
+ tags: ['acp'],
18
+ },
19
+ ],
20
+ };
21
+ }
22
+ const states = {
23
+ PROPOSED: 'submitted',
24
+ ACCEPTED: 'submitted',
25
+ IN_PROGRESS: 'working',
26
+ DELIVERED: 'input-required',
27
+ VERIFY_ACCEPT: 'input-required',
28
+ VERIFY_REJECT: 'rejected',
29
+ SETTLED: 'completed',
30
+ CANCELLED: 'canceled',
31
+ DISPUTED: 'input-required',
32
+ };
33
+ export function a2aTask(taskId, state, data) {
34
+ return {
35
+ kind: 'task',
36
+ id: taskId,
37
+ contextId: taskId,
38
+ status: { state: states[state] },
39
+ ...(data
40
+ ? { artifacts: [{ artifactId: taskId + '-report', parts: [{ kind: 'data', data }] }] }
41
+ : {}),
42
+ };
43
+ }
44
+ export function a2aMessage(taskId, messageId, data) {
45
+ return {
46
+ kind: 'message',
47
+ messageId,
48
+ taskId,
49
+ contextId: taskId,
50
+ role: 'agent',
51
+ parts: [{ kind: 'data', data }],
52
+ };
53
+ }
54
+ export function wrapA2A(wire, taskId, recipientDid, seq, key) {
55
+ return signEnvelope({ taskId, recipientDid, seq, eventType: 'A2A', payload: wire }, key);
56
+ }
57
+ export function unwrapA2A(envelope, recipientDid) {
58
+ if (!verifyEnvelope(envelope, recipientDid) || envelope.payload.eventType !== 'A2A')
59
+ throw new Error('INVALID_A2A_ENVELOPE');
60
+ const p = envelope.payload.payload;
61
+ if (!p || typeof p !== 'object' || (!('kind' in p) && !('artifactId' in p)))
62
+ throw new Error('INVALID_A2A_WIRE');
63
+ if ('kind' in p && p.kind === 'task' && (p.id !== envelope.payload.taskId || !p.status))
64
+ throw new Error('INVALID_A2A_TASK');
65
+ if ('kind' in p && p.kind === 'message' && p.taskId !== envelope.payload.taskId)
66
+ throw new Error('INVALID_A2A_MESSAGE');
67
+ return p;
68
+ }
69
+ //# sourceMappingURL=a2a.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a.js","sourceRoot":"","sources":["../src/a2a.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { AgentSkill, Json, TaskManifest } from '@acp/core';
2
+ import type { SandboxBoundaryMetadata } from '@acp/sandbox';
3
+ export interface UsageMetrics {
4
+ inputTokens: number;
5
+ outputTokens: number;
6
+ totalTokens: number;
7
+ toolCalls: number;
8
+ wallTimeMs: number;
9
+ }
10
+ export interface ProgressMetrics {
11
+ inputTokens?: number;
12
+ outputTokens?: number;
13
+ toolInvocations?: number;
14
+ elapsedMs?: number;
15
+ }
16
+ export interface ProgressPayload {
17
+ percent?: number;
18
+ step: string;
19
+ message?: string;
20
+ metrics?: ProgressMetrics;
21
+ }
22
+ export interface ProtocolEnvelope<T> {
23
+ taskId: string;
24
+ seq: number;
25
+ eventType: string;
26
+ senderDid: string;
27
+ recipientDid: string;
28
+ payload: T;
29
+ }
30
+ export interface AgentTaskContext {
31
+ taskId: string;
32
+ manifest: TaskManifest;
33
+ input: Json;
34
+ callTool: (tool: string, args: Json) => Promise<Json>;
35
+ reportUsage: (delta: Partial<UsageMetrics>) => void;
36
+ reportProgress?: (progress: ProgressPayload) => void | Promise<void>;
37
+ signal: AbortSignal;
38
+ workspaceDir: string;
39
+ /**
40
+ * Host-reported isolation. `level` is the path that ran (`subprocess_restricted`
41
+ * or `oci_container`), not a label chosen by task code. `boundary` is set by
42
+ * the sandbox runner: Node's permission model does not set `kernelNetworkIsolated`.
43
+ */
44
+ reportIsolation?: (level: string, boundary?: SandboxBoundaryMetadata) => void;
45
+ }
46
+ export interface AgentAdapter {
47
+ id: string;
48
+ name: string;
49
+ skills: AgentSkill[];
50
+ executeTask(context: AgentTaskContext): Promise<Json>;
51
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":""}