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 +1 -1
- package/dist/server.js +1 -1
- package/hooks/tmux-pusher.mjs +2 -1
- package/package.json +4 -3
- package/scripts/check-test-count.mjs +1 -1
- package/scripts/coord-pusher.mjs +3 -2
- package/src/server.ts +1 -1
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.
|
|
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 ?? {})));
|
package/hooks/tmux-pusher.mjs
CHANGED
|
@@ -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
|
|
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.
|
|
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.
|
|
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
|
-
"
|
|
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 =
|
|
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
|
package/scripts/coord-pusher.mjs
CHANGED
|
@@ -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
|
-
|
|
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