@creatornader/agent-bridge 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/CHANGELOG.md +86 -4
  2. package/README.md +567 -55
  3. package/ROADMAP.md +114 -0
  4. package/SECURITY.md +90 -0
  5. package/SKILL.md +68 -2
  6. package/bin/agent-bridge +2 -2
  7. package/clients/claude-desktop.json +3 -1
  8. package/dist/archive.d.ts +163 -0
  9. package/dist/archive.js +50 -0
  10. package/dist/archive.js.map +1 -0
  11. package/dist/bridge-domain-CBX3IVqC.d.ts +153 -0
  12. package/dist/{bridge-service-CfqMcMAn.d.ts → bridge-service-hX1ZQp4W.d.ts} +15 -5
  13. package/dist/bridge-store-DPVSCwfs.d.ts +102 -0
  14. package/dist/bridge.d.ts +76 -17
  15. package/dist/bridge.js +52 -24
  16. package/dist/chunk-2DFNOLMO.js +618 -0
  17. package/dist/chunk-2DFNOLMO.js.map +1 -0
  18. package/dist/{chunk-KVR4JBRF.js → chunk-2EVLG3YA.js} +2 -2
  19. package/dist/{chunk-KVR4JBRF.js.map → chunk-2EVLG3YA.js.map} +1 -1
  20. package/dist/chunk-45BZGB77.js +709 -0
  21. package/dist/chunk-45BZGB77.js.map +1 -0
  22. package/dist/chunk-4VB44KJU.js +230 -0
  23. package/dist/chunk-4VB44KJU.js.map +1 -0
  24. package/dist/chunk-5GMB3A77.js +1013 -0
  25. package/dist/chunk-5GMB3A77.js.map +1 -0
  26. package/dist/chunk-A6W4QALF.js +1258 -0
  27. package/dist/chunk-A6W4QALF.js.map +1 -0
  28. package/dist/chunk-BZLMF5O5.js +328 -0
  29. package/dist/chunk-BZLMF5O5.js.map +1 -0
  30. package/dist/{chunk-AXL2I7FH.js → chunk-CEXBMOI5.js} +240 -79
  31. package/dist/chunk-CEXBMOI5.js.map +1 -0
  32. package/dist/chunk-GADH244D.js +527 -0
  33. package/dist/chunk-GADH244D.js.map +1 -0
  34. package/dist/chunk-MBPZXTJA.js +2428 -0
  35. package/dist/chunk-MBPZXTJA.js.map +1 -0
  36. package/dist/chunk-NCO7RLBM.js +146 -0
  37. package/dist/chunk-NCO7RLBM.js.map +1 -0
  38. package/dist/chunk-Q6PPMXJC.js +1050 -0
  39. package/dist/chunk-Q6PPMXJC.js.map +1 -0
  40. package/dist/{chunk-4KAOBC5X.js → chunk-SPSMZOCJ.js} +190 -165
  41. package/dist/chunk-SPSMZOCJ.js.map +1 -0
  42. package/dist/chunk-UAHMP6GC.js +54 -0
  43. package/dist/chunk-UAHMP6GC.js.map +1 -0
  44. package/dist/{chunk-YD6YJATN.js → chunk-VOQIDTCJ.js} +4 -2
  45. package/dist/chunk-VOQIDTCJ.js.map +1 -0
  46. package/dist/chunk-WAI2IYIQ.js +554 -0
  47. package/dist/chunk-WAI2IYIQ.js.map +1 -0
  48. package/dist/cli.d.ts +2 -1
  49. package/dist/cli.js +3555 -214
  50. package/dist/cli.js.map +1 -1
  51. package/dist/client-config.d.ts +1 -1
  52. package/dist/client-config.js +1 -1
  53. package/dist/client-runtime.d.ts +10 -6
  54. package/dist/client-runtime.js +9 -6
  55. package/dist/contracts/generate.d.ts +2 -0
  56. package/dist/contracts/generate.js +247 -0
  57. package/dist/contracts/generate.js.map +1 -0
  58. package/dist/dr.d.ts +324 -0
  59. package/dist/dr.js +124 -0
  60. package/dist/dr.js.map +1 -0
  61. package/dist/gateway-CggQ8vTC.d.ts +78 -0
  62. package/dist/gateway-main.js +190 -8
  63. package/dist/gateway-main.js.map +1 -1
  64. package/dist/gateway.d.ts +4 -3
  65. package/dist/gateway.js +4 -3
  66. package/dist/index.js +11 -8
  67. package/dist/index.js.map +1 -1
  68. package/dist/postgres-bridge-store-Bfd3hRId.d.ts +49 -0
  69. package/dist/server.d.ts +3 -2
  70. package/dist/server.js +13 -8
  71. package/dist/sqlite.d.ts +94 -12
  72. package/dist/sqlite.js +7 -4
  73. package/docs/architecture-v2.md +394 -0
  74. package/docs/decisions/0001-protocol-layers-and-acknowledgment-semantics.md +85 -0
  75. package/docs/decisions/0002-canonical-operation-contract-registry.md +46 -0
  76. package/docs/decisions/0003-host-adapters-and-consumer-instance-keys.md +88 -0
  77. package/docs/ecosystem.md +86 -0
  78. package/docs/postmortems/2026-07-08-wrapper-source-drift.md +82 -0
  79. package/docs/troubleshooting.md +89 -0
  80. package/llms.txt +107 -6
  81. package/openapi/agent-bridge-v2.openapi.json +9610 -0
  82. package/package.json +24 -4
  83. package/schemas/agent-bridge-v2.capabilities.json +1829 -0
  84. package/schemas/agent-bridge-v2.mcp.json +2074 -0
  85. package/schemas/agent-bridge-v2.schema.json +4560 -0
  86. package/sql/migrations/008_message_projects.sql +36 -0
  87. package/sql/migrations/009_mailbox_query_indexes.sql +28 -0
  88. package/sql/migrations/010_publisher_delivery_policy.sql +210 -0
  89. package/sql/migrations/011_credential_security.sql +875 -0
  90. package/sql/migrations/012_request_authority.sql +177 -0
  91. package/sql/migrations/013_row_isolation.sql +495 -0
  92. package/sql/migrations/014_owner_control_plane.sql +1641 -0
  93. package/sql/migrations/015_portable_archives.sql +1813 -0
  94. package/sql/migrations/016_native_dr_fence.sql +1005 -0
  95. package/bin/CLAUDE.md +0 -11
  96. package/dist/bridge-domain-BcnBeHOn.d.ts +0 -97
  97. package/dist/bridge-store-BuGjxTn4.d.ts +0 -61
  98. package/dist/chunk-4KAOBC5X.js.map +0 -1
  99. package/dist/chunk-6MAZ6YLZ.js +0 -146
  100. package/dist/chunk-6MAZ6YLZ.js.map +0 -1
  101. package/dist/chunk-AXL2I7FH.js.map +0 -1
  102. package/dist/chunk-BV6W4AJK.js +0 -211
  103. package/dist/chunk-BV6W4AJK.js.map +0 -1
  104. package/dist/chunk-CKSKUBDQ.js +0 -153
  105. package/dist/chunk-CKSKUBDQ.js.map +0 -1
  106. package/dist/chunk-JOUBDRYX.js +0 -272
  107. package/dist/chunk-JOUBDRYX.js.map +0 -1
  108. package/dist/chunk-JTC5YURG.js +0 -49
  109. package/dist/chunk-JTC5YURG.js.map +0 -1
  110. package/dist/chunk-O26W5QHS.js +0 -409
  111. package/dist/chunk-O26W5QHS.js.map +0 -1
  112. package/dist/chunk-WEULPMUY.js +0 -988
  113. package/dist/chunk-WEULPMUY.js.map +0 -1
  114. package/dist/chunk-YD6YJATN.js.map +0 -1
  115. package/dist/gateway-BULozv3K.d.ts +0 -54
