@creatornader/agent-bridge 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/CHANGELOG.md +86 -4
  2. package/README.md +567 -55
  3. package/ROADMAP.md +114 -0
  4. package/SECURITY.md +90 -0
  5. package/SKILL.md +68 -2
  6. package/bin/agent-bridge +2 -2
  7. package/clients/claude-desktop.json +3 -1
  8. package/dist/archive.d.ts +163 -0
  9. package/dist/archive.js +50 -0
  10. package/dist/archive.js.map +1 -0
  11. package/dist/bridge-domain-CBX3IVqC.d.ts +153 -0
  12. package/dist/{bridge-service-CfqMcMAn.d.ts → bridge-service-hX1ZQp4W.d.ts} +15 -5
  13. package/dist/bridge-store-DPVSCwfs.d.ts +102 -0
  14. package/dist/bridge.d.ts +76 -17
  15. package/dist/bridge.js +52 -24
  16. package/dist/chunk-2DFNOLMO.js +618 -0
  17. package/dist/chunk-2DFNOLMO.js.map +1 -0
  18. package/dist/{chunk-KVR4JBRF.js → chunk-2EVLG3YA.js} +2 -2
  19. package/dist/{chunk-KVR4JBRF.js.map → chunk-2EVLG3YA.js.map} +1 -1
  20. package/dist/chunk-45BZGB77.js +709 -0
  21. package/dist/chunk-45BZGB77.js.map +1 -0
  22. package/dist/chunk-4VB44KJU.js +230 -0
  23. package/dist/chunk-4VB44KJU.js.map +1 -0
  24. package/dist/chunk-5GMB3A77.js +1013 -0
  25. package/dist/chunk-5GMB3A77.js.map +1 -0
  26. package/dist/chunk-A6W4QALF.js +1258 -0
  27. package/dist/chunk-A6W4QALF.js.map +1 -0
  28. package/dist/chunk-BZLMF5O5.js +328 -0
  29. package/dist/chunk-BZLMF5O5.js.map +1 -0
  30. package/dist/{chunk-AXL2I7FH.js → chunk-CEXBMOI5.js} +240 -79
  31. package/dist/chunk-CEXBMOI5.js.map +1 -0
  32. package/dist/chunk-GADH244D.js +527 -0
  33. package/dist/chunk-GADH244D.js.map +1 -0
  34. package/dist/chunk-MBPZXTJA.js +2428 -0
  35. package/dist/chunk-MBPZXTJA.js.map +1 -0
  36. package/dist/chunk-NCO7RLBM.js +146 -0
  37. package/dist/chunk-NCO7RLBM.js.map +1 -0
  38. package/dist/chunk-Q6PPMXJC.js +1050 -0
  39. package/dist/chunk-Q6PPMXJC.js.map +1 -0
  40. package/dist/{chunk-4KAOBC5X.js → chunk-SPSMZOCJ.js} +190 -165
  41. package/dist/chunk-SPSMZOCJ.js.map +1 -0
  42. package/dist/chunk-UAHMP6GC.js +54 -0
  43. package/dist/chunk-UAHMP6GC.js.map +1 -0
  44. package/dist/{chunk-YD6YJATN.js → chunk-VOQIDTCJ.js} +4 -2
  45. package/dist/chunk-VOQIDTCJ.js.map +1 -0
  46. package/dist/chunk-WAI2IYIQ.js +554 -0
  47. package/dist/chunk-WAI2IYIQ.js.map +1 -0
  48. package/dist/cli.d.ts +2 -1
  49. package/dist/cli.js +3555 -214
  50. package/dist/cli.js.map +1 -1
  51. package/dist/client-config.d.ts +1 -1
  52. package/dist/client-config.js +1 -1
  53. package/dist/client-runtime.d.ts +10 -6
  54. package/dist/client-runtime.js +9 -6
  55. package/dist/contracts/generate.d.ts +2 -0
  56. package/dist/contracts/generate.js +247 -0
  57. package/dist/contracts/generate.js.map +1 -0
  58. package/dist/dr.d.ts +324 -0
  59. package/dist/dr.js +124 -0
  60. package/dist/dr.js.map +1 -0
  61. package/dist/gateway-CggQ8vTC.d.ts +78 -0
  62. package/dist/gateway-main.js +190 -8
  63. package/dist/gateway-main.js.map +1 -1
  64. package/dist/gateway.d.ts +4 -3
  65. package/dist/gateway.js +4 -3
  66. package/dist/index.js +11 -8
  67. package/dist/index.js.map +1 -1
  68. package/dist/postgres-bridge-store-Bfd3hRId.d.ts +49 -0
  69. package/dist/server.d.ts +3 -2
  70. package/dist/server.js +13 -8
  71. package/dist/sqlite.d.ts +94 -12
  72. package/dist/sqlite.js +7 -4
  73. package/docs/architecture-v2.md +394 -0
  74. package/docs/decisions/0001-protocol-layers-and-acknowledgment-semantics.md +85 -0
  75. package/docs/decisions/0002-canonical-operation-contract-registry.md +46 -0
  76. package/docs/decisions/0003-host-adapters-and-consumer-instance-keys.md +88 -0
  77. package/docs/ecosystem.md +86 -0
  78. package/docs/postmortems/2026-07-08-wrapper-source-drift.md +82 -0
  79. package/docs/troubleshooting.md +89 -0
  80. package/llms.txt +107 -6
  81. package/openapi/agent-bridge-v2.openapi.json +9610 -0
  82. package/package.json +24 -4
  83. package/schemas/agent-bridge-v2.capabilities.json +1829 -0
  84. package/schemas/agent-bridge-v2.mcp.json +2074 -0
  85. package/schemas/agent-bridge-v2.schema.json +4560 -0
  86. package/sql/migrations/008_message_projects.sql +36 -0
  87. package/sql/migrations/009_mailbox_query_indexes.sql +28 -0
  88. package/sql/migrations/010_publisher_delivery_policy.sql +210 -0
  89. package/sql/migrations/011_credential_security.sql +875 -0
  90. package/sql/migrations/012_request_authority.sql +177 -0
  91. package/sql/migrations/013_row_isolation.sql +495 -0
  92. package/sql/migrations/014_owner_control_plane.sql +1641 -0
  93. package/sql/migrations/015_portable_archives.sql +1813 -0
  94. package/sql/migrations/016_native_dr_fence.sql +1005 -0
  95. package/bin/CLAUDE.md +0 -11
  96. package/dist/bridge-domain-BcnBeHOn.d.ts +0 -97
  97. package/dist/bridge-store-BuGjxTn4.d.ts +0 -61
  98. package/dist/chunk-4KAOBC5X.js.map +0 -1
  99. package/dist/chunk-6MAZ6YLZ.js +0 -146
  100. package/dist/chunk-6MAZ6YLZ.js.map +0 -1
  101. package/dist/chunk-AXL2I7FH.js.map +0 -1
  102. package/dist/chunk-BV6W4AJK.js +0 -211
  103. package/dist/chunk-BV6W4AJK.js.map +0 -1
  104. package/dist/chunk-CKSKUBDQ.js +0 -153
  105. package/dist/chunk-CKSKUBDQ.js.map +0 -1
  106. package/dist/chunk-JOUBDRYX.js +0 -272
  107. package/dist/chunk-JOUBDRYX.js.map +0 -1
  108. package/dist/chunk-JTC5YURG.js +0 -49
  109. package/dist/chunk-JTC5YURG.js.map +0 -1
  110. package/dist/chunk-O26W5QHS.js +0 -409
  111. package/dist/chunk-O26W5QHS.js.map +0 -1
  112. package/dist/chunk-WEULPMUY.js +0 -988
  113. package/dist/chunk-WEULPMUY.js.map +0 -1
  114. package/dist/chunk-YD6YJATN.js.map +0 -1
  115. package/dist/gateway-BULozv3K.d.ts +0 -54
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/sqlite-edge-store.ts","../src/syncing-bridge-store.ts","../src/sqlite-bridge-store.ts"],"sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { chmodSync, existsSync, mkdirSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname } from \"node:path\";\nimport type { DatabaseSync as Database, SQLInputValue } from \"node:sqlite\";\nimport {\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\";\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);\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 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 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 blocked: number;\n cached: number;\n pullCursor?: string;\n lastSyncAt?: string;\n lastError?: 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 return {\n workspace: message.workspace,\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 };\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 key: string;\n private initialized = false;\n\n constructor(private readonly path: string, private readonly scope: EdgeScope, private readonly busyTimeoutMs = 2_000) {\n if (path !== \":memory:\") mkdirSync(dirname(path), { recursive: true, mode: 0o700 });\n this.db = openDatabase(path);\n this.restrictFiles();\n this.key = edgeScopeKey(scope);\n }\n\n private restrictFiles(): void {\n if (this.path === \":memory:\") return;\n for (const path of [this.path, `${this.path}-wal`, `${this.path}-shm`]) {\n if (existsSync(path)) chmodSync(path, 0o600);\n }\n }\n\n get scopeKey(): string {\n return this.key;\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n this.db.exec(`PRAGMA busy_timeout = ${Math.max(1, Math.trunc(this.busyTimeoutMs))}; ${schema}`);\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 this.initialized = true;\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' ORDER BY position LIMIT 1`).get(this.key) as Row | undefined;\n if (\n !head ||\n String(head.available_at) > nowText ||\n (head.lease_expires_at && String(head.lease_expires_at) > nowText)\n ) {\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): 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=?\n WHERE scope_key=? AND position=? AND lease_token=?`)\n .run(error.slice(0, 256), this.key, record.position, record.leaseToken);\n await this.noteError(error);\n }\n\n async commit(\n record: EdgeOutboxRecord,\n message: BridgeMessage,\n cacheVisible: boolean,\n now = new Date(),\n ): Promise<void> {\n await this.ready();\n this.db.exec(\"BEGIN IMMEDIATE\");\n try {\n if (cacheVisible) 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.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, 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.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 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)!) >= sequenceKey(decodeCursor(currentCursor)!)\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.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.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 if (query.unacknowledgedBy) {\n throw new Error(\"offline cache cannot evaluate unacknowledgedBy\");\n }\n const clauses = [\"scope_key=?\"];\n const args: SQLInputValue[] = [this.key];\n if (!query.latest) {\n clauses.push(\"sequence_key>?\");\n args.push(sequenceKey(decodeCursor(query.cursor) ?? \"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 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 return { messages, cursor: cursorMessage ? encodeCursor(cursorMessage.sequence) : query.cursor };\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 stats(): Promise<EdgeStats> {\n await this.ready();\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='blocked' THEN 1 ELSE 0 END) AS blocked\n FROM edge_outbox WHERE scope_key=?`).get(this.key) as Row;\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 FROM edge_scopes WHERE scope_key=?`).get(this.key) as Row;\n return {\n pending: Number(counts.pending ?? 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 };\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 RetryPolicy,\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 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;\n outboxPending: number;\n outboxBlocked: number;\n cachedMessages: number;\n lastSyncAt?: string;\n lastSyncError?: string;\n}\n\nexport interface SyncingBridgeStoreOptions {\n now?: () => Date;\n random?: () => number;\n baseDelayMs?: number;\n maxDelayMs?: number;\n leaseMs?: 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 };\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 ([\"invalid_input\", \"idempotency_conflict\", \"principal_mismatch\"].includes(code)) return false;\n return status === undefined || status === 0 || status === 408 || status === 425 ||\n status === 429 || 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 remoteReady: Promise<void> | undefined;\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 }\n\n async initialize(): Promise<void> {\n // Remote readiness is intentionally deferred so clients can start offline.\n await this.edge.initialize();\n }\n\n async verifyRemote(): Promise<void> {\n await this.ensureRemote();\n }\n\n private async ensureRemote(): Promise<void> {\n if (!this.remoteReady) {\n this.remoteReady = this.remote.initialize().catch((error) => {\n this.remoteReady = undefined;\n throw error;\n });\n }\n await this.remoteReady;\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 async flushOne(): Promise<FlushResult> {\n try {\n await this.ensureRemote();\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);\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));\n return { state: \"blocked\", error };\n }\n const cacheVisible = result.message.targets.length === 0 ||\n result.message.targets.includes(this.principal.agent);\n await this.edge.commit(record, result.message, cacheVisible, this.now());\n return { state: \"committed\", result, messageId: record.draft.id };\n } catch (error) {\n const caught = error instanceof Error ? error : new Error(String(error));\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));\n return { state: \"blocked\", error: caught };\n }\n }\n\n async insertMessage(message: PendingMessage): Promise<SyncInsertResult> {\n this.assertPrincipal({ workspace: message.workspace, agent: message.source }, false);\n const queued = await this.edge.enqueue(message, this.now());\n const draft = queued.draft;\n const flushed = await this.flushOne();\n if (flushed.state === \"blocked\") 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 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): 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 const before = await this.edge.pullCursor();\n try {\n await this.ensureRemote();\n const page = await this.remote.listMessages(this.principal, {\n cursor: before,\n limit: 200,\n includeExpired: true,\n });\n await this.edge.cachePage(page.messages, page.cursor, this.now());\n pulled += page.messages.length;\n if (page.messages.length < 200 || !page.cursor || page.cursor === before) break;\n } catch (error) {\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 }\n return { online: true, pulled };\n }\n\n async sync(options: { maxPush?: number; maxPages?: number } = {}): Promise<SyncReport> {\n await this.edge.initialize();\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 for (let index = 0; index < maxPush; index += 1) {\n const result = await this.flushOne();\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 lastError = codeOf(result.error);\n failureRetryable = result.state === \"retry\" ? result.retryable : false;\n if (result.state === \"retry\") online = false;\n break;\n }\n\n let pulled = 0;\n if (maxPages > 0) {\n const pull = await this.pull(maxPages);\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();\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.assertPrincipal(principal);\n if (query.unacknowledgedBy) {\n await this.ensureRemote();\n const remotePage = await this.remote.listMessages(principal, query);\n await this.edge.cacheLatest(remotePage.messages, this.now());\n const stats = await this.edge.stats();\n return { ...remotePage, source: \"remote\", stale: false, lastSyncedAt: stats.lastSyncAt };\n }\n if (query.latest) {\n try {\n await this.ensureRemote();\n const remotePage = await this.remote.listMessages(principal, query);\n await this.edge.cacheLatest(remotePage.messages, this.now());\n const stats = await this.edge.stats();\n return { ...remotePage, source: \"remote\", stale: false, lastSyncedAt: stats.lastSyncAt };\n } catch (error) {\n if (!isRetryableSyncError(error)) throw error;\n await this.edge.noteError(codeOf(error));\n const cached = await this.edge.list(query);\n const stats = await this.edge.stats();\n return { ...cached, source: \"cache\", stale: true, lastSyncedAt: stats.lastSyncAt };\n }\n }\n await this.sync({ maxPush: 20, maxPages: 0 });\n try {\n await this.ensureRemote();\n const remotePage = await this.remote.listMessages(principal, query);\n await this.edge.cacheLatest(remotePage.messages, this.now());\n const stats = await this.edge.stats();\n return { ...remotePage, source: \"remote\", stale: false, lastSyncedAt: stats.lastSyncAt };\n } catch (error) {\n if (!isRetryableSyncError(error)) throw error;\n await this.edge.noteError(codeOf(error));\n const cached = await this.edge.list(query);\n const stats = await this.edge.stats();\n return { ...cached, source: \"cache\", stale: true, lastSyncedAt: stats.lastSyncAt };\n }\n }\n\n async recordReceipt(\n workspace: string,\n messageIds: string[],\n principal: string,\n readAt?: Date,\n ): Promise<number> {\n this.assertPrincipal({ workspace, agent: principal }, false);\n await this.ensureRemote();\n return this.remote.recordReceipt(workspace, messageIds, principal, 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 | undefined,\n retryPolicy: RetryPolicy,\n ): Promise<BridgeDelivery | null> {\n this.assertPrincipal(principal);\n await this.ensureRemote();\n return this.remote.settleDelivery(principal, deliveryId, leaseToken, state, error, retryPolicy);\n }\n\n async diagnostics(principal: BridgePrincipal): Promise<SyncDiagnostics> {\n this.assertPrincipal(principal);\n const edge = await this.edge.stats();\n let remote: BridgeDiagnostics | undefined;\n try {\n await this.ensureRemote();\n remote = await this.remote.diagnostics?.(principal);\n } catch {\n // Edge diagnostics remain available during an outage.\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 oldestAvailableAt: remote?.oldestAvailableAt,\n principal: { workspace: principal.workspace, agent: principal.agent },\n remoteReachable: Boolean(remote),\n outboxPending: edge.pending,\n outboxBlocked: edge.blocked,\n cachedMessages: edge.cached,\n lastSyncAt: edge.lastSyncAt,\n lastSyncError: edge.lastError,\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 await this.edge.close();\n await this.remote.close?.();\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { chmodSync, existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport type { DatabaseSync as Database, SQLInputValue } from \"node:sqlite\";\nimport { decodeCursor, encodeCursor, type AgentPresence, type BridgeDelivery, type BridgeDeliveryEvent, type BridgeMessage, type BridgePrincipal, type RetryPolicy } from \"./bridge-domain.js\";\nimport type { BridgeDiagnostics, BridgeStore, ClaimOptions, InsertMessageResult, MessagePage, MessageQuery } from \"./bridge-store.js\";\nimport { assertIdempotentReplay } from \"./idempotency.js\";\n\ntype Row = Record<string, unknown>;\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 schema = `\nPRAGMA journal_mode = WAL;\nPRAGMA synchronous = FULL;\nPRAGMA foreign_keys = ON;\nCREATE TABLE IF NOT EXISTS bridge_messages (\n sequence INTEGER PRIMARY KEY AUTOINCREMENT, id TEXT NOT NULL UNIQUE, workspace TEXT NOT NULL, source TEXT NOT NULL,\n type TEXT NOT NULL, content TEXT NOT NULL, content_type TEXT NOT NULL, data TEXT, targets TEXT NOT NULL DEFAULT '[]',\n thread_id TEXT, reply_to_id TEXT, correlation_id TEXT, causation_id TEXT, priority TEXT NOT NULL, expires_at TEXT,\n idempotency_key TEXT, atrib_receipt_id TEXT, informed_by TEXT, metadata TEXT, created_at TEXT NOT NULL,\n UNIQUE(workspace, id), CHECK(json_valid(targets) AND json_type(targets) = 'array'),\n CHECK(priority IN ('info', 'high', 'urgent'))\n);\nCREATE UNIQUE INDEX IF NOT EXISTS bridge_messages_idempotency ON bridge_messages(workspace, source, idempotency_key) WHERE idempotency_key IS NOT NULL;\nCREATE INDEX IF NOT EXISTS bridge_messages_cursor ON bridge_messages(workspace, sequence);\nCREATE INDEX IF NOT EXISTS bridge_messages_source ON bridge_messages(workspace, source, sequence);\nCREATE INDEX IF NOT EXISTS bridge_messages_thread ON bridge_messages(workspace, thread_id, sequence) WHERE thread_id IS NOT NULL;\nCREATE INDEX IF NOT EXISTS bridge_messages_created ON bridge_messages(workspace, created_at, sequence);\nCREATE TABLE IF NOT EXISTS bridge_receipts (workspace TEXT NOT NULL, message_id TEXT NOT NULL, principal TEXT NOT NULL, read_at TEXT NOT NULL, PRIMARY KEY(workspace, message_id, principal), FOREIGN KEY(workspace, message_id) REFERENCES bridge_messages(workspace, id) ON DELETE CASCADE);\nCREATE TABLE IF NOT EXISTS bridge_deliveries (\n id TEXT PRIMARY KEY, message_id TEXT NOT NULL, workspace TEXT NOT NULL, recipient TEXT NOT NULL,\n state TEXT NOT NULL, attempt INTEGER NOT NULL DEFAULT 0, available_at TEXT NOT NULL, lease_token TEXT, lease_owner TEXT, lease_expires_at TEXT, last_error TEXT,\n UNIQUE(message_id, recipient), FOREIGN KEY(workspace, message_id) REFERENCES bridge_messages(workspace, id) ON DELETE CASCADE,\n CHECK(state IN ('pending', 'claimed', 'acked', 'retrying', 'dead')), CHECK(attempt >= 0),\n CHECK((state = 'claimed' AND lease_token IS NOT NULL AND lease_expires_at IS NOT NULL) OR (state <> 'claimed' AND lease_token IS NULL AND lease_owner IS NULL AND lease_expires_at IS NULL))\n);\nCREATE INDEX IF NOT EXISTS bridge_deliveries_claim ON bridge_deliveries(workspace, recipient, state, available_at);\nCREATE TABLE IF NOT EXISTS bridge_delivery_events (\n sequence INTEGER PRIMARY KEY AUTOINCREMENT, delivery_id TEXT NOT NULL,\n message_id TEXT NOT NULL, workspace TEXT NOT NULL, recipient TEXT NOT NULL,\n from_state TEXT, to_state TEXT NOT NULL, attempt INTEGER NOT NULL,\n lease_owner TEXT, error TEXT, created_at TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS bridge_delivery_events_lookup\n ON bridge_delivery_events(workspace, delivery_id, sequence);\nCREATE TRIGGER IF NOT EXISTS bridge_delivery_events_insert\n AFTER INSERT ON bridge_deliveries BEGIN\n INSERT INTO bridge_delivery_events\n (delivery_id,message_id,workspace,recipient,from_state,to_state,attempt,lease_owner,error,created_at)\n VALUES\n (NEW.id,NEW.message_id,NEW.workspace,NEW.recipient,NULL,NEW.state,NEW.attempt,NEW.lease_owner,NEW.last_error,strftime('%Y-%m-%dT%H:%M:%fZ','now'));\n END;\nCREATE TRIGGER IF NOT EXISTS bridge_delivery_events_update\n AFTER UPDATE ON bridge_deliveries\n WHEN OLD.state IS NOT NEW.state OR OLD.attempt IS NOT NEW.attempt BEGIN\n INSERT INTO bridge_delivery_events\n (delivery_id,message_id,workspace,recipient,from_state,to_state,attempt,lease_owner,error,created_at)\n VALUES\n (NEW.id,NEW.message_id,NEW.workspace,NEW.recipient,OLD.state,NEW.state,NEW.attempt,NEW.lease_owner,NEW.last_error,strftime('%Y-%m-%dT%H:%M:%fZ','now'));\n END;\nCREATE TABLE IF NOT EXISTS bridge_presence (\n workspace TEXT NOT NULL, agent TEXT NOT NULL, instance TEXT NOT NULL, runtime_type TEXT,\n capabilities TEXT NOT NULL DEFAULT '[]', lease_expires_at TEXT NOT NULL, last_seen_at TEXT NOT NULL,\n PRIMARY KEY(workspace, agent, instance), CHECK(json_valid(capabilities) AND json_type(capabilities)='array')\n);\nCREATE INDEX IF NOT EXISTS bridge_presence_active ON bridge_presence(workspace, lease_expires_at);\nCREATE TRIGGER IF NOT EXISTS bridge_messages_no_update BEFORE UPDATE ON bridge_messages BEGIN SELECT RAISE(ABORT, 'bridge messages are immutable'); END;\nCREATE TRIGGER IF NOT EXISTS bridge_messages_no_delete BEFORE DELETE ON bridge_messages BEGIN SELECT RAISE(ABORT, 'bridge messages are immutable'); END;\n`;\n\nfunction stringify(value: unknown): string | null { return value === undefined ? null : JSON.stringify(value); }\nfunction parse(value: unknown): any { return typeof value === \"string\" ? JSON.parse(value) : undefined; }\nfunction message(row: Row): BridgeMessage { return { id: String(row.id), workspace: String(row.workspace), source: String(row.source), sequence: String(row.sequence), type: String(row.type), content: String(row.content), contentType: String(row.content_type), data: parse(row.data), targets: parse(row.targets) ?? [], threadId: row.thread_id as string | undefined, replyToId: row.reply_to_id as string | undefined, correlationId: row.correlation_id as string | undefined, causationId: row.causation_id as string | undefined, priority: row.priority as BridgeMessage[\"priority\"], expiresAt: row.expires_at as string | undefined, idempotencyKey: row.idempotency_key as string | undefined, atribReceiptId: row.atrib_receipt_id as string | undefined, informedBy: parse(row.informed_by), metadata: parse(row.metadata), createdAt: String(row.created_at) }; }\nfunction delivery(row: Row): BridgeDelivery { return { id: String(row.id), messageId: String(row.message_id), workspace: String(row.workspace), recipient: String(row.recipient), state: row.state as BridgeDelivery[\"state\"], attempt: Number(row.attempt), availableAt: String(row.available_at), leaseToken: row.lease_token as string | undefined, leaseOwner: row.lease_owner as string | undefined, leaseExpiresAt: row.lease_expires_at as string | undefined, lastError: row.last_error as string | undefined }; }\nfunction presence(row: Row): AgentPresence { return { workspace: String(row.workspace), agent: String(row.agent), instance: String(row.instance), runtimeType: row.runtime_type as string | undefined, capabilities: parse(row.capabilities) ?? [], leaseExpiresAt: String(row.lease_expires_at), lastSeenAt: String(row.last_seen_at) }; }\nfunction deliveryEvent(row: Row): BridgeDeliveryEvent { return { sequence: String(row.sequence), deliveryId: String(row.delivery_id), messageId: String(row.message_id), workspace: String(row.workspace), recipient: String(row.recipient), fromState: row.from_state as BridgeDeliveryEvent[\"fromState\"], toState: row.to_state as BridgeDeliveryEvent[\"toState\"], attempt: Number(row.attempt), leaseOwner: row.lease_owner as string | undefined, error: row.error as string | undefined, createdAt: String(row.created_at) }; }\n\nexport class SQLiteBridgeStore implements BridgeStore {\n private readonly db: Database;\n private initialized = false;\n constructor(private readonly path = \":memory:\", private readonly busyTimeoutMs = 2_000) { this.db = openDatabase(path); this.restrictFiles(); }\n private restrictFiles(): void {\n if (this.path === \":memory:\") return;\n for (const path of [this.path, `${this.path}-wal`, `${this.path}-shm`]) {\n if (existsSync(path)) chmodSync(path, 0o600);\n }\n }\n async initialize(): Promise<void> { if (this.initialized) return; const versionRow = this.db.prepare(\"SELECT sqlite_version() AS version\").get() as Row; const parts = String(versionRow.version).split(\".\").map(Number); const encoded = (parts[0] ?? 0) * 1_000_000 + (parts[1] ?? 0) * 1_000 + (parts[2] ?? 0); if (encoded < 3_051_003) throw new Error(\"SQLite 3.51.3 or newer is required\"); this.db.exec(`PRAGMA busy_timeout = ${Math.max(1, Math.trunc(this.busyTimeoutMs))}; ${schema}`); this.restrictFiles(); this.initialized = true; }\n private async ready() { await this.initialize(); }\n async insertMessage(input: Omit<BridgeMessage, \"sequence\" | \"createdAt\">): Promise<InsertMessageResult> {\n await this.ready(); const createdAt = new Date().toISOString();\n this.db.exec(\"BEGIN IMMEDIATE\");\n try {\n if (input.idempotencyKey) { const existing = this.db.prepare(\"SELECT * FROM bridge_messages WHERE workspace = ? AND source = ? AND idempotency_key = ?\").get(input.workspace, input.source, input.idempotencyKey) as Row | undefined; if (existing) { const replay = message(existing); assertIdempotentReplay(replay, input); this.db.exec(\"COMMIT\"); return { message: replay, created: false }; } }\n this.db.prepare(`INSERT INTO bridge_messages (id,workspace,source,type,content,content_type,data,targets,thread_id,reply_to_id,correlation_id,causation_id,priority,expires_at,idempotency_key,atrib_receipt_id,informed_by,metadata,created_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`).run(input.id,input.workspace,input.source,input.type,input.content,input.contentType,stringify(input.data),JSON.stringify(input.targets),input.threadId ?? null,input.replyToId ?? null,input.correlationId ?? null,input.causationId ?? null,input.priority,input.expiresAt ?? null,input.idempotencyKey ?? null,input.atribReceiptId ?? null,stringify(input.informedBy),stringify(input.metadata),createdAt);\n for (const recipient of input.targets) this.db.prepare(\"INSERT INTO bridge_deliveries (id,message_id,workspace,recipient,state,available_at) VALUES (?,?,?,?,?,?)\").run(randomUUID(), input.id, input.workspace, recipient, \"pending\", createdAt);\n const row = this.db.prepare(\"SELECT * FROM bridge_messages WHERE id = ?\").get(input.id) as Row; this.db.exec(\"COMMIT\"); return { message: message(row), created: true };\n } catch (error) { this.db.exec(\"ROLLBACK\"); throw error; }\n }\n async listMessages(principal: BridgePrincipal, query: MessageQuery = {}): Promise<MessagePage> {\n await this.ready(); const cursor = decodeCursor(query.cursor); const limit = Math.min(Math.max(Math.trunc(query.limit ?? 50), 1), 200); const now = new Date().toISOString();\n const highWaterRow = query.latest ? undefined : this.db.prepare(\"SELECT max(sequence) AS sequence FROM bridge_messages WHERE workspace=?\").get(principal.workspace) as Row;\n const highWater = highWaterRow?.sequence === null || highWaterRow?.sequence === undefined\n ? undefined\n : String(highWaterRow.sequence);\n const clauses = [\"workspace = ?\", query.latest ? \"1=1\" : \"sequence > ?\", \"(targets = '[]' OR EXISTS (SELECT 1 FROM json_each(targets) WHERE value = ?))\"]; const args: SQLInputValue[] = query.latest ? [principal.workspace, principal.agent] : [principal.workspace, cursor ?? \"0\", principal.agent];\n if (highWater) { clauses.push(\"sequence <= ?\"); args.push(highWater); }\n if (!query.includeExpired) { clauses.push(\"(expires_at IS NULL OR expires_at > ?)\"); args.push(now); }\n if (query.types?.length) { clauses.push(`type IN (${query.types.map(() => \"?\").join(\",\")})`); args.push(...query.types); }\n if (query.source) { clauses.push(\"source = ?\"); args.push(query.source); }\n if (query.since) { clauses.push(\"created_at >= ?\"); args.push(query.since); }\n if (query.unacknowledgedBy) {\n clauses.push(\"NOT EXISTS (SELECT 1 FROM bridge_receipts receipt WHERE receipt.workspace=bridge_messages.workspace AND receipt.message_id=bridge_messages.id AND receipt.principal=?)\");\n args.push(query.unacknowledgedBy);\n }\n if (query.threadId) { clauses.push(\"thread_id = ?\"); args.push(query.threadId); }\n const rows = this.db.prepare(`SELECT * FROM bridge_messages WHERE ${clauses.join(\" AND \")} ORDER BY sequence ${query.latest ? \"DESC\" : \"ASC\"} LIMIT ?`).all(...args, limit) as Row[];\n const messages = rows.map(message);\n const last = messages[messages.length - 1];\n if (query.latest) return { messages, cursor: messages[0] ? encodeCursor(messages[0].sequence) : query.cursor };\n if (messages.length === limit) return { messages, cursor: encodeCursor(last!.sequence) };\n return { messages, cursor: highWater ? encodeCursor(highWater) : query.cursor };\n }\n async recordReceipt(workspace: string, messageIds: string[], principal: string, readAt = new Date()): Promise<number> { await this.ready(); const stmt = this.db.prepare(\"INSERT OR IGNORE INTO bridge_receipts (workspace,message_id,principal,read_at) SELECT workspace,id,?,? FROM bridge_messages WHERE workspace=? AND id=? AND (targets='[]' OR EXISTS (SELECT 1 FROM json_each(targets) WHERE value=?))\"); let changed = 0; this.db.exec(\"BEGIN IMMEDIATE\"); try { for (const id of messageIds) changed += Number(stmt.run(principal,readAt.toISOString(),workspace,id,principal).changes); this.db.exec(\"COMMIT\"); return changed; } catch (e) { this.db.exec(\"ROLLBACK\"); throw e; } }\n async claimDelivery(principal: BridgePrincipal, options: ClaimOptions): Promise<BridgeDelivery | null> {\n await this.ready(); const now = options.now ?? new Date(); const nowText = now.toISOString(); const expires = new Date(now.getTime() + options.leaseMs).toISOString(); const owner = principal.instance ?? principal.agent; const maxAttempts = options.maxAttempts ?? 5;\n this.db.exec(\"BEGIN IMMEDIATE\"); try {\n this.db.prepare(\"UPDATE bridge_deliveries SET state='dead', last_error='message expired', lease_token=NULL, lease_owner=NULL, lease_expires_at=NULL WHERE workspace=? AND recipient=? AND state IN ('pending','retrying','claimed') AND EXISTS (SELECT 1 FROM bridge_messages message WHERE message.workspace=bridge_deliveries.workspace AND message.id=bridge_deliveries.message_id AND message.expires_at IS NOT NULL AND message.expires_at <= ?)\").run(principal.workspace,principal.agent,nowText);\n this.db.prepare(\"UPDATE bridge_deliveries SET state='dead', last_error='maximum attempts reached', lease_token=NULL, lease_owner=NULL, lease_expires_at=NULL WHERE workspace=? AND recipient=? AND attempt>=? AND (state IN ('pending','retrying') OR (state='claimed' AND lease_expires_at<=?))\").run(principal.workspace,principal.agent,maxAttempts,nowText);\n this.db.prepare(\"UPDATE bridge_deliveries SET state='retrying', lease_token=NULL, lease_owner=NULL, lease_expires_at=NULL WHERE workspace=? AND recipient=? AND state='claimed' AND lease_expires_at <= ? AND attempt<?\").run(principal.workspace,principal.agent,nowText,maxAttempts);\n const candidate = this.db.prepare(\"SELECT delivery.id FROM bridge_deliveries delivery JOIN bridge_messages message ON message.workspace=delivery.workspace AND message.id=delivery.message_id WHERE delivery.workspace=? AND delivery.recipient=? AND delivery.state IN ('pending','retrying') AND delivery.available_at <= ? AND delivery.attempt<? AND (message.expires_at IS NULL OR message.expires_at > ?) ORDER BY delivery.available_at,delivery.id LIMIT 1\").get(principal.workspace,principal.agent,nowText,maxAttempts,nowText) as Row | undefined;\n if (!candidate) { this.db.exec(\"COMMIT\"); return null; }\n const candidateId = String(candidate.id);\n const token = randomUUID(); this.db.prepare(\"UPDATE bridge_deliveries SET state='claimed', attempt=attempt+1, lease_token=?, lease_owner=?, lease_expires_at=? WHERE id=?\").run(token,owner,expires,candidateId);\n const claimed = this.db.prepare(\"SELECT * FROM bridge_deliveries WHERE id=?\").get(candidateId) as Row; this.db.exec(\"COMMIT\"); return delivery(claimed);\n } catch (e) { this.db.exec(\"ROLLBACK\"); throw e; }\n }\n async renewDelivery(principal: BridgePrincipal, id: string, token: string, leaseMs: number): Promise<BridgeDelivery | null> { await this.ready(); const now = new Date(); const expires = new Date(now.getTime() + leaseMs).toISOString(); const owner = principal.instance ?? principal.agent; const result = this.db.prepare(\"UPDATE bridge_deliveries SET lease_expires_at=? WHERE workspace=? AND recipient=? AND lease_owner=? AND id=? AND lease_token=? AND state='claimed' AND lease_expires_at > ?\").run(expires,principal.workspace,principal.agent,owner,id,token,now.toISOString()); if (!result.changes) return null; return delivery(this.db.prepare(\"SELECT * FROM bridge_deliveries WHERE id=?\").get(id) as Row); }\n async settleDelivery(principal: BridgePrincipal, id: string, token: string, state: \"acked\" | \"retrying\" | \"dead\", error: string | undefined, retryPolicy: RetryPolicy): Promise<BridgeDelivery | null> { await this.ready(); const now = new Date(); const owner = principal.instance ?? principal.agent; this.db.exec(\"BEGIN IMMEDIATE\"); try { const current = this.db.prepare(\"SELECT * FROM bridge_deliveries WHERE workspace=? AND recipient=? AND lease_owner=? AND id=? AND lease_token=? AND state='claimed' AND lease_expires_at > ?\").get(principal.workspace,principal.agent,owner,id,token,now.toISOString()) as Row | undefined; if (!current) { this.db.exec(\"COMMIT\"); return null; } const attempt = Number(current.attempt); const nextState = state === \"retrying\" && attempt >= retryPolicy.maxAttempts ? \"dead\" : state; const exponential = Math.min(retryPolicy.maxDelayMs, retryPolicy.baseDelayMs * 2 ** Math.max(0, attempt - 1)); const jitter = 1 + (Math.random() * 2 - 1) * retryPolicy.jitterRatio; const delay = nextState === \"retrying\" ? Math.max(1, Math.round(exponential * jitter)) : 0; const available = new Date(now.getTime() + delay).toISOString(); this.db.prepare(\"UPDATE bridge_deliveries SET state=?, available_at=?, last_error=?, lease_token=NULL, lease_owner=NULL, lease_expires_at=NULL WHERE id=?\").run(nextState,available,error?.slice(0,1024) ?? null,id); const result = delivery(this.db.prepare(\"SELECT * FROM bridge_deliveries WHERE id=?\").get(id) as Row); this.db.exec(\"COMMIT\"); return result; } catch (caught) { this.db.exec(\"ROLLBACK\"); throw caught; } }\n async diagnostics(principal: BridgePrincipal): Promise<BridgeDiagnostics> { await this.ready(); const rows = this.db.prepare(\"SELECT state, count(*) AS count, min(available_at) AS oldest FROM bridge_deliveries WHERE workspace=? AND recipient=? GROUP BY state\").all(principal.workspace, principal.agent) as Row[]; const counts = new Map(rows.map((row) => [String(row.state), Number(row.count)])); const oldest = rows.filter((row) => row.state === \"pending\" || row.state === \"retrying\").map((row) => row.oldest ? String(row.oldest) : undefined).filter(Boolean).sort()[0]; return { schemaVersion: \"local-v2\", deliverySupported: true, pending: counts.get(\"pending\") ?? 0, claimed: counts.get(\"claimed\") ?? 0, retrying: counts.get(\"retrying\") ?? 0, dead: counts.get(\"dead\") ?? 0, oldestAvailableAt: oldest }; }\n async heartbeat(principal: BridgePrincipal, leaseMs: number, runtimeType?: string, capabilities: string[] = []): Promise<AgentPresence> {\n await this.ready();\n const now = new Date();\n const nowText = now.toISOString();\n const expires = new Date(now.getTime() + leaseMs).toISOString();\n this.db.exec(\"BEGIN IMMEDIATE\");\n try {\n this.db.prepare(\"DELETE FROM bridge_presence WHERE workspace=? AND lease_expires_at<=?\")\n .run(principal.workspace, nowText);\n const current = this.db.prepare(\"SELECT 1 FROM bridge_presence WHERE workspace=? AND agent=? AND instance=?\")\n .get(principal.workspace, principal.agent, principal.instance!) as Row | undefined;\n const agentCount = this.db.prepare(\"SELECT count(*) AS count FROM bridge_presence WHERE workspace=? AND agent=?\")\n .get(principal.workspace, principal.agent) as Row;\n const workspaceCount = this.db.prepare(\"SELECT count(*) AS count FROM bridge_presence WHERE workspace=?\")\n .get(principal.workspace) as Row;\n if (!current && (Number(agentCount.count) >= 128 || Number(workspaceCount.count) >= 4096)) {\n throw Object.assign(new Error(\"active instance limit reached\"), {\n status: 429,\n code: \"presence_limit\",\n });\n }\n this.db.prepare(\"INSERT INTO bridge_presence (workspace,agent,instance,runtime_type,capabilities,lease_expires_at,last_seen_at) VALUES (?,?,?,?,?,?,?) ON CONFLICT(workspace,agent,instance) DO UPDATE SET runtime_type=excluded.runtime_type, capabilities=excluded.capabilities, lease_expires_at=excluded.lease_expires_at, last_seen_at=excluded.last_seen_at\")\n .run(principal.workspace,principal.agent,principal.instance!,runtimeType ?? null,JSON.stringify(capabilities),expires,nowText);\n const result = presence(this.db.prepare(\"SELECT * FROM bridge_presence WHERE workspace=? AND agent=? AND instance=?\")\n .get(principal.workspace,principal.agent,principal.instance!) as Row);\n this.db.exec(\"COMMIT\");\n return result;\n } catch (error) {\n this.db.exec(\"ROLLBACK\");\n throw error;\n }\n }\n async listPresence(principal: BridgePrincipal): Promise<AgentPresence[]> {\n await this.ready();\n const now = new Date().toISOString();\n this.db.prepare(\"DELETE FROM bridge_presence WHERE workspace=? AND lease_expires_at<=?\")\n .run(principal.workspace, now);\n const rows = this.db.prepare(\"SELECT * FROM bridge_presence WHERE workspace=? ORDER BY agent,instance\")\n .all(principal.workspace) as Row[];\n return rows.map(presence);\n }\n async listDeliveryEvents(deliveryId: string): Promise<BridgeDeliveryEvent[]> { await this.ready(); const rows = this.db.prepare(\"SELECT * FROM bridge_delivery_events WHERE delivery_id=? ORDER BY sequence\").all(deliveryId) as Row[]; return rows.map(deliveryEvent); }\n async close(): Promise<void> { this.db.close(); }\n}\n"],"mappings":"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","names":["require","message","message","randomUUID","chmodSync","existsSync","createRequire","require","createRequire","openDatabase","schema","existsSync","chmodSync","randomUUID"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/idempotency.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { BridgeMessage, JsonValue } from \"./bridge-domain.js\";\n\nexport class IdempotencyConflictError extends Error {\n readonly code = \"idempotency_conflict\";\n readonly status = 409;\n}\n\nfunction canonical(value: JsonValue | undefined): string {\n if (value === undefined) return \"undefined\";\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).sort().map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`).join(\",\")}}`;\n}\n\nfunction fingerprint(message: Omit<BridgeMessage, \"sequence\" | \"createdAt\">): string {\n const value: JsonValue = {\n workspace: message.workspace,\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 };\n return createHash(\"sha256\").update(canonical(value)).digest(\"hex\");\n}\n\nexport function assertIdempotentReplay(\n existing: BridgeMessage,\n attempted: Omit<BridgeMessage, \"sequence\" | \"createdAt\">,\n): void {\n if (fingerprint(existing) !== fingerprint(attempted)) {\n throw new IdempotencyConflictError(\"idempotency key is already bound to a different message\");\n }\n}\n"],"mappings":";;;AAAA,SAAS,kBAAkB;AAGpB,IAAM,2BAAN,cAAuC,MAAM;AAAA,EAA7C;AAAA;AACL,SAAS,OAAO;AAChB,SAAS,SAAS;AAAA;AACpB;AAEA,SAAS,UAAU,OAAsC;AACvD,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO,KAAK,UAAU,KAAK;AAC5E,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,IAAI,MAAM,IAAI,SAAS,EAAE,KAAK,GAAG,CAAC;AACnE,SAAO,IAAI,OAAO,KAAK,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,UAAU,GAAG,CAAC,IAAI,UAAU,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC;AAChH;AAEA,SAAS,YAAY,SAAgE;AACnF,QAAM,QAAmB;AAAA,IACvB,WAAW,QAAQ;AAAA,IACnB,QAAQ,QAAQ;AAAA,IAChB,MAAM,QAAQ;AAAA,IACd,SAAS,QAAQ;AAAA,IACjB,aAAa,QAAQ;AAAA,IACrB,MAAM,QAAQ,QAAQ;AAAA,IACtB,SAAS,CAAC,GAAG,QAAQ,OAAO,EAAE,KAAK;AAAA,IACnC,UAAU,QAAQ,YAAY;AAAA,IAC9B,WAAW,QAAQ,aAAa;AAAA,IAChC,eAAe,QAAQ,iBAAiB;AAAA,IACxC,aAAa,QAAQ,eAAe;AAAA,IACpC,UAAU,QAAQ;AAAA,IAClB,WAAW,QAAQ,aAAa;AAAA,IAChC,gBAAgB,QAAQ,kBAAkB;AAAA,IAC1C,YAAY,CAAC,GAAI,QAAQ,cAAc,CAAC,CAAE,EAAE,KAAK;AAAA,IACjD,UAAU,QAAQ,YAAY;AAAA,EAChC;AACA,SAAO,WAAW,QAAQ,EAAE,OAAO,UAAU,KAAK,CAAC,EAAE,OAAO,KAAK;AACnE;AAEO,SAAS,uBACd,UACA,WACM;AACN,MAAI,YAAY,QAAQ,MAAM,YAAY,SAAS,GAAG;AACpD,UAAM,IAAI,yBAAyB,yDAAyD;AAAA,EAC9F;AACF;","names":[]}
@@ -1,54 +0,0 @@
1
- import * as node_http from 'node:http';
2
- import { IncomingMessage, ServerResponse } from 'node:http';
3
- import { a as BridgeStore, I as InsertMessageResult, b as MessageQuery, M as MessagePage, C as ClaimOptions, B as BridgeDiagnostics } from './bridge-store-BuGjxTn4.js';
4
- import { b as BridgeMessage, c as BridgePrincipal, B as BridgeDelivery, R as RetryPolicy, A as AgentPresence, a as BridgeDeliveryEvent } from './bridge-domain-BcnBeHOn.js';
5
-
6
- interface PgQueryable {
7
- query<T extends Record<string, unknown> = Record<string, unknown>>(sql: string, values?: unknown[]): Promise<{
8
- rows: T[];
9
- rowCount: number | null;
10
- }>;
11
- }
12
- declare class PostgresBridgeStore implements BridgeStore {
13
- private readonly db;
14
- constructor(db: PgQueryable);
15
- initialize(): Promise<void>;
16
- insertMessage(input: Omit<BridgeMessage, "sequence" | "createdAt">): Promise<InsertMessageResult>;
17
- listMessages(principal: BridgePrincipal, query?: MessageQuery): Promise<MessagePage>;
18
- recordReceipt(workspace: string, ids: string[], principal: string, readAt?: Date): Promise<number>;
19
- claimDelivery(principal: BridgePrincipal, options: ClaimOptions): Promise<BridgeDelivery | null>;
20
- renewDelivery(principal: BridgePrincipal, id: string, token: string, leaseMs: number): Promise<BridgeDelivery | null>;
21
- settleDelivery(principal: BridgePrincipal, id: string, token: string, state: "acked" | "retrying" | "dead", error?: string, retryPolicy?: RetryPolicy): Promise<BridgeDelivery | null>;
22
- diagnostics(principal: BridgePrincipal): Promise<BridgeDiagnostics>;
23
- heartbeat(principal: BridgePrincipal, leaseMs: number, runtimeType?: string, capabilities?: string[]): Promise<AgentPresence>;
24
- listPresence(principal: BridgePrincipal): Promise<AgentPresence[]>;
25
- listDeliveryEvents(deliveryId: string): Promise<BridgeDeliveryEvent[]>;
26
- }
27
-
28
- interface AuthenticatedCredential {
29
- id: string;
30
- principal: BridgePrincipal;
31
- }
32
- interface CredentialResolver {
33
- resolve(token: string, signal?: AbortSignal): Promise<AuthenticatedCredential | null>;
34
- }
35
- declare function hashCredential(token: string): string;
36
- declare class PostgresCredentialResolver implements CredentialResolver {
37
- private readonly db;
38
- constructor(db: PgQueryable);
39
- resolve(token: string, signal?: AbortSignal): Promise<AuthenticatedCredential | null>;
40
- }
41
- declare function bearerToken(value: string | undefined): string | null;
42
- declare function safeTokenHashEqual(token: string, expectedHash: string): boolean;
43
-
44
- interface GatewayOptions {
45
- store: BridgeStore;
46
- credentials: CredentialResolver;
47
- allowedOrigins?: string[];
48
- bodyLimitBytes?: number;
49
- requestDeadlineMs?: number;
50
- ready?: () => Promise<boolean>;
51
- }
52
- declare function createGateway(options: GatewayOptions): node_http.Server<typeof IncomingMessage, typeof ServerResponse>;
53
-
54
- export { type AuthenticatedCredential as A, type CredentialResolver as C, type GatewayOptions as G, type PgQueryable as P, PostgresBridgeStore as a, PostgresCredentialResolver as b, bearerToken as c, createGateway as d, hashCredential as h, safeTokenHashEqual as s };