@creatornader/agent-bridge 0.2.0 → 0.3.1

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 (115) hide show
  1. package/CHANGELOG.md +86 -4
  2. package/README.md +567 -55
  3. package/ROADMAP.md +114 -0
  4. package/SECURITY.md +90 -0
  5. package/SKILL.md +68 -2
  6. package/bin/agent-bridge +2 -2
  7. package/clients/claude-desktop.json +3 -1
  8. package/dist/archive.d.ts +163 -0
  9. package/dist/archive.js +50 -0
  10. package/dist/archive.js.map +1 -0
  11. package/dist/bridge-domain-CBX3IVqC.d.ts +153 -0
  12. package/dist/{bridge-service-CfqMcMAn.d.ts → bridge-service-hX1ZQp4W.d.ts} +15 -5
  13. package/dist/bridge-store-DPVSCwfs.d.ts +102 -0
  14. package/dist/bridge.d.ts +76 -17
  15. package/dist/bridge.js +52 -24
  16. package/dist/chunk-2DFNOLMO.js +618 -0
  17. package/dist/chunk-2DFNOLMO.js.map +1 -0
  18. package/dist/{chunk-KVR4JBRF.js → chunk-2EVLG3YA.js} +2 -2
  19. package/dist/{chunk-KVR4JBRF.js.map → chunk-2EVLG3YA.js.map} +1 -1
  20. package/dist/chunk-45BZGB77.js +709 -0
  21. package/dist/chunk-45BZGB77.js.map +1 -0
  22. package/dist/chunk-4VB44KJU.js +230 -0
  23. package/dist/chunk-4VB44KJU.js.map +1 -0
  24. package/dist/chunk-5GMB3A77.js +1013 -0
  25. package/dist/chunk-5GMB3A77.js.map +1 -0
  26. package/dist/chunk-A6W4QALF.js +1258 -0
  27. package/dist/chunk-A6W4QALF.js.map +1 -0
  28. package/dist/chunk-BZLMF5O5.js +328 -0
  29. package/dist/chunk-BZLMF5O5.js.map +1 -0
  30. package/dist/{chunk-AXL2I7FH.js → chunk-CEXBMOI5.js} +240 -79
  31. package/dist/chunk-CEXBMOI5.js.map +1 -0
  32. package/dist/chunk-GADH244D.js +527 -0
  33. package/dist/chunk-GADH244D.js.map +1 -0
  34. package/dist/chunk-MBPZXTJA.js +2428 -0
  35. package/dist/chunk-MBPZXTJA.js.map +1 -0
  36. package/dist/chunk-NCO7RLBM.js +146 -0
  37. package/dist/chunk-NCO7RLBM.js.map +1 -0
  38. package/dist/chunk-Q6PPMXJC.js +1050 -0
  39. package/dist/chunk-Q6PPMXJC.js.map +1 -0
  40. package/dist/{chunk-4KAOBC5X.js → chunk-SPSMZOCJ.js} +190 -165
  41. package/dist/chunk-SPSMZOCJ.js.map +1 -0
  42. package/dist/chunk-UAHMP6GC.js +54 -0
  43. package/dist/chunk-UAHMP6GC.js.map +1 -0
  44. package/dist/{chunk-YD6YJATN.js → chunk-VOQIDTCJ.js} +4 -2
  45. package/dist/chunk-VOQIDTCJ.js.map +1 -0
  46. package/dist/chunk-WAI2IYIQ.js +554 -0
  47. package/dist/chunk-WAI2IYIQ.js.map +1 -0
  48. package/dist/cli.d.ts +2 -1
  49. package/dist/cli.js +3555 -214
  50. package/dist/cli.js.map +1 -1
  51. package/dist/client-config.d.ts +1 -1
  52. package/dist/client-config.js +1 -1
  53. package/dist/client-runtime.d.ts +10 -6
  54. package/dist/client-runtime.js +9 -6
  55. package/dist/contracts/generate.d.ts +2 -0
  56. package/dist/contracts/generate.js +247 -0
  57. package/dist/contracts/generate.js.map +1 -0
  58. package/dist/dr.d.ts +324 -0
  59. package/dist/dr.js +124 -0
  60. package/dist/dr.js.map +1 -0
  61. package/dist/gateway-CggQ8vTC.d.ts +78 -0
  62. package/dist/gateway-main.js +190 -8
  63. package/dist/gateway-main.js.map +1 -1
  64. package/dist/gateway.d.ts +4 -3
  65. package/dist/gateway.js +4 -3
  66. package/dist/index.js +11 -8
  67. package/dist/index.js.map +1 -1
  68. package/dist/postgres-bridge-store-Bfd3hRId.d.ts +49 -0
  69. package/dist/server.d.ts +3 -2
  70. package/dist/server.js +13 -8
  71. package/dist/sqlite.d.ts +94 -12
  72. package/dist/sqlite.js +7 -4
  73. package/docs/architecture-v2.md +394 -0
  74. package/docs/decisions/0001-protocol-layers-and-acknowledgment-semantics.md +85 -0
  75. package/docs/decisions/0002-canonical-operation-contract-registry.md +46 -0
  76. package/docs/decisions/0003-host-adapters-and-consumer-instance-keys.md +88 -0
  77. package/docs/ecosystem.md +86 -0
  78. package/docs/postmortems/2026-07-08-wrapper-source-drift.md +82 -0
  79. package/docs/troubleshooting.md +89 -0
  80. package/llms.txt +107 -6
  81. package/openapi/agent-bridge-v2.openapi.json +9610 -0
  82. package/package.json +24 -4
  83. package/schemas/agent-bridge-v2.capabilities.json +1829 -0
  84. package/schemas/agent-bridge-v2.mcp.json +2074 -0
  85. package/schemas/agent-bridge-v2.schema.json +4560 -0
  86. package/sql/migrations/008_message_projects.sql +36 -0
  87. package/sql/migrations/009_mailbox_query_indexes.sql +28 -0
  88. package/sql/migrations/010_publisher_delivery_policy.sql +210 -0
  89. package/sql/migrations/011_credential_security.sql +875 -0
  90. package/sql/migrations/012_request_authority.sql +177 -0
  91. package/sql/migrations/013_row_isolation.sql +495 -0
  92. package/sql/migrations/014_owner_control_plane.sql +1641 -0
  93. package/sql/migrations/015_portable_archives.sql +1813 -0
  94. package/sql/migrations/016_native_dr_fence.sql +1005 -0
  95. package/bin/CLAUDE.md +0 -11
  96. package/dist/bridge-domain-BcnBeHOn.d.ts +0 -97
  97. package/dist/bridge-store-BuGjxTn4.d.ts +0 -61
  98. package/dist/chunk-4KAOBC5X.js.map +0 -1
  99. package/dist/chunk-6MAZ6YLZ.js +0 -146
  100. package/dist/chunk-6MAZ6YLZ.js.map +0 -1
  101. package/dist/chunk-AXL2I7FH.js.map +0 -1
  102. package/dist/chunk-BV6W4AJK.js +0 -211
  103. package/dist/chunk-BV6W4AJK.js.map +0 -1
  104. package/dist/chunk-CKSKUBDQ.js +0 -153
  105. package/dist/chunk-CKSKUBDQ.js.map +0 -1
  106. package/dist/chunk-JOUBDRYX.js +0 -272
  107. package/dist/chunk-JOUBDRYX.js.map +0 -1
  108. package/dist/chunk-JTC5YURG.js +0 -49
  109. package/dist/chunk-JTC5YURG.js.map +0 -1
  110. package/dist/chunk-O26W5QHS.js +0 -409
  111. package/dist/chunk-O26W5QHS.js.map +0 -1
  112. package/dist/chunk-WEULPMUY.js +0 -988
  113. package/dist/chunk-WEULPMUY.js.map +0 -1
  114. package/dist/chunk-YD6YJATN.js.map +0 -1
  115. package/dist/gateway-BULozv3K.d.ts +0 -54
@@ -1,8 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
+ assertIdempotentReplay
4
+ } from "./chunk-VOQIDTCJ.js";
5
+ import {
6
+ ContractResponseError,
7
+ PROTOCOL_HEADER,
8
+ PROTOCOL_VERSION,
9
+ SUPPORTED_PROTOCOL_HEADER,
10
+ SUPPORTED_PROTOCOL_VERSIONS,
11
+ parseResponse
12
+ } from "./chunk-GADH244D.js";
13
+ import {
14
+ cursorScope,
3
15
  decodeCursor,
4
16
  encodeCursor
5
- } from "./chunk-BV6W4AJK.js";
17
+ } from "./chunk-BZLMF5O5.js";
6
18
 
