@creatornader/agent-bridge 0.3.1 → 0.5.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 (90) hide show
  1. package/CHANGELOG.md +222 -1
  2. package/README.md +312 -12
  3. package/ROADMAP.md +88 -7
  4. package/SECURITY.md +78 -5
  5. package/SKILL.md +108 -1
  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-CNBKdYXh.d.ts} +2 -1
  9. package/dist/{bridge-store-DPVSCwfs.d.ts → bridge-store-ByJ6CaJk.d.ts} +3 -0
  10. package/dist/bridge.d.ts +25 -8
  11. package/dist/bridge.js +19 -9
  12. package/dist/{chunk-MBPZXTJA.js → chunk-7VJI2MXI.js} +285 -42
  13. package/dist/chunk-7VJI2MXI.js.map +1 -0
  14. package/dist/{chunk-4VB44KJU.js → chunk-AWE3DFZV.js} +3 -2
  15. package/dist/chunk-AWE3DFZV.js.map +1 -0
  16. package/dist/{chunk-GADH244D.js → chunk-E4OWHGUE.js} +16 -5
  17. package/dist/chunk-E4OWHGUE.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-SPSMZOCJ.js → chunk-HUHG7XTB.js} +6 -5
  21. package/dist/chunk-HUHG7XTB.js.map +1 -0
  22. package/dist/{chunk-5GMB3A77.js → chunk-IVG4XWWS.js} +26 -14
  23. package/dist/chunk-IVG4XWWS.js.map +1 -0
  24. package/dist/{chunk-WAI2IYIQ.js → chunk-P635FAN4.js} +50 -7
  25. package/dist/chunk-P635FAN4.js.map +1 -0
  26. package/dist/{chunk-45BZGB77.js → chunk-QNXHDOJ5.js} +218 -24
  27. package/dist/chunk-QNXHDOJ5.js.map +1 -0
  28. package/dist/{chunk-UAHMP6GC.js → chunk-QPC6JHA3.js} +10 -7
  29. package/dist/chunk-QPC6JHA3.js.map +1 -0
  30. package/dist/{chunk-Q6PPMXJC.js → chunk-SN7PIVDF.js} +377 -21
  31. package/dist/chunk-SN7PIVDF.js.map +1 -0
  32. package/dist/{chunk-A6W4QALF.js → chunk-TC6A7GMF.js} +2 -2
  33. package/dist/{chunk-2DFNOLMO.js → chunk-XDNT6ZNZ.js} +9 -6
  34. package/dist/chunk-XDNT6ZNZ.js.map +1 -0
  35. package/dist/{chunk-CEXBMOI5.js → chunk-Z6JP6MYD.js} +2 -2
  36. package/dist/cli.js +5867 -438
  37. package/dist/cli.js.map +1 -1
  38. package/dist/client-runtime.d.ts +4 -2
  39. package/dist/client-runtime.js +7 -7
  40. package/dist/contracts/generate.js +1 -1
  41. package/dist/dr.d.ts +9 -2
  42. package/dist/dr.js +6 -4
  43. package/dist/{gateway-CggQ8vTC.d.ts → gateway-CW-61lvs.d.ts} +27 -3
  44. package/dist/gateway-main.js +71 -7
  45. package/dist/gateway-main.js.map +1 -1
  46. package/dist/gateway.d.ts +3 -3
  47. package/dist/gateway.js +3 -3
  48. package/dist/index.js +8 -8
  49. package/dist/{postgres-bridge-store-Bfd3hRId.d.ts → postgres-bridge-store-C9KG9Z69.d.ts} +1 -1
  50. package/dist/postgres-production-preflight.d.ts +32 -0
  51. package/dist/postgres-production-preflight.js +249 -0
  52. package/dist/postgres-production-preflight.js.map +1 -0
  53. package/dist/server.js +8 -8
  54. package/dist/sqlite-edge-store-CdMIOrho.d.ts +148 -0
  55. package/dist/sqlite.d.ts +19 -80
  56. package/dist/sqlite.js +11 -3
  57. package/docs/architecture-v2.md +292 -15
  58. package/docs/decisions/0004-client-lifecycle-and-endpoint-migration.md +204 -0
  59. package/docs/deployment.md +349 -0
  60. package/docs/troubleshooting.md +23 -0
  61. package/llms.txt +69 -1
  62. package/openapi/agent-bridge-v2.openapi.json +1151 -124
  63. package/package.json +10 -2
  64. package/schemas/agent-bridge-v2.capabilities.json +26 -1
  65. package/schemas/agent-bridge-v2.mcp.json +11 -1
  66. package/schemas/agent-bridge-v2.schema.json +167 -0
  67. package/sql/migrations/007_runtime_role.sql +8 -4
  68. package/sql/migrations/013_row_isolation.sql +71 -8
  69. package/sql/migrations/014_owner_control_plane.sql +124 -31
  70. package/sql/migrations/015_portable_archives.sql +143 -41
  71. package/sql/migrations/016_native_dr_fence.sql +102 -35
  72. package/sql/migrations/017_gateway_authority_binding.sql +99 -0
  73. package/sql/migrations/018_endpoint_migration_challenges.sql +1054 -0
  74. package/sql/migrations/019_endpoint_migration_same_successor.sql +348 -0
  75. package/sql/migrations/020_managed_authority_compat.sql +698 -0
  76. package/sql/migrations/021_native_backup_reader.sql +421 -0
  77. package/sql/setup.sql +1 -3
  78. package/dist/chunk-2DFNOLMO.js.map +0 -1
  79. package/dist/chunk-45BZGB77.js.map +0 -1
  80. package/dist/chunk-4VB44KJU.js.map +0 -1
  81. package/dist/chunk-5GMB3A77.js.map +0 -1
  82. package/dist/chunk-GADH244D.js.map +0 -1
  83. package/dist/chunk-MBPZXTJA.js.map +0 -1
  84. package/dist/chunk-NCO7RLBM.js.map +0 -1
  85. package/dist/chunk-Q6PPMXJC.js.map +0 -1
  86. package/dist/chunk-SPSMZOCJ.js.map +0 -1
  87. package/dist/chunk-UAHMP6GC.js.map +0 -1
  88. package/dist/chunk-WAI2IYIQ.js.map +0 -1
  89. /package/dist/{chunk-A6W4QALF.js.map → chunk-TC6A7GMF.js.map} +0 -0
  90. /package/dist/{chunk-CEXBMOI5.js.map → chunk-Z6JP6MYD.js.map} +0 -0
