agent-comms 1.1.0 → 1.3.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 +10 -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 +90 -0
  42. package/dist/core/mesh-store.d.ts.map +1 -0
  43. package/dist/core/mesh-store.js +837 -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 +52 -2
  54. package/dist/core/types.d.ts.map +1 -1
  55. package/dist/core/types.js +18 -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,126 @@
1
+ /**
2
+ * End-to-end test for MeshStore TCP peer mesh.
3
+ *
4
+ * Spawns two MeshStore instances, verifies coordinator discovery,
5
+ * room creation, messaging, and delivery push.
6
+ */
7
+ import { MeshStore } from "../core/mesh-store.js";
8
+ import { CommsTool } from "../core/tool.js";
9
+ import { buildAction } from "../core/bridge.js";
10
+ import * as assert from "node:assert/strict";
11
+ const E2E_PORT = 19878;
12
+ async function createStore(name, harness) {
13
+ const store = new MeshStore(E2E_PORT);
14
+ const deliveries = [];
15
+ store.onDelivery = (_agentId, event) => {
16
+ deliveries.push(event);
17
+ };
18
+ const tool = new CommsTool(store);
19
+ await store.init();
20
+ await store.registerAgent({
21
+ name,
22
+ harness,
23
+ cwd: `/test/${name}`,
24
+ pid: process.pid,
25
+ visibility: "visible",
26
+ tags: [],
27
+ });
28
+ return { store, tool, deliveries };
29
+ }
30
+ async function main() {
31
+ console.log("Creating peer A (coordinator)...");
32
+ const a = await createStore("peer-a", "test-a");
33
+ // Give coordinator time to bind
34
+ await sleep(100);
35
+ console.log("Creating peer B (joins mesh)...");
36
+ const b = await createStore("peer-b", "test-b");
37
+ // Give peer B time to connect and sync
38
+ await sleep(300);
39
+ // --- Test: list agents ---
40
+ console.log("Test: list agents from A...");
41
+ const agentsA = await a.store.listAgents(a.store.peerId);
42
+ console.log(` A sees ${String(agentsA.length)} agent(s)`);
43
+ assert.ok(agentsA.length >= 1, "A should see at least 1 agent");
44
+ // Wait for state sync
45
+ await sleep(200);
46
+ console.log("Test: list agents from B...");
47
+ const agentsB = await b.store.listAgents(b.store.peerId);
48
+ console.log(` B sees ${String(agentsB.length)} agent(s)`);
49
+ assert.ok(agentsB.length >= 1, "B should see at least 1 agent");
50
+ // --- Test: create room ---
51
+ console.log("Test: create room...");
52
+ const roomId = `test-room-${String(Date.now())}`;
53
+ const room = await a.store.createRoom({
54
+ name: roomId,
55
+ type: "public",
56
+ owner: a.store.peerId,
57
+ description: "Test room",
58
+ });
59
+ console.log(` Created room: ${room.id}`);
60
+ await sleep(200);
61
+ // --- Test: B sees the room ---
62
+ console.log("Test: B lists rooms...");
63
+ const roomsB = await b.store.listRooms(b.store.peerId);
64
+ console.log(` B sees ${String(roomsB.length)} room(s)`);
65
+ assert.ok(roomsB.length >= 1, "B should see the room");
66
+ // --- Test: B joins room ---
67
+ console.log("Test: B joins room...");
68
+ await b.store.joinRoom(room.id, b.store.peerId);
69
+ await sleep(200);
70
+ // --- Test: A sends message, B receives delivery ---
71
+ console.log("Test: A sends message to room...");
72
+ b.deliveries.length = 0;
73
+ await a.store.sendRoomMessage(room.id, a.store.peerId, "Hello from A!");
74
+ await sleep(300);
75
+ console.log(` B received ${String(b.deliveries.length)} delivery event(s)`);
76
+ assert.ok(b.deliveries.length >= 1, "B should receive the room message");
77
+ const roomMsg = b.deliveries[0];
78
+ assert.ok(roomMsg);
79
+ assert.strictEqual(roomMsg.type, "room_message");
80
+ assert.strictEqual(roomMsg.message.content, "Hello from A!");
81
+ // --- Test: DM from A to B ---
82
+ console.log("Test: DM from A to B...");
83
+ b.deliveries.length = 0;
84
+ await a.store.sendDm(a.store.peerId, b.store.peerId, "Hey B!");
85
+ await sleep(300);
86
+ console.log(` B received ${String(b.deliveries.length)} DM event(s)`);
87
+ assert.ok(b.deliveries.length >= 1, "B should receive the DM");
88
+ const dmEvent = b.deliveries[0];
89
+ assert.ok(dmEvent);
90
+ assert.strictEqual(dmEvent.type, "dm");
91
+ // --- Test: read room messages ---
92
+ console.log("Test: B reads room messages...");
93
+ const messages = await b.store.readRoomMessages(room.id);
94
+ console.log(` B sees ${String(messages.length)} message(s)`);
95
+ assert.ok(messages.length >= 1, "B should see the message");
96
+ // --- Test: CommsTool integration ---
97
+ console.log("Test: CommsTool send via B...");
98
+ b.deliveries.length = 0;
99
+ const action = buildAction({
100
+ action: "send",
101
+ target: room.id,
102
+ content: "Hello from B via tool!",
103
+ });
104
+ await b.tool.handle({
105
+ agentId: b.store.peerId,
106
+ harness: "test-b",
107
+ cwd: "/test/peer-b",
108
+ pid: process.pid,
109
+ }, action);
110
+ await sleep(300);
111
+ console.log(` A received ${String(a.deliveries.length)} delivery event(s)`);
112
+ assert.ok(a.deliveries.length >= 1, "A should receive B's message");
113
+ // --- Cleanup ---
114
+ console.log("Cleaning up...");
115
+ await a.store.shutdown();
116
+ await b.store.shutdown();
117
+ console.log("\n✓ All tests passed!");
118
+ }
119
+ function sleep(ms) {
120
+ return new Promise((resolve) => setTimeout(resolve, ms));
121
+ }
122
+ main().catch((err) => {
123
+ console.error("Test failed:", err);
124
+ process.exit(1);
125
+ });
126
+ //# sourceMappingURL=mesh-e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-e2e.test.js","sourceRoot":"","sources":["../../src/test/mesh-e2e.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC;AAE7C,MAAM,QAAQ,GAAG,KAAK,CAAC;AAEvB,KAAK,UAAU,WAAW,CACxB,IAAY,EACZ,OAAe;IAEf,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEtC,MAAM,UAAU,GAAoB,EAAE,CAAC;IACvC,KAAK,CAAC,UAAU,GAAG,CAAC,QAAgB,EAAE,KAAoB,EAAE,EAAE;QAC5D,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;IAElC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IACnB,MAAM,KAAK,CAAC,aAAa,CAAC;QACxB,IAAI;QACJ,OAAO;QACP,GAAG,EAAE,SAAS,IAAI,EAAE;QACpB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IAEH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEhD,gCAAgC;IAChC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAEjB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEhD,uCAAuC;IACvC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAEjB,4BAA4B;IAC5B,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3D,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,+BAA+B,CAAC,CAAC;IAEhE,sBAAsB;IACtB,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAEjB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3D,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,+BAA+B,CAAC,CAAC;IAEhE,4BAA4B;IAC5B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,aAAa,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;IACjD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;QACpC,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM;QACrB,WAAW,EAAE,WAAW;KACzB,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAE1C,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAEjB,gCAAgC;IAChC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACzD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,uBAAuB,CAAC,CAAC;IAEvD,6BAA6B;IAC7B,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrC,MAAM,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAEhD,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAEjB,qDAAqD;IACrD,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IACxB,MAAM,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAExE,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAEjB,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC7E,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,mCAAmC,CAAC,CAAC;IACzE,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACjD,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAE7D,+BAA+B;IAC/B,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IACxB,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE/D,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAEjB,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACvE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,yBAAyB,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAEvC,mCAAmC;IACnC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC9D,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,0BAA0B,CAAC,CAAC;IAE5D,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IACxB,MAAM,MAAM,GAAG,WAAW,CAAC;QACzB,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,OAAO,EAAE,wBAAwB;KAClC,CAAC,CAAC;IACH,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CACjB;QACE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM;QACvB,OAAO,EAAE,QAAQ;QACjB,GAAG,EAAE,cAAc;QACnB,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,EACD,MAAM,CACP,CAAC;IAEF,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAEjB,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC7E,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,8BAA8B,CAAC,CAAC;IAEpE,kBAAkB;IAClB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,MAAM,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IACzB,MAAM,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IAEzB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Multi-process smoke test for MeshStore TCP mesh.
3
+ *
4
+ * Spawns two separate Node.js processes running MeshStore instances,
5
+ * verifies they discover each other via the coordinator, exchange
6
+ * messages, and receive push delivery.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=mesh-smoke.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-smoke.test.d.ts","sourceRoot":"","sources":["../../src/test/mesh-smoke.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,193 @@
1
+ /**
2
+ * Multi-process smoke test for MeshStore TCP mesh.
3
+ *
4
+ * Spawns two separate Node.js processes running MeshStore instances,
5
+ * verifies they discover each other via the coordinator, exchange
6
+ * messages, and receive push delivery.
7
+ */
8
+ import * as assert from "node:assert/strict";
9
+ import * as child_process from "node:child_process";
10
+ import * as net from "node:net";
11
+ const SMOKE_PORT = 19877;
12
+ const SMOKE_HOST = "127.0.0.1";
13
+ // -----------------------------------------------------------------------
14
+ // Child process peer
15
+ // -----------------------------------------------------------------------
16
+ function spawnPeer(name, actions) {
17
+ const messages = [];
18
+ const script = buildScript(name, actions);
19
+ const child = child_process.spawn("node", ["-e", script], {
20
+ stdio: ["pipe", "pipe", "pipe"],
21
+ });
22
+ let buffer = "";
23
+ child.stdout.on("data", (data) => {
24
+ buffer += data.toString();
25
+ const lines = buffer.split("\n");
26
+ buffer = lines.pop() ?? "";
27
+ for (const line of lines) {
28
+ if (line.trim().length === 0)
29
+ continue;
30
+ try {
31
+ const parsed = JSON.parse(line);
32
+ if (isTestMessage(parsed))
33
+ messages.push(parsed);
34
+ }
35
+ catch {
36
+ /* skip non-JSON lines */
37
+ }
38
+ }
39
+ });
40
+ const exit = new Promise((resolve, reject) => {
41
+ let stderr = "";
42
+ child.stderr.on("data", (data) => {
43
+ stderr += data.toString();
44
+ });
45
+ child.on("error", reject);
46
+ child.on("exit", (code) => {
47
+ if (buffer.trim()) {
48
+ try {
49
+ const parsed = JSON.parse(buffer);
50
+ if (isTestMessage(parsed))
51
+ messages.push(parsed);
52
+ }
53
+ catch {
54
+ /* skip */
55
+ }
56
+ }
57
+ if (code === 0)
58
+ resolve();
59
+ else
60
+ reject(new Error(`${name} exited with code ${String(code)}:\n${stderr}`));
61
+ });
62
+ });
63
+ return { messages, exit };
64
+ }
65
+ function isTestMessage(value) {
66
+ if (typeof value !== "object" || value === null)
67
+ return false;
68
+ if (!("type" in value))
69
+ return false;
70
+ return typeof value.type === "string";
71
+ }
72
+ function buildScript(name, actions) {
73
+ return [
74
+ `const { MeshStore } = require("./dist/core/mesh-store.js");`,
75
+ `const { CommsTool } = require("./dist/core/tool.js");`,
76
+ `function log(msg) { process.stdout.write(JSON.stringify(msg) + "\\n"); }`,
77
+ `(async () => {`,
78
+ ` const store = new MeshStore(${String(SMOKE_PORT)});`,
79
+ ` const tool = new CommsTool(store);`,
80
+ ` const deliveries = [];`,
81
+ ` store.onDelivery = (_id, event) => {`,
82
+ ` deliveries.push(event);`,
83
+ ` log({ type: "delivery", data: { eventType: event.type } });`,
84
+ ` };`,
85
+ ` await store.init();`,
86
+ ` const agent = await store.registerAgent({`,
87
+ ` name: "${name}", harness: "smoke-${name}",`,
88
+ ` cwd: "/test/${name}", pid: process.pid,`,
89
+ ` visibility: "visible", tags: [],`,
90
+ ` });`,
91
+ ` log({ type: "registered", data: { id: agent.id } });`,
92
+ ` await new Promise(r => setTimeout(r, 500));`,
93
+ ` ${actions}`,
94
+ ` await new Promise(r => setTimeout(r, 1000));`,
95
+ ` const agents = await store.listAgents(agent.id);`,
96
+ ` log({ type: "agents", data: { count: agents.length } });`,
97
+ ` const rooms = await store.listRooms(agent.id);`,
98
+ ` log({ type: "rooms", data: { count: rooms.length, names: rooms.map(r => r.name).join(",") } });`,
99
+ ` log({ type: "deliveries_received", data: { count: deliveries.length } });`,
100
+ ` await store.shutdown();`,
101
+ ` process.exit(0);`,
102
+ `})().catch(e => { console.error(e); process.exit(1); });`,
103
+ ].join("\n");
104
+ }
105
+ // -----------------------------------------------------------------------
106
+ // Helpers
107
+ // -----------------------------------------------------------------------
108
+ function sleep(ms) {
109
+ return new Promise((resolve) => setTimeout(resolve, ms));
110
+ }
111
+ function waitForPort(port, host) {
112
+ return new Promise((resolve, reject) => {
113
+ const socket = new net.Socket();
114
+ socket.connect(port, host, () => {
115
+ socket.destroy();
116
+ resolve();
117
+ });
118
+ socket.on("error", () => {
119
+ socket.destroy();
120
+ reject(new Error(`Port ${String(port)} not listening`));
121
+ });
122
+ });
123
+ }
124
+ function findMsg(messages, type) {
125
+ return messages.find((m) => m.type === type);
126
+ }
127
+ // -----------------------------------------------------------------------
128
+ // Test
129
+ // -----------------------------------------------------------------------
130
+ async function main() {
131
+ console.log("=== Multi-process smoke test ===\n");
132
+ console.log("Spawning peer A (coordinator)...");
133
+ const peerA = spawnPeer("a", [
134
+ `const roomId = "smoke-room-" + Date.now();`,
135
+ `const room = await store.createRoom({`,
136
+ ` name: roomId, type: "public", owner: agent.id,`,
137
+ ` description: "Smoke test room",`,
138
+ `});`,
139
+ `log({ type: "room_created", data: { id: room.id } });`,
140
+ `await new Promise(r => setTimeout(r, 1500));`,
141
+ `await store.sendRoomMessage(room.id, agent.id, "Hello from A!");`,
142
+ `log({ type: "sent", data: { room: room.id } });`,
143
+ ].join("\n "));
144
+ // Wait for A to bind coordinator port
145
+ await sleep(500);
146
+ await waitForPort(SMOKE_PORT, SMOKE_HOST);
147
+ console.log(" Coordinator bound on port " + String(SMOKE_PORT));
148
+ console.log("Spawning peer B (joins mesh)...");
149
+ const peerB = spawnPeer("b", [
150
+ `await new Promise(r => setTimeout(r, 800));`,
151
+ `const existingRooms = await store.listRooms(agent.id);`,
152
+ `const smokeRoom = existingRooms.find(r => r.name.startsWith("smoke-room"));`,
153
+ `if (smokeRoom) {`,
154
+ ` await store.joinRoom(smokeRoom.id, agent.id);`,
155
+ ` log({ type: "joined", data: { room: smokeRoom.id } });`,
156
+ `} else {`,
157
+ ` log({ type: "no_room", data: {} });`,
158
+ `}`,
159
+ ].join("\n "));
160
+ console.log("Waiting for peers to complete...\n");
161
+ await Promise.all([peerA.exit, peerB.exit]);
162
+ // --- Results ---
163
+ console.log("Peer A messages:");
164
+ for (const m of peerA.messages)
165
+ console.log(` ${m.type}: ${JSON.stringify(m.data)}`);
166
+ console.log();
167
+ console.log("Peer B messages:");
168
+ for (const m of peerB.messages)
169
+ console.log(` ${m.type}: ${JSON.stringify(m.data)}`);
170
+ console.log();
171
+ // --- Assertions ---
172
+ assert.ok(findMsg(peerA.messages, "registered"), "A should register");
173
+ assert.ok(findMsg(peerB.messages, "registered"), "B should register");
174
+ const agentsA = findMsg(peerA.messages, "agents");
175
+ const agentsB = findMsg(peerB.messages, "agents");
176
+ assert.ok(agentsA &&
177
+ typeof agentsA.data.count === "number" &&
178
+ agentsA.data.count >= 2, `A should see at least 2 agents, got ${String(agentsA?.data.count)}`);
179
+ assert.ok(agentsB &&
180
+ typeof agentsB.data.count === "number" &&
181
+ agentsB.data.count >= 2, `B should see at least 2 agents, got ${String(agentsB?.data.count)}`);
182
+ assert.ok(findMsg(peerB.messages, "joined"), "B should join the room");
183
+ const bDeliveries = findMsg(peerB.messages, "deliveries_received");
184
+ assert.ok(bDeliveries &&
185
+ typeof bDeliveries.data.count === "number" &&
186
+ bDeliveries.data.count >= 1, `B should receive at least 1 delivery, got ${String(bDeliveries?.data.count)}`);
187
+ console.log("✓ All smoke tests passed!");
188
+ }
189
+ main().catch((err) => {
190
+ console.error("Smoke test failed:", err);
191
+ process.exit(1);
192
+ });
193
+ //# sourceMappingURL=mesh-smoke.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-smoke.test.js","sourceRoot":"","sources":["../../src/test/mesh-smoke.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "agent-comms",
3
- "version": "1.1.0",
4
- "description": "Cross-harness agent communication bus — filesystem-based rooms, DMs, and presence for LLM agents",
3
+ "version": "1.3.0",
4
+ "description": "Cross-harness communication bus for LLM agents TCP peer mesh with rooms, DMs, presence, and real-time push delivery",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@10.33.0",
7
7
  "repository": {
@@ -20,7 +20,8 @@
20
20
  "rooms",
21
21
  "dm",
22
22
  "presence",
23
- "cross-harness"
23
+ "cross-harness",
24
+ "pi-package"
24
25
  ],
