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
@@ -1,75 +1,105 @@
1
+ import { jsx as _jsx } from "preact/jsx-runtime";
1
2
  /**
2
- * Entry point — bootstraps the web UI.
3
+ * Entry point — bootstraps the web UI with Preact.
3
4
  *
4
- * Imports all modules, binds DOM events, connects WebSocket,
5
- * and wires up the render loop.
5
+ * Owns the state store, WebSocket connection, and action handlers.
6
+ * Renders the App component on every state change.
6
7
  */
8
+ import { render } from "preact";
7
9
  import "./styles.css";
10
+ import { App } from "./components/App.js";
8
11
  import { CommsWs, fetchAgents, fetchRoomMessages, fetchRooms } from "./api.js";
9
12
  import { requireElement } from "./dom.js";
10
- import { parseInput } from "./input.js";
11
- import { clearMessages, renderDeliveryEvent, renderHeader, renderMessageHistory, renderRoomList, renderAgentList, renderSystemMessage, renderStatusMessage, } from "./render.js";
13
+ import { parseInput, routeAction } from "./input.js";
12
14
  import { State } from "./state.js";
15
+ import { MeshClient } from "./mesh-client.js";
16
+ import { RelayClient } from "./relay-client.js";
17
+ import { deliveryEventToMessage, roomMessageToDisplay } from "./messages.js";
18
+ import { parseDeepLink, resolveDeepLink, syncUrl } from "./url-sync.js";
13
19
  // ---------------------------------------------------------------------------
14
- // DOM elements
20
+ // Mount point
15
21
  // ---------------------------------------------------------------------------
16
- const messagesEl = requireElement(document, "#messages");
17
- const inputRaw = requireElement(document, "#input", "input");
18
- const headerEl = requireElement(document, "#header");
19
- const roomListEl = requireElement(document, "#room-list");
20
- const agentListEl = requireElement(document, "#agent-list");
21
- const messageTarget = { messagesEl };
22
- const sidebarTarget = { roomListEl, agentListEl };
22
+ const rootEl = requireElement(document, "#root");
23
23
  // ---------------------------------------------------------------------------
24
24
  // State
25
25
  // ---------------------------------------------------------------------------
26
26
  const state = new State();