@@ -0,0 +1 @@
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 { pathToFileURL } from \"node:url\";\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, SQLITE_INITIALIZATION_BUSY_TIMEOUT_MS } from \"./sqlite-retry.js\";\nimport { preparePrivateSqliteLocation, securePrivatePath, securePrivateSqliteSidecar, 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}\nfunction openReadOnlyDatabase(path: string): Database {\n const { DatabaseSync } = require(\"node:sqlite\") as typeof import(\"node:sqlite\");\n // immutable=1 prevents SQLite from creating a WAL shared-memory sidecar while\n // evaluating a dry-run. A present WAL is rejected below because immutable reads\n // cannot safely incorporate its uncheckpointed state.\n return new DatabaseSync(`${pathToFileURL(path).toString()}?immutable=1`, { readOnly: true });\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_migration_gates (\n scope_key TEXT PRIMARY KEY REFERENCES edge_scopes(scope_key),\n state TEXT NOT NULL CHECK(state IN ('active', 'draining', 'retired')),\n operation_id TEXT,\n lease_token TEXT,\n lease_expires_at TEXT,\n updated_at TEXT NOT NULL,\n CHECK(\n (state='active' AND operation_id IS NULL AND lease_token IS NULL AND lease_expires_at IS NULL)\n OR (state='draining' AND operation_id IS NOT NULL AND lease_token IS NOT NULL AND lease_expires_at IS NOT NULL)\n OR (state='retired' AND operation_id IS NOT NULL AND lease_token IS NULL AND lease_expires_at IS NULL)\n )\n);\nCREATE INDEX IF NOT EXISTS edge_migration_gates_state\n ON edge_migration_gates(state, lease_expires_at);\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 TRIGGER IF NOT EXISTS edge_outbox_migration_gate_insert\nBEFORE INSERT ON edge_outbox\nWHEN NOT EXISTS (\n SELECT 1 FROM edge_migration_gates\n WHERE scope_key=NEW.scope_key AND state='active'\n)\nBEGIN\n SELECT RAISE(ABORT, 'edge migration gate rejects outbox publication');\nEND;\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\n/** A side-effect-free inspection used by migration dry-runs and preflight gates. */\nexport interface EdgeReadOnlyInspection {\n exists: boolean;\n gate: EdgeMigrationGate;\n pending: number;\n due: number;\n scheduled: number;\n leased: number;\n blocked: number;\n cached: number;\n}\n\n/**\n * Inspect an edge without creating a database, a schema object, or a WAL sidecar.\n * An absent path has the same empty active state that initialization would create.\n */\nexport function inspectEdgeScopeReadOnly(path: string, scope: EdgeScope, now = new Date()): EdgeReadOnlyInspection {\n if (!existsSync(path)) {\n return { exists: false, gate: { scopeKey: edgeScopeKey(scope), state: \"active\", operationId: undefined, leaseExpiresAt: undefined, updatedAt: new Date(0).toISOString() }, pending: 0, due: 0, scheduled: 0, leased: 0, blocked: 0, cached: 0 };\n }\n verifyPrivatePathAccess(path, \"file\");\n const details = lstatSync(path);\n if (!details.isFile() || details.isSymbolicLink()) throw new EdgeConflictError(\"edge database is not a private regular file\");\n if (existsSync(`${path}-wal`) || existsSync(`${path}-shm`)) {\n throw new EdgeConflictError(\"read-only migration inspection refuses an edge with live WAL state\");\n }\n const db = openReadOnlyDatabase(path);\n try {\n const tables = db.prepare(\"SELECT name FROM sqlite_master WHERE type='table' AND name IN ('edge_scopes','edge_migration_gates','edge_outbox','edge_inbox') ORDER BY name\")\n .all() as Row[];\n if (tables.length === 0) {\n const userTables = db.prepare(\"SELECT count(*) AS count FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'\").get() as Row;\n if (Number(userTables.count) !== 0) throw new EdgeConflictError(\"edge database is not an Agent Bridge edge store\");\n return { exists: true, gate: { scopeKey: edgeScopeKey(scope), state: \"active\", operationId: undefined, leaseExpiresAt: undefined, updatedAt: new Date(0).toISOString() }, pending: 0, due: 0, scheduled: 0, leased: 0, blocked: 0, cached: 0 };\n }\n if (tables.length !== 4) throw new EdgeConflictError(\"edge database schema is incomplete\");\n const key = edgeScopeKey(scope);\n const scopeRow = db.prepare(\"SELECT 1 AS present FROM edge_scopes WHERE scope_key=?\").get(key) as Row | undefined;\n if (!scopeRow) {\n return { exists: true, gate: { scopeKey: key, state: \"active\", operationId: undefined, leaseExpiresAt: undefined, updatedAt: new Date(0).toISOString() }, pending: 0, due: 0, scheduled: 0, leased: 0, blocked: 0, cached: 0 };\n }\n const gateRow = db.prepare(\"SELECT state,operation_id,lease_expires_at,updated_at FROM edge_migration_gates WHERE scope_key=?\").get(key) as Row | undefined;\n if (!gateRow || ![\"active\", \"draining\", \"retired\"].includes(String(gateRow.state))) throw new EdgeConflictError(\"edge migration gate is missing or invalid\");\n const nowText = now.toISOString();\n const counts = 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 FROM edge_outbox WHERE scope_key=?`).get(nowText, nowText, nowText, nowText, nowText, key) as Row;\n const cached = db.prepare(\"SELECT count(*) AS count FROM edge_inbox WHERE scope_key=?\").get(key) as Row;\n return {\n exists: true,\n gate: { scopeKey: key, state: gateRow.state as EdgeMigrationGateState, operationId: gateRow.operation_id ? String(gateRow.operation_id) : undefined, leaseExpiresAt: gateRow.lease_expires_at ? String(gateRow.lease_expires_at) : undefined, updatedAt: gateRow.updated_at ? String(gateRow.updated_at) : new Date(0).toISOString() },\n pending: Number(counts.pending ?? 0), due: Number(counts.due ?? 0), scheduled: Number(counts.scheduled ?? 0), leased: Number(counts.leased ?? 0), blocked: Number(counts.blocked ?? 0), cached: Number(cached.count ?? 0),\n };\n } finally { db.close(); }\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 migrationState: EdgeMigrationGateState;\n migrationOperationId?: string;\n migrationLeaseExpiresAt?: string;\n}\n\nexport type EdgeMigrationGateState = \"active\" | \"draining\" | \"retired\";\n\nexport interface EdgeMigrationGate {\n scopeKey: string;\n state: EdgeMigrationGateState;\n operationId?: string;\n leaseExpiresAt?: string;\n updatedAt: string;\n}\n\nexport interface EdgeDrainLease {\n scopeKey: string;\n operationId: string;\n leaseToken: string;\n leaseExpiresAt: string;\n}\n\nexport class EdgeConflictError extends Error {\n readonly code = \"edge_idempotency_conflict\";\n}\n\nexport class EdgeMigrationDrainingError extends Error {\n readonly code = \"client_migration_draining\";\n constructor(readonly gate: EdgeMigrationGate) {\n super(\"edge scope is draining for a client migration\");\n }\n}\n\nexport class EdgeMigrationRetiredError extends Error {\n readonly code = \"client_migration_retired\";\n constructor(readonly gate: EdgeMigrationGate) {\n super(\"edge scope was retired by a client migration\");\n }\n}\n\nexport class EdgeMigrationLeaseError extends Error {\n readonly code = \"client_migration_lease_lost\";\n constructor() {\n super(\"client migration worker no longer holds the edge drain lease\");\n }\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\nfunction safeOperationId(value: string): string {\n if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)) {\n throw new Error(\"client migration operation ID is invalid\");\n }\n return value.toLowerCase();\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, \"defer\");\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(false);\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(includeSidecars = true): void {\n if (this.databasePath === \":memory:\") return;\n const paths = includeSidecars\n ? [this.databasePath, `${this.databasePath}-wal`, `${this.databasePath}-shm`]\n : [this.databasePath];\n for (const path of paths) {\n if (!existsSync(path)) continue;\n if (path === this.databasePath && this.preexistingFiles.has(path)) verifyPrivatePathAccess(path, \"file\");\n else if (path === this.databasePath) securePrivatePath(path, \"file\");\n else securePrivateSqliteSidecar(path);\n }\n }\n\n get scopeKey(): string {\n return this.key;\n }\n\n private gateFromRow(row: Row): EdgeMigrationGate {\n const state = String(row.state);\n if (state !== \"active\" && state !== \"draining\" && state !== \"retired\") {\n throw new EdgeConflictError(\"edge migration gate state is invalid\");\n }\n const operationId = row.operation_id === null || row.operation_id === undefined\n ? undefined\n : safeOperationId(String(row.operation_id));\n const leaseExpiresAt = row.lease_expires_at === null || row.lease_expires_at === undefined\n ? undefined\n : String(row.lease_expires_at);\n const updatedAt = String(row.updated_at ?? \"\");\n if (!updatedAt || !Number.isFinite(Date.parse(updatedAt))) {\n throw new EdgeConflictError(\"edge migration gate timestamp is invalid\");\n }\n const leaseToken = row.lease_token === null || row.lease_token === undefined\n ? undefined\n : String(row.lease_token);\n if ((state === \"active\" && (operationId || leaseExpiresAt || leaseToken))\n || (state === \"draining\" && (!operationId || !leaseExpiresAt || !leaseToken))\n || (state === \"retired\" && (!operationId || leaseExpiresAt || leaseToken))) {\n throw new EdgeConflictError(\"edge migration gate state is invalid\");\n }\n return { scopeKey: this.key, state, operationId, leaseExpiresAt, updatedAt };\n }\n\n private gateInTransaction(): EdgeMigrationGate {\n const row = this.db.prepare(`SELECT state,operation_id,lease_token,lease_expires_at,updated_at\n FROM edge_migration_gates WHERE scope_key=?`).get(this.key) as Row | undefined;\n if (!row) throw new EdgeConflictError(\"edge migration gate is missing\");\n return this.gateFromRow(row);\n }\n\n private assertScopeActiveInTransaction(): void {\n const gate = this.gateInTransaction();\n if (gate.state === \"draining\") throw new EdgeMigrationDrainingError(gate);\n if (gate.state === \"retired\") throw new EdgeMigrationRetiredError(gate);\n }\n\n private assertDrainLeaseInTransaction(lease: EdgeDrainLease, now: Date): void {\n const gate = this.gateInTransaction();\n if (gate.state !== \"draining\" || gate.operationId !== lease.operationId\n || gate.leaseExpiresAt !== lease.leaseExpiresAt || Date.parse(gate.leaseExpiresAt) <= now.getTime()) {\n throw new EdgeMigrationLeaseError();\n }\n const row = this.db.prepare(\"SELECT lease_token FROM edge_migration_gates WHERE scope_key=?\")\n .get(this.key) as Row;\n if (row.lease_token !== lease.leaseToken) throw new EdgeMigrationLeaseError();\n }\n\n private assertClaimAuthorityInTransaction(now: Date, lease?: EdgeDrainLease): void {\n if (lease) this.assertDrainLeaseInTransaction(lease, now);\n else this.assertScopeActiveInTransaction();\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 const initializationTimeoutMs = Math.max(this.busyTimeoutMs, SQLITE_INITIALIZATION_BUSY_TIMEOUT_MS);\n await retrySqliteBusy(() => this.db.exec(schema), initializationTimeoutMs);\n await retrySqliteBusy(() => this.db.exec(\"BEGIN IMMEDIATE\"), initializationTimeoutMs);\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 this.db.prepare(`INSERT INTO edge_migration_gates\n (scope_key,state,operation_id,lease_token,lease_expires_at,updated_at)\n SELECT scope_key,'active',NULL,NULL,NULL,? FROM edge_scopes\n WHERE scope_key=? ON CONFLICT(scope_key) DO NOTHING`)\n .run(new Date().toISOString(), this.key);\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 migrationGate(): Promise<EdgeMigrationGate> {\n await this.ready();\n return this.gateInTransaction();\n }\n\n /** Refuse new normal-client writes before any remote attempt begins. */\n async assertScopeActive(): Promise<void> {\n await this.ready();\n this.db.exec(\"BEGIN IMMEDIATE\");\n try {\n this.assertScopeActiveInTransaction();\n this.db.exec(\"COMMIT\");\n } catch (error) {\n this.db.exec(\"ROLLBACK\");\n throw error;\n }\n }\n\n /** Refuse remote publication unless this worker still owns the durable drain lease. */\n async assertDrainLease(lease: EdgeDrainLease, now = new Date()): Promise<void> {\n await this.ready();\n if (lease.scopeKey !== this.key) throw new EdgeMigrationLeaseError();\n this.db.exec(\"BEGIN IMMEDIATE\");\n try {\n this.assertDrainLeaseInTransaction(lease, now);\n this.db.exec(\"COMMIT\");\n } catch (error) {\n this.db.exec(\"ROLLBACK\");\n throw error;\n }\n }\n\n private async claimDrainLease(\n operationId: string, now: Date, leaseMs: number, mode: \"begin\" | \"resume\",\n ): Promise<EdgeDrainLease> {\n await this.ready();\n const normalizedOperationId = safeOperationId(operationId);\n const duration = Math.max(1, Math.trunc(leaseMs));\n this.db.exec(\"BEGIN IMMEDIATE\");\n try {\n const gate = this.gateInTransaction();\n if (gate.state === \"retired\") throw new EdgeMigrationRetiredError(gate);\n if (mode === \"begin\" && gate.state !== \"active\") throw new EdgeMigrationDrainingError(gate);\n if (mode === \"resume\") {\n if (gate.state !== \"draining\" || gate.operationId !== normalizedOperationId\n || !gate.leaseExpiresAt || Date.parse(gate.leaseExpiresAt) > now.getTime()) {\n throw new EdgeMigrationDrainingError(gate);\n }\n }\n const leaseToken = randomUUID();\n const leaseExpiresAt = new Date(now.getTime() + duration).toISOString();\n const updated = this.db.prepare(`UPDATE edge_migration_gates\n SET state='draining',operation_id=?,lease_token=?,lease_expires_at=?,updated_at=?\n WHERE scope_key=?`).run(\n normalizedOperationId, leaseToken, leaseExpiresAt, now.toISOString(), this.key,\n );\n if (updated.changes !== 1) throw new EdgeConflictError(\"edge migration gate could not be acquired\");\n this.db.exec(\"COMMIT\");\n return { scopeKey: this.key, operationId: normalizedOperationId, leaseToken, leaseExpiresAt };\n } catch (error) {\n this.db.exec(\"ROLLBACK\");\n throw error;\n }\n }\n\n /** Start a new durable drain only from an active edge scope. */\n async beginDrain(operationId: string, now = new Date(), leaseMs = 30_000): Promise<EdgeDrainLease> {\n return this.claimDrainLease(operationId, now, leaseMs, \"begin\");\n }\n\n /** Resume the same persisted drain only after the prior worker lease expires. */\n async resumeDrain(operationId: string, now = new Date(), leaseMs = 30_000): Promise<EdgeDrainLease> {\n return this.claimDrainLease(operationId, now, leaseMs, \"resume\");\n }\n\n /** Backward-compatible dispatcher for callers that have already inspected the gate. */\n async acquireDrainLease(operationId: string, now = new Date(), leaseMs = 30_000): Promise<EdgeDrainLease> {\n const gate = await this.migrationGate();\n if (gate.state === \"active\") return this.beginDrain(operationId, now, leaseMs);\n return this.resumeDrain(operationId, now, leaseMs);\n }\n\n /** Verify the held lease and require an exact zero-work outbox before a cutover continues. */\n async assertDrainComplete(lease: EdgeDrainLease, now = new Date()): Promise<void> {\n await this.ready();\n if (lease.scopeKey !== this.key) throw new EdgeMigrationLeaseError();\n this.db.exec(\"BEGIN IMMEDIATE\");\n try {\n this.assertDrainLeaseInTransaction(lease, now);\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 FROM edge_outbox WHERE scope_key=?`).get(\n now.toISOString(), now.toISOString(), now.toISOString(), now.toISOString(), now.toISOString(), this.key,\n ) as Row;\n if (Number(counts.pending ?? 0) !== 0 || Number(counts.due ?? 0) !== 0\n || Number(counts.scheduled ?? 0) !== 0 || Number(counts.leased ?? 0) !== 0\n || Number(counts.blocked ?? 0) !== 0) {\n throw new EdgeConflictError(\"edge scope cannot complete a drain with retained outbox work\");\n }\n this.db.exec(\"COMMIT\");\n } catch (error) {\n this.db.exec(\"ROLLBACK\");\n throw error;\n }\n }\n\n async renewDrainLease(lease: EdgeDrainLease, now = new Date(), leaseMs = 30_000): Promise<EdgeDrainLease> {\n await this.ready();\n if (lease.scopeKey !== this.key) throw new EdgeMigrationLeaseError();\n const duration = Math.max(1, Math.trunc(leaseMs));\n this.db.exec(\"BEGIN IMMEDIATE\");\n try {\n this.assertDrainLeaseInTransaction(lease, now);\n const leaseExpiresAt = new Date(now.getTime() + duration).toISOString();\n const updated = this.db.prepare(`UPDATE edge_migration_gates\n SET lease_expires_at=?,updated_at=? WHERE scope_key=? AND state='draining'\n AND operation_id=? AND lease_token=? AND lease_expires_at=?`).run(\n leaseExpiresAt, now.toISOString(), this.key, lease.operationId, lease.leaseToken, lease.leaseExpiresAt,\n );\n if (updated.changes !== 1) throw new EdgeMigrationLeaseError();\n this.db.exec(\"COMMIT\");\n return { ...lease, leaseExpiresAt };\n } catch (error) {\n this.db.exec(\"ROLLBACK\");\n throw error;\n }\n }\n\n async retireScope(lease: EdgeDrainLease, now = new Date()): Promise<void> {\n await this.ready();\n if (lease.scopeKey !== this.key) throw new EdgeMigrationLeaseError();\n this.db.exec(\"BEGIN IMMEDIATE\");\n try {\n this.assertDrainLeaseInTransaction(lease, now);\n const stats = this.db.prepare(`SELECT count(*) AS count FROM edge_outbox\n WHERE scope_key=?`).get(this.key) as Row;\n if (Number(stats.count) !== 0) throw new EdgeConflictError(\"edge scope cannot retire with retained outbox work\");\n const updated = this.db.prepare(`UPDATE edge_migration_gates\n SET state='retired',lease_token=NULL,lease_expires_at=NULL,updated_at=?\n WHERE scope_key=? AND state='draining' AND operation_id=? AND lease_token=?`).run(\n now.toISOString(), this.key, lease.operationId, lease.leaseToken,\n );\n if (updated.changes !== 1) throw new EdgeMigrationLeaseError();\n this.db.exec(\"COMMIT\");\n } catch (error) {\n this.db.exec(\"ROLLBACK\");\n throw error;\n }\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 this.assertScopeActiveInTransaction();\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, migrationLease?: EdgeDrainLease): Promise<EdgeOutboxRecord | undefined> {\n await this.ready();\n const nowText = now.toISOString();\n this.db.exec(\"BEGIN IMMEDIATE\");\n try {\n this.assertClaimAuthorityInTransaction(now, migrationLease);\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 migrationGate = this.gateInTransaction();\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 migrationState: migrationGate.state,\n migrationOperationId: migrationGate.operationId,\n migrationLeaseExpiresAt: migrationGate.leaseExpiresAt,\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 EdgeMigrationDrainingError,\n EdgeMigrationLeaseError,\n EdgeMigrationRetiredError,\n edgeMessageFingerprint,\n type EdgeDrainLease,\n type EdgeMigrationGateState,\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 migrationState?: EdgeMigrationGateState;\n migrationOperationId?: string;\n migrationLeaseExpiresAt?: string;\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\" | \"paused\" | \"stopped\" | \"failed\";\n syncLoopError?: string;\n remoteError?: string;\n migrationState: EdgeMigrationGateState;\n migrationOperationId?: string;\n migrationLeaseExpiresAt?: 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 edgeDrainLease?: EdgeDrainLease;\n /** A maintenance caller may retain the edge while closing the sync wrapper. */\n closeEdge?: boolean;\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: \"paused\"; error: EdgeMigrationDrainingError | EdgeMigrationRetiredError | EdgeMigrationLeaseError }\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\", \"client_migration_draining\", \"client_migration_retired\", \"client_migration_lease_lost\"].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 edgeDrainLease?: EdgeDrainLease;\n private readonly closeEdge: boolean;\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.edgeDrainLease = options.edgeDrainLease;\n this.closeEdge = options.closeEdge ?? true;\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 /** Replace a renewed maintenance lease without creating another edge wrapper. */\n setDrainLease(lease: EdgeDrainLease | undefined): void {\n this.edgeDrainLease = lease;\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.migrationState !== \"active\" && !this.edgeDrainLease) {\n this.loopState = \"paused\";\n await this.wait(this.idleDelayMs);\n continue;\n }\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 if (this.edgeDrainLease) await this.edge.assertDrainLease(this.edgeDrainLease, this.now());\n else await this.edge.assertScopeActive();\n } catch (error) {\n if (error instanceof EdgeMigrationDrainingError\n || error instanceof EdgeMigrationRetiredError\n || error instanceof EdgeMigrationLeaseError) return { state: \"paused\", error };\n throw error;\n }\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 let record;\n try {\n record = await this.edge.claimNext(this.now(), this.leaseMs, this.edgeDrainLease);\n } catch (error) {\n if (error instanceof EdgeMigrationDrainingError\n || error instanceof EdgeMigrationRetiredError\n || error instanceof EdgeMigrationLeaseError) return { state: \"paused\", error };\n throw error;\n }\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 // A drain lease authorizes only claimNext for work that existed before the\n // gate closed. It never authorizes new publication or an early remote call.\n await this.edge.assertScopeActive();\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 if (result.state === \"paused\") {\n lastError = codeOf(result.error);\n break;\n }\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) && !lastError?.startsWith(\"client_migration_\")) {\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 migrationState: stats.migrationState,\n migrationOperationId: stats.migrationOperationId,\n migrationLeaseExpiresAt: stats.migrationLeaseExpiresAt,\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 migrationState: edge.migrationState,\n migrationOperationId: edge.migrationOperationId,\n migrationLeaseExpiresAt: edge.migrationLeaseExpiresAt,\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 if (this.closeEdge) {\n try { await this.edge.close(); } catch (error) { failures.push(error); }\n }\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"]}
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  securePrivatePath,
4
4
  verifyPrivatePathAccess
