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.
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +1 -1
- package/dist/bridges/claude-code/channel.d.ts.map +1 -1
- package/dist/bridges/claude-code/channel.js +6 -1
- package/dist/bridges/claude-code/channel.js.map +1 -1
- package/dist/bridges/codex/tool.d.ts.map +1 -1
- package/dist/bridges/codex/tool.js +6 -1
- package/dist/bridges/codex/tool.js.map +1 -1
- package/dist/bridges/mcp/index.d.ts.map +1 -1
- package/dist/bridges/mcp/index.js +6 -1
- package/dist/bridges/mcp/index.js.map +1 -1
- package/dist/bridges/opencode/plugin.d.ts.map +1 -1
- package/dist/bridges/opencode/plugin.js +5 -0
- package/dist/bridges/opencode/plugin.js.map +1 -1
- package/dist/bridges/pi/index.d.ts.map +1 -1
- package/dist/bridges/pi/index.js +39 -17
- package/dist/bridges/pi/index.js.map +1 -1
- package/dist/bridges/user/controller.d.ts +9 -1
- package/dist/bridges/user/controller.d.ts.map +1 -1
- package/dist/bridges/user/controller.js +25 -1
- package/dist/bridges/user/controller.js.map +1 -1
- package/dist/bridges/user/tui.js +2 -0
- package/dist/bridges/user/tui.js.map +1 -1
- package/dist/bridges/user/web/build.d.ts +2 -0
- package/dist/bridges/user/web/build.d.ts.map +1 -1
- package/dist/bridges/user/web/build.js +44 -0
- package/dist/bridges/user/web/build.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/App.d.ts +5 -0
- package/dist/bridges/user/web/frontend/components/App.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/App.js +1 -1
- package/dist/bridges/user/web/frontend/components/App.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/ProjectTree.js +6 -3
- package/dist/bridges/user/web/frontend/components/ProjectTree.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/RelayPanel.d.ts +15 -0
- package/dist/bridges/user/web/frontend/components/RelayPanel.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/components/RelayPanel.js +46 -0
- package/dist/bridges/user/web/frontend/components/RelayPanel.js.map +1 -0
- package/dist/bridges/user/web/frontend/components/Sidebar.d.ts +7 -2
- package/dist/bridges/user/web/frontend/components/Sidebar.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/Sidebar.js +15 -9
- package/dist/bridges/user/web/frontend/components/Sidebar.js.map +1 -1
- package/dist/bridges/user/web/frontend/input.js +1 -1
- package/dist/bridges/user/web/frontend/input.js.map +1 -1
- package/dist/bridges/user/web/frontend/main.js +73 -5
- package/dist/bridges/user/web/frontend/main.js.map +1 -1
- package/dist/bridges/user/web/frontend/mesh-client.d.ts +43 -0
- package/dist/bridges/user/web/frontend/mesh-client.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/mesh-client.js +132 -0
- package/dist/bridges/user/web/frontend/mesh-client.js.map +1 -0
- package/dist/bridges/user/web/frontend/mesh-worker.d.ts +14 -0
- package/dist/bridges/user/web/frontend/mesh-worker.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/mesh-worker.js +274 -0
- package/dist/bridges/user/web/frontend/mesh-worker.js.map +1 -0
- package/dist/bridges/user/web/frontend/relay-client.d.ts +40 -0
- package/dist/bridges/user/web/frontend/relay-client.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/relay-client.js +97 -0
- package/dist/bridges/user/web/frontend/relay-client.js.map +1 -0
- package/dist/bridges/user/web/frontend/relay-worker.d.ts +15 -0
- package/dist/bridges/user/web/frontend/relay-worker.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/relay-worker.js +366 -0
- package/dist/bridges/user/web/frontend/relay-worker.js.map +1 -0
- package/dist/bridges/user/web/frontend/sw.d.ts +16 -0
- package/dist/bridges/user/web/frontend/sw.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/sw.js +145 -0
- package/dist/bridges/user/web/frontend/sw.js.map +1 -0
- package/dist/bridges/user/web/frontend/url-sync.d.ts +48 -0
- package/dist/bridges/user/web/frontend/url-sync.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/url-sync.js +74 -0
- package/dist/bridges/user/web/frontend/url-sync.js.map +1 -0
- package/dist/bridges/user/web/server.d.ts +10 -3
- package/dist/bridges/user/web/server.d.ts.map +1 -1
- package/dist/bridges/user/web/server.js +254 -12
- package/dist/bridges/user/web/server.js.map +1 -1
- package/dist/core/bridge.d.ts +28 -0
- package/dist/core/bridge.d.ts.map +1 -1
- package/dist/core/bridge.js +137 -0
- package/dist/core/bridge.js.map +1 -1
- package/dist/core/comms-store.d.ts +22 -1
- package/dist/core/comms-store.d.ts.map +1 -1
- package/dist/core/discovery-mdns.d.ts +33 -0
- package/dist/core/discovery-mdns.d.ts.map +1 -0
- package/dist/core/discovery-mdns.js +182 -0
- package/dist/core/discovery-mdns.js.map +1 -0
- package/dist/core/discovery-tailscale.d.ts +40 -0
- package/dist/core/discovery-tailscale.d.ts.map +1 -0
- package/dist/core/discovery-tailscale.js +158 -0
- package/dist/core/discovery-tailscale.js.map +1 -0
- package/dist/core/discovery.d.ts +82 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/core/discovery.js +194 -0
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/federation.d.ts +100 -0
- package/dist/core/federation.d.ts.map +1 -0
- package/dist/core/federation.js +411 -0
- package/dist/core/federation.js.map +1 -0
- package/dist/core/identity.d.ts +31 -0
- package/dist/core/identity.d.ts.map +1 -0
- package/dist/core/identity.js +251 -0
- package/dist/core/identity.js.map +1 -0
- package/dist/core/index.d.ts +11 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/mesh-store.d.ts +72 -26
- package/dist/core/mesh-store.d.ts.map +1 -1
- package/dist/core/mesh-store.js +467 -352
- package/dist/core/mesh-store.js.map +1 -1
- package/dist/core/push-manager.d.ts +41 -0
- package/dist/core/push-manager.d.ts.map +1 -0
- package/dist/core/push-manager.js +60 -0
- package/dist/core/push-manager.js.map +1 -0
- package/dist/core/store.d.ts +21 -1
- package/dist/core/store.d.ts.map +1 -1
- package/dist/core/store.js +44 -0
- package/dist/core/store.js.map +1 -1
- package/dist/core/tcp-transport.d.ts +77 -0
- package/dist/core/tcp-transport.d.ts.map +1 -0
- package/dist/core/tcp-transport.js +596 -0
- package/dist/core/tcp-transport.js.map +1 -0
- package/dist/core/test/identity.unit.test.d.ts +5 -0
- package/dist/core/test/identity.unit.test.d.ts.map +1 -0
- package/dist/core/test/identity.unit.test.js +70 -0
- package/dist/core/test/identity.unit.test.js.map +1 -0
- package/dist/core/tls-transport.d.ts +69 -0
- package/dist/core/tls-transport.d.ts.map +1 -0
- package/dist/core/tls-transport.js +602 -0
- package/dist/core/tls-transport.js.map +1 -0
- package/dist/core/tool.d.ts +23 -2
- package/dist/core/tool.d.ts.map +1 -1
- package/dist/core/tool.js +269 -1
- package/dist/core/tool.js.map +1 -1
- package/dist/core/transport.d.ts +166 -0
- package/dist/core/transport.d.ts.map +1 -0
- package/dist/core/transport.js +20 -0
- package/dist/core/transport.js.map +1 -0
- package/dist/core/types.d.ts +136 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +71 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/vapid.d.ts +22 -0
- package/dist/core/vapid.d.ts.map +1 -0
- package/dist/core/vapid.js +50 -0
- package/dist/core/vapid.js.map +1 -0
- package/dist/core/web-push.d.ts +37 -0
- package/dist/core/web-push.d.ts.map +1 -0
- package/dist/core/web-push.js +198 -0
- package/dist/core/web-push.js.map +1 -0
- package/dist/core/wire-protocol.d.ts +131 -0
- package/dist/core/wire-protocol.d.ts.map +1 -0
- package/dist/core/wire-protocol.js +54 -0
- package/dist/core/wire-protocol.js.map +1 -0
- package/dist/core/ws-transport.d.ts +71 -0
- package/dist/core/ws-transport.d.ts.map +1 -0
- package/dist/core/ws-transport.js +560 -0
- package/dist/core/ws-transport.js.map +1 -0
- package/dist/test/approval.integration.test.d.ts +9 -0
- package/dist/test/approval.integration.test.d.ts.map +1 -0
- package/dist/test/approval.integration.test.js +361 -0
- package/dist/test/approval.integration.test.js.map +1 -0
- package/dist/test/delivery-receipt.helper.d.ts +16 -0
- package/dist/test/delivery-receipt.helper.d.ts.map +1 -0
- package/dist/test/delivery-receipt.helper.js +409 -0
- package/dist/test/delivery-receipt.helper.js.map +1 -0
- package/dist/test/delivery-receipt.runner.d.ts +13 -0
- package/dist/test/delivery-receipt.runner.d.ts.map +1 -0
- package/dist/test/delivery-receipt.runner.js +51 -0
- package/dist/test/delivery-receipt.runner.js.map +1 -0
- package/dist/test/federation.integration.test.d.ts +15 -0
- package/dist/test/federation.integration.test.d.ts.map +1 -0
- package/dist/test/federation.integration.test.js +218 -0
- package/dist/test/federation.integration.test.js.map +1 -0
- package/dist/test/listener-policy.integration.test.d.ts +9 -0
- package/dist/test/listener-policy.integration.test.d.ts.map +1 -0
- package/dist/test/listener-policy.integration.test.js +239 -0
- package/dist/test/listener-policy.integration.test.js.map +1 -0
- package/dist/test/tls-transport.integration.test.d.ts +8 -0
- package/dist/test/tls-transport.integration.test.d.ts.map +1 -0
- package/dist/test/tls-transport.integration.test.js +158 -0
- package/dist/test/tls-transport.integration.test.js.map +1 -0
- package/dist/test/visibility.integration.test.d.ts +12 -0
- package/dist/test/visibility.integration.test.d.ts.map +1 -0
- package/dist/test/visibility.integration.test.js +181 -0
- package/dist/test/visibility.integration.test.js.map +1 -0
- 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"}
|