agent-comms 1.1.0 → 1.2.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 (73) hide show
  1. package/.claude-plugin/marketplace.json +21 -0
  2. package/.claude-plugin/plugin.json +21 -0
  3. package/README.md +83 -22
  4. package/dist/bridges/claude-code/channel.d.ts +1 -0
  5. package/dist/bridges/claude-code/channel.d.ts.map +1 -1
  6. package/dist/bridges/claude-code/channel.js +18 -37
  7. package/dist/bridges/claude-code/channel.js.map +1 -1
  8. package/dist/bridges/codex/tool.d.ts +2 -1
  9. package/dist/bridges/codex/tool.d.ts.map +1 -1
  10. package/dist/bridges/codex/tool.js +24 -19
  11. package/dist/bridges/codex/tool.js.map +1 -1
  12. package/dist/bridges/index.d.ts.map +1 -1
  13. package/dist/bridges/index.js +2 -4
  14. package/dist/bridges/index.js.map +1 -1
  15. package/dist/bridges/mcp/index.d.ts +11 -0
  16. package/dist/bridges/mcp/index.d.ts.map +1 -0
  17. package/dist/bridges/mcp/index.js +76 -0
  18. package/dist/bridges/mcp/index.js.map +1 -0
  19. package/dist/bridges/opencode/plugin.d.ts +2 -2
  20. package/dist/bridges/opencode/plugin.d.ts.map +1 -1
  21. package/dist/bridges/opencode/plugin.js +22 -22
  22. package/dist/bridges/opencode/plugin.js.map +1 -1
  23. package/dist/bridges/pi/index.d.ts +2 -2
  24. package/dist/bridges/pi/index.d.ts.map +1 -1
  25. package/dist/bridges/pi/index.js +12 -35
  26. package/dist/bridges/pi/index.js.map +1 -1
  27. package/dist/cli.js +4 -108
  28. package/dist/cli.js.map +1 -1
  29. package/dist/core/bridge.d.ts +7 -7
  30. package/dist/core/bridge.d.ts.map +1 -1
  31. package/dist/core/bridge.js +2 -2
  32. package/dist/core/bridge.js.map +1 -1
  33. package/dist/core/comms-store.d.ts +48 -0
  34. package/dist/core/comms-store.d.ts.map +1 -0
  35. package/dist/core/comms-store.js +11 -0
  36. package/dist/core/comms-store.js.map +1 -0
  37. package/dist/core/index.d.ts +6 -4
  38. package/dist/core/index.d.ts.map +1 -1
  39. package/dist/core/index.js +4 -3
  40. package/dist/core/index.js.map +1 -1
  41. package/dist/core/mesh-store.d.ts +88 -0
  42. package/dist/core/mesh-store.d.ts.map +1 -0
  43. package/dist/core/mesh-store.js +790 -0
  44. package/dist/core/mesh-store.js.map +1 -0
  45. package/dist/core/store.d.ts +3 -2
  46. package/dist/core/store.d.ts.map +1 -1
  47. package/dist/core/store.js +20 -20
  48. package/dist/core/store.js.map +1 -1
  49. package/dist/core/tool.d.ts +9 -9
  50. package/dist/core/tool.d.ts.map +1 -1
  51. package/dist/core/tool.js +5 -5
  52. package/dist/core/tool.js.map +1 -1
  53. package/dist/core/types.d.ts +2 -2
  54. package/dist/core/types.d.ts.map +1 -1
  55. package/dist/core/types.js +2 -2
  56. package/dist/core/types.js.map +1 -1
  57. package/dist/test/mesh-e2e.test.d.ts +8 -0
  58. package/dist/test/mesh-e2e.test.d.ts.map +1 -0
  59. package/dist/test/mesh-e2e.test.js +126 -0
  60. package/dist/test/mesh-e2e.test.js.map +1 -0
  61. package/dist/test/mesh-smoke.test.d.ts +9 -0
  62. package/dist/test/mesh-smoke.test.d.ts.map +1 -0
  63. package/dist/test/mesh-smoke.test.js +193 -0
  64. package/dist/test/mesh-smoke.test.js.map +1 -0
  65. package/package.json +17 -4
  66. package/dist/bridges/codex/post_tool_use.d.ts +0 -13
  67. package/dist/bridges/codex/post_tool_use.d.ts.map +0 -1
  68. package/dist/bridges/codex/post_tool_use.js +0 -118
  69. package/dist/bridges/codex/post_tool_use.js.map +0 -1
  70. package/dist/bridges/codex/stop_hook.d.ts +0 -13
  71. package/dist/bridges/codex/stop_hook.d.ts.map +0 -1
  72. package/dist/bridges/codex/stop_hook.js +0 -113
  73. package/dist/bridges/codex/stop_hook.js.map +0 -1
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "agent-comms",
3
+ "owner": {
4
+ "name": "ExaDev"
5
+ },
6
+ "metadata": {
7
+ "description": "Cross-harness communication bus for LLM agents",
8
+ "homepage": "https://github.com/ExaDev/agent-comms#readme"
9
+ },
10
+ "plugins": [
11
+ {
12
+ "name": "agent-comms",
13
+ "source": {
14
+ "source": "url",
15
+ "url": "https://github.com/ExaDev/agent-comms.git"
16
+ },
17
+ "description": "Cross-harness LLM agent communication bus — rooms, DMs, and presence",
18
+ "version": "1.1.0"
19
+ }
20
+ ]
21
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "agent-comms",
3
+ "description": "Cross-harness LLM agent communication bus — rooms, DMs, and presence",
4
+ "version": "1.2.0",
5
+ "author": {
6
+ "name": "ExaDev"
7
+ },
8
+ "homepage": "https://github.com/ExaDev/agent-comms#readme",
9
+ "repository": "https://github.com/ExaDev/agent-comms",
10
+ "license": "MIT",
11
+ "mcpServers": {
12
+ "agent-comms": {
13
+ "command": "npx",
14
+ "args": [
15
+ "agent-comms",
16
+ "bridge",
17
+ "claude-code"
18
+ ]
19
+ }
20
+ }
21
+ }
package/README.md CHANGED
@@ -1,23 +1,76 @@
1
1
  # Agent Comms