@@ -1,24 +1,166 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  PostgresBridgeStore
4
- } from "./chunk-O26W5QHS.js";
4
+ } from "./chunk-2DFNOLMO.js";
5
5
  import {
6
6
  loadMigrationPlan,
7
7
  migrationsReady,
8
8
  runMigrations,
9
9
  runtimeSchemaReady
10
- } from "./chunk-6MAZ6YLZ.js";
10
+ } from "./chunk-45BZGB77.js";
11
+ import "./chunk-VOQIDTCJ.js";
11
12
  import {
12
13
  PostgresCredentialResolver,
13
14
  createGateway
14
- } from "./chunk-JOUBDRYX.js";
15
- import "./chunk-YD6YJATN.js";
16
- import "./chunk-CKSKUBDQ.js";
17
- import "./chunk-BV6W4AJK.js";
15
+ } from "./chunk-WAI2IYIQ.js";
16
+ import "./chunk-4VB44KJU.js";
17
+ import "./chunk-GADH244D.js";
18
+ import "./chunk-BZLMF5O5.js";
18
19
 
19
20
  // src/gateway-main.ts
20
21
  import { fileURLToPath } from "url";
21
22
  import pg from "pg";
23
+
24
+ // src/gateway-security.ts
25
+ var PostgresGatewaySecurity = class {
26
+ constructor(db) {
27
+ this.db = db;
28
+ }
29
+ functionName(bound, unbound) {
30
+ return this.db.inTransaction ? bound : unbound;
31
+ }
32
+ async recordScopeDenial(credentialId, operationId, requestId, signal) {
33
+ if (signal?.aborted) throw signal.reason;
34
+ await this.db.query(
35
+ `SELECT agent_bridge.${this.functionName("record_scope_denial", "record_scope_denial_unbound_011")}($1::uuid, $2::text, $3::uuid)`,
36
+ [credentialId, operationId, requestId]
37
+ );
38
+ if (signal?.aborted) throw signal.reason;
39
+ }
40
+ async consume(credentialId, operationId, requestId, signal) {
41
+ if (signal?.aborted) throw signal.reason;
42
+ const result = await this.db.query(
43
+ `SELECT allowed, limit_value, remaining_value, retry_after_seconds, denied_policy_id
44
+ FROM agent_bridge.${this.functionName("consume_rate_limit", "consume_rate_limit_unbound_011")}($1::uuid, $2::text, $3::uuid)`,
45
+ [credentialId, operationId, requestId]
46
+ );
47
+ if (signal?.aborted) throw signal.reason;
48
+ const row = result.rows[0];
49
+ if (!row) throw new Error("rate limit policy is missing");
50
+ return {
51
+ allowed: row.allowed,
52
+ policyId: row.denied_policy_id,
53
+ limit: Math.max(0, Number(row.limit_value)),
54
+ remaining: Math.max(0, Number(row.remaining_value)),
55
+ retryAfterSeconds: Math.max(0, Number(row.retry_after_seconds))
56
+ };
57
+ }
58
+ };
59
+
60
+ // src/postgres-request-authority.ts
61
+ var MutationOutcomeUnknownError = class extends Error {
62
+ constructor() {
63
+ super("The database commit outcome is unknown");
64
+ this.status = 503;
65
+ this.code = "mutation_outcome_unknown";
66
+ }
67
+ };
68
+ var PostgresRequestAuthority = class {
69
+ constructor(pool) {
70
+ this.pool = pool;
71
+ }
72
+ async run(credentialId, credentialHash, requestId, signal, work) {
73
+ if (signal.aborted) throw signal.reason;
74
+ const client = await this.pool.connect();
75
+ const db = { inTransaction: true, query: (sql, values) => client.query(sql, values) };
76
+ let transactionOpen = false;
77
+ let domainSavepoint = false;
78
+ let commitDispatched = false;
79
+ let commitCompleted = false;
80
+ let discard;
81
+ try {
82
+ if (signal.aborted) throw signal.reason;
83
+ await client.query("BEGIN");
84
+ transactionOpen = true;
85
+ const opened = await client.query(
86
+ `SELECT credential_id,workspace_id,principal,scopes
87
+ FROM agent_bridge.open_request_authority($1::uuid,$2::text,$3::uuid)`,
88
+ [credentialId, credentialHash, requestId]
89
+ );
90
+ const row = opened.rows[0];
91
+ if (!row) {
92
+ await client.query("ROLLBACK");
93
+ transactionOpen = false;
94
+ throw Object.assign(new Error("Credential is not active"), { status: 401, code: "unauthorized" });
95
+ }
96
+ if (signal.aborted) throw signal.reason;
97
+ const context = {
98
+ credential: { id: row.credential_id, principal: { workspace: row.workspace_id, agent: row.principal }, scopes: row.scopes },
99
+ store: new PostgresBridgeStore(db),
100
+ security: new PostgresGatewaySecurity(db),
101
+ beginDomainWork: async () => {
102
+ if (domainSavepoint) return;
103
+ if (signal.aborted) throw signal.reason;
104
+ await client.query("SAVEPOINT agent_bridge_domain_work");
105
+ if (signal.aborted) throw signal.reason;
106
+ domainSavepoint = true;
107
+ }
108
+ };
109
+ try {
110
+ const result = await work(context);
111
+ if (signal.aborted) throw signal.reason;
112
+ await client.query("SELECT agent_bridge.close_request_authority()");
113
+ if (signal.aborted) throw signal.reason;
114
+ commitDispatched = true;
115
+ await client.query("COMMIT");
116
+ commitCompleted = true;
117
+ transactionOpen = false;
118
+ return result;
119
+ } catch (error) {
120
+ if (commitDispatched) throw new MutationOutcomeUnknownError();
121
+ if (signal.aborted) throw error;
122
+ try {
123
+ if (domainSavepoint) {
124
+ await client.query("ROLLBACK TO SAVEPOINT agent_bridge_domain_work");
125
+ }
126
+ await client.query("SELECT agent_bridge.close_request_authority()");
127
+ } catch {
128
+ try {
129
+ await client.query("ROLLBACK");
130
+ } catch (rollbackError) {
131
+ discard = rollbackError instanceof Error ? rollbackError : new Error(String(rollbackError));
132
+ }
133
+ transactionOpen = false;
134
+ throw error;
135
+ }
136
+ if (signal.aborted) throw signal.reason;
137
+ commitDispatched = true;
138
+ await client.query("COMMIT");
139
+ commitCompleted = true;
140
+ transactionOpen = false;
141
+ throw error;
142
+ }
143
+ } catch (error) {
144
+ if (commitDispatched && !commitCompleted) {
145
+ discard = error instanceof Error ? error : new Error(String(error));
146
+ throw error instanceof MutationOutcomeUnknownError ? error : new MutationOutcomeUnknownError();
147
+ }
148
+ if (transactionOpen) {
149
+ try {
150
+ await client.query("ROLLBACK");
151
+ transactionOpen = false;
152
+ } catch (rollbackError) {
153
+ discard = rollbackError instanceof Error ? rollbackError : new Error(String(rollbackError));
154
+ }
155
+ }
156
+ throw error;
157
+ } finally {
158
+ client.release(discard);
159
+ }
160
+ }
161
+ };
162
+
163
+ // src/gateway-main.ts
22
164
  function integer(value, fallback, name) {
23
165
  if (value === void 0) return fallback;
24
166
  const parsed = Number(value);
@@ -68,18 +210,58 @@ async function main() {
68
210
  const pool = new pg.Pool({
69
211
  connectionString: databaseUrl,
70
212
  max: poolSize,
213
+ connectionTimeoutMillis: databaseTimeout,
71
214
  query_timeout: databaseTimeout,
72
215
  statement_timeout: databaseTimeout,
73
216
  application_name: "agent-bridge-gateway"
74
217
  });
218
+ const readinessPool = new pg.Pool({
219
+ connectionString: databaseUrl,
220
+ max: 1,
221
+ connectionTimeoutMillis: databaseTimeout,
222
+ query_timeout: databaseTimeout,
223
+ statement_timeout: databaseTimeout,
224
+ application_name: "agent-bridge-gateway-readiness"
225
+ });
75
226
  const store = new PostgresBridgeStore(pool);
227
+ let readinessCheckedAt = 0;
228
+ let readinessValue = false;
229
+ let readinessInFlight;
230
+ const probeSchema = async () => await migrationsReady(readinessPool, migrationPlan) && await runtimeSchemaReady(readinessPool);
231
+ const schemaReady = (force = false) => {
232
+ if (!force && Date.now() - readinessCheckedAt < 1e3) {
233
+ return Promise.resolve(readinessValue);
234
+ }
235
+ if (readinessInFlight) return readinessInFlight;
236
+ let current;
237
+ current = probeSchema().then((ready) => {
238
+ readinessValue = ready;
239
+ readinessCheckedAt = Date.now();
240
+ return ready;
241
+ }).finally(() => {
242
+ if (readinessInFlight === current) readinessInFlight = void 0;
243
+ });
244
+ readinessInFlight = current;
245
+ return current;
246
+ };
247
+ try {
248
+ if (!await schemaReady(true)) {
249
+ throw new Error("runtime database is not ready for enforced row isolation");
250
+ }
251
+ } catch (error) {
252
+ await Promise.allSettled([pool.end(), readinessPool.end()]);
253
+ throw error;
254
+ }
76
255
  const gateway = createGateway({
77
256
  store,
78
257
  credentials: new PostgresCredentialResolver(pool),
258
+ security: new PostgresGatewaySecurity(pool),
259
+ requestAuthority: new PostgresRequestAuthority(pool),
79
260
  allowedOrigins,
80
261
  bodyLimitBytes,
81
262
  requestDeadlineMs: deadline,
82
- ready: async () => await migrationsReady(pool, migrationPlan) && await runtimeSchemaReady(pool)
263
+ ready: schemaReady,
264
+ rowIsolationReady: schemaReady
83
265
  });
84
266
  gateway.listen(port, host, () => {
85
267
  process.stderr.write(`Agent Bridge gateway listening on ${host}:${port}
@@ -92,7 +274,7 @@ async function main() {
92
274
  await new Promise((resolve, reject) => {
93
275
  gateway.close((error) => error ? reject(error) : resolve());
94
276
  });
95
- await pool.end();
277
+ await Promise.all([pool.end(), readinessPool.end()]);
96
278
  }
97
279
  process.once("SIGINT", () => void shutdown());
98
280
  process.once("SIGTERM", () => void shutdown());
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/gateway-main.ts"],"sourcesContent":["import { fileURLToPath } from \"node:url\";\nimport pg from \"pg\";\nimport { PostgresCredentialResolver } from \"./gateway-auth.js\";\nimport { createGateway } from \"./gateway.js\";\nimport {\n loadMigrationPlan,\n migrationsReady,\n runMigrations,\n runtimeSchemaReady,\n} from \"./migrations.js\";\nimport { PostgresBridgeStore } from \"./postgres-bridge-store.js\";\n\nfunction integer(value: string | undefined, fallback: number, name: string): number {\n if (value === undefined) return fallback;\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed) || parsed < 1) throw new Error(`${name} must be a positive integer`);\n return parsed;\n}\n\nasync function main(): Promise<void> {\n const migrationsDirectory = fileURLToPath(new URL(\"../sql/migrations\", import.meta.url));\n if (process.argv.includes(\"--migrate-only\")) {\n const databaseUrl = process.env.AGENT_BRIDGE_DATABASE_URL;\n if (!databaseUrl) throw new Error(\"AGENT_BRIDGE_DATABASE_URL is required for migrations\");\n const migrationPool = new pg.Pool({\n connectionString: databaseUrl,\n max: 1,\n application_name: \"agent-bridge-migrator\",\n });\n try {\n await runMigrations(migrationPool, migrationsDirectory);\n } finally {\n await migrationPool.end();\n }\n return;\n }\n if (process.env.AGENT_BRIDGE_MIGRATE === \"1\") {\n throw new Error(\"AGENT_BRIDGE_MIGRATE is not supported; run agent-bridge migrate separately\");\n }\n const databaseUrl = process.env.AGENT_BRIDGE_RUNTIME_DATABASE_URL;\n if (!databaseUrl) {\n throw new Error(\"AGENT_BRIDGE_RUNTIME_DATABASE_URL is required for the gateway\");\n }\n\n const deadline = integer(process.env.AGENT_BRIDGE_REQUEST_DEADLINE_MS, 10_000, \"request deadline\");\n const databaseTimeout = integer(\n process.env.AGENT_BRIDGE_DATABASE_TIMEOUT_MS,\n Math.max(1, Math.floor(deadline / 3)),\n \"database timeout\",\n );\n const poolSize = integer(process.env.AGENT_BRIDGE_DATABASE_POOL_SIZE, 10, \"database pool size\");\n const bodyLimitBytes = integer(\n process.env.AGENT_BRIDGE_BODY_LIMIT_BYTES,\n 128 * 1024,\n \"body limit\",\n );\n const host = process.env.AGENT_BRIDGE_HOST ?? \"127.0.0.1\";\n const port = integer(process.env.AGENT_BRIDGE_PORT, 8787, \"gateway port\");\n const allowedOrigins = process.env.AGENT_BRIDGE_ALLOWED_ORIGINS\n ?.split(\",\")\n .map((origin) => origin.trim())\n .filter(Boolean);\n const migrationPlan = await loadMigrationPlan(migrationsDirectory);\n const pool = new pg.Pool({\n connectionString: databaseUrl,\n max: poolSize,\n query_timeout: databaseTimeout,\n statement_timeout: databaseTimeout,\n application_name: \"agent-bridge-gateway\",\n });\n\n const store = new PostgresBridgeStore(pool);\n const gateway = createGateway({\n store,\n credentials: new PostgresCredentialResolver(pool),\n allowedOrigins,\n bodyLimitBytes,\n requestDeadlineMs: deadline,\n ready: async () =>\n await migrationsReady(pool, migrationPlan) && await runtimeSchemaReady(pool),\n });\n\n gateway.listen(port, host, () => {\n process.stderr.write(`Agent Bridge gateway listening on ${host}:${port}\\n`);\n });\n\n let stopping = false;\n async function shutdown(): Promise<void> {\n if (stopping) return;\n stopping = true;\n await new Promise<void>((resolve, reject) => {\n gateway.close((error) => error ? reject(error) : resolve());\n });\n await pool.end();\n }\n\n process.once(\"SIGINT\", () => void shutdown());\n process.once(\"SIGTERM\", () => void shutdown());\n}\n\nvoid main().catch((error) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n});\n"],"mappings":"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","names":["databaseUrl"]}
1
+ {"version":3,"sources":["../src/gateway-main.ts","../src/gateway-security.ts","../src/postgres-request-authority.ts"],"sourcesContent":["import { fileURLToPath } from \"node:url\";\nimport pg from \"pg\";\nimport { PostgresCredentialResolver } from \"./gateway-auth.js\";\nimport { PostgresGatewaySecurity } from \"./gateway-security.js\";\nimport { createGateway } from \"./gateway.js\";\nimport {\n loadMigrationPlan,\n migrationsReady,\n runMigrations,\n runtimeSchemaReady,\n} from \"./migrations.js\";\nimport { PostgresBridgeStore } from \"./postgres-bridge-store.js\";\nimport { PostgresRequestAuthority } from \"./postgres-request-authority.js\";\n\nfunction integer(value: string | undefined, fallback: number, name: string): number {\n if (value === undefined) return fallback;\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed) || parsed < 1) throw new Error(`${name} must be a positive integer`);\n return parsed;\n}\n\nasync function main(): Promise<void> {\n const migrationsDirectory = fileURLToPath(new URL(\"../sql/migrations\", import.meta.url));\n if (process.argv.includes(\"--migrate-only\")) {\n const databaseUrl = process.env.AGENT_BRIDGE_DATABASE_URL;\n if (!databaseUrl) throw new Error(\"AGENT_BRIDGE_DATABASE_URL is required for migrations\");\n const migrationPool = new pg.Pool({\n connectionString: databaseUrl,\n max: 1,\n application_name: \"agent-bridge-migrator\",\n });\n try {\n await runMigrations(migrationPool, migrationsDirectory);\n } finally {\n await migrationPool.end();\n }\n return;\n }\n if (process.env.AGENT_BRIDGE_MIGRATE === \"1\") {\n throw new Error(\"AGENT_BRIDGE_MIGRATE is not supported; run agent-bridge migrate separately\");\n }\n const databaseUrl = process.env.AGENT_BRIDGE_RUNTIME_DATABASE_URL;\n if (!databaseUrl) {\n throw new Error(\"AGENT_BRIDGE_RUNTIME_DATABASE_URL is required for the gateway\");\n }\n\n const deadline = integer(process.env.AGENT_BRIDGE_REQUEST_DEADLINE_MS, 10_000, \"request deadline\");\n const databaseTimeout = integer(\n process.env.AGENT_BRIDGE_DATABASE_TIMEOUT_MS,\n Math.max(1, Math.floor(deadline / 3)),\n \"database timeout\",\n );\n const poolSize = integer(process.env.AGENT_BRIDGE_DATABASE_POOL_SIZE, 10, \"database pool size\");\n const bodyLimitBytes = integer(\n process.env.AGENT_BRIDGE_BODY_LIMIT_BYTES,\n 128 * 1024,\n \"body limit\",\n );\n const host = process.env.AGENT_BRIDGE_HOST ?? \"127.0.0.1\";\n const port = integer(process.env.AGENT_BRIDGE_PORT, 8787, \"gateway port\");\n const allowedOrigins = process.env.AGENT_BRIDGE_ALLOWED_ORIGINS\n ?.split(\",\")\n .map((origin) => origin.trim())\n .filter(Boolean);\n const migrationPlan = await loadMigrationPlan(migrationsDirectory);\n const pool = new pg.Pool({\n connectionString: databaseUrl,\n max: poolSize,\n connectionTimeoutMillis: databaseTimeout,\n query_timeout: databaseTimeout,\n statement_timeout: databaseTimeout,\n application_name: \"agent-bridge-gateway\",\n });\n const readinessPool = new pg.Pool({\n connectionString: databaseUrl,\n max: 1,\n connectionTimeoutMillis: databaseTimeout,\n query_timeout: databaseTimeout,\n statement_timeout: databaseTimeout,\n application_name: \"agent-bridge-gateway-readiness\",\n });\n\n const store = new PostgresBridgeStore(pool);\n let readinessCheckedAt = 0;\n let readinessValue = false;\n let readinessInFlight: Promise<boolean> | undefined;\n const probeSchema = async () =>\n await migrationsReady(readinessPool, migrationPlan) && await runtimeSchemaReady(readinessPool);\n const schemaReady = (force = false): Promise<boolean> => {\n if (!force && Date.now() - readinessCheckedAt < 1_000) {\n return Promise.resolve(readinessValue);\n }\n if (readinessInFlight) return readinessInFlight;\n let current: Promise<boolean>;\n current = probeSchema()\n .then((ready) => {\n readinessValue = ready;\n readinessCheckedAt = Date.now();\n return ready;\n })\n .finally(() => {\n if (readinessInFlight === current) readinessInFlight = undefined;\n });\n readinessInFlight = current;\n return current;\n };\n try {\n if (!await schemaReady(true)) {\n throw new Error(\"runtime database is not ready for enforced row isolation\");\n }\n } catch (error) {\n await Promise.allSettled([pool.end(), readinessPool.end()]);\n throw error;\n }\n const gateway = createGateway({\n store,\n credentials: new PostgresCredentialResolver(pool),\n security: new PostgresGatewaySecurity(pool),\n requestAuthority: new PostgresRequestAuthority(pool),\n allowedOrigins,\n bodyLimitBytes,\n requestDeadlineMs: deadline,\n ready: schemaReady,\n rowIsolationReady: schemaReady,\n });\n\n gateway.listen(port, host, () => {\n process.stderr.write(`Agent Bridge gateway listening on ${host}:${port}\\n`);\n });\n\n let stopping = false;\n async function shutdown(): Promise<void> {\n if (stopping) return;\n stopping = true;\n await new Promise<void>((resolve, reject) => {\n gateway.close((error) => error ? reject(error) : resolve());\n });\n await Promise.all([pool.end(), readinessPool.end()]);\n }\n\n process.once(\"SIGINT\", () => void shutdown());\n process.once(\"SIGTERM\", () => void shutdown());\n}\n\nvoid main().catch((error) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n});\n","import type { PgQueryable } from \"./postgres-bridge-store.js\";\nimport type { OperationId } from \"./contracts/registry.js\";\n\nexport interface RateLimitDecision {\n allowed: boolean;\n policyId: string | null;\n limit: number;\n remaining: number;\n retryAfterSeconds: number;\n}\n\nexport interface GatewaySecurity {\n recordScopeDenial(\n credentialId: string,\n operationId: OperationId,\n requestId: string,\n signal?: AbortSignal,\n ): Promise<void>;\n consume(\n credentialId: string,\n operationId: OperationId,\n requestId: string,\n signal?: AbortSignal,\n ): Promise<RateLimitDecision>;\n}\n\nexport class PostgresGatewaySecurity implements GatewaySecurity {\n constructor(private readonly db: PgQueryable) {}\n\n private functionName(bound: string, unbound: string): string {\n return this.db.inTransaction ? bound : unbound;\n }\n\n async recordScopeDenial(\n credentialId: string,\n operationId: OperationId,\n requestId: string,\n signal?: AbortSignal,\n ): Promise<void> {\n if (signal?.aborted) throw signal.reason;\n await this.db.query(\n `SELECT agent_bridge.${this.functionName(\"record_scope_denial\", \"record_scope_denial_unbound_011\")}($1::uuid, $2::text, $3::uuid)`,\n [credentialId, operationId, requestId],\n );\n if (signal?.aborted) throw signal.reason;\n }\n\n async consume(\n credentialId: string,\n operationId: OperationId,\n requestId: string,\n signal?: AbortSignal,\n ): Promise<RateLimitDecision> {\n if (signal?.aborted) throw signal.reason;\n const result = await this.db.query<{\n allowed: boolean;\n limit_value: string | number;\n remaining_value: string | number;\n retry_after_seconds: string | number;\n denied_policy_id: string | null;\n }>(\n `SELECT allowed, limit_value, remaining_value, retry_after_seconds, denied_policy_id\n FROM agent_bridge.${this.functionName(\"consume_rate_limit\", \"consume_rate_limit_unbound_011\")}($1::uuid, $2::text, $3::uuid)`,\n [credentialId, operationId, requestId],\n );\n if (signal?.aborted) throw signal.reason;\n const row = result.rows[0];\n if (!row) throw new Error(\"rate limit policy is missing\");\n return {\n allowed: row.allowed,\n policyId: row.denied_policy_id,\n limit: Math.max(0, Number(row.limit_value)),\n remaining: Math.max(0, Number(row.remaining_value)),\n retryAfterSeconds: Math.max(0, Number(row.retry_after_seconds)),\n };\n }\n}\n","import type pg from \"pg\";\nimport type { BridgePrincipal } from \"./bridge-domain.js\";\nimport type { AuthorizationScope } from \"./contracts/registry.js\";\nimport { PostgresBridgeStore, type PgQueryable } from \"./postgres-bridge-store.js\";\nimport { PostgresGatewaySecurity } from \"./gateway-security.js\";\n\nexport interface RequestAuthorityContext {\n credential: { id: string; principal: BridgePrincipal; scopes: readonly AuthorizationScope[] };\n store: PostgresBridgeStore;\n security: PostgresGatewaySecurity;\n /** Establishes the savepoint separating durable security accounting from domain work. */\n beginDomainWork(): Promise<void>;\n}\n\nexport interface RequestAuthority {\n run<T>(credentialId: string, credentialHash: string, requestId: string, signal: AbortSignal, work: (context: RequestAuthorityContext) => Promise<T>): Promise<T>;\n}\n\ntype AuthorityRow = {\n credential_id: string;\n workspace_id: string;\n principal: string;\n scopes: AuthorizationScope[];\n};\n\nexport class MutationOutcomeUnknownError extends Error {\n readonly status = 503;\n readonly code = \"mutation_outcome_unknown\";\n constructor() { super(\"The database commit outcome is unknown\"); }\n}\n\nexport class PostgresRequestAuthority implements RequestAuthority {\n constructor(private readonly pool: Pick<pg.Pool, \"connect\">) {}\n\n async run<T>(credentialId: string, credentialHash: string, requestId: string, signal: AbortSignal, work: (context: RequestAuthorityContext) => Promise<T>): Promise<T> {\n if (signal.aborted) throw signal.reason;\n const client = await this.pool.connect();\n const db: PgQueryable = { inTransaction: true, query: (sql, values) => client.query(sql, values) };\n let transactionOpen = false;\n let domainSavepoint = false;\n let commitDispatched = false;\n let commitCompleted = false;\n let discard: Error | undefined;\n try {\n if (signal.aborted) throw signal.reason;\n await client.query(\"BEGIN\");\n transactionOpen = true;\n const opened = await client.query<AuthorityRow>(\n `SELECT credential_id,workspace_id,principal,scopes\n FROM agent_bridge.open_request_authority($1::uuid,$2::text,$3::uuid)`,\n [credentialId, credentialHash, requestId],\n );\n const row = opened.rows[0];\n if (!row) {\n await client.query(\"ROLLBACK\");\n transactionOpen = false;\n throw Object.assign(new Error(\"Credential is not active\"), { status: 401, code: \"unauthorized\" });\n }\n if (signal.aborted) throw signal.reason;\n const context: RequestAuthorityContext = {\n credential: { id: row.credential_id, principal: { workspace: row.workspace_id, agent: row.principal }, scopes: row.scopes },\n store: new PostgresBridgeStore(db),\n security: new PostgresGatewaySecurity(db),\n beginDomainWork: async () => {\n if (domainSavepoint) return;\n if (signal.aborted) throw signal.reason;\n await client.query(\"SAVEPOINT agent_bridge_domain_work\");\n if (signal.aborted) throw signal.reason;\n domainSavepoint = true;\n },\n };\n try {\n const result = await work(context);\n if (signal.aborted) throw signal.reason;\n await client.query(\"SELECT agent_bridge.close_request_authority()\");\n if (signal.aborted) throw signal.reason;\n commitDispatched = true;\n await client.query(\"COMMIT\");\n commitCompleted = true;\n transactionOpen = false;\n return result;\n } catch (error) {\n if (commitDispatched) throw new MutationOutcomeUnknownError();\n if (signal.aborted) throw error;\n try {\n if (domainSavepoint) {\n await client.query(\"ROLLBACK TO SAVEPOINT agent_bridge_domain_work\");\n }\n await client.query(\"SELECT agent_bridge.close_request_authority()\");\n } catch {\n try {\n await client.query(\"ROLLBACK\");\n } catch (rollbackError) {\n discard = rollbackError instanceof Error ? rollbackError : new Error(String(rollbackError));\n }\n transactionOpen = false;\n throw error;\n }\n if (signal.aborted) throw signal.reason;\n commitDispatched = true;\n await client.query(\"COMMIT\");\n commitCompleted = true;\n transactionOpen = false;\n throw error;\n }\n } catch (error) {\n if (commitDispatched && !commitCompleted) {\n discard = error instanceof Error ? error : new Error(String(error));\n throw error instanceof MutationOutcomeUnknownError ? error : new MutationOutcomeUnknownError();\n }\n if (transactionOpen) {\n try { await client.query(\"ROLLBACK\"); transactionOpen = false; }\n catch (rollbackError) { discard = rollbackError instanceof Error ? rollbackError : new Error(String(rollbackError)); }\n }\n throw error;\n } finally {\n client.release(discard);\n }\n }\n\n}\n"],"mappings":"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","names":["databaseUrl"]}
package/dist/gateway.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import 'node:http';
2
- import './bridge-store-BuGjxTn4.js';
3
- export { G as GatewayOptions, d as createGateway } from './gateway-BULozv3K.js';
4
- import './bridge-domain-BcnBeHOn.js';
2
+ import './bridge-store-DPVSCwfs.js';
3
+ export { G as GatewayOptions, c as createGateway } from './gateway-CggQ8vTC.js';
4
+ import './bridge-domain-CBX3IVqC.js';
5
+ import './postgres-bridge-store-Bfd3hRId.js';
package/dist/gateway.js CHANGED
@@ -1,9 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  createGateway
4
- } from "./chunk-JOUBDRYX.js";
5
- import "./chunk-CKSKUBDQ.js";
6
- import "./chunk-BV6W4AJK.js";
4
+ } from "./chunk-WAI2IYIQ.js";
5
+ import "./chunk-4VB44KJU.js";
6
+ import "./chunk-GADH244D.js";
7
+ import "./chunk-BZLMF5O5.js";
7
8
  export {
8
9
  createGateway
9
10
  };
package/dist/index.js CHANGED
@@ -1,14 +1,17 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  startServer
4
- } from "./chunk-4KAOBC5X.js";
5
- import "./chunk-KVR4JBRF.js";
6
- import "./chunk-JTC5YURG.js";
7
- import "./chunk-AXL2I7FH.js";
8
- import "./chunk-WEULPMUY.js";
9
- import "./chunk-YD6YJATN.js";
10
- import "./chunk-CKSKUBDQ.js";
11
- import "./chunk-BV6W4AJK.js";
4
+ } from "./chunk-SPSMZOCJ.js";
5
+ import "./chunk-2EVLG3YA.js";
6
+ import "./chunk-UAHMP6GC.js";
7
+ import "./chunk-CEXBMOI5.js";
8
+ import "./chunk-Q6PPMXJC.js";
9
+ import "./chunk-5GMB3A77.js";
10
+ import "./chunk-NCO7RLBM.js";
11
+ import "./chunk-VOQIDTCJ.js";
12
+ import "./chunk-4VB44KJU.js";
13
+ import "./chunk-GADH244D.js";
14
+ import "./chunk-BZLMF5O5.js";
12
15
 
13
16
  // src/index.ts
14
17
  startServer().catch((err) => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { startServer } from \"./server.js\";\n\nstartServer().catch((err) => {\n console.error(\"Failed to start agent-bridge MCP server:\", err);\n process.exit(1);\n});\n"],"mappings":";;;;;;;;;;;;;AAEA,YAAY,EAAE,MAAM,CAAC,QAAQ;AAC3B,UAAQ,MAAM,4CAA4C,GAAG;AAC7D,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { startServer } from \"./server.js\";\n\nstartServer().catch((err) => {\n console.error(\"Failed to start agent-bridge MCP server:\", err);\n process.exit(1);\n});\n"],"mappings":";;;;;;;;;;;;;;;;AAEA,YAAY,EAAE,MAAM,CAAC,QAAQ;AAC3B,UAAQ,MAAM,4CAA4C,GAAG;AAC7D,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":[]}
