borgmcp 5.5.0 → 5.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +7 -4
  2. package/dist/claude.d.ts.map +1 -1
  3. package/dist/claude.js +12 -0
  4. package/dist/claude.js.map +1 -1
  5. package/dist/cli-help.d.ts.map +1 -1
  6. package/dist/cli-help.js +16 -6
  7. package/dist/cli-help.js.map +1 -1
  8. package/dist/docs-sections.js +1 -1
  9. package/dist/docs-sections.js.map +1 -1
  10. package/dist/hermes-plugin-install.d.ts +19 -0
  11. package/dist/hermes-plugin-install.d.ts.map +1 -0
  12. package/dist/hermes-plugin-install.js +131 -0
  13. package/dist/hermes-plugin-install.js.map +1 -0
  14. package/dist/local-server-cursor.d.ts +9 -0
  15. package/dist/local-server-cursor.d.ts.map +1 -1
  16. package/dist/local-server-cursor.js +50 -1
  17. package/dist/local-server-cursor.js.map +1 -1
  18. package/dist/log-stream.d.ts +13 -0
  19. package/dist/log-stream.d.ts.map +1 -1
  20. package/dist/log-stream.js +45 -13
  21. package/dist/log-stream.js.map +1 -1
  22. package/dist/remote-client.d.ts +3 -0
  23. package/dist/remote-client.d.ts.map +1 -1
  24. package/dist/remote-client.js +7 -1
  25. package/dist/remote-client.js.map +1 -1
  26. package/dist/representative-cmd.d.ts +11 -0
  27. package/dist/representative-cmd.d.ts.map +1 -1
  28. package/dist/representative-cmd.js +48 -15
  29. package/dist/representative-cmd.js.map +1 -1
  30. package/dist/representative-core.d.ts +53 -7
  31. package/dist/representative-core.d.ts.map +1 -1
  32. package/dist/representative-core.js +229 -43
  33. package/dist/representative-core.js.map +1 -1
  34. package/dist/representative-delivery-store.d.ts +79 -0
  35. package/dist/representative-delivery-store.d.ts.map +1 -0
  36. package/dist/representative-delivery-store.js +233 -0
  37. package/dist/representative-delivery-store.js.map +1 -0
  38. package/dist/representative-listener-store.d.ts +46 -0
  39. package/dist/representative-listener-store.d.ts.map +1 -0
  40. package/dist/representative-listener-store.js +119 -0
  41. package/dist/representative-listener-store.js.map +1 -0
  42. package/dist/representative-listener.d.ts +32 -0
  43. package/dist/representative-listener.d.ts.map +1 -0
  44. package/dist/representative-listener.js +293 -0
  45. package/dist/representative-listener.js.map +1 -0
  46. package/dist/representative-mcp.d.ts +10 -3
  47. package/dist/representative-mcp.d.ts.map +1 -1
  48. package/dist/representative-mcp.js +48 -19
  49. package/dist/representative-mcp.js.map +1 -1
  50. package/dist/representative-store.d.ts +7 -0
  51. package/dist/representative-store.d.ts.map +1 -1
  52. package/dist/representative-store.js +17 -2
  53. package/dist/representative-store.js.map +1 -1
  54. package/dist/seat-probe.d.ts +1 -0
  55. package/dist/seat-probe.d.ts.map +1 -1
  56. package/dist/seat-probe.js +1 -1
  57. package/dist/seat-probe.js.map +1 -1
  58. package/dist/server-trust.d.ts +10 -0
  59. package/dist/server-trust.d.ts.map +1 -1
  60. package/dist/server-trust.js +23 -6
  61. package/dist/server-trust.js.map +1 -1
  62. package/dist/stream-owner.d.ts.map +1 -1
  63. package/dist/stream-owner.js +32 -3
  64. package/dist/stream-owner.js.map +1 -1
  65. package/docs/HUMAN_REPRESENTATIVE.md +310 -36
  66. package/hermes-plugin/borg-representative-push/__init__.py +743 -0
  67. package/hermes-plugin/borg-representative-push/plugin.yaml +39 -0
  68. package/package.json +3 -1
  69. package/src/claude.ts +12 -0
  70. package/src/cli-help.ts +16 -6
  71. package/src/docs-sections.ts +1 -1
  72. package/src/hermes-plugin-install.ts +147 -0
  73. package/src/local-server-cursor.ts +45 -1
  74. package/src/log-stream.ts +47 -14
  75. package/src/remote-client.ts +9 -1
  76. package/src/representative-cmd.ts +52 -20
  77. package/src/representative-core.ts +255 -46
  78. package/src/representative-delivery-store.ts +235 -0
  79. package/src/representative-listener-store.ts +115 -0
  80. package/src/representative-listener.ts +215 -0
  81. package/src/representative-mcp.ts +58 -17
  82. package/src/representative-store.ts +18 -2
  83. package/src/seat-probe.ts +1 -1
  84. package/src/server-trust.ts +25 -6
  85. package/src/stream-owner.ts +34 -2
