agent-comms 1.14.0 → 1.15.1

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 (184) 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.map +1 -1
  16. package/dist/bridges/pi/index.js +39 -17
  17. package/dist/bridges/pi/index.js.map +1 -1
  18. package/dist/bridges/user/controller.d.ts +9 -1
  19. package/dist/bridges/user/controller.d.ts.map +1 -1
  20. package/dist/bridges/user/controller.js +25 -1
  21. package/dist/bridges/user/controller.js.map +1 -1
  22. package/dist/bridges/user/tui.js +2 -0
  23. package/dist/bridges/user/tui.js.map +1 -1
  24. package/dist/bridges/user/web/build.d.ts +2 -0
  25. package/dist/bridges/user/web/build.d.ts.map +1 -1
  26. package/dist/bridges/user/web/build.js +44 -0
  27. package/dist/bridges/user/web/build.js.map +1 -1
  28. package/dist/bridges/user/web/frontend/components/App.d.ts +5 -0
  29. package/dist/bridges/user/web/frontend/components/App.d.ts.map +1 -1
  30. package/dist/bridges/user/web/frontend/components/App.js +1 -1
  31. package/dist/bridges/user/web/frontend/components/App.js.map +1 -1
  32. package/dist/bridges/user/web/frontend/components/ProjectTree.js +6 -3
  33. package/dist/bridges/user/web/frontend/components/ProjectTree.js.map +1 -1
  34. package/dist/bridges/user/web/frontend/components/RelayPanel.d.ts +15 -0
  35. package/dist/bridges/user/web/frontend/components/RelayPanel.d.ts.map +1 -0
  36. package/dist/bridges/user/web/frontend/components/RelayPanel.js +46 -0
  37. package/dist/bridges/user/web/frontend/components/RelayPanel.js.map +1 -0
  38. package/dist/bridges/user/web/frontend/components/Sidebar.d.ts +7 -2
  39. package/dist/bridges/user/web/frontend/components/Sidebar.d.ts.map +1 -1
  40. package/dist/bridges/user/web/frontend/components/Sidebar.js +15 -9
  41. package/dist/bridges/user/web/frontend/components/Sidebar.js.map +1 -1
  42. package/dist/bridges/user/web/frontend/input.js +1 -1
  43. package/dist/bridges/user/web/frontend/input.js.map +1 -1
  44. package/dist/bridges/user/web/frontend/main.js +73 -5
  45. package/dist/bridges/user/web/frontend/main.js.map +1 -1
  46. package/dist/bridges/user/web/frontend/mesh-client.d.ts +43 -0
  47. package/dist/bridges/user/web/frontend/mesh-client.d.ts.map +1 -0
  48. package/dist/bridges/user/web/frontend/mesh-client.js +132 -0
  49. package/dist/bridges/user/web/frontend/mesh-client.js.map +1 -0
  50. package/dist/bridges/user/web/frontend/mesh-worker.d.ts +14 -0
  51. package/dist/bridges/user/web/frontend/mesh-worker.d.ts.map +1 -0
  52. package/dist/bridges/user/web/frontend/mesh-worker.js +274 -0
  53. package/dist/bridges/user/web/frontend/mesh-worker.js.map +1 -0
  54. package/dist/bridges/user/web/frontend/relay-client.d.ts +40 -0
  55. package/dist/bridges/user/web/frontend/relay-client.d.ts.map +1 -0
  56. package/dist/bridges/user/web/frontend/relay-client.js +97 -0
  57. package/dist/bridges/user/web/frontend/relay-client.js.map +1 -0
  58. package/dist/bridges/user/web/frontend/relay-worker.d.ts +15 -0
  59. package/dist/bridges/user/web/frontend/relay-worker.d.ts.map +1 -0
  60. package/dist/bridges/user/web/frontend/relay-worker.js +366 -0
  61. package/dist/bridges/user/web/frontend/relay-worker.js.map +1 -0
  62. package/dist/bridges/user/web/frontend/sw.d.ts +16 -0
  63. package/dist/bridges/user/web/frontend/sw.d.ts.map +1 -0
  64. package/dist/bridges/user/web/frontend/sw.js +145 -0
  65. package/dist/bridges/user/web/frontend/sw.js.map +1 -0
  66. package/dist/bridges/user/web/frontend/url-sync.d.ts +48 -0
  67. package/dist/bridges/user/web/frontend/url-sync.d.ts.map +1 -0
  68. package/dist/bridges/user/web/frontend/url-sync.js +74 -0
  69. package/dist/bridges/user/web/frontend/url-sync.js.map +1 -0
  70. package/dist/bridges/user/web/server.d.ts +10 -3
  71. package/dist/bridges/user/web/server.d.ts.map +1 -1
  72. package/dist/bridges/user/web/server.js +254 -12
  73. package/dist/bridges/user/web/server.js.map +1 -1
  74. package/dist/core/bridge.d.ts +28 -0
  75. package/dist/core/bridge.d.ts.map +1 -1
  76. package/dist/core/bridge.js +137 -0
  77. package/dist/core/bridge.js.map +1 -1
  78. package/dist/core/comms-store.d.ts +22 -1
  79. package/dist/core/comms-store.d.ts.map +1 -1
  80. package/dist/core/discovery-mdns.d.ts +33 -0
  81. package/dist/core/discovery-mdns.d.ts.map +1 -0
  82. package/dist/core/discovery-mdns.js +182 -0
  83. package/dist/core/discovery-mdns.js.map +1 -0
  84. package/dist/core/discovery-tailscale.d.ts +40 -0
  85. package/dist/core/discovery-tailscale.d.ts.map +1 -0
  86. package/dist/core/discovery-tailscale.js +158 -0
  87. package/dist/core/discovery-tailscale.js.map +1 -0
  88. package/dist/core/discovery.d.ts +82 -0
  89. package/dist/core/discovery.d.ts.map +1 -0
  90. package/dist/core/discovery.js +194 -0
  91. package/dist/core/discovery.js.map +1 -0
  92. package/dist/core/federation.d.ts +100 -0
  93. package/dist/core/federation.d.ts.map +1 -0
  94. package/dist/core/federation.js +411 -0
  95. package/dist/core/federation.js.map +1 -0
  96. package/dist/core/identity.d.ts +31 -0
  97. package/dist/core/identity.d.ts.map +1 -0
  98. package/dist/core/identity.js +251 -0
  99. package/dist/core/identity.js.map +1 -0
  100. package/dist/core/index.d.ts +11 -0
  101. package/dist/core/index.d.ts.map +1 -1
  102. package/dist/core/index.js +6 -0
  103. package/dist/core/index.js.map +1 -1
  104. package/dist/core/mesh-store.d.ts +72 -26
  105. package/dist/core/mesh-store.d.ts.map +1 -1
  106. package/dist/core/mesh-store.js +467 -352
  107. package/dist/core/mesh-store.js.map +1 -1
  108. package/dist/core/push-manager.d.ts +41 -0
  109. package/dist/core/push-manager.d.ts.map +1 -0
  110. package/dist/core/push-manager.js +60 -0
  111. package/dist/core/push-manager.js.map +1 -0
  112. package/dist/core/store.d.ts +21 -1
  113. package/dist/core/store.d.ts.map +1 -1
  114. package/dist/core/store.js +44 -0
  115. package/dist/core/store.js.map +1 -1
  116. package/dist/core/tcp-transport.d.ts +77 -0
  117. package/dist/core/tcp-transport.d.ts.map +1 -0
  118. package/dist/core/tcp-transport.js +596 -0
  119. package/dist/core/tcp-transport.js.map +1 -0
  120. package/dist/core/test/identity.unit.test.d.ts +5 -0
  121. package/dist/core/test/identity.unit.test.d.ts.map +1 -0
  122. package/dist/core/test/identity.unit.test.js +70 -0
  123. package/dist/core/test/identity.unit.test.js.map +1 -0
  124. package/dist/core/tls-transport.d.ts +69 -0
  125. package/dist/core/tls-transport.d.ts.map +1 -0
  126. package/dist/core/tls-transport.js +602 -0
  127. package/dist/core/tls-transport.js.map +1 -0
  128. package/dist/core/tool.d.ts +23 -2
  129. package/dist/core/tool.d.ts.map +1 -1
  130. package/dist/core/tool.js +269 -1
  131. package/dist/core/tool.js.map +1 -1
  132. package/dist/core/transport.d.ts +166 -0
  133. package/dist/core/transport.d.ts.map +1 -0
  134. package/dist/core/transport.js +20 -0
  135. package/dist/core/transport.js.map +1 -0
  136. package/dist/core/types.d.ts +136 -0
  137. package/dist/core/types.d.ts.map +1 -1
  138. package/dist/core/types.js +71 -0
  139. package/dist/core/types.js.map +1 -1
  140. package/dist/core/vapid.d.ts +22 -0
  141. package/dist/core/vapid.d.ts.map +1 -0
  142. package/dist/core/vapid.js +50 -0
  143. package/dist/core/vapid.js.map +1 -0
  144. package/dist/core/web-push.d.ts +37 -0
  145. package/dist/core/web-push.d.ts.map +1 -0
  146. package/dist/core/web-push.js +198 -0
  147. package/dist/core/web-push.js.map +1 -0
  148. package/dist/core/wire-protocol.d.ts +131 -0
  149. package/dist/core/wire-protocol.d.ts.map +1 -0
  150. package/dist/core/wire-protocol.js +54 -0
  151. package/dist/core/wire-protocol.js.map +1 -0
  152. package/dist/core/ws-transport.d.ts +71 -0
  153. package/dist/core/ws-transport.d.ts.map +1 -0
  154. package/dist/core/ws-transport.js +560 -0
  155. package/dist/core/ws-transport.js.map +1 -0
  156. package/dist/test/approval.integration.test.d.ts +9 -0
  157. package/dist/test/approval.integration.test.d.ts.map +1 -0
  158. package/dist/test/approval.integration.test.js +361 -0
  159. package/dist/test/approval.integration.test.js.map +1 -0
  160. package/dist/test/delivery-receipt.helper.d.ts +16 -0
  161. package/dist/test/delivery-receipt.helper.d.ts.map +1 -0
  162. package/dist/test/delivery-receipt.helper.js +409 -0
  163. package/dist/test/delivery-receipt.helper.js.map +1 -0
  164. package/dist/test/delivery-receipt.runner.d.ts +13 -0
  165. package/dist/test/delivery-receipt.runner.d.ts.map +1 -0
  166. package/dist/test/delivery-receipt.runner.js +51 -0
  167. package/dist/test/delivery-receipt.runner.js.map +1 -0
  168. package/dist/test/federation.integration.test.d.ts +15 -0
  169. package/dist/test/federation.integration.test.d.ts.map +1 -0
  170. package/dist/test/federation.integration.test.js +218 -0
  171. package/dist/test/federation.integration.test.js.map +1 -0
  172. package/dist/test/listener-policy.integration.test.d.ts +9 -0
  173. package/dist/test/listener-policy.integration.test.d.ts.map +1 -0
  174. package/dist/test/listener-policy.integration.test.js +239 -0
  175. package/dist/test/listener-policy.integration.test.js.map +1 -0
  176. package/dist/test/tls-transport.integration.test.d.ts +8 -0
  177. package/dist/test/tls-transport.integration.test.d.ts.map +1 -0
  178. package/dist/test/tls-transport.integration.test.js +158 -0
  179. package/dist/test/tls-transport.integration.test.js.map +1 -0
  180. package/dist/test/visibility.integration.test.d.ts +12 -0
  181. package/dist/test/visibility.integration.test.d.ts.map +1 -0
  182. package/dist/test/visibility.integration.test.js +181 -0
  183. package/dist/test/visibility.integration.test.js.map +1 -0
  184. package/package.json +4 -1