@@ -0,0 +1,49 @@
1
+ import { b as BridgeMessage, c as BridgePrincipal, B as BridgeDelivery, R as RetryPolicy, a as BridgeDeliveryEvent, A as AgentPresence } from './bridge-domain-CBX3IVqC.js';
2
+ import { a as BridgeStore, I as InsertMessageResult, d as MessageQuery, M as MessagePage, C as ClaimOptions, c as DeliveryQuery, B as BridgeDiagnostics } from './bridge-store-DPVSCwfs.js';
3
+
4
+ interface PgQueryable {
5
+ query<T extends Record<string, unknown> = Record<string, unknown>>(sql: string, values?: unknown[]): Promise<{
6
+ rows: T[];
7
+ rowCount: number | null;
8
+ }>;
9
+ connect?(): Promise<PgTransactionClient>;
10
+ release?(): void;
11
+ /** True when the queryable is already owned by an explicit request transaction. */
12
+ inTransaction?: boolean;
13
+ }
14
+ interface PgTransactionClient {
15
+ query<T extends Record<string, unknown> = Record<string, unknown>>(sql: string, values?: unknown[]): Promise<{
16
+ rows: T[];
17
+ rowCount: number | null;
18
+ }>;
19
+ release(error?: Error | boolean): void;
20
+ }
21
+ declare class PostgresBridgeStore implements BridgeStore {
22
+ private readonly db;
23
+ constructor(db: PgQueryable);
24
+ initialize(): Promise<void>;
25
+ insertMessage(input: Omit<BridgeMessage, "sequence" | "createdAt">): Promise<InsertMessageResult>;
26
+ listMessages(principal: BridgePrincipal, query?: MessageQuery): Promise<MessagePage>;
27
+ recordReceipt(principal: BridgePrincipal, ids: string[], readAt?: Date): Promise<number>;
28
+ claimDelivery(principal: BridgePrincipal, options: ClaimOptions): Promise<BridgeDelivery | null>;
29
+ renewDelivery(principal: BridgePrincipal, id: string, token: string, leaseMs: number): Promise<BridgeDelivery | null>;
30
+ settleDelivery(principal: BridgePrincipal, id: string, token: string, state: "acked" | "retrying" | "dead", error?: string, _retryPolicy?: RetryPolicy): Promise<BridgeDelivery | null>;
31
+ listDeliveries(principal: BridgePrincipal, query?: DeliveryQuery): Promise<{
32
+ deliveries: BridgeDelivery[];
33
+ cursor: string | undefined;
34
+ }>;
35
+ listDeliveryEvents(principal: BridgePrincipal, id: string, query?: {
36
+ cursor?: string;
37
+ limit?: number;
38
+ }): Promise<{
39
+ events: BridgeDeliveryEvent[];
40
+ cursor: string | undefined;
41
+ }>;
42
+ cancelDelivery(principal: BridgePrincipal, id: string): Promise<BridgeDelivery | null>;
43
+ requeueDelivery(principal: BridgePrincipal, id: string): Promise<BridgeDelivery | null>;
44
+ diagnostics(principal: BridgePrincipal): Promise<BridgeDiagnostics>;
45
+ heartbeat(principal: BridgePrincipal, leaseMs: number, runtimeType?: string, capabilities?: string[]): Promise<AgentPresence>;
46
+ listPresence(principal: BridgePrincipal): Promise<AgentPresence[]>;
47
+ }
48
+
49
+ export { type PgQueryable as P, type PgTransactionClient as a, PostgresBridgeStore as b };
package/dist/server.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
2
  import { ClientProvider } from './client-config.js';
