agent-comms 1.13.0 → 1.15.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 (256) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +1 -1
  3. package/dist/bridges/claude-code/channel.d.ts.map +1 -1
  4. package/dist/bridges/claude-code/channel.js +6 -1
  5. package/dist/bridges/claude-code/channel.js.map +1 -1
  6. package/dist/bridges/codex/tool.d.ts.map +1 -1
  7. package/dist/bridges/codex/tool.js +6 -1
  8. package/dist/bridges/codex/tool.js.map +1 -1
  9. package/dist/bridges/mcp/index.d.ts.map +1 -1
  10. package/dist/bridges/mcp/index.js +6 -1
  11. package/dist/bridges/mcp/index.js.map +1 -1
  12. package/dist/bridges/opencode/plugin.d.ts.map +1 -1
  13. package/dist/bridges/opencode/plugin.js +5 -0
  14. package/dist/bridges/opencode/plugin.js.map +1 -1
  15. package/dist/bridges/pi/index.d.ts +5 -2
  16. package/dist/bridges/pi/index.d.ts.map +1 -1
  17. package/dist/bridges/pi/index.js +125 -20
  18. package/dist/bridges/pi/index.js.map +1 -1
  19. package/dist/bridges/user/controller.d.ts +10 -1
  20. package/dist/bridges/user/controller.d.ts.map +1 -1
  21. package/dist/bridges/user/controller.js +37 -1
  22. package/dist/bridges/user/controller.js.map +1 -1
  23. package/dist/bridges/user/tui.js +4 -0
  24. package/dist/bridges/user/tui.js.map +1 -1
  25. package/dist/bridges/user/web/build.d.ts +4 -4
  26. package/dist/bridges/user/web/build.js +53 -34
  27. package/dist/bridges/user/web/build.js.map +1 -1
  28. package/dist/bridges/user/web/frontend/components/App.d.ts +28 -0
  29. package/dist/bridges/user/web/frontend/components/App.d.ts.map +1 -0
  30. package/dist/bridges/user/web/frontend/components/App.js +7 -0
  31. package/dist/bridges/user/web/frontend/components/App.js.map +1 -0
  32. package/dist/bridges/user/web/frontend/components/ChatArea.d.ts +14 -0
  33. package/dist/bridges/user/web/frontend/components/ChatArea.d.ts.map +1 -0
  34. package/dist/bridges/user/web/frontend/components/ChatArea.js +38 -0
  35. package/dist/bridges/user/web/frontend/components/ChatArea.js.map +1 -0
  36. package/dist/bridges/user/web/frontend/components/CreateRoomForm.d.ts +11 -0
  37. package/dist/bridges/user/web/frontend/components/CreateRoomForm.d.ts.map +1 -0
  38. package/dist/bridges/user/web/frontend/components/CreateRoomForm.js +33 -0
  39. package/dist/bridges/user/web/frontend/components/CreateRoomForm.js.map +1 -0
  40. package/dist/bridges/user/web/frontend/components/JoinForm.d.ts +11 -0
  41. package/dist/bridges/user/web/frontend/components/JoinForm.d.ts.map +1 -0
  42. package/dist/bridges/user/web/frontend/components/JoinForm.js +28 -0
  43. package/dist/bridges/user/web/frontend/components/JoinForm.js.map +1 -0
  44. package/dist/bridges/user/web/frontend/components/Message.d.ts +8 -0
  45. package/dist/bridges/user/web/frontend/components/Message.d.ts.map +1 -0
  46. package/dist/bridges/user/web/frontend/components/Message.js +15 -0
  47. package/dist/bridges/user/web/frontend/components/Message.js.map +1 -0
  48. package/dist/bridges/user/web/frontend/components/MessageList.d.ts +8 -0
  49. package/dist/bridges/user/web/frontend/components/MessageList.d.ts.map +1 -0
  50. package/dist/bridges/user/web/frontend/components/MessageList.js +16 -0
  51. package/dist/bridges/user/web/frontend/components/MessageList.js.map +1 -0
  52. package/dist/bridges/user/web/frontend/components/ProjectTree.d.ts +17 -0
  53. package/dist/bridges/user/web/frontend/components/ProjectTree.d.ts.map +1 -0
  54. package/dist/bridges/user/web/frontend/components/ProjectTree.js +62 -0
  55. package/dist/bridges/user/web/frontend/components/ProjectTree.js.map +1 -0
  56. package/dist/bridges/user/web/frontend/components/RelayPanel.d.ts +15 -0
  57. package/dist/bridges/user/web/frontend/components/RelayPanel.d.ts.map +1 -0
  58. package/dist/bridges/user/web/frontend/components/RelayPanel.js +46 -0
  59. package/dist/bridges/user/web/frontend/components/RelayPanel.js.map +1 -0
  60. package/dist/bridges/user/web/frontend/components/Sidebar.d.ts +21 -0
  61. package/dist/bridges/user/web/frontend/components/Sidebar.d.ts.map +1 -0
  62. package/dist/bridges/user/web/frontend/components/Sidebar.js +37 -0
  63. package/dist/bridges/user/web/frontend/components/Sidebar.js.map +1 -0
  64. package/dist/bridges/user/web/frontend/dom.d.ts +12 -22
  65. package/dist/bridges/user/web/frontend/dom.d.ts.map +1 -1
  66. package/dist/bridges/user/web/frontend/dom.js +24 -49
  67. package/dist/bridges/user/web/frontend/dom.js.map +1 -1
  68. package/dist/bridges/user/web/frontend/input.d.ts +15 -0
  69. package/dist/bridges/user/web/frontend/input.d.ts.map +1 -1
  70. package/dist/bridges/user/web/frontend/input.js +39 -1
  71. package/dist/bridges/user/web/frontend/input.js.map +1 -1
  72. package/dist/bridges/user/web/frontend/main.d.ts +3 -3
  73. package/dist/bridges/user/web/frontend/main.d.ts.map +1 -1
  74. package/dist/bridges/user/web/frontend/main.js +135 -52
  75. package/dist/bridges/user/web/frontend/main.js.map +1 -1
  76. package/dist/bridges/user/web/frontend/mesh-client.d.ts +43 -0
  77. package/dist/bridges/user/web/frontend/mesh-client.d.ts.map +1 -0
  78. package/dist/bridges/user/web/frontend/mesh-client.js +132 -0
  79. package/dist/bridges/user/web/frontend/mesh-client.js.map +1 -0
  80. package/dist/bridges/user/web/frontend/mesh-worker.d.ts +14 -0
  81. package/dist/bridges/user/web/frontend/mesh-worker.d.ts.map +1 -0
  82. package/dist/bridges/user/web/frontend/mesh-worker.js +274 -0
  83. package/dist/bridges/user/web/frontend/mesh-worker.js.map +1 -0
  84. package/dist/bridges/user/web/frontend/messages.d.ts +17 -0
  85. package/dist/bridges/user/web/frontend/messages.d.ts.map +1 -0
  86. package/dist/bridges/user/web/frontend/messages.js +82 -0
  87. package/dist/bridges/user/web/frontend/messages.js.map +1 -0
  88. package/dist/bridges/user/web/frontend/project-tree.d.ts +9 -0
  89. package/dist/bridges/user/web/frontend/project-tree.d.ts.map +1 -0
  90. package/dist/bridges/user/web/frontend/project-tree.js +173 -0
  91. package/dist/bridges/user/web/frontend/project-tree.js.map +1 -0
  92. package/dist/bridges/user/web/frontend/relay-client.d.ts +40 -0
  93. package/dist/bridges/user/web/frontend/relay-client.d.ts.map +1 -0
  94. package/dist/bridges/user/web/frontend/relay-client.js +97 -0
  95. package/dist/bridges/user/web/frontend/relay-client.js.map +1 -0
  96. package/dist/bridges/user/web/frontend/relay-worker.d.ts +15 -0
  97. package/dist/bridges/user/web/frontend/relay-worker.d.ts.map +1 -0
  98. package/dist/bridges/user/web/frontend/relay-worker.js +366 -0
  99. package/dist/bridges/user/web/frontend/relay-worker.js.map +1 -0
  100. package/dist/bridges/user/web/frontend/state.d.ts +8 -1
  101. package/dist/bridges/user/web/frontend/state.d.ts.map +1 -1
  102. package/dist/bridges/user/web/frontend/state.js +17 -1
  103. package/dist/bridges/user/web/frontend/state.js.map +1 -1
  104. package/dist/bridges/user/web/frontend/sw.d.ts +16 -0
  105. package/dist/bridges/user/web/frontend/sw.d.ts.map +1 -0
  106. package/dist/bridges/user/web/frontend/sw.js +145 -0
  107. package/dist/bridges/user/web/frontend/sw.js.map +1 -0
  108. package/dist/bridges/user/web/frontend/types.d.ts +52 -0
  109. package/dist/bridges/user/web/frontend/types.d.ts.map +1 -1
  110. package/dist/bridges/user/web/frontend/url-sync.d.ts +48 -0
  111. package/dist/bridges/user/web/frontend/url-sync.d.ts.map +1 -0
  112. package/dist/bridges/user/web/frontend/url-sync.js +74 -0
  113. package/dist/bridges/user/web/frontend/url-sync.js.map +1 -0
  114. package/dist/bridges/user/web/server.d.ts +10 -3
  115. package/dist/bridges/user/web/server.d.ts.map +1 -1
  116. package/dist/bridges/user/web/server.js +280 -15
  117. package/dist/bridges/user/web/server.js.map +1 -1
  118. package/dist/bridges/user/web/test/web-server.integration.test.d.ts +7 -0
  119. package/dist/bridges/user/web/test/web-server.integration.test.d.ts.map +1 -0
  120. package/dist/bridges/user/web/test/web-server.integration.test.js +187 -0
  121. package/dist/bridges/user/web/test/web-server.integration.test.js.map +1 -0
  122. package/dist/core/bridge.d.ts +43 -0
  123. package/dist/core/bridge.d.ts.map +1 -1
  124. package/dist/core/bridge.js +197 -0
  125. package/dist/core/bridge.js.map +1 -1
  126. package/dist/core/comms-store.d.ts +22 -1
  127. package/dist/core/comms-store.d.ts.map +1 -1
  128. package/dist/core/discovery-mdns.d.ts +33 -0
  129. package/dist/core/discovery-mdns.d.ts.map +1 -0
  130. package/dist/core/discovery-mdns.js +182 -0
  131. package/dist/core/discovery-mdns.js.map +1 -0
  132. package/dist/core/discovery-tailscale.d.ts +40 -0
  133. package/dist/core/discovery-tailscale.d.ts.map +1 -0
  134. package/dist/core/discovery-tailscale.js +158 -0
  135. package/dist/core/discovery-tailscale.js.map +1 -0
  136. package/dist/core/discovery.d.ts +82 -0
  137. package/dist/core/discovery.d.ts.map +1 -0
  138. package/dist/core/discovery.js +194 -0
  139. package/dist/core/discovery.js.map +1 -0
  140. package/dist/core/federation.d.ts +100 -0
  141. package/dist/core/federation.d.ts.map +1 -0
  142. package/dist/core/federation.js +411 -0
  143. package/dist/core/federation.js.map +1 -0
  144. package/dist/core/identity.d.ts +31 -0
  145. package/dist/core/identity.d.ts.map +1 -0
  146. package/dist/core/identity.js +251 -0
  147. package/dist/core/identity.js.map +1 -0
  148. package/dist/core/index.d.ts +12 -1
  149. package/dist/core/index.d.ts.map +1 -1
  150. package/dist/core/index.js +7 -1
  151. package/dist/core/index.js.map +1 -1
  152. package/dist/core/mesh-store.d.ts +75 -26
  153. package/dist/core/mesh-store.d.ts.map +1 -1
  154. package/dist/core/mesh-store.js +570 -355
  155. package/dist/core/mesh-store.js.map +1 -1
  156. package/dist/core/push-manager.d.ts +41 -0
  157. package/dist/core/push-manager.d.ts.map +1 -0
  158. package/dist/core/push-manager.js +60 -0
  159. package/dist/core/push-manager.js.map +1 -0
  160. package/dist/core/store.d.ts +21 -1
  161. package/dist/core/store.d.ts.map +1 -1
  162. package/dist/core/store.js +44 -0
  163. package/dist/core/store.js.map +1 -1
  164. package/dist/core/tcp-transport.d.ts +77 -0
  165. package/dist/core/tcp-transport.d.ts.map +1 -0
  166. package/dist/core/tcp-transport.js +596 -0
  167. package/dist/core/tcp-transport.js.map +1 -0
  168. package/dist/core/test/bridge.unit.test.d.ts +5 -0
  169. package/dist/core/test/bridge.unit.test.d.ts.map +1 -0
  170. package/dist/core/test/bridge.unit.test.js +120 -0
  171. package/dist/core/test/bridge.unit.test.js.map +1 -0
  172. package/dist/core/test/identity.unit.test.d.ts +5 -0
  173. package/dist/core/test/identity.unit.test.d.ts.map +1 -0
  174. package/dist/core/test/identity.unit.test.js +70 -0
  175. package/dist/core/test/identity.unit.test.js.map +1 -0
  176. package/dist/core/tls-transport.d.ts +69 -0
  177. package/dist/core/tls-transport.d.ts.map +1 -0
  178. package/dist/core/tls-transport.js +602 -0
  179. package/dist/core/tls-transport.js.map +1 -0
  180. package/dist/core/tool.d.ts +23 -2
  181. package/dist/core/tool.d.ts.map +1 -1
  182. package/dist/core/tool.js +269 -1
  183. package/dist/core/tool.js.map +1 -1
  184. package/dist/core/transport.d.ts +166 -0
  185. package/dist/core/transport.d.ts.map +1 -0
  186. package/dist/core/transport.js +20 -0
  187. package/dist/core/transport.js.map +1 -0
  188. package/dist/core/types.d.ts +146 -0
  189. package/dist/core/types.d.ts.map +1 -1
  190. package/dist/core/types.js +77 -0
  191. package/dist/core/types.js.map +1 -1
  192. package/dist/core/vapid.d.ts +22 -0
  193. package/dist/core/vapid.d.ts.map +1 -0
  194. package/dist/core/vapid.js +50 -0
  195. package/dist/core/vapid.js.map +1 -0
  196. package/dist/core/web-push.d.ts +37 -0
  197. package/dist/core/web-push.d.ts.map +1 -0
  198. package/dist/core/web-push.js +198 -0
  199. package/dist/core/web-push.js.map +1 -0
  200. package/dist/core/wire-protocol.d.ts +131 -0
  201. package/dist/core/wire-protocol.d.ts.map +1 -0
  202. package/dist/core/wire-protocol.js +54 -0
  203. package/dist/core/wire-protocol.js.map +1 -0
  204. package/dist/core/ws-transport.d.ts +71 -0
  205. package/dist/core/ws-transport.d.ts.map +1 -0
  206. package/dist/core/ws-transport.js +560 -0
  207. package/dist/core/ws-transport.js.map +1 -0
  208. package/dist/test/approval.integration.test.d.ts +9 -0
  209. package/dist/test/approval.integration.test.d.ts.map +1 -0
  210. package/dist/test/approval.integration.test.js +361 -0
  211. package/dist/test/approval.integration.test.js.map +1 -0
  212. package/dist/test/delivery-receipt.helper.d.ts +16 -0
  213. package/dist/test/delivery-receipt.helper.d.ts.map +1 -0
  214. package/dist/test/delivery-receipt.helper.js +409 -0
  215. package/dist/test/delivery-receipt.helper.js.map +1 -0
  216. package/dist/test/delivery-receipt.runner.d.ts +13 -0
  217. package/dist/test/delivery-receipt.runner.d.ts.map +1 -0
  218. package/dist/test/delivery-receipt.runner.js +51 -0
  219. package/dist/test/delivery-receipt.runner.js.map +1 -0
  220. package/dist/test/federation.integration.test.d.ts +15 -0
  221. package/dist/test/federation.integration.test.d.ts.map +1 -0
  222. package/dist/test/federation.integration.test.js +218 -0
  223. package/dist/test/federation.integration.test.js.map +1 -0
  224. package/dist/test/listener-policy.integration.test.d.ts +9 -0
  225. package/dist/test/listener-policy.integration.test.d.ts.map +1 -0
  226. package/dist/test/listener-policy.integration.test.js +239 -0
  227. package/dist/test/listener-policy.integration.test.js.map +1 -0
  228. package/dist/test/tls-transport.integration.test.d.ts +8 -0
  229. package/dist/test/tls-transport.integration.test.d.ts.map +1 -0
  230. package/dist/test/tls-transport.integration.test.js +158 -0
  231. package/dist/test/tls-transport.integration.test.js.map +1 -0
  232. package/dist/test/visibility.integration.test.d.ts +12 -0
  233. package/dist/test/visibility.integration.test.d.ts.map +1 -0
  234. package/dist/test/visibility.integration.test.js +181 -0
  235. package/dist/test/visibility.integration.test.js.map +1 -0
  236. package/package.json +7 -3
  237. package/dist/bridges/user/web/frontend/render.d.ts +0 -30
  238. package/dist/bridges/user/web/frontend/render.d.ts.map +0 -1
  239. package/dist/bridges/user/web/frontend/render.js +0 -129
  240. package/dist/bridges/user/web/frontend/render.js.map +0 -1
  241. package/dist/bridges/user/web/frontend/test/dom.unit.test.d.ts +0 -5
  242. package/dist/bridges/user/web/frontend/test/dom.unit.test.d.ts.map +0 -1
  243. package/dist/bridges/user/web/frontend/test/dom.unit.test.js +0 -149
  244. package/dist/bridges/user/web/frontend/test/dom.unit.test.js.map +0 -1
  245. package/dist/bridges/user/web/frontend/test/input.unit.test.d.ts +0 -5
  246. package/dist/bridges/user/web/frontend/test/input.unit.test.d.ts.map +0 -1
  247. package/dist/bridges/user/web/frontend/test/input.unit.test.js +0 -131
  248. package/dist/bridges/user/web/frontend/test/input.unit.test.js.map +0 -1
  249. package/dist/bridges/user/web/frontend/test/render.unit.test.d.ts +0 -5
  250. package/dist/bridges/user/web/frontend/test/render.unit.test.d.ts.map +0 -1
  251. package/dist/bridges/user/web/frontend/test/render.unit.test.js +0 -436
  252. package/dist/bridges/user/web/frontend/test/render.unit.test.js.map +0 -1
  253. package/dist/bridges/user/web/frontend/test/state.unit.test.d.ts +0 -5
  254. package/dist/bridges/user/web/frontend/test/state.unit.test.d.ts.map +0 -1
  255. package/dist/bridges/user/web/frontend/test/state.unit.test.js +0 -119
  256. package/dist/bridges/user/web/frontend/test/state.unit.test.js.map +0 -1
