agent-coord-mcp 0.18.0 → 0.19.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.
@@ -1,7 +1,7 @@
1
1
  import { detachAgentTool } from "./transport.js";
2
2
  import { z } from "zod";
3
3
  import path from "node:path";
4
- import { AGENTS_FILE, ROOMS_FILE, appendJsonl, cursorFile, deleteFile, inboxFile, listTransportFiles, memberRooms, readJson, roomFile, rotateAgentToken, transportFile, TRANSPORT_DIR, updateJson, } from "../store.js";
4
+ import { AGENTS_FILE, ROOMS_FILE, appendJsonl, cursorFile, deleteFile, inboxFile, listTransportFiles, memberRooms, readJson, roomFile, rotateAgentToken, transportFile, TRANSPORT_DIR, updateJson, listSessionFiles, readJsonStrict, } from "../store.js";
5
5
  import { recordAuthorityFor, resolveRole, roleInputSchema } from "../roles.js";
6
6
  import { sysMsg, moveFile, STALE_MS, EVICT_MS, } from "./shared.js";
7
7
  // ---------- register ----------
@@ -9,6 +9,11 @@ export const registerSchema = {
9
9
  agentId: z.string().min(1),
10
10
  project: z.string().optional(),
11
11
  role: roleInputSchema.optional(),
12
+ // First-claim guard overrides (server.ts guardFirstClaim): claiming an id
13
+ // that is LIVE on the bus refuses unless the call presents that agent's
14
+ // token (tokens.json / coord-token) or force:true. Ignored once bound.
15
+ token: z.string().optional(),
16
+ force: z.boolean().optional(),
12
17
  };
13
18
  // Work out what `role`/`roleId` should become, or why the update is refused.
14
19
  //
@@ -209,6 +214,69 @@ export function isPidAlive(pid) {
209
214
  return code === "EPERM"; // EPERM = exists but not ours; ESRCH = gone
210
215
  }
211
216
  }
217
+ export async function liveClaimEvidence(agentId, now) {
218
+ const reasons = [];
219
+ let verifiable = true;
220
+ let samePane = false;
221
+ let heartbeatFresh = false;
222
+ let markerLive = false;
223
+ let boundElsewhere = 0;
224
+ let reg = {};
225
+ try {
226
+ reg = await readJsonStrict(AGENTS_FILE, {});
227
+ }
228
+ catch {
229
+ verifiable = false;
230
+ reasons.push("agents.json exists but cannot be parsed — heartbeat liveness is unverifiable");
231
+ }
232
+ const entry = reg[agentId];
233
+ if (entry && now - entry.lastHeartbeat < STALE_MS) {
234
+ heartbeatFresh = true;
235
+ reasons.push(`fresh registry heartbeat ${Math.floor((now - entry.lastHeartbeat) / 1000)}s ago`);
236
+ }
237
+ let marker = null;
238
+ try {
239
+ marker = await readJsonStrict(transportFile(agentId), null);
240
+ }
241
+ catch {
242
+ verifiable = false;
243
+ reasons.push("transport marker exists but cannot be parsed — transport liveness is unverifiable");
244
+ }
245
+ if (marker && isMarkerLive(marker, reg, now)) {
246
+ markerLive = true;
247
+ reasons.push(`live ${marker.transport} transport (pid ${marker.pid}${marker.tmuxTarget ? `, pane ${marker.tmuxTarget}` : ""})`);
248
+ if (marker.transport === "tmux-push" &&
249
+ marker.tmuxTarget &&
250
+ process.env.TMUX_PANE &&
251
+ marker.tmuxTarget === process.env.TMUX_PANE) {
252
+ samePane = true;
253
+ }
254
+ }
255
+ for (const file of await listSessionFiles()) {
256
+ let s = null;
257
+ try {
258
+ s = await readJsonStrict(file, null);
259
+ }
260
+ catch {
261
+ verifiable = false;
262
+ reasons.push(`session binding ${path.basename(file)} cannot be parsed — unverifiable (doctor fix cleans it)`);
263
+ continue;
264
+ }
265
+ if (!s || s.agentId !== agentId || s.pid === process.pid)
266
+ continue;
267
+ if (isPidAlive(s.pid)) {
268
+ boundElsewhere++;
269
+ reasons.push(`another live session (pid ${s.pid}, via ${s.via}) is already bound to this id`);
270
+ }
271
+ }
272
+ return {
273
+ live: heartbeatFresh || markerLive || boundElsewhere > 0,
274
+ verifiable,
275
+ samePane,
276
+ boundElsewhere,
277
+ reasons,
278
+ };
279
+ }
212
280
  // ---------- rename_agent (NICK) ----------