25
26
  "main": "./dist/core/index.js",
26
27
  "types": "./dist/core/index.d.ts",
@@ -31,7 +32,8 @@
31
32
  }
32
33
  },
33
34
  "files": [
34
- "dist"
35
+ "dist",
36
+ ".claude-plugin/"
35
37
  ],
36
38
  "bin": {
37
39
  "agent-comms": "dist/cli.js"
@@ -53,6 +55,7 @@
53
55
  "@mariozechner/pi-ai": "0.70.2",
54
56
  "@mariozechner/pi-coding-agent": "0.70.2",
55
57
  "@semantic-release/commit-analyzer": "13.0.1",
58
+ "@semantic-release/exec": "6.0.3",
56
59
  "@semantic-release/git": "10.0.1",
57
60
  "@semantic-release/github": "12.0.6",
58
61
  "@semantic-release/release-notes-generator": "14.1.0",
@@ -73,5 +76,15 @@
73
76
  "@modelcontextprotocol/sdk": "1.28.0",
74
77
  "typebox": "1.1.28",
75
78
  "zod": "4.3.6"
79
+ },
80
+ "peerDependencies": {
81
+ "@mariozechner/pi-coding-agent": "*",
82
+ "@mariozechner/pi-ai": "*",
83
+ "@sinclair/typebox": "*"
84
+ },
85
+ "pi": {
86
+ "extensions": [
87
+ "./dist/bridges/pi"
88
+ ]
76
89
  }
