@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.
- package/CHANGELOG.md +86 -4
- package/README.md +567 -55
- package/ROADMAP.md +114 -0
- package/SECURITY.md +90 -0
- package/SKILL.md +68 -2
- package/bin/agent-bridge +2 -2
- package/clients/claude-desktop.json +3 -1
- package/dist/archive.d.ts +163 -0
- package/dist/archive.js +50 -0
- package/dist/archive.js.map +1 -0
- package/dist/bridge-domain-CBX3IVqC.d.ts +153 -0
- package/dist/{bridge-service-CfqMcMAn.d.ts → bridge-service-hX1ZQp4W.d.ts} +15 -5
- package/dist/bridge-store-DPVSCwfs.d.ts +102 -0
- package/dist/bridge.d.ts +76 -17
- package/dist/bridge.js +52 -24
- package/dist/chunk-2DFNOLMO.js +618 -0
- package/dist/chunk-2DFNOLMO.js.map +1 -0
- package/dist/{chunk-KVR4JBRF.js → chunk-2EVLG3YA.js} +2 -2
- package/dist/{chunk-KVR4JBRF.js.map → chunk-2EVLG3YA.js.map} +1 -1
- package/dist/chunk-45BZGB77.js +709 -0
- package/dist/chunk-45BZGB77.js.map +1 -0
- package/dist/chunk-4VB44KJU.js +230 -0
- package/dist/chunk-4VB44KJU.js.map +1 -0
- package/dist/chunk-5GMB3A77.js +1013 -0
- package/dist/chunk-5GMB3A77.js.map +1 -0
- package/dist/chunk-A6W4QALF.js +1258 -0
- package/dist/chunk-A6W4QALF.js.map +1 -0
- package/dist/chunk-BZLMF5O5.js +328 -0
- package/dist/chunk-BZLMF5O5.js.map +1 -0
- package/dist/{chunk-AXL2I7FH.js → chunk-CEXBMOI5.js} +240 -79
- package/dist/chunk-CEXBMOI5.js.map +1 -0
- package/dist/chunk-GADH244D.js +527 -0
- package/dist/chunk-GADH244D.js.map +1 -0
- package/dist/chunk-MBPZXTJA.js +2428 -0
- package/dist/chunk-MBPZXTJA.js.map +1 -0
- package/dist/chunk-NCO7RLBM.js +146 -0
- package/dist/chunk-NCO7RLBM.js.map +1 -0
- package/dist/chunk-Q6PPMXJC.js +1050 -0
- package/dist/chunk-Q6PPMXJC.js.map +1 -0
- package/dist/{chunk-4KAOBC5X.js → chunk-SPSMZOCJ.js} +190 -165
- package/dist/chunk-SPSMZOCJ.js.map +1 -0
- package/dist/chunk-UAHMP6GC.js +54 -0
- package/dist/chunk-UAHMP6GC.js.map +1 -0
- package/dist/{chunk-YD6YJATN.js → chunk-VOQIDTCJ.js} +4 -2
- package/dist/chunk-VOQIDTCJ.js.map +1 -0
- package/dist/chunk-WAI2IYIQ.js +554 -0
- package/dist/chunk-WAI2IYIQ.js.map +1 -0
- package/dist/cli.d.ts +2 -1
- package/dist/cli.js +3555 -214
- package/dist/cli.js.map +1 -1
- package/dist/client-config.d.ts +1 -1
- package/dist/client-config.js +1 -1
- package/dist/client-runtime.d.ts +10 -6
- package/dist/client-runtime.js +9 -6
- package/dist/contracts/generate.d.ts +2 -0
- package/dist/contracts/generate.js +247 -0
- package/dist/contracts/generate.js.map +1 -0
- package/dist/dr.d.ts +324 -0
- package/dist/dr.js +124 -0
- package/dist/dr.js.map +1 -0
- package/dist/gateway-CggQ8vTC.d.ts +78 -0
- package/dist/gateway-main.js +190 -8
- package/dist/gateway-main.js.map +1 -1
- package/dist/gateway.d.ts +4 -3
- package/dist/gateway.js +4 -3
- package/dist/index.js +11 -8
- package/dist/index.js.map +1 -1
- package/dist/postgres-bridge-store-Bfd3hRId.d.ts +49 -0
- package/dist/server.d.ts +3 -2
- package/dist/server.js +13 -8
- package/dist/sqlite.d.ts +94 -12
- package/dist/sqlite.js +7 -4
- package/docs/architecture-v2.md +394 -0
- package/docs/decisions/0001-protocol-layers-and-acknowledgment-semantics.md +85 -0
- package/docs/decisions/0002-canonical-operation-contract-registry.md +46 -0
- package/docs/decisions/0003-host-adapters-and-consumer-instance-keys.md +88 -0
- package/docs/ecosystem.md +86 -0
- package/docs/postmortems/2026-07-08-wrapper-source-drift.md +82 -0
- package/docs/troubleshooting.md +89 -0
- package/llms.txt +107 -6
- package/openapi/agent-bridge-v2.openapi.json +9610 -0
- package/package.json +24 -4
- package/schemas/agent-bridge-v2.capabilities.json +1829 -0
- package/schemas/agent-bridge-v2.mcp.json +2074 -0
- package/schemas/agent-bridge-v2.schema.json +4560 -0
- package/sql/migrations/008_message_projects.sql +36 -0
- package/sql/migrations/009_mailbox_query_indexes.sql +28 -0
- package/sql/migrations/010_publisher_delivery_policy.sql +210 -0
- package/sql/migrations/011_credential_security.sql +875 -0
- package/sql/migrations/012_request_authority.sql +177 -0
- package/sql/migrations/013_row_isolation.sql +495 -0
- package/sql/migrations/014_owner_control_plane.sql +1641 -0
- package/sql/migrations/015_portable_archives.sql +1813 -0
- package/sql/migrations/016_native_dr_fence.sql +1005 -0
- package/bin/CLAUDE.md +0 -11
- package/dist/bridge-domain-BcnBeHOn.d.ts +0 -97
- package/dist/bridge-store-BuGjxTn4.d.ts +0 -61
- package/dist/chunk-4KAOBC5X.js.map +0 -1
- package/dist/chunk-6MAZ6YLZ.js +0 -146
- package/dist/chunk-6MAZ6YLZ.js.map +0 -1
- package/dist/chunk-AXL2I7FH.js.map +0 -1
- package/dist/chunk-BV6W4AJK.js +0 -211
- package/dist/chunk-BV6W4AJK.js.map +0 -1
- package/dist/chunk-CKSKUBDQ.js +0 -153
- package/dist/chunk-CKSKUBDQ.js.map +0 -1
- package/dist/chunk-JOUBDRYX.js +0 -272
- package/dist/chunk-JOUBDRYX.js.map +0 -1
- package/dist/chunk-JTC5YURG.js +0 -49
- package/dist/chunk-JTC5YURG.js.map +0 -1
- package/dist/chunk-O26W5QHS.js +0 -409
- package/dist/chunk-O26W5QHS.js.map +0 -1
- package/dist/chunk-WEULPMUY.js +0 -988
- package/dist/chunk-WEULPMUY.js.map +0 -1
- package/dist/chunk-YD6YJATN.js.map +0 -1
- 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-
|
|
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.
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
165
|
-
|
|
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.
|
|
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
|
-
|
|
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 =
|
|
223
|
-
const
|
|
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
|
|
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}${
|
|
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(
|
|
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:
|
|
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:
|
|
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(
|
|
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
|
-
|
|
314
|
-
|
|
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
|
|
337
|
-
|
|
338
|
-
|
|
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 (
|
|
362
|
-
if (
|
|
363
|
-
if (
|
|
364
|
-
if (
|
|
365
|
-
if (
|
|
366
|
-
if (
|
|
367
|
-
if (
|
|
368
|
-
if (
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
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,
|
|
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
|
-
|
|
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-
|
|
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":";;;;;;;;;;;;;;;;;;;AAEO,SAAS,4BAA4B,OAAgC;AAC1E,QAAM,OAAO,OAAO,KAAK;AACzB,MAAI,CAAC,UAAU,KAAK,IAAI,EAAG,OAAM,IAAI,MAAM,sCAAsC;AACjF,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,cAAc,KAAK,GAAG;AAC7D,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AACA,QAAM,UAAU,OAAO,IAAI;AAC3B,MAAI,WAAW,MAAM,WAAW,iBAAiB;AAC/C,WAAO,2BAA2B,QAAQ,SAAS,EAAE,EAAE,SAAS,IAAI,GAAG,CAAC;AAAA,EAC1E;AACA,MAAI,UAAU,CAAC,uBAAuB,UAAU,qBAAqB;AACnE,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC1D;AACA,QAAM,WAAW,UAAU,IAAI,UAAU,uBAAuB;AAChE,QAAM,UAAU,SAAS,SAAS,EAAE,EAAE,SAAS,IAAI,GAAG,EAAE,SAAS,IAAI,GAAG;AACxE,SAAO,kBAAkB,QAAQ,MAAM,GAAG,CAAC,CAAC,KAAK,QAAQ,MAAM,GAAG,CAAC,CAAC,IAAI,QAAQ,MAAM,CAAC,CAAC;AAC1F;AAEO,SAAS,4BAA4B,OAAmC;AAC7E,QAAM,QAAQ,MAAM,MAAM,2CAA2C;AACrE,MAAI,MAAO,QAAO,OAAO,KAAK,MAAM,CAAC,CAAC,EAAE,EAAE,SAAS;AACnD,QAAM,QAAQ,MAAM,MAAM,+DAA+D;AACzF,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,UAAU,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;AACjD,MAAI,CAAC,QAAQ,WAAW,IAAI,EAAG,QAAO;AACtC,QAAM,WAAW,OAAO,KAAK,QAAQ,MAAM,CAAC,CAAC,EAAE;AAC/C,UAAQ,YAAY,sBAChB,WAAW,uBACX,UAAU,SAAS;AACzB;AAEO,SAAS,uBAAuB,OAAgC;AACrE,QAAM,OAAO,OAAO,KAAK;AACzB,SAAO,UAAU,KAAK,IAAI,IAAI,4BAA4B,KAAK,IAAI;AACrE;AAEO,SAAS,sBAAsB,SAAmD;AACvF,QAAM,WAAW,QAAQ,YACvB,OAAO,QAAQ,aAAa,YAC5B,CAAC,MAAM,QAAQ,QAAQ,QAAQ,IAC7B,QAAQ,WACR,CAAC;AACL,QAAM,mBAAmB,SAAS,oBAChC,OAAO,SAAS,qBAAqB,YACrC,CAAC,MAAM,QAAQ,SAAS,gBAAgB,IACtC,SAAS,mBACT,CAAC;AACL,QAAM,WAAsC;AAAA,IAC1C,GAAG;AAAA,IACH,QAAQ;AAAA,IACR,YAAY,QAAQ;AAAA,IACpB,cAAc,QAAQ;AAAA,IACtB,MAAM,QAAQ;AAAA,IACd,UAAU,QAAQ;AAAA,IAClB,eAAe,QAAQ;AAAA,IACvB,cAAc,QAAQ;AAAA,EACxB;AACA,MAAI,QAAQ,QAAS,UAAS,UAAU,QAAQ;AAChD,MAAI,QAAQ,SAAU,UAAS,YAAY,QAAQ;AACnD,MAAI,QAAQ,UAAW,UAAS,cAAc,QAAQ;AACtD,MAAI,QAAQ,cAAe,UAAS,iBAAiB,QAAQ;AAC7D,MAAI,QAAQ,YAAa,UAAS,eAAe,QAAQ;AACzD,MAAI,QAAQ,SAAS,OAAW,UAAS,UAAU,QAAQ;AAC3D,MAAI,QAAQ,UAAW,UAAS,aAAa,QAAQ;AACrD,MAAI,QAAQ,eAAgB,UAAS,mBAAmB,QAAQ;AAChE,MAAI,QAAQ,YAAY,OAAQ,UAAS,cAAc,QAAQ;AAC/D,SAAO,EAAE,GAAG,UAAU,kBAAkB,SAAS;AACnD;;;ACxDA,IAAM,UAAU;AAET,IAAM,sBAAN,cAAkC,MAAM;AAAA,EAC7C,YAAqB,QAAyB,MAAc;AAC1D,UAAM,mCAAmC,IAAI,EAAE;AAD5B;AAAyB;AAAA,EAE9C;AACF;AAEA,SAAS,UAAU,KAAwB;AACzC,QAAM,aAAa,IAAI,UAAU,kBAAkB;AACnD,SAAO,OAAO,eAAe,YAAY,QAAQ,KAAK,UAAU,IAC5D,aACA,4BAA4B,OAAO,IAAI,EAAE,CAAC;AAChD;AAEA,SAAS,UAAU,KAAgB,WAA4B,OAA8B;AAC3F,QAAM,WAAW,IAAI,UAAU;AAC/B,QAAM,UAAU,MAAM,QAAQ,UAAU,aAAa,IAAI,SAAS,gBAAgB,CAAC;AACnF,QAAM,QAAQ,CAAC,QAAQ,UAAU,QAAQ,SAAS,UAAU,KAAK;AACjE,QAAM,OAAO,IAAI,WAAW,UAAU;AACtC,QAAM,UAAU,MAAM,WAAW;AACjC,MAAI,YAAY,WAAW,CAAC,MAAO,QAAO;AAC1C,MAAI,MAAM,YAAY,UAAU,CAAC,KAAM,QAAO;AAC9C,MAAI,MAAM,YAAY,SAAS,CAAC,SAAS,CAAC,KAAM,QAAO;AACvD,MAAI,CAAC,CAAC,SAAS,QAAQ,KAAK,EAAE,SAAS,OAAO,KAAK,CAAC,MAAO,QAAO;AAElE,QAAM,OAAO,UAAU,QAAQ,IAAI;AACnC,MAAI,MAAM,OAAO,UAAU,CAAC,MAAM,MAAM,SAAS,IAAI,EAAG,QAAO;AAC/D,MAAI,MAAM,YAAY,UAAU,cAAc,MAAM,SAAU,QAAO;AAErE,QAAM,YAAY,UAAU;AAC5B,MAAI,CAAC,MAAM,kBAAkB,aAAa,IAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,KAAK,IAAI,EAAG,QAAO;AAC9F,SAAO;AACT;AAEA,SAAS,UAAU,KAAgB,WAA2C;AAC5E,QAAM,WAAW,IAAI,UAAU;AAC/B,SAAO;AAAA,IACL,IAAI,UAAU,GAAG;AAAA,IACjB,UAAU,OAAO,IAAI,EAAE;AAAA,IACvB,WAAW,UAAU;AAAA,IACrB,SAAS,IAAI,WAAW;AAAA,IACxB,QAAQ,IAAI;AAAA,IACZ,MAAM,UAAU,QAAQ,IAAI;AAAA,IAC5B,SAAS,IAAI;AAAA,IACb,aAAa,UAAU,gBAAgB;AAAA,IACvC,MAAM,UAAU;AAAA,IAChB,SAAS,UAAU,iBAAiB,CAAC;AAAA,IACrC,UAAU,UAAU;AAAA,IACpB,WAAW,UAAU;AAAA,IACrB,eAAe,UAAU;AAAA,IACzB,aAAa,UAAU;AAAA,IACvB,UAAU,IAAI,YAAY;AAAA,IAC1B,WAAW,UAAU;AAAA,IACrB,gBAAgB,UAAU;AAAA,IAC1B,gBAAgB,IAAI,oBAAoB,UAAU;AAAA,IAClD,YAAY,UAAU;AAAA,IACtB,UAAU,IAAI;AAAA,IACd,gBAAgB,EAAE,MAAM,UAAU;AAAA,IAClC,WAAW,IAAI;AAAA,EACjB;AACF;AAEO,IAAM,0BAAN,MAAqD;AAAA,EAI1D,YACmB,KACA,KACA,YAA0B,OAC1B,YAAY,KAC7B;AAJiB;AACA;AACA;AACA;AAPnB,SAAiB,YAAY,oBAAI,IAAoB;AACrD,SAAQ,cAAc;AAQpB,UAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,UAAM,WAAW,OAAO,aAAa,eAAe,OAAO,aAAa,eAAe,OAAO,aAAa;AAC3G,QAAI,OAAO,aAAa,YAAY,EAAE,OAAO,aAAa,WAAW,WAAW;AAC9E,YAAM,IAAI,MAAM,+DAA+D;AAAA,IACjF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,UAA2C,CAAC,GAAkB;AAC7E,QAAI,QAAQ,SAAS,UAAW;AAChC,QAAI,KAAK,YAAa;AACtB,UAAM,KAAK,QAAQ,mCAAmC;AACtD,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,MAAc,QAAQ,MAAc,OAAoB,CAAC,GAAiB;AACxE,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,UAAU,GAAG,KAAK,IAAI,QAAQ,OAAO,EAAE,CAAC,WAAW,IAAI,IAAI;AAAA,QACrF,GAAG;AAAA,QACH,QAAQ,KAAK,UAAU,YAAY,QAAQ,KAAK,SAAS;AAAA,QACzD,SAAS;AAAA,UACP,QAAQ,KAAK;AAAA,UACb,eAAe,UAAU,KAAK,GAAG;AAAA,UACjC,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,GAAI,KAAK,WAAW,CAAC;AAAA,QACvB;AAAA,MACF,CAAC;AACD,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,oBAAoB,SAAS,QAAQ,gBAAgB;AAAA,MACjE;AACA,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,aAAO,OAAO,KAAK,MAAM,IAAI,IAAI;AAAA,IACnC,SAAS,OAAO;AACd,UAAI,iBAAiB,oBAAqB,OAAM;AAChD,UAAI,iBAAiB,UAAU,MAAM,SAAS,kBAAkB,MAAM,SAAS,eAAe;AAC5F,cAAM,IAAI,oBAAoB,KAAK,iBAAiB;AAAA,MACtD;AACA,YAAM,IAAI,oBAAoB,GAAG,eAAe;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,MAAc,kBACZ,UACA,WACmB;AACnB,QAAI,CAAC,SAAS,UAAU,SAAS,SAAS,KAAK;AAC7C,YAAM,IAAI,MAAM,2DAA2D;AAAA,IAC7E;AACA,UAAM,YAAY,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC;AACvC,UAAM,OAAO,MAAM,KAAK;AAAA,MACtB,oDAAoD,UAAU,KAAK,GAAG,CAAC;AAAA,IACzE;AACA,UAAM,UAAU,IAAI;AAAA,MAClB,MAAM,QAAQ,IAAI,IACd,KACC,OAAO,CAAC,QAAQ,UAAU,KAAkB,WAAW,EAAE,SAAS,QAAQ,CAAC,CAAC,EAC5E,IAAI,CAAC,QAAQ,OAAQ,IAAkB,EAAE,CAAC,IAC3C,CAAC;AAAA,IACP;AACA,WAAO,SAAS,OAAO,CAAC,YAAY,QAAQ,IAAI,OAAO,CAAC;AAAA,EAC1D;AAAA,EAEA,MAAM,cACJ,OAC8B;AAC9B,QAAI,MAAM,gBAAgB;AACxB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,QAAI,MAAM,gBAAgB,SAAS,UAAU;AAC3C,YAAM,OAAO,OAAO,IAAI,MAAM,wDAAwD,GAAG,EAAE,MAAM,0BAA0B,QAAQ,IAAI,CAAC;AAAA,IAC1I;AACA,UAAM,mBAAmB,MAAM,YAC7B,OAAO,MAAM,aAAa,YAC1B,CAAC,MAAM,QAAQ,MAAM,QAAQ,IAC3B,MAAM,WACN,CAAC;AACL,UAAM,mBAAmB,iBAAiB,oBACxC,OAAO,iBAAiB,qBAAqB,WAC3C,iBAAiB,mBACjB,CAAC;AACL,UAAM,iBAAiB,KAAK,MAAM,KAAK,UAAU;AAAA,MAC/C,GAAG;AAAA,MACH,kBAAkB;AAAA,QAChB,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,YAAY,MAAM;AAAA,QAClB,cAAc,MAAM;AAAA,QACpB,MAAM,MAAM;AAAA,QACZ,cAAc,MAAM;AAAA,QACpB,SAAS,MAAM;AAAA,QACf,eAAe,MAAM;AAAA,QACrB,WAAW,MAAM;AAAA,QACjB,aAAa,MAAM;AAAA,QACnB,gBAAgB,MAAM;AAAA,QACtB,cAAc,MAAM;AAAA,QACpB,YAAY,MAAM;AAAA,QAClB,aAAa,MAAM;AAAA,MACrB;AAAA,IACF,CAAC,CAAC;AACF,UAAM,OAAO;AAAA,MACX,QAAQ,MAAM;AAAA,MACd,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM;AAAA,MACf,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM,WAAW;AAAA,MAC1B,UAAU;AAAA,MACV,kBAAkB,MAAM;AAAA,IAC1B;AACA,UAAM,SAAS;AAAA,MACb,KAAK,UAAU,EAAE,kBAAkB,EAAE,YAAY,MAAM,GAAG,EAAE,CAAC;AAAA,IAC/D;AACA,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,+BAA+B,MAAM;AAAA,IACvC;AACA,QAAI,SAAS,CAAC,GAAG;AACf,YAAM,UAAU,UAAU,SAAS,CAAC,GAAG,EAAE,WAAW,MAAM,WAAW,OAAO,MAAM,OAAO,CAAC;AAC1F,6BAAuB,SAAS,EAAE,GAAG,OAAO,UAAU,eAAe,CAAC;AACtE,WAAK,UAAU,IAAI,QAAQ,IAAI,OAAO,SAAS,CAAC,EAAE,EAAE,CAAC;AACrD,aAAO,EAAE,SAAS,OAAO,QAAQ;AAAA,IACnC;AACA,UAAM,OAAO,MAAM,KAAK,QAAQ,mBAAmB;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AACD,UAAM,MAAM,KAAK,CAAC;AAClB,SAAK,UAAU,IAAI,MAAM,IAAI,OAAO,IAAI,EAAE,CAAC;AAC3C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,EAAE,GAAG,OAAO,UAAU,OAAO,IAAI,EAAE,GAAG,WAAW,IAAI,WAAW;AAAA,IAC3E;AAAA,EACF;AAAA,EAEA,MAAM,aACJ,WACA,QAAsB,CAAC,GACD;AACtB,UAAM,QAAQ,MAAM,SAAS;AAC7B,UAAM,QAAQ,YAAY,WAAW,KAAK;AAC1C,QAAI,QAAQ,aAAa,MAAM,QAAQ,KAAK,KAAK;AACjD,QAAI;AACJ,QAAI;AACJ,UAAM,WAA4B,CAAC;AAEnC,WAAO,SAAS,SAAS,OAAO;AAC9B,YAAM,aAAa,KAAK,IAAI,KAAK,IAAI,QAAQ,GAAG,EAAE,GAAG,GAAG;AACxD,YAAM,kBAAkB,MAAM,UAC1B,eAAe,mBAAmB,MAAM,OAAO,CAAC,KAChD;AACJ,YAAM,kBAAkB,MAAM,WAAW,MAAM,YAAY,SAAS,UAAU,QAAQ;AACtF,YAAM,eAAe,kBACjB,cAAc,mBAAmB,eAAe,CAAC,KACjD;AACJ,YAAM,cAAc,MAAM,QACtB,mBAAmB,mBAAmB,MAAM,KAAK,CAAC,KAClD;AACJ,YAAM,gBAAgB,MAAM,iBAAiB,WACzC,uBAAuB,mBAAmB,UAAU,KAAK,CAAC,QAC1D,MAAM,iBAAiB,SAAS,mBAAmB,mBAAmB,UAAU,KAAK,CAAC,QAAQ;AAClG,YAAM,eAAe,MAAM,SACvB,SAAS,UAAU,mBAAmB,MAAM,CAAC,KAAK,KAClD,UAAU,mBAAmB,KAAK,CAAC;AACvC,YAAM,OAAQ,MAAM,KAAK;AAAA,QACvB,2BAA2B,YAAY,GAClC,eAAe,GAAG,YAAY,GAAG,WAAW,GAAG,aAAa,aAClD,MAAM,SAAS,SAAS,KAAK,UAAU,UAAU;AAAA,MAClE;AACA,UAAI,CAAC,KAAK,OAAQ;AAClB,UAAI,MAAM,UAAU,iBAAiB,OAAW,gBAAe,OAAO,KAAK,CAAC,EAAE,EAAE;AAEhF,iBAAW,OAAO,MAAM;AACtB,gBAAQ,OAAO,IAAI,EAAE;AACrB,cAAM,KAAK,UAAU,GAAG;AACxB,aAAK,UAAU,IAAI,IAAI,KAAK;AAC5B,YAAI,UAAU,KAAK,WAAW,KAAK,EAAG,UAAS,KAAK,UAAU,KAAK,SAAS,CAAC;AAC7E,YAAI,SAAS,WAAW,MAAO;AAAA,MACjC;AACA,UAAI,MAAM,OAAQ,UAAS,OAAO,KAAK,KAAK,SAAS,CAAC,EAAG,EAAE;AAC3D,UAAI,KAAK,SAAS,cAAc,SAAS,WAAW,MAAO;AAAA,IAC7D;AAEA,UAAM,OAAO,MAAM,SAAS,eAAe,UAAU,MAAM,SAAY;AACvE,WAAO,EAAE,UAAU,QAAQ,OAAO,aAAa,MAAM,KAAK,IAAI,MAAM,OAAO;AAAA,EAC7E;AAAA,EAEA,MAAM,cAAc,WAA4B,KAAgC;AAC9E,QAAI,CAAC,IAAI,UAAU,IAAI,SAAS,KAAK;AACnC,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AACA,UAAM,WAAW,MAAM,QAAQ,IAAI,IAAI,IAAI,OAAO,OAAO;AACvD,YAAM,SAAS,KAAK,UAAU,IAAI,EAAE;AACpC,UAAI,OAAQ,QAAO;AACnB,YAAM,SAAS,mBAAmB,KAAK,UAAU,EAAE,kBAAkB,EAAE,YAAY,GAAG,EAAE,CAAC,CAAC;AAC1F,YAAM,OAAO,MAAM,KAAK,QAAQ,kDAAkD,MAAM,UAAU;AAClG,UAAI,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,GAAG;AAC5C,cAAM,WAAW,OAAO,KAAK,CAAC,EAAE,EAAE;AAClC,aAAK,UAAU,IAAI,IAAI,QAAQ;AAC/B,eAAO;AAAA,MACT;AACA,UAAI,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,GAAG;AAC1C,cAAM,IAAI,oBAAoB,KAAK,sBAAsB;AAAA,MAC3D;AACA,YAAM,kBAAkB,4BAA4B,EAAE;AACtD,UAAI,oBAAoB,OAAW,QAAO;AAC1C,YAAM,IAAI,oBAAoB,KAAK,mBAAmB;AAAA,IACxD,CAAC,CAAC;AACF,UAAM,aAAa,MAAM,KAAK,kBAAkB,UAAU,SAAS;AACnE,QAAI,CAAC,WAAW,OAAQ,QAAO;AAC/B,WAAO,KAAK,QAAQ,oBAAoB;AAAA,MACtC,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,WAAW,YAAY,YAAY,UAAU,MAAM,CAAC;AAAA,IAC7E,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,oBAAoB,KAAe,WAAoC;AAC3E,QAAI,CAAC,IAAI,UAAU,IAAI,SAAS,KAAK;AACnC,YAAM,IAAI,MAAM,2DAA2D;AAAA,IAC7E;AACA,UAAM,WAAW,IAAI,IAAI,CAAC,OAAO;AAC/B,UAAI,CAAC,QAAQ,KAAK,EAAE,EAAG,OAAM,IAAI,MAAM,oCAAoC;AAC3E,YAAM,QAAQ,OAAO,EAAE;AACvB,UAAI,QAAQ,oBAAqB,OAAM,IAAI,MAAM,wCAAwC;AACzF,aAAO,MAAM,SAAS;AAAA,IACxB,CAAC;AACD,UAAM,aAAa,MAAM,KAAK,kBAAkB,UAAU;AAAA,MACxD,WAAW;AAAA,MACX,OAAO;AAAA,IACT,CAAC;AACD,QAAI,CAAC,WAAW,OAAQ,QAAO;AAC/B,WAAO,KAAK,QAAQ,oBAAoB;AAAA,MACtC,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,WAAW,YAAY,YAAY,UAAU,CAAC;AAAA,IACvE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,cACJ,YACA,UACgC;AAChC,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AAAA,EAEA,MAAM,cACJ,YACA,aACA,aACA,UACgC;AAChC,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AAAA,EAEA,MAAM,eACJ,YACA,aACA,aACA,QACA,QACA,cACgC;AAChC,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AAAA,EAEA,MAAM,YAAY,YAAyD;AACzE,WAAO,EAAE,eAAe,aAAa,mBAAmB,OAAO,SAAS,MAAM,SAAS,MAAM,UAAU,MAAM,MAAM,KAAK;AAAA,EAC1H;AACF;;;AC3UO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,YACW,QACA,MACA,WACA,SACT,UAAU,gCAAgC,IAAI,IAC9C;AACA,UAAM,OAAO;AANJ;AACA;AACA;AACA;AAAA,EAIX;AACF;AAEO,IAAM,kBAAN,MAA6C;AAAA,EAMlD,YAA6B,SAAiC;AAAjC;AAJ7B,SAAiB,kBAAkB,IAAI,gBAAgB;AACvD,SAAQ,SAAS;AAIf,UAAM,MAAM,IAAI,IAAI,QAAQ,OAAO;AACnC,UAAM,WAAW,IAAI,aAAa,eAAe,IAAI,aAAa,eAAe,IAAI,aAAa;AAClG,QAAI,IAAI,aAAa,YAAY,EAAE,IAAI,aAAa,WAAW,aAAa,CAAC,QAAQ,yBAAyB;AAC5G,YAAM,IAAI,MAAM,uDAAuD;AAAA,IACzE;AACA,SAAK,YAAY,QAAQ,SAAS;AAAA,EACpC;AAAA,EACA,MAAM,WAAW,UAAiE,CAAC,GAAkB;AACnG,QAAI,QAAQ,SAAS,UAAW;AAChC,UAAM,KAAK,QAAQ,QAAW,WAAW,EAAE,eAAe,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACzF,UAAM,SAAS,MAAM,KAAK,QAAQ,UAAU,cAAc,EAAE,QAAQ,QAAQ,OAAO,CAAC;AACpF,SAAK,qBAAqB,MAAM;AAAA,EAClC;AAAA,EAEQ,qBAAqB,QAAmB;AAC9C,UAAM,YAAY,QAAQ;AAC1B,QACE,CAAC,aACD,UAAU,cAAc,KAAK,QAAQ,UAAU,aAC/C,UAAU,UAAU,KAAK,QAAQ,UAAU,OAC3C;AACA,YAAM,IAAI,gBAAgB,KAAK,oBAAoB;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAc,QAAQ,aAAsC,MAAc,UAA2H,CAAC,GAAiB;AACrN,QAAI,QAAQ,WAAW,UAAU,CAAC,QAAQ,kBAAmB,OAAM,KAAK,eAAe,QAAQ,MAAM;AACrG,QAAI,KAAK,OAAQ,OAAM,IAAI,gBAAgB,GAAG,cAAc;AAC5D,QAAI,QAAQ,QAAQ,QAAS,OAAM,IAAI,gBAAgB,GAAG,mBAAmB;AAC7E,UAAM,oBAAoB,IAAI,gBAAgB;AAC9C,UAAM,QAAQ,MAAM,kBAAkB,MAAM,KAAK,gBAAgB,OAAO,MAAM;AAC9E,UAAM,eAAe,MAAM,kBAAkB,MAAM,QAAQ,QAAQ,MAAM;AACzE,SAAK,gBAAgB,OAAO,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AAC3E,YAAQ,QAAQ,iBAAiB,SAAS,cAAc,EAAE,MAAM,KAAK,CAAC;AACtE,QAAI,WAAW;AACf,UAAM,UAAU,WAAW,MAAM;AAC/B,iBAAW;AACX,wBAAkB,MAAM,IAAI,MAAM,iBAAiB,CAAC;AAAA,IACtD,GAAG,KAAK,QAAQ,aAAa,GAAM;AACnC,YAAQ,QAAQ;AAChB,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,UAAU,GAAG,KAAK,QAAQ,QAAQ,QAAQ,OAAO,EAAE,CAAC,GAAG,IAAI,IAAI;AAAA,QACzF,QAAQ,QAAQ,UAAU;AAAA,QAAO,QAAQ,kBAAkB;AAAA,QAC3D,SAAS;AAAA,UACP,CAAC,eAAe,GAAG,KAAK,2BAA2B;AAAA,UACnD,GAAI,QAAQ,kBAAkB,QAAQ,CAAC,IAAI,EAAE,eAAe,UAAU,KAAK,QAAQ,KAAK,GAAG;AAAA,UAC3F,GAAI,KAAK,QAAQ,UAAU,WAAW,EAAE,2BAA2B,KAAK,QAAQ,UAAU,SAAS,IAAI,CAAC;AAAA,UACxG,GAAI,QAAQ,SAAS,SAAY,CAAC,IAAI,EAAE,gBAAgB,mBAAmB;AAAA,QAC7E;AAAA,QACA,MAAM,QAAQ,SAAS,SAAY,SAAY,KAAK,UAAU,QAAQ,IAAI;AAAA,MAC5E,CAAC;AACD,YAAM,YAAY,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC1D,YAAM,iBAAiB,SAAS,QAAQ,IAAI,eAAe;AAC3D,YAAM,kBAAkB,SAAS,QAAQ,IAAI,yBAAyB;AACtE,YAAM,qBAAqB,iBAAiB,MAAM,GAAG,EAAE,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAAE,OAAO,OAAO,KAAK,CAAC;AACxG,YAAM,uBACJ,mBAAmB,QAAQ,oBAAoB,QAC/C,CAAE,4BAAkD,SAAS,cAAc,KAC3E,CAAC,mBAAmB,SAAS,cAAc,KAC3C,mBAAmB;AAErB,UAAI,eAAe,sBAAsB;AACvC,cAAM,IAAI,gBAAgB,KAAK,qBAAqB,WAAW;AAAA,UAC7D,UAAU;AAAA,UACV,UAAU;AAAA,UACV,WAAW;AAAA,QACb,CAAC;AAAA,MACH;AACA,YAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC5D,YAAM,UAAU,YAAY,WAAW,kBAAkB,IACrD,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE,IACtC,MAAM,SAAS,KAAK;AACxB,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,WAAW,WAAW,OAAO,YAAY,WAAY,QAAgB,QAAQ;AACnF,cAAM,IAAI;AAAA,UACR,SAAS;AAAA,UACT,UAAU,QAAQ;AAAA,UAClB,UAAU,aAAa;AAAA,UACvB,UAAU,WAAW;AAAA,UACrB,UAAU,WAAW,gCAAgC,UAAU,QAAQ,gBAAgB;AAAA,QACzF;AAAA,MACF;AACA,UAAI,YAAa,MAAK,0BAA0B;AAChD,UAAI,CAAC,YAAa,QAAO;AACzB,aAAO,cAAc,aAAa,OAAO;AAAA,IAC3C,SAAS,OAAO;AACd,UAAI,iBAAiB,gBAAiB,OAAM;AAC5C,UAAI,iBAAiB,uBAAuB;AAC1C,cAAM,IAAI,gBAAgB,MAAM,QAAQ,MAAM,MAAM,QAAW;AAAA,UAC7D,WAAW,MAAM;AAAA,UACjB,QAAQ,MAAM;AAAA,QAChB,GAAG,MAAM,OAAO;AAAA,MAClB;AACA,UAAI,KAAK,OAAQ,OAAM,IAAI,gBAAgB,GAAG,cAAc;AAC5D,UAAI,QAAQ,QAAQ,QAAS,OAAM,IAAI,gBAAgB,GAAG,mBAAmB;AAC7E,UAAI,SAAU,OAAM,IAAI,gBAAgB,KAAK,iBAAiB;AAC9D,UAAI,iBAAiB,UAAU,MAAM,SAAS,kBAAkB,MAAM,SAAS,eAAe;AAC5F,cAAM,IAAI,gBAAgB,KAAK,iBAAiB;AAAA,MAClD;AACA,YAAM,IAAI,gBAAgB,GAAG,eAAe;AAAA,IAC9C,UAAE;AACA,mBAAa,OAAO;AACpB,WAAK,gBAAgB,OAAO,oBAAoB,SAAS,KAAK;AAC9D,cAAQ,QAAQ,oBAAoB,SAAS,YAAY;AAAA,IAC3D;AAAA,EACF;AAAA,EAEQ,eAAe,QAAuC;AAC5D,QAAI,KAAK,wBAAyB,QAAO,QAAQ,QAAQ,KAAK,uBAAuB;AACrF,QAAI,CAAC,KAAK,eAAe;AACvB,WAAK,gBAAgB,KAAK,QAAQ,UAAU,cAAc,EAAE,QAAQ,mBAAmB,KAAK,CAAC,EAC1F,KAAK,MAAM,KAAK,uBAAwB,EACxC,QAAQ,MAAM;AAAE,aAAK,gBAAgB;AAAA,MAAW,CAAC;AAAA,IACtD;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EACA,MAAM,eAAiC;AAAE,WAAO,KAAK,QAAQ,gBAAgB,kBAAkB;AAAA,EAAG;AAAA,EAE1F,gBAAgB,WAA4B,kBAAkB,MAAY;AAChF,UAAM,WAAW,KAAK,QAAQ;AAC9B,QACE,UAAU,cAAc,SAAS,aACjC,UAAU,UAAU,SAAS,SAC5B,mBAAmB,UAAU,aAAa,SAAS,UACpD;AACA,YAAM,IAAI,gBAAgB,KAAK,oBAAoB;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,SAAwD,UAAoC,CAAC,GAAiC;AAChJ,SAAK,gBAAgB,EAAE,WAAW,QAAQ,WAAW,OAAO,QAAQ,OAAO,GAAG,KAAK;AACnF,UAAM,KAAK,eAAe,QAAQ,MAAM;AACxC,UAAM,EAAE,WAAW,YAAY,QAAQ,SAAS,GAAG,MAAM,IAAI;AAC7D,WAAO,KAAK,QAAQ,mBAAmB,gBAAgB,EAAE,QAAQ,QAAQ,MAAM,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAAA,EAChH;AAAA,EACA,MAAM,aAAa,WAA4B,QAAsB,CAAC,GAAG,UAAoC,CAAC,GAAyB;AACrI,SAAK,gBAAgB,SAAS;AAC9B,UAAM,eAAe;AACrB,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,aAAa,OAAQ,QAAO,IAAI,UAAU,aAAa,MAAM;AACjE,QAAI,aAAa,QAAS,QAAO,IAAI,WAAW,aAAa,OAAO;AACpE,QAAI,aAAa,aAAc,QAAO,IAAI,gBAAgB,aAAa,YAAY;AACnF,QAAI,aAAa,MAAO,QAAO,IAAI,SAAS,OAAO,aAAa,KAAK,CAAC;AACtE,QAAI,aAAa,eAAgB,QAAO,IAAI,kBAAkB,MAAM;AACpE,QAAI,aAAa,OAAQ,QAAO,IAAI,UAAU,aAAa,MAAM;AACjE,QAAI,aAAa,QAAS,QAAO,IAAI,WAAW,aAAa,OAAO;AACpE,QAAI,aAAa,MAAO,QAAO,IAAI,SAAS,aAAa,KAAK;AAC9D,QAAI,aAAa,SAAU,QAAO,IAAI,YAAY,aAAa,QAAQ;AACvE,QAAI,aAAa,OAAQ,QAAO,IAAI,UAAU,MAAM;AACpD,eAAW,QAAQ,aAAa,SAAS,CAAC,EAAG,QAAO,OAAO,QAAQ,IAAI;AACvE,WAAO,KAAK,QAAQ,WAAW,cAAc,OAAO,OAAO,IAAI,MAAM,KAAK,EAAE,IAAI,EAAE,QAAQ,QAAQ,OAAO,CAAC;AAAA,EAC5G;AAAA,EACA,MAAM,cAAc,WAA4B,KAAgC;AAC9E,SAAK,gBAAgB,WAAW,KAAK;AACrC,YAAQ,MAAM,KAAK,QAAQ,kBAAkB,gBAAgB,EAAE,QAAQ,QAAQ,MAAM,EAAE,YAAY,IAAI,EAAE,CAAC,GAAG;AAAA,EAC/G;AAAA,EACA,MAAM,YAAY,WAAwD;AACxE,SAAK,gBAAgB,SAAS;AAC9B,UAAM,SAAS,MAAM,KAAK,QAAQ,UAAU,YAAY;AACxD,SAAK,qBAAqB,MAAM;AAChC,WAAO;AAAA,EACT;AAAA,EACA,MAAM,cAAc,WAA4B,SAAuD;AACrG,SAAK,gBAAgB,SAAS;AAC9B,YAAQ,MAAM,KAAK,QAAQ,kBAAkB,wBAAwB,EAAE,QAAQ,QAAQ,MAAM,QAAQ,CAAC,IAAI,YAAY;AAAA,EACxH;AAAA,EACA,MAAM,eAAe,WAA4B,QAAmD,CAAC,GAAG;AACtG,SAAK,gBAAgB,SAAS;AAAG,UAAM,SAAO,IAAI,gBAAgB;AAAG,QAAG,MAAM,OAAO,QAAO,IAAI,UAAS,MAAM,MAAM;AAAE,QAAG,MAAM,MAAM,QAAO,IAAI,SAAQ,OAAO,MAAM,KAAK,CAAC;AAAE,QAAG,MAAM,KAAK,QAAO,IAAI,QAAO,MAAM,IAAI;AAAE,QAAG,MAAM,UAAU,QAAO,IAAI,aAAY,MAAM,SAAS;AAAE,QAAG,MAAM,UAAU,QAAO,IAAI,aAAY,MAAM,SAAS;AAAE,eAAU,SAAS,MAAM,UAAQ,CAAC,EAAE,QAAO,OAAO,SAAQ,KAAK;AAAE,WAAO,KAAK,QAAQ,mBAAkB,iBAAiB,OAAO,OAAK,IAAI,MAAM,KAAG,EAAE,EAAE;AAAA,EACve;AAAA,EACA,MAAM,mBAAmB,WAA2B,IAAU,QAAqC,CAAC,GAAG;AAAE,SAAK,gBAAgB,SAAS;AAAE,UAAM,SAAO,IAAI,gBAAgB;AAAE,QAAG,MAAM,OAAO,QAAO,IAAI,UAAS,MAAM,MAAM;AAAE,QAAG,MAAM,MAAM,QAAO,IAAI,SAAQ,OAAO,MAAM,KAAK,CAAC;AAAE,WAAO,KAAK,QAAQ,wBAAuB,kBAAkB,EAAE,UAAU,OAAO,OAAK,IAAI,MAAM,KAAG,EAAE,EAAE;AAAA,EAAG;AAAA,EAC9X,MAAM,eAAe,WAA0B,IAAU;AAAC,SAAK,gBAAgB,SAAS;AAAE,YAAQ,MAAM,KAAK,QAAQ,mBAAkB,kBAAkB,EAAE,WAAU,EAAC,QAAO,QAAO,MAAK,CAAC,EAAC,CAAC,GAAG;AAAA,EAAS;AAAA,EACxM,MAAM,gBAAgB,WAA0B,IAAU;AAAC,SAAK,gBAAgB,SAAS;AAAE,YAAQ,MAAM,KAAK,QAAQ,oBAAmB,kBAAkB,EAAE,YAAW,EAAC,QAAO,QAAO,MAAK,CAAC,EAAC,CAAC,GAAG;AAAA,EAAS;AAAA,EAC3M,MAAM,cAAc,WAA4B,IAAY,OAAe,SAAiD;AAC1H,SAAK,gBAAgB,SAAS;AAC9B,QAAI;AACF,cAAQ,MAAM,KAAK,QAAQ,mBAAmB,kBAAkB,EAAE,WAAW,EAAE,QAAQ,QAAQ,MAAM,EAAE,YAAY,OAAO,QAAQ,EAAE,CAAC,GAAG;AAAA,IAC1I,SAAS,OAAO;AACd,UAAI,iBAAiB,mBAAmB,MAAM,WAAW,IAAK,QAAO;AACrE,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,MAAM,eAAe,WAA4B,IAAY,OAAe,OAAsC,OAAgB,cAAyF;AACzN,SAAK,gBAAgB,SAAS;AAC9B,UAAM,KAAK,eAAe;AAC1B,UAAM,SAAS,UAAU,UAAU,QAAQ;AAC3C,QAAI;AACF,YAAM,cAAc,WAAW,QAAQ,yBAAyB;AAChE,YAAM,WAAW,EAAE,YAAY,OAAO,OAAO,aAAa,UAAU,SAAS,SAAS,QAAQ;AAC9F,cAAQ,MAAM,KAAK,QAAQ,aAAa,kBAAkB,EAAE,IAAI,MAAM,IAAI,EAAE,QAAQ,QAAQ,MAAM,WAAW,QAAQ,EAAE,YAAY,MAAM,IAAI,SAAS,CAAC,GAAG;AAAA,IAC5J,SAAS,QAAQ;AACf,UAAI,kBAAkB,mBAAmB,OAAO,WAAW,IAAK,QAAO;AACvE,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,MAAM,UAAU,WAA4B,SAAiB,aAAsB,eAAyB,CAAC,GAA2B;AACtI,SAAK,gBAAgB,SAAS;AAC9B,WAAO,KAAK,QAAQ,aAAa,0BAA0B,EAAE,QAAQ,QAAQ,MAAM,EAAE,SAAS,aAAa,aAAa,EAAE,CAAC;AAAA,EAC7H;AAAA,EACA,MAAM,aAAa,WAAsD;AACvE,SAAK,gBAAgB,SAAS;AAC9B,YAAQ,MAAM,KAAK,QAAQ,YAAY,cAAc,GAAG;AAAA,EAC1D;AAAA,EACA,MAAM,QAAuB;AAC3B,QAAI,KAAK,OAAQ;AACjB,SAAK,SAAS;AACd,SAAK,gBAAgB,MAAM,IAAI,MAAM,cAAc,CAAC;AAAA,EACtD;AACF;","names":[]}
|