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,97 @@
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
+ // ---------------------------------------------------------------------------
13
+ // RelayClient
14
+ // ---------------------------------------------------------------------------
15
+ export class RelayClient {
16
+ worker;
17
+ status = {
18
+ connectedA: false,
19
+ connectedB: false,
20
+ urlA: undefined,
21
+ urlB: undefined,
22
+ forwardedCount: 0,
23
+ errors: [],
24
+ };
25
+ listeners = new Set();
26
+ /** Connect to the relay SharedWorker. Idempotent. */
27
+ connect() {
28
+ if (this.worker)
29
+ return;
30
+ const worker = new SharedWorker("/relay-worker.js");
31
+ this.worker = worker;
32
+ worker.port.onmessage = (event) => {
33
+ const raw = JSON.parse(typeof event.data === "string" ? event.data : String(event.data));
34
+ if (isStatusMessage(raw)) {
35
+ this.status = raw.status;
36
+ this.notify();
37
+ }
38
+ else if (isErrorMessage(raw)) {
39
+ console.error("[RelayClient]", raw.message);
40
+ }
41
+ };
42
+ worker.port.start();
43
+ }
44
+ /** Connect the relay to two mesh WebSocket endpoints. */
45
+ connectRelay(urlA, urlB) {
46
+ this.postToWorker({ type: "connect", urlA, urlB });
47
+ }
48
+ /** Disconnect the relay from both mesh endpoints. */
49
+ disconnect() {
50
+ this.postToWorker({ type: "disconnect" });
51
+ }
52
+ /** Get the current relay status (snapshot). */
53
+ get() {
54
+ return this.status;
55
+ }
56
+ /** Subscribe to status changes. Returns an unsubscribe function. */
57
+ subscribe(listener) {
58
+ this.listeners.add(listener);
59
+ return () => {
60
+ this.listeners.delete(listener);
61
+ };
62
+ }
63
+ /** Destroy the client and release the SharedWorker port. */
64
+ destroy() {
65
+ if (this.worker) {
66
+ this.worker.port.close();
67
+ this.worker = undefined;
68
+ }
69
+ }
70
+ postToWorker(msg) {
71
+ if (this.worker) {
72
+ this.worker.port.postMessage(JSON.stringify(msg));
73
+ }
74
+ }
75
+ notify() {
76
+ const snapshot = this.status;
77
+ for (const listener of this.listeners) {
78
+ listener(snapshot);
79
+ }
80
+ }
81
+ }
82
+ function isStatusMessage(value) {
83
+ return (typeof value === "object" &&
84
+ value !== null &&
85
+ "type" in value &&
86
+ typeof value.type === "string" &&
87
+ value.type === "status" &&
88
+ "status" in value);
89
+ }
90
+ function isErrorMessage(value) {
91
+ return (typeof value === "object" &&
92
+ value !== null &&
93
+ "type" in value &&
94
+ typeof value.type === "string" &&
95
+ value.type === "error");
96
+ }
97
+ //# sourceMappingURL=relay-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-client.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/relay-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * RelayWorker — SharedWorker that connects two mesh WebSocket endpoints
3
+ * and forwards wire messages between them with filtering and peer ID
4
+ * translation.
5
+ *
6
+ * Two isolated meshes can communicate through the browser without direct
7
+ * network connectivity between them. Peer IDs are prefixed with a mesh
8
+ * label ("a:" or "b:") to avoid collisions between the two meshes.
9
+ *
10
+ * Built as a separate IIFE bundle (relay-worker.js) so the SharedWorker
11
+ * runs in its own global scope independent of the main app and mesh-worker
12
+ * bundles.
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=relay-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-worker.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/relay-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
@@ -0,0 +1,366 @@
1
+ /**
2
+ * RelayWorker — SharedWorker that connects two mesh WebSocket endpoints
3
+ * and forwards wire messages between them with filtering and peer ID
4
+ * translation.
5
+ *
6
+ * Two isolated meshes can communicate through the browser without direct
7
+ * network connectivity between them. Peer IDs are prefixed with a mesh
8
+ * label ("a:" or "b:") to avoid collisions between the two meshes.
9
+ *
10
+ * Built as a separate IIFE bundle (relay-worker.js) so the SharedWorker
11
+ * runs in its own global scope independent of the main app and mesh-worker
12
+ * bundles.
13
+ */
14
+ // ---------------------------------------------------------------------------
15
+ // Relay state
16
+ // ---------------------------------------------------------------------------
17
+ /** Methods that should be forwarded between meshes. */
18
+ const FORWARDABLE_METHODS = new Set([
19
+ "state_update",
20
+ "peer_joined",
21
+ "peer_left",
22
+ ]);
23
+ /** Methods that must never be forwarded (cause loops or are side-specific). */
24
+ const BLOCKED_METHODS = new Set([
25
+ "state_sync",
26
+ "introduce",
27
+ "connect_request",
28
+ "connect_accepted",
29
+ "connect_rejected",
30
+ "peer_list",
31
+ "become_coordinator",
32
+ "pong",
33
+ "fed_handshake",
34
+ "fed_ack",
35
+ "fed_agent_visible",
36
+ "fed_agent_gone",
37
+ "fed_room_message",
38
+ "fed_room_join",
39
+ "fed_room_leave",
40
+ "fed_ping",
41
+ "fed_pong",
42
+ ]);
43
+ const meshA = {
44
+ label: "a",
45
+ url: "",
46
+ ws: undefined,
47
+ connected: false,
48
+ reconnectTimer: undefined,
49
+ };
50
+ const meshB = {
51
+ label: "b",
52
+ url: "",
53
+ ws: undefined,
54
+ connected: false,
55
+ reconnectTimer: undefined,
56
+ };
57
+ let forwardedCount = 0;
58
+ const errors = [];
59
+ const MAX_ERRORS = 50;
60
+ const ports = new Set();
61
+ // ---------------------------------------------------------------------------
62
+ // Peer ID translation
63
+ // ---------------------------------------------------------------------------
64
+ function prefixId(label, id) {
65
+ return `${label}:${id}`;
66
+ }
67
+ function translateAgent(label, agent) {
68
+ return {
69
+ ...agent,
70
+ id: prefixId(label, agent.id),
71
+ name: `${agent.name} (via ${label.toUpperCase()})`,
72
+ subscribedRooms: agent.subscribedRooms.map((r) => prefixId(label, r)),
73
+ };
74
+ }
75
+ function translateRoom(label, room) {
76
+ return {
77
+ ...room,
78
+ id: prefixId(label, room.id),
79
+ owner: prefixId(label, room.owner),
80
+ members: room.members.map((m) => prefixId(label, m)),
81
+ invited: room.invited.map((m) => prefixId(label, m)),
82
+ };
83
+ }
84
+ function translateMessage(label, msg) {
85
+ const result = {
86
+ ...msg,
87
+ from: prefixId(label, msg.from),
88
+ room: prefixId(label, msg.room),
89
+ readBy: msg.readBy.map((r) => prefixId(label, r)),
90
+ };
91
+ if (msg.replyTo !== undefined)
92
+ result.replyTo = prefixId(label, msg.replyTo);
93
+ return result;
94
+ }
95
+ function translateDm(label, msg) {
96
+ return {
97
+ ...msg,
98
+ from: prefixId(label, msg.from),
99
+ to: prefixId(label, msg.to),
100
+ readBy: msg.readBy.map((r) => prefixId(label, r)),
101
+ };
102
+ }
103
+ function translateDmKey(label, key) {
104
+ // DM keys are "idA--idB" (sorted). Prefix both IDs.
105
+ const parts = key.split("--");
106
+ return parts.map((p) => prefixId(label, p)).join("--");
107
+ }
108
+ /**
109
+ * Translate a state_update patch, prefixing all peer/room IDs with the
110
+ * mesh label so they don't collide with IDs from the other mesh.
111
+ */
112
+ function translatePatch(label, patch) {
113
+ switch (patch.type) {
114
+ case "agent_upsert":
115
+ return { ...patch, agent: translateAgent(label, patch.agent) };
116
+ case "agent_offline":
117
+ return { ...patch, agentId: prefixId(label, patch.agentId) };
118
+ case "room_upsert":
119
+ return { ...patch, room: translateRoom(label, patch.room) };
120
+ case "room_delete":
121
+ return { ...patch, roomId: prefixId(label, patch.roomId) };
122
+ case "message_add":
123
+ return {
124
+ ...patch,
125
+ roomId: prefixId(label, patch.roomId),
126
+ message: translateMessage(label, patch.message),
127
+ };
128
+ case "dm_add":
129
+ return {
130
+ ...patch,
131
+ key: translateDmKey(label, patch.key),
132
+ message: translateDm(label, patch.message),
133
+ };
134
+ case "delivery":
135
+ return { ...patch, agentId: prefixId(label, patch.agentId) };
136
+ case "message_read":
137
+ return {
138
+ ...patch,
139
+ readBy: prefixId(label, patch.readBy),
140
+ ...(patch.room ? { room: prefixId(label, patch.room) } : {}),
141
+ };
142
+ }
143
+ }
144
+ // ---------------------------------------------------------------------------
145
+ // Wire message parsing
146
+ // ---------------------------------------------------------------------------
147
+ function parseWireMessage(raw) {
148
+ if (typeof raw !== "object" || raw === null)
149
+ return undefined;
150
+ if (!("method" in raw))
151
+ return undefined;
152
+ if (typeof raw.method !== "string")
153
+ return undefined;
154
+ // Spread into a new object to satisfy WireMessage — raw is narrowed to
155
+ // object & { method: string } but not to the WireMessage union
156
+ const msg = { ...raw, method: raw.method };
157
+ return msg;
158
+ }
159
+ // ---------------------------------------------------------------------------
160
+ // Message forwarding
161
+ // ---------------------------------------------------------------------------
162
+ function shouldForward(msg) {
163
+ if (BLOCKED_METHODS.has(msg.method))
164
+ return false;
165
+ if (FORWARDABLE_METHODS.has(msg.method))
166
+ return true;
167
+ // Unknown methods are blocked by default
168
+ return false;
169
+ }
170
+ function translateWireMessage(label, msg) {
171
+ if (msg.method === "state_update" &&
172
+ "patch" in msg &&
173
+ typeof msg.patch === "object" &&
174
+ msg.patch !== null &&
175
+ "type" in msg.patch &&
176
+ typeof msg.patch.type === "string") {
177
+ // Patch validated as object with string `type` — cast to MeshStatePatch discriminated union
178
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
179
+ const patch = msg.patch;
180
+ return { ...msg, patch: translatePatch(label, patch) };
181
+ }
182
+ if (msg.method === "peer_joined" &&
183
+ "peer" in msg &&
184
+ typeof msg.peer === "object" &&
185
+ msg.peer !== null &&
186
+ "id" in msg.peer &&
187
+ typeof msg.peer.id === "string" &&
188
+ "port" in msg.peer &&
189
+ typeof msg.peer.port === "number" &&
190
+ "startedAt" in msg.peer &&
191
+ typeof msg.peer.startedAt === "string") {
192
+ return {
193
+ ...msg,
194
+ peer: { ...msg.peer, id: prefixId(label, msg.peer.id) },
195
+ };
196
+ }
197
+ if (msg.method === "peer_left" &&
198
+ "peerId" in msg &&
199
+ typeof msg.peerId === "string") {
200
+ return { ...msg, peerId: prefixId(label, msg.peerId) };
201
+ }
202
+ return msg;
203
+ }
204
+ function forwardToTarget(source, target, raw) {
205
+ const msg = parseWireMessage(raw);
206
+ if (msg === undefined)
207
+ return;
208
+ if (!shouldForward(msg))
209
+ return;
210
+ const translated = translateWireMessage(source.label, msg);
211
+ const targetWs = target.ws;
212
+ if (targetWs?.readyState === WebSocket.OPEN) {
213
+ targetWs.send(JSON.stringify(translated));
214
+ forwardedCount++;
215
+ broadcastStatus();
216
+ }
217
+ }
218
+ // ---------------------------------------------------------------------------
219
+ // WebSocket connection management
220
+ // ---------------------------------------------------------------------------
221
+ function connectMesh(conn, other) {
222
+ if (conn.reconnectTimer !== undefined) {
223
+ clearTimeout(conn.reconnectTimer);
224
+ conn.reconnectTimer = undefined;
225
+ }
226
+ const socket = new WebSocket(conn.url);
227
+ conn.ws = socket;
228
+ socket.onopen = () => {
229
+ conn.connected = true;
230
+ broadcastStatus();
231
+ };
232
+ socket.onclose = () => {
233
+ conn.ws = undefined;
234
+ conn.connected = false;
235
+ broadcastStatus();
236
+ scheduleReconnect(conn, other);
237
+ };
238
+ socket.onerror = () => {
239
+ // onclose fires after this
240
+ };
241
+ socket.onmessage = (event) => {
242
+ const raw = JSON.parse(typeof event.data === "string" ? event.data : String(event.data));
243
+ forwardToTarget(conn, other, raw);
244
+ };
245
+ }
246
+ function scheduleReconnect(conn, other) {
247
+ if (!conn.url)
248
+ return;
249
+ conn.reconnectTimer = setTimeout(() => {
250
+ if (conn.url)
251
+ connectMesh(conn, other);
252
+ }, 3000);
253
+ }
254
+ function disconnectMesh(conn) {
255
+ if (conn.reconnectTimer !== undefined) {
256
+ clearTimeout(conn.reconnectTimer);
257
+ conn.reconnectTimer = undefined;
258
+ }
259
+ conn.ws?.close();
260
+ conn.ws = undefined;
261
+ conn.connected = false;
262
+ conn.url = "";
263
+ }
264
+ // ---------------------------------------------------------------------------
265
+ // Port management — fan-out to all connected main-thread tabs
266
+ // ---------------------------------------------------------------------------
267
+ function broadcastToPorts(msg) {
268
+ const data = JSON.stringify(msg);
269
+ for (const port of ports) {
270
+ try {
271
+ port.postMessage(data);
272
+ }
273
+ catch {
274
+ // Port closed
275
+ }
276
+ }
277
+ }
278
+ function broadcastStatus() {
279
+ broadcastToPorts({
280
+ type: "status",
281
+ status: getStatus(),
282
+ });
283
+ }
284
+ function getStatus() {
285
+ return {
286
+ connectedA: meshA.connected,
287
+ connectedB: meshB.connected,
288
+ urlA: meshA.url || undefined,
289
+ urlB: meshB.url || undefined,
290
+ forwardedCount,
291
+ errors: [...errors],
292
+ };
293
+ }
294
+ function addError(message) {
295
+ errors.push(message);
296
+ if (errors.length > MAX_ERRORS) {
297
+ errors.shift();
298
+ }
299
+ }
300
+ function handlePortMessage(msg) {
301
+ switch (msg.type) {
302
+ case "connect": {
303
+ // Disconnect existing connections
304
+ disconnectMesh(meshA);
305
+ disconnectMesh(meshB);
306
+ forwardedCount = 0;
307
+ errors.length = 0;
308
+ meshA.url = msg.urlA;
309
+ meshB.url = msg.urlB;
310
+ try {
311
+ connectMesh(meshA, meshB);
312
+ connectMesh(meshB, meshA);
313
+ }
314
+ catch (err) {
315
+ addError(err instanceof Error ? err.message : String(err));
316
+ }
317
+ broadcastStatus();
318
+ break;
319
+ }
320
+ case "disconnect": {
321
+ disconnectMesh(meshA);
322
+ disconnectMesh(meshB);
323
+ broadcastStatus();
324
+ break;
325
+ }
326
+ case "status":
327
+ broadcastStatus();
328
+ break;
329
+ }
330
+ }
331
+ function isRelayInbound(value) {
332
+ if (typeof value !== "object" || value === null)
333
+ return false;
334
+ if (!("type" in value))
335
+ return false;
336
+ const t = value.type;
337
+ return (typeof t === "string" &&
338
+ (t === "connect" || t === "disconnect" || t === "status"));
339
+ }
340
+ // ---------------------------------------------------------------------------
341
+ // Entry point — listen for SharedWorker connections
342
+ // ---------------------------------------------------------------------------
343
+ self.addEventListener("connect", (event) => {
344
+ const rawPort = event.ports[0];
345
+ if (rawPort === undefined)
346
+ return;
347
+ ports.add(rawPort);
348
+ // Send current status to the new port
349
+ try {
350
+ rawPort.postMessage(JSON.stringify({
351
+ type: "status",
352
+ status: getStatus(),
353
+ }));
354
+ }
355
+ catch {
356
+ // Port not ready yet
357
+ }
358
+ rawPort.onmessage = (e) => {
359
+ const parsed = JSON.parse(typeof e.data === "string" ? e.data : String(e.data));
360
+ if (isRelayInbound(parsed)) {
361
+ handlePortMessage(parsed);
362
+ }
363
+ };
364
+ });
365
+ export {};
366
+ //# sourceMappingURL=relay-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-worker.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/relay-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAkHH,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,uDAAuD;AACvD,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,cAAc;IACd,aAAa;IACb,WAAW;CACZ,CAAC,CAAC;AAEH,+EAA+E;AAC/E,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,YAAY;IACZ,WAAW;IACX,iBAAiB;IACjB,kBAAkB;IAClB,kBAAkB;IAClB,WAAW;IACX,oBAAoB;IACpB,MAAM;IACN,eAAe;IACf,SAAS;IACT,mBAAmB;IACnB,gBAAgB;IAChB,kBAAkB;IAClB,eAAe;IACf,gBAAgB;IAChB,UAAU;IACV,UAAU;CACX,CAAC,CAAC;AAUH,MAAM,KAAK,GAAmB;IAC5B,KAAK,EAAE,GAAG;IACV,GAAG,EAAE,EAAE;IACP,EAAE,EAAE,SAAS;IACb,SAAS,EAAE,KAAK;IAChB,cAAc,EAAE,SAAS;CAC1B,CAAC;AAEF,MAAM,KAAK,GAAmB;IAC5B,KAAK,EAAE,GAAG;IACV,GAAG,EAAE,EAAE;IACP,EAAE,EAAE,SAAS;IACb,SAAS,EAAE,KAAK;IAChB,cAAc,EAAE,SAAS;CAC1B,CAAC;AAEF,IAAI,cAAc,GAAG,CAAC,CAAC;AACvB,MAAM,MAAM,GAAa,EAAE,CAAC;AAC5B,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;AAEzC,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,SAAS,QAAQ,CAAC,KAAgB,EAAE,EAAU;IAC5C,OAAO,GAAG,KAAK,IAAI,EAAE,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,cAAc,CAAC,KAAgB,EAAE,KAAoB;IAC5D,OAAO;QACL,GAAG,KAAK;QACR,EAAE,EAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;QAC7B,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,WAAW,EAAE,GAAG;QAClD,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;KACtE,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAgB,EAAE,IAAU;IACjD,OAAO;QACL,GAAG,IAAI;QACP,EAAE,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;QAC5B,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;QAClC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACpD,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;KACrD,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAgB,EAAE,GAAgB;IAC1D,MAAM,MAAM,GAAgB;QAC1B,GAAG,GAAG;QACN,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC;QAC/B,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC;QAC/B,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;KAClD,CAAC;IACF,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS;QAAE,MAAM,CAAC,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7E,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,KAAgB,EAAE,GAAc;IACnD,OAAO;QACL,GAAG,GAAG;QACN,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC;QAC/B,EAAE,EAAE,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;KAClD,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAgB,EAAE,GAAW;IACnD,oDAAoD;IACpD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CACrB,KAAgB,EAChB,KAAqB;IAErB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,cAAc;YACjB,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACjE,KAAK,eAAe;YAClB,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/D,KAAK,aAAa;YAChB,OAAO,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9D,KAAK,aAAa;YAChB,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7D,KAAK,aAAa;YAChB,OAAO;gBACL,GAAG,KAAK;gBACR,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;gBACrC,OAAO,EAAE,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;aAChD,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO;gBACL,GAAG,KAAK;gBACR,GAAG,EAAE,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC;gBACrC,OAAO,EAAE,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;aAC3C,CAAC;QACJ,KAAK,UAAU;YACb,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/D,KAAK,cAAc;YACjB,OAAO;gBACL,GAAG,KAAK;gBACR,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;gBACrC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC7D,CAAC;IACN,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,SAAS,gBAAgB,CAAC,GAAY;IACpC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC9D,IAAI,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACzC,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACrD,uEAAuE;IACvE,+DAA+D;IAC/D,MAAM,GAAG,GAAgB,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;IACxD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,SAAS,aAAa,CAAC,GAAgB;IACrC,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACrD,yCAAyC;IACzC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAgB,EAAE,GAAgB;IAC9D,IACE,GAAG,CAAC,MAAM,KAAK,cAAc;QAC7B,OAAO,IAAI,GAAG;QACd,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;QAC7B,GAAG,CAAC,KAAK,KAAK,IAAI;QAClB,MAAM,IAAI,GAAG,CAAC,KAAK;QACnB,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,EAClC,CAAC;QACD,4FAA4F;QAC5F,yEAAyE;QACzE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAuB,CAAC;QAC1C,OAAO,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;IACzD,CAAC;IACD,IACE,GAAG,CAAC,MAAM,KAAK,aAAa;QAC5B,MAAM,IAAI,GAAG;QACb,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;QAC5B,GAAG,CAAC,IAAI,KAAK,IAAI;QACjB,IAAI,IAAI,GAAG,CAAC,IAAI;QAChB,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,QAAQ;QAC/B,MAAM,IAAI,GAAG,CAAC,IAAI;QAClB,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ;QACjC,WAAW,IAAI,GAAG,CAAC,IAAI;QACvB,OAAO,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,QAAQ,EACtC,CAAC;QACD,OAAO;YACL,GAAG,GAAG;YACN,IAAI,EAAE,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;SACxD,CAAC;IACJ,CAAC;IACD,IACE,GAAG,CAAC,MAAM,KAAK,WAAW;QAC1B,QAAQ,IAAI,GAAG;QACf,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,EAC9B,CAAC;QACD,OAAO,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;IACzD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,eAAe,CACtB,MAAsB,EACtB,MAAsB,EACtB,GAAY;IAEZ,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO;IAC9B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;QAAE,OAAO;IAEhC,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC;IAC3B,IAAI,QAAQ,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;QAC5C,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;QAC1C,cAAc,EAAE,CAAC;QACjB,eAAe,EAAE,CAAC;IACpB,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAE9E,SAAS,WAAW,CAAC,IAAoB,EAAE,KAAqB;IAC9D,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACtC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;IAClC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC;IAEjB,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE;QACnB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,eAAe,EAAE,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE;QACpB,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,eAAe,EAAE,CAAC;QAClB,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC;IAEF,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE;QACpB,2BAA2B;IAC7B,CAAC,CAAC;IAEF,MAAM,CAAC,SAAS,GAAG,CAAC,KAAmB,EAAE,EAAE;QACzC,MAAM,GAAG,GAAY,IAAI,CAAC,KAAK,CAC7B,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CACjE,CAAC;QACF,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAoB,EAAE,KAAqB;IACpE,IAAI,CAAC,IAAI,CAAC,GAAG;QAAE,OAAO;IACtB,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;QACpC,IAAI,IAAI,CAAC,GAAG;YAAE,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC,EAAE,IAAI,CAAC,CAAC;AACX,CAAC;AAED,SAAS,cAAc,CAAC,IAAoB;IAC1C,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACtC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;IAClC,CAAC;IACD,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;IACpB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACvB,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,8DAA8D;AAC9D,8EAA8E;AAE9E,SAAS,gBAAgB,CAAC,GAAkB;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,eAAe;IACtB,gBAAgB,CAAC;QACf,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,SAAS,EAAE;KACpB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,SAAS;IAChB,OAAO;QACL,UAAU,EAAE,KAAK,CAAC,SAAS;QAC3B,UAAU,EAAE,KAAK,CAAC,SAAS;QAC3B,IAAI,EAAE,KAAK,CAAC,GAAG,IAAI,SAAS;QAC5B,IAAI,EAAE,KAAK,CAAC,GAAG,IAAI,SAAS;QAC5B,cAAc;QACd,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC;KACpB,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe;IAC/B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,IAAI,MAAM,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;QAC/B,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAiB;IAC1C,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,kCAAkC;YAClC,cAAc,CAAC,KAAK,CAAC,CAAC;YACtB,cAAc,CAAC,KAAK,CAAC,CAAC;YACtB,cAAc,GAAG,CAAC,CAAC;YACnB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YAElB,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC;YACrB,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC;YAErB,IAAI,CAAC;gBACH,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBAC1B,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7D,CAAC;YACD,eAAe,EAAE,CAAC;YAClB,MAAM;QACR,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,cAAc,CAAC,KAAK,CAAC,CAAC;YACtB,cAAc,CAAC,KAAK,CAAC,CAAC;YACtB,eAAe,EAAE,CAAC;YAClB,MAAM;QACR,CAAC;QACD,KAAK,QAAQ;YACX,eAAe,EAAE,CAAC;YAClB,MAAM;IACV,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;IACrB,OAAO,CACL,OAAO,CAAC,KAAK,QAAQ;QACrB,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,YAAY,IAAI,CAAC,KAAK,QAAQ,CAAC,CAC1D,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,oDAAoD;AACpD,8EAA8E;AAE9E,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAmB,EAAE,EAAE;IACvD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO;IAClC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAEnB,sCAAsC;IACtC,IAAI,CAAC;QACH,OAAO,CAAC,WAAW,CACjB,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,SAAS,EAAE;SACI,CAAC,CAC3B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IAED,OAAO,CAAC,SAAS,GAAG,CAAC,CAAe,EAAE,EAAE;QACtC,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAChC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CACrD,CAAC;QACF,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -4,13 +4,14 @@
4
4
  * No DOM dependency. Testable in isolation.