27
- // Re-render sidebar on state changes
28
- state.subscribe((s) => {
29
- renderRoomList(document, sidebarTarget, s.rooms, s.currentRoom, onJoinRoom);
30
- renderAgentList(document, sidebarTarget, s.agents, onSelectAgent);
27
+ // ---------------------------------------------------------------------------
28
+ // Mesh client — real-time state via SharedWorker
29
+ // ---------------------------------------------------------------------------
30
+ const meshClient = new MeshClient();
31
+ meshClient.subscribe((meshState) => {
32
+ // Apply real-time mesh state updates on top of the REST-fetched baseline.
33
+ // The MeshClient delivers authoritative state from the mesh worker,
34
+ // which maintains a local copy of all agents and rooms.
35
+ if (meshState.agents.length > 0) {
36
+ state.setAgents(meshState.agents);
37
+ }
38
+ if (meshState.rooms.length > 0) {
39
+ state.setRooms(meshState.rooms);
40
+ }
41
+ state.setConnected(meshState.connected);
42
+ });
43
+ meshClient.connect();
44
+ // ---------------------------------------------------------------------------
45
+ // Relay client — P2P mesh relay
46
+ // ---------------------------------------------------------------------------
47
+ const relayClient = new RelayClient();
48
+ let relayStatus = relayClient.get();
49
+ relayClient.connect();
50
+ relayClient.subscribe((status) => {
51
+ relayStatus = status;
31
52
  });
32
53
  // ---------------------------------------------------------------------------
54
+ // Helpers
55
+ // ---------------------------------------------------------------------------
56
+ function addMessage(msg) {
57
+ state.addMessage(msg);
58
+ }
59
+ // ---------------------------------------------------------------------------
33
60
  // WebSocket
34
61
  // ---------------------------------------------------------------------------
62
+ let pendingAction;
35
63
  const ws = new CommsWs({
36
64
  onOpen: () => {
37
65
  state.setConnected(true);
38
- renderSystemMessage(document, messageTarget, "Connected to mesh");
66
+ addMessage({ type: "system", text: "Connected to mesh" });
39
67
  },
40
68
  onClose: () => {
41
69
  state.setConnected(false);
42
- renderSystemMessage(document, messageTarget, "Disconnected — reconnecting...");
70
+ addMessage({ type: "system", text: "Disconnected — reconnecting..." });
43
71
  },
44
72
  onFrame: handleFrame,
45
73
  });
46
74
  function handleFrame(frame) {
75
+ const s = state.get();
47
76
  switch (frame.type) {
48
- case "delivery":
49
- renderDeliveryEvent(document, messageTarget, frame.event, state.get().currentRoom);
50
- // Some events require a state refresh
77
+ case "delivery": {
78
+ const msg = deliveryEventToMessage(frame.event, s.currentRoom);
79
+ if (msg)
80
+ addMessage(msg);
51
81
  if (frame.event.type === "member_joined" ||
52
82
  frame.event.type === "member_left" ||
53
- frame.event.type === "member_status") {
83
+ frame.event.type === "member_status" ||
84
+ frame.event.type === "name_changed") {
54
85
  void refreshState();
55
86
  }
56
87
  break;
88
+ }
57
89
  case "result":
58
- renderSystemMessage(document, messageTarget, frame.result.content);
90
+ addMessage({ type: "system", text: frame.result.content });
59
91
  if (!frame.result.isError) {
60
- // Auto-switch current room after successful join_room via command
61
92
  if (pendingAction?.action === "join_room" && !state.get().currentRoom) {
62
93
  const roomId = pendingAction.room;
63
94
  state.setDmTarget(undefined);
64
95
  state.setCurrentRoom(roomId);
65
- renderHeader({ headerEl }, roomId);
66
96
  }
67
97
  void refreshState();
68
98
  }
69
99
  pendingAction = undefined;
70
100
  break;
71
101
  case "error":
72
- renderStatusMessage(document, messageTarget, `Error: ${frame.message}`);
102
+ addMessage({ type: "status", text: `Error: ${frame.message}` });
73
103
  break;
74
104
  case "state":
75
105
  state.applyState(frame.agents, frame.rooms);
@@ -79,7 +109,6 @@ function handleFrame(frame) {
79
109
  // ---------------------------------------------------------------------------
80
110
  // Actions
81
111
  // ---------------------------------------------------------------------------
82
- let pendingAction;
83
112
  function sendAction(action) {
84
113
  pendingAction = action;
85
114
  ws.sendAction(action);
@@ -92,50 +121,104 @@ async function refreshState() {
92
121
  async function onJoinRoom(roomId) {
93
122
  state.setDmTarget(undefined);
94
123
  state.setCurrentRoom(roomId);
95
- renderHeader({ headerEl }, roomId);
96
- clearMessages(messageTarget);
124
+ state.clearMessages();
97
125
  sendAction({ action: "join_room", room: roomId });
98
126
  // Load history
99
127
  const messages = await fetchRoomMessages(roomId);
100
- renderMessageHistory(document, messageTarget, messages);
101
- renderSystemMessage(document, messageTarget, `Joined ${roomId}`);
102
- inputRaw.focus();
128
+ state.setMessages(messages.map(roomMessageToDisplay));
129
+ addMessage({ type: "system", text: `Joined ${roomId}` });
103
130
  }
104
131
  function onSelectAgent(agentId) {
105
132
  state.setCurrentRoom(undefined);
106
133
  state.setDmTarget(agentId);
107
- clearMessages(messageTarget);
108
- renderHeader({ headerEl }, `DM with ${agentId}`);
109
- inputRaw.focus();
134
+ state.clearMessages();
110
135
  }
111
- // ---------------------------------------------------------------------------
112
- // Input handling
113
- // ---------------------------------------------------------------------------
114
- function handleInput() {
115
- const text = inputRaw.value;
116
- inputRaw.value = "";
117
- const result = parseInput(text, state.get().currentRoom, state.get().dmTarget);
136
+ function onLeaveRoom() {
137
+ const currentRoom = state.get().currentRoom;
138
+ if (currentRoom) {
139
+ sendAction({ action: "leave_room", room: currentRoom });
140
+ state.setCurrentRoom(undefined);
141
+ state.clearMessages();
142
+ addMessage({ type: "system", text: `Left room "${currentRoom}"` });
143
+ }
144
+ }
145
+ function handleSendAction(text) {
146
+ const s = state.get();
147
+ const result = parseInput(text, s.currentRoom, s.dmTarget);
148
+ // Check if this action needs local client-side handling
149
+ const localRoute = routeAction(result);
150
+ if (localRoute) {
151
+ switch (localRoute.kind) {
152
+ case "join_room":
153
+ void onJoinRoom(localRoute.room);
154
+ return;
155
+ case "leave_room":
156
+ onLeaveRoom();
157
+ return;
158
+ }
159
+ }
118
160
  switch (result.kind) {
119
161
  case "action":
120
162
  sendAction(result.action);
121
163
  break;
122
164
  case "local":
123
- renderSystemMessage(document, messageTarget, result.result.text);
165
+ addMessage({ type: "system", text: result.result.text });
124
166
  break;
125
167
  case "ignored":
126
168
  break;
127
169
  }
128
170
  }
129
- const sendBtn = requireElement(document, "#send-btn");
130
- sendBtn.onclick = handleInput;
131
- inputRaw.addEventListener("keydown", (e) => {
132
- if (e.key === "Enter")
133
- handleInput();
134
- });
171
+ function onCreateRoom(name, type, description) {
172
+ const action = {
173
+ action: "create_room",
174
+ name,
175
+ type,
176
+ ...(description ? { description } : {}),
177
+ };
178
+ sendAction(action);
179
+ }
180
+ function onJoinRoomInput(roomName) {
181
+ void onJoinRoom(roomName);
182
+ }
183
+ function onRenameAgent(agentId, newName) {
184
+ sendAction({ action: "rename_agent", agent: agentId, name: newName });
185
+ }
186
+ // ---------------------------------------------------------------------------
187
+ // Render loop
188
+ // ---------------------------------------------------------------------------
189
+ function rerender() {
190
+ const s = state.get();
191
+ // Keep the URL in sync with the current view
192
+ syncUrl({ currentRoom: s.currentRoom, dmTarget: s.dmTarget });
193
+ render(_jsx(App, { rooms: s.rooms, agents: s.agents, currentRoom: s.currentRoom, dmTarget: s.dmTarget, messages: s.messages, connected: s.connected, relayStatus: relayStatus, onJoinRoom: (roomId) => {
194
+ void onJoinRoom(roomId);
195
+ }, onSelectAgent: onSelectAgent, onRenameAgent: onRenameAgent, onLeaveRoom: onLeaveRoom, onSendAction: handleSendAction, onCreateRoom: onCreateRoom, onJoinRoomInput: onJoinRoomInput, onRelayConnect: (urlA, urlB) => {
196
+ relayClient.connectRelay(urlA, urlB);
197
+ }, onRelayDisconnect: () => {
198
+ relayClient.disconnect();
199
+ } }), rootEl);
200
+ }
201
+ state.subscribe(rerender);
135
202
  // ---------------------------------------------------------------------------
136
203
  // Boot
137
204
  // ---------------------------------------------------------------------------
205
+ const deepLink = parseDeepLink(location.search);
138
206
  ws.connect();
139
- void refreshState();
140
- inputRaw.focus();
207
+ // Initial state fetch, then resolve any deep link from the URL
208
+ void refreshState().then(() => {
209
+ if (!deepLink)
210
+ return;
211
+ const s = state.get();
212
+ const resolved = resolveDeepLink(deepLink, s.rooms);
213
+ if (!resolved)
214
+ return;
215
+ switch (resolved.kind) {
216
+ case "room":
217
+ void onJoinRoom(resolved.targetId);
218
+ break;
219
+ case "dm":
220
+ onSelectAgent(resolved.targetId);
221
+ break;
222
+ }
223
+ });
141
224
  //# sourceMappingURL=main.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/main.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/main.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * MeshClient — main-thread API for the mesh SharedWorker.
3
+ *
4
+ * Creates a SharedWorker from the built mesh-worker.js bundle and
5
+ * provides a typed interface for the React frontend to:
6
+ *
7
+ * - Query current mesh state (agents, rooms)
8
+ * - Execute actions (send, join, create room, etc.)
9
+ * - Subscribe to real-time state changes (patches)
10
+ *
11
+ * The SharedWorker maintains a single WebSocket connection to the
12
+ * server's /ws/mesh endpoint shared across all tabs.
13
+ */
14
+ import type { Agent, Room } from "./types.js";
15
+ type AgentIdentity = Agent;
16
+ type RoomLike = Room;
17
+ export type MeshStateListener = (state: MeshClientState) => void;
18
+ export interface MeshClientState {
19
+ agents: AgentIdentity[];
20
+ rooms: RoomLike[];
21
+ connected: boolean;
22
+ }
23
+ export declare class MeshClient {
24
+ private worker;
25
+ private state;
26
+ private readonly listeners;
27
+ private actionCounter;
28
+ private readonly pendingActions;
29
+ /** Connect to the mesh SharedWorker. Idempotent. */
30
+ connect(): void;
31
+ /** Get the current mesh state (snapshot). */
32
+ get(): Readonly<MeshClientState>;
33
+ /** Subscribe to state changes. Returns an unsubscribe function. */
34
+ subscribe(listener: MeshStateListener): () => void;
35
+ /** Send an action through the mesh worker. */
36
+ sendAction(action: Record<string, unknown>): void;
37
+ /** Disconnect and clean up. */
38
+ disconnect(): void;
39
+ private postToWorker;
40
+ private notify;
41
+ }
42
+ export {};
43
+ //# sourceMappingURL=mesh-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-client.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/mesh-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAM9C,KAAK,aAAa,GAAG,KAAK,CAAC;AAC3B,KAAK,QAAQ,GAAG,IAAI,CAAC;AAErB,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;AAEjE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB;AAMD,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,KAAK,CAIX;IACF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgC;IAC1D,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAM3B;IAEJ,oDAAoD;IACpD,OAAO,IAAI,IAAI;IA0Ef,6CAA6C;IAC7C,GAAG,IAAI,QAAQ,CAAC,eAAe,CAAC;IAIhC,mEAAmE;IACnE,SAAS,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,IAAI;IAOlD,8CAA8C;IAC9C,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAKjD,+BAA+B;IAC/B,UAAU,IAAI,IAAI;IAQlB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,MAAM;CAMf"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * MeshClient — main-thread API for the mesh SharedWorker.
3
+ *
4
+ * Creates a SharedWorker from the built mesh-worker.js bundle and
5
+ * provides a typed interface for the React frontend to:
6
+ *
7
+ * - Query current mesh state (agents, rooms)
8
+ * - Execute actions (send, join, create room, etc.)
9
+ * - Subscribe to real-time state changes (patches)
10
+ *
11
+ * The SharedWorker maintains a single WebSocket connection to the
12
+ * server's /ws/mesh endpoint shared across all tabs.
13
+ */
14
+ // ---------------------------------------------------------------------------
15
+ // MeshClient
16
+ // ---------------------------------------------------------------------------
17
+ export class MeshClient {
18
+ worker;
19
+ state = {
20
+ agents: [],
21
+ rooms: [],
22
+ connected: false,
23
+ };
24
+ listeners = new Set();
25
+ actionCounter = 0;
26
+ pendingActions = new Map();
27
+ /** Connect to the mesh SharedWorker. Idempotent. */
28
+ connect() {
29
+ if (this.worker)
30
+ return;
31
+ const worker = new SharedWorker("/mesh-worker.js");
32
+ this.worker = worker;
33
+ worker.port.onmessage = (event) => {
34
+ const raw = JSON.parse(typeof event.data === "string" ? event.data : String(event.data));
35
+ if (!isOutboundMessage(raw))
36
+ return;
37
+ switch (raw.type) {
38
+ case "state": {
39
+ if (!("state" in raw) ||
40
+ typeof raw.state !== "object" ||
41
+ raw.state === null)
42
+ break;
43
+ if (!("agents" in raw.state) || !("rooms" in raw.state))
44
+ break;
45
+ const state = raw.state;
46
+ // State from mesh SharedWorker is SerialisedState where agents/rooms
47
+ // are Record<string, T>. Object.values on object returns any[], which
48
+ // is the actual runtime shape.
49
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
50
+ const agents = typeof state.agents === "object" && state.agents !== null
51
+ ? Object.values(state.agents)
52
+ : [];
53
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
54
+ const rooms = typeof state.rooms === "object" && state.rooms !== null
55
+ ? Object.values(state.rooms)
56
+ : [];
57
+ this.state = {
58
+ ...this.state,
59
+ agents,
60
+ rooms,
61
+ };
62
+ this.notify();
63
+ break;
64
+ }
65
+ case "connected":
66
+ this.state = { ...this.state, connected: true };
67
+ this.notify();
68
+ break;
69
+ case "disconnected":
70
+ this.state = { ...this.state, connected: false };
71
+ this.notify();
72
+ break;
73
+ case "patch":
74
+ // After any patch, refresh from the worker's authoritative state
75
+ this.postToWorker({ type: "getState" });
76
+ break;
77
+ case "actionResult": {
78
+ // For now, action results are broadcast — we don't correlate by ID
79
+ // because the server doesn't echo back an action ID. The main.tsx
80
+ // handles action results through the existing CommsWs.
81
+ break;
82
+ }
83
+ case "actionError":
84
+ break;
85
+ }
86
+ };
87
+ worker.port.start();
88
+ // Tell the worker to connect to the mesh WS endpoint
89
+ const proto = location.protocol === "https:" ? "wss:" : "ws:";
90
+ const url = `${proto}//${location.host}/ws/mesh`;
91
+ this.postToWorker({ type: "init", url });
92
+ }
93
+ /** Get the current mesh state (snapshot). */
94
+ get() {
95
+ return this.state;
96
+ }
97
+ /** Subscribe to state changes. Returns an unsubscribe function. */
98
+ subscribe(listener) {
99
+ this.listeners.add(listener);
100
+ return () => {
101
+ this.listeners.delete(listener);
102
+ };
103
+ }
104
+ /** Send an action through the mesh worker. */
105
+ sendAction(action) {
106
+ const id = String(++this.actionCounter);
107
+ this.postToWorker({ type: "action", id, action });
108
+ }
109
+ /** Disconnect and clean up. */
110
+ disconnect() {
111
+ if (this.worker) {
112
+ this.worker.port.close();
113
+ this.worker = undefined;
114
+ }
115
+ this.pendingActions.clear();
116
+ }
117
+ postToWorker(msg) {
118
+ if (this.worker) {
119
+ this.worker.port.postMessage(JSON.stringify(msg));
120
+ }
121
+ }
122
+ notify() {
123
+ const snapshot = this.state;
124
+ for (const listener of this.listeners) {
125
+ listener(snapshot);
126
+ }
127
+ }
128
+ }
129
+ function isOutboundMessage(value) {
130
+ return typeof value === "object" && value !== null && "type" in value;
131
+ }
132
+ //# sourceMappingURL=mesh-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-client.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/mesh-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
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
+ export {};
14
+ //# sourceMappingURL=mesh-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-worker.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/mesh-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}