2
2
 
3
- Cross-harness communication bus for LLM agents. Rooms, DMs, presence, and visibility — all via a shared filesystem protocol. No server process required.
3
+ Cross-harness communication bus for LLM agents. Rooms, DMs, presence, and visibility — via a TCP peer mesh with zero filesystem dependencies.
4
4
 
5
5
  ## How it works
6
6
 
7
+ Each bridge instance is a peer in a TCP mesh on localhost. The first instance to start becomes the **coordinator** (port 19876). Subsequent instances connect to the coordinator, receive the peer list, and establish direct data connections with every other peer.
8
+
7
9
  ```
8
- ~/.agents/bus/ ← shared filesystem (no server process)
9
- ├── registry/
10
- ├── agents/*.json ← agent identities, visibility, status
11
- └── rooms/*.json ← room definitions, membership
12
- ├── rooms/{id}/*.json ← room message history
13
- ├── dms/{a}--{b}/*.json ← direct message history
14
- └── delivery/{id}/*.json per-agent push queue (drained by bridges)
10
+ Agent A (pi) Agent B (Claude Code)
11
+ │ │
12
+ pi bridge ◀──TCP localhost──▶ Claude bridge
13
+ │ │
14
+ │ agent_comms( channel notification
15
+ │ "send", │
16
+ ... Claude surfaces it
17
+ │ ) to the LLM
18
+ │ │
19
+ │ push to B's bridge ───────────▶ handled
15
20
  ```
16
21
 
17
- Every operation is a file read/write. A bridge translates file changes into its harness's native push mechanismthe core knows nothing about which harnesses exist.
22
+ All state is held in memory and synchronised between peers. Delivery events are pushed directly over TCPno polling, no filesystem, no daemon process.
23
+
24
+ ### Coordinator pattern
25
+
26
+ - **Well-known port** 19876 on localhost — the only agreed-upon constant
27
+ - The first instance to bind it becomes coordinator
28
+ - Coordinator handles introductions only — not a router
29
+ - On graceful shutdown, coordinator hands over to the longest-running peer
30
+ - On crash, remaining peers race to bind the port (~100ms recovery)
31
+
32
+ ### Identity
33
+
34
+ Each instance gets a unique peer ID on startup. Mesh state is in-memory — when a process exits, its peer is gone. Identity is not persisted because the mesh state dies with the process.
18
35
 
19
36
  ## Install
20
37
 
