@creatornader/agent-bridge 0.5.2 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +57 -1
- package/README.md +59 -34
- package/ROADMAP.md +74 -17
- package/SECURITY.md +6 -5
- package/SKILL.md +4 -1
- package/dist/archive.d.ts +2 -2
- package/dist/{bridge-service-CNBKdYXh.d.ts → bridge-service-DjSYfjKt.d.ts} +4 -2
- package/dist/{bridge-store-ByJ6CaJk.d.ts → bridge-store-Bi_LCX8e.d.ts} +5 -1
- package/dist/bridge.d.ts +9 -37
- package/dist/bridge.js +6 -10
- package/dist/chunk-23UDQZMT.js +54 -0
- package/dist/chunk-23UDQZMT.js.map +1 -0
- package/dist/{chunk-AWE3DFZV.js → chunk-4V2PFJEF.js} +11 -4
- package/dist/chunk-4V2PFJEF.js.map +1 -0
- package/dist/{chunk-E4OWHGUE.js → chunk-63JKCBC6.js} +10 -8
- package/dist/chunk-63JKCBC6.js.map +1 -0
- package/dist/chunk-6ZOLE3E3.js +242 -0
- package/dist/chunk-6ZOLE3E3.js.map +1 -0
- package/dist/chunk-7B3XRRNI.js +27 -0
- package/dist/chunk-7B3XRRNI.js.map +1 -0
- package/dist/{chunk-7VJI2MXI.js → chunk-IF5OKPBK.js} +32 -14
- package/dist/chunk-IF5OKPBK.js.map +1 -0
- package/dist/{chunk-QPC6JHA3.js → chunk-IXNQG4SB.js} +12 -16
- package/dist/chunk-IXNQG4SB.js.map +1 -0
- package/dist/{chunk-HUHG7XTB.js → chunk-JIRNR75D.js} +30 -193
- package/dist/chunk-JIRNR75D.js.map +1 -0
- package/dist/{chunk-JUTJRAMA.js → chunk-LF37B6KL.js} +6 -4
- package/dist/chunk-LF37B6KL.js.map +1 -0
- package/dist/{chunk-2EVLG3YA.js → chunk-UKFRCP6X.js} +10 -7
- package/dist/chunk-UKFRCP6X.js.map +1 -0
- package/dist/{chunk-SN7PIVDF.js → chunk-ZUZ7TCIH.js} +13 -1
- package/dist/{chunk-SN7PIVDF.js.map → chunk-ZUZ7TCIH.js.map} +1 -1
- package/dist/cli.js +45 -40
- package/dist/cli.js.map +1 -1
- package/dist/client-config.d.ts +1 -1
- package/dist/client-config.js +1 -1
- package/dist/client-runtime.d.ts +3 -3
- package/dist/client-runtime.js +5 -5
- package/dist/contracts/generate.js +3 -3
- package/dist/contracts/generate.js.map +1 -1
- package/dist/dr.d.ts +8 -0
- package/dist/dr.js +1 -1
- package/dist/{gateway-CW-61lvs.d.ts → gateway-DWZ3pX48.d.ts} +7 -2
- package/dist/gateway-main.js +12 -3
- package/dist/gateway-main.js.map +1 -1
- package/dist/gateway.d.ts +3 -3
- package/dist/gateway.js +3 -3
- package/dist/index.js +8 -7
- package/dist/index.js.map +1 -1
- package/dist/{postgres-bridge-store-C9KG9Z69.d.ts → postgres-bridge-store-ChoOuFEY.d.ts} +1 -1
- package/dist/server.d.ts +0 -2
- package/dist/server.js +8 -7
- package/dist/{sqlite-edge-store-CdMIOrho.d.ts → sqlite-edge-store-BAFUeysk.d.ts} +1 -1
- package/dist/sqlite.d.ts +7 -3
- package/dist/sqlite.js +1 -1
- package/docs/architecture-v2.md +26 -14
- package/docs/decisions/0001-protocol-layers-and-acknowledgment-semantics.md +2 -1
- package/docs/decisions/0002-canonical-operation-contract-registry.md +11 -1
- package/docs/decisions/0005-retire-direct-supabase-runtime.md +52 -0
- package/docs/deployment.md +41 -17
- package/docs/ecosystem.md +6 -4
- package/docs/troubleshooting.md +15 -0
- package/llms.txt +4 -4
- package/openapi/agent-bridge-v2.openapi.json +11 -6
- package/package.json +5 -3
- package/schemas/agent-bridge-v2.capabilities.json +11 -5
- package/schemas/agent-bridge-v2.mcp.json +13 -12
- package/schemas/agent-bridge-v2.schema.json +26 -24
- package/scripts/gateway-release-check.mjs +92 -0
- package/dist/chunk-2EVLG3YA.js.map +0 -1
- package/dist/chunk-7VJI2MXI.js.map +0 -1
- package/dist/chunk-AWE3DFZV.js.map +0 -1
- package/dist/chunk-E4OWHGUE.js.map +0 -1
- package/dist/chunk-HUHG7XTB.js.map +0 -1
- package/dist/chunk-JUTJRAMA.js.map +0 -1
- package/dist/chunk-QPC6JHA3.js.map +0 -1
- package/dist/chunk-Z6JP6MYD.js +0 -584
- package/dist/chunk-Z6JP6MYD.js.map +0 -1
|
@@ -5,8 +5,7 @@
|
|
|
5
5
|
"protocolVersion": "2.1",
|
|
6
6
|
"scopeEnforcementByProvider": {
|
|
7
7
|
"local": false,
|
|
8
|
-
"gateway": true
|
|
9
|
-
"legacy-supabase": false
|
|
8
|
+
"gateway": true
|
|
10
9
|
},
|
|
11
10
|
"$defs": {
|
|
12
11
|
"ErrorEnvelope": {
|
|
@@ -320,8 +319,7 @@
|
|
|
320
319
|
"enum": [
|
|
321
320
|
"scoped-credential",
|
|
322
321
|
"credential-wide",
|
|
323
|
-
"process-identity"
|
|
324
|
-
"legacy-key"
|
|
322
|
+
"process-identity"
|
|
325
323
|
]
|
|
326
324
|
},
|
|
327
325
|
"surface": {
|
|
@@ -334,10 +332,16 @@
|
|
|
334
332
|
"provider": {
|
|
335
333
|
"enum": [
|
|
336
334
|
"local",
|
|
337
|
-
"gateway"
|
|
338
|
-
"legacy-supabase"
|
|
335
|
+
"gateway"
|
|
339
336
|
]
|
|
340
337
|
},
|
|
338
|
+
"implementationVersion": {
|
|
339
|
+
"type": "string"
|
|
340
|
+
},
|
|
341
|
+
"implementationRevision": {
|
|
342
|
+
"type": "string",
|
|
343
|
+
"pattern": "^[0-9a-f]{7,40}$"
|
|
344
|
+
},
|
|
341
345
|
"grantedScopes": {
|
|
342
346
|
"type": "array",
|
|
343
347
|
"items": {
|
|
@@ -420,8 +424,7 @@
|
|
|
420
424
|
"enum": [
|
|
421
425
|
"scoped-credential",
|
|
422
426
|
"credential-wide",
|
|
423
|
-
"process-identity"
|
|
424
|
-
"legacy-key"
|
|
427
|
+
"process-identity"
|
|
425
428
|
]
|
|
426
429
|
},
|
|
427
430
|
"surface": {
|
|
@@ -434,10 +437,16 @@
|
|
|
434
437
|
"provider": {
|
|
435
438
|
"enum": [
|
|
436
439
|
"local",
|
|
437
|
-
"gateway"
|
|
438
|
-
"legacy-supabase"
|
|
440
|
+
"gateway"
|
|
439
441
|
]
|
|
440
442
|
},
|
|
443
|
+
"implementationVersion": {
|
|
444
|
+
"type": "string"
|
|
445
|
+
},
|
|
446
|
+
"implementationRevision": {
|
|
447
|
+
"type": "string",
|
|
448
|
+
"pattern": "^[0-9a-f]{7,40}$"
|
|
449
|
+
},
|
|
441
450
|
"grantedScopes": {
|
|
442
451
|
"type": "array",
|
|
443
452
|
"items": {
|
|
@@ -495,8 +504,7 @@
|
|
|
495
504
|
"schemaVersion": {
|
|
496
505
|
"enum": [
|
|
497
506
|
"local-v2",
|
|
498
|
-
"postgres-v2"
|
|
499
|
-
"legacy-v1"
|
|
507
|
+
"postgres-v2"
|
|
500
508
|
]
|
|
501
509
|
},
|
|
502
510
|
"deliverySupported": {
|
|
@@ -780,8 +788,7 @@
|
|
|
780
788
|
"provider": {
|
|
781
789
|
"enum": [
|
|
782
790
|
"local",
|
|
783
|
-
"gateway"
|
|
784
|
-
"legacy-supabase"
|
|
791
|
+
"gateway"
|
|
785
792
|
]
|
|
786
793
|
},
|
|
787
794
|
"workspace": {
|
|
@@ -803,8 +810,7 @@
|
|
|
803
810
|
"schemaVersion": {
|
|
804
811
|
"enum": [
|
|
805
812
|
"local-v2",
|
|
806
|
-
"postgres-v2"
|
|
807
|
-
"legacy-v1"
|
|
813
|
+
"postgres-v2"
|
|
808
814
|
]
|
|
809
815
|
},
|
|
810
816
|
"endpoint": {
|
|
@@ -854,8 +860,7 @@
|
|
|
854
860
|
"schemaVersion": {
|
|
855
861
|
"enum": [
|
|
856
862
|
"local-v2",
|
|
857
|
-
"postgres-v2"
|
|
858
|
-
"legacy-v1"
|
|
863
|
+
"postgres-v2"
|
|
859
864
|
]
|
|
860
865
|
},
|
|
861
866
|
"deliverySupported": {
|
|
@@ -1161,8 +1166,7 @@
|
|
|
1161
1166
|
"provider": {
|
|
1162
1167
|
"enum": [
|
|
1163
1168
|
"local",
|
|
1164
|
-
"gateway"
|
|
1165
|
-
"legacy-supabase"
|
|
1169
|
+
"gateway"
|
|
1166
1170
|
]
|
|
1167
1171
|
},
|
|
1168
1172
|
"workspace": {
|
|
@@ -1184,8 +1188,7 @@
|
|
|
1184
1188
|
"schemaVersion": {
|
|
1185
1189
|
"enum": [
|
|
1186
1190
|
"local-v2",
|
|
1187
|
-
"postgres-v2"
|
|
1188
|
-
"legacy-v1"
|
|
1191
|
+
"postgres-v2"
|
|
1189
1192
|
]
|
|
1190
1193
|
},
|
|
1191
1194
|
"endpoint": {
|
|
@@ -1235,8 +1238,7 @@
|
|
|
1235
1238
|
"schemaVersion": {
|
|
1236
1239
|
"enum": [
|
|
1237
1240
|
"local-v2",
|
|
1238
|
-
"postgres-v2"
|
|
1239
|
-
"legacy-v1"
|
|
1241
|
+
"postgres-v2"
|
|
1240
1242
|
]
|
|
1241
1243
|
},
|
|
1242
1244
|
"deliverySupported": {
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { pathToFileURL } from "node:url";
|
|
2
|
+
|
|
3
|
+
const COMMIT = /^[0-9a-f]{7,40}$/u;
|
|
4
|
+
const VERSION = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u;
|
|
5
|
+
|
|
6
|
+
function fail(message) {
|
|
7
|
+
throw new Error(message);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function argument(args, name) {
|
|
11
|
+
const index = args.indexOf(name);
|
|
12
|
+
if (index === -1 || index === args.length - 1 || args[index + 1].startsWith("--")) {
|
|
13
|
+
fail(`${name} is required`);
|
|
14
|
+
}
|
|
15
|
+
return args[index + 1];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function normalizeExpectedRelease(version, revision) {
|
|
19
|
+
if (!VERSION.test(version)) fail("expected version is invalid");
|
|
20
|
+
if (!COMMIT.test(revision)) fail("expected revision is invalid");
|
|
21
|
+
return { version, revision };
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export async function checkGatewayRelease({
|
|
25
|
+
gatewayOrigin,
|
|
26
|
+
token,
|
|
27
|
+
expectedVersion,
|
|
28
|
+
expectedRevision,
|
|
29
|
+
fetchImpl = fetch,
|
|
30
|
+
}) {
|
|
31
|
+
const expected = normalizeExpectedRelease(expectedVersion, expectedRevision);
|
|
32
|
+
const origin = new URL(gatewayOrigin);
|
|
33
|
+
if (origin.protocol !== "https:" || origin.username || origin.password || origin.pathname !== "/" || origin.search || origin.hash) {
|
|
34
|
+
fail("AGENT_BRIDGE_URL must be an HTTPS origin without credentials, path, query, or fragment");
|
|
35
|
+
}
|
|
36
|
+
if (typeof token !== "string" || token.length === 0) fail("AGENT_BRIDGE_TOKEN is required");
|
|
37
|
+
|
|
38
|
+
const response = await fetchImpl(new URL("/v2/capabilities", origin), {
|
|
39
|
+
headers: {
|
|
40
|
+
authorization: `Bearer ${token}`,
|
|
41
|
+
"x-agent-bridge-protocol-version": "2.1",
|
|
42
|
+
},
|
|
43
|
+
signal: AbortSignal.timeout(10_000),
|
|
44
|
+
});
|
|
45
|
+
if (!response.ok) fail(`gateway capability probe returned HTTP ${response.status}`);
|
|
46
|
+
if (response.headers.get("x-agent-bridge-protocol-version") !== "2.1") {
|
|
47
|
+
fail("gateway did not select protocol 2.1");
|
|
48
|
+
}
|
|
49
|
+
const body = await response.json();
|
|
50
|
+
if (body.selectedProtocolVersion !== "2.1" || body.currentProtocolVersion !== "2.1") {
|
|
51
|
+
fail("gateway capability document does not report protocol 2.1");
|
|
52
|
+
}
|
|
53
|
+
if (body.requestAuthority !== true || body.rowIsolation !== true) {
|
|
54
|
+
fail("gateway request authority or row isolation is not ready");
|
|
55
|
+
}
|
|
56
|
+
if (body.implementationVersion !== expected.version) {
|
|
57
|
+
fail(`gateway version mismatch: expected ${expected.version}, received ${String(body.implementationVersion)}`);
|
|
58
|
+
}
|
|
59
|
+
if (body.implementationRevision !== expected.revision) {
|
|
60
|
+
fail(`gateway revision mismatch: expected ${expected.revision}, received ${String(body.implementationRevision)}`);
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
gatewayOrigin: origin.origin,
|
|
64
|
+
implementationVersion: body.implementationVersion,
|
|
65
|
+
implementationRevision: body.implementationRevision,
|
|
66
|
+
protocolVersion: body.selectedProtocolVersion,
|
|
67
|
+
requestAuthority: true,
|
|
68
|
+
rowIsolation: true,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async function main() {
|
|
73
|
+
const args = process.argv.slice(2);
|
|
74
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
75
|
+
process.stdout.write("Usage: gateway-release-check --version <semver> --revision <git-sha>\n");
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const result = await checkGatewayRelease({
|
|
79
|
+
gatewayOrigin: process.env.AGENT_BRIDGE_URL,
|
|
80
|
+
token: process.env.AGENT_BRIDGE_TOKEN,
|
|
81
|
+
expectedVersion: argument(args, "--version"),
|
|
82
|
+
expectedRevision: argument(args, "--revision"),
|
|
83
|
+
});
|
|
84
|
+
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (import.meta.url === pathToFileURL(process.argv[1] ?? "").href) {
|
|
88
|
+
void main().catch((error) => {
|
|
89
|
+
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
90
|
+
process.exitCode = 1;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client-config.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { createHash } from \"node:crypto\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { BridgePrincipal } from \"./bridge-domain.js\";\n\nexport type ClientProvider = \"local\" | \"gateway\" | \"legacy-supabase\";\n\nexport interface ClientEnvironment extends NodeJS.ProcessEnv {\n AGENT_BRIDGE_PROVIDER?: string;\n AGENT_BRIDGE_URL?: string;\n AGENT_BRIDGE_KEY?: string;\n AGENT_BRIDGE_TOKEN?: string;\n AGENT_BRIDGE_AGENT?: string;\n AGENT_BRIDGE_WORKSPACE?: string;\n AGENT_BRIDGE_INSTANCE?: string;\n AGENT_BRIDGE_DB?: string;\n AGENT_BRIDGE_EDGE_DB?: string;\n AGENT_BRIDGE_CONFIG?: string;\n AGENT_BRIDGE_CURSOR?: string;\n}\n\nexport interface ClientConfig {\n provider: ClientProvider;\n principal: BridgePrincipal;\n url?: string;\n credential?: string;\n databasePath: string;\n edgeDatabasePath: string;\n cursorPath: string;\n configPath: string;\n}\n\nfunction pathComponent(value: string): string {\n const readable = value.replace(/[^A-Za-z0-9._-]+/g, \"_\").slice(0, 48) || \"_\";\n const suffix = createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 12);\n return `${readable}-${suffix}`;\n}\n\nfunction clean(value: string | undefined): string | undefined {\n return value?.trim() || undefined;\n}\n\nfunction unquote(value: string): string {\n const input = value.trim();\n if (input.length > 1 && ((input[0] === '\"' && input[input.length - 1] === '\"') || (input[0] === \"'\" && input[input.length - 1] === \"'\"))) return input.slice(1, -1);\n return input;\n}\n\nexport function readClientConfigFile(path: string): Record<string, string> {\n if (!existsSync(path)) return {};\n const result: Record<string, string> = {};\n for (const raw of readFileSync(path, \"utf8\").split(/\\r?\\n/)) {\n const line = raw.trim();\n if (!line || line.startsWith(\"#\")) continue;\n const separator = line.indexOf(\"=\");\n if (separator > 0) result[line.slice(0, separator).trim()] = unquote(line.slice(separator + 1));\n }\n return result;\n}\n\nexport function resolveClientConfig(\n env: ClientEnvironment = process.env,\n explicitAgent?: string,\n): ClientConfig {\n const home = clean(env.HOME) ?? homedir();\n const configPath = clean(env.AGENT_BRIDGE_CONFIG) ?? join(home, \".agent-bridge\", \"config\");\n const file = readClientConfigFile(configPath);\n const value = (key: keyof ClientEnvironment) => clean(env[key]) ?? clean(file[key]);\n const rawProvider = value(\"AGENT_BRIDGE_PROVIDER\") ?? (value(\"AGENT_BRIDGE_TOKEN\") ? \"gateway\" : value(\"AGENT_BRIDGE_URL\") ? \"legacy-supabase\" : \"local\");\n const provider = rawProvider === \"legacy\" || rawProvider === \"supabase\" ? \"legacy-supabase\" : rawProvider;\n if (!([\"local\", \"gateway\", \"legacy-supabase\"] as string[]).includes(provider)) throw new Error(`Unsupported AGENT_BRIDGE_PROVIDER: ${rawProvider}`);\n // Identity belongs to the active client process. A shared config file must\n // never make one runtime impersonate the client that initialized the bridge.\n const configuredAgent = clean(env.AGENT_BRIDGE_AGENT);\n const requestedAgent = clean(explicitAgent);\n if (configuredAgent && requestedAgent && configuredAgent !== requestedAgent) {\n throw new Error(`source must match AGENT_BRIDGE_AGENT (${configuredAgent}); got ${requestedAgent}`);\n }\n const agent = requestedAgent ?? configuredAgent;\n if (!agent) throw new Error(\"AGENT_BRIDGE_AGENT is required\");\n const url = value(\"AGENT_BRIDGE_URL\");\n const credential = provider === \"gateway\" ? value(\"AGENT_BRIDGE_TOKEN\") : value(\"AGENT_BRIDGE_KEY\");\n if (provider !== \"local\" && (!url || !credential)) throw new Error(`${provider} requires AGENT_BRIDGE_URL and ${provider === \"gateway\" ? \"AGENT_BRIDGE_TOKEN\" : \"AGENT_BRIDGE_KEY\"}`);\n const workspace = provider === \"legacy-supabase\"\n ? \"*\"\n : value(\"AGENT_BRIDGE_WORKSPACE\") ?? \"default\";\n const instance = clean(env.AGENT_BRIDGE_INSTANCE);\n const databasePath = value(\"AGENT_BRIDGE_DB\") ?? join(home, \".agent-bridge\", \"bridge.sqlite3\");\n const edgeDatabasePath = value(\"AGENT_BRIDGE_EDGE_DB\") ?? join(home, \".agent-bridge\", \"edge.sqlite3\");\n const cursorScope = createHash(\"sha256\")\n .update(`${provider}\\0${provider === \"local\" ? databasePath : url}`)\n .digest(\"hex\")\n .slice(0, 16);\n return {\n provider: provider as ClientProvider,\n principal: { workspace, agent, instance },\n url,\n credential,\n databasePath,\n edgeDatabasePath,\n cursorPath: value(\"AGENT_BRIDGE_CURSOR\") ?? join(\n home,\n \".agent-bridge\",\n \"cursors\",\n pathComponent(provider),\n cursorScope,\n pathComponent(workspace),\n pathComponent(agent),\n pathComponent(instance ?? \"default\"),\n ),\n configPath,\n };\n}\n"],"mappings":"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","names":[]}
|