@@ -0,0 +1,293 @@
1
+ /** Supervised body-free wake channel; independent of the lazy MCP tools lease. */
2
+ import { createHash } from 'node:crypto';
3
+ import { join } from 'node:path';
4
+ import { realpathSync } from 'node:fs';
5
+ import { borgConfigRoot } from './private-root.js';
6
+ import { acquireStreamLease, readOwnershipSnapshot, STREAM_OWNER_STALE_MS } from './stream-owner.js';
7
+ import { representativeOwnerDeps } from './representative-owner.js';
8
+ import { createListenerInbox } from './representative-listener-store.js';
9
+ import { streamOnce, streamReconnectDelay } from './log-stream.js';
10
+ import { resolveRepresentativeContext } from './representative-cmd.js';
11
+ import { DroneEvictedError, CubeDeletedError } from './drone-lifecycle.js';
12
+ import { BorgServerTrustError, BorgServerUnreachableError } from './server-errors.js';
13
+ import { isTransportFailure } from './seat-probe.js';
14
+ import { readBorgServerTrustIdentity } from './server-trust.js';
15
+ import { RepresentativeError, verifyLiveBinding } from './representative-core.js';
16
+ import { bindingFingerprint } from './representative-store.js';
17
+ function listenerOwnerDeps(binding) {
18
+ const authority = createHash('sha256').update(JSON.stringify([binding.origin, binding.trustIdentity])).digest('hex');
19
+ return { ...representativeOwnerDeps(binding), locksDir: join(borgConfigRoot(), 'representative-listener-locks', authority) };
20
+ }
21
+ export async function representativeListenerStatus(binding) {
22
+ const ownership = await readOwnershipSnapshot(binding.cubeId, binding.representativeDroneId, listenerOwnerDeps(binding));
23
+ let alive = false;
24
+ if (ownership.pid) {
25
+ try {
26
+ process.kill(ownership.pid, 0);
27
+ alive = true;
28
+ }
29
+ catch (error) {
30
+ alive = error.code === 'EPERM';
31
+ }
32
+ }
33
+ return { ...ownership, running: alive && (ownership.ageMs ?? Infinity) <= STREAM_OWNER_STALE_MS,
34
+ ...await createListenerInbox(binding).snapshot() };
35
+ }
36
+ function codeOf(error) {
37
+ if (error instanceof DroneEvictedError)
38
+ return 'DRONE_EVICTED';
39
+ if (error instanceof CubeDeletedError)
40
+ return 'CUBE_DELETED';
41
+ if (error instanceof BorgServerTrustError)
42
+ return 'TRUST_CHANGED';
43
+ return typeof error?.code === 'string' ? error.code : 'LISTENER_ERROR';
44
+ }
45
+ function terminalReason(error) {
46
+ const code = codeOf(error);
47
+ if (code === 'DRONE_EVICTED' || code === 'CUBE_DELETED' || code === 'SEAT_UNAVAILABLE')
48
+ return 'evicted';
49
+ if (code === 'BINDING_MISMATCH' || code === 'COORDINATOR_UNAVAILABLE')
50
+ return 'rebound';
51
+ if (code.includes('TRUST'))
52
+ return 'trust-changed';
53
+ if (['SESSION_REVOKED', 'SESSION_REJECTED', 'CREDENTIAL_REJECTED'].includes(code))
54
+ return 'revoked';
55
+ return undefined;
56
+ }
57
+ export async function runListener(command, deps, options = {}) {
58
+ const emit = async (event) => {
59
+ deps.stdout(JSON.stringify(event) + '\n');
60
+ // The command exits after its final event; wait for the pipe to flush.
61
+ await new Promise((resolve, reject) => process.stdout.write('', error => error ? reject(error) : resolve()));
62
+ };
63
+ let lease = null;
64
+ let timer;
65
+ let started = false, reason, active;
66
+ const abort = new AbortController();
67
+ let pending = Promise.resolve();
68
+ const serial = (fn) => {
69
+ const result = pending.then(fn);
70
+ pending = result.catch(() => { });
71
+ return result;
72
+ };
73
+ const stop = (why) => { reason ??= why; abort.abort(); };
74
+ const signal = () => stop('signal');
75
+ let outputBroken = false;
76
+ const outputError = () => { outputBroken = true; reason = 'fatal'; abort.abort(); };
77
+ process.stdout.on('error', outputError);
78
+ const exitCode = () => reason === 'signal' ? 0 : reason === 'fatal' ? 1 : 4;
79
+ try {
80
+ let worktree = command.worktree ?? deps.cwd();
81
+ try {
82
+ worktree = realpathSync(worktree);
83
+ }
84
+ catch { /* resolve refuses missing bindings */ }
85
+ worktree = deps.findProjectRoot(worktree);
86
+ const ctx = await resolveRepresentativeContext(worktree, deps);
87
+ // Only this server step maps transport failures to SERVER_UNREACHABLE; typed
88
+ // rejections keep their binding codes and storage keeps STORAGE_REFUSED.
89
+ await verifyLiveBinding(ctx).catch((error) => {
90
+ throw isTransportFailure(error) && !(error instanceof BorgServerUnreachableError)
91
+ ? new BorgServerUnreachableError('Borg server unreachable during startup verification', { cause: error }) : error;
92
+ });
93
+ const binding = ctx.binding;
94
+ active = (await deps.hydrateSeat(worktree));
95
+ const ownerDeps = listenerOwnerDeps(binding);
96
+ lease = await acquireStreamLease(binding.cubeId, binding.representativeDroneId, STREAM_OWNER_STALE_MS, ownerDeps);
97
+ if (!lease) {
98
+ const owner = await readOwnershipSnapshot(binding.cubeId, binding.representativeDroneId, ownerDeps);
99
+ await emit({ event: 'refused', code: 'REPRESENTATIVE_LISTENER_OWNED', exit_code: 3,
100
+ owner_pid: owner.pid ?? null, owner_started_at: owner.startedAt ?? null });
101
+ return 3;
102
+ }
103
+ const guard = async () => {
104
+ if (abort.signal.aborted)
105
+ throw new Error('listener stopped');
106
+ const current = await deps.store.getBinding(worktree);
107
+ if (!current || JSON.stringify([current.origin, current.trustIdentity, current.cubeId, current.representativeDroneId, current.coordinatorDroneId, current.boundAt]) !==
108
+ JSON.stringify([binding.origin, binding.trustIdentity, binding.cubeId, binding.representativeDroneId, binding.coordinatorDroneId, binding.boundAt])) {
109
+ stop('rebound');
110
+ throw new RepresentativeError('BINDING_MISMATCH', 'Representative binding changed');
111
+ }
112
+ const saved = await deps.hydrateSeat(worktree);
113
+ if (!saved) {
114
+ stop('revoked');
115
+ throw new RepresentativeError('SEAT_UNAVAILABLE', 'Representative seat unavailable');
116
+ }
117
+ if (saved.serverTrustIdentity !== binding.trustIdentity) {
118
+ stop('trust-changed');
119
+ throw new BorgServerTrustError('Representative trust changed');
120
+ }
121
+ if (saved.cubeId !== binding.cubeId || saved.droneId !== binding.representativeDroneId || saved.apiUrl !== binding.origin) {
122
+ stop('rebound');
123
+ throw new RepresentativeError('BINDING_MISMATCH', 'Representative seat changed');
124
+ }
125
+ // Recheck authority trust while the stream stays open, not only on reconnect.
126
+ // Controlled transports may omit trust loading; production never does.
127
+ if (!options.streamDeps?.fetchImpl || options.streamDeps.loadTrust) {
128
+ try {
129
+ // Read fresh: the loader's local-authority cache never observes a change.
130
+ const identity = options.streamDeps?.loadTrust
131
+ ? (await options.streamDeps.loadTrust(binding.origin)).identity
132
+ : await readBorgServerTrustIdentity(binding.origin);
133
+ if (identity !== binding.trustIdentity)
134
+ throw new BorgServerTrustError('Representative authority trust changed');
135
+ }
136
+ catch (error) {
137
+ stop('trust-changed');
138
+ throw error;
139
+ }
140
+ }
141
+ const observed = await readOwnershipSnapshot(binding.cubeId, binding.representativeDroneId, ownerDeps);
142
+ if (observed.processNonce !== lease.record.processNonce) {
143
+ stop('lease-lost');
144
+ throw new Error('Listener ownership lost');
145
+ }
146
+ };
147
+ const inbox = createListenerInbox(binding, guard);
148
+ await inbox.snapshot(); // refuse unsafe persisted paths before emitting listening
149
+ process.once('SIGTERM', signal);
150
+ process.once('SIGINT', signal);
151
+ timer = setInterval(() => {
152
+ void serial(async () => { await guard(); if (!await lease.refresh())
153
+ stop('lease-lost'); }).catch(error => { if (!reason)
154
+ stop(terminalReason(error) ?? 'lease-lost'); });
155
+ }, options.heartbeatIntervalMs ?? 20_000);
156
+ let attempt = 0;
157
+ let consumerFailure;
158
+ let pendingGap;
159
+ // Failures of the listener's own guard, storage and output are fatal; every
160
+ // other non-terminal stream failure is transport and reconnects, as in the
161
+ // ordinary stream loop (pinned HTTPS surfaces raw errno/string codes).
162
+ const local = (fn) => async (...args) => {
163
+ try {
164
+ return await fn(...args);
165
+ }
166
+ catch (error) {
167
+ consumerFailure ??= error;
168
+ throw error;
169
+ }
170
+ };
171
+ while (!reason) {
172
+ const resumed = await inbox.cursor();
173
+ try {
174
+ consumerFailure = undefined;
175
+ await local(() => serial(guard))();
176
+ await streamOnce(active, resumed?.id ?? null, () => { }, {
177
+ ...options.streamDeps, getCursor: local(async () => inbox.cursor()), abortSignal: abort.signal,
178
+ consumer: {
179
+ catchupCursor: await local(() => inbox.dedupeCursor())(),
180
+ beforeEvent: local(() => serial(guard)),
181
+ clearCursor: local(() => serial(async () => {
182
+ const previous = await inbox.snapshot();
183
+ await inbox.clearCursor();
184
+ if (started)
185
+ await emit({ event: 'gap', after: previous.watermark, reason: 'cursor-expired' });
186
+ else
187
+ pendingGap = previous.watermark;
188
+ })),
189
+ connected: local(() => serial(async () => {
190
+ await guard();
191
+ if (!started) {
192
+ await emit({ event: 'listening', cube_id: binding.cubeId, drone_id: binding.representativeDroneId,
193
+ binding_fingerprint: bindingFingerprint(binding), ...await inbox.snapshot() });
194
+ started = true;
195
+ if (pendingGap !== undefined)
196
+ await emit({ event: 'gap', after: pendingGap, reason: 'cursor-expired' });
197
+ if (command.replayAfter) {
198
+ const replay = await inbox.replay(command.replayAfter);
199
+ if (replay.missing)
200
+ await emit({ event: 'gap', after: command.replayAfter, reason: 'replay-checkpoint-missing' });
201
+ for (const hint of replay.hints) {
202
+ await guard();
203
+ await emit(hint);
204
+ }
205
+ }
206
+ }
207
+ else
208
+ await emit({ event: 'connected', resumed_from: resumed?.id ?? null });
209
+ })),
210
+ log: local((event, catchupCursor) => serial(async () => {
211
+ await guard();
212
+ const hint = await inbox.append({ ...event.data, id: event.id }, catchupCursor);
213
+ if (hint) {
214
+ await guard();
215
+ await emit(hint);
216
+ }
217
+ })),
218
+ },
219
+ });
220
+ attempt = 0;
221
+ }
222
+ catch (error) {
223
+ if (reason) {
224
+ if (!started)
225
+ throw error;
226
+ break;
227
+ }
228
+ if (consumerFailure)
229
+ throw consumerFailure;
230
+ const terminal = terminalReason(error);
231
+ if (terminal) {
232
+ if (!started)
233
+ throw error;
234
+ stop(terminal);
235
+ break;
236
+ }
237
+ deps.stderr(`Representative listener: ${error instanceof Error ? error.message : 'stream disconnected'}\n`);
238
+ }
239
+ if (reason)
240
+ break;
241
+ const delay = Math.round((options.reconnectDelay ?? streamReconnectDelay)(attempt++));
242
+ if (started)
243
+ await emit({ event: 'reconnecting', attempt, delay_ms: delay });
244
+ await new Promise(resolve => {
245
+ const done = () => { clearTimeout(timeout); abort.signal.removeEventListener('abort', done); resolve(); };
246
+ const timeout = setTimeout(done, delay);
247
+ abort.signal.addEventListener('abort', done, { once: true });
248
+ if (abort.signal.aborted)
249
+ done();
250
+ });
251
+ }
252
+ return exitCode();
253
+ }
254
+ catch (error) {
255
+ deps.stderr(`Representative listener refused: ${error instanceof Error ? error.message : String(error)}\n`);
256
+ if (!started && (error instanceof RepresentativeError || terminalReason(error))) {
257
+ await emit({ event: 'refused', code: typeof error?.code === 'string' ? error.code : 'BACKEND_ERROR', exit_code: 2 });
258
+ return 2;
259
+ }
260
+ if (started)
261
+ reason = 'fatal';
262
+ else if (!outputBroken)
263
+ await emit({ event: 'refused', code: error instanceof BorgServerUnreachableError
264
+ ? 'REPRESENTATIVE_LISTENER_SERVER_UNREACHABLE' : 'REPRESENTATIVE_LISTENER_STORAGE_REFUSED', exit_code: 1 });
265
+ return 1;
266
+ }
267
+ finally {
268
+ if (timer)
269
+ clearInterval(timer);
270
+ process.removeListener('SIGTERM', signal);
271
+ process.removeListener('SIGINT', signal);
272
+ await pending;
273
+ let releaseFailed = false;
274
+ try {
275
+ await lease?.release();
276
+ }
277
+ catch (error) {
278
+ releaseFailed = true;
279
+ reason = 'fatal';
280
+ deps.stderr(`Listener lease release failed: ${String(error)}\n`);
281
+ }
282
+ if (started && reason && !outputBroken) {
283
+ try {
284
+ await emit({ event: 'stopped', reason, exit_code: exitCode() });
285
+ }
286
+ catch { /* stdout failure is fatal to the host */ }
287
+ }
288
+ process.stdout.removeListener('error', outputError);
289
+ if (releaseFailed || outputBroken)
290
+ return 1;
291
+ }
292
+ }
293
+ //# sourceMappingURL=representative-listener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"representative-listener.js","sourceRoot":"","sources":["../src/representative-listener.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,9 @@
2
2
  * Restricted stdio MCP facade for the human representative.
