agent-comms 2.0.1 → 2.2.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 (71) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +1 -1
  4. package/dist/bridges/user/web/build.js +0 -11
  5. package/dist/bridges/user/web/build.js.map +1 -1
  6. package/dist/bridges/user/web/dist/bundle.js +2 -2
  7. package/dist/bridges/user/web/frontend/components/App.d.ts +0 -4
  8. package/dist/bridges/user/web/frontend/components/App.d.ts.map +1 -1
  9. package/dist/bridges/user/web/frontend/components/App.js +1 -1
  10. package/dist/bridges/user/web/frontend/components/App.js.map +1 -1
  11. package/dist/bridges/user/web/frontend/components/Sidebar.d.ts +1 -5
  12. package/dist/bridges/user/web/frontend/components/Sidebar.d.ts.map +1 -1
  13. package/dist/bridges/user/web/frontend/components/Sidebar.js +2 -3
  14. package/dist/bridges/user/web/frontend/components/Sidebar.js.map +1 -1
  15. package/dist/bridges/user/web/frontend/main.js +2 -16
  16. package/dist/bridges/user/web/frontend/main.js.map +1 -1
  17. package/dist/core/bridge.d.ts +3 -3
  18. package/dist/core/bridge.d.ts.map +1 -1
  19. package/dist/core/bridge.js +11 -9
  20. package/dist/core/bridge.js.map +1 -1
  21. package/dist/core/mesh-store.d.ts.map +1 -1
  22. package/dist/core/mesh-store.js +9 -4
  23. package/dist/core/mesh-store.js.map +1 -1
  24. package/dist/core/room-path.d.ts +20 -0
  25. package/dist/core/room-path.d.ts.map +1 -0
  26. package/dist/core/room-path.js +60 -0
  27. package/dist/core/room-path.js.map +1 -0
  28. package/dist/core/room-token-verification.d.ts +24 -0
  29. package/dist/core/room-token-verification.d.ts.map +1 -0
  30. package/dist/core/room-token-verification.js +35 -0
  31. package/dist/core/room-token-verification.js.map +1 -0
  32. package/dist/core/wire-protocol.d.ts +2 -10
  33. package/dist/core/wire-protocol.d.ts.map +1 -1
  34. package/dist/core/wire-protocol.js +1 -12
  35. package/dist/core/wire-protocol.js.map +1 -1
  36. package/dist/test/create-room-name-sanitisation.test.d.ts +5 -0
  37. package/dist/test/create-room-name-sanitisation.test.d.ts.map +1 -0
  38. package/dist/test/create-room-name-sanitisation.test.js +52 -0
  39. package/dist/test/create-room-name-sanitisation.test.js.map +1 -0
  40. package/dist/test/downtime-replay.integration.test.js +6 -4
  41. package/dist/test/downtime-replay.integration.test.js.map +1 -1
  42. package/dist/test/downtime-replay.test.js +10 -6
  43. package/dist/test/downtime-replay.test.js.map +1 -1
  44. package/dist/test/federation.integration.test.js +4 -1
  45. package/dist/test/federation.integration.test.js.map +1 -1
  46. package/dist/test/identity-restart.integration.test.js +3 -2
  47. package/dist/test/identity-restart.integration.test.js.map +1 -1
  48. package/dist/test/room-path.test.d.ts +2 -0
  49. package/dist/test/room-path.test.d.ts.map +1 -0
  50. package/dist/test/room-path.test.js +54 -0
  51. package/dist/test/room-path.test.js.map +1 -0
  52. package/dist/test/room-token-verification.test.d.ts +2 -0
  53. package/dist/test/room-token-verification.test.d.ts.map +1 -0
  54. package/dist/test/room-token-verification.test.js +212 -0
  55. package/dist/test/room-token-verification.test.js.map +1 -0
  56. package/dist/test/state-sync-convergence.test.js +30 -29
  57. package/dist/test/state-sync-convergence.test.js.map +1 -1
  58. package/package.json +2 -2
  59. package/dist/bridges/user/web/dist/relay-worker.js +0 -1
  60. package/dist/bridges/user/web/frontend/components/RelayPanel.d.ts +0 -15
  61. package/dist/bridges/user/web/frontend/components/RelayPanel.d.ts.map +0 -1
  62. package/dist/bridges/user/web/frontend/components/RelayPanel.js +0 -46
  63. package/dist/bridges/user/web/frontend/components/RelayPanel.js.map +0 -1
  64. package/dist/bridges/user/web/frontend/relay-client.d.ts +0 -40
  65. package/dist/bridges/user/web/frontend/relay-client.d.ts.map +0 -1
  66. package/dist/bridges/user/web/frontend/relay-client.js +0 -97
  67. package/dist/bridges/user/web/frontend/relay-client.js.map +0 -1
  68. package/dist/bridges/user/web/frontend/relay-worker.d.ts +0 -15
  69. package/dist/bridges/user/web/frontend/relay-worker.d.ts.map +0 -1
  70. package/dist/bridges/user/web/frontend/relay-worker.js +0 -379
  71. package/dist/bridges/user/web/frontend/relay-worker.js.map +0 -1
