agent-coord-mcp 0.26.0 → 0.26.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.
@@ -818,15 +818,38 @@ function setRoomOffset(cursor, chan, n) {
818
818
  else (cursor.roomOffsets ??= {})[c] = n;
819
819
  }
820
820
 
821
+ // Channels this agent is a MEMBER of, per rooms.json. #general included only
822
+ // if membership says so.
823
+ //
824
+ // It used to be seeded `new Set([DEFAULT_ROOM])` before the membership loop, so
825
+ // every pusher tailed #general whether or not the agent had ever joined it —
826
+ // membership was honoured for every channel except the one with the most
827
+ // traffic. Observed directly: rooms.json read `general -> 0 members []` while
828
+ // agents joined only to a project room were taking #general cross-project
829
+ // broadcasts into their panes.
830
+ //
831
+ // Deliberate consequence of dropping the seed: no registry (or an unparseable
832
+ // one) now yields NO channels rather than #general. Absence of a registry is
833
+ // absence of evidence of membership, and the safe reading of "I cannot tell
834
+ // whether this agent joined" is not "push to it" — that is the assumption that
835
+ // produced the defect. Nothing is lost either way: offsets are untouched here,
836
+ // so read_messages still serves whatever the pusher did not.
837
+ //
838
+ // Cursor safety: this function only decides what gets TAILED. Offsets advance
839
+ // exclusively in collectRoomChannel, which runs only for the channels returned
840
+ // here — so a channel this agent is not in has its offset left exactly where it
841
+ // was, and joining later resumes from that point. Not stranded (read_messages
842
+ // reads the same cursor), not skipped (nothing advanced it meanwhile), not
843
+ // double-served (the offset is preserved, not reset).
821
844
  function joinedRooms() {
822
845
  let reg = {};
823
846
  try {
824
847
  const raw = readFileSync(path.join(ROOT, "rooms.json"), "utf8");
825
848
  if (raw.trim()) reg = JSON.parse(raw);
826
849
  } catch {
827
- // no registry yet → just the default channel
850
+ // no registry yet → no memberships to honour
828
851
  }
829
- const out = new Set([DEFAULT_ROOM]);
852
+ const out = new Set();
830
853
  for (const [chan, e] of Object.entries(reg)) {
831
854
  if (e && Array.isArray(e.members) && e.members.includes(AGENT_ID)) out.add(chan);
832
855
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-coord-mcp",
3
- "version": "0.26.0",
3
+ "version": "0.26.1",
4
4
  "description": "File-backed MCP server for coordinating multiple AI coding agents (Claude Code, Cursor, Cline, etc.). Local stdio or networked over Streamable HTTP.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -46,7 +46,7 @@
46
46
  "@modelcontextprotocol/sdk": "^1.30.0",
47
47
  "proper-lockfile": "^4.1.2",
48
48
  "zod": "^4.4.3",
49
- "@davidbalzan/groundwork-seam": "0.1.3"
49
+ "@davidbalzan/groundwork-seam": "0.1.4"
50
50
  },
51
51
  "devDependencies": {
52
52
  "@types/node": "^26.2.0",
@@ -22,7 +22,7 @@
22
22
 
23
23
  import { spawn } from "node:child_process";
24
24
 
25
- const EXPECTED_TESTS = 312;
25
+ const EXPECTED_TESTS = 321;
26
26
 
27
27
  const expected = Number(process.env.AGENT_COORD_EXPECTED_TESTS ?? EXPECTED_TESTS);
28
28
  // Same glob the suite always used — `--test test/` would recurse differently