@@ -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":"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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"}
@@ -0,0 +1,145 @@
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
+ // ---------------------------------------------------------------------------
16
+ // Cache versioning — bump to invalidate old caches on deploy
17
+ // ---------------------------------------------------------------------------
18
+ const CACHE_NAME = "agent-comms-v1";
19
+ const APP_SHELL = [
20
+ "./",
21
+ "./bundle.js",
22
+ "./sw.js",
23
+ "./manifest.json",
24
+ "./icons/icon-96x96.svg",
25
+ "./icons/icon-192x192.svg",
26
+ "./icons/icon-512x512.svg",
27
+ ];
28
+ // ---------------------------------------------------------------------------
29
+ // Install — pre-cache the app shell
30
+ // ---------------------------------------------------------------------------
31
+ self.addEventListener("install", (event) => {
32
+ event.waitUntil(self.caches
33
+ .open(CACHE_NAME)
34
+ .then((cache) => cache.addAll(APP_SHELL))
35
+ .then(() => self.skipWaiting()));
36
+ });
37
+ // ---------------------------------------------------------------------------
38
+ // Activate — remove old caches
39
+ // ---------------------------------------------------------------------------
40
+ self.addEventListener("activate", (event) => {
41
+ event.waitUntil(self.caches
42
+ .keys()
43
+ .then((names) => Promise.all(names
44
+ .filter((name) => name !== CACHE_NAME)
45
+ .map((name) => self.caches.delete(name)))));
46
+ });
47
+ // ---------------------------------------------------------------------------
48
+ // Fetch — network-first for API, cache-first for everything else
49
+ // ---------------------------------------------------------------------------
50
+ self.addEventListener("fetch", (event) => {
51
+ const url = new URL(event.request.url);
52
+ // API calls: network-first so stale data doesn't linger
53
+ if (url.pathname.startsWith("/api/")) {
54
+ event.respondWith(fetch(event.request)
55
+ .then((response) => {
56
+ // Only cache successful GET responses
57
+ if (event.request.method === "GET" &&
58
+ response.status >= 200 &&
59
+ response.status < 300) {
60
+ const cloned = response.clone();
61
+ void self.caches
62
+ .open(CACHE_NAME)
63
+ .then((cache) => cache.put(event.request, cloned));
64
+ }
65
+ return response;
66
+ })
67
+ .catch(() => self.caches
68
+ .open(CACHE_NAME)
69
+ .then((cache) => cache.match(event.request))
70
+ .then((cached) => cached ?? new Response("Offline", { status: 503 }))));
71
+ return;
72
+ }
73
+ // Static assets: cache-first
74
+ event.respondWith(self.caches
75
+ .open(CACHE_NAME)
76
+ .then((cache) => cache.match(event.request))
77
+ .then((cached) => {
78
+ if (cached)
79
+ return cached;
80
+ return fetch(event.request).then((response) => {
81
+ // Cache successful GET responses for future offline use
82
+ if (event.request.method === "GET" &&
83
+ response.status >= 200 &&
84
+ response.status < 300) {
85
+ const cloned = response.clone();
86
+ void self.caches
87
+ .open(CACHE_NAME)
88
+ .then((cache) => cache.put(event.request, cloned));
89
+ }
90
+ return response;
91
+ });
92
+ }));
93
+ });
94
+ // ---------------------------------------------------------------------------
95
+ // Push event handler
96
+ // ---------------------------------------------------------------------------
97
+ self.addEventListener("push", (event) => {
98
+ let title = "Agent Comms";
99
+ let body = "New message";
100
+ if (event.data) {
101
+ try {
102
+ const data = event.data.json();
103
+ if (typeof data.title === "string")
104
+ title = data.title;
105
+ if (typeof data.body === "string")
106
+ body = data.body;
107
+ }
108
+ catch {
109
+ const text = event.data.text();
110
+ if (text)
111
+ body = text;
112
+ }
113
+ }
114
+ event.waitUntil(self.registration.showNotification(title, {
115
+ body,
116
+ data: {
117
+ url: self.location.origin,
118
+ },
119
+ }));
120
+ });
121
+ // ---------------------------------------------------------------------------
122
+ // Notification click handler
123
+ // ---------------------------------------------------------------------------
124
+ self.addEventListener("notificationclick", (event) => {
125
+ event.notification.close();
126
+ const notificationData = event.notification.data;
127
+ const targetUrl = typeof notificationData === "object" &&
128
+ notificationData !== null &&
129
+ "url" in notificationData &&
130
+ typeof notificationData.url === "string"
131
+ ? notificationData.url
132
+ : self.location.origin;
133
+ event.waitUntil(self.clients
134
+ .matchAll({ type: "window", includeUncontrolled: true })
135
+ .then((clientList) => {
136
+ for (const client of clientList) {
137
+ if (client.url === targetUrl && "focus" in client) {
138
+ return client.focus();
139
+ }
140
+ }
141
+ return self.clients.openWindow(targetUrl);
142
+ }));
143
+ });
144
+ export {};
145
+ //# sourceMappingURL=sw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sw.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/sw.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * URL query parameter sync — deep-linking for rooms, DMs, and project rooms.
3
+ *
4
+ * Supported parameters (mutually exclusive, first match wins):
5
+ * ?room=<roomId> — join a room by ID
6
+ * ?dm=<agentId> — open a DM conversation with an agent
7
+ * ?cwd=<path> — find the project room for a working directory and join it
8
+ *
9
+ * The URL bar updates on every navigation (room join, agent select, leave)
10
+ * so the current view is always shareable. Uses replaceState to avoid
11
+ * polluting browser history.
12
+ */
13
+ import type { Room } from "./types.js";
14
+ export interface NavTarget {
15
+ kind: "room";
16
+ roomId: string;
17
+ }
18
+ export interface NavTargetDm {
19
+ kind: "dm";
20
+ agentId: string;
21
+ }
22
+ export interface NavTargetCwd {
23
+ kind: "cwd";
24
+ path: string;
25
+ }
26
+ export type DeepLink = NavTarget | NavTargetDm | NavTargetCwd;
27
+ /**
28
+ * Parse query parameters into a deep link target.
29
+ * Returns undefined if no recognised parameter is present.
30
+ */
31
+ export declare function parseDeepLink(search: string): DeepLink | undefined;
32
+ export interface ResolvedNav {
33
+ kind: "room" | "dm";
34
+ targetId: string;
35
+ }
36
+ /**
37
+ * Resolve a deep link against the current rooms list.
38
+ *
39
+ * - room → direct match by ID
40
+ * - dm → direct match by agent ID
41
+ * - cwd → find a project room whose description is "Project room for <path>"
42
+ */
43
+ export declare function resolveDeepLink(link: DeepLink, rooms: Room[]): ResolvedNav | undefined;
44
+ export declare function syncUrl(params: {
45
+ currentRoom: string | undefined;
46
+ dmTarget: string | undefined;
47
+ }): void;
48
+ //# sourceMappingURL=url-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-sync.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/url-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAMvC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,YAAY,CAAC;AAI9D;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAalE;AAMD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,IAAI,EAAE,GACZ,WAAW,GAAG,SAAS,CAqBzB;AAMD,wBAAgB,OAAO,CAAC,MAAM,EAAE;IAC9B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B,GAAG,IAAI,CAgBP"}