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,274 @@
1
+ /**
2
+ * SharedWorker — browser mesh node.
3
+ *
4
+ * Runs a lightweight mesh state store connected to the server's /ws/mesh
5
+ * endpoint. Maintains a local copy of all mesh state (agents, rooms,
6
+ * messages, DMs) by applying state_sync and state_update patches received
7
+ * over WebSocket. Exposes a postMessage API for the main thread to query
8
+ * state, execute actions, and subscribe to real-time updates.
9
+ *
10
+ * Built as a separate IIFE bundle (mesh-worker.js) so the SharedWorker
11
+ * runs in its own global scope independent of the main app bundle.
12
+ */
13
+ // ---------------------------------------------------------------------------
14
+ // Lightweight mesh state
15
+ // ---------------------------------------------------------------------------
16
+ const agents = new Map();
17
+ const rooms = new Map();
18
+ const messages = new Map();
19
+ const dms = new Map();
20
+ function applyStateSync(state) {
21
+ for (const [id, agent] of Object.entries(state.agents)) {
22
+ agents.set(id, agent);
23
+ }
24
+ for (const [id, room] of Object.entries(state.rooms)) {
25
+ rooms.set(id, room);
26
+ }
27
+ for (const [id, msgs] of Object.entries(state.messages)) {
28
+ messages.set(id, msgs);
29
+ }
30
+ for (const [id, dmMsgs] of Object.entries(state.dms)) {
31
+ dms.set(id, dmMsgs);
32
+ }
33
+ }
34
+ function applyPatch(patch) {
35
+ switch (patch.type) {
36
+ case "agent_upsert": {
37
+ const existing = agents.get(patch.agent.id);
38
+ if (existing) {
39
+ const merged = patch.agent;
40
+ for (const r of existing.subscribedRooms) {
41
+ if (!merged.subscribedRooms.includes(r)) {
42
+ merged.subscribedRooms.push(r);
43
+ }
44
+ }
45
+ agents.set(merged.id, merged);
46
+ }
47
+ else {
48
+ agents.set(patch.agent.id, patch.agent);
49
+ }
50
+ break;
51
+ }
52
+ case "agent_offline": {
53
+ const agent = agents.get(patch.agentId);
54
+ if (agent) {
55
+ agent.status = "offline";
56
+ agents.set(patch.agentId, agent);
57
+ }
58
+ break;
59
+ }
60
+ case "room_upsert": {
61
+ const existing = rooms.get(patch.room.id);
62
+ if (existing) {
63
+ const merged = patch.room;
64
+ for (const m of existing.members) {
65
+ if (!merged.members.includes(m))
66
+ merged.members.push(m);
67
+ }
68
+ rooms.set(merged.id, merged);
69
+ }
70
+ else {
71
+ rooms.set(patch.room.id, patch.room);
72
+ }
73
+ break;
74
+ }
75
+ case "room_delete":
76
+ rooms.delete(patch.roomId);
77
+ break;
78
+ case "message_add": {
79
+ const arr = messages.get(patch.roomId) ?? [];
80
+ arr.push(patch.message);
81
+ messages.set(patch.roomId, arr);
82
+ break;
83
+ }
84
+ case "dm_add": {
85
+ const arr = dms.get(patch.key) ?? [];
86
+ arr.push(patch.message);
87
+ dms.set(patch.key, arr);
88
+ break;
89
+ }
90
+ case "delivery":
91
+ // Delivery events are forwarded to the main thread as patches.
92
+ break;
93
+ case "message_read": {
94
+ if (patch.room) {
95
+ const msgs = messages.get(patch.room);
96
+ if (msgs) {
97
+ const msg = msgs.find((m) => m.id === patch.messageId);
98
+ if (msg && !msg.readBy.includes(patch.readBy)) {
99
+ msg.readBy.push(patch.readBy);
100
+ }
101
+ }
102
+ }
103
+ else {
104
+ for (const [, dmMsgs] of dms) {
105
+ const msg = dmMsgs.find((m) => m.id === patch.messageId);
106
+ if (msg && !msg.readBy.includes(patch.readBy)) {
107
+ msg.readBy.push(patch.readBy);
108
+ }
109
+ }
110
+ }
111
+ break;
112
+ }
113
+ }
114
+ }
115
+ function getStateSnapshot() {
116
+ return {
117
+ agents: [...agents.values()],
118
+ rooms: [...rooms.values()],
119
+ };
120
+ }
121
+ // ---------------------------------------------------------------------------
122
+ // WebSocket connection to /ws/mesh
123
+ // ---------------------------------------------------------------------------
124
+ let ws;
125
+ let reconnectTimer;
126
+ let wsUrl;
127
+ function connect(url) {
128
+ wsUrl = url;
129
+ if (reconnectTimer !== undefined) {
130
+ clearTimeout(reconnectTimer);
131
+ reconnectTimer = undefined;
132
+ }
133
+ const socket = new WebSocket(url);
134
+ ws = socket;
135
+ socket.onopen = () => {
136
+ broadcastToPorts({ type: "connected" });
137
+ };
138
+ socket.onclose = () => {
139
+ ws = undefined;
140
+ broadcastToPorts({ type: "disconnected" });
141
+ scheduleReconnect();
142
+ };
143
+ socket.onerror = () => {
144
+ // onclose fires after this
145
+ };
146
+ socket.onmessage = (event) => {
147
+ const raw = JSON.parse(typeof event.data === "string" ? event.data : String(event.data));
148
+ handleServerMessage(raw);
149
+ };
150
+ }
151
+ function scheduleReconnect() {
152
+ if (!wsUrl)
153
+ return;
154
+ reconnectTimer = setTimeout(() => {
155
+ if (wsUrl)
156
+ connect(wsUrl);
157
+ }, 3000);
158
+ }
159
+ function handleServerMessage(raw) {
160
+ if (isMeshStateMessage(raw)) {
161
+ if (raw.method === "state_sync") {
162
+ applyStateSync(raw.state);
163
+ broadcastToPorts({ type: "state", state: getStateSnapshot() });
164
+ }
165
+ else {
166
+ applyPatch(raw.patch);
167
+ broadcastToPorts({ type: "patch", patch: raw.patch });
168
+ }
169
+ return;
170
+ }
171
+ // Action responses from the server — { type: "result" } or { type: "error" }
172
+ if (typeof raw === "object" && raw !== null && "type" in raw) {
173
+ if (raw.type === "result" &&
174
+ "result" in raw &&
175
+ typeof raw.result === "object" &&
176
+ raw.result !== null &&
177
+ "content" in raw.result &&
178
+ typeof raw.result.content === "string" &&
179
+ "isError" in raw.result &&
180
+ typeof raw.result.isError === "boolean") {
181
+ broadcastToPorts({
182
+ type: "actionResult",
183
+ id: "",
184
+ result: { content: raw.result.content, isError: raw.result.isError },
185
+ });
186
+ }
187
+ else if (raw.type === "error" &&
188
+ "message" in raw &&
189
+ typeof raw.message === "string") {
190
+ broadcastToPorts({
191
+ type: "actionError",
192
+ id: "",
193
+ message: raw.message,
194
+ });
195
+ }
196
+ }
197
+ }
198
+ function isMeshStateMessage(value) {
199
+ if (typeof value !== "object" || value === null)
200
+ return false;
201
+ if (!("method" in value))
202
+ return false;
203
+ const method = value.method;
204
+ return (typeof method === "string" &&
205
+ (method === "state_sync" || method === "state_update"));
206
+ }
207
+ // ---------------------------------------------------------------------------
208
+ // Port management — fan-out to all connected main-thread tabs
209
+ // ---------------------------------------------------------------------------
210
+ const ports = new Set();
211
+ function broadcastToPorts(msg) {
212
+ const data = JSON.stringify(msg);
213
+ for (const port of ports) {
214
+ try {
215
+ port.postMessage(data);
216
+ }
217
+ catch {
218
+ // Port closed — cleaned up via port.onmessage error
219
+ }
220
+ }
221
+ }
222
+ function handlePortMessage(msg) {
223
+ switch (msg.type) {
224
+ case "init":
225
+ connect(msg.url);
226
+ break;
227
+ case "action": {
228
+ if (ws?.readyState === WebSocket.OPEN) {
229
+ ws.send(JSON.stringify(msg.action));
230
+ }
231
+ break;
232
+ }
233
+ case "getState":
234
+ broadcastToPorts({ type: "state", state: getStateSnapshot() });
235
+ break;
236
+ }
237
+ }
238
+ function isWorkerInbound(value) {
239
+ if (typeof value !== "object" || value === null)
240
+ return false;
241
+ if (!("type" in value))
242
+ return false;
243
+ const t = value.type;
244
+ return (typeof t === "string" &&
245
+ (t === "init" || t === "action" || t === "getState"));
246
+ }
247
+ // ---------------------------------------------------------------------------
248
+ // Entry point — listen for SharedWorker connections
249
+ // ---------------------------------------------------------------------------
250
+ self.addEventListener("connect", (event) => {
251
+ const rawPort = event.ports[0];
252
+ if (rawPort === undefined)
253
+ return;
254
+ // MessagePort satisfies MessagePortLike (has postMessage, close, onmessage)
255
+ ports.add(rawPort);
256
+ // Send current state to the new port
257
+ try {
258
+ rawPort.postMessage(JSON.stringify({
259
+ type: "state",
260
+ state: getStateSnapshot(),
261
+ }));
262
+ }
263
+ catch {
264
+ // Port not ready yet — will get state on next update
265
+ }
266
+ rawPort.onmessage = (e) => {
267
+ const parsed = JSON.parse(typeof e.data === "string" ? e.data : String(e.data));
268
+ if (isWorkerInbound(parsed)) {
269
+ handlePortMessage(parsed);
270
+ }
271
+ };
272
+ });
273
+ export {};
274
+ //# sourceMappingURL=mesh-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-worker.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/mesh-worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Message conversion — transforms wire-format events into display messages.
3
+ *
4
+ * Pure functions, no DOM or state dependency. Testable in isolation.
5
+ */
6
+ import type { DeliveryEvent, DisplayMessage, RoomMessage } from "./types.js";
7
+ /**
8
+ * Convert a delivery event to a display message for the UI.
9
+ * Returns undefined if the event should not be displayed
10
+ * (e.g. room_message for a room that isn't currently active).
11
+ */
12
+ export declare function deliveryEventToMessage(event: DeliveryEvent, currentRoom: string | undefined): DisplayMessage | undefined;
13
+ /**
14
+ * Convert a room message (from REST API history) to a display message.
15
+ */
16
+ export declare function roomMessageToDisplay(m: RoomMessage): DisplayMessage;
17
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/messages.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE7E;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,cAAc,GAAG,SAAS,CAoE5B;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,WAAW,GAAG,cAAc,CAOnE"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Message conversion — transforms wire-format events into display messages.
3
+ *
4
+ * Pure functions, no DOM or state dependency. Testable in isolation.
5
+ */
6
+ /**
7
+ * Convert a delivery event to a display message for the UI.
8
+ * Returns undefined if the event should not be displayed
9
+ * (e.g. room_message for a room that isn't currently active).
10
+ */
11
+ export function deliveryEventToMessage(event, currentRoom) {
12
+ switch (event.type) {
13
+ case "room_message":
14
+ if (currentRoom === event.message.room) {
15
+ return {
16
+ type: "chat",
17
+ sender: event.message.from,
18
+ content: event.message.content,
19
+ timestamp: event.message.timestamp,
20
+ };
21
+ }
22
+ return undefined;
23
+ case "dm":
24
+ return {
25
+ type: "dm",
26
+ sender: event.message.from,
27
+ content: event.message.content,
28
+ timestamp: event.message.timestamp,
29
+ };
30
+ case "member_joined":
31
+ return { type: "system", text: `${event.agent} joined ${event.room}` };
32
+ case "member_left":
33
+ return { type: "system", text: `${event.agent} left ${event.room}` };
34
+ case "member_status":
35
+ return {
36
+ type: "status",
37
+ text: `${event.agent} is now ${event.status} in ${event.room}`,
38
+ };
39
+ case "delivery_status":
40
+ return {
41
+ type: "status",
42
+ text: `Message ${event.messageId} ${event.status} by ${event.agent}`,
43
+ };
44
+ case "room_members":
45
+ if (currentRoom === event.room) {
46
+ const memberList = event.members
47
+ .map((m) => `${m.name} (${m.status})`)
48
+ .join(", ");
49
+ return { type: "system", text: `Members: ${memberList}` };
50
+ }
51
+ return undefined;
52
+ case "room_invite": {
53
+ const desc = event.roomDescription ? ` — ${event.roomDescription}` : "";
54
+ return {
55
+ type: "system",
56
+ text: `${event.fromName} invited you to "${event.room}"${desc}`,
57
+ };
58
+ }
59
+ case "invite_declined":
60
+ return {
61
+ type: "system",
62
+ text: `${event.agentName} declined invite to ${event.room}: "${event.reason}"`,
63
+ };
64
+ case "name_changed":
65
+ return {
66
+ type: "system",
67
+ text: `${event.oldName} is now known as ${event.newName}`,
68
+ };
69
+ }
70
+ }
71
+ /**
72
+ * Convert a room message (from REST API history) to a display message.
73
+ */
74
+ export function roomMessageToDisplay(m) {
75
+ return {
76
+ type: "chat",
77
+ sender: m.from,
78
+ content: m.content,
79
+ timestamp: m.timestamp,
80
+ };
81
+ }
82
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Project tree — builds a nested directory tree from agent working directories.
3
+ *
4
+ * Pure function: agents + rooms → ProjectTree. No side effects.
5
+ * Project rooms (auto-created per cwd) are embedded in their directory nodes.
6
+ */
7
+ import type { Agent, ProjectTree, Room } from "./types.js";
8
+ export declare function buildProjectTree(agents: Agent[], rooms: Room[]): ProjectTree;
9
+ //# sourceMappingURL=project-tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-tree.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/project-tree.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAY,MAAM,YAAY,CAAC;AA0DrE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,WAAW,CA8C5E"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Project tree — builds a nested directory tree from agent working directories.
3
+ *
4
+ * Pure function: agents + rooms → ProjectTree. No side effects.
5
+ * Project rooms (auto-created per cwd) are embedded in their directory nodes.
6
+ */
7
+ function insertIntoTrie(node, segments, agent) {
8
+ const [seg, ...rest] = segments;
9
+ if (seg === undefined) {
10
+ node.agents.push(agent);
11
+ return;
12
+ }
13
+ let target = node.children.get(seg);
14
+ if (!target) {
15
+ target = { children: new Map(), agents: [] };
16
+ node.children.set(seg, target);
17
+ }
18
+ insertIntoTrie(target, rest, agent);
19
+ }
20
+ /** Ensure a branch path exists in the trie (creates intermediate nodes). */
21
+ function ensureBranch(node, segments) {
22
+ const [seg, ...rest] = segments;
23
+ if (seg === undefined)
24
+ return;
25
+ let child = node.children.get(seg);
26
+ if (!child) {
27
+ child = { children: new Map(), agents: [] };
28
+ node.children.set(seg, child);
29
+ }
30
+ ensureBranch(child, rest);
31
+ }
32
+ /**
33
+ * Build a nested project tree from agent cwd paths.
34
+ *
35
+ * - Trims the longest common prefix shared by ALL agent paths.
36
+ * - Agents in parent directories appear alongside child directories.
37
+ * - Empty branches are pruned.
38
+ * - Manual rooms (not auto-created per cwd) are separated out.
39
+ * - Children sorted: directories first (alphabetical), then agents (alphabetical).
40
+ */
41
+ const PROJECT_ROOM_PREFIX = "Project room for ";
42
+ /** Check if a room is an auto-created project room. */
43
+ function isProjectRoom(room) {
44
+ return room.description.startsWith(PROJECT_ROOM_PREFIX);
45
+ }
46
+ /** Extract the cwd path from a project room's description. */
47
+ function projectRoomCwd(room) {
48
+ return room.description.slice(PROJECT_ROOM_PREFIX.length);
49
+ }
50
+ export function buildProjectTree(agents, rooms) {
51
+ const manualRooms = rooms.filter((r) => !isProjectRoom(r));
52
+ // Index project rooms by their cwd path
53
+ const projectRoomsByPath = new Map();
54
+ for (const room of rooms) {
55
+ if (isProjectRoom(room)) {
56
+ projectRoomsByPath.set(projectRoomCwd(room), room);
57
+ }
58
+ }
59
+ // Use all project rooms as tree nodes even if no agents are in that directory
60
+ const allPaths = new Set();
61
+ for (const agent of agents) {
62
+ allPaths.add(agent.cwd);
63
+ }
64
+ for (const cwd of projectRoomsByPath.keys()) {
65
+ allPaths.add(cwd);
66
+ }
67
+ if (allPaths.size === 0) {
68
+ return { roots: [], manualRooms };
69
+ }
70
+ const paths = Array.from(allPaths);
71
+ const prefix = commonPathPrefix(paths);
72
+ const prefixSegments = prefix === "/" ? [] : splitPath(prefix);
73
+ // Group agents by their trimmed path
74
+ const root = { children: new Map(), agents: [] };
75
+ for (const agent of agents) {
76
+ const segments = splitPath(agent.cwd).slice(prefixSegments.length);
77
+ insertIntoTrie(root, segments, agent);
78
+ }
79
+ // Ensure directory branches exist for project room paths that have no agents
80
+ for (const cwd of projectRoomsByPath.keys()) {
81
+ const segments = splitPath(cwd).slice(prefixSegments.length);
82
+ ensureBranch(root, segments);
83
+ }
84
+ // Convert branch tree to TreeNode tree, embedding project rooms
85
+ const roots = branchToNodesWithRooms(root, prefix, "", projectRoomsByPath);
86
+ return { roots: sortChildren(roots), manualRooms };
87
+ }
88
+ // ---------------------------------------------------------------------------
89
+ // Internal helpers
90
+ // ---------------------------------------------------------------------------
91
+ function splitPath(p) {
92
+ // "/Users/joe/Developer" → ["Users", "joe", "Developer"]
93
+ return p.split("/").filter((s) => s.length > 0);
94
+ }
95
+ function joinPath(...segments) {
96
+ return "/" + segments.join("/");
97
+ }
98
+ /**
99
+ * Find the longest common parent directory among all paths.
100
+ * Returns "/" if there's no common prefix beyond root.
101
+ */
102
+ function commonPathPrefix(paths) {
103
+ if (paths.length === 0)
104
+ return "/";
105
+ const split = paths.map(splitPath);
106
+ const minLength = Math.min(...split.map((s) => s.length));
107
+ let commonLen = 0;
108
+ for (let i = 0; i < minLength; i++) {
109
+ const segment = split[0]?.[i];
110
+ if (segment === undefined)
111
+ break;
112
+ if (split.every((s) => s[i] === segment)) {
113
+ commonLen++;
114
+ }
115
+ else {
116
+ break;
117
+ }
118
+ }
119
+ // Use parent of the common prefix so the last shared segment
120
+ // appears as a directory in the tree
121
+ if (commonLen > 0)
122
+ commonLen--;
123
+ if (commonLen === 0)
124
+ return "/";
125
+ return joinPath(...(split[0]?.slice(0, commonLen) ?? []));
126
+ }
127
+ /**
128
+ * Convert the internal branch tree into TreeNode[], embedding project rooms.
129
+ */
130
+ function branchToNodesWithRooms(branch, prefix, currentPath, projectRoomsByPath) {
131
+ const nodes = [];
132
+ // Subdirectories
133
+ for (const [name, child] of branch.children) {
134
+ const childPath = currentPath === "" && prefix === "/"
135
+ ? "/" + name
136
+ : currentPath === ""
137
+ ? prefix + "/" + name
138
+ : currentPath + "/" + name;
139
+ const childNodes = branchToNodesWithRooms(child, prefix, childPath, projectRoomsByPath);
140
+ if (childNodes.length > 0) {
141
+ // Check if this directory has a project room
142
+ const room = projectRoomsByPath.get(childPath);
143
+ nodes.push({
144
+ type: "directory",
145
+ name,
146
+ path: childPath,
147
+ ...(room ? { roomId: room.id } : {}),
148
+ children: sortChildren(childNodes),
149
+ });
150
+ }
151
+ }
152
+ // Agents in this directory
153
+ for (const agent of branch.agents) {
154
+ nodes.push({
155
+ type: "agent",
156
+ name: agent.name,
157
+ agentId: agent.id,
158
+ status: agent.status,
159
+ cwd: agent.cwd,
160
+ });
161
+ }
162
+ return nodes;
163
+ }
164
+ function sortChildren(nodes) {
165
+ return [...nodes].sort((a, b) => {
166
+ // Directories first, then agents
167
+ if (a.type !== b.type) {
168
+ return a.type === "directory" ? -1 : 1;
169
+ }
170
+ return a.name.localeCompare(b.name);
171
+ });
172
+ }
173
+ //# sourceMappingURL=project-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-tree.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/project-tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * RelayClient — main-thread API for the relay SharedWorker.
3
+ *
4
+ * Creates a SharedWorker from the built relay-worker.js bundle and
5
+ * provides a typed interface for the React frontend to:
6
+ *
7
+ * - Connect to two mesh endpoints simultaneously
8
+ * - Disconnect from both
9
+ * - Query relay status (connection state, forwarding stats)
10
+ * - Subscribe to real-time status updates
11
+ */
12
+ export interface RelayStatus {
13
+ connectedA: boolean;
14
+ connectedB: boolean;
15
+ urlA: string | undefined;
16
+ urlB: string | undefined;
17
+ forwardedCount: number;
18
+ errors: string[];
19
+ }
20
+ export type RelayStatusListener = (status: RelayStatus) => void;
21
+ export declare class RelayClient {
22
+ private worker;
23
+ private status;
24
+ private readonly listeners;
25
+ /** Connect to the relay SharedWorker. Idempotent. */
26
+ connect(): void;
27
+ /** Connect the relay to two mesh WebSocket endpoints. */
28
+ connectRelay(urlA: string, urlB: string): void;
29
+ /** Disconnect the relay from both mesh endpoints. */
30
+ disconnect(): void;
31
+ /** Get the current relay status (snapshot). */
32
+ get(): Readonly<RelayStatus>;
33
+ /** Subscribe to status changes. Returns an unsubscribe function. */
34
+ subscribe(listener: RelayStatusListener): () => void;
35
+ /** Destroy the client and release the SharedWorker port. */
36
+ destroy(): void;
37
+ private postToWorker;
38
+ private notify;
39
+ }
40
+ //# sourceMappingURL=relay-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-client.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/relay-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;AAMhE,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,MAAM,CAOZ;IACF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;IAE5D,qDAAqD;IACrD,OAAO,IAAI,IAAI;IAqBf,yDAAyD;IACzD,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9C,qDAAqD;IACrD,UAAU,IAAI,IAAI;IAIlB,+CAA+C;IAC/C,GAAG,IAAI,QAAQ,CAAC,WAAW,CAAC;IAI5B,oEAAoE;IACpE,SAAS,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,IAAI;IAOpD,4DAA4D;IAC5D,OAAO,IAAI,IAAI;IAOf,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,MAAM;CAMf"}