agent-coord-mcp 0.25.0 → 0.25.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.
package/README.md CHANGED
@@ -69,7 +69,7 @@ If you're building an agent with the official MCP SDKs (`@modelcontextprotocol/s
69
69
  | `heartbeat({agentId})` | Manual heartbeat. Usually unnecessary — agents with a live transport get heartbeats auto-bumped on every `list_agents`. |
70
70
  | `list_agents()` | See all known agents, who looks online, and which `transport` (if any) they have attached. Validates transport pid liveness on every call. |
71
71
  | `send_message({from, to?, room?, text, kind?})` | If `to` set → that agent's inbox (DM). Else → a channel: `room` names it (`"seo"` / `"#seo"`), omit for the default `general` channel. Tag channel posts with `kind: "decision"` for GOs/verdicts (longer retention, quoted in digests), `"status"` for progress notes; absent = chatter. |
72
- | `send_command({from, to?, command, reminderMs?, reminderText?})` / `send_command({from, room, command, ...})` | Inject a context-management slash command (`/clear`, `/compact` or `/reload-skills`) **directly into a sub-agent's CLI** — delivered raw (no banner/prefix) so the receiving TUI runs it as a real slash command. `to` targets one agent; `room` broadcasts to a channel's tmux-attached members (never the sender). **Gated to tmux:** returns `ok:false` unless the target has a live `tmux-push`(`-remote`) transport. Command allowlist is locked to `/clear` + `/compact`. After `/clear`, a follow-up identity-reminder DM is auto-scheduled (`reminderMs:0` to opt out, `reminderText` to override) so the freshly-cleared worker re-anchors on its agentId and bus attach state. **Blocks until an out-of-band delivery receipt confirms the command reached the pane** (`delivery:"confirmed"`+`deliveredAt`, or `"pending"`+`warning` on a stale pusher); `waitForDelivery:false` for fire-and-forget, `deliveryTimeoutMs` to tune. See [clearing sub-agent context](#clearing-sub-agent-context-send_command). |
72
+ | `send_command({from, to?, command, reminderMs?, reminderText?})` / `send_command({from, room, command, ...})` | Inject a context-management slash command (`/clear`, `/compact` or `/reload-skills`) **directly into a sub-agent's CLI** — delivered raw (no banner/prefix) so the receiving TUI runs it as a real slash command. `to` targets one agent; `room` broadcasts to a channel's tmux-attached members (never the sender). **Gated to tmux:** returns `ok:false` unless the target has a live `tmux-push`(`-remote`) transport. Command allowlist is locked to `/clear` + `/compact` + `/reload-skills`. After `/clear`, a follow-up identity-reminder DM is auto-scheduled (`reminderMs:0` to opt out, `reminderText` to override) so the freshly-cleared worker re-anchors on its agentId and bus attach state. **Blocks until an out-of-band delivery receipt confirms the command reached the pane** (`delivery:"confirmed"`+`deliveredAt`, or `"pending"`+`warning` on a stale pusher); `waitForDelivery:false` for fire-and-forget, `deliveryTimeoutMs` to tune. See [clearing sub-agent context](#clearing-sub-agent-context-send_command). |
73
73
  | `read_messages({agentId, source, room?, limit?, peek?, sinceTs?})` | Read new messages. `source` is `inbox`/`room`/`status`; for `room`, `room` picks the channel (default `general`). Advances the per-channel cursor unless `peek:true`. Room reads return the most recent `limit` (default 50); any older overflow is replaced by a compact `history` digest carrying a retrieval hash. |
74
74
  | `retrieve_room_history({agentId, hash, query?})` | Expand a `history` digest from `read_messages` into the original overflow messages. `query` filters to matching messages (case-insensitive substring). Scoped to the producing agent; entries expire after 30 min. |
75
75
  | `post_status({agentId, status, detail?})` | Append to the shared status stream (separate from chat). |
package/dist/server.js CHANGED
@@ -160,7 +160,7 @@ function buildServer(initialBound, opts = {}) {
160
160
  }
161
161
  const server = new McpServer({
162
162
  name: "agent-coord",
163
- version: "0.25.0",
163
+ version: "0.25.1",
164
164
  });
165
165
  const addTool = (name, description, inputSchema, cb) => {
166
166
  server.registerTool(name, { description, inputSchema: z.object(inputSchema) }, async (args) => cb((args ?? {})));
@@ -224,7 +224,8 @@ function readJsonl(file) {
224
224
  }
225
225
 
226
226
  // Allowlisted control commands the bus may type into this CLI. Mirrors
227
- // CONTROL_COMMANDS in src/tools.ts; kept tiny + literal so a bugged/compromised
227
+ // CONTROL_COMMANDS in src/tools/transport.ts and scripts/coord-pusher.mjs
228
+ // (test/allowlist-parity.test.mjs locks the three); kept tiny + literal so a bugged/compromised
228
229
  // sender can't smuggle an arbitrary slash command past the guard below.
229
230
  const CONTROL_COMMANDS = new Set(["/clear", "/compact", "/reload-skills"]);
230
231
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-coord-mcp",
3
- "version": "0.25.0",
3
+ "version": "0.25.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.1"
49
+ "@davidbalzan/groundwork-seam": "0.1.2"
50
50
  },
51
51
  "devDependencies": {
52
52
  "@types/node": "^26.2.0",
@@ -55,7 +55,8 @@
55
55
  "typescript": "^7.0.2"
56
56
  },
57
57
  "scripts": {
58
- "build": "tsc",
58
+ "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
59
+ "build": "pnpm run clean && tsc",
59
60
  "start": "node dist/server.js",
60
61
  "dev": "tsx src/server.ts",
61
62
  "pretest": "node scripts/check-self-dependency.mjs && tsc",
@@ -22,7 +22,7 @@
22
22
 
23
23
  import { spawn } from "node:child_process";
24
24
 
25
- const EXPECTED_TESTS = 282;
25
+ const EXPECTED_TESTS = 283;
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
@@ -179,8 +179,9 @@ let pending = [];
179
179
  let debounceTimer = null;
180
180
  let sending = false;
181
181
 
182
- // Allowlisted control commands (mirrors CONTROL_COMMANDS in src/tools.ts).
183
- const CONTROL_COMMANDS = new Set(["/clear", "/compact"]);
182
+ // Allowlisted control commands (mirrors CONTROL_COMMANDS in src/tools/transport.ts and
183
+ // hooks/tmux-pusher.mjs test/allowlist-parity.test.mjs locks the three together).
184
+ const CONTROL_COMMANDS = new Set(["/clear", "/compact", "/reload-skills"]);
184
185
 
185
186
  // Shells we refuse to inject into: if the pane's foreground command is one of
186
187
  // these, the agent CLI has exited and typing would run pasted text as commands.
package/src/server.ts CHANGED
@@ -241,7 +241,7 @@ function buildServer(initialBound?: string, opts: { trackSession?: boolean } = {
241
241
 
242
242
  const server = new McpServer({
243
243
  name: "agent-coord",
244
- version: "0.25.0",
244
+ version: "0.25.1",
245
245
  });
246
246
 
247
247
  const addTool = (