@creatornader/agent-bridge 0.3.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +150 -1
- package/README.md +239 -5
- package/ROADMAP.md +59 -7
- package/SECURITY.md +55 -5
- package/SKILL.md +103 -0
- package/dist/archive.d.ts +2 -2
- package/dist/archive.js +2 -2
- package/dist/{bridge-service-hX1ZQp4W.d.ts → bridge-service-YTjGr91A.d.ts} +1 -1
- package/dist/{bridge-store-DPVSCwfs.d.ts → bridge-store-Boaj-ZbO.d.ts} +2 -0
- package/dist/bridge.d.ts +17 -7
- package/dist/bridge.js +15 -7
- package/dist/{chunk-WAI2IYIQ.js → chunk-3YHVUPU2.js} +48 -5
- package/dist/chunk-3YHVUPU2.js.map +1 -0
- package/dist/{chunk-45BZGB77.js → chunk-6BTJE6D4.js} +168 -7
- package/dist/chunk-6BTJE6D4.js.map +1 -0
- package/dist/{chunk-5GMB3A77.js → chunk-DQOZJJZ2.js} +22 -10
- package/dist/chunk-DQOZJJZ2.js.map +1 -0
- package/dist/{chunk-NCO7RLBM.js → chunk-GTK4KOED.js} +108 -8
- package/dist/chunk-GTK4KOED.js.map +1 -0
- package/dist/{chunk-GADH244D.js → chunk-IHZFI7TH.js} +12 -4
- package/dist/chunk-IHZFI7TH.js.map +1 -0
- package/dist/{chunk-CEXBMOI5.js → chunk-LAHNQZDN.js} +2 -2
- package/dist/{chunk-UAHMP6GC.js → chunk-MCKKVNCE.js} +9 -6
- package/dist/chunk-MCKKVNCE.js.map +1 -0
- package/dist/{chunk-MBPZXTJA.js → chunk-PDIHDBP3.js} +173 -20
- package/dist/chunk-PDIHDBP3.js.map +1 -0
- package/dist/{chunk-Q6PPMXJC.js → chunk-SV3SVBYS.js} +377 -21
- package/dist/chunk-SV3SVBYS.js.map +1 -0
- package/dist/{chunk-SPSMZOCJ.js → chunk-SYGONYMM.js} +4 -4
- package/dist/{chunk-A6W4QALF.js → chunk-TC6A7GMF.js} +2 -2
- package/dist/cli.js +5865 -436
- package/dist/cli.js.map +1 -1
- package/dist/client-runtime.d.ts +4 -2
- package/dist/client-runtime.js +6 -6
- package/dist/contracts/generate.js +1 -1
- package/dist/dr.d.ts +9 -2
- package/dist/dr.js +6 -4
- package/dist/{gateway-CggQ8vTC.d.ts → gateway-BQHpV-MZ.d.ts} +27 -3
- package/dist/gateway-main.js +69 -5
- package/dist/gateway-main.js.map +1 -1
- package/dist/gateway.d.ts +3 -3
- package/dist/gateway.js +2 -2
- package/dist/index.js +7 -7
- package/dist/{postgres-bridge-store-Bfd3hRId.d.ts → postgres-bridge-store-WASumj26.d.ts} +1 -1
- package/dist/server.js +7 -7
- package/dist/sqlite-edge-store-Bc15DvpX.d.ts +148 -0
- package/dist/sqlite.d.ts +19 -80
- package/dist/sqlite.js +11 -3
- package/docs/architecture-v2.md +256 -10
- package/docs/decisions/0004-client-lifecycle-and-endpoint-migration.md +204 -0
- package/docs/deployment.md +205 -0
- package/docs/troubleshooting.md +23 -0
- package/llms.txt +67 -0
- package/openapi/agent-bridge-v2.openapi.json +1023 -0
- package/package.json +6 -2
- package/schemas/agent-bridge-v2.capabilities.json +24 -0
- package/schemas/agent-bridge-v2.mcp.json +6 -0
- package/schemas/agent-bridge-v2.schema.json +163 -0
- package/sql/migrations/017_gateway_authority_binding.sql +99 -0
- package/sql/migrations/018_endpoint_migration_challenges.sql +1028 -0
- package/sql/migrations/019_endpoint_migration_same_successor.sql +324 -0
- package/dist/chunk-45BZGB77.js.map +0 -1
- package/dist/chunk-5GMB3A77.js.map +0 -1
- package/dist/chunk-GADH244D.js.map +0 -1
- package/dist/chunk-MBPZXTJA.js.map +0 -1
- package/dist/chunk-NCO7RLBM.js.map +0 -1
- package/dist/chunk-Q6PPMXJC.js.map +0 -1
- package/dist/chunk-UAHMP6GC.js.map +0 -1
- package/dist/chunk-WAI2IYIQ.js.map +0 -1
- /package/dist/{chunk-CEXBMOI5.js.map → chunk-LAHNQZDN.js.map} +0 -0
- /package/dist/{chunk-SPSMZOCJ.js.map → chunk-SYGONYMM.js.map} +0 -0
- /package/dist/{chunk-A6W4QALF.js.map → chunk-TC6A7GMF.js.map} +0 -0
package/dist/client-runtime.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { B as BridgeService } from './bridge-service-
|
|
2
|
-
import { a as BridgeStore } from './bridge-store-
|
|
1
|
+
import { B as BridgeService } from './bridge-service-YTjGr91A.js';
|
|
2
|
+
import { a as BridgeStore } from './bridge-store-Boaj-ZbO.js';
|
|
3
|
+
import { a as EdgeDrainLease } from './sqlite-edge-store-Bc15DvpX.js';
|
|
3
4
|
import { ClientConfig } from './client-config.js';
|
|
4
5
|
import './bridge-domain-CBX3IVqC.js';
|
|
5
6
|
|
|
@@ -12,6 +13,7 @@ interface ClientRuntime {
|
|
|
12
13
|
interface ClientRuntimeOptions {
|
|
13
14
|
autoSync?: boolean;
|
|
14
15
|
initializationMode?: "active" | "passive";
|
|
16
|
+
edgeDrainLease?: EdgeDrainLease;
|
|
15
17
|
}
|
|
16
18
|
declare function createStore(config: ClientConfig, options?: ClientRuntimeOptions): BridgeStore;
|
|
17
19
|
declare function createClientRuntime(config: ClientConfig, options?: ClientRuntimeOptions): Promise<ClientRuntime>;
|
package/dist/client-runtime.js
CHANGED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
import {
|
|
3
3
|
createClientRuntime,
|
|
4
4
|
createStore
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-MCKKVNCE.js";
|
|
6
|
+
import "./chunk-LAHNQZDN.js";
|
|
7
|
+
import "./chunk-SV3SVBYS.js";
|
|
8
|
+
import "./chunk-DQOZJJZ2.js";
|
|
9
|
+
import "./chunk-GTK4KOED.js";
|
|
10
10
|
import "./chunk-VOQIDTCJ.js";
|
|
11
11
|
import "./chunk-4VB44KJU.js";
|
|
12
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-IHZFI7TH.js";
|
|
13
13
|
import "./chunk-BZLMF5O5.js";
|
|
14
14
|
export {
|
|
15
15
|
createClientRuntime,
|
package/dist/dr.d.ts
CHANGED
|
@@ -73,6 +73,12 @@ declare const EDGE_SQLITE_SCHEMA_CONTRACTS: readonly [Readonly<{
|
|
|
73
73
|
}>, Readonly<{
|
|
74
74
|
id: "current-upgraded-project-column";
|
|
75
75
|
sha256: "171ae11f520b4963f517d3102de64cb8a5f45c080078ff02e20aeb17891b585c";
|
|
76
|
+
}>, Readonly<{
|
|
77
|
+
id: "current-upgraded-project-column-migration-gate";
|
|
78
|
+
sha256: "790b4bfed373ff776ba6700065154f7a3cbbecd94f37ea09a654768ac2a8455c";
|
|
79
|
+
}>, Readonly<{
|
|
80
|
+
id: "current-upgraded-migration-gate";
|
|
81
|
+
sha256: "64634eae28f344f02324e6c002e4cc35ea9a99fe878de843df018482bdde38ef";
|
|
76
82
|
}>];
|
|
77
83
|
declare const isSupportedLocalSqliteSchemaContract: (hash: string) => boolean;
|
|
78
84
|
declare const isSupportedEdgeSqliteSchemaContract: (hash: string) => boolean;
|
|
@@ -118,7 +124,8 @@ declare const SQLITE_EDGE_APPLICATION_ID = 1094862661;
|
|
|
118
124
|
declare const POSTGRES_NATIVE_DR_ROLE_SCHEMA = "agent-bridge.postgres-native-dr-roles";
|
|
119
125
|
declare const POSTGRES_NATIVE_DR_ROLE_VERSION = 1;
|
|
120
126
|
declare const POSTGRES_NATIVE_DR_SERVICE = "agent_bridge_dr";
|
|
121
|
-
declare const
|
|
127
|
+
declare const POSTGRES_NATIVE_DR_LEGACY_EXCLUDED_DATA_TABLES: readonly ["agent_bridge.agent_instances", "agent_bridge.rate_limit_buckets", "agent_bridge.request_authorities", "agent_bridge.archive_transaction_authorizations"];
|
|
128
|
+
declare const POSTGRES_NATIVE_DR_EXCLUDED_DATA_TABLES: readonly ["agent_bridge.agent_instances", "agent_bridge.rate_limit_buckets", "agent_bridge.request_authorities", "agent_bridge.archive_transaction_authorizations", "agent_bridge.endpoint_migration_challenges"];
|
|
122
129
|
type PostgresDrRoleKind = "derived" | "schema-owner" | "object-role" | "external-principal";
|
|
123
130
|
interface PostgresDrRole {
|
|
124
131
|
name: string;
|
|
@@ -321,4 +328,4 @@ declare function verifyPostgresNativeDrArtifacts(options: VerifyPostgresNativeDr
|
|
|
321
328
|
declare function assertPostgresRestoreAuthority(client: PostgresDrClient): Promise<void>;
|
|
322
329
|
declare function restorePostgresNativeDr(options: RestorePostgresNativeDrOptions): Promise<RestorePostgresNativeDrResult>;
|
|
323
330
|
|
|
324
|
-
export { type BackupPostgresNativeDrOptions, EDGE_SQLITE_APPLICATION_ID, EDGE_SQLITE_SCHEMA_CONTRACTS, LOCAL_SQLITE_APPLICATION_ID, LOCAL_SQLITE_SCHEMA_CONTRACTS, NATIVE_DR_FORMAT, NATIVE_DR_MAX_BUNDLE_BYTES, NATIVE_DR_VERSION, NativeDrBundleError, type NativeDrBundleInput, type NativeDrBundleMetadata, NativeDrBundleReader, type NativeDrBundleWriteHooks, NativeDrCommandError, type NativeDrFileOperations, type NativeDrInputEntry, type NativeDrManifest, POSTGRES_NATIVE_DR_EXCLUDED_DATA_TABLES, POSTGRES_NATIVE_DR_ROLE_SCHEMA, POSTGRES_NATIVE_DR_ROLE_VERSION, POSTGRES_NATIVE_DR_SERVICE, type PostgresDrClient, type PostgresDrDefaultAcl, type PostgresDrDefaultAclGrant, type PostgresDrLibpqFiles, type PostgresDrMembership, type PostgresDrRole, type PostgresDrRoleInventory, type PostgresDrRoleKind, type PostgresDrToolResult, type PostgresNativeDrArtifactAnchor, type PostgresNativeDrArtifactAnchors, type PostgresNativeDrBundleInput, type PostgresNativeDrDependencies, PostgresNativeDrError, type PostgresNativeDrMigration, type PostgresNativeDrSchema, type RestorePostgresNativeDrOptions, type RestorePostgresNativeDrResult, SQLITE_DATABASE_SCHEMA_VERSION, SQLITE_EDGE_APPLICATION_ID, SQLITE_METADATA_TABLE, SQLiteDatabaseContractError, type SQLiteNativeDrOptions, type VerifyPostgresNativeDrArtifactsOptions, type VerifyPostgresNativeDrArtifactsResult, assertEdgeDatabase, assertEdgeUpgradeCandidate, assertLocalAuthorityDatabase, assertLocalUpgradeCandidate, assertPostgresRestoreAuthority, backupLocalSqlite, backupPostgresNativeDr, buildPgDumpArgs, buildPgRestoreArgs, buildPgRestoreListArgs, buildPgRestoreSchemaAclArgs, buildPostgresDefaultPrivilegeStatements, buildPostgresMembershipStatements, buildPostgresRoleShellStatements, canonicalPostgresRoleInventory, collectPostgresRoleInventory, createPostgresDrLibpqFiles, identifySqliteDatabase, installEdgeMarkers, installLocalAuthorityMarkers, isSupportedEdgeSqliteSchemaContract, isSupportedLocalSqliteSchemaContract, parsePostgresToolMajor, restoreLocalSqlite, restorePostgresNativeDr, runSqliteBackupWorker, schemaAclRestoreList, sqliteSchemaContractHash, validateNativeDrAggregateSize, validateNativeDrId, validateNativeDrTimeout, validatePostgresDumpToc, validatePostgresRoleInventory, verifyNativeDrBundle, verifyPostgresNativeDrArtifacts, verifySqliteHealth, writeNativeDrBundle };
|
|
331
|
+
export { type BackupPostgresNativeDrOptions, EDGE_SQLITE_APPLICATION_ID, EDGE_SQLITE_SCHEMA_CONTRACTS, LOCAL_SQLITE_APPLICATION_ID, LOCAL_SQLITE_SCHEMA_CONTRACTS, NATIVE_DR_FORMAT, NATIVE_DR_MAX_BUNDLE_BYTES, NATIVE_DR_VERSION, NativeDrBundleError, type NativeDrBundleInput, type NativeDrBundleMetadata, NativeDrBundleReader, type NativeDrBundleWriteHooks, NativeDrCommandError, type NativeDrFileOperations, type NativeDrInputEntry, type NativeDrManifest, POSTGRES_NATIVE_DR_EXCLUDED_DATA_TABLES, POSTGRES_NATIVE_DR_LEGACY_EXCLUDED_DATA_TABLES, POSTGRES_NATIVE_DR_ROLE_SCHEMA, POSTGRES_NATIVE_DR_ROLE_VERSION, POSTGRES_NATIVE_DR_SERVICE, type PostgresDrClient, type PostgresDrDefaultAcl, type PostgresDrDefaultAclGrant, type PostgresDrLibpqFiles, type PostgresDrMembership, type PostgresDrRole, type PostgresDrRoleInventory, type PostgresDrRoleKind, type PostgresDrToolResult, type PostgresNativeDrArtifactAnchor, type PostgresNativeDrArtifactAnchors, type PostgresNativeDrBundleInput, type PostgresNativeDrDependencies, PostgresNativeDrError, type PostgresNativeDrMigration, type PostgresNativeDrSchema, type RestorePostgresNativeDrOptions, type RestorePostgresNativeDrResult, SQLITE_DATABASE_SCHEMA_VERSION, SQLITE_EDGE_APPLICATION_ID, SQLITE_METADATA_TABLE, SQLiteDatabaseContractError, type SQLiteNativeDrOptions, type VerifyPostgresNativeDrArtifactsOptions, type VerifyPostgresNativeDrArtifactsResult, assertEdgeDatabase, assertEdgeUpgradeCandidate, assertLocalAuthorityDatabase, assertLocalUpgradeCandidate, assertPostgresRestoreAuthority, backupLocalSqlite, backupPostgresNativeDr, buildPgDumpArgs, buildPgRestoreArgs, buildPgRestoreListArgs, buildPgRestoreSchemaAclArgs, buildPostgresDefaultPrivilegeStatements, buildPostgresMembershipStatements, buildPostgresRoleShellStatements, canonicalPostgresRoleInventory, collectPostgresRoleInventory, createPostgresDrLibpqFiles, identifySqliteDatabase, installEdgeMarkers, installLocalAuthorityMarkers, isSupportedEdgeSqliteSchemaContract, isSupportedLocalSqliteSchemaContract, parsePostgresToolMajor, restoreLocalSqlite, restorePostgresNativeDr, runSqliteBackupWorker, schemaAclRestoreList, sqliteSchemaContractHash, validateNativeDrAggregateSize, validateNativeDrId, validateNativeDrTimeout, validatePostgresDumpToc, validatePostgresRoleInventory, verifyNativeDrBundle, verifyPostgresNativeDrArtifacts, verifySqliteHealth, writeNativeDrBundle };
|
package/dist/dr.js
CHANGED
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
NativeDrBundleReader,
|
|
8
8
|
NativeDrCommandError,
|
|
9
9
|
POSTGRES_NATIVE_DR_EXCLUDED_DATA_TABLES,
|
|
10
|
+
POSTGRES_NATIVE_DR_LEGACY_EXCLUDED_DATA_TABLES,
|
|
10
11
|
POSTGRES_NATIVE_DR_ROLE_SCHEMA,
|
|
11
12
|
POSTGRES_NATIVE_DR_ROLE_VERSION,
|
|
12
13
|
POSTGRES_NATIVE_DR_SERVICE,
|
|
@@ -38,7 +39,7 @@ import {
|
|
|
38
39
|
verifyNativeDrBundle,
|
|
39
40
|
verifyPostgresNativeDrArtifacts,
|
|
40
41
|
writeNativeDrBundle
|
|
41
|
-
} from "./chunk-
|
|
42
|
+
} from "./chunk-PDIHDBP3.js";
|
|
42
43
|
import {
|
|
43
44
|
EDGE_SQLITE_APPLICATION_ID,
|
|
44
45
|
EDGE_SQLITE_SCHEMA_CONTRACTS,
|
|
@@ -58,9 +59,9 @@ import {
|
|
|
58
59
|
isSupportedLocalSqliteSchemaContract,
|
|
59
60
|
sqliteSchemaContractHash,
|
|
60
61
|
verifySqliteHealth
|
|
61
|
-
} from "./chunk-
|
|
62
|
-
import "./chunk-
|
|
63
|
-
import "./chunk-
|
|
62
|
+
} from "./chunk-DQOZJJZ2.js";
|
|
63
|
+
import "./chunk-GTK4KOED.js";
|
|
64
|
+
import "./chunk-6BTJE6D4.js";
|
|
64
65
|
import "./chunk-VOQIDTCJ.js";
|
|
65
66
|
import "./chunk-BZLMF5O5.js";
|
|
66
67
|
export {
|
|
@@ -75,6 +76,7 @@ export {
|
|
|
75
76
|
NativeDrBundleReader,
|
|
76
77
|
NativeDrCommandError,
|
|
77
78
|
POSTGRES_NATIVE_DR_EXCLUDED_DATA_TABLES,
|
|
79
|
+
POSTGRES_NATIVE_DR_LEGACY_EXCLUDED_DATA_TABLES,
|
|
78
80
|
POSTGRES_NATIVE_DR_ROLE_SCHEMA,
|
|
79
81
|
POSTGRES_NATIVE_DR_ROLE_VERSION,
|
|
80
82
|
POSTGRES_NATIVE_DR_SERVICE,
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import * as node_http from 'node:http';
|
|
2
2
|
import { IncomingMessage, ServerResponse } from 'node:http';
|
|
3
|
-
import { a as BridgeStore } from './bridge-store-
|
|
3
|
+
import { a as BridgeStore } from './bridge-store-Boaj-ZbO.js';
|
|
4
4
|
import { c as BridgePrincipal } from './bridge-domain-CBX3IVqC.js';
|
|
5
|
-
import { P as PgQueryable, b as PostgresBridgeStore } from './postgres-bridge-store-
|
|
5
|
+
import { P as PgQueryable, b as PostgresBridgeStore } from './postgres-bridge-store-WASumj26.js';
|
|
6
6
|
|
|
7
7
|
declare const AUTHORIZATION_SCOPES: readonly ["deliveries:claim", "deliveries:manage", "deliveries:read", "deliveries:settle", "gateway:metrics", "messages:read", "messages:write", "presence:read", "presence:write", "receipts:write", "status:read"];
|
|
8
8
|
type AuthorizationScope = typeof AUTHORIZATION_SCOPES[number];
|
|
9
|
-
type OperationId = "capabilities" | "status" | "client_status" | "gateway_metrics" | "publish_message" | "history" | "record_receipt" | "claim_delivery" | "list_deliveries" | "list_delivery_events" | "cancel_delivery" | "requeue_delivery" | "extend_delivery" | "acknowledge_delivery" | "negative_acknowledge_delivery" | "heartbeat" | "presence" | "sync";
|
|
9
|
+
type OperationId = "capabilities" | "status" | "client_status" | "gateway_metrics" | "publish_message" | "history" | "issue_endpoint_migration_challenge" | "consume_endpoint_migration_challenge" | "record_receipt" | "claim_delivery" | "list_deliveries" | "list_delivery_events" | "cancel_delivery" | "requeue_delivery" | "extend_delivery" | "acknowledge_delivery" | "negative_acknowledge_delivery" | "heartbeat" | "presence" | "sync";
|
|
10
10
|
|
|
11
11
|
interface AuthenticatedCredential {
|
|
12
12
|
id: string;
|
|
@@ -46,6 +46,7 @@ declare class PostgresGatewaySecurity implements GatewaySecurity {
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
interface RequestAuthorityContext {
|
|
49
|
+
gatewayAuthorityId: string;
|
|
49
50
|
credential: {
|
|
50
51
|
id: string;
|
|
51
52
|
principal: BridgePrincipal;
|
|
@@ -55,6 +56,29 @@ interface RequestAuthorityContext {
|
|
|
55
56
|
security: PostgresGatewaySecurity;
|
|
56
57
|
/** Establishes the savepoint separating durable security accounting from domain work. */
|
|
57
58
|
beginDomainWork(): Promise<void>;
|
|
59
|
+
endpointMigrationChallenges?: {
|
|
60
|
+
issue(input: {
|
|
61
|
+
challenge: string;
|
|
62
|
+
expectedGatewayAuthorityId: string;
|
|
63
|
+
verifierCredentialId: string;
|
|
64
|
+
}): Promise<{
|
|
65
|
+
gatewayAuthorityId: string;
|
|
66
|
+
issuerCredentialId: string;
|
|
67
|
+
verifierCredentialId: string;
|
|
68
|
+
expiresAt: string;
|
|
69
|
+
}>;
|
|
70
|
+
consume(input: {
|
|
71
|
+
challenge: string;
|
|
72
|
+
expectedGatewayAuthorityId: string;
|
|
73
|
+
issuerCredentialId: string;
|
|
74
|
+
}): Promise<{
|
|
75
|
+
gatewayAuthorityId: string;
|
|
76
|
+
issuerCredentialId: string;
|
|
77
|
+
verifierCredentialId: string;
|
|
78
|
+
expiresAt: string | null;
|
|
79
|
+
consumed: boolean;
|
|
80
|
+
}>;
|
|
81
|
+
};
|
|
58
82
|
}
|
|
59
83
|
interface RequestAuthority {
|
|
60
84
|
run<T>(credentialId: string, credentialHash: string, requestId: string, signal: AbortSignal, work: (context: RequestAuthorityContext) => Promise<T>): Promise<T>;
|
package/dist/gateway-main.js
CHANGED
|
@@ -7,14 +7,14 @@ import {
|
|
|
7
7
|
migrationsReady,
|
|
8
8
|
runMigrations,
|
|
9
9
|
runtimeSchemaReady
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-6BTJE6D4.js";
|
|
11
11
|
import "./chunk-VOQIDTCJ.js";
|
|
12
12
|
import {
|
|
13
13
|
PostgresCredentialResolver,
|
|
14
14
|
createGateway
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-3YHVUPU2.js";
|
|
16
16
|
import "./chunk-4VB44KJU.js";
|
|
17
|
-
import "./chunk-
|
|
17
|
+
import "./chunk-IHZFI7TH.js";
|
|
18
18
|
import "./chunk-BZLMF5O5.js";
|
|
19
19
|
|
|
20
20
|
// src/gateway-main.ts
|
|
@@ -58,6 +58,26 @@ var PostgresGatewaySecurity = class {
|
|
|
58
58
|
};
|
|
59
59
|
|
|
60
60
|
// src/postgres-request-authority.ts
|
|
61
|
+
function timestamp(value) {
|
|
62
|
+
if (value instanceof Date) return value.toISOString();
|
|
63
|
+
return String(value);
|
|
64
|
+
}
|
|
65
|
+
function endpointMigrationFailure(error) {
|
|
66
|
+
const sqlstate = typeof error === "object" && error !== null && "code" in error ? String(error.code ?? "") : "";
|
|
67
|
+
if (sqlstate === "28000") {
|
|
68
|
+
throw Object.assign(new Error("endpoint migration binding was rejected"), {
|
|
69
|
+
status: 409,
|
|
70
|
+
code: "endpoint_migration_binding_rejected"
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
if (sqlstate === "23505") {
|
|
74
|
+
throw Object.assign(new Error("endpoint migration challenge conflicts with existing state"), {
|
|
75
|
+
status: 409,
|
|
76
|
+
code: "endpoint_migration_challenge_conflict"
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
61
81
|
var MutationOutcomeUnknownError = class extends Error {
|
|
62
82
|
constructor() {
|
|
63
83
|
super("The database commit outcome is unknown");
|
|
@@ -83,8 +103,8 @@ var PostgresRequestAuthority = class {
|
|
|
83
103
|
await client.query("BEGIN");
|
|
84
104
|
transactionOpen = true;
|
|
85
105
|
const opened = await client.query(
|
|
86
|
-
`SELECT credential_id,workspace_id,principal,scopes
|
|
87
|
-
FROM agent_bridge.
|
|
106
|
+
`SELECT gateway_authority_id,credential_id,workspace_id,principal,scopes
|
|
107
|
+
FROM agent_bridge.open_request_authority_bound($1::uuid,$2::text,$3::uuid)`,
|
|
88
108
|
[credentialId, credentialHash, requestId]
|
|
89
109
|
);
|
|
90
110
|
const row = opened.rows[0];
|
|
@@ -95,6 +115,7 @@ var PostgresRequestAuthority = class {
|
|
|
95
115
|
}
|
|
96
116
|
if (signal.aborted) throw signal.reason;
|
|
97
117
|
const context = {
|
|
118
|
+
gatewayAuthorityId: row.gateway_authority_id,
|
|
98
119
|
credential: { id: row.credential_id, principal: { workspace: row.workspace_id, agent: row.principal }, scopes: row.scopes },
|
|
99
120
|
store: new PostgresBridgeStore(db),
|
|
100
121
|
security: new PostgresGatewaySecurity(db),
|
|
@@ -104,6 +125,49 @@ var PostgresRequestAuthority = class {
|
|
|
104
125
|
await client.query("SAVEPOINT agent_bridge_domain_work");
|
|
105
126
|
if (signal.aborted) throw signal.reason;
|
|
106
127
|
domainSavepoint = true;
|
|
128
|
+
},
|
|
129
|
+
endpointMigrationChallenges: {
|
|
130
|
+
issue: async (input) => {
|
|
131
|
+
let result;
|
|
132
|
+
try {
|
|
133
|
+
result = await client.query(
|
|
134
|
+
`SELECT gateway_authority_id,issuer_credential_id,verifier_credential_id,expires_at
|
|
135
|
+
FROM agent_bridge.issue_endpoint_migration_challenge($1::uuid,$2::uuid,$3::text)`,
|
|
136
|
+
[input.expectedGatewayAuthorityId, input.verifierCredentialId, input.challenge]
|
|
137
|
+
);
|
|
138
|
+
} catch (error) {
|
|
139
|
+
endpointMigrationFailure(error);
|
|
140
|
+
}
|
|
141
|
+
const row2 = result.rows[0];
|
|
142
|
+
if (!row2) throw new Error("endpoint migration challenge could not be issued");
|
|
143
|
+
return {
|
|
144
|
+
gatewayAuthorityId: row2.gateway_authority_id,
|
|
145
|
+
issuerCredentialId: row2.issuer_credential_id,
|
|
146
|
+
verifierCredentialId: row2.verifier_credential_id,
|
|
147
|
+
expiresAt: timestamp(row2.expires_at)
|
|
148
|
+
};
|
|
149
|
+
},
|
|
150
|
+
consume: async (input) => {
|
|
151
|
+
let result;
|
|
152
|
+
try {
|
|
153
|
+
result = await client.query(
|
|
154
|
+
`SELECT gateway_authority_id,issuer_credential_id,verifier_credential_id,expires_at,consumed
|
|
155
|
+
FROM agent_bridge.consume_endpoint_migration_challenge($1::uuid,$2::uuid,$3::text)`,
|
|
156
|
+
[input.expectedGatewayAuthorityId, input.issuerCredentialId, input.challenge]
|
|
157
|
+
);
|
|
158
|
+
} catch (error) {
|
|
159
|
+
endpointMigrationFailure(error);
|
|
160
|
+
}
|
|
161
|
+
const row2 = result.rows[0];
|
|
162
|
+
if (!row2) throw new Error("endpoint migration challenge could not be consumed");
|
|
163
|
+
return {
|
|
164
|
+
gatewayAuthorityId: row2.gateway_authority_id,
|
|
165
|
+
issuerCredentialId: row2.issuer_credential_id,
|
|
166
|
+
verifierCredentialId: row2.verifier_credential_id,
|
|
167
|
+
expiresAt: row2.expires_at === null ? null : timestamp(row2.expires_at),
|
|
168
|
+
consumed: row2.consumed
|
|
169
|
+
};
|
|
170
|
+
}
|
|
107
171
|
}
|
|
108
172
|
};
|
|
109
173
|
try {
|
package/dist/gateway-main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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":";;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,OAAO,QAAQ;;;ACyBR,IAAM,0BAAN,MAAyD;AAAA,EAC9D,YAA6B,IAAiB;AAAjB;AAAA,EAAkB;AAAA,EAEvC,aAAa,OAAe,SAAyB;AAC3D,WAAO,KAAK,GAAG,gBAAgB,QAAQ;AAAA,EACzC;AAAA,EAEA,MAAM,kBACJ,cACA,aACA,WACA,QACe;AACf,QAAI,QAAQ,QAAS,OAAM,OAAO;AAClC,UAAM,KAAK,GAAG;AAAA,MACZ,uBAAuB,KAAK,aAAa,uBAAuB,iCAAiC,CAAC;AAAA,MAClG,CAAC,cAAc,aAAa,SAAS;AAAA,IACvC;AACA,QAAI,QAAQ,QAAS,OAAM,OAAO;AAAA,EACpC;AAAA,EAEA,MAAM,QACJ,cACA,aACA,WACA,QAC4B;AAC5B,QAAI,QAAQ,QAAS,OAAM,OAAO;AAClC,UAAM,SAAS,MAAM,KAAK,GAAG;AAAA,MAO3B;AAAA,2BACqB,KAAK,aAAa,sBAAsB,gCAAgC,CAAC;AAAA,MAC9F,CAAC,cAAc,aAAa,SAAS;AAAA,IACvC;AACA,QAAI,QAAQ,QAAS,OAAM,OAAO;AAClC,UAAM,MAAM,OAAO,KAAK,CAAC;AACzB,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,8BAA8B;AACxD,WAAO;AAAA,MACL,SAAS,IAAI;AAAA,MACb,UAAU,IAAI;AAAA,MACd,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,WAAW,CAAC;AAAA,MAC1C,WAAW,KAAK,IAAI,GAAG,OAAO,IAAI,eAAe,CAAC;AAAA,MAClD,mBAAmB,KAAK,IAAI,GAAG,OAAO,IAAI,mBAAmB,CAAC;AAAA,IAChE;AAAA,EACF;AACF;;;ACnDO,IAAM,8BAAN,cAA0C,MAAM;AAAA,EAGrD,cAAc;AAAE,UAAM,wCAAwC;AAF9D,SAAS,SAAS;AAClB,SAAS,OAAO;AAAA,EACiD;AACnE;AAEO,IAAM,2BAAN,MAA2D;AAAA,EAChE,YAA6B,MAAgC;AAAhC;AAAA,EAAiC;AAAA,EAE9D,MAAM,IAAO,cAAsB,gBAAwB,WAAmB,QAAqB,MAAoE;AACrK,QAAI,OAAO,QAAS,OAAM,OAAO;AACjC,UAAM,SAAS,MAAM,KAAK,KAAK,QAAQ;AACvC,UAAM,KAAkB,EAAE,eAAe,MAAM,OAAO,CAAC,KAAK,WAAW,OAAO,MAAM,KAAK,MAAM,EAAE;AACjG,QAAI,kBAAkB;AACtB,QAAI,kBAAkB;AACtB,QAAI,mBAAmB;AACvB,QAAI,kBAAkB;AACtB,QAAI;AACJ,QAAI;AACF,UAAI,OAAO,QAAS,OAAM,OAAO;AACjC,YAAM,OAAO,MAAM,OAAO;AAC1B,wBAAkB;AAClB,YAAM,SAAS,MAAM,OAAO;AAAA,QAC1B;AAAA;AAAA,QAEA,CAAC,cAAc,gBAAgB,SAAS;AAAA,MAC1C;AACA,YAAM,MAAM,OAAO,KAAK,CAAC;AACzB,UAAI,CAAC,KAAK;AACR,cAAM,OAAO,MAAM,UAAU;AAC7B,0BAAkB;AAClB,cAAM,OAAO,OAAO,IAAI,MAAM,0BAA0B,GAAG,EAAE,QAAQ,KAAK,MAAM,eAAe,CAAC;AAAA,MAClG;AACA,UAAI,OAAO,QAAS,OAAM,OAAO;AACjC,YAAM,UAAmC;AAAA,QACvC,YAAY,EAAE,IAAI,IAAI,eAAe,WAAW,EAAE,WAAW,IAAI,cAAc,OAAO,IAAI,UAAU,GAAG,QAAQ,IAAI,OAAO;AAAA,QAC1H,OAAO,IAAI,oBAAoB,EAAE;AAAA,QACjC,UAAU,IAAI,wBAAwB,EAAE;AAAA,QACxC,iBAAiB,YAAY;AAC3B,cAAI,gBAAiB;AACrB,cAAI,OAAO,QAAS,OAAM,OAAO;AACjC,gBAAM,OAAO,MAAM,oCAAoC;AACvD,cAAI,OAAO,QAAS,OAAM,OAAO;AACjC,4BAAkB;AAAA,QACpB;AAAA,MACF;AACA,UAAI;AACF,cAAM,SAAS,MAAM,KAAK,OAAO;AACjC,YAAI,OAAO,QAAS,OAAM,OAAO;AACjC,cAAM,OAAO,MAAM,+CAA+C;AAClE,YAAI,OAAO,QAAS,OAAM,OAAO;AACjC,2BAAmB;AACnB,cAAM,OAAO,MAAM,QAAQ;AAC3B,0BAAkB;AAClB,0BAAkB;AAClB,eAAO;AAAA,MACT,SAAS,OAAO;AACd,YAAI,iBAAkB,OAAM,IAAI,4BAA4B;AAC5D,YAAI,OAAO,QAAS,OAAM;AAC1B,YAAI;AACF,cAAI,iBAAiB;AACnB,kBAAM,OAAO,MAAM,gDAAgD;AAAA,UACrE;AACA,gBAAM,OAAO,MAAM,+CAA+C;AAAA,QACpE,QAAQ;AACN,cAAI;AACF,kBAAM,OAAO,MAAM,UAAU;AAAA,UAC/B,SAAS,eAAe;AACtB,sBAAU,yBAAyB,QAAQ,gBAAgB,IAAI,MAAM,OAAO,aAAa,CAAC;AAAA,UAC5F;AACA,4BAAkB;AAClB,gBAAM;AAAA,QACR;AACA,YAAI,OAAO,QAAS,OAAM,OAAO;AACjC,2BAAmB;AACnB,cAAM,OAAO,MAAM,QAAQ;AAC3B,0BAAkB;AAClB,0BAAkB;AAClB,cAAM;AAAA,MACR;AAAA,IACF,SAAS,OAAO;AACd,UAAI,oBAAoB,CAAC,iBAAiB;AACxC,kBAAU,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAClE,cAAM,iBAAiB,8BAA8B,QAAQ,IAAI,4BAA4B;AAAA,MAC/F;AACA,UAAI,iBAAiB;AACnB,YAAI;AAAE,gBAAM,OAAO,MAAM,UAAU;AAAG,4BAAkB;AAAA,QAAO,SACxD,eAAe;AAAE,oBAAU,yBAAyB,QAAQ,gBAAgB,IAAI,MAAM,OAAO,aAAa,CAAC;AAAA,QAAG;AAAA,MACvH;AACA,YAAM;AAAA,IACR,UAAE;AACA,aAAO,QAAQ,OAAO;AAAA,IACxB;AAAA,EACF;AAEF;;;AF1GA,SAAS,QAAQ,OAA2B,UAAkB,MAAsB;AAClF,MAAI,UAAU,OAAW,QAAO;AAChC,QAAM,SAAS,OAAO,KAAK;AAC3B,MAAI,CAAC,OAAO,cAAc,MAAM,KAAK,SAAS,EAAG,OAAM,IAAI,MAAM,GAAG,IAAI,6BAA6B;AACrG,SAAO;AACT;AAEA,eAAe,OAAsB;AACnC,QAAM,sBAAsB,cAAc,IAAI,IAAI,qBAAqB,YAAY,GAAG,CAAC;AACvF,MAAI,QAAQ,KAAK,SAAS,gBAAgB,GAAG;AAC3C,UAAMA,eAAc,QAAQ,IAAI;AAChC,QAAI,CAACA,aAAa,OAAM,IAAI,MAAM,sDAAsD;AACxF,UAAM,gBAAgB,IAAI,GAAG,KAAK;AAAA,MAChC,kBAAkBA;AAAA,MAClB,KAAK;AAAA,MACL,kBAAkB;AAAA,IACpB,CAAC;AACD,QAAI;AACF,YAAM,cAAc,eAAe,mBAAmB;AAAA,IACxD,UAAE;AACA,YAAM,cAAc,IAAI;AAAA,IAC1B;AACA;AAAA,EACF;AACA,MAAI,QAAQ,IAAI,yBAAyB,KAAK;AAC5C,UAAM,IAAI,MAAM,4EAA4E;AAAA,EAC9F;AACA,QAAM,cAAc,QAAQ,IAAI;AAChC,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI,MAAM,+DAA+D;AAAA,EACjF;AAEA,QAAM,WAAW,QAAQ,QAAQ,IAAI,kCAAkC,KAAQ,kBAAkB;AACjG,QAAM,kBAAkB;AAAA,IACtB,QAAQ,IAAI;AAAA,IACZ,KAAK,IAAI,GAAG,KAAK,MAAM,WAAW,CAAC,CAAC;AAAA,IACpC;AAAA,EACF;AACA,QAAM,WAAW,QAAQ,QAAQ,IAAI,iCAAiC,IAAI,oBAAoB;AAC9F,QAAM,iBAAiB;AAAA,IACrB,QAAQ,IAAI;AAAA,IACZ,MAAM;AAAA,IACN;AAAA,EACF;AACA,QAAM,OAAO,QAAQ,IAAI,qBAAqB;AAC9C,QAAM,OAAO,QAAQ,QAAQ,IAAI,mBAAmB,MAAM,cAAc;AACxE,QAAM,iBAAiB,QAAQ,IAAI,8BAC/B,MAAM,GAAG,EACV,IAAI,CAAC,WAAW,OAAO,KAAK,CAAC,EAC7B,OAAO,OAAO;AACjB,QAAM,gBAAgB,MAAM,kBAAkB,mBAAmB;AACjE,QAAM,OAAO,IAAI,GAAG,KAAK;AAAA,IACvB,kBAAkB;AAAA,IAClB,KAAK;AAAA,IACL,yBAAyB;AAAA,IACzB,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,EACpB,CAAC;AACD,QAAM,gBAAgB,IAAI,GAAG,KAAK;AAAA,IAChC,kBAAkB;AAAA,IAClB,KAAK;AAAA,IACL,yBAAyB;AAAA,IACzB,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,EACpB,CAAC;AAED,QAAM,QAAQ,IAAI,oBAAoB,IAAI;AAC1C,MAAI,qBAAqB;AACzB,MAAI,iBAAiB;AACrB,MAAI;AACJ,QAAM,cAAc,YAClB,MAAM,gBAAgB,eAAe,aAAa,KAAK,MAAM,mBAAmB,aAAa;AAC/F,QAAM,cAAc,CAAC,QAAQ,UAA4B;AACvD,QAAI,CAAC,SAAS,KAAK,IAAI,IAAI,qBAAqB,KAAO;AACrD,aAAO,QAAQ,QAAQ,cAAc;AAAA,IACvC;AACA,QAAI,kBAAmB,QAAO;AAC9B,QAAI;AACJ,cAAU,YAAY,EACnB,KAAK,CAAC,UAAU;AACf,uBAAiB;AACjB,2BAAqB,KAAK,IAAI;AAC9B,aAAO;AAAA,IACT,CAAC,EACA,QAAQ,MAAM;AACb,UAAI,sBAAsB,QAAS,qBAAoB;AAAA,IACzD,CAAC;AACH,wBAAoB;AACpB,WAAO;AAAA,EACT;AACA,MAAI;AACF,QAAI,CAAC,MAAM,YAAY,IAAI,GAAG;AAC5B,YAAM,IAAI,MAAM,0DAA0D;AAAA,IAC5E;AAAA,EACF,SAAS,OAAO;AACd,UAAM,QAAQ,WAAW,CAAC,KAAK,IAAI,GAAG,cAAc,IAAI,CAAC,CAAC;AAC1D,UAAM;AAAA,EACR;AACA,QAAM,UAAU,cAAc;AAAA,IAC5B;AAAA,IACA,aAAa,IAAI,2BAA2B,IAAI;AAAA,IAChD,UAAU,IAAI,wBAAwB,IAAI;AAAA,IAC1C,kBAAkB,IAAI,yBAAyB,IAAI;AAAA,IACnD;AAAA,IACA;AAAA,IACA,mBAAmB;AAAA,IACnB,OAAO;AAAA,IACP,mBAAmB;AAAA,EACrB,CAAC;AAED,UAAQ,OAAO,MAAM,MAAM,MAAM;AAC/B,YAAQ,OAAO,MAAM,qCAAqC,IAAI,IAAI,IAAI;AAAA,CAAI;AAAA,EAC5E,CAAC;AAED,MAAI,WAAW;AACf,iBAAe,WAA0B;AACvC,QAAI,SAAU;AACd,eAAW;AACX,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,cAAQ,MAAM,CAAC,UAAU,QAAQ,OAAO,KAAK,IAAI,QAAQ,CAAC;AAAA,IAC5D,CAAC;AACD,UAAM,QAAQ,IAAI,CAAC,KAAK,IAAI,GAAG,cAAc,IAAI,CAAC,CAAC;AAAA,EACrD;AAEA,UAAQ,KAAK,UAAU,MAAM,KAAK,SAAS,CAAC;AAC5C,UAAQ,KAAK,WAAW,MAAM,KAAK,SAAS,CAAC;AAC/C;AAEA,KAAK,KAAK,EAAE,MAAM,CAAC,UAAU;AAC3B,UAAQ,OAAO,MAAM,GAAG,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,CAAI;AAClF,UAAQ,WAAW;AACrB,CAAC;","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 gatewayAuthorityId: string;\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 endpointMigrationChallenges?: {\n issue(input: { challenge: string; expectedGatewayAuthorityId: string; verifierCredentialId: string }): Promise<{ gatewayAuthorityId: string; issuerCredentialId: string; verifierCredentialId: string; expiresAt: string }>;\n consume(input: { challenge: string; expectedGatewayAuthorityId: string; issuerCredentialId: string }): Promise<{ gatewayAuthorityId: string; issuerCredentialId: string; verifierCredentialId: string; expiresAt: string | null; consumed: boolean }>;\n };\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 gateway_authority_id: string;\n credential_id: string;\n workspace_id: string;\n principal: string;\n scopes: AuthorizationScope[];\n};\n\nfunction timestamp(value: unknown): string {\n if (value instanceof Date) return value.toISOString();\n return String(value);\n}\n\nfunction endpointMigrationFailure(error: unknown): never {\n const sqlstate = typeof error === \"object\" && error !== null && \"code\" in error\n ? String((error as { code?: unknown }).code ?? \"\")\n : \"\";\n if (sqlstate === \"28000\") {\n throw Object.assign(new Error(\"endpoint migration binding was rejected\"), {\n status: 409,\n code: \"endpoint_migration_binding_rejected\",\n });\n }\n if (sqlstate === \"23505\") {\n throw Object.assign(new Error(\"endpoint migration challenge conflicts with existing state\"), {\n status: 409,\n code: \"endpoint_migration_challenge_conflict\",\n });\n }\n throw error;\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 gateway_authority_id,credential_id,workspace_id,principal,scopes\n FROM agent_bridge.open_request_authority_bound($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 gatewayAuthorityId: row.gateway_authority_id,\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 endpointMigrationChallenges: {\n issue: async (input) => {\n let result;\n try {\n result = await client.query<{\n gateway_authority_id: string;\n issuer_credential_id: string;\n verifier_credential_id: string;\n expires_at: string | Date;\n }>(\n `SELECT gateway_authority_id,issuer_credential_id,verifier_credential_id,expires_at\n FROM agent_bridge.issue_endpoint_migration_challenge($1::uuid,$2::uuid,$3::text)`,\n [input.expectedGatewayAuthorityId, input.verifierCredentialId, input.challenge],\n );\n } catch (error) {\n endpointMigrationFailure(error);\n }\n const row = result.rows[0];\n if (!row) throw new Error(\"endpoint migration challenge could not be issued\");\n return {\n gatewayAuthorityId: row.gateway_authority_id,\n issuerCredentialId: row.issuer_credential_id,\n verifierCredentialId: row.verifier_credential_id,\n expiresAt: timestamp(row.expires_at),\n };\n },\n consume: async (input) => {\n let result;\n try {\n result = await client.query<{\n gateway_authority_id: string;\n issuer_credential_id: string;\n verifier_credential_id: string;\n expires_at: string | Date | null;\n consumed: boolean;\n }>(\n `SELECT gateway_authority_id,issuer_credential_id,verifier_credential_id,expires_at,consumed\n FROM agent_bridge.consume_endpoint_migration_challenge($1::uuid,$2::uuid,$3::text)`,\n [input.expectedGatewayAuthorityId, input.issuerCredentialId, input.challenge],\n );\n } catch (error) {\n endpointMigrationFailure(error);\n }\n const row = result.rows[0];\n if (!row) throw new Error(\"endpoint migration challenge could not be consumed\");\n return {\n gatewayAuthorityId: row.gateway_authority_id,\n issuerCredentialId: row.issuer_credential_id,\n verifierCredentialId: row.verifier_credential_id,\n expiresAt: row.expires_at === null ? null : timestamp(row.expires_at),\n consumed: row.consumed,\n };\n },\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":";;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,OAAO,QAAQ;;;ACyBR,IAAM,0BAAN,MAAyD;AAAA,EAC9D,YAA6B,IAAiB;AAAjB;AAAA,EAAkB;AAAA,EAEvC,aAAa,OAAe,SAAyB;AAC3D,WAAO,KAAK,GAAG,gBAAgB,QAAQ;AAAA,EACzC;AAAA,EAEA,MAAM,kBACJ,cACA,aACA,WACA,QACe;AACf,QAAI,QAAQ,QAAS,OAAM,OAAO;AAClC,UAAM,KAAK,GAAG;AAAA,MACZ,uBAAuB,KAAK,aAAa,uBAAuB,iCAAiC,CAAC;AAAA,MAClG,CAAC,cAAc,aAAa,SAAS;AAAA,IACvC;AACA,QAAI,QAAQ,QAAS,OAAM,OAAO;AAAA,EACpC;AAAA,EAEA,MAAM,QACJ,cACA,aACA,WACA,QAC4B;AAC5B,QAAI,QAAQ,QAAS,OAAM,OAAO;AAClC,UAAM,SAAS,MAAM,KAAK,GAAG;AAAA,MAO3B;AAAA,2BACqB,KAAK,aAAa,sBAAsB,gCAAgC,CAAC;AAAA,MAC9F,CAAC,cAAc,aAAa,SAAS;AAAA,IACvC;AACA,QAAI,QAAQ,QAAS,OAAM,OAAO;AAClC,UAAM,MAAM,OAAO,KAAK,CAAC;AACzB,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,8BAA8B;AACxD,WAAO;AAAA,MACL,SAAS,IAAI;AAAA,MACb,UAAU,IAAI;AAAA,MACd,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,WAAW,CAAC;AAAA,MAC1C,WAAW,KAAK,IAAI,GAAG,OAAO,IAAI,eAAe,CAAC;AAAA,MAClD,mBAAmB,KAAK,IAAI,GAAG,OAAO,IAAI,mBAAmB,CAAC;AAAA,IAChE;AAAA,EACF;AACF;;;AC7CA,SAAS,UAAU,OAAwB;AACzC,MAAI,iBAAiB,KAAM,QAAO,MAAM,YAAY;AACpD,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,yBAAyB,OAAuB;AACvD,QAAM,WAAW,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,QACtE,OAAQ,MAA6B,QAAQ,EAAE,IAC/C;AACJ,MAAI,aAAa,SAAS;AACxB,UAAM,OAAO,OAAO,IAAI,MAAM,yCAAyC,GAAG;AAAA,MACxE,QAAQ;AAAA,MACR,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACA,MAAI,aAAa,SAAS;AACxB,UAAM,OAAO,OAAO,IAAI,MAAM,4DAA4D,GAAG;AAAA,MAC3F,QAAQ;AAAA,MACR,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACA,QAAM;AACR;AAEO,IAAM,8BAAN,cAA0C,MAAM;AAAA,EAGrD,cAAc;AAAE,UAAM,wCAAwC;AAF9D,SAAS,SAAS;AAClB,SAAS,OAAO;AAAA,EACiD;AACnE;AAEO,IAAM,2BAAN,MAA2D;AAAA,EAChE,YAA6B,MAAgC;AAAhC;AAAA,EAAiC;AAAA,EAE9D,MAAM,IAAO,cAAsB,gBAAwB,WAAmB,QAAqB,MAAoE;AACrK,QAAI,OAAO,QAAS,OAAM,OAAO;AACjC,UAAM,SAAS,MAAM,KAAK,KAAK,QAAQ;AACvC,UAAM,KAAkB,EAAE,eAAe,MAAM,OAAO,CAAC,KAAK,WAAW,OAAO,MAAM,KAAK,MAAM,EAAE;AACjG,QAAI,kBAAkB;AACtB,QAAI,kBAAkB;AACtB,QAAI,mBAAmB;AACvB,QAAI,kBAAkB;AACtB,QAAI;AACJ,QAAI;AACF,UAAI,OAAO,QAAS,OAAM,OAAO;AACjC,YAAM,OAAO,MAAM,OAAO;AAC1B,wBAAkB;AAClB,YAAM,SAAS,MAAM,OAAO;AAAA,QAC1B;AAAA;AAAA,QAEA,CAAC,cAAc,gBAAgB,SAAS;AAAA,MAC1C;AACA,YAAM,MAAM,OAAO,KAAK,CAAC;AACzB,UAAI,CAAC,KAAK;AACR,cAAM,OAAO,MAAM,UAAU;AAC7B,0BAAkB;AAClB,cAAM,OAAO,OAAO,IAAI,MAAM,0BAA0B,GAAG,EAAE,QAAQ,KAAK,MAAM,eAAe,CAAC;AAAA,MAClG;AACA,UAAI,OAAO,QAAS,OAAM,OAAO;AACjC,YAAM,UAAmC;AAAA,QACvC,oBAAoB,IAAI;AAAA,QACxB,YAAY,EAAE,IAAI,IAAI,eAAe,WAAW,EAAE,WAAW,IAAI,cAAc,OAAO,IAAI,UAAU,GAAG,QAAQ,IAAI,OAAO;AAAA,QAC1H,OAAO,IAAI,oBAAoB,EAAE;AAAA,QACjC,UAAU,IAAI,wBAAwB,EAAE;AAAA,QACxC,iBAAiB,YAAY;AAC3B,cAAI,gBAAiB;AACrB,cAAI,OAAO,QAAS,OAAM,OAAO;AACjC,gBAAM,OAAO,MAAM,oCAAoC;AACvD,cAAI,OAAO,QAAS,OAAM,OAAO;AACjC,4BAAkB;AAAA,QACpB;AAAA,QACA,6BAA6B;AAAA,UAC3B,OAAO,OAAO,UAAU;AACtB,gBAAI;AACJ,gBAAI;AACF,uBAAS,MAAM,OAAO;AAAA,gBAMpB;AAAA;AAAA,gBAEA,CAAC,MAAM,4BAA4B,MAAM,sBAAsB,MAAM,SAAS;AAAA,cAChF;AAAA,YACF,SAAS,OAAO;AACd,uCAAyB,KAAK;AAAA,YAChC;AACA,kBAAMA,OAAM,OAAO,KAAK,CAAC;AACzB,gBAAI,CAACA,KAAK,OAAM,IAAI,MAAM,kDAAkD;AAC5E,mBAAO;AAAA,cACL,oBAAoBA,KAAI;AAAA,cACxB,oBAAoBA,KAAI;AAAA,cACxB,sBAAsBA,KAAI;AAAA,cAC1B,WAAW,UAAUA,KAAI,UAAU;AAAA,YACrC;AAAA,UACF;AAAA,UACA,SAAS,OAAO,UAAU;AACxB,gBAAI;AACJ,gBAAI;AACF,uBAAS,MAAM,OAAO;AAAA,gBAOpB;AAAA;AAAA,gBAEA,CAAC,MAAM,4BAA4B,MAAM,oBAAoB,MAAM,SAAS;AAAA,cAC9E;AAAA,YACF,SAAS,OAAO;AACd,uCAAyB,KAAK;AAAA,YAChC;AACA,kBAAMA,OAAM,OAAO,KAAK,CAAC;AACzB,gBAAI,CAACA,KAAK,OAAM,IAAI,MAAM,oDAAoD;AAC9E,mBAAO;AAAA,cACL,oBAAoBA,KAAI;AAAA,cACxB,oBAAoBA,KAAI;AAAA,cACxB,sBAAsBA,KAAI;AAAA,cAC1B,WAAWA,KAAI,eAAe,OAAO,OAAO,UAAUA,KAAI,UAAU;AAAA,cACpE,UAAUA,KAAI;AAAA,YAChB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,UAAI;AACF,cAAM,SAAS,MAAM,KAAK,OAAO;AACjC,YAAI,OAAO,QAAS,OAAM,OAAO;AACjC,cAAM,OAAO,MAAM,+CAA+C;AAClE,YAAI,OAAO,QAAS,OAAM,OAAO;AACjC,2BAAmB;AACnB,cAAM,OAAO,MAAM,QAAQ;AAC3B,0BAAkB;AAClB,0BAAkB;AAClB,eAAO;AAAA,MACT,SAAS,OAAO;AACd,YAAI,iBAAkB,OAAM,IAAI,4BAA4B;AAC5D,YAAI,OAAO,QAAS,OAAM;AAC1B,YAAI;AACF,cAAI,iBAAiB;AACnB,kBAAM,OAAO,MAAM,gDAAgD;AAAA,UACrE;AACA,gBAAM,OAAO,MAAM,+CAA+C;AAAA,QACpE,QAAQ;AACN,cAAI;AACF,kBAAM,OAAO,MAAM,UAAU;AAAA,UAC/B,SAAS,eAAe;AACtB,sBAAU,yBAAyB,QAAQ,gBAAgB,IAAI,MAAM,OAAO,aAAa,CAAC;AAAA,UAC5F;AACA,4BAAkB;AAClB,gBAAM;AAAA,QACR;AACA,YAAI,OAAO,QAAS,OAAM,OAAO;AACjC,2BAAmB;AACnB,cAAM,OAAO,MAAM,QAAQ;AAC3B,0BAAkB;AAClB,0BAAkB;AAClB,cAAM;AAAA,MACR;AAAA,IACF,SAAS,OAAO;AACd,UAAI,oBAAoB,CAAC,iBAAiB;AACxC,kBAAU,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAClE,cAAM,iBAAiB,8BAA8B,QAAQ,IAAI,4BAA4B;AAAA,MAC/F;AACA,UAAI,iBAAiB;AACnB,YAAI;AAAE,gBAAM,OAAO,MAAM,UAAU;AAAG,4BAAkB;AAAA,QAAO,SACxD,eAAe;AAAE,oBAAU,yBAAyB,QAAQ,gBAAgB,IAAI,MAAM,OAAO,aAAa,CAAC;AAAA,QAAG;AAAA,MACvH;AACA,YAAM;AAAA,IACR,UAAE;AACA,aAAO,QAAQ,OAAO;AAAA,IACxB;AAAA,EACF;AAEF;;;AF/LA,SAAS,QAAQ,OAA2B,UAAkB,MAAsB;AAClF,MAAI,UAAU,OAAW,QAAO;AAChC,QAAM,SAAS,OAAO,KAAK;AAC3B,MAAI,CAAC,OAAO,cAAc,MAAM,KAAK,SAAS,EAAG,OAAM,IAAI,MAAM,GAAG,IAAI,6BAA6B;AACrG,SAAO;AACT;AAEA,eAAe,OAAsB;AACnC,QAAM,sBAAsB,cAAc,IAAI,IAAI,qBAAqB,YAAY,GAAG,CAAC;AACvF,MAAI,QAAQ,KAAK,SAAS,gBAAgB,GAAG;AAC3C,UAAMC,eAAc,QAAQ,IAAI;AAChC,QAAI,CAACA,aAAa,OAAM,IAAI,MAAM,sDAAsD;AACxF,UAAM,gBAAgB,IAAI,GAAG,KAAK;AAAA,MAChC,kBAAkBA;AAAA,MAClB,KAAK;AAAA,MACL,kBAAkB;AAAA,IACpB,CAAC;AACD,QAAI;AACF,YAAM,cAAc,eAAe,mBAAmB;AAAA,IACxD,UAAE;AACA,YAAM,cAAc,IAAI;AAAA,IAC1B;AACA;AAAA,EACF;AACA,MAAI,QAAQ,IAAI,yBAAyB,KAAK;AAC5C,UAAM,IAAI,MAAM,4EAA4E;AAAA,EAC9F;AACA,QAAM,cAAc,QAAQ,IAAI;AAChC,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI,MAAM,+DAA+D;AAAA,EACjF;AAEA,QAAM,WAAW,QAAQ,QAAQ,IAAI,kCAAkC,KAAQ,kBAAkB;AACjG,QAAM,kBAAkB;AAAA,IACtB,QAAQ,IAAI;AAAA,IACZ,KAAK,IAAI,GAAG,KAAK,MAAM,WAAW,CAAC,CAAC;AAAA,IACpC;AAAA,EACF;AACA,QAAM,WAAW,QAAQ,QAAQ,IAAI,iCAAiC,IAAI,oBAAoB;AAC9F,QAAM,iBAAiB;AAAA,IACrB,QAAQ,IAAI;AAAA,IACZ,MAAM;AAAA,IACN;AAAA,EACF;AACA,QAAM,OAAO,QAAQ,IAAI,qBAAqB;AAC9C,QAAM,OAAO,QAAQ,QAAQ,IAAI,mBAAmB,MAAM,cAAc;AACxE,QAAM,iBAAiB,QAAQ,IAAI,8BAC/B,MAAM,GAAG,EACV,IAAI,CAAC,WAAW,OAAO,KAAK,CAAC,EAC7B,OAAO,OAAO;AACjB,QAAM,gBAAgB,MAAM,kBAAkB,mBAAmB;AACjE,QAAM,OAAO,IAAI,GAAG,KAAK;AAAA,IACvB,kBAAkB;AAAA,IAClB,KAAK;AAAA,IACL,yBAAyB;AAAA,IACzB,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,EACpB,CAAC;AACD,QAAM,gBAAgB,IAAI,GAAG,KAAK;AAAA,IAChC,kBAAkB;AAAA,IAClB,KAAK;AAAA,IACL,yBAAyB;AAAA,IACzB,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,EACpB,CAAC;AAED,QAAM,QAAQ,IAAI,oBAAoB,IAAI;AAC1C,MAAI,qBAAqB;AACzB,MAAI,iBAAiB;AACrB,MAAI;AACJ,QAAM,cAAc,YAClB,MAAM,gBAAgB,eAAe,aAAa,KAAK,MAAM,mBAAmB,aAAa;AAC/F,QAAM,cAAc,CAAC,QAAQ,UAA4B;AACvD,QAAI,CAAC,SAAS,KAAK,IAAI,IAAI,qBAAqB,KAAO;AACrD,aAAO,QAAQ,QAAQ,cAAc;AAAA,IACvC;AACA,QAAI,kBAAmB,QAAO;AAC9B,QAAI;AACJ,cAAU,YAAY,EACnB,KAAK,CAAC,UAAU;AACf,uBAAiB;AACjB,2BAAqB,KAAK,IAAI;AAC9B,aAAO;AAAA,IACT,CAAC,EACA,QAAQ,MAAM;AACb,UAAI,sBAAsB,QAAS,qBAAoB;AAAA,IACzD,CAAC;AACH,wBAAoB;AACpB,WAAO;AAAA,EACT;AACA,MAAI;AACF,QAAI,CAAC,MAAM,YAAY,IAAI,GAAG;AAC5B,YAAM,IAAI,MAAM,0DAA0D;AAAA,IAC5E;AAAA,EACF,SAAS,OAAO;AACd,UAAM,QAAQ,WAAW,CAAC,KAAK,IAAI,GAAG,cAAc,IAAI,CAAC,CAAC;AAC1D,UAAM;AAAA,EACR;AACA,QAAM,UAAU,cAAc;AAAA,IAC5B;AAAA,IACA,aAAa,IAAI,2BAA2B,IAAI;AAAA,IAChD,UAAU,IAAI,wBAAwB,IAAI;AAAA,IAC1C,kBAAkB,IAAI,yBAAyB,IAAI;AAAA,IACnD;AAAA,IACA;AAAA,IACA,mBAAmB;AAAA,IACnB,OAAO;AAAA,IACP,mBAAmB;AAAA,EACrB,CAAC;AAED,UAAQ,OAAO,MAAM,MAAM,MAAM;AAC/B,YAAQ,OAAO,MAAM,qCAAqC,IAAI,IAAI,IAAI;AAAA,CAAI;AAAA,EAC5E,CAAC;AAED,MAAI,WAAW;AACf,iBAAe,WAA0B;AACvC,QAAI,SAAU;AACd,eAAW;AACX,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,cAAQ,MAAM,CAAC,UAAU,QAAQ,OAAO,KAAK,IAAI,QAAQ,CAAC;AAAA,IAC5D,CAAC;AACD,UAAM,QAAQ,IAAI,CAAC,KAAK,IAAI,GAAG,cAAc,IAAI,CAAC,CAAC;AAAA,EACrD;AAEA,UAAQ,KAAK,UAAU,MAAM,KAAK,SAAS,CAAC;AAC5C,UAAQ,KAAK,WAAW,MAAM,KAAK,SAAS,CAAC;AAC/C;AAEA,KAAK,KAAK,EAAE,MAAM,CAAC,UAAU;AAC3B,UAAQ,OAAO,MAAM,GAAG,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,CAAI;AAClF,UAAQ,WAAW;AACrB,CAAC;","names":["row","databaseUrl"]}
|
package/dist/gateway.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import 'node:http';
|
|
2
|
-
import './bridge-store-
|
|
3
|
-
export { G as GatewayOptions, c as createGateway } from './gateway-
|
|
2
|
+
import './bridge-store-Boaj-ZbO.js';
|
|
3
|
+
export { G as GatewayOptions, c as createGateway } from './gateway-BQHpV-MZ.js';
|
|
4
4
|
import './bridge-domain-CBX3IVqC.js';
|
|
5
|
-
import './postgres-bridge-store-
|
|
5
|
+
import './postgres-bridge-store-WASumj26.js';
|
package/dist/gateway.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
createGateway
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-3YHVUPU2.js";
|
|
5
5
|
import "./chunk-4VB44KJU.js";
|
|
6
|
-
import "./chunk-
|
|
6
|
+
import "./chunk-IHZFI7TH.js";
|
|
7
7
|
import "./chunk-BZLMF5O5.js";
|
|
8
8
|
export {
|
|
9
9
|
createGateway
|
package/dist/index.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
startServer
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-SYGONYMM.js";
|
|
5
5
|
import "./chunk-2EVLG3YA.js";
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
6
|
+
import "./chunk-MCKKVNCE.js";
|
|
7
|
+
import "./chunk-LAHNQZDN.js";
|
|
8
|
+
import "./chunk-SV3SVBYS.js";
|
|
9
|
+
import "./chunk-DQOZJJZ2.js";
|
|
10
|
+
import "./chunk-GTK4KOED.js";
|
|
11
11
|
import "./chunk-VOQIDTCJ.js";
|
|
12
12
|
import "./chunk-4VB44KJU.js";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-IHZFI7TH.js";
|
|
14
14
|
import "./chunk-BZLMF5O5.js";
|
|
15
15
|
|
|
16
16
|
// src/index.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
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-
|
|
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-Boaj-ZbO.js';
|
|
3
3
|
|
|
4
4
|
interface PgQueryable {
|
|
5
5
|
query<T extends Record<string, unknown> = Record<string, unknown>>(sql: string, values?: unknown[]): Promise<{
|
package/dist/server.js
CHANGED
|
@@ -4,16 +4,16 @@ import {
|
|
|
4
4
|
configFromEnv,
|
|
5
5
|
createAgentBridgeServer,
|
|
6
6
|
startServer
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-SYGONYMM.js";
|
|
8
8
|
import "./chunk-2EVLG3YA.js";
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-MCKKVNCE.js";
|
|
10
|
+
import "./chunk-LAHNQZDN.js";
|
|
11
|
+
import "./chunk-SV3SVBYS.js";
|
|
12
|
+
import "./chunk-DQOZJJZ2.js";
|
|
13
|
+
import "./chunk-GTK4KOED.js";
|
|
14
14
|
import "./chunk-VOQIDTCJ.js";
|
|
15
15
|
import "./chunk-4VB44KJU.js";
|
|
16
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-IHZFI7TH.js";
|
|
17
17
|
import "./chunk-BZLMF5O5.js";
|
|
18
18
|
export {
|
|
19
19
|
MCP_IMPLEMENTATION_VERSION,
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { b as BridgeMessage, c as BridgePrincipal } from './bridge-domain-CBX3IVqC.js';
|
|
2
|
+
import { d as MessageQuery, M as MessagePage } from './bridge-store-Boaj-ZbO.js';
|
|
3
|
+
|
|
4
|
+
type PendingMessage = Omit<BridgeMessage, "sequence" | "createdAt">;
|
|
5
|
+
interface EdgeScope {
|
|
6
|
+
endpoint: string;
|
|
7
|
+
principal: BridgePrincipal;
|
|
8
|
+
}
|
|
9
|
+
/** A side-effect-free inspection used by migration dry-runs and preflight gates. */
|
|
10
|
+
interface EdgeReadOnlyInspection {
|
|
11
|
+
exists: boolean;
|
|
12
|
+
gate: EdgeMigrationGate;
|
|
13
|
+
pending: number;
|
|
14
|
+
due: number;
|
|
15
|
+
scheduled: number;
|
|
16
|
+
leased: number;
|
|
17
|
+
blocked: number;
|
|
18
|
+
cached: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Inspect an edge without creating a database, a schema object, or a WAL sidecar.
|
|
22
|
+
* An absent path has the same empty active state that initialization would create.
|
|
23
|
+
*/
|
|
24
|
+
declare function inspectEdgeScopeReadOnly(path: string, scope: EdgeScope, now?: Date): EdgeReadOnlyInspection;
|
|
25
|
+
interface EdgeOutboxRecord {
|
|
26
|
+
position: number;
|
|
27
|
+
draft: PendingMessage;
|
|
28
|
+
payloadHash: string;
|
|
29
|
+
attempts: number;
|
|
30
|
+
leaseToken: string;
|
|
31
|
+
createdAt: string;
|
|
32
|
+
}
|
|
33
|
+
interface EdgeEnqueueResult {
|
|
34
|
+
draft: PendingMessage;
|
|
35
|
+
created: boolean;
|
|
36
|
+
}
|
|
37
|
+
interface EdgeStats {
|
|
38
|
+
pending: number;
|
|
39
|
+
due: number;
|
|
40
|
+
scheduled: number;
|
|
41
|
+
leased: number;
|
|
42
|
+
blocked: number;
|
|
43
|
+
cached: number;
|
|
44
|
+
pullCursor?: string;
|
|
45
|
+
lastSyncAt?: string;
|
|
46
|
+
lastError?: string;
|
|
47
|
+
oldestDueAt?: string;
|
|
48
|
+
queueLagMs: number;
|
|
49
|
+
oldestBlockedAt?: string;
|
|
50
|
+
blockedAgeMs: number | null;
|
|
51
|
+
blockedMaxAttempts: number;
|
|
52
|
+
blockedLastError?: string;
|
|
53
|
+
nextRetryAt?: string;
|
|
54
|
+
lastOutboundSyncAt?: string;
|
|
55
|
+
lastInboundSyncAt?: string;
|
|
56
|
+
lastAttemptAt?: string;
|
|
57
|
+
migrationState: EdgeMigrationGateState;
|
|
58
|
+
migrationOperationId?: string;
|
|
59
|
+
migrationLeaseExpiresAt?: string;
|
|
60
|
+
}
|
|
61
|
+
type EdgeMigrationGateState = "active" | "draining" | "retired";
|
|
62
|
+
interface EdgeMigrationGate {
|
|
63
|
+
scopeKey: string;
|
|
64
|
+
state: EdgeMigrationGateState;
|
|
65
|
+
operationId?: string;
|
|
66
|
+
leaseExpiresAt?: string;
|
|
67
|
+
updatedAt: string;
|
|
68
|
+
}
|
|
69
|
+
interface EdgeDrainLease {
|
|
70
|
+
scopeKey: string;
|
|
71
|
+
operationId: string;
|
|
72
|
+
leaseToken: string;
|
|
73
|
+
leaseExpiresAt: string;
|
|
74
|
+
}
|
|
75
|
+
declare class EdgeConflictError extends Error {
|
|
76
|
+
readonly code = "edge_idempotency_conflict";
|
|
77
|
+
}
|
|
78
|
+
declare class EdgeMigrationDrainingError extends Error {
|
|
79
|
+
readonly gate: EdgeMigrationGate;
|
|
80
|
+
readonly code = "client_migration_draining";
|
|
81
|
+
constructor(gate: EdgeMigrationGate);
|
|
82
|
+
}
|
|
83
|
+
declare class EdgeMigrationRetiredError extends Error {
|
|
84
|
+
readonly gate: EdgeMigrationGate;
|
|
85
|
+
readonly code = "client_migration_retired";
|
|
86
|
+
constructor(gate: EdgeMigrationGate);
|
|
87
|
+
}
|
|
88
|
+
declare class EdgeMigrationLeaseError extends Error {
|
|
89
|
+
readonly code = "client_migration_lease_lost";
|
|
90
|
+
constructor();
|
|
91
|
+
}
|
|
92
|
+
declare function edgeMessageFingerprint(message: PendingMessage | BridgeMessage): string;
|
|
93
|
+
declare function stableIdempotency(message: PendingMessage): PendingMessage;
|
|
94
|
+
declare function edgeScopeKey(scope: EdgeScope): string;
|
|
95
|
+
declare class SQLiteEdgeStore {
|
|
96
|
+
private readonly path;
|
|
97
|
+
private readonly scope;
|
|
98
|
+
private readonly busyTimeoutMs;
|
|
99
|
+
private readonly db;
|
|
100
|
+
private readonly databasePath;
|
|
101
|
+
private readonly preexistingFiles;
|
|
102
|
+
private readonly key;
|
|
103
|
+
private initialized;
|
|
104
|
+
private initialization?;
|
|
105
|
+
constructor(path: string, scope: EdgeScope, busyTimeoutMs?: number);
|
|
106
|
+
private restrictFiles;
|
|
107
|
+
get scopeKey(): string;
|
|
108
|
+
private gateFromRow;
|
|
109
|
+
private gateInTransaction;
|
|
110
|
+
private assertScopeActiveInTransaction;
|
|
111
|
+
private assertDrainLeaseInTransaction;
|
|
112
|
+
private assertClaimAuthorityInTransaction;
|
|
113
|
+
initialize(): Promise<void>;
|
|
114
|
+
private initializeOnce;
|
|
115
|
+
private ready;
|
|
116
|
+
migrationGate(): Promise<EdgeMigrationGate>;
|
|
117
|
+
/** Refuse new normal-client writes before any remote attempt begins. */
|
|
118
|
+
assertScopeActive(): Promise<void>;
|
|
119
|
+
/** Refuse remote publication unless this worker still owns the durable drain lease. */
|
|
120
|
+
assertDrainLease(lease: EdgeDrainLease, now?: Date): Promise<void>;
|
|
121
|
+
private claimDrainLease;
|
|
122
|
+
/** Start a new durable drain only from an active edge scope. */
|
|
123
|
+
beginDrain(operationId: string, now?: Date, leaseMs?: number): Promise<EdgeDrainLease>;
|
|
124
|
+
/** Resume the same persisted drain only after the prior worker lease expires. */
|
|
125
|
+
resumeDrain(operationId: string, now?: Date, leaseMs?: number): Promise<EdgeDrainLease>;
|
|
126
|
+
/** Backward-compatible dispatcher for callers that have already inspected the gate. */
|
|
127
|
+
acquireDrainLease(operationId: string, now?: Date, leaseMs?: number): Promise<EdgeDrainLease>;
|
|
128
|
+
/** Verify the held lease and require an exact zero-work outbox before a cutover continues. */
|
|
129
|
+
assertDrainComplete(lease: EdgeDrainLease, now?: Date): Promise<void>;
|
|
130
|
+
renewDrainLease(lease: EdgeDrainLease, now?: Date, leaseMs?: number): Promise<EdgeDrainLease>;
|
|
131
|
+
retireScope(lease: EdgeDrainLease, now?: Date): Promise<void>;
|
|
132
|
+
enqueue(input: PendingMessage, now?: Date): Promise<EdgeEnqueueResult>;
|
|
133
|
+
claimNext(now?: Date, leaseMs?: number, migrationLease?: EdgeDrainLease): Promise<EdgeOutboxRecord | undefined>;
|
|
134
|
+
retry(record: EdgeOutboxRecord, error: string, availableAt: Date): Promise<void>;
|
|
135
|
+
block(record: EdgeOutboxRecord, error: string, now?: Date): Promise<void>;
|
|
136
|
+
commit(record: EdgeOutboxRecord, message: BridgeMessage, now?: Date): Promise<void>;
|
|
137
|
+
private cacheOne;
|
|
138
|
+
cachePage(messages: BridgeMessage[], cursor: string | undefined, now?: Date): Promise<void>;
|
|
139
|
+
cacheLatest(messages: BridgeMessage[], now?: Date): Promise<void>;
|
|
140
|
+
list(query?: MessageQuery): Promise<MessagePage>;
|
|
141
|
+
pullCursor(): Promise<string | undefined>;
|
|
142
|
+
noteError(error: string): Promise<void>;
|
|
143
|
+
noteAttempt(now?: Date): Promise<void>;
|
|
144
|
+
stats(now?: Date): Promise<EdgeStats>;
|
|
145
|
+
close(): Promise<void>;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export { EdgeConflictError as E, type PendingMessage as P, SQLiteEdgeStore as S, type EdgeDrainLease as a, type EdgeEnqueueResult as b, EdgeMigrationDrainingError as c, type EdgeMigrationGate as d, type EdgeMigrationGateState as e, EdgeMigrationLeaseError as f, EdgeMigrationRetiredError as g, type EdgeOutboxRecord as h, type EdgeReadOnlyInspection as i, type EdgeScope as j, type EdgeStats as k, edgeMessageFingerprint as l, edgeScopeKey as m, inspectEdgeScopeReadOnly as n, stableIdempotency as s };
|