7
19
  // src/legacy-compat.ts
8
20
  function legacyMessageIdFromSequence(value) {
@@ -49,7 +61,7 @@ function legacyContextMetadata(message) {
49
61
  target_agents: message.targets,
50
62
  payload_mime: message.contentType
51
63
  };
52
- if (message.workspace !== "*") envelope.project = message.workspace;
64
+ if (message.project) envelope.project = message.project;
53
65
  if (message.threadId) envelope.thread_id = message.threadId;
54
66
  if (message.replyToId) envelope.reply_to_id = message.replyToId;
55
67
  if (message.correlationId) envelope.correlation_id = message.correlationId;
@@ -77,7 +89,13 @@ function messageId(row) {
77
89
  function isVisible(row, principal, query) {
78
90
  const envelope = row.metadata?.message_envelope;
79
91
  const targets = Array.isArray(envelope?.target_agents) ? envelope.target_agents : [];
80
- if (targets.length && !targets.includes(principal.agent)) return false;
92
+ const inbox = !targets.length || targets.includes(principal.agent);
93
+ const sent = row.source === principal.agent;
94
+ const mailbox = query.mailbox ?? "inbox";
95
+ if (mailbox === "inbox" && !inbox) return false;
96
+ if (query.mailbox === "sent" && !sent) return false;
97
+ if (query.mailbox === "all" && !inbox && !sent) return false;
98
+ if (!["inbox", "sent", "all"].includes(mailbox) && !inbox) return false;
81
99
  const type = envelope?.kind ?? row.category;
82
100
  if (query.types?.length && !query.types.includes(type)) return false;
83
101
  if (query.threadId && envelope?.thread_id !== query.threadId) return false;
@@ -90,7 +108,8 @@ function asMessage(row, principal) {
90
108
  return {
91
109
  id: messageId(row),
92
110
  sequence: String(row.id),
93
- workspace: row.project ?? principal.workspace,
111
+ workspace: principal.workspace,
112
+ project: row.project ?? void 0,
94
113
  source: row.source,
95
114
  type: envelope?.kind ?? row.category,
96
115
  content: row.content,
@@ -107,6 +126,7 @@ function asMessage(row, principal) {
107
126
  atribReceiptId: row.atrib_receipt_id ?? envelope?.atrib_receipt_id,
108
127
  informedBy: envelope?.informed_by,
109
128
  metadata: row.metadata,
129
+ deliveryPolicy: { mode: "mailbox" },
110
130
  createdAt: row.created_at
111
131
  };
112
132
  }
@@ -124,7 +144,8 @@ var LegacySupabaseRestStore = class {
124
144
  throw new Error("Agent Bridge requires HTTPS for non-loopback legacy providers");
125
145
  }
126
146
  }
127
- async initialize() {
147
+ async initialize(options = {}) {
148
+ if (options.mode === "passive") return;
128
149
  if (this.initialized) return;
129
150
  await this.request("/shared_context?select=id&limit=1");
130
151
  this.initialized = true;
@@ -155,51 +176,70 @@ var LegacySupabaseRestStore = class {
155
176
  throw new LegacySupabaseError(0, "network_error");
156
177
  }
157
178
  }
179
+ async visibleReceiptIds(entryIds, principal) {
180
+ if (!entryIds.length || entryIds.length > 200) {
181
+ throw new Error("legacy receipt IDs must contain between 1 and 200 entries");
182
+ }
183
+ const uniqueIds = [...new Set(entryIds)];
184
+ const rows = await this.request(
185
+ `/shared_context?select=id,source,metadata&id=in.(${uniqueIds.join(",")})`
186
+ );
187
+ const visible = new Set(
188
+ Array.isArray(rows) ? rows.filter((row) => isVisible(row, principal, { mailbox: "inbox" })).map((row) => String(row.id)) : []
189
+ );
190
+ return entryIds.filter((entryId) => visible.has(entryId));
191
+ }
158
192
  async insertMessage(input) {
159
193
  if (input.idempotencyKey) {
160
194
  throw new Error(
161
195
  "legacy Supabase mode cannot enforce idempotency keys; migrate to shared mode"
162
196
  );
163
197
  }
164
- const lookup = encodeURIComponent(
165
- JSON.stringify({ message_envelope: { message_id: input.id } })
166
- );
167
- const existing = await this.request(
168
- `/shared_context?metadata=cs.${lookup}&order=id.asc&limit=1`
169
- );
170
- if (existing[0]) {
171
- this.legacyIds.set(messageId(existing[0]), String(existing[0].id));
172
- return { created: false, message: asMessage(existing[0], { workspace: input.workspace, agent: input.source }) };
198
+ if (input.deliveryPolicy?.mode === "leased") {
199
+ throw Object.assign(new Error("leased delivery policy is not supported in legacy mode"), { code: "delivery_not_supported", status: 400 });
173
200
  }
174
201
  const existingMetadata = input.metadata && typeof input.metadata === "object" && !Array.isArray(input.metadata) ? input.metadata : {};
175
202
  const existingEnvelope = existingMetadata.message_envelope && typeof existingMetadata.message_envelope === "object" ? existingMetadata.message_envelope : {};
203
+ const storedMetadata = JSON.parse(JSON.stringify({
204
+ ...existingMetadata,
205
+ message_envelope: {
206
+ ...existingEnvelope,
207
+ schema: "agent-bridge.message-envelope.v1",
208
+ message_id: input.id,
209
+ source_agent: input.source,
210
+ kind: input.type,
211
+ payload_mime: input.contentType,
212
+ payload: input.data,
213
+ target_agents: input.targets,
214
+ thread_id: input.threadId,
215
+ reply_to_id: input.replyToId,
216
+ correlation_id: input.correlationId,
217
+ causation_id: input.causationId,
218
+ expires_at: input.expiresAt,
219
+ informed_by: input.informedBy
220
+ }
221
+ }));
176
222
  const body = {
177
223
  source: input.source,
178
224
  category: input.type,
179
225
  content: input.content,
180
226
  priority: input.priority,
181
- project: input.workspace === "*" ? null : input.workspace,
182
- metadata: {
183
- ...existingMetadata,
184
- message_envelope: {
185
- ...existingEnvelope,
186
- schema: "agent-bridge.message-envelope.v1",
187
- message_id: input.id,
188
- source_agent: input.source,
189
- kind: input.type,
190
- payload_mime: input.contentType,
191
- payload: input.data,
192
- target_agents: input.targets,
193
- thread_id: input.threadId,
194
- reply_to_id: input.replyToId,
195
- correlation_id: input.correlationId,
196
- causation_id: input.causationId,
197
- expires_at: input.expiresAt,
198
- informed_by: input.informedBy
199
- }
200
- },
227
+ project: input.project ?? null,
228
+ metadata: storedMetadata,
201
229
  atrib_receipt_id: input.atribReceiptId
202
230
  };
231
+ const lookup = encodeURIComponent(
232
+ JSON.stringify({ message_envelope: { message_id: input.id } })
233
+ );
234
+ const existing = await this.request(
235
+ `/shared_context?metadata=cs.${lookup}&order=id.asc&limit=1`
236
+ );
237
+ if (existing[0]) {
238
+ const message = asMessage(existing[0], { workspace: input.workspace, agent: input.source });
239
+ assertIdempotentReplay(message, { ...input, metadata: storedMetadata });
240
+ this.legacyIds.set(message.id, String(existing[0].id));
241
+ return { created: false, message };
242
+ }
203
243
  const rows = await this.request("/shared_context", {
204
244
  method: "POST",
205
245
  body: JSON.stringify(body)
@@ -213,19 +253,21 @@ var LegacySupabaseRestStore = class {
213
253
  }
214
254
  async listMessages(principal, query = {}) {
215
255
  const limit = query.limit ?? 50;
216
- let after = decodeCursor(query.cursor) ?? "0";
256
+ const scope = cursorScope(principal, query);
257
+ let after = decodeCursor(query.cursor, scope) ?? "0";
217
258
  let before;
218
259
  let latestCursor;
219
260
  const messages = [];
220
261
  while (messages.length < limit) {
221
262
  const batchLimit = Math.min(Math.max(limit * 2, 50), 200);
222
- const workspaceFilter = principal.workspace === "*" ? "" : `&project=eq.${encodeURIComponent(principal.workspace)}`;
223
- const sourceFilter = query.source ? `&source=eq.${encodeURIComponent(query.source)}` : "";
263
+ const workspaceFilter = query.project ? `&project=eq.${encodeURIComponent(query.project)}` : "";
264
+ const effectiveSource = query.source ?? (query.mailbox === "sent" ? principal.agent : void 0);
265
+ const sourceFilter = effectiveSource ? `&source=eq.${encodeURIComponent(effectiveSource)}` : "";
224
266
  const sinceFilter = query.since ? `&created_at=gte.${encodeURIComponent(query.since)}` : "";
225
- const unacknowledgedFilter = query.unacknowledgedBy ? `&acked_by=not.cs.%7B${encodeURIComponent(query.unacknowledgedBy)}%7D` : "";
267
+ const receiptFilter = query.receiptState === "unread" ? `&acked_by=not.cs.%7B${encodeURIComponent(principal.agent)}%7D` : query.receiptState === "read" ? `&acked_by=cs.%7B${encodeURIComponent(principal.agent)}%7D` : "";
226
268
  const cursorFilter = query.latest ? before ? `&id=lt.${encodeURIComponent(before)}` : "" : `&id=gt.${encodeURIComponent(after)}`;
227
269
  const rows = await this.request(
228
- `/shared_context?select=*${cursorFilter}${workspaceFilter}${sourceFilter}${sinceFilter}${unacknowledgedFilter}&order=id.${query.latest ? "desc" : "asc"}&limit=${batchLimit}`
270
+ `/shared_context?select=*${cursorFilter}${workspaceFilter}${sourceFilter}${sinceFilter}${receiptFilter}&order=id.${query.latest ? "desc" : "asc"}&limit=${batchLimit}`
229
271
  );
230
272
  if (!rows.length) break;
231
273
  if (query.latest && latestCursor === void 0) latestCursor = String(rows[0].id);
@@ -240,9 +282,12 @@ var LegacySupabaseRestStore = class {
240
282
  if (rows.length < batchLimit || messages.length === limit) break;
241
283
  }
242
284
  const next = query.latest ? latestCursor : after === "0" ? void 0 : after;
243
- return { messages, cursor: next ? encodeCursor(next) : query.cursor };
285
+ return { messages, cursor: next ? encodeCursor(next, scope) : query.cursor };
244
286
  }
245
- async recordReceipt(_workspace, ids, principal) {
287
+ async recordReceipt(principal, ids) {
288
+ if (!ids.length || ids.length > 200) {
289
+ throw new Error("message IDs must contain between 1 and 200 entries");
290
+ }
246
291
  const entryIds = await Promise.all(ids.map(async (id) => {
247
292
  const mapped = this.legacyIds.get(id);
248
293
  if (mapped) return mapped;
@@ -260,21 +305,31 @@ var LegacySupabaseRestStore = class {
260
305
  if (decodedSequence !== void 0) return decodedSequence;
261
306
  throw new LegacySupabaseError(404, "message_not_found");
262
307
  }));
308
+ const visibleIds = await this.visibleReceiptIds(entryIds, principal);
309
+ if (!visibleIds.length) return 0;
263
310
  return this.request("/rpc/ack_context", {
264
311
  method: "POST",
265
- body: JSON.stringify({ entry_ids: entryIds, agent_name: principal })
312
+ body: JSON.stringify({ entry_ids: visibleIds, agent_name: principal.agent })
266
313
  });
267
314
  }
268
315
  async recordLegacyReceipt(ids, principal) {
316
+ if (!ids.length || ids.length > 200) {
317
+ throw new Error("legacy receipt IDs must contain between 1 and 200 entries");
318
+ }
269
319
  const entryIds = ids.map((id) => {
270
320
  if (!/^\d+$/.test(id)) throw new Error("legacy receipt IDs must be numeric");
271
321
  const value = BigInt(id);
272
322
  if (value > 0x7fffffffffffffffn) throw new Error("legacy receipt ID exceeds bigint range");
273
323
  return value.toString();
274
324
  });
325
+ const visibleIds = await this.visibleReceiptIds(entryIds, {
326
+ workspace: "*",
327
+ agent: principal
328
+ });
329
+ if (!visibleIds.length) return 0;
275
330
  return this.request("/rpc/ack_context", {
276
331
  method: "POST",
277
- body: JSON.stringify({ entry_ids: entryIds, agent_name: principal })
332
+ body: JSON.stringify({ entry_ids: visibleIds, agent_name: principal })
278
333
  });
279
334
  }
280
335
  async claimDelivery(_principal, _options) {
@@ -293,15 +348,19 @@ var LegacySupabaseRestStore = class {
293
348
 
294
349
  // src/http-bridge-store.ts
295
350
  var BridgeHttpError = class extends Error {
296
- constructor(status, code) {
297
- super(`Agent Bridge request failed: ${code}`);
351
+ constructor(status, code, requestId, details, message = `Agent Bridge request failed: ${code}`) {
352
+ super(message);
298
353
  this.status = status;
299
354
  this.code = code;
355
+ this.requestId = requestId;
356
+ this.details = details;
300
357
  }
301
358
  };
302
359
  var HttpBridgeStore = class {
303
360
  constructor(options) {
304
361
  this.options = options;
362
+ this.closeController = new AbortController();
363
+ this.closed = false;
305
364
  const url = new URL(options.baseUrl);
306
365
  const loopback = url.hostname === "localhost" || url.hostname === "127.0.0.1" || url.hostname === "[::1]";
307
366
  if (url.protocol !== "https:" && !(url.protocol === "http:" && loopback) && !options.allowInsecureRemoteHttp) {
@@ -309,9 +368,10 @@ var HttpBridgeStore = class {
309
368
  }
310
369
  this.fetchImpl = options.fetch ?? fetch;
311
370
  }
312
- async initialize() {
313
- await this.request("/readyz", { authenticated: false });
314
- const status = await this.request("/v2/status");
371
+ async initialize(options = {}) {
372
+ if (options.mode === "passive") return;
373
+ await this.request(void 0, "/readyz", { authenticated: false, signal: options.signal });
374
+ const status = await this.request("status", "/v2/status", { signal: options.signal });
315
375
  this.assertBoundPrincipal(status);
316
376
  }
317
377
  assertBoundPrincipal(status) {
@@ -320,29 +380,92 @@ var HttpBridgeStore = class {
320
380
  throw new BridgeHttpError(403, "principal_mismatch");
321
381
  }
322
382
  }
323
- async request(path, options = {}) {
383
+ async request(operationId, path, options = {}) {
384
+ if (options.method === "POST" && !options.skipProtocolProbe) await this.ensureProtocol(options.signal);
385
+ if (this.closed) throw new BridgeHttpError(0, "store_closed");
386
+ if (options.signal?.aborted) throw new BridgeHttpError(0, "request_cancelled");
387
+ const requestController = new AbortController();
388
+ const abort = () => requestController.abort(this.closeController.signal.reason);
389
+ const abortRequest = () => requestController.abort(options.signal?.reason);
390
+ this.closeController.signal.addEventListener("abort", abort, { once: true });
391
+ options.signal?.addEventListener("abort", abortRequest, { once: true });
392
+ let timedOut = false;
393
+ const timeout = setTimeout(() => {
394
+ timedOut = true;
395
+ requestController.abort(new Error("request timeout"));
396
+ }, this.options.timeoutMs ?? 1e4);
397
+ timeout.unref?.();
324
398
  try {
325
- const signal = AbortSignal.timeout(this.options.timeoutMs ?? 1e4);
326
399
  const response = await this.fetchImpl(`${this.options.baseUrl.replace(/\/$/, "")}${path}`, {
327
400
  method: options.method ?? "GET",
328
- signal,
401
+ signal: requestController.signal,
329
402
  headers: {
403
+ [PROTOCOL_HEADER]: this.selectedProtocolVersion ?? PROTOCOL_VERSION,
330
404
  ...options.authenticated === false ? {} : { authorization: `Bearer ${this.options.token}` },
331
405
  ...this.options.principal.instance ? { "x-agent-bridge-instance": this.options.principal.instance } : {},
332
406
  ...options.body === void 0 ? {} : { "content-type": "application/json" }
333
407
  },
334
408
  body: options.body === void 0 ? void 0 : JSON.stringify(options.body)
335
409
  });
336
- const payload = await response.json().catch(() => ({}));
337
- if (!response.ok) throw new BridgeHttpError(response.status, payload?.error?.code ?? "request_failed");
338
- return payload;
410
+ const requestId = response.headers.get("x-request-id") ?? void 0;
411
+ const selectedHeader = response.headers.get(PROTOCOL_HEADER);
412
+ const supportedHeader = response.headers.get(SUPPORTED_PROTOCOL_HEADER);
413
+ const supportedProtocols = supportedHeader?.split(",").map((value) => value.trim()).filter(Boolean) ?? [];
414
+ const inconsistentProtocol = selectedHeader === null || supportedHeader === null || !SUPPORTED_PROTOCOL_VERSIONS.includes(selectedHeader) || !supportedProtocols.includes(selectedHeader) || selectedHeader !== PROTOCOL_VERSION;
415
+ if (operationId && inconsistentProtocol) {
416
+ throw new BridgeHttpError(502, "protocol_mismatch", requestId, {
417
+ expected: PROTOCOL_VERSION,
418
+ selected: selectedHeader,
419
+ supported: supportedHeader
420
+ });
421
+ }
422
+ const contentType = response.headers.get("content-type") ?? "";
423
+ const payload = contentType.startsWith("application/json") ? await response.json().catch(() => ({})) : await response.text();
424
+ if (!response.ok) {
425
+ const envelope = payload && typeof payload === "object" ? payload.error : void 0;
426
+ throw new BridgeHttpError(
427
+ response.status,
428
+ envelope?.code ?? "request_failed",
429
+ envelope?.requestId ?? requestId,
430
+ envelope?.details ?? envelope,
431
+ envelope?.message ?? `Agent Bridge request failed: ${envelope?.code ?? "request_failed"}`
432
+ );
433
+ }
434
+ if (operationId) this.selectedProtocolVersion = PROTOCOL_VERSION;
435
+ if (!operationId) return payload;
436
+ return parseResponse(operationId, payload);
339
437
  } catch (error) {
340
438
  if (error instanceof BridgeHttpError) throw error;
439
+ if (error instanceof ContractResponseError) {
440
+ throw new BridgeHttpError(error.status, error.code, void 0, {
441
+ operation: error.operation,
442
+ issues: error.issues
443
+ }, error.message);
444
+ }
445
+ if (this.closed) throw new BridgeHttpError(0, "store_closed");
446
+ if (options.signal?.aborted) throw new BridgeHttpError(0, "request_cancelled");
447
+ if (timedOut) throw new BridgeHttpError(504, "request_timeout");
341
448
  if (error instanceof Error && (error.name === "TimeoutError" || error.name === "AbortError")) {
342
449
  throw new BridgeHttpError(504, "request_timeout");
343
450
  }
344
451
  throw new BridgeHttpError(0, "network_error");
452
+ } finally {
453
+ clearTimeout(timeout);
454
+ this.closeController.signal.removeEventListener("abort", abort);
455
+ options.signal?.removeEventListener("abort", abortRequest);
456
+ }
457
+ }
458
+ ensureProtocol(signal) {
459
+ if (this.selectedProtocolVersion) return Promise.resolve(this.selectedProtocolVersion);
460
+ if (!this.protocolProbe) {
461
+ this.protocolProbe = this.request("status", "/v2/status", { signal, skipProtocolProbe: true }).then(() => this.selectedProtocolVersion).finally(() => {
462
+ this.protocolProbe = void 0;
463
+ });
345
464
  }
465
+ return this.protocolProbe;
466
+ }
467
+ async capabilities() {
468
+ return this.request("capabilities", "/v2/capabilities");
346
469
  }
347
470
  assertPrincipal(principal, includeInstance = true) {
348
471
  const expected = this.options.principal;
@@ -350,53 +473,86 @@ var HttpBridgeStore = class {
350
473
  throw new BridgeHttpError(403, "principal_mismatch");
351
474
  }
352
475
  }
353
- async insertMessage(message) {
476
+ async insertMessage(message, options = {}) {
354
477
  this.assertPrincipal({ workspace: message.workspace, agent: message.source }, false);
478
+ await this.ensureProtocol(options.signal);
355
479
  const { workspace: _workspace, source: _source, ...draft } = message;
356
- return this.request("/v2/messages", { method: "POST", body: draft });
480
+ return this.request("publish_message", "/v2/messages", { method: "POST", body: draft, signal: options.signal });
357
481
  }
358
- async listMessages(principal, query = {}) {
482
+ async listMessages(principal, query = {}, options = {}) {
359
483
  this.assertPrincipal(principal);
484
+ const requestQuery = query;
360
485
  const params = new URLSearchParams();
361
- if (query.cursor) params.set("cursor", query.cursor);
362
- if (query.limit) params.set("limit", String(query.limit));
363
- if (query.includeExpired) params.set("includeExpired", "true");
364
- if (query.source) params.set("source", query.source);
365
- if (query.since) params.set("since", query.since);
366
- if (query.unacknowledgedBy) params.set("unacknowledgedBy", query.unacknowledgedBy);
367
- if (query.threadId) params.set("threadId", query.threadId);
368
- if (query.latest) params.set("latest", "true");
369
- for (const type of query.types ?? []) params.append("type", type);
370
- return this.request(`/v2/history${params.size ? `?${params}` : ""}`);
371
- }
372
- async recordReceipt(workspace, ids, principal) {
373
- this.assertPrincipal({ workspace, agent: principal }, false);
374
- return (await this.request("/v2/receipts", { method: "POST", body: { messageIds: ids } })).recorded;
486
+ if (requestQuery.cursor) params.set("cursor", requestQuery.cursor);
487
+ if (requestQuery.mailbox) params.set("mailbox", requestQuery.mailbox);
488
+ if (requestQuery.receiptState) params.set("receiptState", requestQuery.receiptState);
489
+ if (requestQuery.limit) params.set("limit", String(requestQuery.limit));
490
+ if (requestQuery.includeExpired) params.set("includeExpired", "true");
491
+ if (requestQuery.source) params.set("source", requestQuery.source);
492
+ if (requestQuery.project) params.set("project", requestQuery.project);
493
+ if (requestQuery.since) params.set("since", requestQuery.since);
494
+ if (requestQuery.threadId) params.set("threadId", requestQuery.threadId);
495
+ if (requestQuery.latest) params.set("latest", "true");
496
+ for (const type of requestQuery.types ?? []) params.append("type", type);
497
+ return this.request("history", `/v2/history${params.size ? `?${params}` : ""}`, { signal: options.signal });
498
+ }
499
+ async recordReceipt(principal, ids) {
500
+ this.assertPrincipal(principal, false);
501
+ return (await this.request("record_receipt", "/v2/receipts", { method: "POST", body: { messageIds: ids } })).recorded;
375
502
  }
376
503
  async diagnostics(principal) {
377
504
  this.assertPrincipal(principal);
378
- const status = await this.request("/v2/status");
505
+ const status = await this.request("status", "/v2/status");
379
506
  this.assertBoundPrincipal(status);
380
507
  return status;
381
508
  }
382
509
  async claimDelivery(principal, options) {
383
510
  this.assertPrincipal(principal);
384
- return (await this.request("/v2/deliveries/claim", { method: "POST", body: options }))?.delivery ?? null;
511
+ return (await this.request("claim_delivery", "/v2/deliveries/claim", { method: "POST", body: options }))?.delivery ?? null;
512
+ }
513
+ async listDeliveries(principal, query = {}) {
514
+ this.assertPrincipal(principal);
515
+ const params = new URLSearchParams();
516
+ if (query.cursor) params.set("cursor", query.cursor);
517
+ if (query.limit) params.set("limit", String(query.limit));
518
+ if (query.role) params.set("role", query.role);
519
+ if (query.messageId) params.set("messageId", query.messageId);
520
+ if (query.recipient) params.set("recipient", query.recipient);
521
+ for (const state of query.states ?? []) params.append("state", state);
522
+ return this.request("list_deliveries", `/v2/deliveries${params.size ? `?${params}` : ""}`);
523
+ }
524
+ async listDeliveryEvents(principal, id, query = {}) {
525
+ this.assertPrincipal(principal);
526
+ const params = new URLSearchParams();
527
+ if (query.cursor) params.set("cursor", query.cursor);
528
+ if (query.limit) params.set("limit", String(query.limit));
529
+ return this.request("list_delivery_events", `/v2/deliveries/${id}/events${params.size ? `?${params}` : ""}`);
530
+ }
531
+ async cancelDelivery(principal, id) {
532
+ this.assertPrincipal(principal);
533
+ return (await this.request("cancel_delivery", `/v2/deliveries/${id}/cancel`, { method: "POST", body: {} })).delivery;
534
+ }
535
+ async requeueDelivery(principal, id) {
536
+ this.assertPrincipal(principal);
537
+ return (await this.request("requeue_delivery", `/v2/deliveries/${id}/requeue`, { method: "POST", body: {} })).delivery;
385
538
  }
386
539
  async renewDelivery(principal, id, token, leaseMs) {
387
540
  this.assertPrincipal(principal);
388
541
  try {
389
- return await this.request(`/v2/deliveries/${id}/extend`, { method: "POST", body: { leaseToken: token, leaseMs } });
542
+ return (await this.request("extend_delivery", `/v2/deliveries/${id}/extend`, { method: "POST", body: { leaseToken: token, leaseMs } })).delivery;
390
543
  } catch (error) {
391
544
  if (error instanceof BridgeHttpError && error.status === 409) return null;
392
545
  throw error;
393
546
  }
394
547
  }
395
- async settleDelivery(principal, id, token, state, error, retryPolicy) {
548
+ async settleDelivery(principal, id, token, state, error, _retryPolicy) {
396
549
  this.assertPrincipal(principal);
550
+ await this.ensureProtocol();
397
551
  const action = state === "acked" ? "ack" : "nack";
398
552
  try {
399
- return await this.request(`/v2/deliveries/${id}/${action}`, { method: "POST", body: { leaseToken: token, error, dead: state === "dead", retryPolicy } });
553
+ const operationId = action === "ack" ? "acknowledge_delivery" : "negative_acknowledge_delivery";
554
+ const nackBody = { leaseToken: token, error, disposition: state === "dead" ? "dead" : "retry" };
555
+ return (await this.request(operationId, `/v2/deliveries/${id}/${action}`, { method: "POST", body: action === "ack" ? { leaseToken: token } : nackBody })).delivery;
400
556
  } catch (caught) {
401
557
  if (caught instanceof BridgeHttpError && caught.status === 409) return null;
402
558
  throw caught;
@@ -404,11 +560,16 @@ var HttpBridgeStore = class {
404
560
  }
405
561
  async heartbeat(principal, leaseMs, runtimeType, capabilities = []) {
406
562
  this.assertPrincipal(principal);
407
- return this.request("/v2/presence/heartbeat", { method: "POST", body: { leaseMs, runtimeType, capabilities } });
563
+ return this.request("heartbeat", "/v2/presence/heartbeat", { method: "POST", body: { leaseMs, runtimeType, capabilities } });
408
564
  }
409
565
  async listPresence(principal) {
410
566
  this.assertPrincipal(principal);
411
- return (await this.request("/v2/presence")).agents;
567
+ return (await this.request("presence", "/v2/presence")).agents;
568
+ }
569
+ async close() {
570
+ if (this.closed) return;
571
+ this.closed = true;
572
+ this.closeController.abort(new Error("store closed"));
412
573
  }
413
574
  };
414
575
 
@@ -420,4 +581,4 @@ export {
420
581
  BridgeHttpError,
421
582
  HttpBridgeStore
422
583
  };
423
- //# sourceMappingURL=chunk-AXL2I7FH.js.map
584
+ //# sourceMappingURL=chunk-CEXBMOI5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/legacy-compat.ts","../src/legacy-supabase-store.ts","../src/http-bridge-store.ts"],"sourcesContent":["import type { BridgeMessage, JsonValue } from \"./bridge-domain.js\";\n\nexport function legacyMessageIdFromSequence(value: string | number): string {\n const text = String(value);\n if (!/^-?\\d+$/.test(text)) throw new Error(\"legacy message ID must be an integer\");\n if (typeof value === \"number\" && !Number.isSafeInteger(value)) {\n throw new Error(\"legacy message ID must be decoded without precision loss\");\n }\n const numeric = BigInt(text);\n if (numeric >= 0n && numeric <= 0xffffffffffffn) {\n return `00000000-0000-8000-8000-${numeric.toString(16).padStart(12, \"0\")}`;\n }\n if (numeric < -0x8000000000000000n || numeric > 0x7fffffffffffffffn) {\n throw new Error(\"legacy message ID exceeds bigint range\");\n }\n const unsigned = numeric < 0 ? numeric + 0x10000000000000000n : numeric;\n const encoded = unsigned.toString(16).padStart(16, \"0\").padStart(18, \"0\");\n return `00000000-0000-8${encoded.slice(0, 3)}-9${encoded.slice(3, 6)}-${encoded.slice(6)}`;\n}\n\nexport function legacySequenceFromMessageId(value: string): string | undefined {\n const small = value.match(/^00000000-0000-8000-8000-([0-9a-f]{12})$/i);\n if (small) return BigInt(`0x${small[1]}`).toString();\n const large = value.match(/^00000000-0000-8([0-9a-f]{3})-9([0-9a-f]{3})-([0-9a-f]{12})$/i);\n if (!large) return undefined;\n const encoded = `${large[1]}${large[2]}${large[3]}`;\n if (!encoded.startsWith(\"00\")) return undefined;\n const unsigned = BigInt(`0x${encoded.slice(2)}`);\n return (unsigned >= 0x8000000000000000n\n ? unsigned - 0x10000000000000000n\n : unsigned).toString();\n}\n\nexport function legacyNumericMessageId(value: string | number): string {\n const text = String(value);\n return /^-?\\d+$/.test(text) ? legacyMessageIdFromSequence(value) : text;\n}\n\nexport function legacyContextMetadata(message: BridgeMessage): Record<string, JsonValue> {\n const metadata = message.metadata &&\n typeof message.metadata === \"object\" &&\n !Array.isArray(message.metadata)\n ? message.metadata\n : {};\n const existingEnvelope = metadata.message_envelope &&\n typeof metadata.message_envelope === \"object\" &&\n !Array.isArray(metadata.message_envelope)\n ? metadata.message_envelope\n : {};\n const envelope: Record<string, JsonValue> = {\n ...existingEnvelope,\n schema: \"agent-bridge.message-envelope.v1\",\n message_id: message.id,\n source_agent: message.source,\n kind: message.type,\n priority: message.priority,\n target_agents: message.targets,\n payload_mime: message.contentType,\n };\n if (message.project) envelope.project = message.project;\n if (message.threadId) envelope.thread_id = message.threadId;\n if (message.replyToId) envelope.reply_to_id = message.replyToId;\n if (message.correlationId) envelope.correlation_id = message.correlationId;\n if (message.causationId) envelope.causation_id = message.causationId;\n if (message.data !== undefined) envelope.payload = message.data;\n if (message.expiresAt) envelope.expires_at = message.expiresAt;\n if (message.atribReceiptId) envelope.atrib_receipt_id = message.atribReceiptId;\n if (message.informedBy?.length) envelope.informed_by = message.informedBy;\n return { ...metadata, message_envelope: envelope };\n}\n","import { cursorScope, decodeCursor, encodeCursor, type BridgeDelivery, type BridgeMessage, type BridgePrincipal } from \"./bridge-domain.js\";\nimport type {\n BridgeStore,\n BridgeDiagnostics,\n ClaimOptions,\n InsertMessageResult,\n MessagePage,\n MessageQuery,\n} from \"./bridge-store.js\";\nimport { legacyMessageIdFromSequence, legacySequenceFromMessageId } from \"./legacy-compat.js\";\nimport { assertIdempotentReplay } from \"./idempotency.js\";\n\ntype LegacyRow = Record<string, any>;\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nexport class LegacySupabaseError extends Error {\n constructor(readonly status: number, readonly code: string) {\n super(`Legacy Supabase request failed: ${code}`);\n }\n}\n\nfunction messageId(row: LegacyRow): string {\n const envelopeId = row.metadata?.message_envelope?.message_id;\n return typeof envelopeId === \"string\" && UUID_RE.test(envelopeId)\n ? envelopeId\n : legacyMessageIdFromSequence(String(row.id));\n}\n\nfunction isVisible(row: LegacyRow, principal: BridgePrincipal, query: MessageQuery): boolean {\n const envelope = row.metadata?.message_envelope;\n const targets = Array.isArray(envelope?.target_agents) ? envelope.target_agents : [];\n const inbox = !targets.length || targets.includes(principal.agent);\n const sent = row.source === principal.agent;\n const mailbox = query.mailbox ?? \"inbox\";\n if (mailbox === \"inbox\" && !inbox) return false;\n if (query.mailbox === \"sent\" && !sent) return false;\n if (query.mailbox === \"all\" && !inbox && !sent) return false;\n if (![\"inbox\", \"sent\", \"all\"].includes(mailbox) && !inbox) return false;\n\n const type = envelope?.kind ?? row.category;\n if (query.types?.length && !query.types.includes(type)) return false;\n if (query.threadId && envelope?.thread_id !== query.threadId) return false;\n\n const expiresAt = envelope?.expires_at;\n if (!query.includeExpired && expiresAt && new Date(expiresAt).getTime() <= Date.now()) return false;\n return true;\n}\n\nfunction asMessage(row: LegacyRow, principal: BridgePrincipal): BridgeMessage {\n const envelope = row.metadata?.message_envelope;\n return {\n id: messageId(row),\n sequence: String(row.id),\n workspace: principal.workspace,\n project: row.project ?? undefined,\n source: row.source,\n type: envelope?.kind ?? row.category,\n content: row.content,\n contentType: envelope?.payload_mime ?? \"text/plain\",\n data: envelope?.payload,\n targets: envelope?.target_agents ?? [],\n threadId: envelope?.thread_id,\n replyToId: envelope?.reply_to_id,\n correlationId: envelope?.correlation_id,\n causationId: envelope?.causation_id,\n priority: row.priority ?? \"info\",\n expiresAt: envelope?.expires_at,\n idempotencyKey: envelope?.idempotency_key,\n atribReceiptId: row.atrib_receipt_id ?? envelope?.atrib_receipt_id,\n informedBy: envelope?.informed_by,\n metadata: row.metadata,\n deliveryPolicy: { mode: \"mailbox\" },\n createdAt: row.created_at,\n };\n}\n\nexport class LegacySupabaseRestStore implements BridgeStore {\n private readonly legacyIds = new Map<string, string>();\n private initialized = false;\n\n constructor(\n private readonly url: string,\n private readonly key: string,\n private readonly fetchImpl: typeof fetch = fetch,\n private readonly timeoutMs = 10_000,\n ) {\n const parsed = new URL(url);\n const loopback = parsed.hostname === \"localhost\" || parsed.hostname === \"127.0.0.1\" || parsed.hostname === \"[::1]\";\n if (parsed.protocol !== \"https:\" && !(parsed.protocol === \"http:\" && loopback)) {\n throw new Error(\"Agent Bridge requires HTTPS for non-loopback legacy providers\");\n }\n }\n\n async initialize(options: { mode?: \"active\" | \"passive\" } = {}): Promise<void> {\n if (options.mode === \"passive\") return;\n if (this.initialized) return;\n await this.request(\"/shared_context?select=id&limit=1\");\n this.initialized = true;\n }\n\n private async request(path: string, init: RequestInit = {}): Promise<any> {\n try {\n const response = await this.fetchImpl(`${this.url.replace(/\\/$/, \"\")}/rest/v1${path}`, {\n ...init,\n signal: init.signal ?? AbortSignal.timeout(this.timeoutMs),\n headers: {\n apikey: this.key,\n Authorization: `Bearer ${this.key}`,\n \"Content-Type\": \"application/json\",\n Prefer: \"return=representation\",\n ...(init.headers ?? {}),\n },\n });\n if (!response.ok) {\n throw new LegacySupabaseError(response.status, \"provider_error\");\n }\n const text = await response.text();\n return text ? JSON.parse(text) : null;\n } catch (error) {\n if (error instanceof LegacySupabaseError) throw error;\n if (error instanceof Error && (error.name === \"TimeoutError\" || error.name === \"AbortError\")) {\n throw new LegacySupabaseError(504, \"request_timeout\");\n }\n throw new LegacySupabaseError(0, \"network_error\");\n }\n }\n\n private async visibleReceiptIds(\n entryIds: string[],\n principal: BridgePrincipal,\n ): Promise<string[]> {\n if (!entryIds.length || entryIds.length > 200) {\n throw new Error(\"legacy receipt IDs must contain between 1 and 200 entries\");\n }\n const uniqueIds = [...new Set(entryIds)];\n const rows = await this.request(\n `/shared_context?select=id,source,metadata&id=in.(${uniqueIds.join(\",\")})`,\n );\n const visible = new Set(\n Array.isArray(rows)\n ? rows\n .filter((row) => isVisible(row as LegacyRow, principal, { mailbox: \"inbox\" }))\n .map((row) => String((row as LegacyRow).id))\n : [],\n );\n return entryIds.filter((entryId) => visible.has(entryId));\n }\n\n async insertMessage(\n input: Omit<BridgeMessage, \"sequence\" | \"createdAt\">,\n ): Promise<InsertMessageResult> {\n if (input.idempotencyKey) {\n throw new Error(\n \"legacy Supabase mode cannot enforce idempotency keys; migrate to shared mode\",\n );\n }\n if (input.deliveryPolicy?.mode === \"leased\") {\n throw Object.assign(new Error(\"leased delivery policy is not supported in legacy mode\"), { code: \"delivery_not_supported\", status: 400 });\n }\n const existingMetadata = input.metadata &&\n typeof input.metadata === \"object\" &&\n !Array.isArray(input.metadata)\n ? input.metadata\n : {};\n const existingEnvelope = existingMetadata.message_envelope &&\n typeof existingMetadata.message_envelope === \"object\"\n ? existingMetadata.message_envelope as Record<string, unknown>\n : {};\n const storedMetadata = JSON.parse(JSON.stringify({\n ...existingMetadata,\n message_envelope: {\n ...existingEnvelope,\n schema: \"agent-bridge.message-envelope.v1\",\n message_id: input.id,\n source_agent: input.source,\n kind: input.type,\n payload_mime: input.contentType,\n payload: input.data,\n target_agents: input.targets,\n thread_id: input.threadId,\n reply_to_id: input.replyToId,\n correlation_id: input.correlationId,\n causation_id: input.causationId,\n expires_at: input.expiresAt,\n informed_by: input.informedBy,\n },\n }));\n const body = {\n source: input.source,\n category: input.type,\n content: input.content,\n priority: input.priority,\n project: input.project ?? null,\n metadata: storedMetadata,\n atrib_receipt_id: input.atribReceiptId,\n };\n const lookup = encodeURIComponent(\n JSON.stringify({ message_envelope: { message_id: input.id } }),\n );\n const existing = await this.request(\n `/shared_context?metadata=cs.${lookup}&order=id.asc&limit=1`,\n );\n if (existing[0]) {\n const message = asMessage(existing[0], { workspace: input.workspace, agent: input.source });\n assertIdempotentReplay(message, { ...input, metadata: storedMetadata });\n this.legacyIds.set(message.id, String(existing[0].id));\n return { created: false, message };\n }\n const rows = await this.request(\"/shared_context\", {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n const row = rows[0];\n this.legacyIds.set(input.id, String(row.id));\n return {\n created: true,\n message: { ...input, sequence: String(row.id), createdAt: row.created_at },\n };\n }\n\n async listMessages(\n principal: BridgePrincipal,\n query: MessageQuery = {},\n ): Promise<MessagePage> {\n const limit = query.limit ?? 50;\n const scope = cursorScope(principal, query);\n let after = decodeCursor(query.cursor, scope) ?? \"0\";\n let before: string | undefined;\n let latestCursor: string | undefined;\n const messages: BridgeMessage[] = [];\n\n while (messages.length < limit) {\n const batchLimit = Math.min(Math.max(limit * 2, 50), 200);\n const workspaceFilter = query.project\n ? `&project=eq.${encodeURIComponent(query.project)}`\n : \"\";\n const effectiveSource = query.source ?? (query.mailbox === \"sent\" ? principal.agent : undefined);\n const sourceFilter = effectiveSource\n ? `&source=eq.${encodeURIComponent(effectiveSource)}`\n : \"\";\n const sinceFilter = query.since\n ? `&created_at=gte.${encodeURIComponent(query.since)}`\n : \"\";\n const receiptFilter = query.receiptState === \"unread\"\n ? `&acked_by=not.cs.%7B${encodeURIComponent(principal.agent)}%7D`\n : query.receiptState === \"read\" ? `&acked_by=cs.%7B${encodeURIComponent(principal.agent)}%7D` : \"\";\n const cursorFilter = query.latest\n ? before ? `&id=lt.${encodeURIComponent(before)}` : \"\"\n : `&id=gt.${encodeURIComponent(after)}`;\n const rows = (await this.request(\n `/shared_context?select=*${cursorFilter}` +\n `${workspaceFilter}${sourceFilter}${sinceFilter}${receiptFilter}` +\n `&order=id.${query.latest ? \"desc\" : \"asc\"}&limit=${batchLimit}`,\n )) as LegacyRow[];\n if (!rows.length) break;\n if (query.latest && latestCursor === undefined) latestCursor = String(rows[0].id);\n\n for (const row of rows) {\n after = String(row.id);\n const id = messageId(row);\n this.legacyIds.set(id, after);\n if (isVisible(row, principal, query)) messages.push(asMessage(row, principal));\n if (messages.length === limit) break;\n }\n if (query.latest) before = String(rows[rows.length - 1]!.id);\n if (rows.length < batchLimit || messages.length === limit) break;\n }\n\n const next = query.latest ? latestCursor : after === \"0\" ? undefined : after;\n return { messages, cursor: next ? encodeCursor(next, scope) : query.cursor };\n }\n\n async recordReceipt(principal: BridgePrincipal, ids: string[]): Promise<number> {\n if (!ids.length || ids.length > 200) {\n throw new Error(\"message IDs must contain between 1 and 200 entries\");\n }\n const entryIds = await Promise.all(ids.map(async (id) => {\n const mapped = this.legacyIds.get(id);\n if (mapped) return mapped;\n const lookup = encodeURIComponent(JSON.stringify({ message_envelope: { message_id: id } }));\n const rows = await this.request(`/shared_context?select=id,metadata&metadata=cs.${lookup}&limit=2`);\n if (Array.isArray(rows) && rows.length === 1) {\n const sequence = String(rows[0].id);\n this.legacyIds.set(id, sequence);\n return sequence;\n }\n if (Array.isArray(rows) && rows.length > 1) {\n throw new LegacySupabaseError(409, \"ambiguous_message_id\");\n }\n const decodedSequence = legacySequenceFromMessageId(id);\n if (decodedSequence !== undefined) return decodedSequence;\n throw new LegacySupabaseError(404, \"message_not_found\");\n }));\n const visibleIds = await this.visibleReceiptIds(entryIds, principal);\n if (!visibleIds.length) return 0;\n return this.request(\"/rpc/ack_context\", {\n method: \"POST\",\n body: JSON.stringify({ entry_ids: visibleIds, agent_name: principal.agent }),\n });\n }\n\n async recordLegacyReceipt(ids: string[], principal: string): Promise<number> {\n if (!ids.length || ids.length > 200) {\n throw new Error(\"legacy receipt IDs must contain between 1 and 200 entries\");\n }\n const entryIds = ids.map((id) => {\n if (!/^\\d+$/.test(id)) throw new Error(\"legacy receipt IDs must be numeric\");\n const value = BigInt(id);\n if (value > 0x7fffffffffffffffn) throw new Error(\"legacy receipt ID exceeds bigint range\");\n return value.toString();\n });\n const visibleIds = await this.visibleReceiptIds(entryIds, {\n workspace: \"*\",\n agent: principal,\n });\n if (!visibleIds.length) return 0;\n return this.request(\"/rpc/ack_context\", {\n method: \"POST\",\n body: JSON.stringify({ entry_ids: visibleIds, agent_name: principal }),\n });\n }\n\n async claimDelivery(\n _principal: BridgePrincipal,\n _options: ClaimOptions,\n ): Promise<BridgeDelivery | null> {\n throw new Error(\"legacy Supabase adapter does not support deliveries\");\n }\n\n async renewDelivery(\n _principal: BridgePrincipal,\n _deliveryId: string,\n _leaseToken: string,\n _leaseMs: number,\n ): Promise<BridgeDelivery | null> {\n throw new Error(\"legacy Supabase adapter does not support deliveries\");\n }\n\n async settleDelivery(\n _principal: BridgePrincipal,\n _deliveryId: string,\n _leaseToken: string,\n _state: \"acked\" | \"retrying\" | \"dead\",\n _error?: string,\n _retryPolicy?: import(\"./bridge-domain.js\").RetryPolicy,\n ): Promise<BridgeDelivery | null> {\n throw new Error(\"legacy Supabase adapter does not support deliveries\");\n }\n\n async diagnostics(_principal: BridgePrincipal): Promise<BridgeDiagnostics> {\n return { schemaVersion: \"legacy-v1\", deliverySupported: false, pending: null, claimed: null, retrying: null, dead: null };\n }\n}\n","import type { AgentPresence, BridgeDelivery, BridgeMessage, BridgePrincipal } from \"./bridge-domain.js\";\nimport type { BridgeDiagnostics, BridgeStore, ClaimOptions, InsertMessageResult, MessagePage, MessageQuery } from \"./bridge-store.js\";\nimport {\n ContractResponseError,\n parseResponse,\n PROTOCOL_HEADER,\n PROTOCOL_VERSION,\n SUPPORTED_PROTOCOL_HEADER,\n SUPPORTED_PROTOCOL_VERSIONS,\n type OperationId,\n} from \"./contracts/registry.js\";\n\nexport interface HttpBridgeStoreOptions {\n baseUrl: string;\n token: string;\n principal: BridgePrincipal;\n timeoutMs?: number;\n allowInsecureRemoteHttp?: boolean;\n fetch?: typeof fetch;\n}\n\nexport class BridgeHttpError extends Error {\n constructor(\n readonly status: number,\n readonly code: string,\n readonly requestId?: string,\n readonly details?: unknown,\n message = `Agent Bridge request failed: ${code}`,\n ) {\n super(message);\n }\n}\n\nexport class HttpBridgeStore implements BridgeStore {\n private readonly fetchImpl: typeof fetch;\n private readonly closeController = new AbortController();\n private closed = false;\n private selectedProtocolVersion?: string;\n private protocolProbe?: Promise<string>;\n constructor(private readonly options: HttpBridgeStoreOptions) {\n const url = new URL(options.baseUrl);\n const loopback = url.hostname === \"localhost\" || url.hostname === \"127.0.0.1\" || url.hostname === \"[::1]\";\n if (url.protocol !== \"https:\" && !(url.protocol === \"http:\" && loopback) && !options.allowInsecureRemoteHttp) {\n throw new Error(\"Agent Bridge requires HTTPS for non-loopback gateways\");\n }\n this.fetchImpl = options.fetch ?? fetch;\n }\n async initialize(options: { signal?: AbortSignal; mode?: \"active\" | \"passive\" } = {}): Promise<void> {\n if (options.mode === \"passive\") return;\n await this.request(undefined, \"/readyz\", { authenticated: false, signal: options.signal });\n const status = await this.request(\"status\", \"/v2/status\", { signal: options.signal });\n this.assertBoundPrincipal(status);\n }\n\n private assertBoundPrincipal(status: any): void {\n const principal = status?.principal;\n if (\n !principal ||\n principal.workspace !== this.options.principal.workspace ||\n principal.agent !== this.options.principal.agent\n ) {\n throw new BridgeHttpError(403, \"principal_mismatch\");\n }\n }\n\n private async request(operationId: OperationId | undefined, path: string, options: { method?: string; body?: unknown; authenticated?: boolean; signal?: AbortSignal; skipProtocolProbe?: boolean } = {}): Promise<any> {\n if (options.method === \"POST\" && !options.skipProtocolProbe) await this.ensureProtocol(options.signal);\n if (this.closed) throw new BridgeHttpError(0, \"store_closed\");\n if (options.signal?.aborted) throw new BridgeHttpError(0, \"request_cancelled\");\n const requestController = new AbortController();\n const abort = () => requestController.abort(this.closeController.signal.reason);\n const abortRequest = () => requestController.abort(options.signal?.reason);\n this.closeController.signal.addEventListener(\"abort\", abort, { once: true });\n options.signal?.addEventListener(\"abort\", abortRequest, { once: true });\n let timedOut = false;\n const timeout = setTimeout(() => {\n timedOut = true;\n requestController.abort(new Error(\"request timeout\"));\n }, this.options.timeoutMs ?? 10_000);\n timeout.unref?.();\n try {\n const response = await this.fetchImpl(`${this.options.baseUrl.replace(/\\/$/, \"\")}${path}`, {\n method: options.method ?? \"GET\", signal: requestController.signal,\n headers: {\n [PROTOCOL_HEADER]: this.selectedProtocolVersion ?? PROTOCOL_VERSION,\n ...(options.authenticated === false ? {} : { authorization: `Bearer ${this.options.token}` }),\n ...(this.options.principal.instance ? { \"x-agent-bridge-instance\": this.options.principal.instance } : {}),\n ...(options.body === undefined ? {} : { \"content-type\": \"application/json\" }),\n },\n body: options.body === undefined ? undefined : JSON.stringify(options.body),\n });\n const requestId = response.headers.get(\"x-request-id\") ?? undefined;\n const selectedHeader = response.headers.get(PROTOCOL_HEADER);\n const supportedHeader = response.headers.get(SUPPORTED_PROTOCOL_HEADER);\n const supportedProtocols = supportedHeader?.split(\",\").map((value) => value.trim()).filter(Boolean) ?? [];\n const inconsistentProtocol = (\n selectedHeader === null || supportedHeader === null ||\n !(SUPPORTED_PROTOCOL_VERSIONS as readonly string[]).includes(selectedHeader) ||\n !supportedProtocols.includes(selectedHeader) ||\n selectedHeader !== PROTOCOL_VERSION\n );\n if (operationId && inconsistentProtocol) {\n throw new BridgeHttpError(502, \"protocol_mismatch\", requestId, {\n expected: PROTOCOL_VERSION,\n selected: selectedHeader,\n supported: supportedHeader,\n });\n }\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const payload = contentType.startsWith(\"application/json\")\n ? await response.json().catch(() => ({}))\n : await response.text();\n if (!response.ok) {\n const envelope = payload && typeof payload === \"object\" ? (payload as any).error : undefined;\n throw new BridgeHttpError(\n response.status,\n envelope?.code ?? \"request_failed\",\n envelope?.requestId ?? requestId,\n envelope?.details ?? envelope,\n envelope?.message ?? `Agent Bridge request failed: ${envelope?.code ?? \"request_failed\"}`,\n );\n }\n if (operationId) this.selectedProtocolVersion = PROTOCOL_VERSION;\n if (!operationId) return payload;\n return parseResponse(operationId, payload);\n } catch (error) {\n if (error instanceof BridgeHttpError) throw error;\n if (error instanceof ContractResponseError) {\n throw new BridgeHttpError(error.status, error.code, undefined, {\n operation: error.operation,\n issues: error.issues,\n }, error.message);\n }\n if (this.closed) throw new BridgeHttpError(0, \"store_closed\");\n if (options.signal?.aborted) throw new BridgeHttpError(0, \"request_cancelled\");\n if (timedOut) throw new BridgeHttpError(504, \"request_timeout\");\n if (error instanceof Error && (error.name === \"TimeoutError\" || error.name === \"AbortError\")) {\n throw new BridgeHttpError(504, \"request_timeout\");\n }\n throw new BridgeHttpError(0, \"network_error\");\n } finally {\n clearTimeout(timeout);\n this.closeController.signal.removeEventListener(\"abort\", abort);\n options.signal?.removeEventListener(\"abort\", abortRequest);\n }\n }\n\n private ensureProtocol(signal?: AbortSignal): Promise<string> {\n if (this.selectedProtocolVersion) return Promise.resolve(this.selectedProtocolVersion);\n if (!this.protocolProbe) {\n this.protocolProbe = this.request(\"status\", \"/v2/status\", { signal, skipProtocolProbe: true })\n .then(() => this.selectedProtocolVersion!)\n .finally(() => { this.protocolProbe = undefined; });\n }\n return this.protocolProbe;\n }\n async capabilities(): Promise<unknown> { return this.request(\"capabilities\", \"/v2/capabilities\"); }\n\n private assertPrincipal(principal: BridgePrincipal, includeInstance = true): void {\n const expected = this.options.principal;\n if (\n principal.workspace !== expected.workspace ||\n principal.agent !== expected.agent ||\n (includeInstance && principal.instance !== expected.instance)\n ) {\n throw new BridgeHttpError(403, \"principal_mismatch\");\n }\n }\n\n async insertMessage(message: Omit<BridgeMessage, \"sequence\" | \"createdAt\">, options: { signal?: AbortSignal } = {}): Promise<InsertMessageResult> {\n this.assertPrincipal({ workspace: message.workspace, agent: message.source }, false);\n await this.ensureProtocol(options.signal);\n const { workspace: _workspace, source: _source, ...draft } = message;\n return this.request(\"publish_message\", \"/v2/messages\", { method: \"POST\", body: draft, signal: options.signal });\n }\n async listMessages(principal: BridgePrincipal, query: MessageQuery = {}, options: { signal?: AbortSignal } = {}): Promise<MessagePage> {\n this.assertPrincipal(principal);\n const requestQuery = query;\n const params = new URLSearchParams();\n if (requestQuery.cursor) params.set(\"cursor\", requestQuery.cursor);\n if (requestQuery.mailbox) params.set(\"mailbox\", requestQuery.mailbox);\n if (requestQuery.receiptState) params.set(\"receiptState\", requestQuery.receiptState);\n if (requestQuery.limit) params.set(\"limit\", String(requestQuery.limit));\n if (requestQuery.includeExpired) params.set(\"includeExpired\", \"true\");\n if (requestQuery.source) params.set(\"source\", requestQuery.source);\n if (requestQuery.project) params.set(\"project\", requestQuery.project);\n if (requestQuery.since) params.set(\"since\", requestQuery.since);\n if (requestQuery.threadId) params.set(\"threadId\", requestQuery.threadId);\n if (requestQuery.latest) params.set(\"latest\", \"true\");\n for (const type of requestQuery.types ?? []) params.append(\"type\", type);\n return this.request(\"history\", `/v2/history${params.size ? `?${params}` : \"\"}`, { signal: options.signal });\n }\n async recordReceipt(principal: BridgePrincipal, ids: string[]): Promise<number> {\n this.assertPrincipal(principal, false);\n return (await this.request(\"record_receipt\", \"/v2/receipts\", { method: \"POST\", body: { messageIds: ids } })).recorded;\n }\n async diagnostics(principal: BridgePrincipal): Promise<BridgeDiagnostics> {\n this.assertPrincipal(principal);\n const status = await this.request(\"status\", \"/v2/status\");\n this.assertBoundPrincipal(status);\n return status;\n }\n async claimDelivery(principal: BridgePrincipal, options: ClaimOptions): Promise<BridgeDelivery | null> {\n this.assertPrincipal(principal);\n return (await this.request(\"claim_delivery\", \"/v2/deliveries/claim\", { method: \"POST\", body: options }))?.delivery ?? null;\n }\n async listDeliveries(principal: BridgePrincipal, query: import(\"./bridge-store.js\").DeliveryQuery = {}) {\n this.assertPrincipal(principal); const params=new URLSearchParams(); if(query.cursor)params.set(\"cursor\",query.cursor);if(query.limit)params.set(\"limit\",String(query.limit));if(query.role)params.set(\"role\",query.role);if(query.messageId)params.set(\"messageId\",query.messageId);if(query.recipient)params.set(\"recipient\",query.recipient);for(const state of query.states??[])params.append(\"state\",state);return this.request(\"list_deliveries\",`/v2/deliveries${params.size?`?${params}`:\"\"}`);\n }\n async listDeliveryEvents(principal: BridgePrincipal,id:string,query:{cursor?:string;limit?:number}={}) { this.assertPrincipal(principal);const params=new URLSearchParams();if(query.cursor)params.set(\"cursor\",query.cursor);if(query.limit)params.set(\"limit\",String(query.limit));return this.request(\"list_delivery_events\",`/v2/deliveries/${id}/events${params.size?`?${params}`:\"\"}`); }\n async cancelDelivery(principal:BridgePrincipal,id:string){this.assertPrincipal(principal);return (await this.request(\"cancel_delivery\",`/v2/deliveries/${id}/cancel`,{method:\"POST\",body:{}})).delivery;}\n async requeueDelivery(principal:BridgePrincipal,id:string){this.assertPrincipal(principal);return (await this.request(\"requeue_delivery\",`/v2/deliveries/${id}/requeue`,{method:\"POST\",body:{}})).delivery;}\n async renewDelivery(principal: BridgePrincipal, id: string, token: string, leaseMs: number): Promise<BridgeDelivery | null> {\n this.assertPrincipal(principal);\n try {\n return (await this.request(\"extend_delivery\", `/v2/deliveries/${id}/extend`, { method: \"POST\", body: { leaseToken: token, leaseMs } })).delivery;\n } catch (error) {\n if (error instanceof BridgeHttpError && error.status === 409) return null;\n throw error;\n }\n }\n async settleDelivery(principal: BridgePrincipal, id: string, token: string, state: \"acked\" | \"retrying\" | \"dead\", error?: string, _retryPolicy?: import(\"./bridge-domain.js\").RetryPolicy): Promise<BridgeDelivery | null> {\n this.assertPrincipal(principal);\n await this.ensureProtocol();\n const action = state === \"acked\" ? \"ack\" : \"nack\";\n try {\n const operationId = action === \"ack\" ? \"acknowledge_delivery\" : \"negative_acknowledge_delivery\";\n const nackBody = { leaseToken: token, error, disposition: state === \"dead\" ? \"dead\" : \"retry\" };\n return (await this.request(operationId, `/v2/deliveries/${id}/${action}`, { method: \"POST\", body: action === \"ack\" ? { leaseToken: token } : nackBody })).delivery;\n } catch (caught) {\n if (caught instanceof BridgeHttpError && caught.status === 409) return null;\n throw caught;\n }\n }\n async heartbeat(principal: BridgePrincipal, leaseMs: number, runtimeType?: string, capabilities: string[] = []): Promise<AgentPresence> {\n this.assertPrincipal(principal);\n return this.request(\"heartbeat\", \"/v2/presence/heartbeat\", { method: \"POST\", body: { leaseMs, runtimeType, capabilities } });\n }\n async listPresence(principal: BridgePrincipal): Promise<AgentPresence[]> {\n this.assertPrincipal(principal);\n return (await this.request(\"presence\", \"/v2/presence\")).agents;\n }\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.closeController.abort(new Error(\"store closed\"));\n }\n}\n"],"mappings":"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","names":[]}