5
5
  * Consumers subscribe to changes and re-render as needed.
6
6
  */
7
- import type { Agent, Room } from "./types.js";
7
+ import type { Agent, DisplayMessage, Room } from "./types.js";
8
8
  export type StateChangeListener = (state: Readonly<ClientState>) => void;
9
9
  export interface ClientState {
10
10
  currentRoom: string | undefined;
11
11
  dmTarget: string | undefined;
12
12
  agents: Agent[];
13
13
  rooms: Room[];
14
+ messages: DisplayMessage[];
14
15
  connected: boolean;
15
16
  }
16
17
  export declare class State {
@@ -25,6 +26,12 @@ export declare class State {
25
26
  setAgents(agents: Agent[]): void;
26
27
  setRooms(rooms: Room[]): void;
27
28
  setConnected(connected: boolean): void;
29
+ /** Add a display message to the message list. */
30
+ addMessage(message: DisplayMessage): void;
31
+ /** Replace all messages (e.g. when loading history). */
32
+ setMessages(messages: DisplayMessage[]): void;
33
+ /** Clear all messages. */
34
+ clearMessages(): void;
28
35
  /** Bulk update from a state frame (initial WS connection). */
29
36
  applyState(agents: Agent[], rooms: Room[]): void;
30
37
  /** Reset to initial state. */
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;AAEzE,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;CACpB;AAUD,qBAAa,KAAK;IAChB,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;IAE5D,mEAAmE;IACnE,SAAS,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,IAAI;IAOpD,6CAA6C;IAC7C,GAAG,IAAI,QAAQ,CAAC,WAAW,CAAC;IAQ5B,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAKhD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAK9C,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;IAKhC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAK7B,YAAY,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAKtC,8DAA8D;IAC9D,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAKhD,8BAA8B;IAC9B,KAAK,IAAI,IAAI;IASb,OAAO,CAAC,MAAM;CAMf"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;AAEzE,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;CACpB;AAWD,qBAAa,KAAK;IAChB,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;IAE5D,mEAAmE;IACnE,SAAS,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,IAAI;IAOpD,6CAA6C;IAC7C,GAAG,IAAI,QAAQ,CAAC,WAAW,CAAC;IAQ5B,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAKhD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAK9C,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;IAKhC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAK7B,YAAY,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAKtC,iDAAiD;IACjD,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAKzC,wDAAwD;IACxD,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,IAAI;IAK7C,0BAA0B;IAC1B,aAAa,IAAI,IAAI;IAKrB,8DAA8D;IAC9D,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAKhD,8BAA8B;IAC9B,KAAK,IAAI,IAAI;IASb,OAAO,CAAC,MAAM;CAMf"}
@@ -9,6 +9,7 @@ const INITIAL_STATE = {
9
9
  dmTarget: undefined,
10
10
  agents: [],
11
11
  rooms: [],
12
+ messages: [],
12
13
  connected: false,
13
14
  };
14
15
  export class State {
@@ -48,6 +49,21 @@ export class State {
48
49
  this.state = { ...this.state, connected };
49
50
  this.notify();
50
51
  }
52
+ /** Add a display message to the message list. */
53
+ addMessage(message) {
54
+ this.state = { ...this.state, messages: [...this.state.messages, message] };
55
+ this.notify();
56
+ }
57
+ /** Replace all messages (e.g. when loading history). */
58
+ setMessages(messages) {
59
+ this.state = { ...this.state, messages };
60
+ this.notify();
61
+ }
62
+ /** Clear all messages. */
63
+ clearMessages() {
64
+ this.state = { ...this.state, messages: [] };
65
+ this.notify();
66
+ }
51
67
  /** Bulk update from a state frame (initial WS connection). */
52
68
  applyState(agents, rooms) {
53
69
  this.state = { ...this.state, agents, rooms };
@@ -55,7 +71,7 @@ export class State {
55
71
  }
56
72
  /** Reset to initial state. */
57
73
  reset() {
58
- this.state = { ...INITIAL_STATE };
74
+ this.state = { ...INITIAL_STATE, messages: [] };
59
75
  this.notify();
60
76
  }
61
77
  // -----------------------------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,MAAM,aAAa,GAAgB;IACjC,WAAW,EAAE,SAAS;IACtB,QAAQ,EAAE,SAAS;IACnB,MAAM,EAAE,EAAE;IACV,KAAK,EAAE,EAAE;IACT,SAAS,EAAE,KAAK;CACjB,CAAC;AAEF,MAAM,OAAO,KAAK;IACR,KAAK,GAAgB,EAAE,GAAG,aAAa,EAAE,CAAC;IACjC,SAAS,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE5D,mEAAmE;IACnE,SAAS,CAAC,QAA6B;QACrC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC;IAED,6CAA6C;IAC7C,GAAG;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,0EAA0E;IAC1E,sCAAsC;IACtC,0EAA0E;IAE1E,cAAc,CAAC,MAA0B;QACvC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,WAAW,CAAC,OAA2B;QACrC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QAClD,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,SAAS,CAAC,MAAe;QACvB,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACvC,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;QACtC,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,YAAY,CAAC,SAAkB;QAC7B,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC;QAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,8DAA8D;IAC9D,UAAU,CAAC,MAAe,EAAE,KAAa;QACvC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,8BAA8B;IAC9B,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,aAAa,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,0EAA0E;IAC1E,WAAW;IACX,0EAA0E;IAElE,MAAM;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Service worker for the Agent Comms PWA.
3
+ *
4
+ * Handles push events from the browser push service and displays
5
+ * notifications. On notification click, focuses or opens the PWA window.
6
+ *
7
+ * Also provides offline caching:
8
+ * - Install: pre-caches the app shell (HTML, JS, manifest, icons).
9
+ * - Fetch: network-first for API calls, cache-first for static assets.
10
+ * - Activate: removes old caches when the SW version changes.
11
+ *
12
+ * This file is built as a separate bundle (not part of the main app bundle)
13
+ * because service workers run in a separate context with no DOM access.
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=sw.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sw.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/sw.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}