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,361 @@
1
+ /**
2
+ * Integration tests for bidirectional connection approval.
3
+ *
4
+ * Verifies that a peer can connect via connect_request, the coordinator
5
+ * receives the request, accepts or rejects it, and the connection is
6
+ * established or torn down accordingly.
7
+ */
8
+ import * as net from "node:net";
9
+ import * as assert from "node:assert/strict";
10
+ import { test, describe } from "node:test";
11
+ import { MeshStore } from "../core/mesh-store.js";
12
+ import { CommsTool } from "../core/tool.js";
13
+ import { buildAction } from "../core/bridge.js";
14
+ /** Find a free port on localhost by binding to port 0. */
15
+ function findFreePort() {
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 = typeof addr === "object" && addr !== null ? addr.port : 0;
21
+ server.close(() => resolve(port));
22
+ });
23
+ server.on("error", reject);
24
+ });
25
+ }
26
+ /** Unique port counter to avoid reusing ports across sequential tests. */
27
+ let portOffset = 0;
28
+ /** Find a free port with a unique offset to avoid conflicts. */
29
+ async function uniquePort() {
30
+ portOffset += 10;
31
+ const base = await findFreePort();
32
+ return base + portOffset;
33
+ }
34
+ function sleep(ms) {
35
+ return new Promise((resolve) => setTimeout(resolve, ms));
36
+ }
37
+ describe("connection approval", () => {
38
+ void test("coordinator receives connection_request from connecting peer", async () => {
39
+ const portA = await uniquePort();
40
+ const portB = portA + 100;
41
+ // Set up coordinator (store A)
42
+ const storeA = new MeshStore(portA);
43
+ const receivedRequests = [];
44
+ storeA.onDelivery = (_id, event) => {
45
+ if (event.type === "connection_request") {
46
+ receivedRequests.push(event);
47
+ }
48
+ };
49
+ await storeA.init();
50
+ await storeA.registerAgent({
51
+ name: "coordinator",
52
+ harness: "test",
53
+ cwd: "/test/a",
54
+ pid: process.pid,
55
+ visibility: "visible",
56
+ tags: [],
57
+ });
58
+ await sleep(100);
59
+ // Set up connecting peer (store B) that uses connectToRemote
60
+ const storeB = new MeshStore(portB);
61
+ await storeB.startDataServerOnly();
62
+ await storeB.registerAgent({
63
+ name: "connector",
64
+ harness: "test",
65
+ cwd: "/test/b",
66
+ pid: process.pid,
67
+ visibility: "visible",
68
+ tags: [],
69
+ });
70
+ // Initiate connection request
71
+ storeB.connectToRemote("127.0.0.1", portA);
72
+ // Wait for the coordinator to receive the request
73
+ await sleep(300);
74
+ // Coordinator should have received a connection_request event
75
+ assert.equal(receivedRequests.length, 1, "Coordinator should receive exactly one connection request");
76
+ const request = receivedRequests[0];
77
+ assert.equal(request?.type, "connection_request");
78
+ assert.ok(request?.connectionId, "Request should have a connectionId");
79
+ assert.equal(request?.peerId, storeB.peerId, "Request should contain connector's peer ID");
80
+ assert.equal(request?.name, "connector", "Request should contain connector's name");
81
+ await storeB.shutdown();
82
+ await storeA.shutdown();
83
+ });
84
+ void test("accept establishes the peer connection", async () => {
85
+ const portA = await uniquePort();
86
+ const portB = portA + 100;
87
+ const storeA = new MeshStore(portA);
88
+ const receivedRequests = [];
89
+ storeA.onDelivery = (_id, event) => {
90
+ if (event.type === "connection_request") {
91
+ receivedRequests.push(event);
92
+ }
93
+ };
94
+ await storeA.init();
95
+ await storeA.registerAgent({
96
+ name: "coordinator",
97
+ harness: "test",
98
+ cwd: "/test/a",
99
+ pid: process.pid,
100
+ visibility: "visible",
101
+ tags: [],
102
+ });
103
+ await sleep(100);
104
+ const storeB = new MeshStore(portB);
105
+ await storeB.startDataServerOnly();
106
+ await storeB.registerAgent({
107
+ name: "connector",
108
+ harness: "test",
109
+ cwd: "/test/b",
110
+ pid: process.pid,
111
+ visibility: "visible",
112
+ tags: [],
113
+ });
114
+ storeB.connectToRemote("127.0.0.1", portA);
115
+ await sleep(300);
116
+ assert.equal(receivedRequests.length, 1, "Coordinator should receive a connection request");
117
+ const request = receivedRequests[0];
118
+ assert.ok(request?.connectionId);
119
+ // Accept the connection
120
+ await storeA.acceptConnection(request.connectionId);
121
+ // Wait for state sync (peer_list → connectToPeer → state_sync → handlePeerConnected)
122
+ await sleep(500);
123
+ // Verify both stores see each other's agents
124
+ const agentsA = await storeA.listAgents(storeA.peerId);
125
+ const agentsB = await storeB.listAgents(storeB.peerId);
126
+ assert.ok(agentsA.some((a) => a.id === storeB.peerId), "Coordinator should see the connector agent");
127
+ assert.ok(agentsB.some((a) => a.id === storeA.peerId), "Connector should see the coordinator agent");
128
+ await storeB.shutdown();
129
+ await storeA.shutdown();
130
+ });
131
+ void test("reject closes with reason", async () => {
132
+ const portA = await uniquePort();
133
+ const portB = portA + 100;
134
+ const storeA = new MeshStore(portA);
135
+ const receivedRequests = [];
136
+ storeA.onDelivery = (_id, event) => {
137
+ if (event.type === "connection_request") {
138
+ receivedRequests.push(event);
139
+ }
140
+ };
141
+ await storeA.init();
142
+ await storeA.registerAgent({
143
+ name: "coordinator",
144
+ harness: "test",
145
+ cwd: "/test/a",
146
+ pid: process.pid,
147
+ visibility: "visible",
148
+ tags: [],
149
+ });
150
+ await sleep(100);
151
+ const storeB = new MeshStore(portB);
152
+ await storeB.startDataServerOnly();
153
+ await storeB.registerAgent({
154
+ name: "connector",
155
+ harness: "test",
156
+ cwd: "/test/b",
157
+ pid: process.pid,
158
+ visibility: "visible",
159
+ tags: [],
160
+ });
161
+ storeB.connectToRemote("127.0.0.1", portA);
162
+ await sleep(300);
163
+ assert.equal(receivedRequests.length, 1, "Coordinator should receive a connection request");
164
+ const request = receivedRequests[0];
165
+ assert.ok(request?.connectionId);
166
+ // Reject the connection
167
+ await storeA.rejectConnection(request.connectionId, "unauthorised");
168
+ // Give the rejection time to propagate
169
+ await sleep(200);
170
+ // Verify the coordinator no longer sees the connector agent
171
+ const agentsA = await storeA.listAgents(storeA.peerId);
172
+ assert.ok(!agentsA.some((a) => a.id === storeB.peerId), "Rejected peer should not appear in agent list");
173
+ await storeB.shutdown();
174
+ await storeA.shutdown();
175
+ });
176
+ void test("mesh_pending lists pending connections", async () => {
177
+ const portA = await uniquePort();
178
+ const portB = portA + 100;
179
+ const storeA = new MeshStore(portA);
180
+ storeA.onDelivery = () => { };
181
+ await storeA.init();
182
+ await storeA.registerAgent({
183
+ name: "coordinator",
184
+ harness: "test",
185
+ cwd: "/test/a",
186
+ pid: process.pid,
187
+ visibility: "visible",
188
+ tags: [],
189
+ });
190
+ await sleep(100);
191
+ const storeB = new MeshStore(portB);
192
+ await storeB.startDataServerOnly();
193
+ await storeB.registerAgent({
194
+ name: "connector",
195
+ harness: "test",
196
+ cwd: "/test/b",
197
+ pid: process.pid,
198
+ visibility: "visible",
199
+ tags: [],
200
+ });
201
+ // No pending connections initially
202
+ let pending = storeA.listPendingConnections();
203
+ assert.equal(pending.length, 0, "Should have no pending connections initially");
204
+ // Initiate connection request
205
+ storeB.connectToRemote("127.0.0.1", portA);
206
+ await sleep(300);
207
+ // Should now have one pending connection
208
+ pending = storeA.listPendingConnections();
209
+ assert.equal(pending.length, 1, "Should have one pending connection");
210
+ assert.equal(pending[0]?.name, "connector", "Pending connection should show connector name");
211
+ assert.equal(pending[0]?.peerId, storeB.peerId, "Pending connection should show connector peer ID");
212
+ // Accept to clean up
213
+ const connectionId = pending[0]?.connectionId;
214
+ assert.ok(connectionId);
215
+ await storeA.acceptConnection(connectionId);
216
+ // Wait for state sync
217
+ await sleep(300);
218
+ // No more pending connections after acceptance
219
+ pending = storeA.listPendingConnections();
220
+ assert.equal(pending.length, 0, "Should have no pending connections after accept");
221
+ await storeB.shutdown();
222
+ await storeA.shutdown();
223
+ });
224
+ void test("tool handles mesh_connect/mesh_accept/mesh_reject/mesh_pending actions", async () => {
225
+ const portA = await uniquePort();
226
+ const portB = portA + 100;
227
+ const storeA = new MeshStore(portA);
228
+ storeA.onDelivery = () => { };
229
+ await storeA.init();
230
+ await storeA.registerAgent({
231
+ name: "coordinator",
232
+ harness: "test",
233
+ cwd: "/test/a",
234
+ pid: process.pid,
235
+ visibility: "visible",
236
+ tags: [],
237
+ });
238
+ const toolA = new CommsTool(storeA);
239
+ await sleep(100);
240
+ const storeB = new MeshStore(portB);
241
+ await storeB.startDataServerOnly();
242
+ await storeB.registerAgent({
243
+ name: "connector",
244
+ harness: "test",
245
+ cwd: "/test/b",
246
+ pid: process.pid,
247
+ visibility: "visible",
248
+ tags: [],
249
+ });
250
+ const toolB = new CommsTool(storeB);
251
+ // Use buildAction to construct the mesh_connect action
252
+ const connectAction = buildAction({
253
+ action: "mesh_connect",
254
+ host: "127.0.0.1",
255
+ port: portA,
256
+ });
257
+ // Give coordinator time to settle
258
+ await sleep(200);
259
+ // Verify coordinator is listening
260
+ const listeners = storeA.listListeners();
261
+ assert.ok(listeners.length > 0, `Coordinator should have listeners, got ${listeners.length}`);
262
+ assert.equal(listeners[0]?.port, portA, `Coordinator should be on port ${portA}`);
263
+ // B initiates the connection via the tool
264
+ const connectResult = await toolB.handle({
265
+ agentId: storeB.peerId,
266
+ harness: "test",
267
+ cwd: "/test/b",
268
+ pid: process.pid,
269
+ }, connectAction);
270
+ assert.ok(!connectResult.isError, `mesh_connect should succeed: ${connectResult.content}`);
271
+ await sleep(300);
272
+ // A checks pending connections via the tool
273
+ const pendingAction = buildAction({ action: "mesh_pending" });
274
+ const pendingResult = await toolA.handle({
275
+ agentId: storeA.peerId,
276
+ harness: "test",
277
+ cwd: "/test/a",
278
+ pid: process.pid,
279
+ }, pendingAction);
280
+ assert.ok(!pendingResult.isError, `mesh_pending should succeed: ${pendingResult.content}`);
281
+ assert.ok(pendingResult.content.includes("connector"), "Pending list should show connector name");
282
+ // Extract connectionId from the pending connections list
283
+ const pendingConns = storeA.listPendingConnections();
284
+ assert.equal(pendingConns.length, 1, "Should have one pending connection");
285
+ const connectionId = pendingConns[0]?.connectionId;
286
+ assert.ok(connectionId);
287
+ // A accepts the connection via the tool
288
+ const acceptAction = buildAction({
289
+ action: "mesh_accept",
290
+ connectionId,
291
+ });
292
+ const acceptResult = await toolA.handle({
293
+ agentId: storeA.peerId,
294
+ harness: "test",
295
+ cwd: "/test/a",
296
+ pid: process.pid,
297
+ }, acceptAction);
298
+ assert.ok(!acceptResult.isError, `mesh_accept should succeed: ${acceptResult.content}`);
299
+ await sleep(200);
300
+ // Verify both see each other
301
+ const agentsA = await storeA.listAgents(storeA.peerId);
302
+ const agentsB = await storeB.listAgents(storeB.peerId);
303
+ assert.ok(agentsA.some((a) => a.id === storeB.peerId), "A should see B after accept");
304
+ assert.ok(agentsB.some((a) => a.id === storeA.peerId), "B should see A after accept");
305
+ await storeB.shutdown();
306
+ await storeA.shutdown();
307
+ });
308
+ void test("tool mesh_reject returns error message", async () => {
309
+ const portA = await uniquePort();
310
+ const portB = portA + 100;
311
+ const storeA = new MeshStore(portA);
312
+ storeA.onDelivery = () => { };
313
+ await storeA.init();
314
+ await storeA.registerAgent({
315
+ name: "coordinator",
316
+ harness: "test",
317
+ cwd: "/test/a",
318
+ pid: process.pid,
319
+ visibility: "visible",
320
+ tags: [],
321
+ });
322
+ const toolA = new CommsTool(storeA);
323
+ await sleep(100);
324
+ const storeB = new MeshStore(portB);
325
+ await storeB.startDataServerOnly();
326
+ await storeB.registerAgent({
327
+ name: "connector",
328
+ harness: "test",
329
+ cwd: "/test/b",
330
+ pid: process.pid,
331
+ visibility: "visible",
332
+ tags: [],
333
+ });
334
+ // B connects
335
+ storeB.connectToRemote("127.0.0.1", portA);
336
+ await sleep(300);
337
+ const pendingConns = storeA.listPendingConnections();
338
+ const connectionId = pendingConns[0]?.connectionId;
339
+ assert.ok(connectionId);
340
+ // A rejects via the tool
341
+ const rejectAction = buildAction({
342
+ action: "mesh_reject",
343
+ connectionId,
344
+ reason: "not allowed",
345
+ });
346
+ const rejectResult = await toolA.handle({
347
+ agentId: storeA.peerId,
348
+ harness: "test",
349
+ cwd: "/test/a",
350
+ pid: process.pid,
351
+ }, rejectAction);
352
+ assert.ok(!rejectResult.isError, `mesh_reject should succeed: ${rejectResult.content}`);
353
+ assert.ok(rejectResult.content.includes("not allowed"), "Result should include the reason");
354
+ // Verify rejection took effect
355
+ const pending = storeA.listPendingConnections();
356
+ assert.equal(pending.length, 0, "No pending connections after reject");
357
+ await storeB.shutdown();
358
+ await storeA.shutdown();
359
+ });
360
+ });
361
+ //# sourceMappingURL=approval.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval.integration.test.js","sourceRoot":"","sources":["../../src/test/approval.integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Delivery receipt test helper — runs a single test case in isolation.
3
+ *
4
+ * Usage: node delivery-receipt.helper.js <test-name>
5
+ *
6
+ * Test names:
7
+ * push-room — onDelivery fires for room messages
8
+ * push-dm — onDelivery fires for DMs
9
+ * drain-room — drainDelivery returns queued room messages
10
+ * drain-dm — drainDelivery returns queued DMs
11
+ * read-receipt-push — read receipt after onDelivery
12
+ * read-receipt-drain — read receipt after drainDelivery
13
+ * readby-array — message readBy array updated
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=delivery-receipt.helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery-receipt.helper.d.ts","sourceRoot":"","sources":["../../src/test/delivery-receipt.helper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}