5
- } from "./chunk-NCO7RLBM.js";
5
+ } from "./chunk-GTK4KOED.js";
6
6
  import {
7
7
  validateMessageDraft,
8
8
  validatePrincipal
@@ -1255,4 +1255,4 @@ export {
1255
1255
  SQLitePortableArchiveStore,
1256
1256
  PostgresPortableArchiveStore
1257
1257
  };
1258
- //# sourceMappingURL=chunk-A6W4QALF.js.map
1258
+ //# sourceMappingURL=chunk-TC6A7GMF.js.map
@@ -305,10 +305,11 @@ var PostgresBridgeStore = class {
305
305
  last_actor='agent-bridge', last_action='message_expired'
306
306
  FROM agent_bridge.messages message
307
307
  WHERE delivery.workspace=$1 AND delivery.recipient=$2
308
+ AND ($3::uuid IS NULL OR delivery.message_id=$3)
308
309
  AND delivery.state IN ('pending','retrying','claimed')
309
310
  AND message.workspace=delivery.workspace AND message.id=delivery.message_id
310
311
  AND message.expires_at IS NOT NULL AND message.expires_at<=now()`,
311
- [principal.workspace, principal.agent]
312
+ [principal.workspace, principal.agent, options.messageId ?? null]
312
313
  );
313
314
  await db.query(
314
315
  `UPDATE agent_bridge.deliveries delivery
@@ -317,11 +318,12 @@ var PostgresBridgeStore = class {
317
318
  last_actor='agent-bridge', last_action='attempts_exhausted'
318
319
  FROM agent_bridge.messages message
319
320
  WHERE delivery.workspace=$1 AND delivery.recipient=$2
321
+ AND ($3::uuid IS NULL OR delivery.message_id=$3)
320
322
  AND message.workspace=delivery.workspace AND message.id=delivery.message_id
321
323
  AND delivery.cycle_attempt>=message.delivery_max_attempts
322
324
  AND (delivery.state IN ('pending','retrying')
323
325
  OR (delivery.state='claimed' AND delivery.lease_expires_at<=now()))`,
324
- [principal.workspace, principal.agent]
326
+ [principal.workspace, principal.agent, options.messageId ?? null]
325
327
  );
326
328
  await db.query(
327
329
  `UPDATE agent_bridge.deliveries delivery
@@ -330,17 +332,18 @@ var PostgresBridgeStore = class {
330
332
  last_error='lease expired', last_actor='agent-bridge', last_action='lease_expired'
331
333
  FROM agent_bridge.messages message
332
334
  WHERE delivery.workspace=$1 AND delivery.recipient=$2
335
+ AND ($3::uuid IS NULL OR delivery.message_id=$3)
333
336
  AND message.workspace=delivery.workspace AND message.id=delivery.message_id
334
337
  AND delivery.state='claimed' AND delivery.lease_expires_at<=now()
335
338
  AND delivery.cycle_attempt<message.delivery_max_attempts`,
336
- [principal.workspace, principal.agent]
339
+ [principal.workspace, principal.agent, options.messageId ?? null]
337
340
  );
338
341
  const candidate = await db.query(
339
342
  `SELECT delivery.id
340
343
  FROM agent_bridge.deliveries delivery
341
344
  JOIN agent_bridge.messages message
342
345
  ON message.workspace=delivery.workspace AND message.id=delivery.message_id
343
- WHERE delivery.workspace=$1 AND delivery.recipient=$2
346
+ WHERE delivery.workspace=$1 AND delivery.recipient=$2 AND ($3::uuid IS NULL OR delivery.message_id=$3)
344
347
  AND delivery.state IN ('pending','retrying')
345
348
  AND delivery.available_at<=now()
346
349
  AND delivery.cycle_attempt<message.delivery_max_attempts
@@ -348,7 +351,7 @@ var PostgresBridgeStore = class {
348
351
  ORDER BY delivery.priority_rank, delivery.available_at, delivery.created_at, delivery.id
349
352
  FOR UPDATE OF delivery SKIP LOCKED
350
353
  LIMIT 1`,
351
- [principal.workspace, principal.agent]
354
+ [principal.workspace, principal.agent, options.messageId ?? null]
352
355
  );
353
356
  if (!candidate.rows[0]) return null;
354
357
  const token = randomUUID();
@@ -615,4 +618,4 @@ var PostgresBridgeStore = class {
615
618
  export {
616
619
  PostgresBridgeStore
617
620
  };
618
- //# sourceMappingURL=chunk-2DFNOLMO.js.map
621
+ //# sourceMappingURL=chunk-XDNT6ZNZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/postgres-bridge-store.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n DeliveryStateConflictError,\n decodeCursor,\n decodeScopedCursor,\n encodeCursor,\n encodeScopedCursor,\n cursorScope,\n scopedCursorScope,\n validateDeliveryCursorPosition,\n validateEventCursorPosition,\n type AgentPresence,\n type BridgeDelivery,\n type BridgeDeliveryEvent,\n type BridgeMessage,\n type BridgePrincipal,\n type DeliveryPolicy,\n} from \"./bridge-domain.js\";\nimport type {\n BridgeStore,\n BridgeDiagnostics,\n ClaimOptions,\n InsertMessageResult,\n MessagePage,\n MessageQuery,\n DeliveryQuery,\n} from \"./bridge-store.js\";\nimport { assertIdempotentReplay } from \"./idempotency.js\";\n\nexport interface PgQueryable {\n query<T extends Record<string, unknown> = Record<string, unknown>>(\n sql: string,\n values?: unknown[],\n ): Promise<{ rows: T[]; rowCount: number | null }>;\n connect?(): Promise<PgTransactionClient>;\n release?(): void;\n /** True when the queryable is already owned by an explicit request transaction. */\n inTransaction?: boolean;\n}\nexport interface PgTransactionClient {\n query<T extends Record<string, unknown> = Record<string, unknown>>(\n sql: string,\n values?: unknown[],\n ): Promise<{ rows: T[]; rowCount: number | null }>;\n release(error?: Error | boolean): void;\n}\n\ntype Row = Record<string, any>;\n\nfunction json(value: unknown): string | null {\n return value === undefined ? null : JSON.stringify(value);\n}\n\nfunction parse(value: unknown): any {\n return typeof value === \"string\" ? JSON.parse(value) : value;\n}\n\nfunction asTimestamp(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined;\n if (value instanceof Date) return value.toISOString();\n return String(value);\n}\n\nfunction asMessage(row: Row): BridgeMessage {\n const deliveryPolicy: DeliveryPolicy = row.delivery_mode === \"mailbox\"\n ? { mode: \"mailbox\" }\n : {\n mode: \"leased\",\n maxAttempts: Number(row.delivery_max_attempts),\n retryBaseDelayMs: Number(row.delivery_retry_base_delay_ms),\n retryMaxDelayMs: Number(row.delivery_retry_max_delay_ms),\n retryJitterRatio: Number(row.delivery_retry_jitter_ratio),\n ...(row.delivery_not_before ? { notBefore: asTimestamp(row.delivery_not_before) } : {}),\n };\n return {\n id: String(row.id),\n workspace: String(row.workspace),\n project: row.project ?? undefined,\n source: String(row.source),\n sequence: String(row.sequence),\n type: String(row.type),\n content: String(row.content),\n contentType: String(row.content_type),\n data: parse(row.data),\n targets: parse(row.targets) ?? [],\n threadId: row.thread_id ?? undefined,\n replyToId: row.reply_to_id ?? undefined,\n correlationId: row.correlation_id ?? undefined,\n causationId: row.causation_id ?? undefined,\n priority: row.priority,\n expiresAt: asTimestamp(row.expires_at),\n idempotencyKey: row.idempotency_key ?? undefined,\n atribReceiptId: row.atrib_receipt_id ?? undefined,\n informedBy: parse(row.informed_by),\n metadata: parse(row.metadata),\n deliveryPolicy,\n createdAt: asTimestamp(row.created_at) ?? \"\",\n };\n}\n\nfunction asDelivery(row: Row): BridgeDelivery {\n return {\n id: String(row.id),\n messageId: String(row.message_id),\n workspace: String(row.workspace),\n recipient: String(row.recipient),\n state: row.state,\n attempt: Number(row.attempt),\n cycleAttempt: Number(row.cycle_attempt ?? row.attempt),\n requeueCount: Number(row.requeue_count ?? 0),\n createdAt: asTimestamp(row.created_at) ?? \"\",\n priorityRank: Number(row.priority_rank),\n availableAt: asTimestamp(row.available_at) ?? \"\",\n leaseToken: row.lease_token ?? undefined,\n leaseOwner: row.lease_owner ?? undefined,\n leaseExpiresAt: asTimestamp(row.lease_expires_at),\n lastError: row.last_error ?? undefined,\n lastActor: row.last_actor ?? undefined,\n lastAction: row.last_action,\n };\n}\n\nfunction asPresence(row: Row): AgentPresence {\n return {\n workspace: String(row.workspace), agent: String(row.agent), instance: String(row.instance),\n runtimeType: row.runtime_type ?? undefined, capabilities: parse(row.capabilities) ?? [],\n leaseExpiresAt: asTimestamp(row.lease_expires_at) ?? \"\", lastSeenAt: asTimestamp(row.last_seen_at) ?? \"\",\n };\n}\n\nfunction asDeliveryEvent(row: Row): BridgeDeliveryEvent {\n return {\n sequence: String(row.sequence), deliveryId: String(row.delivery_id),\n messageId: String(row.message_id), workspace: String(row.workspace),\n recipient: String(row.recipient),\n fromState: row.from_state == null ? undefined : row.from_state as BridgeDeliveryEvent[\"fromState\"],\n toState: row.to_state as BridgeDeliveryEvent[\"toState\"], attempt: Number(row.attempt),\n cycleAttempt: Number(row.cycle_attempt), requeueCount: Number(row.requeue_count),\n leaseOwner: row.lease_owner ?? undefined, error: row.error ?? undefined,\n actor: String(row.actor), action: row.action,\n createdAt: asTimestamp(row.created_at) ?? \"\",\n };\n}\n\nasync function transaction<T>(db: PgQueryable, work: (client: PgQueryable) => Promise<T>): Promise<T> {\n if (db.inTransaction) return work(db);\n const borrowed = !db.release && Boolean(db.connect);\n const client = borrowed ? await db.connect!() : db;\n try {\n await client.query(\"BEGIN\");\n const result = await work(client);\n await client.query(\"COMMIT\");\n return result;\n } catch (error) {\n await client.query(\"ROLLBACK\").catch(() => undefined);\n throw error;\n } finally {\n if (borrowed && \"release\" in client && typeof client.release === \"function\") client.release();\n }\n}\n\nexport class PostgresBridgeStore implements BridgeStore {\n constructor(private readonly db: PgQueryable) {}\n\n async initialize(): Promise<void> {\n // Deployments apply ordered migrations before starting the service.\n }\n\n async insertMessage(\n input: Omit<BridgeMessage, \"sequence\" | \"createdAt\">,\n ): Promise<InsertMessageResult> {\n const values = [\n input.id,\n input.workspace,\n input.project ?? null,\n input.source,\n input.type,\n input.content,\n input.contentType,\n json(input.data),\n json(input.targets),\n input.threadId ?? null,\n input.replyToId ?? null,\n input.correlationId ?? null,\n input.causationId ?? null,\n input.priority,\n input.expiresAt ?? null,\n input.idempotencyKey ?? null,\n input.atribReceiptId ?? null,\n json(input.informedBy),\n json(input.metadata),\n input.deliveryPolicy.mode,\n input.deliveryPolicy.mode === \"leased\" ? input.deliveryPolicy.maxAttempts : null,\n input.deliveryPolicy.mode === \"leased\" ? input.deliveryPolicy.retryBaseDelayMs : null,\n input.deliveryPolicy.mode === \"leased\" ? input.deliveryPolicy.retryMaxDelayMs : null,\n input.deliveryPolicy.mode === \"leased\" ? input.deliveryPolicy.retryJitterRatio : null,\n input.deliveryPolicy.mode === \"leased\" ? input.deliveryPolicy.notBefore ?? null : null,\n ];\n\n const result = await this.db.query<Row>(\n `WITH inserted AS (\n INSERT INTO agent_bridge.messages (\n id, workspace, project, source, type, content, content_type, data, targets,\n thread_id, reply_to_id, correlation_id, causation_id, priority,\n expires_at, idempotency_key, atrib_receipt_id, informed_by, metadata,\n delivery_mode, delivery_max_attempts, delivery_retry_base_delay_ms,\n delivery_retry_max_delay_ms, delivery_retry_jitter_ratio, delivery_not_before\n )\n VALUES (\n $1, $2, $3, $4, $5, $6, $7, $8::jsonb, $9::jsonb,\n $10, $11, $12, $13, $14, $15, $16, $17, $18::jsonb, $19::jsonb,\n $20, $21, $22, $23, $24, $25\n )\n ON CONFLICT (workspace, source, idempotency_key)\n WHERE idempotency_key IS NOT NULL\n DO NOTHING\n RETURNING *, true AS created\n ), selected AS (\n SELECT * FROM inserted\n UNION ALL\n SELECT existing.*, false AS created\n FROM agent_bridge.messages existing\n WHERE $16::text IS NOT NULL\n AND existing.workspace = $2\n AND existing.source = $4\n AND existing.idempotency_key = $16\n AND NOT EXISTS (SELECT 1 FROM inserted)\n LIMIT 1\n ), delivery_rows AS (\n INSERT INTO agent_bridge.deliveries (\n id, message_id, workspace, publisher, recipient, state, available_at,\n created_at, priority_rank, last_actor, last_action\n )\n SELECT gen_random_uuid(), inserted.id, inserted.workspace, inserted.source, target, 'pending',\n greatest(now(), coalesce(inserted.delivery_not_before, now())),\n inserted.created_at,\n case inserted.priority when 'urgent' then 0 when 'high' then 1 else 2 end,\n inserted.source, 'created'\n FROM inserted\n CROSS JOIN LATERAL jsonb_array_elements_text(inserted.targets) AS target\n WHERE inserted.delivery_mode = 'leased'\n ON CONFLICT (message_id, recipient) DO NOTHING\n )\n SELECT * FROM selected`,\n values,\n );\n\n let row = result.rows[0];\n if (!row && input.idempotencyKey) {\n const existing = await this.db.query<Row>(\n `SELECT *, false AS created\n FROM agent_bridge.messages\n WHERE workspace=$1 AND source=$2 AND idempotency_key=$3`,\n [input.workspace, input.source, input.idempotencyKey],\n );\n row = existing.rows[0];\n }\n if (!row) throw new Error(\"message insert did not return a row\");\n const message = asMessage(row);\n if (row.created !== true) assertIdempotentReplay(message, input);\n return { message, created: row.created === true };\n }\n\n async listMessages(\n principal: BridgePrincipal,\n query: MessageQuery = {},\n ): Promise<MessagePage> {\n const scope = cursorScope(principal, query);\n const cursor = decodeCursor(query.cursor, scope) ?? \"0\";\n const limit = Math.min(Math.max(Math.trunc(query.limit ?? 50), 1), 200);\n const boundary = query.latest ? undefined : await this.db.query<{ sequence: string | null }>(\n \"SELECT max(sequence)::text AS sequence FROM agent_bridge.messages WHERE workspace=$1\",\n [principal.workspace],\n );\n const highWater = boundary?.rows[0]?.sequence;\n const values: unknown[] = query.latest\n ? [principal.workspace, principal.agent]\n : [principal.workspace, cursor, principal.agent];\n const mailbox = query.mailbox ?? \"inbox\";\n const agentParam = query.latest ? 2 : 3;\n const visibility = mailbox === \"sent\" ? `source=$${agentParam}`\n : mailbox === \"all\" ? `(source=$${agentParam} OR targets='[]'::jsonb OR targets ? $${agentParam})`\n : `(targets='[]'::jsonb OR targets ? $${agentParam})`;\n let sql = `SELECT * FROM agent_bridge.messages WHERE workspace=$1 ${query.latest ? \"\" : \"AND sequence>$2::bigint \"}AND ${visibility}`;\n\n if (highWater) {\n values.push(highWater);\n sql += ` AND sequence <= $${values.length}::bigint`;\n }\n\n if (!query.includeExpired) {\n sql += \" AND (expires_at IS NULL OR expires_at > now())\";\n }\n if (query.types?.length) {\n values.push(query.types);\n sql += ` AND type = ANY($${values.length})`;\n }\n if (query.source) {\n values.push(query.source);\n sql += ` AND source = $${values.length}`;\n }\n if (query.project) {\n values.push(query.project);\n sql += ` AND project = $${values.length}`;\n }\n if (query.since) {\n values.push(query.since);\n sql += ` AND created_at >= $${values.length}::timestamptz`;\n }\n if (query.receiptState && query.receiptState !== \"any\") {\n sql += ` AND ${query.receiptState === \"unread\" ? \"NOT \" : \"\"}EXISTS (\n SELECT 1 FROM agent_bridge.receipts receipt\n WHERE receipt.workspace=agent_bridge.messages.workspace\n AND receipt.message_id=agent_bridge.messages.id\n AND receipt.principal=$${agentParam}\n )`;\n }\n if (query.threadId) {\n values.push(query.threadId);\n sql += ` AND thread_id = $${values.length}`;\n }\n\n values.push(limit);\n const result = await this.db.query<Row>(\n `${sql} ORDER BY sequence ${query.latest ? \"DESC\" : \"ASC\"} LIMIT $${values.length}`,\n values,\n );\n const messages = result.rows.map(asMessage);\n const last = messages[messages.length - 1];\n if (query.latest) return { messages, cursor: messages[0] ? encodeCursor(messages[0].sequence, scope) : query.cursor };\n if (messages.length === limit) return { messages, cursor: encodeCursor(last!.sequence, scope) };\n return { messages, cursor: highWater ? encodeCursor(highWater, scope) : query.cursor };\n }\n\n async recordReceipt(\n principal: BridgePrincipal,\n ids: string[],\n readAt = new Date(),\n ): Promise<number> {\n const result = await this.db.query(\n `INSERT INTO agent_bridge.receipts (workspace, message_id, principal, read_at)\n SELECT message.workspace, message.id, $3, $4\n FROM agent_bridge.messages message\n WHERE message.workspace = $1 AND message.id = ANY($2::uuid[])\n AND (message.targets='[]'::jsonb OR message.targets ? $3)\n ON CONFLICT DO NOTHING`,\n [principal.workspace, ids, principal.agent, readAt],\n );\n return result.rowCount ?? 0;\n }\n\n async claimDelivery(\n principal: BridgePrincipal,\n options: ClaimOptions,\n ): Promise<BridgeDelivery | null> {\n return transaction(this.db, async (db) => {\n await db.query(\n `UPDATE agent_bridge.deliveries delivery\n SET state='dead', last_error='message expired', lease_token=NULL,\n lease_owner=NULL, lease_expires_at=NULL,\n last_actor='agent-bridge', last_action='message_expired'\n FROM agent_bridge.messages message\n WHERE delivery.workspace=$1 AND delivery.recipient=$2\n AND ($3::uuid IS NULL OR delivery.message_id=$3)\n AND delivery.state IN ('pending','retrying','claimed')\n AND message.workspace=delivery.workspace AND message.id=delivery.message_id\n AND message.expires_at IS NOT NULL AND message.expires_at<=now()`,\n [principal.workspace, principal.agent, options.messageId ?? null],\n );\n await db.query(\n `UPDATE agent_bridge.deliveries delivery\n SET state='dead', last_error='maximum attempts reached', lease_token=NULL,\n lease_owner=NULL, lease_expires_at=NULL,\n last_actor='agent-bridge', last_action='attempts_exhausted'\n FROM agent_bridge.messages message\n WHERE delivery.workspace=$1 AND delivery.recipient=$2\n AND ($3::uuid IS NULL OR delivery.message_id=$3)\n AND message.workspace=delivery.workspace AND message.id=delivery.message_id\n AND delivery.cycle_attempt>=message.delivery_max_attempts\n AND (delivery.state IN ('pending','retrying')\n OR (delivery.state='claimed' AND delivery.lease_expires_at<=now()))`,\n [principal.workspace, principal.agent, options.messageId ?? null],\n );\n await db.query(\n `UPDATE agent_bridge.deliveries delivery\n SET state='retrying', available_at=now(), lease_token=NULL,\n lease_owner=NULL, lease_expires_at=NULL,\n last_error='lease expired', last_actor='agent-bridge', last_action='lease_expired'\n FROM agent_bridge.messages message\n WHERE delivery.workspace=$1 AND delivery.recipient=$2\n AND ($3::uuid IS NULL OR delivery.message_id=$3)\n AND message.workspace=delivery.workspace AND message.id=delivery.message_id\n AND delivery.state='claimed' AND delivery.lease_expires_at<=now()\n AND delivery.cycle_attempt<message.delivery_max_attempts`,\n [principal.workspace, principal.agent, options.messageId ?? null],\n );\n const candidate = await db.query<Row>(\n `SELECT delivery.id\n FROM agent_bridge.deliveries delivery\n JOIN agent_bridge.messages message\n ON message.workspace=delivery.workspace AND message.id=delivery.message_id\n WHERE delivery.workspace=$1 AND delivery.recipient=$2 AND ($3::uuid IS NULL OR delivery.message_id=$3)\n AND delivery.state IN ('pending','retrying')\n AND delivery.available_at<=now()\n AND delivery.cycle_attempt<message.delivery_max_attempts\n AND (message.expires_at IS NULL OR message.expires_at>now())\n ORDER BY delivery.priority_rank, delivery.available_at, delivery.created_at, delivery.id\n FOR UPDATE OF delivery SKIP LOCKED\n LIMIT 1`,\n [principal.workspace, principal.agent, options.messageId ?? null],\n );\n if (!candidate.rows[0]) return null;\n const token = randomUUID();\n const owner = principal.instance ?? principal.agent;\n const claimed = await db.query<Row>(\n `UPDATE agent_bridge.deliveries\n SET state='claimed', attempt=attempt+1, cycle_attempt=cycle_attempt+1,\n lease_token=$1, lease_owner=$2,\n lease_expires_at=now()+($3*interval '1 millisecond'),\n last_error=NULL, last_actor=$4, last_action='claim'\n WHERE id=$5\n RETURNING *`,\n [token, owner, options.leaseMs, principal.agent, candidate.rows[0].id],\n );\n return asDelivery(claimed.rows[0]!);\n });\n }\n\n async renewDelivery(\n principal: BridgePrincipal,\n id: string,\n token: string,\n leaseMs: number,\n ): Promise<BridgeDelivery | null> {\n const result = await this.db.query<Row>(\n `UPDATE agent_bridge.deliveries\n SET lease_expires_at=now() + ($1 * interval '1 millisecond')\n WHERE workspace=$2 AND recipient=$3 AND lease_owner=$4 AND id=$5 AND lease_token=$6\n AND state='claimed' AND lease_expires_at>now()\n RETURNING *`,\n [leaseMs, principal.workspace, principal.agent, principal.instance ?? principal.agent, id, token],\n );\n return result.rows[0] ? asDelivery(result.rows[0]) : null;\n }\n\n async settleDelivery(\n principal: BridgePrincipal,\n id: string,\n token: string,\n state: \"acked\" | \"retrying\" | \"dead\",\n error?: string,\n _retryPolicy?: import(\"./bridge-domain.js\").RetryPolicy,\n ): Promise<BridgeDelivery | null> {\n const result = await this.db.query<Row>(\n `UPDATE agent_bridge.deliveries delivery\n SET state=CASE\n WHEN $1='retrying' AND cycle_attempt>=message.delivery_max_attempts THEN 'dead'\n ELSE $1\n END,\n available_at=CASE\n WHEN $1='retrying' AND cycle_attempt<message.delivery_max_attempts THEN\n now() + (\n LEAST(message.delivery_retry_max_delay_ms::double precision,\n message.delivery_retry_base_delay_ms::double precision * power(2, GREATEST(cycle_attempt - 1, 0)))\n * (1 + ((random() * 2) - 1) * message.delivery_retry_jitter_ratio)\n * interval '1 millisecond'\n )\n ELSE available_at\n END,\n last_error=$2, lease_token=NULL, lease_owner=NULL, lease_expires_at=NULL,\n last_actor=$4,\n last_action=CASE\n WHEN $1='acked' THEN 'ack'\n WHEN $1='dead' THEN 'nack_dead'\n WHEN cycle_attempt>=message.delivery_max_attempts THEN 'attempts_exhausted'\n ELSE 'nack_retry'\n END\n FROM agent_bridge.messages message\n WHERE delivery.workspace=$3 AND delivery.recipient=$4 AND delivery.lease_owner=$5\n AND message.workspace=delivery.workspace AND message.id=delivery.message_id\n AND delivery.id=$6 AND delivery.lease_token=$7 AND delivery.state='claimed' AND delivery.lease_expires_at>now()\n RETURNING delivery.*`,\n [\n state,\n error?.slice(0, 1024) ?? null,\n principal.workspace,\n principal.agent,\n principal.instance ?? principal.agent,\n id,\n token,\n ],\n );\n return result.rows[0] ? asDelivery(result.rows[0]) : null;\n }\n\n async listDeliveries(principal: BridgePrincipal, query: DeliveryQuery = {}) {\n const filters = {\n role: query.role ?? \"all\",\n states: [...(query.states ?? [])].sort(),\n messageId: query.messageId ?? null,\n recipient: query.recipient ?? null,\n };\n const scope = scopedCursorScope(\"deliveries\", principal, filters);\n const boundary = validateDeliveryCursorPosition(decodeScopedCursor(query.cursor, scope));\n const createdAt = boundary?.createdAt;\n const id = boundary?.id;\n const limit = query.limit ?? 50;\n const values: unknown[] = [principal.workspace, principal.agent];\n const clauses = [\"delivery.workspace=$1\"];\n const role = query.role ?? \"all\";\n clauses.push(role === \"recipient\" ? \"delivery.recipient=$2\" : role === \"publisher\" ? \"message.source=$2\" : \"(delivery.recipient=$2 OR message.source=$2)\");\n if (createdAt && id) {\n values.push(createdAt, id);\n clauses.push(`(delivery.created_at,delivery.id)>($${values.length - 1}::timestamptz,$${values.length}::uuid)`);\n }\n if (query.messageId) { values.push(query.messageId); clauses.push(`delivery.message_id=$${values.length}`); }\n if (query.recipient) { values.push(query.recipient); clauses.push(`delivery.recipient=$${values.length}`); }\n if (query.states?.length) { values.push(query.states); clauses.push(`delivery.state=ANY($${values.length}::text[])`); }\n values.push(limit);\n const result = await this.db.query<Row>(\n `SELECT delivery.* FROM agent_bridge.deliveries delivery\n JOIN agent_bridge.messages message ON message.workspace=delivery.workspace AND message.id=delivery.message_id\n WHERE ${clauses.join(\" AND \")}\n ORDER BY delivery.created_at,delivery.id LIMIT $${values.length}`,\n values,\n );\n const deliveries = result.rows.map(asDelivery);\n const last = deliveries[deliveries.length - 1];\n return { deliveries, cursor: deliveries.length === limit && last ? encodeScopedCursor(scope, { createdAt: last.createdAt, id: last.id }) : undefined };\n }\n\n async listDeliveryEvents(principal: BridgePrincipal, id: string, query: { cursor?: string; limit?: number } = {}) {\n const limit = Math.min(Math.max(query.limit ?? 50, 1), 200);\n const scope = scopedCursorScope(\"delivery-events\", principal, { deliveryId: id });\n const position = validateEventCursorPosition(decodeScopedCursor(query.cursor, scope));\n const result = await this.db.query<Row>(\n `SELECT event.* FROM agent_bridge.delivery_events event\n JOIN agent_bridge.messages message ON message.workspace=event.workspace AND message.id=event.message_id\n WHERE event.workspace=$1 AND event.delivery_id=$2 AND event.sequence>$3::bigint\n AND (event.recipient=$4 OR message.source=$4)\n ORDER BY event.sequence LIMIT $5`,\n [principal.workspace, id, position ?? \"0\", principal.agent, limit],\n );\n const events = result.rows.map(asDeliveryEvent);\n const last = events[events.length - 1];\n return { events, cursor: events.length === limit && last ? encodeScopedCursor(scope, last.sequence) : undefined };\n }\n\n async cancelDelivery(principal: BridgePrincipal, id: string) {\n return transaction(this.db, async (db) => {\n const visible = await db.query<Row>(\n `SELECT delivery.* FROM agent_bridge.deliveries delivery\n JOIN agent_bridge.messages message ON message.workspace=delivery.workspace AND message.id=delivery.message_id\n WHERE delivery.id=$1 AND delivery.workspace=$2 AND message.source=$3 FOR UPDATE OF delivery`,\n [id, principal.workspace, principal.agent],\n );\n const current = visible.rows[0];\n if (!current) return null;\n if (current.state === \"cancelled\") return asDelivery(current);\n if (![\"pending\", \"retrying\", \"claimed\"].includes(current.state)) {\n throw new DeliveryStateConflictError(`cannot cancel a ${current.state} delivery`);\n }\n const result = await db.query<Row>(\n `UPDATE agent_bridge.deliveries SET state='cancelled', lease_token=NULL,\n lease_owner=NULL, lease_expires_at=NULL, last_error=NULL,\n last_actor=$1, last_action='cancel' WHERE id=$2 RETURNING *`,\n [principal.agent, id],\n );\n return asDelivery(result.rows[0]!);\n });\n }\n\n async requeueDelivery(principal: BridgePrincipal, id: string) {\n return transaction(this.db, async (db) => {\n const visible = await db.query<Row>(\n `SELECT delivery.*,message.expires_at,message.delivery_not_before\n FROM agent_bridge.deliveries delivery\n JOIN agent_bridge.messages message ON message.workspace=delivery.workspace AND message.id=delivery.message_id\n WHERE delivery.id=$1 AND delivery.workspace=$2 AND message.source=$3 FOR UPDATE OF delivery`,\n [id, principal.workspace, principal.agent],\n );\n const current = visible.rows[0];\n if (!current) return null;\n if (![\"dead\", \"cancelled\"].includes(current.state)) {\n throw new DeliveryStateConflictError(`cannot requeue a ${current.state} delivery`);\n }\n if (current.expires_at && new Date(current.expires_at).getTime() <= Date.now()) {\n throw new DeliveryStateConflictError(\"cannot requeue an expired message\");\n }\n const result = await db.query<Row>(\n `UPDATE agent_bridge.deliveries SET state='pending',\n available_at=greatest(now(),coalesce($1::timestamptz,now())),\n cycle_attempt=0,requeue_count=requeue_count+1,\n lease_token=NULL,lease_owner=NULL,lease_expires_at=NULL,last_error=NULL,\n last_actor=$2,last_action='requeue' WHERE id=$3 RETURNING *`,\n [current.delivery_not_before, principal.agent, id],\n );\n return asDelivery(result.rows[0]!);\n });\n }\n\n async diagnostics(principal: BridgePrincipal): Promise<BridgeDiagnostics> {\n const result = await this.db.query<Row>(\n `SELECT\n count(*) FILTER (WHERE state='pending')::integer AS pending,\n count(*) FILTER (WHERE state='claimed')::integer AS claimed,\n count(*) FILTER (WHERE state='retrying')::integer AS retrying,\n count(*) FILTER (WHERE state='dead')::integer AS dead,\n count(*) FILTER (WHERE state='cancelled')::integer AS cancelled,\n min(available_at) FILTER (WHERE state IN ('pending','retrying')) AS oldest_available,\n count(*) FILTER (WHERE state IN ('pending','retrying') AND available_at<=now())::integer AS due,\n count(*) FILTER (WHERE state IN ('pending','retrying') AND available_at>now())::integer AS scheduled,\n count(*) FILTER (WHERE state='claimed' AND lease_expires_at<=now())::integer AS expired_leases,\n min(available_at) FILTER (WHERE state IN ('pending','retrying') AND available_at<=now()) AS oldest_due,\n coalesce(greatest(0,extract(epoch FROM (now()-min(available_at) FILTER (WHERE state IN ('pending','retrying') AND available_at<=now())))*1000),0)::bigint AS queue_lag_ms\n FROM agent_bridge.deliveries WHERE workspace=$1 AND recipient=$2`,\n [principal.workspace, principal.agent],\n );\n const queue = result.rows[0] ?? {};\n return {\n schemaVersion: \"postgres-v2\",\n deliverySupported: true,\n pending: Number(queue.pending ?? 0),\n claimed: Number(queue.claimed ?? 0),\n retrying: Number(queue.retrying ?? 0),\n dead: Number(queue.dead ?? 0),\n cancelled: Number(queue.cancelled ?? 0),\n oldestAvailableAt: asTimestamp(queue.oldest_available),\n due: Number(queue.due ?? 0),\n scheduled: Number(queue.scheduled ?? 0),\n expiredLeases: Number(queue.expired_leases ?? 0),\n oldestDueAt: asTimestamp(queue.oldest_due),\n queueLagMs: Number(queue.queue_lag_ms ?? 0),\n };\n }\n\n async heartbeat(principal: BridgePrincipal, leaseMs: number, runtimeType?: string, capabilities: string[] = []): Promise<AgentPresence> {\n await this.db.query(\n \"DELETE FROM agent_bridge.agent_instances WHERE workspace=$1 AND lease_expires_at<=now()\",\n [principal.workspace],\n );\n const result = await this.db.query<Row>(\n `WITH locked AS (\n SELECT pg_advisory_xact_lock(hashtextextended($1, 0))\n )\n INSERT INTO agent_bridge.agent_instances (workspace,agent,instance,runtime_type,capabilities,lease_expires_at,last_seen_at)\n SELECT $1,$2,$3,$4,$5::jsonb,now() + ($6 * interval '1 millisecond'),now()\n FROM locked\n WHERE EXISTS (\n SELECT 1 FROM agent_bridge.agent_instances\n WHERE workspace=$1 AND agent=$2 AND instance=$3\n ) OR ((\n SELECT count(*) < 128 FROM agent_bridge.agent_instances\n WHERE workspace=$1 AND agent=$2\n ) AND (\n SELECT count(*) < 4096 FROM agent_bridge.agent_instances\n WHERE workspace=$1\n )\n )\n 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 RETURNING *`,\n [principal.workspace, principal.agent, principal.instance, runtimeType ?? null, JSON.stringify(capabilities), leaseMs],\n );\n if (!result.rows[0]) {\n throw Object.assign(new Error(\"active instance limit reached\"), {\n status: 429,\n code: \"presence_limit\",\n });\n }\n return asPresence(result.rows[0]!);\n }\n\n async listPresence(principal: BridgePrincipal): Promise<AgentPresence[]> {\n await this.db.query(\n \"DELETE FROM agent_bridge.agent_instances WHERE workspace=$1 AND lease_expires_at<=now()\",\n [principal.workspace],\n );\n const result = await this.db.query<Row>(\n \"SELECT * FROM agent_bridge.agent_instances WHERE workspace=$1 ORDER BY agent,instance\",\n [principal.workspace],\n );\n return result.rows.map(asPresence);\n }\n\n}\n"],"mappings":"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","names":[]}
@@ -9,7 +9,7 @@ import {
9
9
  SUPPORTED_PROTOCOL_HEADER,
10
10
  SUPPORTED_PROTOCOL_VERSIONS,
11
11
  parseResponse
12
- } from "./chunk-GADH244D.js";
12
+ } from "./chunk-E4OWHGUE.js";
13
13
  import {
14
14
  cursorScope,
15
15
  decodeCursor,
@@ -581,4 +581,4 @@ export {
581
581
  BridgeHttpError,
582
582
  HttpBridgeStore
583
583
  };
584
- //# sourceMappingURL=chunk-CEXBMOI5.js.map
584
+ //# sourceMappingURL=chunk-Z6JP6MYD.js.map