@@ -1,97 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"relay-client.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/relay-client.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"relay-worker.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/relay-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
@@ -1,379 +0,0 @@
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
- const PATCH_TYPES = new Set([
15
- "agent_upsert",
16
- "agent_offline",
17
- "room_upsert",
18
- "room_delete",
19
- "message_add",
20
- "dm_add",
21
- "delivery",
22
- "message_read",
23
- ]);
24
- function isMeshStatePatch(value) {
25
- if (typeof value !== "object" || value === null)
26
- return false;
27
- if (!("type" in value))
28
- return false;
29
- if (typeof value.type !== "string")
30
- return false;
31
- return PATCH_TYPES.has(value.type);
32
- }
33
- // ---------------------------------------------------------------------------
34
- // Relay state
35
- // ---------------------------------------------------------------------------
36
- /** Methods that should be forwarded between meshes. */
37
- const FORWARDABLE_METHODS = new Set([
38
- "state_update",
39
- "peer_joined",
40
- "peer_left",
41
- ]);
42
- /** Methods that must never be forwarded (cause loops or are side-specific). */
43
- const BLOCKED_METHODS = new Set([
44
- "state_sync",
45
- "introduce",
46
- "connect_request",
47
- "connect_accepted",
48
- "connect_rejected",
49
- "peer_list",
50
- "become_coordinator",
51
- "pong",
52
- "fed_handshake",
53
- "fed_ack",
54
- "fed_agent_visible",
55
- "fed_agent_gone",
56
- "fed_room_message",
57
- "fed_room_join",
58
- "fed_room_leave",
59
- "fed_ping",
60
- "fed_pong",
61
- ]);
62
- const meshA = {
63
- label: "a",
64
- url: "",
65
- ws: undefined,
66
- connected: false,
67
- reconnectTimer: undefined,
68
- };
69
- const meshB = {
70
- label: "b",
71
- url: "",
72
- ws: undefined,
73
- connected: false,
74
- reconnectTimer: undefined,
75
- };
76
- let forwardedCount = 0;
77
- const errors = [];
78
- const MAX_ERRORS = 50;
79
- const ports = new Set();
80
- // ---------------------------------------------------------------------------
81
- // Peer ID translation
82
- // ---------------------------------------------------------------------------
83
- function prefixId(label, id) {
84
- return `${label}:${id}`;
85
- }
86
- function translateAgent(label, agent) {
87
- return {
88
- ...agent,
89
- id: prefixId(label, agent.id),
90
- name: `${agent.name} (via ${label.toUpperCase()})`,
91
- subscribedRooms: agent.subscribedRooms.map((r) => prefixId(label, r)),
92
- };
93
- }
94
- function translateRoom(label, room) {
95
- return {
96
- ...room,
97
- id: prefixId(label, room.id),
98
- owner: prefixId(label, room.owner),
99
- members: room.members.map((m) => prefixId(label, m)),
100
- invited: room.invited.map((m) => prefixId(label, m)),
101
- };
102
- }
103
- function translateMessage(label, msg) {
104
- const result = {
105
- ...msg,
106
- from: prefixId(label, msg.from),
107
- room: prefixId(label, msg.room),
108
- readBy: msg.readBy.map((r) => prefixId(label, r)),
109
- };
110
- if (msg.replyTo !== undefined)
111
- result.replyTo = prefixId(label, msg.replyTo);
112
- return result;
113
- }
114
- function translateDm(label, msg) {
115
- return {
116
- ...msg,
117
- from: prefixId(label, msg.from),
118
- to: prefixId(label, msg.to),
119
- readBy: msg.readBy.map((r) => prefixId(label, r)),
120
- };
121
- }
122
- function translateDmKey(label, key) {
123
- // DM keys are "idA--idB" (sorted). Prefix both IDs.
124
- const parts = key.split("--");
125
- return parts.map((p) => prefixId(label, p)).join("--");
126
- }
127
- /**
128
- * Translate a state_update patch, prefixing all peer/room IDs with the
129
- * mesh label so they don't collide with IDs from the other mesh.
130
- */
131
- function translatePatch(label, patch) {
132
- switch (patch.type) {
133
- case "agent_upsert":
134
- return { ...patch, agent: translateAgent(label, patch.agent) };
135
- case "agent_offline":
136
- return { ...patch, agentId: prefixId(label, patch.agentId) };
137
- case "room_upsert":
138
- return { ...patch, room: translateRoom(label, patch.room) };
139
- case "room_delete":
140
- return { ...patch, roomId: prefixId(label, patch.roomId) };
141
- case "message_add":
142
- return {
143
- ...patch,
144
- roomId: prefixId(label, patch.roomId),
145
- message: translateMessage(label, patch.message),
146
- };
147
- case "dm_add":
148
- return {
149
- ...patch,
150
- key: translateDmKey(label, patch.key),
151
- message: translateDm(label, patch.message),
152
- };
153
- case "delivery":
154
- return { ...patch, agentId: prefixId(label, patch.agentId) };
155
- case "message_read":
156
- return {
157
- ...patch,
158
- readBy: prefixId(label, patch.readBy),
159
- ...(patch.room ? { room: prefixId(label, patch.room) } : {}),
160
- };
161
- }
162
- }
163
- // ---------------------------------------------------------------------------
164
- // Wire message parsing
165
- // ---------------------------------------------------------------------------
166
- function parseWireMessage(raw) {
167
- if (typeof raw !== "object" || raw === null)
168
- return undefined;
169
- if (!("method" in raw))
170
- return undefined;
171
- if (typeof raw.method !== "string")
172
- return undefined;
173
- // Spread into a new object to satisfy WireMessage — raw is narrowed to
174
- // object & { method: string } but not to the WireMessage union
175
- const msg = { ...raw, method: raw.method };
176
- return msg;
177
- }
178
- // ---------------------------------------------------------------------------
179
- // Message forwarding
180
- // ---------------------------------------------------------------------------
181
- function shouldForward(msg) {
182
- if (BLOCKED_METHODS.has(msg.method))
183
- return false;
184
- if (FORWARDABLE_METHODS.has(msg.method))
185
- return true;
186
- // Unknown methods are blocked by default
187
- return false;
188
- }
189
- function translateWireMessage(label, msg) {
190
- if (msg.method === "state_update" &&
191
- "patch" in msg &&
192
- isMeshStatePatch(msg.patch)) {
193
- return { ...msg, patch: translatePatch(label, msg.patch) };
194
- }
195
- if (msg.method === "peer_joined" &&
196
- "peer" in msg &&
197
- typeof msg.peer === "object" &&
198
- msg.peer !== null &&
199
- "id" in msg.peer &&
200
- typeof msg.peer.id === "string" &&
201
- "port" in msg.peer &&
202
- typeof msg.peer.port === "number" &&
203
- "startedAt" in msg.peer &&
204
- typeof msg.peer.startedAt === "string") {
205
- return {
206
- ...msg,
207
- peer: { ...msg.peer, id: prefixId(label, msg.peer.id) },
208
- };
209
- }
210
- if (msg.method === "peer_left" &&
211
- "peerId" in msg &&
212
- typeof msg.peerId === "string") {
213
- return { ...msg, peerId: prefixId(label, msg.peerId) };
214
- }
215
- return msg;
216
- }
217
- function forwardToTarget(source, target, raw) {
218
- const msg = parseWireMessage(raw);
219
- if (msg === undefined)
220
- return;
221
- if (!shouldForward(msg))
222
- return;
223
- const translated = translateWireMessage(source.label, msg);
224
- const targetWs = target.ws;
225
- if (targetWs?.readyState === WebSocket.OPEN) {
226
- targetWs.send(JSON.stringify(translated));
227
- forwardedCount++;
228
- broadcastStatus();
229
- }
230
- }
231
- // ---------------------------------------------------------------------------
232
- // WebSocket connection management
233
- // ---------------------------------------------------------------------------
234
- function connectMesh(conn, other) {
235
- if (conn.reconnectTimer !== undefined) {
236
- clearTimeout(conn.reconnectTimer);
237
- conn.reconnectTimer = undefined;
238
- }
239
- const socket = new WebSocket(conn.url);
240
- conn.ws = socket;
241
- socket.onopen = () => {
242
- conn.connected = true;
243
- broadcastStatus();
244
- };
245
- socket.onclose = () => {
246
- conn.ws = undefined;
247
- conn.connected = false;
248
- broadcastStatus();
249
- scheduleReconnect(conn, other);
250
- };
251
- socket.onerror = () => {
252
- // onclose fires after this
253
- };
254
- socket.onmessage = (event) => {
255
- const raw = JSON.parse(typeof event.data === "string" ? event.data : String(event.data));
256
- forwardToTarget(conn, other, raw);
257
- };
258
- }
259
- function scheduleReconnect(conn, other) {
260
- if (!conn.url)
261
- return;
262
- conn.reconnectTimer = setTimeout(() => {
263
- if (conn.url)
264
- connectMesh(conn, other);
265
- }, 3000);
266
- }
267
- function disconnectMesh(conn) {
268
- if (conn.reconnectTimer !== undefined) {
269
- clearTimeout(conn.reconnectTimer);
270
- conn.reconnectTimer = undefined;
271
- }
272
- conn.ws?.close();
273
- conn.ws = undefined;
274
- conn.connected = false;
275
- conn.url = "";
276
- }
277
- // ---------------------------------------------------------------------------
278
- // Port management — fan-out to all connected main-thread tabs
279
- // ---------------------------------------------------------------------------
280
- function broadcastToPorts(msg) {
281
- const data = JSON.stringify(msg);
282
- for (const port of ports) {
283
- try {
284
- port.postMessage(data);
285
- }
286
- catch {
287
- // Port closed
288
- }
289
- }
290
- }
291
- function broadcastStatus() {
292
- broadcastToPorts({
293
- type: "status",
294
- status: getStatus(),
295
- });
296
- }
297
- function getStatus() {
298
- return {
299
- connectedA: meshA.connected,
300
- connectedB: meshB.connected,
301
- urlA: meshA.url || undefined,
302
- urlB: meshB.url || undefined,
303
- forwardedCount,
304
- errors: [...errors],
305
- };
306
- }
307
- function addError(message) {
308
- errors.push(message);
309
- if (errors.length > MAX_ERRORS) {
310
- errors.shift();
311
- }
312
- }
313
- function handlePortMessage(msg) {
314
- switch (msg.type) {
315
- case "connect": {
316
- // Disconnect existing connections
317
- disconnectMesh(meshA);
318
- disconnectMesh(meshB);
319
- forwardedCount = 0;
320
- errors.length = 0;
321
- meshA.url = msg.urlA;
322
- meshB.url = msg.urlB;
323
- try {
324
- connectMesh(meshA, meshB);
325
- connectMesh(meshB, meshA);
326
- }
327
- catch (err) {
328
- addError(err instanceof Error ? err.message : String(err));
329
- }
330
- broadcastStatus();
331
- break;
332
- }
333
- case "disconnect": {
334
- disconnectMesh(meshA);
335
- disconnectMesh(meshB);
336
- broadcastStatus();
337
- break;
338
- }
339
- case "status":
340
- broadcastStatus();
341
- break;
342
- }
343
- }
344
- function isRelayInbound(value) {
345
- if (typeof value !== "object" || value === null)
346
- return false;
347
- if (!("type" in value))
348
- return false;
349
- const t = value.type;
350
- return (typeof t === "string" &&
351
- (t === "connect" || t === "disconnect" || t === "status"));
352
- }
353
- // ---------------------------------------------------------------------------
354
- // Entry point — listen for SharedWorker connections
355
- // ---------------------------------------------------------------------------
356
- self.addEventListener("connect", (event) => {
357
- const rawPort = event.ports[0];
358
- if (rawPort === undefined)
359
- return;
360
- ports.add(rawPort);
361
- // Send current status to the new port
362
- try {
363
- rawPort.postMessage(JSON.stringify({
364
- type: "status",
365
- status: getStatus(),
366
- }));
367
- }
368
- catch {
369
- // Port not ready yet
370
- }
371
- rawPort.onmessage = (e) => {
372
- const parsed = JSON.parse(typeof e.data === "string" ? e.data : String(e.data));
373
- if (isRelayInbound(parsed)) {
374
- handlePortMessage(parsed);
375
- }
376
- };
377
- });
378
- export {};
379
- //# sourceMappingURL=relay-worker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"relay-worker.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/relay-worker.ts"],"names":[],"mappings":"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"}