3
3
  *
4
4
  * A Borg server speaks pinned-TLS HTTPS, not MCP, so a generic MCP host reaches
5
- * it through this local stdio process. The surface is four tools: status, send
6
- * (to the ONE bound Coordinator), read (that Coordinator's replies) and ack.
5
+ * it through this local stdio process. The surface is five tools: status, send
6
+ * (to the ONE bound Coordinator), read (that Coordinator's replies), deliver
7
+ * (the host's durable delivery checkpoint) and ack.
7
8
  * There is deliberately no log/broadcast/dispatch, roster-management, grant,
8
9
  * evict, release, regen or server-lifecycle tool, and no dispatcher escape hatch.
9
10
  *
@@ -12,11 +13,17 @@
12
13
  */
13
14
  import type { Readable, Writable } from 'node:stream';
14
15
  import { type RepresentativeContext } from './representative-core.js';
15
- export declare const REPRESENTATIVE_TOOL_NAMES: readonly ["borg_representative-status", "borg_representative-send", "borg_representative-read", "borg_representative-ack"];
16
+ export declare const REPRESENTATIVE_TOOL_NAMES: readonly ["borg_representative-status", "borg_representative-send", "borg_representative-read", "borg_representative-deliver", "borg_representative-ack"];
16
17
  export declare const REPRESENTATIVE_INSTRUCTIONS: string;
17
18
  export interface ServeRepresentativeOptions {
18
19
  /** Resolved on every call; a throw fails that call closed. */
19
20
  context: () => Promise<RepresentativeContext>;
21
+ /**
22
+ * The binding generation this process started with. Every call except status
23
+ * refuses with BINDING_MISMATCH, before any lease, ledger, checkpoint, cursor
24
+ * or network activity, once the saved binding's fingerprint differs.
25
+ */
26
+ pinnedFingerprint?: string;
20
27
  version: string;
21
28
  stdin?: Readable;
22
29
  stdout?: Writable;
@@ -1 +1 @@
1
- {"version":3,"file":"representative-mcp.d.ts","sourceRoot":"","sources":["../src/representative-mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAItD,OAAO,EAQL,KAAK,qBAAqB,EAC3B,MAAM,0BAA0B,CAAC;AAIlC,eAAO,MAAM,yBAAyB,4HAK5B,CAAC;AAEX,eAAO,MAAM,2BAA2B,QAMV,CAAC;AA4F/B,MAAM,WAAW,0BAA0B;IACzC,8DAA8D;IAC9D,OAAO,EAAE,MAAM,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,+EAA+E;IAC/E,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CA4DhE"}
1
+ {"version":3,"file":"representative-mcp.d.ts","sourceRoot":"","sources":["../src/representative-mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAItD,OAAO,EAUL,KAAK,qBAAqB,EAC3B,MAAM,0BAA0B,CAAC;AAKlC,eAAO,MAAM,yBAAyB,2JAM5B,CAAC;AAEX,eAAO,MAAM,2BAA2B,QAMV,CAAC;AA8G/B,MAAM,WAAW,0BAA0B;IACzC,8DAA8D;IAC9D,OAAO,EAAE,MAAM,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC9C;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,+EAA+E;IAC/E,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAwEhE"}
@@ -2,8 +2,9 @@
2
2
  * Restricted stdio MCP facade for the human representative.
3
3
  *
4
4
  * A Borg server speaks pinned-TLS HTTPS, not MCP, so a generic MCP host reaches
5
- * it through this local stdio process. The surface is four tools: status, send
6
- * (to the ONE bound Coordinator), read (that Coordinator's replies) and ack.
5
+ * it through this local stdio process. The surface is five tools: status, send
6
+ * (to the ONE bound Coordinator), read (that Coordinator's replies), deliver
7
+ * (the host's durable delivery checkpoint) and ack.
7
8
  * There is deliberately no log/broadcast/dispatch, roster-management, grant,
8
9
  * evict, release, regen or server-lifecycle tool, and no dispatcher escape hatch.
9
10
  *
@@ -14,13 +15,15 @@ import { ErrorCode } from 'borgmcp-shared/protocol';
14
15
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
15
16
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
16
17
  import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
17
- import { REPRESENTATIVE_DELIVERY_NOTE, REPRESENTATIVE_MESSAGE_LIMIT_BYTES, RepresentativeError, ackRepresentativeReply, readRepresentativeReplies, representativeStatus, sendRepresentativeMessage, } from './representative-core.js';
18
- import { RepresentativeStoreError } from './representative-store.js';
18
+ import { REPRESENTATIVE_DELIVERY_NOTE, REPRESENTATIVE_MESSAGE_LIMIT_BYTES, RepresentativeError, ackRepresentativeReply, deliverRepresentativeReplies, readRepresentativeReplies, serializeRepresentativeResult, representativeStatus, sendRepresentativeMessage, } from './representative-core.js';
19
+ import { RepresentativeStoreError, bindingFingerprint } from './representative-store.js';
20
+ import { createDeliveryStore } from './representative-delivery-store.js';
19
21
  import { createRepresentativeOwner } from './representative-owner.js';
20
22
  export const REPRESENTATIVE_TOOL_NAMES = [
21
23
  'borg_representative-status',
22
24
  'borg_representative-send',
23
25
  'borg_representative-read',
26
+ 'borg_representative-deliver',
24
27
  'borg_representative-ack',
25
28
  ];
26
29
  export const REPRESENTATIVE_INSTRUCTIONS = 'You are connected as the human representative of one Borg cube: an automated delegate that relays the ' +
@@ -64,28 +67,45 @@ const TOOLS = [
64
67
  },
65
68
  {
66
69
  name: 'borg_representative-read',
67
- description: 'Read unread replies from the bound Coordinator addressed to this representative. Replies arrive only when this tool ' +
68
- 'is called; there is no background wake. Each call DRAINS the whole fetched unread page for this drone — returned ' +
69
- 'replies and ignored entries alike (other drones\' entries are counted, never returned) — so they will not appear ' +
70
- 'unread again: persist the result, then route each reply by in_reply_to to its conversation or hold it for the human. If the host stops before persisting, the reply ' +
71
- 'is no longer in the unread view.',
70
+ description: 'Read the bound Coordinator\'s replies addressed to this representative that come after your delivered checkpoint, ' +
71
+ 'oldest first. Reading changes nothing: the same replies return on every call until you call ' +
72
+ 'borg_representative-deliver. Persist each reply durably, route it by in_reply_to or hold it for the human, then ' +
73
+ 'deliver through the last one you persisted. At most `limit` replies and `max_bytes` of serialized result; a reply ' +
74
+ 'larger than max_bytes is returned whole and alone with oversize:true, and the result never exceeds ' +
75
+ 'max(max_bytes, 16384) bytes (oversize citations reduced to ids, documents_reduced:true). has_more means more ' +
76
+ 'replies follow the window; an empty page never has has_more. ' +
77
+ 'Stop routing if binding_fingerprint differs from the value you persisted at binding time.',
72
78
  inputSchema: {
73
79
  type: 'object',
74
80
  properties: {
75
81
  include_broadcast: { type: 'boolean', description: 'Also return the Coordinator\'s cube-wide broadcasts (marked as such).' },
76
- limit: {
77
- type: 'integer', minimum: 1, maximum: 200,
78
- description: 'Page-size hint, not a hard cap: a large unread backlog may return (and drain) more entries.',
82
+ limit: { type: 'integer', minimum: 1, maximum: 50, description: 'Hard cap on returned replies. Default 10.' },
83
+ max_bytes: {
84
+ type: 'integer', minimum: 4096, maximum: 60000,
85
+ description: 'Hard cap on the serialized result size in bytes. Default 32768.',
79
86
  },
80
87
  },
81
88
  additionalProperties: false,
82
89
  },
83
90
  },
91
+ {
92
+ name: 'borg_representative-deliver',
93
+ description: 'Record that every reply up to and including `through` is durably persisted by the host. Only this call moves the ' +
94
+ 'read window. `through` must be a reply borg_representative-read returned; the same or an older id is a no-op ' +
95
+ '(advanced:false). Call it only after durable persistence: a delivered reply is not returned again. It does not ' +
96
+ 'notify the Coordinator; that is borg_representative-ack.',
97
+ inputSchema: {
98
+ type: 'object',
99
+ properties: { through: { type: 'string', description: 'entry_id of the last reply you persisted.' } },
100
+ required: ['through'],
101
+ additionalProperties: false,
102
+ },
103
+ },
84
104
  {
85
105
  name: 'borg_representative-ack',
86
106
  description: 'Signal to the Coordinator that one of its direct replies (entry_id from borg_representative-read) was received. ' +
87
- 'It is only that signal: it does not make delivery reliable, does not move or restore the unread cursor, and is ' +
88
- 'not needed for reading.',
107
+ 'It is only that signal: it is not delivery, does not move the read window (that is borg_representative-deliver), ' +
108
+ 'and is not needed for reading.',
89
109
  inputSchema: {
90
110
  type: 'object',
91
111
  properties: { entry_id: { type: 'string' } },
@@ -108,7 +128,7 @@ function errorBody(error) {
108
128
  };
109
129
  }
110
130
  const toolResult = (body, isError = false) => ({
111
- content: [{ type: 'text', text: JSON.stringify(body, null, 2) }],
131
+ content: [{ type: 'text', text: serializeRepresentativeResult(body) }],
112
132
  ...(isError ? { isError: true } : {}),
113
133
  });
114
134
  export async function serveRepresentativeMcp(options) {
@@ -123,17 +143,24 @@ export async function serveRepresentativeMcp(options) {
123
143
  throw new RepresentativeError(ErrorCode.INVALID_INPUT, `Unknown tool ${JSON.stringify(name)}; this connection exposes only the representative tools.`);
124
144
  }
125
145
  const ctx = await options.context();
146
+ const pinned = options.pinnedFingerprint ? { pinned_binding_fingerprint: options.pinnedFingerprint } : {};
126
147
  if (name === 'borg_representative-status') {
127
- return toolResult({ ...await representativeStatus(ctx), ownership: await owner.snapshot(ctx.binding) });
148
+ return toolResult({ ...await representativeStatus(ctx), ...pinned, ownership: await owner.snapshot(ctx.binding) });
149
+ }
150
+ if (options.pinnedFingerprint && bindingFingerprint(ctx.binding) !== options.pinnedFingerprint) {
151
+ throw new RepresentativeError('BINDING_MISMATCH', 'The operator rebound this connection (a new binding generation) while it was running. Restart the MCP server to use the new binding.');
128
152
  }
153
+ // An untrustworthy delivery checkpoint stops every effect, not only read
154
+ // and deliver, so the refusal reaches the human. Read-only; status stays.
155
+ await createDeliveryStore(ctx.binding).load();
129
156
  await owner.ensure(ctx.binding);
130
157
  // Recheck at each network boundary, not just at tool dispatch: a process
131
158
  // may have paused or lost its lease while awaiting live verification.
132
159
  const backend = ctx.backend;
133
- const guarded = { ...ctx, backend: Object.fromEntries(['whoami', 'roster', 'append', 'readUnread', 'readEntry', 'ack'].map((key) => [key, async (...args) => {
160
+ const guarded = { ...ctx, guard: () => owner.ensure(ctx.binding), backend: Object.fromEntries(['whoami', 'roster', 'append', 'readAfter', 'unreadCursor', 'readEntry', 'ack'].map((key) => [key, async (...args) => {
134
161
  await owner.ensure(ctx.binding);
135
- if (key === 'readUnread')
136
- args[1] = () => owner.ensure(ctx.binding);
162
+ if (key === 'readAfter')
163
+ args[2] = () => owner.ensure(ctx.binding);
137
164
  const result = await backend[key].apply(backend, args);
138
165
  await owner.ensure(ctx.binding);
139
166
  return result;
@@ -145,6 +172,8 @@ export async function serveRepresentativeMcp(options) {
145
172
  }
146
173
  case 'borg_representative-read':
147
174
  return toolResult(await readRepresentativeReplies(guarded, args));
175
+ case 'borg_representative-deliver':
176
+ return toolResult(await deliverRepresentativeReplies(guarded, args));
148
177
  default:
149
178
  return toolResult(await ackRepresentativeReply(guarded, args));
150
179
  }
@@ -1 +1 @@
1
- {"version":3,"file":"representative-mcp.js","sourceRoot":"","sources":["../src/representative-mcp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"representative-mcp.js","sourceRoot":"","sources":["../src/representative-mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AACnG,OAAO,EACL,4BAA4B,EAC5B,kCAAkC,EAClC,mBAAmB,EACnB,sBAAsB,EACtB,4BAA4B,EAC5B,yBAAyB,EACzB,6BAA6B,EAC7B,oBAAoB,EACpB,yBAAyB,GAE1B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,4BAA4B;IAC5B,0BAA0B;IAC1B,0BAA0B;IAC1B,6BAA6B;IAC7B,yBAAyB;CACjB,CAAC;AAEX,MAAM,CAAC,MAAM,2BAA2B,GACtC,wGAAwG;IACxG,mHAAmH;IACnH,2GAA2G;IAC3G,iHAAiH;IACjH,2EAA2E;IAC3E,4BAA4B,CAAC;AAE/B,MAAM,KAAK,GAAG;IACZ;QACE,IAAI,EAAE,4BAA4B;QAClC,WAAW,EACT,0HAA0H;YAC1H,gHAAgH;QAClH,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE;KAC7E;IACD;QACE,IAAI,EAAE,0BAA0B;QAChC,WAAW,EACT,wHAAwH;YACxH,oHAAoH;YACpH,wGAAwG;YACxG,6GAA6G;QAC/G,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE;gBACnE,aAAa,EAAE;oBACb,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,iBAAiB,EAAE,cAAc,CAAC;oBACzC,WAAW,EACT,6GAA6G;wBAC7G,qCAAqC;iBACxC;gBACD,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uBAAuB,kCAAkC,SAAS,EAAE;gBAC5G,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gGAAgG;iBAC9G;aACF;YACD,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,CAAC;YAC9C,oBAAoB,EAAE,KAAK;SAC5B;KACF;IACD;QACE,IAAI,EAAE,0BAA0B;QAChC,WAAW,EACT,oHAAoH;YACpH,8FAA8F;YAC9F,kHAAkH;YAClH,oHAAoH;YACpH,qGAAqG;YACrG,+GAA+G;YAC/G,+DAA+D;YAC/D,2FAA2F;QAC7F,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,iBAAiB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,uEAAuE,EAAE;gBAC5H,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,2CAA2C,EAAE;gBAC7G,SAAS,EAAE;oBACT,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK;oBAC9C,WAAW,EAAE,iEAAiE;iBAC/E;aACF;YACD,oBAAoB,EAAE,KAAK;SAC5B;KACF;IACD;QACE,IAAI,EAAE,6BAA6B;QACnC,WAAW,EACT,mHAAmH;YACnH,+GAA+G;YAC/G,iHAAiH;YACjH,0DAA0D;QAC5D,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2CAA2C,EAAE,EAAE;YACrG,QAAQ,EAAE,CAAC,SAAS,CAAC;YACrB,oBAAoB,EAAE,KAAK;SAC5B;KACF;IACD;QACE,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EACT,kHAAkH;YAClH,mHAAmH;YACnH,gCAAgC;QAClC,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YAC5C,QAAQ,EAAE,CAAC,UAAU,CAAC;YACtB,oBAAoB,EAAE,KAAK;SAC5B;KACF;CACO,CAAC;AAEX,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,KAAK,YAAY,mBAAmB,IAAI,KAAK,YAAY,wBAAwB,EAAE,CAAC;QACtF,MAAM,OAAO,GAAG,KAAK,YAAY,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QACjF,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;IAClG,CAAC;IACD,MAAM,IAAI,GAAI,KAAmC,EAAE,IAAI,CAAC;IACxD,OAAO;QACL,KAAK,EAAE;YACL,IAAI,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe;YACvD,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAClE;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,IAAa,EAAE,OAAO,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC;IACtD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,6BAA6B,CAAC,IAAI,CAAC,EAAE,CAAC;IAC/E,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CACtC,CAAC,CAAC;AAkBH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAmC;IAEnC,MAAM,KAAK,GAAG,yBAAyB,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,2BAA2B,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,EAC/D,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,2BAA2B,EAAE,CAC3E,CAAC;IAEF,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE9G,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QACjC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,IAAI,CAAE,yBAA+C,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrE,MAAM,IAAI,mBAAmB,CAAC,SAAS,CAAC,aAAa,EAAE,gBAAgB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;YACzJ,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,0BAA0B,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1G,IAAI,IAAI,KAAK,4BAA4B,EAAE,CAAC;gBAC1C,OAAO,UAAU,CAAC,EAAE,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACrH,CAAC;YACD,IAAI,OAAO,CAAC,iBAAiB,IAAI,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,iBAAiB,EAAE,CAAC;gBAC/F,MAAM,IAAI,mBAAmB,CAC3B,kBAAkB,EAClB,sIAAsI,CACvI,CAAC;YACJ,CAAC;YACD,yEAAyE;YACzE,0EAA0E;YAC1E,MAAM,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9C,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAChC,yEAAyE;YACzE,sEAAsE;YACtE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;YAC5B,MAAM,OAAO,GAAG,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE;wBAC5N,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;wBAChC,IAAI,GAAG,KAAK,WAAW;4BAAE,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;wBACnE,MAAM,MAAM,GAAG,MAAO,OAAO,CAAC,GAA2B,CAA8C,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;wBAC7H,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;wBAChC,OAAO,MAAM,CAAC;oBAChB,CAAC,CAAC,CAAC,CAA8B,EAAE,CAAC;YACpC,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,0BAA0B,CAAC,CAAC,CAAC;oBAChC,MAAM,IAAI,GAAG,MAAM,yBAAyB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;oBAC5D,OAAO,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC;gBACxD,CAAC;gBACD,KAAK,0BAA0B;oBAC7B,OAAO,UAAU,CAAC,MAAM,yBAAyB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;gBACpE,KAAK,6BAA6B;oBAChC,OAAO,UAAU,CAAC,MAAM,4BAA4B,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;gBACvE;oBACE,OAAO,UAAU,CAAC,MAAM,sBAAsB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1E,IAAI,MAAmB,CAAC;IACxB,MAAM,MAAM,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC/C,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC9C,IAAI,CAAC;YAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;gBAAS,CAAC;YAAC,MAAM,EAAE,CAAC;QAAC,CAAC;IACpD,CAAC,CAAC;IACF,MAAM,WAAW,GAAG,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE,GAAG,KAAK,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACpC,IAAI,CAAC;QAAC,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAAC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,MAAM,QAAQ,EAAE,CAAC;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC;IACzF,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;AAChF,CAAC"}
@@ -11,6 +11,13 @@
11
11
  * holds message text (only a payload digest).
12
12
  */
13
13
  export declare function isRepresentativeUuid(value: unknown): value is string;
14
+ /**
15
+ * Host fence for one binding generation: hex SHA-256 of the canonical JSON array
16
+ * [origin, trustIdentity, cubeId, representativeDroneId, coordinatorDroneId,
17
+ * boundAt]. It changes on every rebind (boundAt) and trust change, and carries
18
+ * no path or credential.
19
+ */
20
+ export declare function bindingFingerprint(binding: RepresentativeBinding): string;
14
21
  export interface RepresentativeBinding {
15
22
  /** Canonical worktree holding the dedicated representative seat. */
16
23
  worktree: string;
@@ -1 +1 @@
1
- {"version":3,"file":"representative-store.d.ts","sourceRoot":"","sources":["../src/representative-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEpE;AAGD,MAAM,WAAW,qBAAqB;IACpC,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAEpF;AAED,MAAM,MAAM,0BAA0B,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,CAAC;AAEvF,MAAM,WAAW,2BAA2B;IAC1C,4EAA4E;IAC5E,SAAS,EAAE,MAAM,CAAC;IAClB,qFAAqF;IACrF,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,0BAA0B,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8FAA8F;IAC9F,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAQD,qBAAa,wBAAyB,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,kBAAkB;gBAAxB,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM;CAI/D;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;IACpE,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,EAAE,CAAC,CAAC;IACvE,WAAW,CACT,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,GAC3B,OAAO,CAAC,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC,CAAC;IAChD,0EAA0E;IAC1E,gBAAgB,CAAC,CAAC,EAChB,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,CAAC,OAAO,EAAE,2BAA2B,EAAE,KAAK,CAAC,GAChD,OAAO,CAAC,CAAC,CAAC,CAAC;CACf;AAoED,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,wBAAgB,yBAAyB,CAAC,SAAS,GAAE,MAAkC,GAAG,mBAAmB,CAgD5G"}
1
+ {"version":3,"file":"representative-store.d.ts","sourceRoot":"","sources":["../src/representative-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEpE;AAGD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAKzE;AAED,MAAM,WAAW,qBAAqB;IACpC,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAEpF;AAED,MAAM,MAAM,0BAA0B,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,CAAC;AAEvF,MAAM,WAAW,2BAA2B;IAC1C,4EAA4E;IAC5E,SAAS,EAAE,MAAM,CAAC;IAClB,qFAAqF;IACrF,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,0BAA0B,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8FAA8F;IAC9F,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAQD,qBAAa,wBAAyB,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,kBAAkB;gBAAxB,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM;CAI/D;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;IACpE,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,EAAE,CAAC,CAAC;IACvE,WAAW,CACT,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,GAC3B,OAAO,CAAC,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC,CAAC;IAChD,0EAA0E;IAC1E,gBAAgB,CAAC,CAAC,EAChB,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,CAAC,OAAO,EAAE,2BAA2B,EAAE,KAAK,CAAC,GAChD,OAAO,CAAC,CAAC,CAAC,CAAC;CACf;AAoED,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,wBAAgB,yBAAyB,CAAC,SAAS,GAAE,MAAkC,GAAG,mBAAmB,CAkD5G"}
@@ -11,6 +11,7 @@
11
11
  * holds message text (only a payload digest).
12
12
  */
13
13
  import { decodeUuid } from 'borgmcp-shared/protocol';
14
+ import { createHash } from 'node:crypto';
14
15
  import { join } from 'node:path';
15
16
  import { borgConfigRoot } from './private-root.js';
16
17
  import { shellEscape } from './shell-escape.js';
@@ -25,6 +26,18 @@ export function isRepresentativeUuid(value) {
25
26
  }
26
27
  }
27
28
  const SETTLED_REQUEST_LIMIT = 200;
29
+ /**
30
+ * Host fence for one binding generation: hex SHA-256 of the canonical JSON array
31
+ * [origin, trustIdentity, cubeId, representativeDroneId, coordinatorDroneId,
32
+ * boundAt]. It changes on every rebind (boundAt) and trust change, and carries
33
+ * no path or credential.
34
+ */
35
+ export function bindingFingerprint(binding) {
36
+ return createHash('sha256').update(JSON.stringify([
37
+ binding.origin, binding.trustIdentity, binding.cubeId,
38
+ binding.representativeDroneId, binding.coordinatorDroneId, binding.boundAt,
39
+ ])).digest('hex');
40
+ }
28
41
  export function representativeRecoveryCommand(binding) {
29
42
  return `cd ${shellEscape(binding.worktree)} && borg representative prepare --coordinator ${shellEscape(binding.coordinatorLabel)} --role ${shellEscape(binding.representativeRoleName)} --rebind`;
30
43
  }
@@ -128,7 +141,9 @@ export function createRepresentativeStore(storePath = representativeStorePath())
128
141
  throw new Error('Refusing to save an invalid representative binding');
129
142
  }
130
143
  const existing = txn.data.bindings[binding.worktree];
131
- if (existing && sameSelection(existing, binding))
144
+ // An explicit rebind always starts a new generation (new boundAt, so a new
145
+ // binding_fingerprint), even for the same selection.
146
+ if (existing && sameSelection(existing, binding) && !options.rebind)
132
147
  return 'unchanged';
133
148
  if (existing && !options.rebind) {
134
149
  throw new RepresentativeStoreError('BINDING_CONFLICT', `This worktree is already bound to Coordinator ${existing.coordinatorLabel} in cube ${existing.cubeName}. ` +
@@ -137,7 +152,7 @@ export function createRepresentativeStore(storePath = representativeStorePath())
137
152
  txn.data.bindings[binding.worktree] = binding;
138
153
  // A different selection invalidates the old ledger: its post ids belong to
139
154
  // another cube/Coordinator conversation.
140
- if (existing)
155
+ if (existing && !sameSelection(existing, binding))
141
156
  delete txn.data.requests[binding.worktree];
142
157
  await txn.commit();
143
158
  return existing ? 'rebound' : 'created';