38
+ ### pi
39
+
40
+ ```bash
41
+ pi install npm:agent-comms
42
+ ```
43
+
44
+ The [`pi` manifest](/package.json) registers the extension automatically.
45
+
46
+ ### Claude Code
47
+
48
+ ```bash
49
+ claude plugin marketplace add https://github.com/ExaDev/agent-comms
50
+ claude plugin install agent-comms@agent-comms
51
+ ```
52
+
53
+ This repo serves as its own marketplace. The [plugin manifest](/.claude-plugin/plugin.json) defines the MCP server.
54
+
55
+ ### Any MCP-compatible harness
56
+
57
+ Add to your MCP server configuration:
58
+
59
+ ```json
60
+ {
61
+ "mcpServers": {
62
+ "agent-comms": {
63
+ "command": "npx",
64
+ "args": ["agent-comms", "bridge", "mcp"]
65
+ }
66
+ }
67
+ }
68
+ ```
69
+
70
+ The generic MCP bridge works with any MCP client. Incoming messages are included in every tool response.
71
+
72
+ ### Other harnesses
73
+
21
74
  ```bash
22
75
  npx agent-comms # auto-detect harnesses and configure
23
76
  npx agent-comms status # check current configuration
@@ -50,21 +103,30 @@ A bridge is two things:
50
103
  Core provides shared helpers so each bridge only implements those two things:
51
104
 
52
105
  ```typescript
53
- import { BusStore, BusTool, buildAction, ensureRegistered, drainAndFormat } from "agent-comms";
54
-
55
- const store = new BusStore();
56
- const tool = new BusTool(store);
57
-
58
- // 1. Register or recover identity
106
+ import {
107
+ MeshStore,
108
+ CommsTool,
109
+ buildAction,
110
+ ensureRegistered,
111
+ formatDeliveryEvent,
112
+ } from "agent-comms";
113
+
114
+ const store = new MeshStore();
115
+ const tool = new CommsTool(store);
116
+
117
+ // 1. Initialise mesh and register identity
118
+ await store.init();
59
119
  const { agentId } = await ensureRegistered({ store, harness: "my-harness", defaultName: "my-agent" });
60
120
 
61
- // 2. Wire tool into your harness
62
- const action = buildAction(paramsFromToolCall);
63
- const result = await tool.handle({ agentId, harness: "my-harness", pid: process.pid }, action);
121
+ // 2. Wire delivery callback for real-time push
122
+ store.onDelivery = (_targetId, event) => {
123
+ const line = formatDeliveryEvent(event);
124
+ yourHarness.push(`📬 ${line}`);
125
+ };
64
126
 
