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,409 @@
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
+ import { MeshStore } from "../core/mesh-store.js";
16
+ import * as net from "node:net";
17
+ import assert from "node:assert/strict";
18
+ const testName = process.argv[2];
19
+ if (testName === undefined) {
20
+ console.error("Usage: node delivery-receipt.helper.ts <test-name>");
21
+ process.exit(1);
22
+ }
23
+ function sleep(ms) {
24
+ return new Promise((resolve) => setTimeout(resolve, ms));
25
+ }
26
+ /**
27
+ * Allocate a genuinely free coordinator port. Creates a probe server on
28
+ * port 0, records the OS-assigned port, then immediately closes the
29
+ * probe. Uses SO_REUSEADDR on the probe so the port doesn't enter
30
+ * TIME_WAIT — making it immediately available for the coordinator.
31
+ */
32
+ async function allocFreePort() {
33
+ return new Promise((resolve, reject) => {
34
+ const server = net.createServer();
35
+ // SO_REUSEADDR avoids TIME_WAIT on close
36
+ server.listen(0, "127.0.0.1", () => {
37
+ const addr = server.address();
38
+ const port = addr && typeof addr === "object" ? addr.port : 0;
39
+ server.close(() => {
40
+ resolve(port);
41
+ });
42
+ });
43
+ server.on("error", reject);
44
+ });
45
+ }
46
+ async function cleanup(...stores) {
47
+ for (const s of stores) {
48
+ await s.shutdown();
49
+ }
50
+ }
51
+ // ---------------------------------------------------------------------------
52
+ // Test implementations
53
+ // ---------------------------------------------------------------------------
54
+ async function testPushRoom() {
55
+ const port = await allocFreePort();
56
+ const a = new MeshStore(port);
57
+ const deliveriesA = [];
58
+ a.onDelivery = () => {
59
+ deliveriesA.push(1);
60
+ };
61
+ await a.init();
62
+ await a.registerAgent({
63
+ name: "a",
64
+ harness: "test",
65
+ cwd: "/test/a",
66
+ pid: process.pid,
67
+ visibility: "visible",
68
+ tags: [],
69
+ });
70
+ await sleep(100);
71
+ const b = new MeshStore(port);
72
+ const deliveriesB = [];
73
+ b.onDelivery = (_id, ev) => {
74
+ deliveriesB.push(ev);
75
+ };
76
+ await b.init();
77
+ await b.registerAgent({
78
+ name: "b",
79
+ harness: "test",
80
+ cwd: "/test/b",
81
+ pid: process.pid,
82
+ visibility: "visible",
83
+ tags: [],
84
+ });
85
+ await sleep(300);
86
+ const room = await a.createRoom({
87
+ name: `push-room-${String(port)}`,
88
+ type: "public",
89
+ owner: a.peerId,
90
+ description: "Push delivery test",
91
+ });
92
+ await sleep(200);
93
+ await b.joinRoom(room.id, b.peerId);
94
+ await sleep(200);
95
+ deliveriesB.length = 0;
96
+ await a.sendRoomMessage(room.id, a.peerId, "Hello push!");
97
+ await sleep(300);
98
+ assert.ok(deliveriesB.length >= 1, `B should receive at least 1 delivery, got ${String(deliveriesB.length)}`);
99
+ const roomMsg = deliveriesB.find((ev) => ev.type === "room_message");
100
+ assert.ok(roomMsg !== undefined, "Should find room_message event");
101
+ assert.strictEqual(roomMsg.message.content, "Hello push!");
102
+ assert.strictEqual(roomMsg.message.from, a.peerId);
103
+ await cleanup(a, b);
104
+ }
105
+ async function testPushDm() {
106
+ const port = await allocFreePort();
107
+ const a = new MeshStore(port);
108
+ const deliveriesA = [];
109
+ a.onDelivery = () => {
110
+ deliveriesA.push(1);
111
+ };
112
+ await a.init();
113
+ await a.registerAgent({
114
+ name: "a",
115
+ harness: "test",
116
+ cwd: "/test/a",
117
+ pid: process.pid,
118
+ visibility: "visible",
119
+ tags: [],
120
+ });
121
+ await sleep(100);
122
+ const b = new MeshStore(port);
123
+ const deliveriesB = [];
124
+ b.onDelivery = (_id, ev) => {
125
+ deliveriesB.push(ev);
126
+ };
127
+ await b.init();
128
+ await b.registerAgent({
129
+ name: "b",
130
+ harness: "test",
131
+ cwd: "/test/b",
132
+ pid: process.pid,
133
+ visibility: "visible",
134
+ tags: [],
135
+ });
136
+ await sleep(300);
137
+ deliveriesB.length = 0;
138
+ await a.sendDm(a.peerId, b.peerId, "Direct push!");
139
+ await sleep(300);
140
+ assert.ok(deliveriesB.length >= 1, `B should receive DM, got ${String(deliveriesB.length)}`);
141
+ const dm = deliveriesB.find((ev) => ev.type === "dm");
142
+ assert.ok(dm !== undefined, "Should find dm event");
143
+ assert.strictEqual(dm.message.content, "Direct push!");
144
+ assert.strictEqual(dm.message.from, a.peerId);
145
+ await cleanup(a, b);
146
+ }
147
+ async function testDrainRoom() {
148
+ const port = await allocFreePort();
149
+ const a = new MeshStore(port);
150
+ await a.init();
151
+ await a.registerAgent({
152
+ name: "a",
153
+ harness: "test",
154
+ cwd: "/test/a",
155
+ pid: process.pid,
156
+ visibility: "visible",
157
+ tags: [],
158
+ });
159
+ await sleep(100);
160
+ // B has NO onDelivery — events queue for drain
161
+ const b = new MeshStore(port);
162
+ await b.init();
163
+ await b.registerAgent({
164
+ name: "b",
165
+ harness: "test",
166
+ cwd: "/test/b",
167
+ pid: process.pid,
168
+ visibility: "visible",
169
+ tags: [],
170
+ });
171
+ await sleep(300);
172
+ const room = await a.createRoom({
173
+ name: `drain-room-${String(port)}`,
174
+ type: "public",
175
+ owner: a.peerId,
176
+ description: "Drain delivery test",
177
+ });
178
+ await sleep(200);
179
+ await b.joinRoom(room.id, b.peerId);
180
+ await sleep(200);
181
+ await a.sendRoomMessage(room.id, a.peerId, "Hello drain!");
182
+ await sleep(300);
183
+ const drained = await b.drainDelivery(b.peerId);
184
+ assert.ok(drained.length >= 1, `drainDelivery should return events, got ${String(drained.length)}`);
185
+ const roomMsg = drained.find((e) => e.type === "room_message");
186
+ assert.ok(roomMsg !== undefined, "Should find room_message in drained events");
187
+ assert.strictEqual(roomMsg.message.content, "Hello drain!");
188
+ const drainedAgain = await b.drainDelivery(b.peerId);
189
+ assert.strictEqual(drainedAgain.length, 0, "Second drainDelivery should return no events");
190
+ await cleanup(a, b);
191
+ }
192
+ async function testDrainDm() {
193
+ const port = await allocFreePort();
194
+ const a = new MeshStore(port);
195
+ await a.init();
196
+ await a.registerAgent({
197
+ name: "a",
198
+ harness: "test",
199
+ cwd: "/test/a",
200
+ pid: process.pid,
201
+ visibility: "visible",
202
+ tags: [],
203
+ });
204
+ await sleep(100);
205
+ const b = new MeshStore(port);
206
+ await b.init();
207
+ await b.registerAgent({
208
+ name: "b",
209
+ harness: "test",
210
+ cwd: "/test/b",
211
+ pid: process.pid,
212
+ visibility: "visible",
213
+ tags: [],
214
+ });
215
+ await sleep(300);
216
+ await a.sendDm(a.peerId, b.peerId, "Direct drain!");
217
+ await sleep(300);
218
+ const drained = await b.drainDelivery(b.peerId);
219
+ assert.ok(drained.length >= 1, `drainDelivery should return DM, got ${String(drained.length)}`);
220
+ const event = drained[0];
221
+ assert.ok(event, "drainDelivery should return at least one event");
222
+ assert.strictEqual(event.type, "dm");
223
+ assert.strictEqual(event.message.content, "Direct drain!");
224
+ await cleanup(a, b);
225
+ }
226
+ async function testReadReceiptPush() {
227
+ const port = await allocFreePort();
228
+ const a = new MeshStore(port);
229
+ const deliveriesA = [];
230
+ a.onDelivery = (_id, ev) => {
231
+ deliveriesA.push(ev);
232
+ };
233
+ await a.init();
234
+ await a.registerAgent({
235
+ name: "a",
236
+ harness: "test",
237
+ cwd: "/test/a",
238
+ pid: process.pid,
239
+ visibility: "visible",
240
+ tags: [],
241
+ });
242
+ await sleep(100);
243
+ const b = new MeshStore(port);
244
+ b.onDelivery = () => {
245
+ /* intentionally empty — dummy handler for drain delivery */
246
+ };
247
+ await b.init();
248
+ await b.registerAgent({
249
+ name: "b",
250
+ harness: "test",
251
+ cwd: "/test/b",
252
+ pid: process.pid,
253
+ visibility: "visible",
254
+ tags: [],
255
+ });
256
+ await sleep(300);
257
+ const room = await a.createRoom({
258
+ name: `read-push-${String(port)}`,
259
+ type: "public",
260
+ owner: a.peerId,
261
+ description: "Read receipt push test",
262
+ });
263
+ await sleep(200);
264
+ await b.joinRoom(room.id, b.peerId);
265
+ await sleep(200);
266
+ deliveriesA.length = 0;
267
+ await a.sendRoomMessage(room.id, a.peerId, "Read me");
268
+ await sleep(500);
269
+ const readReceipt = deliveriesA.find((ev) => ev.type === "delivery_status" && ev.status === "read");
270
+ assert.ok(readReceipt !== undefined, "A should receive a read receipt");
271
+ assert.strictEqual(readReceipt.agent, b.peerId);
272
+ await cleanup(a, b);
273
+ }
274
+ async function testReadReceiptDrain() {
275
+ const port = await allocFreePort();
276
+ const a = new MeshStore(port);
277
+ const deliveriesA = [];
278
+ a.onDelivery = (_id, ev) => {
279
+ deliveriesA.push(ev);
280
+ };
281
+ await a.init();
282
+ await a.registerAgent({
283
+ name: "a",
284
+ harness: "test",
285
+ cwd: "/test/a",
286
+ pid: process.pid,
287
+ visibility: "visible",
288
+ tags: [],
289
+ });
290
+ await sleep(100);
291
+ // B has NO onDelivery — drain triggers markRead
292
+ const b = new MeshStore(port);
293
+ await b.init();
294
+ await b.registerAgent({
295
+ name: "b",
296
+ harness: "test",
297
+ cwd: "/test/b",
298
+ pid: process.pid,
299
+ visibility: "visible",
300
+ tags: [],
301
+ });
302
+ await sleep(300);
303
+ const room = await a.createRoom({
304
+ name: `read-drain-${String(port)}`,
305
+ type: "public",
306
+ owner: a.peerId,
307
+ description: "Read receipt drain test",
308
+ });
309
+ await sleep(200);
310
+ await b.joinRoom(room.id, b.peerId);
311
+ await sleep(200);
312
+ deliveriesA.length = 0;
313
+ await a.sendRoomMessage(room.id, a.peerId, "Drain then read");
314
+ await sleep(300);
315
+ const drained = await b.drainDelivery(b.peerId);
316
+ assert.ok(drained.length >= 1, "Drain should return the message");
317
+ await sleep(300);
318
+ const readReceipt = deliveriesA.find((ev) => ev.type === "delivery_status" && ev.status === "read");
319
+ assert.ok(readReceipt !== undefined, "A should receive a read receipt after drain");
320
+ await cleanup(a, b);
321
+ }
322
+ async function testReadbyArray() {
323
+ const port = await allocFreePort();
324
+ const a = new MeshStore(port);
325
+ a.onDelivery = () => {
326
+ /* intentionally empty — dummy handler for drain delivery */
327
+ };
328
+ await a.init();
329
+ await a.registerAgent({
330
+ name: "a",
331
+ harness: "test",
332
+ cwd: "/test/a",
333
+ pid: process.pid,
334
+ visibility: "visible",
335
+ tags: [],
336
+ });
337
+ await sleep(100);
338
+ const b = new MeshStore(port);
339
+ b.onDelivery = () => {
340
+ /* intentionally empty — dummy handler for drain delivery */
341
+ };
342
+ await b.init();
343
+ await b.registerAgent({
344
+ name: "b",
345
+ harness: "test",
346
+ cwd: "/test/b",
347
+ pid: process.pid,
348
+ visibility: "visible",
349
+ tags: [],
350
+ });
351
+ await sleep(300);
352
+ const room = await a.createRoom({
353
+ name: `readby-${String(port)}`,
354
+ type: "public",
355
+ owner: a.peerId,
356
+ description: "readBy test",
357
+ });
358
+ await sleep(200);
359
+ await b.joinRoom(room.id, b.peerId);
360
+ await sleep(200);
361
+ const msg = await a.sendRoomMessage(room.id, a.peerId, "Check readBy");
362
+ await sleep(800);
363
+ const messages = await a.readRoomMessages(room.id);
364
+ const sent = messages.find((m) => m.id === msg.id);
365
+ assert.ok(sent !== undefined, "Should find the sent message");
366
+ assert.ok(sent.readBy.includes(b.peerId), `readBy should include B, got: ${sent.readBy.join(", ")}`);
367
+ await cleanup(a, b);
368
+ }
369
+ // ---------------------------------------------------------------------------
370
+ // Runner
371
+ // ---------------------------------------------------------------------------
372
+ const tests = {
373
+ "push-room": testPushRoom,
374
+ "push-dm": testPushDm,
375
+ "drain-room": testDrainRoom,
376
+ "drain-dm": testDrainDm,
377
+ "read-receipt-push": testReadReceiptPush,
378
+ "read-receipt-drain": testReadReceiptDrain,
379
+ "readby-array": testReadbyArray,
380
+ };
381
+ const fn = tests[testName];
382
+ if (!fn) {
383
+ console.error(`Unknown test: ${testName}`);
384
+ console.error(`Available: ${Object.keys(tests).join(", ")}`);
385
+ process.exit(1);
386
+ }
387
+ fn()
388
+ .then(async () => {
389
+ // Wait for all active handles to be cleaned up before exiting.
390
+ // This ensures TCP sockets are properly closed (FIN sent, not RST)
391
+ // and the OS releases the ports before the process exits, preventing
392
+ // the parent process from hanging on subsequent fork/exec.
393
+ const maxWait = 2000; // ms
394
+ const start = Date.now();
395
+ const getHandles =
396
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
397
+ process
398
+ ._getActiveHandles ?? (() => []);
399
+ const handles = getHandles();
400
+ while (handles.length > 0 && Date.now() - start < maxWait) {
401
+ await new Promise((resolve) => setTimeout(resolve, 50));
402
+ }
403
+ process.exit(0);
404
+ })
405
+ .catch((err) => {
406
+ console.error(`FAIL [${testName}]:`, err);
407
+ process.exit(1);
408
+ });
409
+ //# sourceMappingURL=delivery-receipt.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery-receipt.helper.js","sourceRoot":"","sources":["../../src/test/delivery-receipt.helper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Delivery receipt test runner — runs each test case in an isolated child
4
+ * process. Tests MUST NOT be run from within a process that has the
5
+ * agent-comms extension loaded (e.g. pi's agent session), because the
6
+ * parent's active TCP handles interfere with child process forking.
7
+ *
8
+ * Usage:
9
+ * pnpm test:delivery # from a clean shell (recommended)
10
+ * node dist/test/delivery-receipt.runner.js
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=delivery-receipt.runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery-receipt.runner.d.ts","sourceRoot":"","sources":["../../src/test/delivery-receipt.runner.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG"}
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Delivery receipt test runner — runs each test case in an isolated child
4
+ * process. Tests MUST NOT be run from within a process that has the
5
+ * agent-comms extension loaded (e.g. pi's agent session), because the
6
+ * parent's active TCP handles interfere with child process forking.
7
+ *
8
+ * Usage:
9
+ * pnpm test:delivery # from a clean shell (recommended)
10
+ * node dist/test/delivery-receipt.runner.js
11
+ */
12
+ import { execFileSync } from "node:child_process";
13
+ import * as path from "node:path";
14
+ import * as url from "node:url";
15
+ const __dirname = path.dirname(url.fileURLToPath(import.meta.url));
16
+ const HELPER = path.join(__dirname, "delivery-receipt.helper.js");
17
+ const tests = [
18
+ "push-room",
19
+ "push-dm",
20
+ "drain-room",
21
+ "drain-dm",
22
+ "read-receipt-push",
23
+ "read-receipt-drain",
24
+ "readby-array",
25
+ ];
26
+ let failed = false;
27
+ for (const t of tests) {
28
+ try {
29
+ const stdout = execFileSync(process.execPath, [HELPER, t], {
30
+ timeout: 15_000,
31
+ stdio: ["pipe", "pipe", "pipe"],
32
+ encoding: "utf-8",
33
+ });
34
+ if (stdout.trim())
35
+ console.log(stdout.trim());
36
+ console.log(`${t} ✓`);
37
+ }
38
+ catch (e) {
39
+ const msg = e instanceof Error && "stderr" in e && typeof e.stderr === "string"
40
+ ? e.stderr.trim() || e.message
41
+ : String(e);
42
+ console.error(`${t} ✗ ${msg}`);
43
+ failed = true;
44
+ break;
45
+ }
46
+ }
47
+ if (!failed) {
48
+ console.log("\nAll 7 delivery receipt tests passed!");
49
+ }
50
+ process.exit(failed ? 1 : 0);
51
+ //# sourceMappingURL=delivery-receipt.runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery-receipt.runner.js","sourceRoot":"","sources":["../../src/test/delivery-receipt.runner.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAEhC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACnE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,4BAA4B,CAAC,CAAC;AAElE,MAAM,KAAK,GAAG;IACZ,WAAW;IACX,SAAS;IACT,YAAY;IACZ,UAAU;IACV,mBAAmB;IACnB,oBAAoB;IACpB,cAAc;CACf,CAAC;AAEF,IAAI,MAAM,GAAG,KAAK,CAAC;AAEnB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE;YACzD,OAAO,EAAE,MAAM;YACf,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,IAAI,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,MAAM,GAAG,GACP,CAAC,YAAY,KAAK,IAAI,QAAQ,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;YACjE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO;YAC9B,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QAC/B,MAAM,GAAG,IAAI,CAAC;QACd,MAAM;IACR,CAAC;AACH,CAAC;AAED,IAAI,CAAC,MAAM,EAAE,CAAC;IACZ,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;AACxD,CAAC;AAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Federation integration test — verifies that two MeshStore instances on
3
+ * different "machines" (simulated via separate TCP meshes) can federate
4
+ * through coordinator-to-coordinator TLS links.
5
+ *
6
+ * Tests:
7
+ * 1. Establish federation link between two meshes
8
+ * 2. Agent presence propagates across federation
9
+ * 3. Messages in federated rooms propagate across federation
10
+ * 4. Non-federated rooms are isolated (messages never cross)
11
+ *
12
+ * Run: node dist/test/federation.integration.test.js
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=federation.integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation.integration.test.d.ts","sourceRoot":"","sources":["../../src/test/federation.integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}