213
281
  export const renameAgentSchema = {
214
282
  agentId: z.string().min(1),
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@ import { spawn, spawnSync } from "node:child_process";
11
11
  import { fileURLToPath } from "node:url";
12
12
  import { z } from "zod";
13
13
  import path from "node:path";
14
- import { AGENTS_FILE, CURSOR_DIR, DEFAULT_ROOM, INBOX_DIR, ROOT, ROOM_FILE, ROOMS_DIR, ROOMS_FILE, STATUS_FILE, appendJsonl, cursorFile, deleteFile, ensureRoom, fileSize, getRooms, inboxFile, listCursorFiles, listInboxFiles, listTransportFiles, logFile, normalizeRoom, pidFile, readJson, readJsonl, receiptFile, rewriteJsonl, roomFile, transportFile, TRANSPORT_DIR, updateJson, } from "../store.js";
14
+ import { AGENTS_FILE, CURSOR_DIR, DEFAULT_ROOM, INBOX_DIR, ROOT, ROOM_FILE, ROOMS_DIR, ROOMS_FILE, STATUS_FILE, appendJsonl, cursorFile, deleteFile, ensureRoom, fileSize, getRooms, inboxFile, listCursorFiles, listInboxFiles, listSessionFiles, listTransportFiles, logFile, normalizeRoom, pidFile, readJson, readJsonl, receiptFile, rewriteJsonl, roomFile, transportFile, TRANSPORT_DIR, updateJson, } from "../store.js";
15
15
  import { STALE_MS, EVICT_MS, } from "./shared.js";
16
16
  // ---------- ping ----------
17
17
  export const pingSchema = {
@@ -147,15 +147,34 @@ async function waitForReceipt(agentId, msgId, timeoutMs) {
147
147
  // pending with a reason the caller can act on. Reporting an unverified
148
148
  // submission as confirmed is the defect this exists to remove: a check that
149
149
  // cannot fail loudly is worse than no check.
150
- export function deliveryOutcome(agentId, receipt, timeoutMs) {
150
+ //
151
+ // `pusherSourceMtime` (the caller passes newestPusherSourceMtime()) lets a
152
+ // CONFIRMED verdict carry a note when the reporting pusher's build identity
153
+ // is behind the on-disk pusher source, or absent entirely. The note never
154
+ // downgrades the verdict — the command demonstrably ran — it says whose
155
+ // verification logic said so. Absence of the stamp reads as UNKNOWN, never
156
+ // as fresh (same ruling as doctor's stale-pusher-script / provenance
157
+ // checks: absence is not exemption), and the absence note is issued before
158
+ // the on-disk comparison so an unstattable hooks dir cannot silence it.
159
+ export function deliveryOutcome(agentId, receipt, timeoutMs, pusherSourceMtime) {
151
160
  if (!receipt) {
152
161
  return {
153
162
  delivery: "pending",
154
163
  reason: `no delivery receipt from '${agentId}' within ${timeoutMs}ms — the command was written but may not have reached the pane (stale/wedged pusher). Run doctor or re-attach the agent.`,
155
164
  };
156
165
  }
157
- if (receipt.submitted === true)
158
- return { delivery: "confirmed", at: receipt.ts };
166
+ if (receipt.submitted === true) {
167
+ let note;
168
+ if (receipt.scriptMtime === undefined) {
169
+ note = `'${agentId}' confirmed the submission, but its pusher carries no build-identity stamp — the pusher predates receipt provenance and this confirmation cannot be tied to any known code; re-attach the agent (detach_agent + attach_agent) to upgrade it.`;
170
+ }
171
+ else if (pusherSourceMtime !== undefined && receipt.scriptMtime < pusherSourceMtime - 1) {
172
+ const loaded = new Date(receipt.scriptMtime).toISOString();
173
+ const ondisk = new Date(pusherSourceMtime).toISOString();
174
+ note = `'${agentId}' confirmed the submission, but its pusher loaded its code at ${loaded} and the on-disk pusher source is newer (${ondisk}) — the verification logic behind this confirmation predates the current code; re-attach the agent (detach_agent + attach_agent) to upgrade it.`;
175
+ }
176
+ return { delivery: "confirmed", at: receipt.ts, ...(note ? { note } : {}) };
177
+ }
159
178
  if (receipt.submitted === false) {
160
179
  return {
161
180
  delivery: "pending",
@@ -252,7 +271,7 @@ export async function sendCommandTool(args) {
252
271
  const wait = args.waitForDelivery ?? true;
253
272
  const deliveryTimeoutMs = args.deliveryTimeoutMs ?? 8000;
254
273
  const receipt = wait ? await waitForReceipt(args.to, msg.id, deliveryTimeoutMs) : null;
255
- const outcome = wait ? deliveryOutcome(args.to, receipt, deliveryTimeoutMs) : null;
274
+ const outcome = wait ? deliveryOutcome(args.to, receipt, deliveryTimeoutMs, newestPusherSourceMtime()) : null;
256
275
  const confirmed = outcome?.delivery === "confirmed";
257
276
  // After /clear the receiver forgets its identity and that it's bus-attached
258
277
  // (the system prompt isn't re-applied because /clear isn't a session
@@ -275,7 +294,10 @@ export async function sendCommandTool(args) {
275
294
  delivery: outcome.delivery,
276
295
  confirmed,
277
296
  ...(outcome.at !== undefined ? { deliveredAt: outcome.at } : {}),
278
- ...(confirmed ? {} : { warning: outcome.reason }),
297
+ // A confirmed delivery can still warn: the note names a reporting
298
+ // pusher whose build identity is stale or absent. `confirmed`
299
+ // stays true — the command ran; the warning is about who said so.
300
+ ...(confirmed ? (outcome.note ? { warning: outcome.note } : {}) : { warning: outcome.reason }),
279
301
  }
280
302
  : {}),
281
303
  ...(reminderMs > 0 ? { reminderScheduled: { delayMs: reminderMs, recipients: [args.to] } } : {}),
@@ -310,16 +332,21 @@ export async function sendCommandTool(args) {
310
332
  let confirmed = [];
311
333
  let pending = [];
312
334
  let pendingReasons = [];
335
+ let confirmNotes = [];
313
336
  if (wait) {
337
+ const sourceMtime = newestPusherSourceMtime();
314
338
  const results = await Promise.all(delivered.map(async (m) => ({
315
339
  m,
316
- outcome: deliveryOutcome(m, await waitForReceipt(m, msg.id, deliveryTimeoutMs), deliveryTimeoutMs),
340
+ outcome: deliveryOutcome(m, await waitForReceipt(m, msg.id, deliveryTimeoutMs), deliveryTimeoutMs, sourceMtime),
317
341
  })));
318
342
  confirmed = results.filter((r) => r.outcome.delivery === "confirmed").map((r) => r.m);
319
343
  pending = results.filter((r) => r.outcome.delivery !== "confirmed").map((r) => r.m);
320
344
  pendingReasons = results
321
345
  .filter((r) => r.outcome.delivery !== "confirmed")
322
346
  .map((r) => `${r.m}: ${r.outcome.reason}`);
347
+ confirmNotes = results
348
+ .filter((r) => r.outcome.delivery === "confirmed" && r.outcome.note)
349
+ .map((r) => r.outcome.note);
323
350
  }
324
351
  // Same post-/clear re-anchor as the DM path — one reminder per delivered
325
352
  // member, in their own inbox, with their own agentId in the body.
@@ -344,6 +371,9 @@ export async function sendCommandTool(args) {
344
371
  warning: `not confirmed as submitted within ${deliveryTimeoutMs}ms — ${pendingReasons.join(" | ")}`,
345
372
  }
346
373
  : {}),
374
+ // Confirmed members whose reporting pusher is stale or unstamped —
375
+ // the confirmations stand, the notes say whose code issued them.
376
+ ...(confirmNotes.length ? { notes: confirmNotes } : {}),
347
377
  }
348
378
  : {}),
349
379
  ...(reminderMs > 0 ? { reminderScheduled: { delayMs: reminderMs, recipients: delivered } } : {}),
@@ -590,6 +620,11 @@ export const joinSchema = {
590
620
  // false → never; object → attach with overrides.
591
621
  attach: z.union([z.boolean(), joinAttachOptionsSchema]).optional(),
592
622
  readInbox: z.boolean().optional(),
623
+ // First-claim guard overrides (server.ts guardFirstClaim): claiming an id
624
+ // that is LIVE on the bus refuses unless the call presents that agent's
625
+ // token (tokens.json / coord-token) or force:true. Ignored once bound.
626
+ token: z.string().optional(),
627
+ force: z.boolean().optional(),
593
628
  };
594
629
  export async function joinTool(args) {
595
630
  const reg = await registerTool({
@@ -681,6 +716,13 @@ export const reportReceiptSchema = {
681
716
  submitted: z.boolean().optional(),
682
717
  verified: z.boolean().optional(),
683
718
  reason: z.string().optional(),
719
+ // Build identity of the reporting pusher: newest mtime across its loaded
720
+ // module graph (entry file + hooks/ imports), sampled once at its startup —
721
+ // the same basis report_transport's scriptMtime uses. Absent → the receipt's
722
+ // provenance is UNKNOWN and deliveryOutcome says so; the server never
723
+ // defaults it (a default here would be assume-fresh, the twin of the
724
+ // assume-success `submitted` refuses to invent).
725
+ scriptMtime: z.number().optional(),
684
726
  };
685
727
  // Wire-callable counterpart to the local pusher's receipt stamp (writeReceipts
686
728
  // in hooks/tmux-pusher.mjs). A remote pusher types into a pane on ANOTHER
@@ -707,6 +749,7 @@ export async function reportReceiptTool(args) {
707
749
  ...(args.submitted !== undefined ? { submitted: args.submitted } : {}),
708
750
  ...(args.verified !== undefined ? { verified: args.verified } : {}),
709
751
  ...(args.reason !== undefined ? { reason: args.reason } : {}),
752
+ ...(args.scriptMtime !== undefined ? { scriptMtime: args.scriptMtime } : {}),
710
753
  };
711
754
  await appendJsonl(receiptFile(args.agentId), receipt);
712
755
  return { ok: true, receipt };
@@ -818,15 +861,24 @@ export async function doctorTool(args) {
818
861
  {
819
862
  const localPusherMtime = newestPusherSourceMtime();
820
863
  const stale = [];
864
+ const unverifiable = [];
821
865
  for (const fname of await listTransportFiles()) {
822
866
  const file = path.join(TRANSPORT_DIR, fname);
823
867
  const marker = await readJson(file, null);
824
868
  if (!marker || !isMarkerLive(marker, reg, now))
825
869
  continue;
826
870
  if (marker.transport !== "tmux-push")
827
- continue; // remote = can't verify
828
- if (marker.scriptMtime === undefined)
829
- continue; // pre-v0.8.2 marker, no info
871
+ continue; // remote = can't verify (documented limit: can't stat another host)
872
+ if (marker.scriptMtime === undefined) {
873
+ // ABSENCE IS NOT EXEMPTION. The field's own writer once dropped it,
874
+ // and the silent skip here meant the check was disabled by the very
875
+ // thing it monitors — a live pusher we cannot verify is a warn, not
876
+ // an ok (credit agent-coordination-david-dev). Same flip, same
877
+ // commit, as serverBuildMtime below: the two checks must never
878
+ // disagree about what absence means.
879
+ unverifiable.push(`${marker.agentId} (pid ${marker.pid}, no scriptMtime stamp — cannot verify; detach_agent + attach_agent to re-stamp)`);
880
+ continue;
881
+ }
830
882
  if (localPusherMtime === undefined)
831
883
  continue;
832
884
  if (marker.scriptMtime < localPusherMtime - 1) { // -1ms slack for fs mtime rounding
@@ -835,14 +887,15 @@ export async function doctorTool(args) {
835
887
  stale.push(`${marker.agentId} (pid ${marker.pid}, loaded ${loaded}, on-disk now ${ondisk})`);
836
888
  }
837
889
  }
890
+ const bad = [...stale, ...unverifiable];
838
891
  findings.push({
839
892
  check: "stale-pusher-script",
840
- level: stale.length ? "warn" : "ok",
841
- detail: stale.length
842
- ? `${stale.length} attached pusher(s) running pre-upgrade code — control commands (/clear, /compact) may be silently dropped. Run detach_agent + attach_agent for each, or have the agent relaunch.`
893
+ level: bad.length ? "warn" : "ok",
894
+ detail: bad.length
895
+ ? `${stale.length} attached pusher(s) running pre-upgrade code and ${unverifiable.length} whose freshness cannot be verified (no stamp) — control commands (/clear, /compact) may be silently dropped. Run detach_agent + attach_agent for each, or have the agent relaunch.`
843
896
  : "all attached pushers are running the current on-disk script",
844
897
  fixable: false,
845
- items: stale.length ? stale : undefined,
898
+ items: bad.length ? bad : undefined,
846
899
  });
847
900
  }
848
901
  // 1b². The same staleness class one layer up: doctor itself runs inside an
@@ -897,20 +950,28 @@ export async function doctorTool(args) {
897
950
  {
898
951
  const onDisk = onDiskBuildMtime();
899
952
  const outdated = [];
953
+ const unverifiable = [];
900
954
  for (const fname of await listTransportFiles()) {
901
955
  const file = path.join(TRANSPORT_DIR, fname);
902
956
  const marker = await readJson(file, null);
903
957
  if (!marker || !isMarkerLive(marker, reg, now))
904
958
  continue;
905
959
  if (marker.transport !== "tmux-push")
906
- continue; // remote = can't verify
907
- // Absent field = pre-upgrade marker: SKIP, deliberately mirroring the
908
- // scriptMtime semantics in 1b. Two checks holding different opinions
909
- // about the same absence would be harder to see than either behaviour
910
- // alone — the queued P2 ("missing scriptMtime is a skip, not a warn")
911
- // flips BOTH together. Do not "fix" one half here.
912
- if (marker.serverBuildMtime === undefined)
960
+ continue; // remote = can't verify (documented limit: can't stat another host)
961
+ if (marker.serverBuildMtime === undefined) {
962
+ // ABSENCE IS NOT EXEMPTION — flipped in the same commit as the
963
+ // scriptMtime absence above, so the two checks can never disagree
964
+ // about what a missing stamp means. An unstamped marker was written
965
+ // by a pre-provenance server (or by hand): precisely the population
966
+ // this check exists to police, and the one it must not exempt.
967
+ // Transition is deliberately correct-and-loud: after the upgrade,
968
+ // every pre-existing marker warns at once, each cleared by a session
969
+ // restart + re-attach — the burst is also the only external view of
970
+ // which sessions still run pre-provenance servers, since a stale
971
+ // server cannot self-report (see 1b²).
972
+ unverifiable.push(`${marker.agentId} (no serverBuildMtime stamp — stamped by a pre-provenance server; restart that session, then detach_agent + attach_agent)`);
913
973
  continue;
974
+ }
914
975
  if (onDisk === undefined)
915
976
  continue;
916
977
  if (marker.serverBuildMtime < onDisk - 1) {
@@ -919,14 +980,15 @@ export async function doctorTool(args) {
919
980
  outdated.push(`${marker.agentId} (stamped by server build ${stamped}, on-disk build ${current})`);
920
981
  }
921
982
  }
983
+ const bad = [...outdated, ...unverifiable];
922
984
  findings.push({
923
985
  check: "marker-server-provenance",
924
- level: outdated.length ? "warn" : "ok",
925
- detail: outdated.length
926
- ? `${outdated.length} transport marker(s) stamped by a server build older than dist/ — the stamping/spawn logic (freshness basis, pusher argv) predates the current code. Restart that agent's session, then detach_agent + attach_agent.`
986
+ level: bad.length ? "warn" : "ok",
987
+ detail: bad.length
988
+ ? `${outdated.length} transport marker(s) stamped by a server build older than dist/ and ${unverifiable.length} with no provenance stamp at all — the stamping/spawn logic (freshness basis, pusher argv) predates or cannot be tied to the current code. Restart that agent's session, then detach_agent + attach_agent.`
927
989
  : "all local transport markers were stamped by the current server build",
928
990
  fixable: false,
929
- items: outdated.length ? outdated : undefined,
991
+ items: bad.length ? bad : undefined,
930
992
  });
931
993
  }
932
994
  // 1c. Wedged local pushers (pid-alive, pane-dead). v0.8.0 made pushers
@@ -1002,6 +1064,53 @@ export async function doctorTool(args) {
1002
1064
  : undefined,
1003
1065
  });
1004
1066
  }
1067
+ // 1d. Duplicate session bindings — two live MCP sessions bound to one agent
1068
+ // id means two processes are ACTING as the same agent (the
1069
+ // disavow-liaison shape: a dev session bound onto a live worker's id;
1070
+ // force/token make that possible on purpose, this makes it visible).
1071
+ // Bindings are per-process closure state, so this reads the on-disk
1072
+ // session markers stdio servers write at bind time. A marker whose pid
1073
+ // is dead is litter from a killed session (default signal death skips
1074
+ // exit handlers) — cleaned under fix. Live duplicates are NOT auto-
1075
+ // fixable: doctor cannot know which of two running sessions is the
1076
+ // impostor; the wrong session should `quit` (its marker clears on exit).
1077
+ {
1078
+ const byAgent = new Map();
1079
+ const stale = [];
1080
+ for (const file of await listSessionFiles()) {
1081
+ const s = await readJson(file, null);
1082
+ if (!s || typeof s.pid !== "number" || !s.agentId || !isPidAlive(s.pid)) {
1083
+ stale.push(path.basename(file));
1084
+ if (fix) {
1085
+ await deleteFile(file);
1086
+ fixed.push(`deleted stale session binding ${path.basename(file)}`);
1087
+ }
1088
+ continue;
1089
+ }
1090
+ const list = byAgent.get(s.agentId) ?? [];
1091
+ list.push({ pid: s.pid, via: s.via ?? "unknown", boundAt: s.boundAt ?? 0 });
1092
+ byAgent.set(s.agentId, list);
1093
+ }
1094
+ const dupes = [];
1095
+ for (const [id, list] of byAgent) {
1096
+ if (list.length < 2)
1097
+ continue;
1098
+ dupes.push(`${id} — ${list
1099
+ .map((b) => `pid ${b.pid} (via ${b.via}, bound ${b.boundAt ? new Date(b.boundAt).toISOString() : "unknown"})`)
1100
+ .join(" AND ")}`);
1101
+ }
1102
+ findings.push({
1103
+ check: "duplicate-session-binding",
1104
+ level: dupes.length ? "warn" : "ok",
1105
+ detail: dupes.length
1106
+ ? `${dupes.length} agent id(s) bound by more than one live session — two processes are acting as the same agent. Decide which is legitimate; the other should quit (its binding clears on exit).`
1107
+ : stale.length
1108
+ ? `no duplicate session bindings (${stale.length} stale binding file(s) from dead sessions${fix ? " — cleaned" : "; run doctor with fix:true to clean"})`
1109
+ : "no duplicate session bindings",
1110
+ fixable: true,
1111
+ items: dupes.length ? dupes : undefined,
1112
+ });
1113
+ }
1005
1114
  // 2. Orphan room memberships (member not in the registry).
1006
1115
  {
1007
1116
  const orphans = new Set();