@creatornader/agent-bridge 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/CHANGELOG.md +150 -1
  2. package/README.md +239 -5
  3. package/ROADMAP.md +59 -7
  4. package/SECURITY.md +55 -5
  5. package/SKILL.md +103 -0
  6. package/dist/archive.d.ts +2 -2
  7. package/dist/archive.js +2 -2
  8. package/dist/{bridge-service-hX1ZQp4W.d.ts → bridge-service-YTjGr91A.d.ts} +1 -1
  9. package/dist/{bridge-store-DPVSCwfs.d.ts → bridge-store-Boaj-ZbO.d.ts} +2 -0
  10. package/dist/bridge.d.ts +17 -7
  11. package/dist/bridge.js +15 -7
  12. package/dist/{chunk-WAI2IYIQ.js → chunk-3YHVUPU2.js} +48 -5
  13. package/dist/chunk-3YHVUPU2.js.map +1 -0
  14. package/dist/{chunk-45BZGB77.js → chunk-6BTJE6D4.js} +168 -7
  15. package/dist/chunk-6BTJE6D4.js.map +1 -0
  16. package/dist/{chunk-5GMB3A77.js → chunk-DQOZJJZ2.js} +22 -10
  17. package/dist/chunk-DQOZJJZ2.js.map +1 -0
  18. package/dist/{chunk-NCO7RLBM.js → chunk-GTK4KOED.js} +108 -8
  19. package/dist/chunk-GTK4KOED.js.map +1 -0
  20. package/dist/{chunk-GADH244D.js → chunk-IHZFI7TH.js} +12 -4
  21. package/dist/chunk-IHZFI7TH.js.map +1 -0
  22. package/dist/{chunk-CEXBMOI5.js → chunk-LAHNQZDN.js} +2 -2
  23. package/dist/{chunk-UAHMP6GC.js → chunk-MCKKVNCE.js} +9 -6
  24. package/dist/chunk-MCKKVNCE.js.map +1 -0
  25. package/dist/{chunk-MBPZXTJA.js → chunk-PDIHDBP3.js} +173 -20
  26. package/dist/chunk-PDIHDBP3.js.map +1 -0
  27. package/dist/{chunk-Q6PPMXJC.js → chunk-SV3SVBYS.js} +377 -21
  28. package/dist/chunk-SV3SVBYS.js.map +1 -0
  29. package/dist/{chunk-SPSMZOCJ.js → chunk-SYGONYMM.js} +4 -4
  30. package/dist/{chunk-A6W4QALF.js → chunk-TC6A7GMF.js} +2 -2
  31. package/dist/cli.js +5865 -436
  32. package/dist/cli.js.map +1 -1
  33. package/dist/client-runtime.d.ts +4 -2
  34. package/dist/client-runtime.js +6 -6
  35. package/dist/contracts/generate.js +1 -1
  36. package/dist/dr.d.ts +9 -2
  37. package/dist/dr.js +6 -4
  38. package/dist/{gateway-CggQ8vTC.d.ts → gateway-BQHpV-MZ.d.ts} +27 -3
  39. package/dist/gateway-main.js +69 -5
  40. package/dist/gateway-main.js.map +1 -1
  41. package/dist/gateway.d.ts +3 -3
  42. package/dist/gateway.js +2 -2
  43. package/dist/index.js +7 -7
  44. package/dist/{postgres-bridge-store-Bfd3hRId.d.ts → postgres-bridge-store-WASumj26.d.ts} +1 -1
  45. package/dist/server.js +7 -7
  46. package/dist/sqlite-edge-store-Bc15DvpX.d.ts +148 -0
  47. package/dist/sqlite.d.ts +19 -80
  48. package/dist/sqlite.js +11 -3
  49. package/docs/architecture-v2.md +256 -10
  50. package/docs/decisions/0004-client-lifecycle-and-endpoint-migration.md +204 -0
  51. package/docs/deployment.md +205 -0
  52. package/docs/troubleshooting.md +23 -0
  53. package/llms.txt +67 -0
  54. package/openapi/agent-bridge-v2.openapi.json +1023 -0
  55. package/package.json +6 -2
  56. package/schemas/agent-bridge-v2.capabilities.json +24 -0
  57. package/schemas/agent-bridge-v2.mcp.json +6 -0
  58. package/schemas/agent-bridge-v2.schema.json +163 -0
  59. package/sql/migrations/017_gateway_authority_binding.sql +99 -0
  60. package/sql/migrations/018_endpoint_migration_challenges.sql +1028 -0
  61. package/sql/migrations/019_endpoint_migration_same_successor.sql +324 -0
  62. package/dist/chunk-45BZGB77.js.map +0 -1
  63. package/dist/chunk-5GMB3A77.js.map +0 -1
  64. package/dist/chunk-GADH244D.js.map +0 -1
  65. package/dist/chunk-MBPZXTJA.js.map +0 -1
  66. package/dist/chunk-NCO7RLBM.js.map +0 -1
  67. package/dist/chunk-Q6PPMXJC.js.map +0 -1
  68. package/dist/chunk-UAHMP6GC.js.map +0 -1
  69. package/dist/chunk-WAI2IYIQ.js.map +0 -1
  70. /package/dist/{chunk-CEXBMOI5.js.map → chunk-LAHNQZDN.js.map} +0 -0
  71. /package/dist/{chunk-SPSMZOCJ.js.map → chunk-SYGONYMM.js.map} +0 -0
  72. /package/dist/{chunk-A6W4QALF.js.map → chunk-TC6A7GMF.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/sqlite-edge-store.ts","../src/syncing-bridge-store.ts"],"sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { existsSync, lstatSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport type { DatabaseSync as Database, SQLInputValue } from \"node:sqlite\";\nimport {\n cursorScope,\n decodeCursor,\n encodeCursor,\n type BridgeMessage,\n type BridgePrincipal,\n type JsonValue,\n} from \"./bridge-domain.js\";\nimport type { MessagePage, MessageQuery } from \"./bridge-store.js\";\nimport { retrySqliteBusy } from \"./sqlite-retry.js\";\nimport { preparePrivateSqliteLocation, securePrivatePath, verifyPrivatePathAccess } from \"./private-path.js\";\nimport { assertEdgeUpgradeCandidate, installEdgeMarkers } from \"./sqlite-database-contract.js\";\n\nconst require = createRequire(import.meta.url);\nfunction openDatabase(path: string): Database {\n const { DatabaseSync } = require(\"node:sqlite\") as typeof import(\"node:sqlite\");\n return new DatabaseSync(path);\n}\nconst MAX_SEQUENCE = 9_223_372_036_854_775_807n;\n\nconst schema = `\nPRAGMA journal_mode = WAL;\nPRAGMA synchronous = FULL;\nPRAGMA foreign_keys = ON;\nCREATE TABLE IF NOT EXISTS edge_scopes (\n scope_key TEXT PRIMARY KEY,\n endpoint_hash TEXT NOT NULL,\n workspace TEXT NOT NULL,\n agent TEXT NOT NULL,\n pull_cursor TEXT,\n last_sync_at TEXT,\n last_error TEXT,\n last_outbound_sync_at TEXT,\n last_inbound_sync_at TEXT,\n last_attempt_at TEXT,\n cache_contract INTEGER NOT NULL DEFAULT 1\n);\nCREATE TABLE IF NOT EXISTS edge_outbox (\n position INTEGER PRIMARY KEY AUTOINCREMENT,\n scope_key TEXT NOT NULL REFERENCES edge_scopes(scope_key),\n message_id TEXT NOT NULL,\n idempotency_key TEXT NOT NULL,\n payload_hash TEXT NOT NULL,\n draft_json TEXT NOT NULL,\n state TEXT NOT NULL CHECK(state IN ('pending', 'blocked')),\n attempts INTEGER NOT NULL DEFAULT 0,\n available_at TEXT NOT NULL,\n lease_token TEXT,\n lease_expires_at TEXT,\n last_error TEXT,\n blocked_at TEXT,\n created_at TEXT NOT NULL,\n UNIQUE(scope_key, message_id),\n UNIQUE(scope_key, idempotency_key)\n);\nCREATE INDEX IF NOT EXISTS edge_outbox_due\n ON edge_outbox(scope_key, state, available_at, position);\nCREATE TABLE IF NOT EXISTS edge_inbox (\n scope_key TEXT NOT NULL REFERENCES edge_scopes(scope_key),\n message_id TEXT NOT NULL,\n remote_sequence TEXT NOT NULL,\n sequence_key TEXT NOT NULL,\n workspace TEXT NOT NULL,\n project TEXT,\n source TEXT NOT NULL,\n type TEXT NOT NULL,\n thread_id TEXT,\n created_at TEXT NOT NULL,\n expires_at TEXT,\n message_json TEXT NOT NULL,\n PRIMARY KEY(scope_key, message_id),\n UNIQUE(scope_key, sequence_key)\n);\nCREATE INDEX IF NOT EXISTS edge_inbox_cursor\n ON edge_inbox(scope_key, sequence_key);\nCREATE INDEX IF NOT EXISTS edge_inbox_source\n ON edge_inbox(scope_key, source, sequence_key);\nCREATE INDEX IF NOT EXISTS edge_inbox_thread\n ON edge_inbox(scope_key, thread_id, sequence_key);\nCREATE INDEX IF NOT EXISTS edge_inbox_created\n ON edge_inbox(scope_key, created_at, sequence_key);\n`;\n\ntype Row = Record<string, unknown>;\nexport type PendingMessage = Omit<BridgeMessage, \"sequence\" | \"createdAt\">;\n\nexport interface EdgeScope {\n endpoint: string;\n principal: BridgePrincipal;\n}\n\nexport interface EdgeOutboxRecord {\n position: number;\n draft: PendingMessage;\n payloadHash: string;\n attempts: number;\n leaseToken: string;\n createdAt: string;\n}\n\nexport interface EdgeEnqueueResult {\n draft: PendingMessage;\n created: boolean;\n}\n\nexport interface EdgeStats {\n pending: number;\n due: number;\n scheduled: number;\n leased: number;\n blocked: number;\n cached: number;\n pullCursor?: string;\n lastSyncAt?: string;\n lastError?: string;\n oldestDueAt?: string;\n queueLagMs: number;\n oldestBlockedAt?: string;\n blockedAgeMs: number | null;\n blockedMaxAttempts: number;\n blockedLastError?: string;\n nextRetryAt?: string;\n lastOutboundSyncAt?: string;\n lastInboundSyncAt?: string;\n lastAttemptAt?: string;\n}\n\nexport class EdgeConflictError extends Error {\n readonly code = \"edge_idempotency_conflict\";\n}\n\nfunction canonical(value: JsonValue | undefined): string {\n if (value === undefined) return \"null\";\n if (value === null || typeof value !== \"object\") return JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(canonical).join(\",\")}]`;\n return `{${Object.keys(value).filter((key) => value[key] !== undefined).sort()\n .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`).join(\",\")}}`;\n}\n\nfunction intent(message: PendingMessage | BridgeMessage): JsonValue {\n const deliveryPolicy = message.deliveryPolicy ?? (message.targets.length\n ? { mode: \"leased\", maxAttempts: 5, retryBaseDelayMs: 1_000, retryMaxDelayMs: 60_000, retryJitterRatio: 0.2 }\n : { mode: \"mailbox\" });\n return {\n workspace: message.workspace,\n project: message.project ?? null,\n source: message.source,\n type: message.type,\n content: message.content,\n contentType: message.contentType,\n data: message.data ?? null,\n targets: [...message.targets].sort(),\n threadId: message.threadId ?? null,\n replyToId: message.replyToId ?? null,\n correlationId: message.correlationId ?? null,\n causationId: message.causationId ?? null,\n priority: message.priority,\n expiresAt: message.expiresAt ?? null,\n atribReceiptId: message.atribReceiptId ?? null,\n informedBy: [...(message.informedBy ?? [])].sort(),\n metadata: message.metadata ?? null,\n deliveryPolicy: deliveryPolicy as unknown as JsonValue,\n };\n}\n\nexport function edgeMessageFingerprint(message: PendingMessage | BridgeMessage): string {\n return createHash(\"sha256\").update(canonical(intent(message))).digest(\"hex\");\n}\n\nexport function stableIdempotency(message: PendingMessage): PendingMessage {\n return message.idempotencyKey\n ? message\n : { ...message, idempotencyKey: `agent-bridge:id:${message.id}` };\n}\n\nexport function edgeScopeKey(scope: EdgeScope): string {\n return createHash(\"sha256\")\n .update(`${scope.endpoint.replace(/\\/$/, \"\")}\\0${scope.principal.workspace}\\0${scope.principal.agent}`)\n .digest(\"hex\");\n}\n\nfunction sequenceKey(sequence: string): string {\n if (!/^(0|[1-9][0-9]*)$/.test(sequence) || BigInt(sequence) > MAX_SEQUENCE) {\n throw new EdgeConflictError(\"remote sequence is invalid\");\n }\n return sequence.padStart(19, \"0\");\n}\n\nfunction parseDraft(value: unknown): PendingMessage {\n return JSON.parse(String(value)) as PendingMessage;\n}\n\nfunction parseMessage(value: unknown): BridgeMessage {\n return JSON.parse(String(value)) as BridgeMessage;\n}\n\nexport class SQLiteEdgeStore {\n private readonly db: Database;\n private readonly databasePath: string;\n private readonly preexistingFiles: ReadonlySet<string>;\n private readonly key: string;\n private initialized = false;\n private initialization?: Promise<void>;\n\n constructor(private readonly path: string, private readonly scope: EdgeScope, private readonly busyTimeoutMs = 2_000) {\n const selected = preparePrivateSqliteLocation(path, true);\n this.databasePath = selected;\n this.preexistingFiles = new Set(selected === \":memory:\" ? [] : [selected, `${selected}-wal`, `${selected}-shm`].filter(existsSync));\n const before = selected === \":memory:\" || !existsSync(selected) ? undefined : lstatSync(selected);\n this.db = openDatabase(selected);\n try {\n this.db.exec(`PRAGMA busy_timeout = ${Math.max(1, Math.trunc(this.busyTimeoutMs))}`);\n this.restrictFiles();\n if (before) {\n const after = lstatSync(selected);\n if (after.dev !== before.dev || after.ino !== before.ino) throw new Error(\"SQLite edge database path identity changed while opening\");\n }\n } catch (error) { this.db.close(); throw error; }\n this.key = edgeScopeKey(scope);\n }\n\n private restrictFiles(): void {\n if (this.databasePath === \":memory:\") return;\n for (const path of [this.databasePath, `${this.databasePath}-wal`, `${this.databasePath}-shm`]) {\n if (!existsSync(path)) continue;\n if (path === this.databasePath && this.preexistingFiles.has(path)) verifyPrivatePathAccess(path, \"file\");\n else securePrivatePath(path, \"file\");\n }\n }\n\n get scopeKey(): string {\n return this.key;\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n if (!this.initialization) {\n this.initialization = this.initializeOnce().then(() => {\n this.initialized = true;\n }).catch((error) => {\n this.initialization = undefined;\n throw error;\n });\n }\n return this.initialization;\n }\n\n private async initializeOnce(): Promise<void> {\n assertEdgeUpgradeCandidate(this.db);\n await retrySqliteBusy(() => this.db.exec(schema), this.busyTimeoutMs);\n await retrySqliteBusy(() => this.db.exec(\"BEGIN IMMEDIATE\"), this.busyTimeoutMs);\n try {\n const scopeColumns = this.db.prepare(\"PRAGMA table_info(edge_scopes)\").all() as Row[];\n if (!scopeColumns.some((column) => column.name === \"cache_contract\")) {\n this.db.exec(\"ALTER TABLE edge_scopes ADD COLUMN cache_contract INTEGER NOT NULL DEFAULT 0\");\n }\n for (const name of [\"last_outbound_sync_at\", \"last_inbound_sync_at\", \"last_attempt_at\"]) {\n if (!scopeColumns.some((column) => column.name === name)) {\n this.db.exec(`ALTER TABLE edge_scopes ADD COLUMN ${name} TEXT`);\n }\n }\n const columns = this.db.prepare(\"PRAGMA table_info(edge_inbox)\").all() as Row[];\n if (!columns.some((column) => column.name === \"project\")) {\n this.db.exec(\"ALTER TABLE edge_inbox ADD COLUMN project TEXT\");\n }\n this.db.exec(\"CREATE INDEX IF NOT EXISTS edge_inbox_project ON edge_inbox(scope_key, project, sequence_key)\");\n const outboxColumns = this.db.prepare(\"PRAGMA table_info(edge_outbox)\").all() as Row[];\n if (!outboxColumns.some((column) => column.name === \"blocked_at\")) {\n this.db.exec(\"ALTER TABLE edge_outbox ADD COLUMN blocked_at TEXT\");\n }\n installEdgeMarkers(this.db);\n this.db.exec(\"COMMIT\");\n } catch (error) {\n this.db.exec(\"ROLLBACK\");\n throw error;\n }\n this.restrictFiles();\n const endpointHash = createHash(\"sha256\").update(this.scope.endpoint.replace(/\\/$/, \"\")).digest(\"hex\");\n this.db.prepare(`INSERT INTO edge_scopes (scope_key, endpoint_hash, workspace, agent)\n VALUES (?, ?, ?, ?) ON CONFLICT(scope_key) DO NOTHING`)\n .run(this.key, endpointHash, this.scope.principal.workspace, this.scope.principal.agent);\n const contract = this.db.prepare(\"SELECT cache_contract FROM edge_scopes WHERE scope_key=?\").get(this.key) as Row;\n if (Number(contract.cache_contract) < 1) {\n this.db.exec(\"BEGIN IMMEDIATE\");\n try {\n this.db.prepare(\"UPDATE edge_scopes SET pull_cursor=NULL, cache_contract=1 WHERE scope_key=?\").run(this.key);\n this.db.exec(\"COMMIT\");\n } catch (error) { this.db.exec(\"ROLLBACK\"); throw error; }\n }\n }\n\n private async ready(): Promise<void> {\n await this.initialize();\n }\n\n async enqueue(input: PendingMessage, now = new Date()): Promise<EdgeEnqueueResult> {\n await this.ready();\n const draft = stableIdempotency(input);\n const payloadHash = edgeMessageFingerprint(draft);\n const serialized = canonical(draft as unknown as JsonValue);\n const nowText = now.toISOString();\n this.db.exec(\"BEGIN IMMEDIATE\");\n try {\n const existing = this.db.prepare(`SELECT * FROM edge_outbox\n WHERE scope_key=? AND (message_id=? OR idempotency_key=?) ORDER BY position LIMIT 1`)\n .get(this.key, draft.id, draft.idempotencyKey!) as Row | undefined;\n if (existing) {\n if (String(existing.payload_hash) !== payloadHash) {\n throw new EdgeConflictError(\"message ID or idempotency key is already bound to different content\");\n }\n this.db.exec(\"COMMIT\");\n return { draft: parseDraft(existing.draft_json), created: false };\n }\n this.db.prepare(`INSERT INTO edge_outbox\n (scope_key, message_id, idempotency_key, payload_hash, draft_json, state, available_at, created_at)\n VALUES (?, ?, ?, ?, ?, 'pending', ?, ?)`)\n .run(this.key, draft.id, draft.idempotencyKey!, payloadHash, serialized, nowText, nowText);\n this.db.exec(\"COMMIT\");\n return { draft, created: true };\n } catch (error) {\n this.db.exec(\"ROLLBACK\");\n throw error;\n }\n }\n\n async claimNext(now = new Date(), leaseMs = 30_000): Promise<EdgeOutboxRecord | undefined> {\n await this.ready();\n const nowText = now.toISOString();\n this.db.exec(\"BEGIN IMMEDIATE\");\n try {\n const head = this.db.prepare(`SELECT * FROM edge_outbox\n WHERE scope_key=? AND state='pending' AND available_at<=?\n AND (lease_expires_at IS NULL OR lease_expires_at<=?)\n ORDER BY position LIMIT 1`).get(this.key, nowText, nowText) as Row | undefined;\n if (!head) {\n this.db.exec(\"COMMIT\");\n return undefined;\n }\n const leaseToken = randomUUID();\n const leaseExpiresAt = new Date(now.getTime() + leaseMs).toISOString();\n const updated = this.db.prepare(`UPDATE edge_outbox\n SET lease_token=?, lease_expires_at=? WHERE scope_key=? AND position=?\n AND (lease_expires_at IS NULL OR lease_expires_at<=?)`)\n .run(leaseToken, leaseExpiresAt, this.key, Number(head.position), nowText);\n if (!updated.changes) {\n this.db.exec(\"COMMIT\");\n return undefined;\n }\n this.db.exec(\"COMMIT\");\n return {\n position: Number(head.position),\n draft: parseDraft(head.draft_json),\n payloadHash: String(head.payload_hash),\n attempts: Number(head.attempts),\n leaseToken,\n createdAt: String(head.created_at),\n };\n } catch (error) {\n this.db.exec(\"ROLLBACK\");\n throw error;\n }\n }\n\n async retry(record: EdgeOutboxRecord, error: string, availableAt: Date): Promise<void> {\n await this.ready();\n this.db.prepare(`UPDATE edge_outbox SET attempts=attempts+1, available_at=?,\n lease_token=NULL, lease_expires_at=NULL, last_error=?\n WHERE scope_key=? AND position=? AND lease_token=?`)\n .run(availableAt.toISOString(), error.slice(0, 256), this.key, record.position, record.leaseToken);\n await this.noteError(error);\n }\n\n async block(record: EdgeOutboxRecord, error: string, now = new Date()): Promise<void> {\n await this.ready();\n this.db.prepare(`UPDATE edge_outbox SET state='blocked', attempts=attempts+1,\n lease_token=NULL, lease_expires_at=NULL, last_error=?, blocked_at=?\n WHERE scope_key=? AND position=? AND lease_token=?`)\n .run(error.slice(0, 256), now.toISOString(), this.key, record.position, record.leaseToken);\n await this.noteError(error);\n }\n\n async commit(\n record: EdgeOutboxRecord,\n message: BridgeMessage,\n now = new Date(),\n ): Promise<void> {\n await this.ready();\n this.db.exec(\"BEGIN IMMEDIATE\");\n try {\n this.cacheOne(message);\n const deleted = this.db.prepare(`DELETE FROM edge_outbox\n WHERE scope_key=? AND position=? AND lease_token=?`)\n .run(this.key, record.position, record.leaseToken);\n if (deleted.changes !== 1) throw new EdgeConflictError(\"outbox lease was lost before commit\");\n this.db.prepare(`UPDATE edge_scopes SET last_sync_at=?, last_error=NULL WHERE scope_key=?`)\n .run(now.toISOString(), this.key);\n this.db.prepare(\"UPDATE edge_scopes SET last_outbound_sync_at=? WHERE scope_key=?\")\n .run(now.toISOString(), this.key);\n this.db.exec(\"COMMIT\");\n } catch (error) {\n this.db.exec(\"ROLLBACK\");\n throw error;\n }\n }\n\n private cacheOne(message: BridgeMessage): void {\n const serialized = canonical(message as unknown as JsonValue);\n const key = sequenceKey(message.sequence);\n const byId = this.db.prepare(`SELECT remote_sequence, message_json FROM edge_inbox\n WHERE scope_key=? AND message_id=?`).get(this.key, message.id) as Row | undefined;\n const bySequence = this.db.prepare(`SELECT message_id, message_json FROM edge_inbox\n WHERE scope_key=? AND sequence_key=?`).get(this.key, key) as Row | undefined;\n if (byId || bySequence) {\n if (\n !byId ||\n String(byId.remote_sequence) !== message.sequence ||\n String(byId.message_json) !== serialized ||\n (bySequence && String(bySequence.message_id) !== message.id)\n ) {\n throw new EdgeConflictError(\"cached message conflicts with immutable remote history\");\n }\n return;\n }\n this.db.prepare(`INSERT INTO edge_inbox\n (scope_key, message_id, remote_sequence, sequence_key, workspace, project, source, type,\n thread_id, created_at, expires_at, message_json)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)\n .run(this.key, message.id, message.sequence, key, message.workspace, message.project ?? null, message.source,\n message.type, message.threadId ?? null, message.createdAt, message.expiresAt ?? null, serialized);\n }\n\n async cachePage(messages: BridgeMessage[], cursor: string | undefined, now = new Date()): Promise<void> {\n await this.ready();\n const scope = cursorScope(this.scope.principal, { mailbox: \"all\", includeExpired: true });\n this.db.exec(\"BEGIN IMMEDIATE\");\n try {\n for (const message of messages) this.cacheOne(message);\n const current = this.db.prepare(\"SELECT pull_cursor FROM edge_scopes WHERE scope_key=?\")\n .get(this.key) as Row;\n const currentCursor = current.pull_cursor ? String(current.pull_cursor) : undefined;\n const nextCursor = !cursor\n ? currentCursor\n : !currentCursor || sequenceKey(decodeCursor(cursor, scope)!) >= sequenceKey(decodeCursor(currentCursor, scope)!)\n ? cursor\n : currentCursor;\n this.db.prepare(`UPDATE edge_scopes SET pull_cursor=?, last_sync_at=?, last_error=NULL\n WHERE scope_key=?`).run(nextCursor ?? null, now.toISOString(), this.key);\n this.db.prepare(\"UPDATE edge_scopes SET last_inbound_sync_at=? WHERE scope_key=?\")\n .run(now.toISOString(), this.key);\n this.db.exec(\"COMMIT\");\n } catch (error) {\n this.db.exec(\"ROLLBACK\");\n throw error;\n }\n }\n\n async cacheLatest(messages: BridgeMessage[], now = new Date()): Promise<void> {\n await this.ready();\n this.db.exec(\"BEGIN IMMEDIATE\");\n try {\n for (const message of messages) this.cacheOne(message);\n this.db.prepare(`UPDATE edge_scopes SET last_sync_at=?, last_error=NULL WHERE scope_key=?`)\n .run(now.toISOString(), this.key);\n this.db.prepare(\"UPDATE edge_scopes SET last_inbound_sync_at=? WHERE scope_key=?\")\n .run(now.toISOString(), this.key);\n this.db.exec(\"COMMIT\");\n } catch (error) {\n this.db.exec(\"ROLLBACK\");\n throw error;\n }\n }\n\n async list(query: MessageQuery = {}): Promise<MessagePage> {\n await this.ready();\n const scope = cursorScope(this.scope.principal, query);\n const inputSequence = query.latest ? undefined : decodeCursor(query.cursor, scope) ?? \"0\";\n const cachedHighWater = query.latest ? undefined : this.db.prepare(`SELECT remote_sequence\n FROM edge_inbox WHERE scope_key=? ORDER BY sequence_key DESC LIMIT 1`)\n .get(this.key) as Row | undefined;\n const syncState = query.latest ? undefined : this.db.prepare(\n \"SELECT pull_cursor FROM edge_scopes WHERE scope_key=?\",\n ).get(this.key) as Row | undefined;\n const syncScope = cursorScope(this.scope.principal, {\n mailbox: \"all\",\n includeExpired: true,\n });\n const syncSequence = syncState?.pull_cursor\n ? decodeCursor(String(syncState.pull_cursor), syncScope) ?? \"0\"\n : \"0\";\n const highWaterSequence = query.latest ? undefined : [\n inputSequence ?? \"0\",\n syncSequence,\n cachedHighWater?.remote_sequence ? String(cachedHighWater.remote_sequence) : \"0\",\n ].reduce((highest, candidate) => (\n sequenceKey(candidate) > sequenceKey(highest) ? candidate : highest\n ), \"0\");\n // Receipts are remote authority and are deliberately not mirrored. During\n // an outage callers may still inspect the cached candidate set, but the\n // wrapping store must label acknowledgement state as unknown.\n const clauses = [\"scope_key=?\"];\n const args: SQLInputValue[] = [this.key];\n if (!query.latest) {\n clauses.push(\"sequence_key>?\");\n args.push(sequenceKey(inputSequence ?? \"0\"));\n }\n if (!query.includeExpired) {\n clauses.push(\"(expires_at IS NULL OR expires_at>?)\");\n args.push(new Date().toISOString());\n }\n if (query.types?.length) {\n clauses.push(`type IN (${query.types.map(() => \"?\").join(\",\")})`);\n args.push(...query.types);\n }\n if (query.source) {\n clauses.push(\"source=?\");\n args.push(query.source);\n }\n const mailbox = query.mailbox ?? \"inbox\";\n if (mailbox === \"sent\") { clauses.push(\"source=?\"); args.push(this.scope.principal.agent); }\n else if (mailbox !== \"all\") {\n clauses.push(\"(json_array_length(json_extract(message_json, '$.targets'))=0 OR EXISTS (SELECT 1 FROM json_each(json_extract(message_json, '$.targets')) WHERE value=?))\");\n args.push(this.scope.principal.agent);\n } else {\n clauses.push(\"(source=? OR json_array_length(json_extract(message_json, '$.targets'))=0 OR EXISTS (SELECT 1 FROM json_each(json_extract(message_json, '$.targets')) WHERE value=?))\");\n args.push(this.scope.principal.agent, this.scope.principal.agent);\n }\n if (query.project) {\n clauses.push(\"project=?\");\n args.push(query.project);\n }\n if (query.since) {\n clauses.push(\"created_at>=?\");\n args.push(query.since);\n }\n if (query.threadId) {\n clauses.push(\"thread_id=?\");\n args.push(query.threadId);\n }\n const limit = Math.min(Math.max(Math.trunc(query.limit ?? 50), 1), 200);\n const rows = this.db.prepare(`SELECT message_json FROM edge_inbox\n WHERE ${clauses.join(\" AND \")} ORDER BY sequence_key ${query.latest ? \"DESC\" : \"ASC\"} LIMIT ?`)\n .all(...args, limit) as Row[];\n const messages = rows.map((row) => parseMessage(row.message_json));\n const cursorMessage = query.latest ? messages[0] : messages[messages.length - 1];\n if (query.latest || messages.length === limit) {\n return { messages, cursor: cursorMessage ? encodeCursor(cursorMessage.sequence, scope) : query.cursor };\n }\n return {\n messages,\n cursor: highWaterSequence && highWaterSequence !== \"0\"\n ? encodeCursor(highWaterSequence, scope)\n : query.cursor,\n };\n }\n\n async pullCursor(): Promise<string | undefined> {\n await this.ready();\n const row = this.db.prepare(\"SELECT pull_cursor FROM edge_scopes WHERE scope_key=?\")\n .get(this.key) as Row;\n return row.pull_cursor ? String(row.pull_cursor) : undefined;\n }\n\n async noteError(error: string): Promise<void> {\n await this.ready();\n this.db.prepare(\"UPDATE edge_scopes SET last_error=? WHERE scope_key=?\")\n .run(error.slice(0, 256), this.key);\n }\n\n async noteAttempt(now = new Date()): Promise<void> {\n await this.ready();\n this.db.prepare(\"UPDATE edge_scopes SET last_attempt_at=? WHERE scope_key=?\")\n .run(now.toISOString(), this.key);\n }\n\n async stats(now = new Date()): Promise<EdgeStats> {\n await this.ready();\n const nowText = now.toISOString();\n const counts = this.db.prepare(`SELECT\n sum(CASE WHEN state='pending' THEN 1 ELSE 0 END) AS pending,\n sum(CASE WHEN state='pending' AND available_at<=? AND (lease_expires_at IS NULL OR lease_expires_at<=?) THEN 1 ELSE 0 END) AS due,\n sum(CASE WHEN state='pending' AND available_at>? AND (lease_expires_at IS NULL OR lease_expires_at<=?) THEN 1 ELSE 0 END) AS scheduled,\n sum(CASE WHEN state='pending' AND lease_expires_at>? THEN 1 ELSE 0 END) AS leased,\n sum(CASE WHEN state='blocked' THEN 1 ELSE 0 END) AS blocked,\n min(CASE WHEN state='pending' AND available_at<=? AND (lease_expires_at IS NULL OR lease_expires_at<=?) THEN available_at END) AS oldest_due,\n min(CASE WHEN state='pending' AND available_at>? AND (lease_expires_at IS NULL OR lease_expires_at<=?) THEN available_at END) AS next_retry,\n min(CASE WHEN state='blocked' THEN blocked_at END) AS oldest_blocked,\n sum(CASE WHEN state='blocked' AND blocked_at IS NULL THEN 1 ELSE 0 END) AS blocked_age_unknown,\n max(CASE WHEN state='blocked' THEN attempts ELSE 0 END) AS blocked_max_attempts\n FROM edge_outbox WHERE scope_key=?`).get(nowText, nowText, nowText, nowText, nowText, nowText, nowText, nowText, nowText, this.key) as Row;\n const blocked = this.db.prepare(\"SELECT last_error FROM edge_outbox WHERE scope_key=? AND state='blocked' ORDER BY coalesce(blocked_at,created_at) LIMIT 1\").get(this.key) as Row | undefined;\n const cache = this.db.prepare(\"SELECT count(*) AS count FROM edge_inbox WHERE scope_key=?\")\n .get(this.key) as Row;\n const state = this.db.prepare(`SELECT pull_cursor, last_sync_at, last_error,\n last_outbound_sync_at,last_inbound_sync_at,last_attempt_at\n FROM edge_scopes WHERE scope_key=?`).get(this.key) as Row;\n const oldestDueAt = counts.oldest_due ? String(counts.oldest_due) : undefined;\n const oldestBlockedAt = Number(counts.blocked_age_unknown ?? 0) > 0\n ? undefined\n : counts.oldest_blocked ? String(counts.oldest_blocked) : undefined;\n return {\n pending: Number(counts.pending ?? 0),\n due: Number(counts.due ?? 0),\n scheduled: Number(counts.scheduled ?? 0),\n leased: Number(counts.leased ?? 0),\n blocked: Number(counts.blocked ?? 0),\n cached: Number(cache.count ?? 0),\n pullCursor: state.pull_cursor ? String(state.pull_cursor) : undefined,\n lastSyncAt: state.last_sync_at ? String(state.last_sync_at) : undefined,\n lastError: state.last_error ? String(state.last_error) : undefined,\n oldestDueAt,\n queueLagMs: oldestDueAt ? Math.max(0, now.getTime() - Date.parse(oldestDueAt)) : 0,\n oldestBlockedAt,\n blockedAgeMs: oldestBlockedAt ? Math.max(0, now.getTime() - Date.parse(oldestBlockedAt)) : null,\n blockedMaxAttempts: Number(counts.blocked_max_attempts ?? 0),\n blockedLastError: blocked?.last_error ? String(blocked.last_error) : undefined,\n nextRetryAt: counts.next_retry ? String(counts.next_retry) : undefined,\n lastOutboundSyncAt: state.last_outbound_sync_at ? String(state.last_outbound_sync_at) : undefined,\n lastInboundSyncAt: state.last_inbound_sync_at ? String(state.last_inbound_sync_at) : undefined,\n lastAttemptAt: state.last_attempt_at ? String(state.last_attempt_at) : undefined,\n };\n }\n\n async close(): Promise<void> {\n this.db.close();\n }\n}\n","import type {\n BridgeDelivery,\n BridgeMessage,\n BridgePrincipal,\n DeliveryState,\n} from \"./bridge-domain.js\";\nimport type {\n BridgeDiagnostics,\n BridgeStore,\n ClaimOptions,\n InsertMessageResult,\n MessagePage,\n MessageQuery,\n} from \"./bridge-store.js\";\nimport {\n edgeMessageFingerprint,\n type PendingMessage,\n SQLiteEdgeStore,\n} from \"./sqlite-edge-store.js\";\n\nexport interface SyncInsertResult extends InsertMessageResult {\n disposition: \"committed\" | \"queued\";\n authoritative: boolean;\n}\n\nexport interface CachedMessagePage extends MessagePage {\n source: \"remote\" | \"cache\";\n stale: boolean;\n degraded: boolean;\n acknowledgements: \"authoritative\" | \"unknown\";\n lastSyncedAt?: string;\n}\n\nexport interface SyncReport {\n online: boolean;\n pushed: number;\n deduplicated: number;\n pulled: number;\n pending: number;\n blocked: number;\n cached: number;\n cursor?: string;\n lastSyncedAt?: string;\n lastError?: string;\n failureRetryable?: boolean;\n}\n\nexport interface SyncDiagnostics extends BridgeDiagnostics {\n remoteReachable: boolean | null;\n outboxPending: number;\n outboxBlocked: number;\n cachedMessages: number;\n lastSyncAt?: string;\n lastSyncError?: string;\n outboxDue: number;\n outboxScheduled: number;\n outboxLeased: number;\n outboxOldestDueAt?: string;\n outboxQueueLagMs: number;\n outboxOldestBlockedAt?: string;\n outboxBlockedAgeMs: number | null;\n outboxBlockedMaxAttempts: number;\n outboxBlockedLastError?: string;\n outboxNextRetryAt?: string;\n lastOutboundSyncAt?: string;\n lastInboundSyncAt?: string;\n lastSyncAttemptAt?: string;\n syncLoopState: \"disabled\" | \"idle\" | \"running\" | \"backoff\" | \"stopped\" | \"failed\";\n syncLoopError?: string;\n remoteError?: string;\n}\n\nexport interface SyncingBridgeStoreOptions {\n now?: () => Date;\n random?: () => number;\n baseDelayMs?: number;\n maxDelayMs?: number;\n leaseMs?: number;\n autoSync?: boolean;\n idleDelayMs?: number;\n}\n\ntype FlushResult =\n | { state: \"empty\" }\n | { state: \"committed\"; result: InsertMessageResult; messageId: string }\n | { state: \"retry\"; error: Error; retryable: boolean }\n | { state: \"blocked\"; error: Error; messageId: string }\n | { state: \"fatal\"; error: Error };\n\nfunction statusOf(error: unknown): number | undefined {\n if (!error || typeof error !== \"object\" || !(\"status\" in error)) return undefined;\n const status = Number((error as { status?: unknown }).status);\n return Number.isFinite(status) ? status : undefined;\n}\n\nfunction codeOf(error: unknown): string {\n if (error && typeof error === \"object\" && \"code\" in error) {\n const code = (error as { code?: unknown }).code;\n if (typeof code === \"string\" && code) return code.slice(0, 128);\n }\n return error instanceof Error ? error.name.slice(0, 128) : \"sync_error\";\n}\n\nexport function isRetryableSyncError(error: unknown): boolean {\n const status = statusOf(error);\n const code = codeOf(error);\n if ([\"network_error\", \"request_timeout\"].includes(code)) return true;\n if ([\"invalid_input\", \"idempotency_conflict\", \"edge_idempotency_conflict\", \"principal_mismatch\", \"protocol_mismatch\", \"store_closed\"].includes(code)) return false;\n return status === 0 || status === 408 || status === 425 ||\n status === 429 || (status !== undefined && status >= 500);\n}\n\nfunction provisional(draft: PendingMessage, createdAt: string): BridgeMessage {\n return { ...draft, sequence: \"0\", createdAt };\n}\n\nexport class SyncingBridgeStore implements BridgeStore {\n private readonly now: () => Date;\n private readonly random: () => number;\n private readonly baseDelayMs: number;\n private readonly maxDelayMs: number;\n private readonly leaseMs: number;\n private readonly autoSync: boolean;\n private readonly idleDelayMs: number;\n private remoteReady: Promise<void> | undefined;\n private stopped = false;\n private wakeTimer: ReturnType<typeof setTimeout> | undefined;\n private wake: (() => void) | undefined;\n private background: Promise<void> | undefined;\n private readonly closeController = new AbortController();\n private backgroundError: unknown;\n private wakeRequested = false;\n private remoteReachable: boolean | null = null;\n private loopState: SyncDiagnostics[\"syncLoopState\"];\n\n constructor(\n private readonly edge: SQLiteEdgeStore,\n private readonly remote: BridgeStore,\n private readonly principal: BridgePrincipal,\n options: SyncingBridgeStoreOptions = {},\n ) {\n this.now = options.now ?? (() => new Date());\n this.random = options.random ?? Math.random;\n this.baseDelayMs = options.baseDelayMs ?? 1_000;\n this.maxDelayMs = options.maxDelayMs ?? 5 * 60_000;\n this.leaseMs = options.leaseMs ?? 30_000;\n this.autoSync = options.autoSync ?? true;\n this.idleDelayMs = Math.max(this.baseDelayMs + 1, options.idleDelayMs ?? 30_000);\n this.loopState = this.autoSync ? \"idle\" : \"disabled\";\n }\n\n async initialize(): Promise<void> {\n // Remote readiness is intentionally deferred so clients can start offline.\n await this.edge.initialize();\n if (this.autoSync) this.startTransportLoop();\n }\n\n private startTransportLoop(): void {\n if (this.background) return;\n this.background = this.transportLoop().catch((error) => {\n this.backgroundError = error;\n this.loopState = \"failed\";\n });\n }\n\n private async wait(delayMs: number): Promise<void> {\n if (this.stopped) return;\n if (this.wakeRequested) {\n this.wakeRequested = false;\n return;\n }\n await new Promise<void>((resolve) => {\n this.wake = resolve;\n this.wakeTimer = setTimeout(resolve, delayMs);\n this.wakeTimer.unref?.();\n });\n this.wake = undefined;\n this.wakeTimer = undefined;\n }\n\n private wakeTransport(): void {\n if (this.wake) {\n if (this.wakeTimer) clearTimeout(this.wakeTimer);\n this.wake();\n }\n else this.wakeRequested = true;\n }\n\n private fatal(error: unknown): Error {\n if (this.backgroundError instanceof Error) return this.backgroundError;\n const cause = error instanceof Error ? error : new Error(String(error));\n const fatal = Object.assign(new Error(`fatal local edge failure: ${cause.message}`), {\n code: \"local_edge_commit_failed\",\n cause,\n });\n this.backgroundError = fatal;\n return fatal;\n }\n\n private assertHealthy(): void {\n if (this.backgroundError) throw this.backgroundError;\n }\n\n private async transportLoop(): Promise<void> {\n let failures = 0;\n await this.wait(this.delay(0));\n while (!this.stopped) {\n this.loopState = \"running\";\n const report = await this.sync({ maxPush: 100, maxPages: 1, signal: this.closeController.signal });\n if (this.stopped) break;\n if (report.failureRetryable === false) {\n this.backgroundError = Object.assign(\n new Error(`gateway synchronization failed permanently: ${report.lastError ?? \"sync_error\"}`),\n { code: report.lastError ?? \"sync_error\" },\n );\n this.loopState = \"failed\";\n return;\n }\n failures = report.online ? 0 : Math.min(failures + 1, 20);\n this.loopState = report.online ? \"idle\" : \"backoff\";\n await this.wait(report.pending > 0 ? this.delay(Math.max(0, failures - 1)) : this.idleDelayMs);\n }\n }\n\n async verifyRemote(): Promise<void> {\n await this.ensureRemote();\n }\n\n private async ensureRemote(signal?: AbortSignal): Promise<void> {\n if (!this.remoteReady) {\n this.remoteReady = this.remote.initialize({ signal }).catch((error) => {\n this.remoteReady = undefined;\n throw error;\n });\n }\n try {\n await this.remoteReady;\n this.remoteReachable = true;\n } catch (error) {\n this.remoteReachable = false;\n throw error;\n }\n }\n\n private assertPrincipal(principal: BridgePrincipal, includeInstance = true): void {\n if (\n principal.workspace !== this.principal.workspace ||\n principal.agent !== this.principal.agent ||\n (includeInstance && principal.instance !== this.principal.instance)\n ) {\n const error = new Error(\"principal does not match the synchronized edge scope\");\n Object.assign(error, { status: 403, code: \"principal_mismatch\" });\n throw error;\n }\n }\n\n private delay(attempts: number): number {\n const exponential = Math.min(this.maxDelayMs, this.baseDelayMs * 2 ** Math.min(attempts, 20));\n const jitter = 0.8 + this.random() * 0.4;\n return Math.max(1, Math.round(exponential * jitter));\n }\n\n private cancelled(signal?: AbortSignal): boolean {\n return this.stopped || Boolean(signal?.aborted);\n }\n\n private async flushOne(signal?: AbortSignal): Promise<FlushResult> {\n await this.edge.noteAttempt(this.now());\n try {\n await this.ensureRemote(signal);\n } catch (error) {\n await this.edge.noteError(codeOf(error));\n return {\n state: \"retry\",\n error: error instanceof Error ? error : new Error(String(error)),\n retryable: isRetryableSyncError(error),\n };\n }\n const record = await this.edge.claimNext(this.now(), this.leaseMs);\n if (!record) return { state: \"empty\" };\n try {\n const result = await this.remote.insertMessage(record.draft, { signal });\n this.remoteReachable = true;\n if (result.message.id !== record.draft.id) {\n const error = new Error(\"idempotency key resolved to a different message ID\");\n Object.assign(error, { status: 409, code: \"idempotency_conflict\" });\n await this.edge.block(record, codeOf(error), this.now());\n return { state: \"blocked\", error, messageId: record.draft.id };\n }\n if (edgeMessageFingerprint(result.message) !== record.payloadHash) {\n const error = new Error(\"idempotency key resolved to different message content\");\n Object.assign(error, { status: 409, code: \"idempotency_conflict\" });\n await this.edge.block(record, codeOf(error), this.now());\n return { state: \"blocked\", error, messageId: record.draft.id };\n }\n try {\n await this.edge.commit(record, result.message, this.now());\n } catch (error) {\n return { state: \"fatal\", error: this.fatal(error) };\n }\n return { state: \"committed\", result, messageId: record.draft.id };\n } catch (error) {\n const caught = error instanceof Error ? error : new Error(String(error));\n this.remoteReachable = isRetryableSyncError(error) ? false : true;\n if (this.cancelled(signal)) {\n await this.edge.retry(record, \"request_cancelled\", this.now());\n return { state: \"retry\", error: caught, retryable: true };\n }\n if (isRetryableSyncError(error)) {\n await this.edge.retry(\n record,\n codeOf(error),\n new Date(this.now().getTime() + this.delay(record.attempts)),\n );\n return { state: \"retry\", error: caught, retryable: true };\n }\n await this.edge.block(record, codeOf(error), this.now());\n return { state: \"blocked\", error: caught, messageId: record.draft.id };\n }\n }\n\n async insertMessage(message: PendingMessage): Promise<SyncInsertResult> {\n this.assertHealthy();\n this.assertPrincipal({ workspace: message.workspace, agent: message.source }, false);\n let remoteError: unknown;\n try {\n await this.ensureRemote();\n } catch (error) {\n if (!isRetryableSyncError(error)) throw error;\n remoteError = error;\n }\n const queued = await this.edge.enqueue(message, this.now());\n const draft = queued.draft;\n if (remoteError) {\n await this.edge.noteError(codeOf(remoteError));\n this.wakeTransport();\n return {\n message: provisional(draft, this.now().toISOString()),\n created: queued.created,\n disposition: \"queued\",\n authoritative: false,\n };\n }\n const flushed = await this.flushOne();\n if (flushed.state === \"fatal\") throw flushed.error;\n if (flushed.state === \"blocked\" && flushed.messageId === draft.id) throw flushed.error;\n if (flushed.state === \"retry\" && !flushed.retryable) throw flushed.error;\n if (flushed.state === \"committed\" && flushed.messageId === draft.id) {\n return { ...flushed.result, disposition: \"committed\", authoritative: true };\n }\n this.wakeTransport();\n return {\n message: provisional(draft, this.now().toISOString()),\n created: queued.created,\n disposition: \"queued\",\n authoritative: false,\n };\n }\n\n private async pull(maxPages: number, signal?: AbortSignal): Promise<{\n online: boolean;\n pulled: number;\n error?: Error;\n retryable?: boolean;\n }> {\n let pulled = 0;\n for (let pageNumber = 0; pageNumber < maxPages; pageNumber += 1) {\n if (this.cancelled(signal)) break;\n const before = await this.edge.pullCursor();\n let page: MessagePage;\n try {\n await this.ensureRemote(signal);\n page = await this.remote.listMessages(this.principal, {\n cursor: before,\n limit: 200,\n includeExpired: true,\n mailbox: \"all\",\n }, { signal });\n this.remoteReachable = true;\n } catch (error) {\n this.remoteReachable = isRetryableSyncError(error) ? false : true;\n await this.edge.noteError(codeOf(error));\n return {\n online: false,\n pulled,\n error: error instanceof Error ? error : new Error(String(error)),\n retryable: isRetryableSyncError(error),\n };\n }\n try {\n await this.edge.cachePage(page.messages, page.cursor, this.now());\n } catch (error) {\n throw this.fatal(error);\n }\n pulled += page.messages.length;\n if (page.messages.length < 200 || !page.cursor || page.cursor === before) break;\n }\n return { online: true, pulled };\n }\n\n async sync(options: { maxPush?: number; maxPages?: number; signal?: AbortSignal } = {}): Promise<SyncReport> {\n this.assertHealthy();\n await this.edge.initialize();\n await this.edge.noteAttempt(this.now());\n const maxPush = Math.min(Math.max(Math.trunc(options.maxPush ?? 100), 0), 1_000);\n const maxPages = Math.min(Math.max(Math.trunc(options.maxPages ?? 20), 0), 100);\n let pushed = 0;\n let deduplicated = 0;\n let online = true;\n let lastError: string | undefined;\n let failureRetryable: boolean | undefined;\n\n if (options.signal?.aborted) {\n const stats = await this.edge.stats(this.now());\n return {\n online: false, pushed: 0, deduplicated: 0, pulled: 0,\n pending: stats.pending, blocked: stats.blocked, cached: stats.cached,\n cursor: stats.pullCursor, lastSyncedAt: stats.lastSyncAt,\n lastError: \"request_cancelled\", failureRetryable: true,\n };\n }\n\n for (let index = 0; index < maxPush; index += 1) {\n if (this.cancelled(options.signal)) break;\n const result = await this.flushOne(options.signal);\n if (result.state === \"empty\") break;\n if (result.state === \"committed\") {\n pushed += 1;\n if (!result.result.created) deduplicated += 1;\n continue;\n }\n if (result.state === \"fatal\") throw result.error;\n lastError = codeOf(result.error);\n failureRetryable = result.state === \"retry\" ? result.retryable : undefined;\n if (result.state === \"retry\") online = false;\n if (result.state === \"retry\") break;\n }\n\n let pulled = 0;\n if (maxPages > 0 && !this.cancelled(options.signal)) {\n const pull = await this.pull(maxPages, options.signal);\n online = online && pull.online;\n pulled = pull.pulled;\n if (pull.error) {\n lastError = codeOf(pull.error);\n failureRetryable = pull.retryable;\n }\n }\n\n const stats = await this.edge.stats(this.now());\n return {\n online,\n pushed,\n deduplicated,\n pulled,\n pending: stats.pending,\n blocked: stats.blocked,\n cached: stats.cached,\n cursor: stats.pullCursor,\n lastSyncedAt: stats.lastSyncAt,\n lastError: lastError ?? stats.lastError,\n failureRetryable,\n };\n }\n\n async listMessages(principal: BridgePrincipal, query: MessageQuery = {}): Promise<CachedMessagePage> {\n this.assertHealthy();\n this.assertPrincipal(principal);\n await this.sync({ maxPush: 20, maxPages: 0 });\n let remotePage: MessagePage;\n try {\n await this.ensureRemote();\n remotePage = await this.remote.listMessages(principal, query);\n } catch (error) {\n const retryable = isRetryableSyncError(error);\n this.remoteReachable = retryable ? false : true;\n if (!retryable) throw error;\n await this.edge.noteError(codeOf(error));\n let cached: MessagePage;\n let stats: Awaited<ReturnType<SQLiteEdgeStore[\"stats\"]>>;\n try {\n cached = await this.edge.list(query);\n stats = await this.edge.stats(this.now());\n } catch (cacheError) {\n throw this.fatal(cacheError);\n }\n return { ...cached, source: \"cache\", stale: true, degraded: true,\n acknowledgements: (query.receiptState && query.receiptState !== \"any\") || \"unacknowledgedBy\" in query ? \"unknown\" : \"authoritative\",\n lastSyncedAt: stats.lastSyncAt };\n }\n try {\n this.remoteReachable = true;\n await this.edge.cacheLatest(remotePage.messages, this.now());\n const stats = await this.edge.stats(this.now());\n return { ...remotePage, source: \"remote\", stale: false, degraded: false,\n acknowledgements: \"authoritative\", lastSyncedAt: stats.lastSyncAt };\n } catch (error) {\n throw this.fatal(error);\n }\n }\n\n async recordReceipt(\n principal: BridgePrincipal,\n messageIds: string[],\n readAt?: Date,\n ): Promise<number> {\n this.assertPrincipal(principal, false);\n await this.ensureRemote();\n return this.remote.recordReceipt(principal, messageIds, readAt);\n }\n\n async claimDelivery(principal: BridgePrincipal, options: ClaimOptions): Promise<BridgeDelivery | null> {\n this.assertPrincipal(principal);\n await this.ensureRemote();\n return this.remote.claimDelivery(principal, options);\n }\n\n async renewDelivery(\n principal: BridgePrincipal,\n deliveryId: string,\n leaseToken: string,\n leaseMs: number,\n ): Promise<BridgeDelivery | null> {\n this.assertPrincipal(principal);\n await this.ensureRemote();\n return this.remote.renewDelivery(principal, deliveryId, leaseToken, leaseMs);\n }\n\n async settleDelivery(\n principal: BridgePrincipal,\n deliveryId: string,\n leaseToken: string,\n state: Extract<DeliveryState, \"acked\" | \"retrying\" | \"dead\">,\n error?: string,\n _retryPolicy?: import(\"./bridge-domain.js\").RetryPolicy,\n ): Promise<BridgeDelivery | null> {\n this.assertPrincipal(principal);\n await this.ensureRemote();\n return this.remote.settleDelivery(principal, deliveryId, leaseToken, state, error);\n }\n\n async listDeliveries(principal: BridgePrincipal, query: import(\"./bridge-store.js\").DeliveryQuery = {}) { this.assertPrincipal(principal); await this.ensureRemote(); if(!this.remote.listDeliveries) throw new Error(\"delivery listing is not supported\"); return this.remote.listDeliveries(principal,query); }\n async listDeliveryEvents(principal: BridgePrincipal,id:string,query:{cursor?:string;limit?:number}={}) { this.assertPrincipal(principal);await this.ensureRemote();if(!this.remote.listDeliveryEvents)throw new Error(\"delivery event listing is not supported\");return this.remote.listDeliveryEvents(principal,id,query); }\n async cancelDelivery(principal:BridgePrincipal,id:string){this.assertPrincipal(principal);await this.ensureRemote();if(!this.remote.cancelDelivery)throw new Error(\"delivery cancellation is not supported\");return this.remote.cancelDelivery(principal,id);}\n async requeueDelivery(principal:BridgePrincipal,id:string){this.assertPrincipal(principal);await this.ensureRemote();if(!this.remote.requeueDelivery)throw new Error(\"delivery requeue is not supported\");return this.remote.requeueDelivery(principal,id);}\n\n async diagnostics(principal: BridgePrincipal, options: { mode?: \"snapshot\" | \"probe\" } = {}): Promise<SyncDiagnostics> {\n this.assertPrincipal(principal);\n const edge = await this.edge.stats(this.now());\n let remote: BridgeDiagnostics | undefined;\n let remoteError: string | undefined;\n if (options.mode === \"probe\") {\n try {\n if (this.remote.diagnostics) remote = await this.remote.diagnostics(principal);\n else await this.ensureRemote();\n this.remoteReachable = true;\n } catch (error) {\n const retryable = isRetryableSyncError(error);\n this.remoteReachable = retryable ? false : true;\n remoteError = codeOf(error);\n }\n }\n return {\n schemaVersion: remote?.schemaVersion ?? \"postgres-v2\",\n deliverySupported: remote?.deliverySupported ?? true,\n pending: remote?.pending ?? null,\n claimed: remote?.claimed ?? null,\n retrying: remote?.retrying ?? null,\n dead: remote?.dead ?? null,\n cancelled: remote?.cancelled ?? null,\n oldestAvailableAt: remote?.oldestAvailableAt,\n due: remote?.due ?? null,\n scheduled: remote?.scheduled ?? null,\n expiredLeases: remote?.expiredLeases ?? null,\n oldestDueAt: remote?.oldestDueAt,\n queueLagMs: remote?.queueLagMs ?? null,\n principal: { workspace: principal.workspace, agent: principal.agent },\n remoteReachable: options.mode === \"probe\" ? this.remoteReachable : null,\n outboxPending: edge.pending,\n outboxBlocked: edge.blocked,\n cachedMessages: edge.cached,\n lastSyncAt: edge.lastSyncAt,\n lastSyncError: edge.lastError,\n outboxDue: edge.due,\n outboxScheduled: edge.scheduled,\n outboxLeased: edge.leased,\n outboxOldestDueAt: edge.oldestDueAt,\n outboxQueueLagMs: edge.queueLagMs,\n outboxOldestBlockedAt: edge.oldestBlockedAt,\n outboxBlockedAgeMs: edge.blockedAgeMs,\n outboxBlockedMaxAttempts: edge.blockedMaxAttempts,\n outboxBlockedLastError: edge.blockedLastError,\n outboxNextRetryAt: edge.nextRetryAt,\n lastOutboundSyncAt: edge.lastOutboundSyncAt,\n lastInboundSyncAt: edge.lastInboundSyncAt,\n lastSyncAttemptAt: edge.lastAttemptAt,\n syncLoopState: this.backgroundError ? \"failed\" : this.loopState,\n syncLoopError: this.backgroundError ? codeOf(this.backgroundError) : undefined,\n remoteError,\n };\n }\n\n async heartbeat(principal: BridgePrincipal, leaseMs: number, runtimeType?: string, capabilities: string[] = []) {\n this.assertPrincipal(principal);\n await this.ensureRemote();\n if (!this.remote.heartbeat) throw new Error(\"presence is not supported by the remote provider\");\n return this.remote.heartbeat(principal, leaseMs, runtimeType, capabilities);\n }\n\n async listPresence(principal: BridgePrincipal) {\n this.assertPrincipal(principal);\n await this.ensureRemote();\n if (!this.remote.listPresence) throw new Error(\"presence is not supported by the remote provider\");\n return this.remote.listPresence(principal);\n }\n\n async close(): Promise<void> {\n this.stopped = true;\n this.loopState = \"stopped\";\n this.closeController.abort(new Error(\"synchronization stopped\"));\n if (this.wakeTimer) clearTimeout(this.wakeTimer);\n this.wake?.();\n const results = await Promise.allSettled([\n this.remote.close?.() ?? Promise.resolve(),\n this.background ?? Promise.resolve(),\n ]);\n const failures = results\n .filter((result): result is PromiseRejectedResult => result.status === \"rejected\")\n .map((result) => result.reason);\n if (this.backgroundError) failures.push(this.backgroundError);\n try { await this.edge.close(); } catch (error) { failures.push(error); }\n if (failures.length === 1) throw failures[0];\n if (failures.length > 1) throw Object.assign(new Error(\"failed to close synchronized bridge store\"), { errors: failures });\n }\n}\n"],"mappings":"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","names":["require","stats"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/client-runtime.ts"],"sourcesContent":["import { existsSync, mkdirSync } from \"node:fs\";\nimport { basename, dirname } from \"node:path\";\nimport { BridgeService } from \"./bridge-service.js\";\nimport type { BridgeStore } from \"./bridge-store.js\";\nimport { HttpBridgeStore } from \"./http-bridge-store.js\";\nimport { SQLiteEdgeStore } from \"./sqlite-edge-store.js\";\nimport { SyncingBridgeStore } from \"./syncing-bridge-store.js\";\nimport { LegacySupabaseRestStore } from \"./legacy-supabase-store.js\";\nimport { SQLiteBridgeStore } from \"./sqlite-bridge-store.js\";\nimport type { ClientConfig } from \"./client-config.js\";\nimport { securePrivatePath } from \"./private-path.js\";\n\nexport interface ClientRuntime { config: ClientConfig; store: BridgeStore; service: BridgeService; close(): Promise<void>; }\nexport interface ClientRuntimeOptions { autoSync?: boolean; initializationMode?: \"active\" | \"passive\"; }\n\nfunction prepareStoreDirectory(path: string): void {\n const directory = dirname(path);\n const existed = existsSync(directory);\n mkdirSync(directory, { recursive: true, mode: 0o700 });\n if (!existed || basename(directory) === \".agent-bridge\") securePrivatePath(directory, \"directory\");\n}\n\nexport function createStore(config: ClientConfig, options: ClientRuntimeOptions = {}): BridgeStore {\n if (config.provider === \"local\") {\n if (config.databasePath !== \":memory:\") prepareStoreDirectory(config.databasePath);\n return new SQLiteBridgeStore(config.databasePath);\n }\n if (config.provider === \"gateway\") {\n prepareStoreDirectory(config.edgeDatabasePath);\n const remote = new HttpBridgeStore({ baseUrl: config.url!, token: config.credential!, principal: config.principal });\n const edge = new SQLiteEdgeStore(config.edgeDatabasePath, { endpoint: config.url!, principal: config.principal });\n return new SyncingBridgeStore(edge, remote, config.principal, { autoSync: options.autoSync });\n }\n return new LegacySupabaseRestStore(config.url!, config.credential!);\n}\n\nexport async function createClientRuntime(config: ClientConfig, options: ClientRuntimeOptions = {}): Promise<ClientRuntime> {\n const store = createStore(config, options);\n await store.initialize({ mode: options.initializationMode });\n return { config, store, service: new BridgeService(store), close: async () => { await store.close?.(); } };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,SAAS,YAAY,iBAAiB;AACtC,SAAS,UAAU,eAAe;AAclC,SAAS,sBAAsB,MAAoB;AACjD,QAAM,YAAY,QAAQ,IAAI;AAC9B,QAAM,UAAU,WAAW,SAAS;AACpC,YAAU,WAAW,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AACrD,MAAI,CAAC,WAAW,SAAS,SAAS,MAAM,gBAAiB,mBAAkB,WAAW,WAAW;AACnG;AAEO,SAAS,YAAY,QAAsB,UAAgC,CAAC,GAAgB;AACjG,MAAI,OAAO,aAAa,SAAS;AAC/B,QAAI,OAAO,iBAAiB,WAAY,uBAAsB,OAAO,YAAY;AACjF,WAAO,IAAI,kBAAkB,OAAO,YAAY;AAAA,EAClD;AACA,MAAI,OAAO,aAAa,WAAW;AACjC,0BAAsB,OAAO,gBAAgB;AAC7C,UAAM,SAAS,IAAI,gBAAgB,EAAE,SAAS,OAAO,KAAM,OAAO,OAAO,YAAa,WAAW,OAAO,UAAU,CAAC;AACnH,UAAM,OAAO,IAAI,gBAAgB,OAAO,kBAAkB,EAAE,UAAU,OAAO,KAAM,WAAW,OAAO,UAAU,CAAC;AAChH,WAAO,IAAI,mBAAmB,MAAM,QAAQ,OAAO,WAAW,EAAE,UAAU,QAAQ,SAAS,CAAC;AAAA,EAC9F;AACA,SAAO,IAAI,wBAAwB,OAAO,KAAM,OAAO,UAAW;AACpE;AAEA,eAAsB,oBAAoB,QAAsB,UAAgC,CAAC,GAA2B;AAC1H,QAAM,QAAQ,YAAY,QAAQ,OAAO;AACzC,QAAM,MAAM,WAAW,EAAE,MAAM,QAAQ,mBAAmB,CAAC;AAC3D,SAAO,EAAE,QAAQ,OAAO,SAAS,IAAI,cAAc,KAAK,GAAG,OAAO,YAAY;AAAE,UAAM,MAAM,QAAQ;AAAA,EAAG,EAAE;AAC3G;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/gateway.ts","../src/gateway-auth.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { BridgePrincipalMismatchError, BridgeValidationError, type MessageDraft } from \"./bridge-domain.js\";\nimport { BridgeService } from \"./bridge-service.js\";\nimport type { BridgeStore } from \"./bridge-store.js\";\nimport { bearerToken, hashCredential, type CredentialResolver } from \"./gateway-auth.js\";\nimport type { GatewaySecurity } from \"./gateway-security.js\";\nimport type { RequestAuthority, RequestAuthorityContext } from \"./postgres-request-authority.js\";\nimport {\n capabilityDocument,\n ContractResponseError,\n ContractValidationError,\n LEGACY_PROTOCOL_VERSION,\n negotiateProtocolVersion,\n operationContract,\n parseResponse,\n PROTOCOL_HEADER,\n PROTOCOL_VERSION,\n SUPPORTED_PROTOCOL_HEADER,\n SUPPORTED_PROTOCOL_VERSIONS,\n type OperationId,\n validateRequest,\n validateRequestForProtocol,\n} from \"./contracts/registry.js\";\n\nexport interface GatewayOptions {\n store: BridgeStore;\n credentials: CredentialResolver;\n security: GatewaySecurity;\n allowedOrigins?: string[];\n bodyLimitBytes?: number;\n requestDeadlineMs?: number;\n ready?: () => Promise<boolean>;\n /** Reports whether the configured database has verified row isolation. */\n rowIsolationReady?: () => Promise<boolean>;\n /** Production PostgreSQL request authority. Other providers omit this. */\n requestAuthority?: RequestAuthority;\n}\n\ntype Metrics = { requests: number; errors: number; timeouts: number; authFailures: number };\nconst jsonHeaders = { \"content-type\": \"application/json; charset=utf-8\", \"cache-control\": \"no-store\" };\n\ninterface ResponseWriter {\n readonly writableEnded: boolean;\n getHeader(name: string): string | number | readonly string[] | undefined;\n setHeader(name: string, value: string | number | readonly string[]): unknown;\n writeHead(status: number, headers?: any): unknown;\n end(chunk?: any): unknown;\n}\n\nclass BufferedResponse implements ResponseWriter {\n private readonly headers = new Map<string, string | number | readonly string[]>();\n private status: number | undefined;\n private headHeaders: any;\n private body: any;\n\n constructor(private readonly target: ServerResponse) {}\n get writableEnded(): boolean { return this.body !== undefined; }\n getHeader(name: string) { return this.headers.get(name.toLowerCase()) ?? this.target.getHeader(name); }\n setHeader(name: string, value: string | number | readonly string[]) { this.headers.set(name.toLowerCase(), value); return this; }\n writeHead(status: number, headers?: any) {\n this.status = status;\n this.headHeaders = headers;\n return this;\n }\n end(chunk?: any) { this.body = chunk ?? null; return this; }\n flush(): void {\n if (this.target.writableEnded) return;\n for (const [name, value] of this.headers) this.target.setHeader(name, value);\n if (this.status !== undefined) this.target.writeHead(this.status, this.headHeaders);\n if (this.body !== undefined) this.target.end(this.body);\n }\n}\n\nfunction send(res: ResponseWriter, status: number, value: unknown, requestId: string): void {\n if (res.writableEnded) return;\n res.writeHead(status, {\n ...jsonHeaders,\n \"x-request-id\": requestId,\n });\n res.end(JSON.stringify(value));\n}\n\nfunction sendOperation(res: ResponseWriter, status: number, operation: string, value: unknown, requestId: string): void {\n const canonical = parseResponse(operation, value) as Record<string, unknown>;\n const protocolVersion = String(res.getHeader(PROTOCOL_HEADER) ?? PROTOCOL_VERSION);\n if (protocolVersion !== LEGACY_PROTOCOL_VERSION) {\n send(res, status, canonical, requestId);\n return;\n }\n if (operation === \"claim_delivery\") {\n send(res, status, canonical.delivery === null ? null : canonical, requestId);\n return;\n }\n if ([\"cancel_delivery\", \"requeue_delivery\", \"extend_delivery\", \"acknowledge_delivery\", \"negative_acknowledge_delivery\"].includes(operation)) {\n send(res, status, canonical.delivery, requestId);\n return;\n }\n send(res, status, canonical, requestId);\n}\n\nfunction failure(\n res: ResponseWriter,\n status: number,\n code: string,\n requestId: string,\n details: Record<string, unknown> = {},\n): void {\n send(res, status, { error: { code, requestId, ...details } }, requestId);\n}\n\nasync function body(\n req: IncomingMessage,\n limit: number,\n signal: AbortSignal,\n): Promise<Record<string, any>> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n let size = 0;\n const cleanup = () => {\n req.off(\"data\", onData);\n req.off(\"end\", onEnd);\n req.off(\"error\", onError);\n signal.removeEventListener(\"abort\", onAbort);\n };\n const finish = (callback: () => void) => {\n cleanup();\n callback();\n };\n const onData = (chunk: Buffer | string) => {\n const buffer = Buffer.from(chunk);\n size += buffer.length;\n if (size > limit) {\n finish(() => reject(Object.assign(new Error(\"body too large\"), {\n status: 413,\n code: \"body_too_large\",\n })));\n req.resume();\n return;\n }\n chunks.push(buffer);\n };\n const onEnd = () => finish(() => {\n if (!size) {\n resolve({});\n return;\n }\n try {\n const parsed = JSON.parse(Buffer.concat(chunks).toString(\"utf8\"));\n if (!parsed || Array.isArray(parsed) || typeof parsed !== \"object\") throw new Error();\n resolve(parsed);\n } catch {\n reject(Object.assign(new Error(\"invalid JSON\"), { status: 400, code: \"malformed_json\" }));\n }\n });\n const onError = (error: Error) => finish(() => reject(error));\n const onAbort = () => {\n finish(() => reject(signal.reason));\n req.resume();\n };\n req.on(\"data\", onData);\n req.on(\"end\", onEnd);\n req.on(\"error\", onError);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n if (signal.aborted) onAbort();\n });\n}\n\nasync function jsonBody(\n req: IncomingMessage,\n limit: number,\n signal: AbortSignal,\n): Promise<Record<string, any>> {\n if (hasRequestBody(req) && req.headers[\"content-type\"]?.split(\";\", 1)[0] !== \"application/json\") {\n throw Object.assign(new Error(\"unsupported media type\"), {\n status: 415,\n code: \"unsupported_media_type\",\n });\n }\n return body(req, limit, signal);\n}\n\nfunction numberParam(value: string | null, name: string): number | undefined {\n if (value === null) return undefined;\n const result = Number(value);\n if (!Number.isSafeInteger(result)) throw new BridgeValidationError(`${name} is invalid`);\n return result;\n}\n\nfunction booleanParam(value: string | null, name: string): boolean | undefined {\n if (value === null) return undefined;\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n throw new BridgeValidationError(`${name} must be true or false`);\n}\n\nfunction hasRequestBody(req: IncomingMessage): boolean {\n const length = req.headers[\"content-length\"];\n return req.headers[\"transfer-encoding\"] !== undefined || (length !== undefined && length !== \"0\");\n}\n\nfunction pathBoundInput(\n operation: string,\n deliveryId: string,\n rawInput: Record<string, unknown>,\n protocolVersion?: string,\n): Record<string, unknown> {\n if (Object.prototype.hasOwnProperty.call(rawInput, \"deliveryId\")) {\n throw new ContractValidationError(operation, [{ path: \"/deliveryId\", message: \"deliveryId is supplied by the request path\" }]);\n }\n const value = { ...rawInput, deliveryId };\n return protocolVersion\n ? validateRequestForProtocol(operation, value, protocolVersion)\n : validateRequest(operation, value);\n}\n\nfunction active(signal: AbortSignal): void {\n if (signal.aborted) throw signal.reason;\n}\n\nfunction closedQuery(url: URL, operation: string, allowed: readonly string[]): void {\n const unknown = [...url.searchParams.keys()].find((key) => !allowed.includes(key));\n if (unknown) throw new ContractValidationError(operation, [{ path: `/${unknown}`, message: \"Unexpected query parameter\" }]);\n}\n\nfunction selectedProtocol(res: ResponseWriter): string {\n return String(res.getHeader(PROTOCOL_HEADER) ?? PROTOCOL_VERSION);\n}\n\nfunction requireCurrentProtocol(res: ResponseWriter): void {\n if (selectedProtocol(res) === LEGACY_PROTOCOL_VERSION) {\n const error = new Error(\"Operation is not available in protocol 2.0\") as Error & { status: number; code: string };\n error.status = 404;\n error.code = \"not_found\";\n throw error;\n }\n}\n\nexport function createGateway(options: GatewayOptions) {\n const metrics: Metrics = { requests: 0, errors: 0, timeouts: 0, authFailures: 0 };\n const limit = options.bodyLimitBytes ?? 128 * 1024;\n const deadline = options.requestDeadlineMs ?? 10_000;\n const origins = new Set(options.allowedOrigins ?? []);\n\n return createServer((req, res) => {\n const requestId = randomUUID();\n const abort = new AbortController();\n let mutationStarted = false;\n metrics.requests += 1;\n const requestedProtocol = req.headers[PROTOCOL_HEADER];\n const rawRequestedProtocol = Array.isArray(requestedProtocol) ? requestedProtocol[0] : requestedProtocol;\n const initialProtocol = rawRequestedProtocol === undefined || rawRequestedProtocol.trim() === \"\"\n ? LEGACY_PROTOCOL_VERSION\n : (SUPPORTED_PROTOCOL_VERSIONS as readonly string[]).includes(rawRequestedProtocol.trim())\n ? rawRequestedProtocol.trim()\n : PROTOCOL_VERSION;\n res.setHeader(PROTOCOL_HEADER, initialProtocol);\n res.setHeader(SUPPORTED_PROTOCOL_HEADER, SUPPORTED_PROTOCOL_VERSIONS.join(\",\"));\n const timer = setTimeout(() => {\n abort.abort(new Error(\"request deadline exceeded\"));\n metrics.timeouts += 1; metrics.errors += 1;\n res.once(\"finish\", () => {\n if (!req.complete) req.destroy();\n });\n failure(\n res,\n 504,\n mutationStarted ? \"mutation_outcome_unknown\" : \"request_timeout\",\n requestId,\n );\n }, deadline);\n let parsedBody: Promise<Record<string, any>> | undefined;\n const requestBody = () => parsedBody ??= jsonBody(req, limit, abort.signal);\n\n const dispatch = async (authority?: RequestAuthorityContext, response: ResponseWriter = res): Promise<void> => {\n const url = new URL(req.url ?? \"/\", \"http://gateway.invalid\");\n if (req.method === \"GET\" && url.pathname === \"/readyz\") {\n let ready = false;\n try {\n ready = await (options.ready?.() ?? options.store.initialize().then(() => true));\n } catch {\n ready = false;\n }\n send(response, ready ? 200 : 503, { status: ready ? \"ready\" : \"not_ready\" }, requestId);\n return;\n }\n const origin = req.headers.origin;\n if (origin && !origins.has(origin)) {\n failure(response, 403, \"origin_forbidden\", requestId); return;\n }\n const token = bearerToken(req.headers.authorization);\n if (options.requestAuthority && !authority) {\n if (!token) {\n metrics.authFailures += 1;\n failure(response, 401, \"unauthorized\", requestId); return;\n }\n const preflight = await options.credentials.resolve(token, abort.signal);\n active(abort.signal);\n if (!preflight) {\n metrics.authFailures += 1;\n failure(response, 401, \"unauthorized\", requestId); return;\n }\n if (hasRequestBody(req)) await requestBody();\n active(abort.signal);\n const buffered = new BufferedResponse(res);\n await options.requestAuthority!.run(\n preflight.id,\n hashCredential(token),\n requestId,\n abort.signal,\n (context) => dispatch(context, buffered),\n );\n active(abort.signal);\n buffered.flush();\n return;\n }\n const credential = authority?.credential ?? (token ? await options.credentials.resolve(token, abort.signal) : null);\n active(abort.signal);\n if (!credential) {\n metrics.authFailures += 1;\n failure(response, 401, \"unauthorized\", requestId); return;\n }\n if (!Array.isArray(credential.scopes)) {\n failure(response, 503, \"security_unavailable\", requestId); return;\n }\n const service = new BridgeService(authority?.store ?? options.store);\n const security = authority?.security ?? options.security;\n if (url.pathname.startsWith(\"/v2/\") || url.pathname === \"/metrics\") {\n response.setHeader(PROTOCOL_HEADER, negotiateProtocolVersion(req.headers[PROTOCOL_HEADER]));\n }\n const authorize = async (operationId: OperationId): Promise<void> => {\n const requiredScopes = operationContract(operationId).scopes;\n if (requiredScopes.some((scope) => !credential.scopes.includes(scope))) {\n try {\n await security.recordScopeDenial(credential.id, operationId, requestId, abort.signal);\n } catch {\n throw Object.assign(new Error(\"Scope denial could not be audited\"), {\n status: 503,\n code: \"security_unavailable\",\n });\n }\n throw Object.assign(new Error(\"Credential lacks a required scope\"), {\n status: 403, code: \"insufficient_scope\", requiredScopes,\n });\n }\n let decision;\n try {\n decision = await security.consume(credential.id, operationId, requestId, abort.signal);\n } catch {\n throw Object.assign(new Error(\"Rate limit state is unavailable\"), {\n status: 503,\n code: \"security_unavailable\",\n });\n }\n if (!decision.allowed) {\n const retryAfter = Math.max(1, Math.ceil(decision.retryAfterSeconds));\n response.setHeader(\"retry-after\", String(retryAfter));\n throw Object.assign(new Error(\"Credential rate limit exceeded\"), {\n status: 429, code: \"rate_limited\", retryAfterSeconds: retryAfter,\n });\n }\n };\n if (req.method === \"GET\" && url.pathname === \"/metrics\") {\n await authorize(\"gateway_metrics\");\n validateRequest(\"gateway_metrics\", {});\n const result = Object.entries(metrics).map(([key, value]) => `agent_bridge_gateway_${key}_total ${value}`).join(\"\\n\") + \"\\n\";\n parseResponse(\"gateway_metrics\", result);\n response.writeHead(200, {\n ...jsonHeaders,\n \"content-type\": \"text/plain; version=0.0.4\",\n \"x-request-id\": requestId,\n });\n response.end(result);\n return;\n }\n const instanceHeader = req.headers[\"x-agent-bridge-instance\"];\n const principal = {\n ...credential.principal,\n instance: Array.isArray(instanceHeader) ? instanceHeader[0] : instanceHeader,\n };\n\n if (req.method === \"GET\" && url.pathname === \"/v2/capabilities\") {\n requireCurrentProtocol(response);\n await authorize(\"capabilities\");\n closedQuery(url, \"capabilities\", []);\n validateRequest(\"capabilities\", {});\n let rowIsolation = false;\n if (options.requestAuthority && options.rowIsolationReady) {\n try {\n rowIsolation = await options.rowIsolationReady();\n } catch {\n rowIsolation = false;\n }\n }\n sendOperation(response, 200, \"capabilities\", capabilityDocument({ surface: \"http\", provider: \"gateway\", selectedProtocolVersion: String(response.getHeader(PROTOCOL_HEADER)), requestAuthority: Boolean(options.requestAuthority), rowIsolation }), requestId); return;\n }\n\n if (req.method === \"GET\" && url.pathname === \"/v2/status\") {\n await authorize(\"status\");\n closedQuery(url, \"status\", []);\n validateRequest(\"status\", {});\n const activeStore = authority?.store ?? options.store;\n if (!activeStore.diagnostics) {\n sendOperation(response, 200, \"status\", { schemaVersion: \"postgres-v2\", deliverySupported: false, pending: null, claimed: null, retrying: null, dead: null, principal: credential.principal }, requestId);\n } else {\n sendOperation(response, 200, \"status\", { ...await activeStore.diagnostics(principal), principal: credential.principal }, requestId);\n }\n return;\n }\n\n if (req.method === \"POST\" && url.pathname === \"/v2/messages\") {\n await authorize(\"publish_message\");\n const input = validateRequestForProtocol(\"publish_message\", await requestBody(), String(response.getHeader(PROTOCOL_HEADER)));\n if (input.source !== undefined && input.source !== principal.agent) {\n throw new BridgePrincipalMismatchError(\"source must match the authenticated principal\");\n }\n const { source: _source, ...draft } = input;\n active(abort.signal);\n await authority?.beginDomainWork(); mutationStarted = true;\n sendOperation(response, 201, \"publish_message\", await service.publish(principal, draft as unknown as MessageDraft), requestId); return;\n }\n if (req.method === \"GET\" && url.pathname === \"/v2/history\") {\n await authorize(\"history\");\n closedQuery(url, \"history\", [\"cursor\", \"mailbox\", \"receiptState\", \"limit\", \"type\", \"includeExpired\", \"source\", \"project\", \"since\", \"unacknowledgedBy\", \"unacked_by\", \"threadId\", \"latest\"]);\n const types = url.searchParams.getAll(\"type\");\n const input = validateRequestForProtocol(\"history\", {\n cursor: url.searchParams.get(\"cursor\") ?? undefined,\n mailbox: url.searchParams.get(\"mailbox\") ?? undefined as any,\n receiptState: url.searchParams.get(\"receiptState\") ?? undefined as any,\n limit: numberParam(url.searchParams.get(\"limit\"), \"limit\"),\n types: types.length ? types : undefined,\n includeExpired: booleanParam(url.searchParams.get(\"includeExpired\"), \"includeExpired\"),\n source: url.searchParams.get(\"source\") ?? undefined,\n project: url.searchParams.get(\"project\") ?? undefined,\n since: url.searchParams.get(\"since\") ?? undefined,\n unacknowledgedBy: url.searchParams.get(\"unacknowledgedBy\") ?? url.searchParams.get(\"unacked_by\") ?? undefined,\n threadId: url.searchParams.get(\"threadId\") ?? undefined,\n latest: booleanParam(url.searchParams.get(\"latest\"), \"latest\"),\n }, String(response.getHeader(PROTOCOL_HEADER)));\n sendOperation(response, 200, \"history\", await service.history(principal, input), requestId); return;\n }\n if (req.method === \"POST\" && url.pathname === \"/v2/receipts\") {\n await authorize(\"record_receipt\");\n const input = validateRequest(\"record_receipt\", await requestBody());\n active(abort.signal);\n await authority?.beginDomainWork(); mutationStarted = true;\n sendOperation(response, 200, \"record_receipt\", { recorded: await service.acknowledge(principal, input.messageIds as string[]) }, requestId); return;\n }\n if (req.method === \"POST\" && url.pathname === \"/v2/deliveries/claim\") {\n await authorize(\"claim_delivery\");\n const input = validateRequest(\"claim_delivery\", await requestBody());\n active(abort.signal);\n await authority?.beginDomainWork(); mutationStarted = true;\n sendOperation(response, 200, \"claim_delivery\", await service.claim(principal, input) ?? { delivery: null }, requestId); return;\n }\n if (req.method === \"GET\" && url.pathname === \"/v2/deliveries\") {\n requireCurrentProtocol(response);\n await authorize(\"list_deliveries\");\n closedQuery(url, \"list_deliveries\", [\"cursor\", \"limit\", \"role\", \"messageId\", \"recipient\", \"state\"]);\n const input = validateRequest(\"list_deliveries\", {cursor:url.searchParams.get(\"cursor\")??undefined,limit:numberParam(url.searchParams.get(\"limit\"),\"limit\"),role:url.searchParams.get(\"role\")??undefined,messageId:url.searchParams.get(\"messageId\")??undefined,recipient:url.searchParams.get(\"recipient\")??undefined,states:url.searchParams.getAll(\"state\")});\n sendOperation(response,200,\"list_deliveries\",await service.deliveries(principal,input as any),requestId);return;\n }\n const eventsMatch=url.pathname.match(/^\\/v2\\/deliveries\\/([^/]+)\\/events$/);\n if(req.method===\"GET\"&&eventsMatch){requireCurrentProtocol(response);await authorize(\"list_delivery_events\");closedQuery(url,\"list_delivery_events\",[\"cursor\",\"limit\"]);const input=validateRequest(\"list_delivery_events\",{deliveryId:eventsMatch[1],cursor:url.searchParams.get(\"cursor\")??undefined,limit:numberParam(url.searchParams.get(\"limit\"),\"limit\")});sendOperation(response,200,\"list_delivery_events\",await service.deliveryEvents(principal,eventsMatch[1]!,input as any),requestId);return;}\n const controlMatch=url.pathname.match(/^\\/v2\\/deliveries\\/([^/]+)\\/(cancel|requeue)$/);\n if(req.method===\"POST\"&&controlMatch){requireCurrentProtocol(response);const operation=controlMatch[2]===\"cancel\"?\"cancel_delivery\":\"requeue_delivery\";await authorize(operation);pathBoundInput(operation,controlMatch[1]!,await requestBody());await authority?.beginDomainWork();mutationStarted=true;const result=controlMatch[2]===\"cancel\"?await service.cancel(principal,controlMatch[1]!):await service.requeue(principal,controlMatch[1]!);if(!result)failure(response,404,\"not_found\",requestId);else sendOperation(response,200,operation,{delivery:result},requestId);return;}\n if (req.method === \"POST\" && url.pathname === \"/v2/presence/heartbeat\") {\n await authorize(\"heartbeat\");\n const input = validateRequest(\"heartbeat\", await requestBody());\n active(abort.signal);\n await authority?.beginDomainWork(); mutationStarted = true;\n sendOperation(response, 200, \"heartbeat\", await service.heartbeat(principal, input), requestId); return;\n }\n if (req.method === \"GET\" && url.pathname === \"/v2/presence\") {\n await authorize(\"presence\");\n closedQuery(url, \"presence\", []);\n validateRequest(\"presence\", {});\n sendOperation(response, 200, \"presence\", { agents: await service.presence(principal) }, requestId); return;\n }\n const match = url.pathname.match(/^\\/v2\\/deliveries\\/([^/]+)\\/(extend|ack|nack)$/);\n if (req.method === \"POST\" && match) {\n const operationId = match[2] === \"extend\" ? \"extend_delivery\" : match[2] === \"ack\" ? \"acknowledge_delivery\" : \"negative_acknowledge_delivery\";\n await authorize(operationId);\n const rawInput = await requestBody();\n const protocolVersion = String(response.getHeader(PROTOCOL_HEADER) ?? PROTOCOL_VERSION);\n const input = pathBoundInput(operationId, match[1]!, rawInput, protocolVersion);\n active(abort.signal);\n await authority?.beginDomainWork(); mutationStarted = true;\n const [, id, action] = match;\n const result = action === \"extend\"\n ? await service.extend(principal, id, input.leaseToken as string, input.leaseMs as number)\n : action === \"ack\"\n ? await service.ack(principal, id, input.leaseToken as string)\n : await service.nack(\n principal,\n id,\n input.leaseToken as string,\n (input.error as string | undefined) ?? \"negative acknowledgment\",\n (input.disposition ?? input.dead ?? \"retry\") as \"retry\" | \"dead\" | boolean,\n input.retryPolicy,\n );\n if (!result) failure(response, 409, \"lease_conflict\", requestId);\n else sendOperation(response, 200, operationId, { delivery: result }, requestId);\n return;\n }\n failure(response, 404, \"not_found\", requestId);\n };\n void dispatch().catch((error: any) => {\n if (res.writableEnded) return;\n metrics.errors += 1;\n if (error instanceof ContractValidationError || error instanceof ContractResponseError) {\n failure(res, error.status, error.code, requestId, { operation: error.operation, issues: error.issues });\n } else if (error?.status === 426) {\n failure(res, 426, error.code, requestId, { supportedProtocolVersions: [...SUPPORTED_PROTOCOL_VERSIONS] });\n } else if (error?.code === \"insufficient_scope\") {\n failure(res, 403, error.code, requestId, { details: { requiredScopes: [...error.requiredScopes] } });\n } else if (error?.code === \"rate_limited\") {\n res.setHeader(\"retry-after\", String(error.retryAfterSeconds));\n failure(res, 429, error.code, requestId, { details: { retryAfterSeconds: error.retryAfterSeconds } });\n } else if (error instanceof BridgeValidationError || error instanceof BridgePrincipalMismatchError) {\n failure(res, \"status\" in error ? error.status : 400, error.code, requestId, { message: error.message });\n } else {\n failure(res, error?.status ?? 500, error?.code ?? \"internal_error\", requestId);\n }\n }).finally(() => clearTimeout(timer));\n });\n}\n","import { createHash, timingSafeEqual } from \"node:crypto\";\nimport type { BridgePrincipal } from \"./bridge-domain.js\";\nimport type { AuthorizationScope } from \"./contracts/registry.js\";\nimport type { PgQueryable } from \"./postgres-bridge-store.js\";\n\nexport interface AuthenticatedCredential {\n id: string;\n principal: BridgePrincipal;\n /** Canonical authorization scopes granted to this credential. */\n scopes: readonly AuthorizationScope[];\n}\n\nexport interface CredentialResolver {\n resolve(token: string, signal?: AbortSignal): Promise<AuthenticatedCredential | null>;\n}\n\nexport function hashCredential(token: string): string {\n return createHash(\"sha256\").update(token, \"utf8\").digest(\"hex\");\n}\n\nexport class PostgresCredentialResolver implements CredentialResolver {\n constructor(private readonly db: PgQueryable) {}\n\n async resolve(token: string, signal?: AbortSignal): Promise<AuthenticatedCredential | null> {\n if (signal?.aborted) throw signal.reason;\n const result = await this.db.query<{\n credential_id: string; workspace_id: string; principal: string; scopes: AuthorizationScope[];\n }>(\n `SELECT credential_id,workspace_id,principal,scopes\n FROM agent_bridge.resolve_credential_hash($1::text)`,\n [hashCredential(token)],\n );\n const row = result.rows[0];\n if (signal?.aborted) throw signal.reason;\n return row ? {\n id: row.credential_id,\n principal: { workspace: row.workspace_id, agent: row.principal },\n scopes: row.scopes,\n } : null;\n }\n}\n\nexport function bearerToken(value: string | undefined): string | null {\n if (!value?.startsWith(\"Bearer \")) return null;\n const token = value.slice(7);\n if (!token || token.length > 4096 || /\\s/.test(token)) return null;\n return token;\n}\n\nexport function safeTokenHashEqual(token: string, expectedHash: string): boolean {\n const actual = Buffer.from(hashCredential(token));\n const expected = Buffer.from(expectedHash);\n return actual.length === expected.length && timingSafeEqual(actual, expected);\n}\n"],"mappings":"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","names":[]}