3
- import './bridge-domain-BcnBeHOn.js';
3
+ import './bridge-domain-CBX3IVqC.js';
4
4
 
5
5
  interface AgentBridgeServerConfig {
6
6
  supabaseUrl?: string;
@@ -15,6 +15,7 @@ interface AgentBridgeServerConfig {
15
15
  gatewayUrl?: string;
16
16
  gatewayToken?: string;
17
17
  }
18
+ declare const MCP_IMPLEMENTATION_VERSION = "2.0.0";
18
19
  interface AgentBridgeServerEnv {
19
20
  AGENT_BRIDGE_URL?: string;
20
21
  AGENT_BRIDGE_KEY?: string;
@@ -31,4 +32,4 @@ declare function configFromEnv(env?: AgentBridgeServerEnv): AgentBridgeServerCon
31
32
  declare function createAgentBridgeServer(config: AgentBridgeServerConfig): Server;
32
33
  declare function startServer(config?: AgentBridgeServerConfig): Promise<void>;
33
34
 
34
- export { type AgentBridgeServerConfig, type AgentBridgeServerEnv, configFromEnv, createAgentBridgeServer, startServer };
35
+ export { type AgentBridgeServerConfig, type AgentBridgeServerEnv, MCP_IMPLEMENTATION_VERSION, configFromEnv, createAgentBridgeServer, startServer };
package/dist/server.js CHANGED
@@ -1,17 +1,22 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
+ MCP_IMPLEMENTATION_VERSION,
3
4
  configFromEnv,
4
5
  createAgentBridgeServer,
5
6
  startServer
6
- } from "./chunk-4KAOBC5X.js";
7
- import "./chunk-KVR4JBRF.js";
8
- import "./chunk-JTC5YURG.js";
9
- import "./chunk-AXL2I7FH.js";
10
- import "./chunk-WEULPMUY.js";
11
- import "./chunk-YD6YJATN.js";
12
- import "./chunk-CKSKUBDQ.js";
13
- import "./chunk-BV6W4AJK.js";
7
+ } from "./chunk-SPSMZOCJ.js";
8
+ import "./chunk-2EVLG3YA.js";
9
+ import "./chunk-UAHMP6GC.js";
10
+ import "./chunk-CEXBMOI5.js";
11
+ import "./chunk-Q6PPMXJC.js";
12
+ import "./chunk-5GMB3A77.js";
13
+ import "./chunk-NCO7RLBM.js";
14
+ import "./chunk-VOQIDTCJ.js";
15
+ import "./chunk-4VB44KJU.js";
16
+ import "./chunk-GADH244D.js";
17
+ import "./chunk-BZLMF5O5.js";
14
18
  export {
19
+ MCP_IMPLEMENTATION_VERSION,
15
20
  configFromEnv,
16
21
  createAgentBridgeServer,
17
22
  startServer