@@ -0,0 +1,158 @@
1
+ /**
2
+ * TlsTransport integration test — verifies that two MeshStore instances
3
+ * can communicate over TLS with certificate pinning.
4
+ *
5
+ * Run: node dist/test/tls-transport.integration.test.js
6
+ */
7
+ import * as net from "node:net";
8
+ import * as assert from "node:assert/strict";
9
+ import { MeshStore } from "../core/mesh-store.js";
10
+ import { TlsTransport } from "../core/tls-transport.js";
11
+ import { generateIdentity } from "../core/identity.js";
12
+ function sleep(ms) {
13
+ return new Promise((resolve) => setTimeout(resolve, ms));
14
+ }
15
+ function allocFreePort() {
16
+ return new Promise((resolve, reject) => {
17
+ const server = net.createServer();
18
+ server.listen(0, "127.0.0.1", () => {
19
+ const addr = server.address();
20
+ const port = addr && typeof addr === "object" ? addr.port : 0;
21
+ server.close(() => resolve(port));
22
+ });
23
+ server.on("error", reject);
24
+ });
25
+ }
26
+ async function cleanup(...stores) {
27
+ for (const s of stores) {
28
+ await s.shutdown();
29
+ }
30
+ }
31
+ async function testTlsPeerCommunication() {
32
+ const port = await allocFreePort();
33
+ const identityA = generateIdentity();
34
+ const identityB = generateIdentity();
35
+ // Verify identities are different
36
+ assert.notStrictEqual(identityA.fingerprint, identityB.fingerprint);
37
+ console.log(" Identity A:", identityA.fingerprint.substring(0, 23) + "...");
38
+ console.log(" Identity B:", identityB.fingerprint.substring(0, 23) + "...");
39
+ // Create stores with TLS transport
40
+ const storeA = new MeshStore(port);
41
+ storeA.peerId = identityA.fingerprint;
42
+ storeA.setTransport(new TlsTransport(storeA.events, identityA));
43
+ const deliveriesA = [];
44
+ storeA.onDelivery = () => {
45
+ deliveriesA.push(1);
46
+ };
47
+ await storeA.init();
48
+ await storeA.registerAgent({
49
+ name: "a",
50
+ harness: "test",
51
+ cwd: "/test/a",
52
+ pid: process.pid,
53
+ visibility: "visible",
54
+ tags: [],
55
+ });
56
+ await sleep(100);
57
+ const storeB = new MeshStore(port);
58
+ storeB.peerId = identityB.fingerprint;
59
+ storeB.setTransport(new TlsTransport(storeB.events, identityB));
60
+ const deliveriesB = [];
61
+ storeB.onDelivery = (_id, ev) => {
62
+ deliveriesB.push(ev);
63
+ };
64
+ await storeB.init();
65
+ await storeB.registerAgent({
66
+ name: "b",
67
+ harness: "test",
68
+ cwd: "/test/b",
69
+ pid: process.pid,
70
+ visibility: "visible",
71
+ tags: [],
72
+ });
73
+ await sleep(300);
74
+ // Create room and exchange messages
75
+ const room = await storeA.createRoom({
76
+ name: `tls-test-${port}`,
77
+ type: "public",
78
+ owner: storeA.peerId,
79
+ description: "TLS transport test",
80
+ });
81
+ await sleep(200);
82
+ await storeB.joinRoom(room.id, storeB.peerId);
83
+ await sleep(200);
84
+ deliveriesB.length = 0;
85
+ await storeA.sendRoomMessage(room.id, storeA.peerId, "Hello over TLS!");
86
+ await sleep(300);
87
+ assert.ok(deliveriesB.length >= 1, `B should receive at least 1 delivery, got ${String(deliveriesB.length)}`);
88
+ const roomMsg = deliveriesB.find((ev) => ev.type === "room_message");
89
+ assert.ok(roomMsg !== undefined, "Should find room_message event");
90
+ const message = roomMsg.message;
91
+ assert.strictEqual(message.content, "Hello over TLS!");
92
+ assert.strictEqual(message.from, identityA.fingerprint);
93
+ console.log(" ✓ Room message received over TLS");
94
+ // Test DM
95
+ deliveriesB.length = 0;
96
+ await storeA.sendDm(storeA.peerId, storeB.peerId, "Direct over TLS!");
97
+ await sleep(300);
98
+ const dm = deliveriesB.find((ev) => ev.type === "dm");
99
+ assert.ok(dm !== undefined, "Should find dm event");
100
+ const dmMessage = dm.message;
101
+ assert.strictEqual(dmMessage.content, "Direct over TLS!");
102
+ assert.strictEqual(dmMessage.from, identityA.fingerprint);
103
+ console.log(" ✓ DM received over TLS");
104
+ await cleanup(storeA, storeB);
105
+ }
106
+ async function testFingerprintIsPeerId() {
107
+ const identity = generateIdentity();
108
+ const port = await allocFreePort();
109
+ const store = new MeshStore(port);
110
+ store.peerId = identity.fingerprint;
111
+ store.setTransport(new TlsTransport(store.events, identity));
112
+ await store.init();
113
+ const agent = await store.registerAgent({
114
+ name: "fp-test",
115
+ harness: "test",
116
+ cwd: "/test/fp",
117
+ pid: process.pid,
118
+ visibility: "visible",
119
+ tags: [],
120
+ });
121
+ // The agent ID should be the certificate fingerprint
122
+ assert.strictEqual(agent.id, identity.fingerprint);
123
+ console.log(" ✓ Peer ID equals certificate fingerprint");
124
+ await store.shutdown();
125
+ }
126
+ // ---------------------------------------------------------------------------
127
+ // Runner
128
+ // ---------------------------------------------------------------------------
129
+ const testName = process.argv[2];
130
+ if (testName === undefined) {
131
+ console.error("Usage: node tls-transport.integration.test.ts <test-name>");
132
+ process.exit(1);
133
+ }
134
+ const tests = {
135
+ "tls-communication": testTlsPeerCommunication,
136
+ "tls-fingerprint": testFingerprintIsPeerId,
137
+ };
138
+ const fn = tests[testName];
139
+ if (!fn) {
140
+ console.error(`Unknown test: ${testName}`);
141
+ console.error(`Available: ${Object.keys(tests).join(", ")}`);
142
+ process.exit(1);
143
+ }
144
+ fn()
145
+ .then(async () => {
146
+ const maxWait = 2000;
147
+ const start = Date.now();
148
+ while ((process._getActiveHandles?.()?.length ?? 0) > 0 &&
149
+ Date.now() - start < maxWait) {
150
+ await new Promise((resolve) => setTimeout(resolve, 50));
151
+ }
152
+ process.exit(0);
153
+ })
154
+ .catch((err) => {
155
+ console.error(`FAIL [${testName}]:`, err);
156
+ process.exit(1);
157
+ });
158
+ //# sourceMappingURL=tls-transport.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tls-transport.integration.test.js","sourceRoot":"","sources":["../../src/test/tls-transport.integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Integration tests for mesh visibility controls.
3
+ *
4
+ * Verifies that the DiscoveryManager visibility state machine works:
5
+ * - Default visibility is discoverable
6
+ * - Setting to quiet pauses advertising
7
+ * - Setting to dark stops all discovery
8
+ * - Per-adapter visibility overrides global
9
+ * - Actions route through CommsTool correctly
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=visibility.integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visibility.integration.test.d.ts","sourceRoot":"","sources":["../../src/test/visibility.integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Integration tests for mesh visibility controls.
3
+ *
4
+ * Verifies that the DiscoveryManager visibility state machine works:
5
+ * - Default visibility is discoverable
6
+ * - Setting to quiet pauses advertising
7
+ * - Setting to dark stops all discovery
8
+ * - Per-adapter visibility overrides global
9
+ * - Actions route through CommsTool correctly
10
+ */
11
+ import * as assert from "node:assert/strict";
12
+ import { test, describe } from "node:test";
13
+ import { MeshStore } from "../core/mesh-store.js";
14
+ import { CommsTool } from "../core/tool.js";
15
+ import { buildAction } from "../core/bridge.js";
16
+ import { DiscoveryManager } from "../core/discovery.js";
17
+ const TEST_PORT = 19881;
18
+ // ---------------------------------------------------------------------------
19
+ // DiscoveryManager unit tests (no mesh init)
20
+ // ---------------------------------------------------------------------------
21
+ describe("DiscoveryManager visibility", () => {
22
+ void test("default visibility is discoverable", () => {
23
+ const dm = new DiscoveryManager();
24
+ assert.equal(dm.getVisibility(), "discoverable");
25
+ });
26
+ void test("setVisibility changes global visibility", async () => {
27
+ const dm = new DiscoveryManager();
28
+ await dm.setVisibility("quiet");
29
+ assert.equal(dm.getVisibility(), "quiet");
30
+ await dm.setVisibility("dark");
31
+ assert.equal(dm.getVisibility(), "dark");
32
+ await dm.setVisibility("discoverable");
33
+ assert.equal(dm.getVisibility(), "discoverable");
34
+ });
35
+ void test("per-adapter visibility overrides global", async () => {
36
+ const dm = new DiscoveryManager();
37
+ await dm.setVisibility("quiet", "mdns");
38
+ assert.equal(dm.getVisibility("mdns"), "quiet");
39
+ // Global unchanged
40
+ assert.equal(dm.getVisibility(), "discoverable");
41
+ // Unset adapter falls back to global
42
+ assert.equal(dm.getVisibility("tailscale"), "discoverable");
43
+ });
44
+ void test("per-adapter visibility is independent", async () => {
45
+ const dm = new DiscoveryManager();
46
+ await dm.setVisibility("quiet", "mdns");
47
+ await dm.setVisibility("dark", "tailscale");
48
+ assert.equal(dm.getVisibility("mdns"), "quiet");
49
+ assert.equal(dm.getVisibility("tailscale"), "dark");
50
+ assert.equal(dm.getVisibility(), "discoverable");
51
+ });
52
+ void test("discover returns empty for dark backends", async () => {
53
+ const dm = new DiscoveryManager();
54
+ await dm.setVisibility("dark");
55
+ const results = await dm.discover();
56
+ assert.equal(results.length, 0);
57
+ });
58
+ });
59
+ // ---------------------------------------------------------------------------
60
+ // MeshStore delegation
61
+ // ---------------------------------------------------------------------------
62
+ describe("MeshStore visibility delegation", () => {
63
+ void test("setVisibility delegates to discovery manager", async () => {
64
+ const store = new MeshStore(TEST_PORT);
65
+ await store.init();
66
+ assert.equal(store.getVisibility(), "discoverable");
67
+ await store.setVisibility("quiet");
68
+ assert.equal(store.getVisibility(), "quiet");
69
+ await store.setVisibility("dark");
70
+ assert.equal(store.getVisibility(), "dark");
71
+ await store.setVisibility("discoverable");
72
+ assert.equal(store.getVisibility(), "discoverable");
73
+ await store.shutdown();
74
+ });
75
+ void test("setVisibility with adapter delegates per-adapter", async () => {
76
+ const store = new MeshStore(TEST_PORT);
77
+ await store.init();
78
+ await store.setVisibility("quiet", "mdns");
79
+ assert.equal(store.getVisibility("mdns"), "quiet");
80
+ assert.equal(store.getVisibility(), "discoverable");
81
+ await store.shutdown();
82
+ });
83
+ });
84
+ // ---------------------------------------------------------------------------
85
+ // CommsTool actions
86
+ // ---------------------------------------------------------------------------
87
+ describe("CommsTool visibility actions", () => {
88
+ void test("mesh_set_visibility action sets visibility", async () => {
89
+ const store = new MeshStore(TEST_PORT);
90
+ await store.init();
91
+ const agent = await store.registerAgent({
92
+ name: "visibility-test",
93
+ harness: "test",
94
+ cwd: "/test",
95
+ pid: process.pid,
96
+ visibility: "visible",
97
+ tags: [],
98
+ });
99
+ const tool = new CommsTool(store);
100
+ const result = await tool.handle({ agentId: agent.id, harness: "test", cwd: "/test", pid: process.pid }, { action: "mesh_set_visibility", visibility: "quiet" });
101
+ assert.ok(!result.isError, `Expected success, got: ${result.content}`);
102
+ assert.ok(result.content.includes("quiet"));
103
+ assert.equal(store.getVisibility(), "quiet");
104
+ await store.shutdown();
105
+ });
106
+ void test("mesh_set_visibility with adapter sets per-adapter", async () => {
107
+ const store = new MeshStore(TEST_PORT);
108
+ await store.init();
109
+ const agent = await store.registerAgent({
110
+ name: "visibility-test",
111
+ harness: "test",
112
+ cwd: "/test",
113
+ pid: process.pid,
114
+ visibility: "visible",
115
+ tags: [],
116
+ });
117
+ const tool = new CommsTool(store);
118
+ const result = await tool.handle({ agentId: agent.id, harness: "test", cwd: "/test", pid: process.pid }, { action: "mesh_set_visibility", visibility: "dark", adapter: "mdns" });
119
+ assert.ok(!result.isError, `Expected success, got: ${result.content}`);
120
+ assert.equal(store.getVisibility("mdns"), "dark");
121
+ assert.equal(store.getVisibility(), "discoverable");
122
+ await store.shutdown();
123
+ });
124
+ void test("mesh_get_visibility returns current visibility", async () => {
125
+ const store = new MeshStore(TEST_PORT);
126
+ await store.init();
127
+ const agent = await store.registerAgent({
128
+ name: "visibility-test",
129
+ harness: "test",
130
+ cwd: "/test",
131
+ pid: process.pid,
132
+ visibility: "visible",
133
+ tags: [],
134
+ });
135
+ const tool = new CommsTool(store);
136
+ const result = await tool.handle({ agentId: agent.id, harness: "test", cwd: "/test", pid: process.pid }, { action: "mesh_get_visibility" });
137
+ assert.ok(!result.isError);
138
+ assert.ok(result.content.includes("discoverable"));
139
+ await store.setVisibility("dark");
140
+ const result2 = await tool.handle({ agentId: agent.id, harness: "test", cwd: "/test", pid: process.pid }, { action: "mesh_get_visibility" });
141
+ assert.ok(result2.content.includes("dark"));
142
+ await store.shutdown();
143
+ });
144
+ });
145
+ // ---------------------------------------------------------------------------
146
+ // buildAction parsing
147
+ // ---------------------------------------------------------------------------
148
+ describe("buildAction visibility parsing", () => {
149
+ void test("buildAction parses mesh_set_visibility", () => {
150
+ const action = buildAction({
151
+ action: "mesh_set_visibility",
152
+ meshVisibility: "quiet",
153
+ });
154
+ assert.equal(action.action, "mesh_set_visibility");
155
+ if (action.action === "mesh_set_visibility") {
156
+ assert.equal(action.visibility, "quiet");
157
+ }
158
+ });
159
+ void test("buildAction parses mesh_set_visibility with adapter", () => {
160
+ const action = buildAction({
161
+ action: "mesh_set_visibility",
162
+ meshVisibility: "dark",
163
+ adapter: "mdns",
164
+ });
165
+ assert.equal(action.action, "mesh_set_visibility");
166
+ if (action.action === "mesh_set_visibility") {
167
+ assert.equal(action.visibility, "dark");
168
+ assert.equal(action.adapter, "mdns");
169
+ }
170
+ });
171
+ void test("buildAction parses mesh_get_visibility", () => {
172
+ const action = buildAction({
173
+ action: "mesh_get_visibility",
174
+ });
175
+ assert.equal(action.action, "mesh_get_visibility");
176
+ });
177
+ void test("buildAction throws for mesh_set_visibility without meshVisibility", () => {
178
+ assert.throws(() => buildAction({ action: "mesh_set_visibility" }), /meshVisibility/);
179
+ });
180
+ });
181
+ //# sourceMappingURL=visibility.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visibility.integration.test.js","sourceRoot":"","sources":["../../src/test/visibility.integration.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-comms",
3
- "version": "1.13.0",
3
+ "version": "1.15.0",
4
4
  "description": "Cross-harness communication mesh for LLM agents — rooms, DMs, presence, and real-time push delivery over TCP",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@10.33.0",