77
90
  }
@@ -1,13 +0,0 @@
1
- /**
2
- * Agent Comms — Codex PostToolUse hook.
3
- *
4
- * Drains the agent-comms delivery queue after every tool call within a turn.
5
- * If pending messages exist, injects them as additional context so Codex
6
- * processes them mid-turn.
7
- *
8
- * Run via: npx agent-comms bridge codex-post-tool-use
9
- *
10
- * Requires [features] codex_hooks = true in config.toml.
11
- */
12
- export declare function run(): void;
13
- //# sourceMappingURL=post_tool_use.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"post_tool_use.d.ts","sourceRoot":"","sources":["../../../src/bridges/codex/post_tool_use.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAqFH,wBAAgB,GAAG,IAAI,IAAI,CAoC1B"}
@@ -1,118 +0,0 @@
1
- /**
2
- * Agent Comms — Codex PostToolUse hook.
3
- *
4
- * Drains the agent-comms delivery queue after every tool call within a turn.
5
- * If pending messages exist, injects them as additional context so Codex
6
- * processes them mid-turn.
7
- *
8
- * Run via: npx agent-comms bridge codex-post-tool-use
9
- *
10
- * Requires [features] codex_hooks = true in config.toml.
11
- */
12
- import * as fs from "node:fs";
13
- import * as path from "node:path";
14
- import * as os from "node:os";
15
- import { DeliveryEventSchema } from "../../core/types.js";
16
- const BUS_ROOT = path.join(os.homedir(), ".agents", "bus");
17
- const IDENTITY_DIR = path.join(BUS_ROOT, "identity");
18
- function isRecord(value) {
19
- return typeof value === "object" && value !== null && !Array.isArray(value);
20
- }
21
- function readIdentity() {
22
- try {
23
- const files = fs
24
- .readdirSync(IDENTITY_DIR)
25
- .filter((f) => f.startsWith("codex--"));
26
- if (files.length === 0)
27
- return undefined;
28
- const latest = files.sort((a, b) => {
29
- const sa = fs.statSync(path.join(IDENTITY_DIR, a));
30
- const sb = fs.statSync(path.join(IDENTITY_DIR, b));
31
- return sb.mtimeMs - sa.mtimeMs;
32
- })[0];
33
- if (!latest)
34
- return undefined;
35
- const parsed = JSON.parse(fs.readFileSync(path.join(IDENTITY_DIR, latest), "utf-8"));
36
- if (isRecord(parsed) && typeof parsed.id === "string") {
37
- return parsed.id;
38
- }
39
- return undefined;
40
- }
41
- catch {
42
- return undefined;
43
- }
44
- }
45
- function drainDelivery(agentId) {
46
- const deliveryDir = path.join(BUS_ROOT, "delivery", agentId);
47
- try {
48
- const files = fs
49
- .readdirSync(deliveryDir)
50
- .filter((f) => f.endsWith(".json"))
51
- .sort();
52
- const events = [];
53
- for (const file of files) {
54
- const fp = path.join(deliveryDir, file);
55
- try {
56
- const parsed = JSON.parse(fs.readFileSync(fp, "utf-8"));
57
- events.push(DeliveryEventSchema.parse(parsed));
58
- fs.unlinkSync(fp);
59
- }
60
- catch {
61
- fs.unlinkSync(fp);
62
- }
63
- }
64
- events.sort((a, b) => {
65
- const ta = a.type === "room_message" || a.type === "dm" ? a.message.timestamp : "";
66
- const tb = b.type === "room_message" || b.type === "dm" ? b.message.timestamp : "";
67
- return ta.localeCompare(tb);
68
- });
69
- return events;
70
- }
71
- catch {
72
- return [];
73
- }
74
- }
75
- function formatEvent(event) {
76
- switch (event.type) {
77
- case "room_message":
78
- return `[${event.message.room}] ${event.message.from}: ${event.message.content}`;
79
- case "dm":
80
- return `DM from ${event.message.from}: ${event.message.content}`;
81
- case "room_invite":
82
- return `Invited to room ${event.room} by ${event.from}`;
83
- case "member_joined":
84
- return `${event.agent} joined ${event.room}`;
85
- case "member_left":
86
- return `${event.agent} left ${event.room}`;
87
- }
88
- }
89
- export function run() {
90
- const chunks = [];
91
- process.stdin.setEncoding("utf-8");
92
- process.stdin.on("data", (chunk) => chunks.push(chunk));
93
- process.stdin.on("end", () => {
94
- // Parse hook input (we don't need it, but consume it)
95
- try {
96
- JSON.parse(chunks.join(""));
97
- }
98
- catch {
99
- /* no input, fine */
100
- }
101
- const agentId = readIdentity();
102
- if (!agentId)
103
- process.exit(0);
104
- const events = drainDelivery(agentId);
105
- if (events.length === 0)
106
- process.exit(0);
107
- const lines = events.map(formatEvent);
108
- const message = "📬 Agent Comms pending messages:\n" +
109
- lines.map((l) => `- ${l}`).join("\n");
110
- process.stdout.write(JSON.stringify({
111
- hookSpecificOutput: {
112
- hookEventName: "PostToolUse",
113
- additionalContext: message,
114
- },
115
- }, null, 2) + "\n");
116
- });
117
- }
118
- //# sourceMappingURL=post_tool_use.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"post_tool_use.js","sourceRoot":"","sources":["../../../src/bridges/codex/post_tool_use.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- /**
2
- * Agent Comms — Codex Stop hook.
3
- *
4
- * Drains the agent-comms delivery queue when Codex finishes a turn.
5
- * If pending messages exist, returns decision=block with the messages
6
- * as the reason, causing Codex to continue processing them immediately.
7
- *
8
- * Run via: npx agent-comms bridge codex-stop
9
- *
10
- * Requires [features] codex_hooks = true in config.toml.
11
- */
12
- export declare function run(): void;
13
- //# sourceMappingURL=stop_hook.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stop_hook.d.ts","sourceRoot":"","sources":["../../../src/bridges/codex/stop_hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAsFH,wBAAgB,GAAG,IAAI,IAAI,CA0B1B"}