65
- // 3. Push delivery events when the LLM finishes a turn
66
- const lines = await drainAndFormat(store, agentId);
67
- for (const line of lines) await yourHarness.push(`📬 ${line}`);
127
+ // 3. Wire tool into your harness
128
+ const action = buildAction(paramsFromToolCall);
129
+ const result = await tool.handle({ agentId, harness: "my-harness", cwd: process.cwd(), pid: process.pid }, action);
68
130
  ```
69
131
 
70
132
  See `src/bridges/` for working examples.
@@ -112,4 +174,3 @@ agent_comms({ action: "update", visibility: "hidden" })
112
174
  | `visible` | ✓ | ✓ | ✓ |
113
175
  | `hidden` | ✗ | ✓ (if ID known) | Members only |
114
176
  | `ghost` | ✗ | ✗ | ✗ |
115
-
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * MCP channel server that provides the "agent_comms" tool and pushes
5
5
  * incoming messages into Claude's context via <channel> events.
6
+ * Uses TCP mesh for real-time delivery — no filesystem polling.
6
7
  *
7
8
  * Run via: npx agent-comms bridge claude-code
8
9
  * Requires: claude --dangerously-load-development-channels
@@ -1 +1 @@
1
- {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../../src/bridges/claude-code/channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAqBH,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAyGzC"}
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../../src/bridges/claude-code/channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAmBH,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAuFzC"}
@@ -3,50 +3,35 @@
3
3
  *
4
4
  * MCP channel server that provides the "agent_comms" tool and pushes
5
5
  * incoming messages into Claude's context via <channel> events.
6
+ * Uses TCP mesh for real-time delivery — no filesystem polling.
6
7
  *
7
8
  * Run via: npx agent-comms bridge claude-code
8
9
  * Requires: claude --dangerously-load-development-channels
9
10
  */
10
11
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
11
12
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
12
- import * as path from "node:path";
13
- import * as os from "node:os";
14
- import { BusStore, BusTool, buildAction, ensureRegistered, drainAndFormat, MCP_TOOL_PARAMS, } from "../../core/index.js";
13
+ import { MeshStore, CommsTool, buildAction, ensureRegistered, formatDeliveryEvent, MCP_TOOL_PARAMS, } from "../../core/index.js";
15
14
  import { nanoid } from "../../core/nanoid.js";
16
15
  function isRecord(value) {
17
16
  return typeof value === "object" && value !== null && !Array.isArray(value);
18
17
  }
19
18
  export async function run() {
20
- const store = new BusStore(path.join(os.homedir(), ".agents", "bus"));
21
- const tool = new BusTool(store);
19
+ const store = new MeshStore();
20
+ const tool = new CommsTool(store);
22
21
  let agentId;
23
- let watchTimer;
24
22
  const mcp = new McpServer({ name: "agent-comms", version: "0.2.0" }, {
25
23
  capabilities: {
26
24
  experimental: { "claude/channel": {} },
27
25
  },
28
26
  });
29
- // -----------------------------------------------------------------------
30
- // Delivery polling (channels can't use fs.watch easily)
31
- // -----------------------------------------------------------------------
32
- function startDeliveryPoll() {
33
- if (watchTimer)
34
- return;
35
- watchTimer = setInterval(() => {
36
- void pollDelivery();
37
- }, 2000);
38
- }
39
- async function pollDelivery() {
40
- if (!agentId)
41
- return;
42
- const lines = await drainAndFormat(store, agentId);
43
- for (const line of lines) {
44
- await mcp.server.notification({
45
- method: "notifications/claude/channel",
46
- params: { content: line, meta: {} },
47
- });
48
- }
49
- }
27
+ // Incoming messages arrive via TCP mesh — push as channel notifications
28
+ store.onDelivery = async (_targetId, event) => {
29
+ const line = formatDeliveryEvent(event);
30
+ await mcp.server.notification({
31
+ method: "notifications/claude/channel",
32
+ params: { content: line, meta: {} },
33
+ });
34
+ };
50
35
  // -----------------------------------------------------------------------
51
36
  // Tool registration
52
37
  // -----------------------------------------------------------------------
@@ -61,21 +46,17 @@ export async function run() {
61
46
  }, async (rawParams) => {
62
47
  const params = isRecord(rawParams) ? rawParams : {};
63
48
  const actionParam = params.action;
64
- if (!agentId && actionParam !== "register") {
49
+ if (!agentId) {
50
+ const name = actionParam === "register" && typeof params.name === "string"
51
+ ? params.name
52
+ : `claude-code-${nanoid(4)}`;
65
53
  const reg = await ensureRegistered({
66
54
  cwd: process.cwd(),
67
55
  store,
68
56
  harness: "claude-code",
69
- defaultName: `claude-code-${nanoid(4)}`,
57
+ defaultName: name,
70
58
  });
71
59
  agentId = reg.agentId;
72
- startDeliveryPoll();
73
- }
74
- if (!agentId) {
75
- return {
76
- content: [{ type: "text", text: "Error: failed to register" }],
77
- isError: true,
78
- };
79
60
  }
80
61
  const action = buildAction(params);
81
62
  const result = await tool.handle({
@@ -92,6 +73,7 @@ export async function run() {
92
73
  // -----------------------------------------------------------------------
93
74
  // Startup
94
75
  // -----------------------------------------------------------------------
76
+ await store.init();
95
77
  await mcp.connect(new StdioServerTransport());
96
78
  const reg = await ensureRegistered({
97
79
  cwd: process.cwd(),
@@ -100,6 +82,5 @@ export async function run() {
100
82
  defaultName: `claude-code-${nanoid(4)}`,
101
83
  });
102
84
  agentId = reg.agentId;
103
- startDeliveryPoll();
104
85
  }
105
86
  //# sourceMappingURL=channel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"channel.js","sourceRoot":"","sources":["../../../src/bridges/claude-code/channel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../../../src/bridges/claude-code/channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EACL,SAAS,EACT,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG;IACvB,MAAM,KAAK,GAAG,IAAI,SAAS,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,OAA2B,CAAC;IAEhC,MAAM,GAAG,GAAG,IAAI,SAAS,CACvB,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,EACzC;QACE,YAAY,EAAE;YACZ,YAAY,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE;SACvC;KACF,CACF,CAAC;IAEF,wEAAwE;IACxE,KAAK,CAAC,UAAU,GAAG,KAAK,EAAE,SAAiB,EAAE,KAAK,EAAE,EAAE;QACpD,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC;YAC5B,MAAM,EAAE,8BAA8B;YACtC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;SACpC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,0EAA0E;IAC1E,oBAAoB;IACpB,0EAA0E;IAE1E,GAAG,CAAC,YAAY,CACd,aAAa,EACb;QACE,WAAW,EAAE;YACX,iDAAiD;YACjD,2EAA2E;YAC3E,+DAA+D;YAC/D,oEAAoE;SACrE,CAAC,IAAI,CAAC,GAAG,CAAC;QACX,WAAW,EAAE,eAAe;KAC7B,EACD,KAAK,EAAE,SAAkB,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,GACR,WAAW,KAAK,UAAU,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;gBAC3D,CAAC,CAAC,MAAM,CAAC,IAAI;gBACb,CAAC,CAAC,eAAe,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC;gBACjC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;gBAClB,KAAK;gBACL,OAAO,EAAE,aAAa;gBACtB,WAAW,EAAE,IAAI;aAClB,CAAC,CAAC;YACH,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QACxB,CAAC;QAED,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAC9B;YACE,OAAO;YACP,OAAO,EAAE,aAAa;YACtB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,EACD,MAAM,CACP,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YACjD,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,0EAA0E;IAC1E,UAAU;IACV,0EAA0E;IAE1E,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IACnB,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;IAE9C,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC;QACjC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,KAAK;QACL,OAAO,EAAE,aAAa;QACtB,WAAW,EAAE,eAAe,MAAM,CAAC,CAAC,CAAC,EAAE;KACxC,CAAC,CAAC;IACH,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;AACxB,CAAC"}
@@ -2,7 +2,8 @@
2
2
  * Agent Comms — Codex MCP tool server.
3
3
  *
4
4
  * Provides the "agent_comms" tool for Codex to call.
5
- * Push delivery is handled by the Stop hook (stop_hook.ts).
5
+ * Uses TCP mesh for state sync. Pending messages are drained and
6
+ * appended to every tool response so Codex sees them mid-turn.
6
7
  *
7
8
  * Run via: npx agent-comms bridge codex
8
9
  */
@@ -1 +1 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../src/bridges/codex/tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAoBH,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAuEzC"}
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../src/bridges/codex/tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmBH,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CA+EzC"}
@@ -2,22 +2,21 @@
2
2
  * Agent Comms — Codex MCP tool server.
3
3
  *
4
4
  * Provides the "agent_comms" tool for Codex to call.
5
- * Push delivery is handled by the Stop hook (stop_hook.ts).
5
+ * Uses TCP mesh for state sync. Pending messages are drained and
6
+ * appended to every tool response so Codex sees them mid-turn.
6
7
  *
7
8
  * Run via: npx agent-comms bridge codex
8
9
  */
9
10
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
10
11
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
11
- import * as path from "node:path";
12
- import * as os from "node:os";
13
- import { BusStore, BusTool, buildAction, ensureRegistered, MCP_TOOL_PARAMS, } from "../../core/index.js";
12
+ import { MeshStore, CommsTool, buildAction, ensureRegistered, drainAndFormat, MCP_TOOL_PARAMS, } from "../../core/index.js";
14
13
  import { nanoid } from "../../core/nanoid.js";
15
14
  function isRecord(value) {
16
15
  return typeof value === "object" && value !== null && !Array.isArray(value);
17
16
  }
18
17
  export async function run() {
19
- const store = new BusStore(path.join(os.homedir(), ".agents", "bus"));
20
- const tool = new BusTool(store);
18
+ const store = new MeshStore();
19
+ const tool = new CommsTool(store);
21
20
  let agentId;
22
21
  const mcp = new McpServer({ name: "agent-comms", version: "0.2.0" }, { capabilities: {} });
23
22
  // -----------------------------------------------------------------------
@@ -28,37 +27,43 @@ export async function run() {
28
27
  "Cross-harness agent communication bus. Actions:",
29
28
  "register, update, whoami, create_room, list_rooms, join_room, leave_room,",
30
29
  "send, dm, list_agents, read_room, invite, kick, destroy_room.",
31
- "Incoming messages are delivered automatically via the Stop hook.",
30
+ "Pending incoming messages are included in every response.",
32
31
  ].join(" "),
33
32
  inputSchema: MCP_TOOL_PARAMS,
34
33
  }, async (rawParams) => {
35
34
  const params = isRecord(rawParams) ? rawParams : {};
36
35
  const actionParam = params.action;
37
- if (!agentId && actionParam !== "register") {
36
+ if (!agentId) {
37
+ const name = actionParam === "register" && typeof params.name === "string"
38
+ ? params.name
39
+ : `codex-${nanoid(4)}`;
38
40
  const reg = await ensureRegistered({
39
41
  cwd: process.cwd(),
40
42
  store,
41
43
  harness: "codex",
42
- defaultName: `codex-${nanoid(4)}`,
44
+ defaultName: name,
43
45
  });
44
46
  agentId = reg.agentId;
45
47
  }
46
- if (!agentId) {
47
- return {
48
- content: [{ type: "text", text: "Error: failed to register" }],
49
- isError: true,
50
- };
51
- }
52
48
  const action = buildAction(params);
53
49
  const result = await tool.handle({ agentId, harness: "codex", cwd: process.cwd(), pid: process.pid }, action);
54
- return {
55
- content: [{ type: "text", text: result.content }],
56
- isError: result.isError,
57
- };
50
+ // Drain pending delivery messages and append to response
51
+ const deliveryLines = await drainAndFormat(store, agentId);
52
+ const content = [
53
+ { type: "text", text: result.content },
54
+ ];
55
+ if (deliveryLines.length > 0) {
56
+ content.push({
57
+ type: "text",
58
+ text: "📬 Incoming messages:\n" + deliveryLines.join("\n"),
59
+ });
60
+ }
61
+ return { content, isError: result.isError };
58
62
  });
59
63
  // -----------------------------------------------------------------------
60
64
  // Startup
61
65
  // -----------------------------------------------------------------------
66
+ await store.init();
62
67
  await mcp.connect(new StdioServerTransport());
63
68
  const reg = await ensureRegistered({
64
69
  cwd: process.cwd(),
@@ -1 +1 @@
1
- {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/bridges/codex/tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/bridges/codex/tool.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bridges/index.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC;AAED,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAK1C,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bridges/index.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC;AAED,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAI1C,CAAC"}
@@ -1,11 +1,9 @@
1
1
  import * as claudeCode from "./claude-code/channel.js";
2
2
  import * as codex from "./codex/tool.js";
3
- import * as codexStop from "./codex/stop_hook.js";
4
- import * as codexPostToolUse from "./codex/post_tool_use.js";
3
+ import * as mcp from "./mcp/index.js";
5
4
  export const bridges = {
6
5
  "claude-code": claudeCode,
7
6
  codex,
8
- "codex-stop": codexStop,
9
- "codex-post-tool-use": codexPostToolUse,
7
+ mcp,
10
8
  };
11
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bridges/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,KAAK,MAAM,iBAAiB,CAAC;AACzC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,gBAAgB,MAAM,0BAA0B,CAAC;AAM7D,MAAM,CAAC,MAAM,OAAO,GAA2B;IAC7C,aAAa,EAAE,UAAU;IACzB,KAAK;IACL,YAAY,EAAE,SAAS;IACvB,qBAAqB,EAAE,gBAAgB;CACxC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bridges/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,KAAK,MAAM,iBAAiB,CAAC;AACzC,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC;AAMtC,MAAM,CAAC,MAAM,OAAO,GAA2B;IAC7C,aAAa,EAAE,UAAU;IACzB,KAAK;IACL,GAAG;CACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Agent Comms — generic MCP tool server.
3
+ *
4
+ * Standard MCP server that works with any MCP-compatible harness.
5
+ * Uses TCP mesh for state sync. Pending messages are drained and
6
+ * appended to every tool response so the agent sees them.
7
+ *
8
+ * Run via: npx agent-comms bridge mcp
9
+ */
10
+ export declare function run(): Promise<void>;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/bridges/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmBH,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAgFzC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Agent Comms — generic MCP tool server.
3
+ *
4
+ * Standard MCP server that works with any MCP-compatible harness.
5
+ * Uses TCP mesh for state sync. Pending messages are drained and
6
+ * appended to every tool response so the agent sees them.
7
+ *
8
+ * Run via: npx agent-comms bridge mcp
9
+ */
10
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
11
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
12
+ import { MeshStore, CommsTool, buildAction, ensureRegistered, drainAndFormat, MCP_TOOL_PARAMS, } from "../../core/index.js";
13
+ import { nanoid } from "../../core/nanoid.js";
14
+ function isRecord(value) {
15
+ return typeof value === "object" && value !== null && !Array.isArray(value);
16
+ }
17
+ export async function run() {
18
+ const store = new MeshStore();
19
+ const tool = new CommsTool(store);
20
+ let agentId;
21
+ const mcp = new McpServer({ name: "agent-comms", version: "1.1.0" }, { capabilities: {} });
22
+ // -----------------------------------------------------------------------
23
+ // Tool registration
24
+ // -----------------------------------------------------------------------
25
+ mcp.registerTool("agent_comms", {
26
+ description: [
27
+ "Cross-harness agent communication bus. Actions:",
28
+ "register, update, whoami, create_room, list_rooms, join_room, leave_room,",
29
+ "send, dm, list_agents, read_room, invite, kick, destroy_room.",
30
+ "Pending incoming messages are included in every response.",
31
+ ].join(" "),
32
+ inputSchema: MCP_TOOL_PARAMS,
33
+ }, async (rawParams) => {
34
+ const params = isRecord(rawParams) ? rawParams : {};
35
+ const actionParam = params.action;
36
+ if (!agentId) {
37
+ const name = actionParam === "register" && typeof params.name === "string"
38
+ ? params.name
39
+ : `mcp-${nanoid(4)}`;
40
+ const reg = await ensureRegistered({
41
+ cwd: process.cwd(),
42
+ store,
43
+ harness: "mcp",
44
+ defaultName: name,
45
+ });
46
+ agentId = reg.agentId;
47
+ }
48
+ const action = buildAction(params);
49
+ const result = await tool.handle({ agentId, harness: "mcp", cwd: process.cwd(), pid: process.pid }, action);
50
+ // Drain pending delivery messages and append to response
51
+ const deliveryLines = await drainAndFormat(store, agentId);
52
+ const content = [
53
+ { type: "text", text: result.content },
54
+ ];
55
+ if (deliveryLines.length > 0) {
56
+ content.push({
57
+ type: "text",
58
+ text: "📬 Incoming messages:\n" + deliveryLines.join("\n"),
59
+ });
60
+ }
61
+ return { content, isError: result.isError };
62
+ });
63
+ // -----------------------------------------------------------------------
64
+ // Startup
65
+ // -----------------------------------------------------------------------
66
+ await store.init();
67
+ await mcp.connect(new StdioServerTransport());
68
+ const reg = await ensureRegistered({
69
+ cwd: process.cwd(),
70
+ store,
71
+ harness: "mcp",
72
+ defaultName: `mcp-${nanoid(4)}`,
73
+ });
74
+ agentId = reg.agentId;
75
+ }
76
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/bridges/mcp/index.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Agent Comms — OpenCode plugin bridge.
3
3
  *
4
- * Drains delivery queue on session.idle and injects messages via
5
- * tui.prompt.append + tui.submitPrompt.
4
+ * Receives incoming messages via TCP mesh push and injects them
5
+ * into the OpenCode TUI via tui.prompt.append + tui.submitPrompt.
6
6
  *
7
7
  * Install (project): ln -s ~/Developer/agent-comms/src/bridges/opencode/plugin.ts .opencode/plugins/agent-comms.ts
8
8
  * Install (global): ln -s ~/Developer/agent-comms/src/bridges/opencode/plugin.ts ~/.config/opencode/plugins/agent-comms.ts
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/bridges/opencode/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAqCH,eAAO,MAAM,gBAAgB,GAAU,MAAM;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,CAAC,EAAE,OAAO,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;uBA8C4B;QAAE,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE;EAMvD,CAAC"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/bridges/opencode/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiCH,eAAO,MAAM,gBAAgB,GAAU,MAAM;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,CAAC,EAAE,OAAO,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;uBAuC4B;QAAE,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE;EAgBvD,CAAC"}