@@ -50,7 +50,10 @@
50
50
  "generate:server-json": "tsx scripts/sync-release-metadata.ts",
51
51
  "publish:mcp-registry": "tsx scripts/publish-mcp-registry.ts",
52
52
  "lint": "eslint .",
53
- "test": "node --test dist/test/**/*.test.js",
53
+ "test": "node --test dist/test/coordinator-socket-error.integration.test.js",
54
+ "test:visibility": "node --test dist/test/visibility.integration.test.js",
55
+ "test:delivery": "node dist/test/delivery-receipt.runner.js",
56
+ "test:all": "pnpm test && pnpm test:delivery",
54
57
  "test:frontend": "tsx --test src/bridges/user/web/frontend/test/**/*.unit.test.ts",
55
58
  "test:e2e": "playwright test",
56
59
  "typecheck": "tsc --noEmit"
@@ -89,6 +92,7 @@
89
92
  },
90
93
  "dependencies": {
91
94
  "@modelcontextprotocol/sdk": "1.28.0",
95
+ "preact": "10.27.0",
92
96
  "typebox": "1.1.28",
93
97
  "ws": "8.20.0",
94
98
  "zod": "4.3.6"
@@ -100,7 +104,7 @@
100
104
  },
101
105
  "pi": {
102
106
  "extensions": [
103
- "./dist/bridges/pi"
107
+ "./src/bridges/pi/index.ts"
104
108
  ]
105
109
  }
