@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
package/dist/sqlite.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { b as BridgeMessage, c as BridgePrincipal, B as BridgeDelivery, D as DeliveryState, R as RetryPolicy, A as AgentPresence, a as BridgeDeliveryEvent } from './bridge-domain-BcnBeHOn.js';
2
- import { b as MessageQuery, M as MessagePage, B as BridgeDiagnostics, I as InsertMessageResult, a as BridgeStore, C as ClaimOptions } from './bridge-store-BuGjxTn4.js';
1
+ import { b as BridgeMessage, c as BridgePrincipal, B as BridgeDelivery, g as DeliveryState, R as RetryPolicy, A as AgentPresence, a as BridgeDeliveryEvent } from './bridge-domain-CBX3IVqC.js';
2
+ import { d as MessageQuery, M as MessagePage, B as BridgeDiagnostics, I as InsertMessageResult, a as BridgeStore, C as ClaimOptions, c as DeliveryQuery, b as DeliveryPage, D as DeliveryEventPage } from './bridge-store-DPVSCwfs.js';
3
3
 
4
4
  type PendingMessage = Omit<BridgeMessage, "sequence" | "createdAt">;
5
5
  interface EdgeScope {
@@ -20,11 +20,24 @@ interface EdgeEnqueueResult {
20
20
  }
21
21
  interface EdgeStats {
22
22
  pending: number;
23
+ due: number;
24
+ scheduled: number;
25
+ leased: number;
23
26
  blocked: number;
24
27
  cached: number;
25
28
  pullCursor?: string;
26
29
  lastSyncAt?: string;
27
30
  lastError?: string;
31
+ oldestDueAt?: string;
32
+ queueLagMs: number;
33
+ oldestBlockedAt?: string;
34
+ blockedAgeMs: number | null;
35
+ blockedMaxAttempts: number;
36
+ blockedLastError?: string;
37
+ nextRetryAt?: string;
38
+ lastOutboundSyncAt?: string;
39
+ lastInboundSyncAt?: string;
40
+ lastAttemptAt?: string;
28
41
  }
29
42
  declare class EdgeConflictError extends Error {
30
43
  readonly code = "edge_idempotency_conflict";
@@ -37,25 +50,30 @@ declare class SQLiteEdgeStore {
37
50
  private readonly scope;
38
51
  private readonly busyTimeoutMs;
39
52
  private readonly db;
53
+ private readonly databasePath;
54
+ private readonly preexistingFiles;
40
55
  private readonly key;
41
56
  private initialized;
57
+ private initialization?;
42
58
  constructor(path: string, scope: EdgeScope, busyTimeoutMs?: number);
43
59
  private restrictFiles;
44
60
  get scopeKey(): string;
45
61
  initialize(): Promise<void>;
62
+ private initializeOnce;
46
63
  private ready;
47
64
  enqueue(input: PendingMessage, now?: Date): Promise<EdgeEnqueueResult>;
48
65
  claimNext(now?: Date, leaseMs?: number): Promise<EdgeOutboxRecord | undefined>;
49
66
  retry(record: EdgeOutboxRecord, error: string, availableAt: Date): Promise<void>;
50
- block(record: EdgeOutboxRecord, error: string): Promise<void>;
51
- commit(record: EdgeOutboxRecord, message: BridgeMessage, cacheVisible: boolean, now?: Date): Promise<void>;
67
+ block(record: EdgeOutboxRecord, error: string, now?: Date): Promise<void>;
68
+ commit(record: EdgeOutboxRecord, message: BridgeMessage, now?: Date): Promise<void>;
52
69
  private cacheOne;
53
70
  cachePage(messages: BridgeMessage[], cursor: string | undefined, now?: Date): Promise<void>;
54
71
  cacheLatest(messages: BridgeMessage[], now?: Date): Promise<void>;
55
72
  list(query?: MessageQuery): Promise<MessagePage>;
56
73
  pullCursor(): Promise<string | undefined>;
57
74
  noteError(error: string): Promise<void>;
58
- stats(): Promise<EdgeStats>;
75
+ noteAttempt(now?: Date): Promise<void>;
76
+ stats(now?: Date): Promise<EdgeStats>;
59
77
  close(): Promise<void>;
60
78
  }
61
79
 
@@ -66,6 +84,8 @@ interface SyncInsertResult extends InsertMessageResult {
66
84
  interface CachedMessagePage extends MessagePage {
67
85
  source: "remote" | "cache";
68
86
  stale: boolean;
87
+ degraded: boolean;
88
+ acknowledgements: "authoritative" | "unknown";
69
89
  lastSyncedAt?: string;
70
90
  }
71
91
  interface SyncReport {
@@ -82,12 +102,28 @@ interface SyncReport {
82
102
  failureRetryable?: boolean;
83
103
  }
84
104
  interface SyncDiagnostics extends BridgeDiagnostics {
85
- remoteReachable: boolean;
105
+ remoteReachable: boolean | null;
86
106
  outboxPending: number;
87
107
  outboxBlocked: number;
88
108
  cachedMessages: number;
89
109
  lastSyncAt?: string;
90
110
  lastSyncError?: string;
111
+ outboxDue: number;
112
+ outboxScheduled: number;
113
+ outboxLeased: number;
114
+ outboxOldestDueAt?: string;
115
+ outboxQueueLagMs: number;
116
+ outboxOldestBlockedAt?: string;
117
+ outboxBlockedAgeMs: number | null;
118
+ outboxBlockedMaxAttempts: number;
119
+ outboxBlockedLastError?: string;
120
+ outboxNextRetryAt?: string;
121
+ lastOutboundSyncAt?: string;
122
+ lastInboundSyncAt?: string;
123
+ lastSyncAttemptAt?: string;
124
+ syncLoopState: "disabled" | "idle" | "running" | "backoff" | "stopped" | "failed";
125
+ syncLoopError?: string;
126
+ remoteError?: string;
91
127
  }
92
128
  interface SyncingBridgeStoreOptions {
93
129
  now?: () => Date;
@@ -95,6 +131,8 @@ interface SyncingBridgeStoreOptions {
95
131
  baseDelayMs?: number;
96
132
  maxDelayMs?: number;
97
133
  leaseMs?: number;
134
+ autoSync?: boolean;
135
+ idleDelayMs?: number;
98
136
  }
99
137
  declare function isRetryableSyncError(error: unknown): boolean;
100
138
  declare class SyncingBridgeStore implements BridgeStore {
@@ -106,26 +144,54 @@ declare class SyncingBridgeStore implements BridgeStore {
106
144
  private readonly baseDelayMs;
107
145
  private readonly maxDelayMs;
108
146
  private readonly leaseMs;
147
+ private readonly autoSync;
148
+ private readonly idleDelayMs;
109
149
  private remoteReady;
150
+ private stopped;
151
+ private wakeTimer;
152
+ private wake;
153
+ private background;
154
+ private readonly closeController;
155
+ private backgroundError;
156
+ private wakeRequested;
157
+ private remoteReachable;
158
+ private loopState;
110
159
  constructor(edge: SQLiteEdgeStore, remote: BridgeStore, principal: BridgePrincipal, options?: SyncingBridgeStoreOptions);
111
160
  initialize(): Promise<void>;
161
+ private startTransportLoop;
162
+ private wait;
163
+ private wakeTransport;
164
+ private fatal;
165
+ private assertHealthy;
166
+ private transportLoop;
112
167
  verifyRemote(): Promise<void>;
113
168
  private ensureRemote;
114
169
  private assertPrincipal;
115
170
  private delay;
171
+ private cancelled;
116
172
  private flushOne;
117
173
  insertMessage(message: PendingMessage): Promise<SyncInsertResult>;
118
174
  private pull;
119
175
  sync(options?: {
120
176
  maxPush?: number;
121
177
  maxPages?: number;
178
+ signal?: AbortSignal;
122
179
  }): Promise<SyncReport>;
123
180
  listMessages(principal: BridgePrincipal, query?: MessageQuery): Promise<CachedMessagePage>;
124
- recordReceipt(workspace: string, messageIds: string[], principal: string, readAt?: Date): Promise<number>;
181
+ recordReceipt(principal: BridgePrincipal, messageIds: string[], readAt?: Date): Promise<number>;
125
182
  claimDelivery(principal: BridgePrincipal, options: ClaimOptions): Promise<BridgeDelivery | null>;
126
183
  renewDelivery(principal: BridgePrincipal, deliveryId: string, leaseToken: string, leaseMs: number): Promise<BridgeDelivery | null>;
127
- settleDelivery(principal: BridgePrincipal, deliveryId: string, leaseToken: string, state: Extract<DeliveryState, "acked" | "retrying" | "dead">, error: string | undefined, retryPolicy: RetryPolicy): Promise<BridgeDelivery | null>;
128
- diagnostics(principal: BridgePrincipal): Promise<SyncDiagnostics>;
184
+ settleDelivery(principal: BridgePrincipal, deliveryId: string, leaseToken: string, state: Extract<DeliveryState, "acked" | "retrying" | "dead">, error?: string, _retryPolicy?: RetryPolicy): Promise<BridgeDelivery | null>;
185
+ listDeliveries(principal: BridgePrincipal, query?: DeliveryQuery): Promise<DeliveryPage>;
186
+ listDeliveryEvents(principal: BridgePrincipal, id: string, query?: {
187
+ cursor?: string;
188
+ limit?: number;
189
+ }): Promise<DeliveryEventPage>;
190
+ cancelDelivery(principal: BridgePrincipal, id: string): Promise<BridgeDelivery | null>;
191
+ requeueDelivery(principal: BridgePrincipal, id: string): Promise<BridgeDelivery | null>;
192
+ diagnostics(principal: BridgePrincipal, options?: {
193
+ mode?: "snapshot" | "probe";
194
+ }): Promise<SyncDiagnostics>;
129
195
  heartbeat(principal: BridgePrincipal, leaseMs: number, runtimeType?: string, capabilities?: string[]): Promise<AgentPresence>;
130
196
  listPresence(principal: BridgePrincipal): Promise<AgentPresence[]>;
131
197
  close(): Promise<void>;
@@ -135,21 +201,37 @@ declare class SQLiteBridgeStore implements BridgeStore {
135
201
  private readonly path;
136
202
  private readonly busyTimeoutMs;
137
203
  private readonly db;
204
+ private readonly databasePath;
205
+ private readonly preexistingFiles;
138
206
  private initialized;
207
+ private initialization?;
139
208
  constructor(path?: string, busyTimeoutMs?: number);
140
209
  private restrictFiles;
141
210
  initialize(): Promise<void>;
211
+ private initializeOnce;
142
212
  private ready;
143
213
  insertMessage(input: Omit<BridgeMessage, "sequence" | "createdAt">): Promise<InsertMessageResult>;
144
214
  listMessages(principal: BridgePrincipal, query?: MessageQuery): Promise<MessagePage>;
145
- recordReceipt(workspace: string, messageIds: string[], principal: string, readAt?: Date): Promise<number>;
215
+ recordReceipt(principal: BridgePrincipal, messageIds: string[], readAt?: Date): Promise<number>;
146
216
  claimDelivery(principal: BridgePrincipal, options: ClaimOptions): Promise<BridgeDelivery | null>;
147
217
  renewDelivery(principal: BridgePrincipal, id: string, token: string, leaseMs: number): Promise<BridgeDelivery | null>;
148
- settleDelivery(principal: BridgePrincipal, id: string, token: string, state: "acked" | "retrying" | "dead", error: string | undefined, retryPolicy: RetryPolicy): Promise<BridgeDelivery | null>;
218
+ settleDelivery(principal: BridgePrincipal, id: string, token: string, state: "acked" | "retrying" | "dead", error?: string, _retryPolicy?: RetryPolicy): Promise<BridgeDelivery | null>;
149
219
  diagnostics(principal: BridgePrincipal): Promise<BridgeDiagnostics>;
150
220
  heartbeat(principal: BridgePrincipal, leaseMs: number, runtimeType?: string, capabilities?: string[]): Promise<AgentPresence>;
151
221
  listPresence(principal: BridgePrincipal): Promise<AgentPresence[]>;
152
- listDeliveryEvents(deliveryId: string): Promise<BridgeDeliveryEvent[]>;
222
+ listDeliveries(principal: BridgePrincipal, query?: DeliveryQuery): Promise<{
223
+ deliveries: BridgeDelivery[];
224
+ cursor: string | undefined;
225
+ }>;
226
+ listDeliveryEvents(principal: BridgePrincipal, deliveryId: string, query?: {
227
+ cursor?: string;
228
+ limit?: number;
229
+ }): Promise<{
230
+ events: BridgeDeliveryEvent[];
231
+ cursor: string | undefined;
232
+ }>;
233
+ cancelDelivery(principal: BridgePrincipal, id: string): Promise<BridgeDelivery | null>;
234
+ requeueDelivery(principal: BridgePrincipal, id: string): Promise<BridgeDelivery | null>;
153
235
  close(): Promise<void>;
154
236
  }
155
237
 
package/dist/sqlite.js CHANGED
@@ -1,16 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  EdgeConflictError,
4
- SQLiteBridgeStore,
5
4
  SQLiteEdgeStore,
6
5
  SyncingBridgeStore,
7
6
  edgeMessageFingerprint,
8
7
  edgeScopeKey,
9
8
  isRetryableSyncError,
10
9
  stableIdempotency
11
- } from "./chunk-WEULPMUY.js";
12
- import "./chunk-YD6YJATN.js";
13
- import "./chunk-BV6W4AJK.js";
10
+ } from "./chunk-Q6PPMXJC.js";
11
+ import {
12
+ SQLiteBridgeStore
13
+ } from "./chunk-5GMB3A77.js";
14
+ import "./chunk-NCO7RLBM.js";
15
+ import "./chunk-VOQIDTCJ.js";
16
+ import "./chunk-BZLMF5O5.js";
14
17
  export {
15
18
  EdgeConflictError,
16
19
  SQLiteBridgeStore,