106
110
  }
@@ -1,30 +0,0 @@
1
- /**
2
- * Render functions — pure DOM construction from state and data.
3
- *
4
- * Every function takes a document (or element) and data, returns DOM nodes.
5
- * No side effects, no global state. Testable with jsdom.
6
- */
7
- import type { Agent, DeliveryEvent, Room, RoomMessage } from "./types.js";
8
- export interface MessageTarget {
9
- messagesEl: HTMLElement;
10
- }
11
- export declare function renderChatMessage(doc: Document, target: MessageTarget, sender: string, content: string, timestamp: string): void;
12
- export declare function renderDmMessage(doc: Document, target: MessageTarget, sender: string, content: string, timestamp: string): void;
13
- export declare function renderSystemMessage(doc: Document, target: MessageTarget, text: string): void;
14
- export declare function renderStatusMessage(doc: Document, target: MessageTarget, text: string): void;
15
- export declare function clearMessages(target: MessageTarget): void;
16
- export declare function renderDeliveryEvent(doc: Document, target: MessageTarget, event: DeliveryEvent, currentRoom: string | undefined): void;
17
- export interface SidebarTarget {
18
- roomListEl: HTMLElement;
19
- agentListEl: HTMLElement;
20
- }
21
- export type RoomAction = (roomId: string) => void | Promise<void>;
22
- export declare function renderRoomList(doc: Document, target: SidebarTarget, rooms: Room[], currentRoom: string | undefined, onJoin: RoomAction): void;
23
- export type AgentSelectAction = (agentId: string) => void;
24
- export declare function renderAgentList(doc: Document, target: SidebarTarget, agents: Agent[], onSelect?: AgentSelectAction): void;
25
- export interface HeaderTarget {
26
- headerEl: HTMLElement;
27
- }
28
- export declare function renderHeader(target: HeaderTarget, text: string): void;
29
- export declare function renderMessageHistory(doc: Document, target: MessageTarget, messages: RoomMessage[]): void;
30
- //# sourceMappingURL=render.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/render.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAO1E,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,WAAW,CAAC;CACzB;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,QAAQ,EACb,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,IAAI,CAON;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,QAAQ,EACb,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,IAAI,CAON;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,QAAQ,EACb,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,MAAM,GACX,IAAI,CAMN;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,QAAQ,EACb,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,MAAM,GACX,IAAI,CAMN;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAEzD;AAMD,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,QAAQ,EACb,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,IAAI,CA2EN;AAMD,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,WAAW,CAAC;IACxB,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAElE,wBAAgB,cAAc,CAC5B,GAAG,EAAE,QAAQ,EACb,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,IAAI,EAAE,EACb,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,MAAM,EAAE,UAAU,GACjB,IAAI,CAgBN;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAE1D,wBAAgB,eAAe,CAC7B,GAAG,EAAE,QAAQ,EACb,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,KAAK,EAAE,EACf,QAAQ,CAAC,EAAE,iBAAiB,GAC3B,IAAI,CAqBN;AAMD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,WAAW,CAAC;CACvB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAErE;AAMD,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,QAAQ,EACb,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,WAAW,EAAE,GACtB,IAAI,CAIN"}
@@ -1,129 +0,0 @@
1
- /**
2
- * Render functions — pure DOM construction from state and data.
3
- *
4
- * Every function takes a document (or element) and data, returns DOM nodes.
5
- * No side effects, no global state. Testable with jsdom.
6
- */
7
- import { clearChildren, createElement, escapeHtml, formatTime } from "./dom.js";
8
- export function renderChatMessage(doc, target, sender, content, timestamp) {
9
- const time = formatTime(timestamp);
10
- const div = doc.createElement("div");
11
- div.className = "msg";
12
- div.innerHTML = `<span class="sender">${escapeHtml(doc, sender)}</span><span class="time">${time}</span>: ${escapeHtml(doc, content)}`;
13
- target.messagesEl.appendChild(div);
14
- target.messagesEl.scrollTop = target.messagesEl.scrollHeight;
15
- }
16
- export function renderDmMessage(doc, target, sender, content, timestamp) {
17
- const time = formatTime(timestamp);
18
- const div = doc.createElement("div");
19
- div.className = "msg dm";
20
- div.innerHTML = `<span class="dm-badge">DM</span> <span class="sender">${escapeHtml(doc, sender)}</span><span class="time">${time}</span>: ${escapeHtml(doc, content)}`;
21
- target.messagesEl.appendChild(div);
22
- target.messagesEl.scrollTop = target.messagesEl.scrollHeight;
23
- }
24
- export function renderSystemMessage(doc, target, text) {
25
- const div = doc.createElement("div");
26
- div.className = "msg system";
27
- div.textContent = text;
28
- target.messagesEl.appendChild(div);
29
- target.messagesEl.scrollTop = target.messagesEl.scrollHeight;
30
- }
31
- export function renderStatusMessage(doc, target, text) {
32
- const div = doc.createElement("div");
33
- div.className = "msg status";
34
- div.textContent = text;
35
- target.messagesEl.appendChild(div);
36
- target.messagesEl.scrollTop = target.messagesEl.scrollHeight;
37
- }
38
- export function clearMessages(target) {
39
- clearChildren(target.messagesEl);
40
- }
41
- // ---------------------------------------------------------------------------
42
- // Delivery event rendering
43
- // ---------------------------------------------------------------------------
44
- export function renderDeliveryEvent(doc, target, event, currentRoom) {
45
- switch (event.type) {
46
- case "room_message":
47
- if (currentRoom === event.message.room) {
48
- renderChatMessage(doc, target, event.message.from, event.message.content, event.message.timestamp);
49
- }
50
- break;
51
- case "dm":
52
- renderDmMessage(doc, target, event.message.from, event.message.content, event.message.timestamp);
53
- break;
54
- case "member_joined":
55
- renderSystemMessage(doc, target, `${event.agent} joined ${event.room}`);
56
- break;
57
- case "member_left":
58
- renderSystemMessage(doc, target, `${event.agent} left ${event.room}`);
59
- break;
60
- case "member_status":
61
- renderStatusMessage(doc, target, `${event.agent} is now ${event.status} in ${event.room}`);
62
- break;
63
- case "delivery_status":
64
- renderStatusMessage(doc, target, `Message ${event.messageId} ${event.status} by ${event.agent}`);
65
- break;
66
- case "room_members":
67
- if (currentRoom === event.room) {
68
- const memberList = event.members
69
- .map((m) => `${m.name} (${m.status})`)
70
- .join(", ");
71
- renderSystemMessage(doc, target, `Members: ${memberList}`);
72
- }
73
- break;
74
- case "room_invite": {
75
- const desc = event.roomDescription ? ` — ${event.roomDescription}` : "";
76
- renderSystemMessage(doc, target, `${event.fromName} invited you to "${event.room}"${desc}`);
77
- break;
78
- }
79
- case "invite_declined":
80
- renderSystemMessage(doc, target, `${event.agentName} declined invite to ${event.room}: "${event.reason}"`);
81
- break;
82
- }
83
- }
84
- export function renderRoomList(doc, target, rooms, currentRoom, onJoin) {
85
- clearChildren(target.roomListEl);
86
- for (const room of rooms) {
87
- const isActive = currentRoom === room.id;
88
- const typeIndicator = room.type.charAt(0).toUpperCase();
89
- const memberCount = room.members.length;
90
- const div = doc.createElement("div");
91
- div.className = `room-item${isActive ? " active" : ""}`;
92
- div.innerHTML = `${typeIndicator} ${escapeHtml(doc, room.name)} <span style="color:var(--dim)">(${String(memberCount)})</span>`;
93
- div.onclick = () => {
94
- void onJoin(room.id);
95
- };
96
- target.roomListEl.appendChild(div);
97
- }
98
- }
99
- export function renderAgentList(doc, target, agents, onSelect) {
100
- clearChildren(target.agentListEl);
101
- for (const agent of agents) {
102
- const div = doc.createElement("div");
103
- div.className = "agent-item";
104
- const dot = createElement(doc, "span", {
105
- class: `status-dot ${agent.status}`,
106
- });
107
- const name = doc.createTextNode(` ${agent.name}`);
108
- div.appendChild(dot);
109
- div.appendChild(name);
110
- if (onSelect) {
111
- div.onclick = () => {
112
- onSelect(agent.id);
113
- };
114
- }
115
- target.agentListEl.appendChild(div);
116
- }
117
- }
118
- export function renderHeader(target, text) {
119
- target.headerEl.textContent = text;
120
- }
121
- // ---------------------------------------------------------------------------
122
- // Room history (batch load)
123
- // ---------------------------------------------------------------------------
124
- export function renderMessageHistory(doc, target, messages) {
125
- for (const m of messages) {
126
- renderChatMessage(doc, target, m.from, m.content, m.timestamp);
127
- }
128
- }
129
- //# sourceMappingURL=render.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/render.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Unit tests for dom.ts — DOM helper functions.
3
- */
4
- export {};
5
- //# sourceMappingURL=dom.unit.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dom.unit.test.d.ts","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/test/dom.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}