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.
- 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 +5 -2
- package/dist/bridges/pi/index.d.ts.map +1 -1
- package/dist/bridges/pi/index.js +125 -20
- package/dist/bridges/pi/index.js.map +1 -1
- package/dist/bridges/user/controller.d.ts +10 -1
- package/dist/bridges/user/controller.d.ts.map +1 -1
- package/dist/bridges/user/controller.js +37 -1
- package/dist/bridges/user/controller.js.map +1 -1
- package/dist/bridges/user/tui.js +4 -0
- package/dist/bridges/user/tui.js.map +1 -1
- package/dist/bridges/user/web/build.d.ts +4 -4
- package/dist/bridges/user/web/build.js +53 -34
- package/dist/bridges/user/web/build.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/App.d.ts +28 -0
- package/dist/bridges/user/web/frontend/components/App.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/components/App.js +7 -0
- package/dist/bridges/user/web/frontend/components/App.js.map +1 -0
- package/dist/bridges/user/web/frontend/components/ChatArea.d.ts +14 -0
- package/dist/bridges/user/web/frontend/components/ChatArea.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/components/ChatArea.js +38 -0
- package/dist/bridges/user/web/frontend/components/ChatArea.js.map +1 -0
- package/dist/bridges/user/web/frontend/components/CreateRoomForm.d.ts +11 -0
- package/dist/bridges/user/web/frontend/components/CreateRoomForm.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/components/CreateRoomForm.js +33 -0
- package/dist/bridges/user/web/frontend/components/CreateRoomForm.js.map +1 -0
- package/dist/bridges/user/web/frontend/components/JoinForm.d.ts +11 -0
- package/dist/bridges/user/web/frontend/components/JoinForm.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/components/JoinForm.js +28 -0
- package/dist/bridges/user/web/frontend/components/JoinForm.js.map +1 -0
- package/dist/bridges/user/web/frontend/components/Message.d.ts +8 -0
- package/dist/bridges/user/web/frontend/components/Message.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/components/Message.js +15 -0
- package/dist/bridges/user/web/frontend/components/Message.js.map +1 -0
- package/dist/bridges/user/web/frontend/components/MessageList.d.ts +8 -0
- package/dist/bridges/user/web/frontend/components/MessageList.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/components/MessageList.js +16 -0
- package/dist/bridges/user/web/frontend/components/MessageList.js.map +1 -0
- package/dist/bridges/user/web/frontend/components/ProjectTree.d.ts +17 -0
- package/dist/bridges/user/web/frontend/components/ProjectTree.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/components/ProjectTree.js +62 -0
- package/dist/bridges/user/web/frontend/components/ProjectTree.js.map +1 -0
- 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 +21 -0
- package/dist/bridges/user/web/frontend/components/Sidebar.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/components/Sidebar.js +37 -0
- package/dist/bridges/user/web/frontend/components/Sidebar.js.map +1 -0
- package/dist/bridges/user/web/frontend/dom.d.ts +12 -22
- package/dist/bridges/user/web/frontend/dom.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/dom.js +24 -49
- package/dist/bridges/user/web/frontend/dom.js.map +1 -1
- package/dist/bridges/user/web/frontend/input.d.ts +15 -0
- package/dist/bridges/user/web/frontend/input.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/input.js +39 -1
- package/dist/bridges/user/web/frontend/input.js.map +1 -1
- package/dist/bridges/user/web/frontend/main.d.ts +3 -3
- package/dist/bridges/user/web/frontend/main.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/main.js +135 -52
- 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/messages.d.ts +17 -0
- package/dist/bridges/user/web/frontend/messages.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/messages.js +82 -0
- package/dist/bridges/user/web/frontend/messages.js.map +1 -0
- package/dist/bridges/user/web/frontend/project-tree.d.ts +9 -0
- package/dist/bridges/user/web/frontend/project-tree.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/project-tree.js +173 -0
- package/dist/bridges/user/web/frontend/project-tree.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/state.d.ts +8 -1
- package/dist/bridges/user/web/frontend/state.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/state.js +17 -1
- package/dist/bridges/user/web/frontend/state.js.map +1 -1
- 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/types.d.ts +52 -0
- package/dist/bridges/user/web/frontend/types.d.ts.map +1 -1
- 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 +280 -15
- package/dist/bridges/user/web/server.js.map +1 -1
- package/dist/bridges/user/web/test/web-server.integration.test.d.ts +7 -0
- package/dist/bridges/user/web/test/web-server.integration.test.d.ts.map +1 -0
- package/dist/bridges/user/web/test/web-server.integration.test.js +187 -0
- package/dist/bridges/user/web/test/web-server.integration.test.js.map +1 -0
- package/dist/core/bridge.d.ts +43 -0
- package/dist/core/bridge.d.ts.map +1 -1
- package/dist/core/bridge.js +197 -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 +12 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +7 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/mesh-store.d.ts +75 -26
- package/dist/core/mesh-store.d.ts.map +1 -1
- package/dist/core/mesh-store.js +570 -355
- 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/bridge.unit.test.d.ts +5 -0
- package/dist/core/test/bridge.unit.test.d.ts.map +1 -0
- package/dist/core/test/bridge.unit.test.js +120 -0
- package/dist/core/test/bridge.unit.test.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 +146 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +77 -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 +7 -3
- package/dist/bridges/user/web/frontend/render.d.ts +0 -30
- package/dist/bridges/user/web/frontend/render.d.ts.map +0 -1
- package/dist/bridges/user/web/frontend/render.js +0 -129
- package/dist/bridges/user/web/frontend/render.js.map +0 -1
- package/dist/bridges/user/web/frontend/test/dom.unit.test.d.ts +0 -5
- package/dist/bridges/user/web/frontend/test/dom.unit.test.d.ts.map +0 -1
- package/dist/bridges/user/web/frontend/test/dom.unit.test.js +0 -149
- package/dist/bridges/user/web/frontend/test/dom.unit.test.js.map +0 -1
- package/dist/bridges/user/web/frontend/test/input.unit.test.d.ts +0 -5
- package/dist/bridges/user/web/frontend/test/input.unit.test.d.ts.map +0 -1
- package/dist/bridges/user/web/frontend/test/input.unit.test.js +0 -131
- package/dist/bridges/user/web/frontend/test/input.unit.test.js.map +0 -1
- package/dist/bridges/user/web/frontend/test/render.unit.test.d.ts +0 -5
- package/dist/bridges/user/web/frontend/test/render.unit.test.d.ts.map +0 -1
- package/dist/bridges/user/web/frontend/test/render.unit.test.js +0 -436
- package/dist/bridges/user/web/frontend/test/render.unit.test.js.map +0 -1
- package/dist/bridges/user/web/frontend/test/state.unit.test.d.ts +0 -5
- package/dist/bridges/user/web/frontend/test/state.unit.test.d.ts.map +0 -1
- package/dist/bridges/user/web/frontend/test/state.unit.test.js +0 -119
- package/dist/bridges/user/web/frontend/test/state.unit.test.js.map +0 -1
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SharedWorker — browser mesh node.
|
|
3
|
+
*
|
|
4
|
+
* Runs a lightweight mesh state store connected to the server's /ws/mesh
|
|
5
|
+
* endpoint. Maintains a local copy of all mesh state (agents, rooms,
|
|
6
|
+
* messages, DMs) by applying state_sync and state_update patches received
|
|
7
|
+
* over WebSocket. Exposes a postMessage API for the main thread to query
|
|
8
|
+
* state, execute actions, and subscribe to real-time updates.
|
|
9
|
+
*
|
|
10
|
+
* Built as a separate IIFE bundle (mesh-worker.js) so the SharedWorker
|
|
11
|
+
* runs in its own global scope independent of the main app bundle.
|
|
12
|
+
*/
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Lightweight mesh state
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
const agents = new Map();
|
|
17
|
+
const rooms = new Map();
|
|
18
|
+
const messages = new Map();
|
|
19
|
+
const dms = new Map();
|
|
20
|
+
function applyStateSync(state) {
|
|
21
|
+
for (const [id, agent] of Object.entries(state.agents)) {
|
|
22
|
+
agents.set(id, agent);
|
|
23
|
+
}
|
|
24
|
+
for (const [id, room] of Object.entries(state.rooms)) {
|
|
25
|
+
rooms.set(id, room);
|
|
26
|
+
}
|
|
27
|
+
for (const [id, msgs] of Object.entries(state.messages)) {
|
|
28
|
+
messages.set(id, msgs);
|
|
29
|
+
}
|
|
30
|
+
for (const [id, dmMsgs] of Object.entries(state.dms)) {
|
|
31
|
+
dms.set(id, dmMsgs);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function applyPatch(patch) {
|
|
35
|
+
switch (patch.type) {
|
|
36
|
+
case "agent_upsert": {
|
|
37
|
+
const existing = agents.get(patch.agent.id);
|
|
38
|
+
if (existing) {
|
|
39
|
+
const merged = patch.agent;
|
|
40
|
+
for (const r of existing.subscribedRooms) {
|
|
41
|
+
if (!merged.subscribedRooms.includes(r)) {
|
|
42
|
+
merged.subscribedRooms.push(r);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
agents.set(merged.id, merged);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
agents.set(patch.agent.id, patch.agent);
|
|
49
|
+
}
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
case "agent_offline": {
|
|
53
|
+
const agent = agents.get(patch.agentId);
|
|
54
|
+
if (agent) {
|
|
55
|
+
agent.status = "offline";
|
|
56
|
+
agents.set(patch.agentId, agent);
|
|
57
|
+
}
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
case "room_upsert": {
|
|
61
|
+
const existing = rooms.get(patch.room.id);
|
|
62
|
+
if (existing) {
|
|
63
|
+
const merged = patch.room;
|
|
64
|
+
for (const m of existing.members) {
|
|
65
|
+
if (!merged.members.includes(m))
|
|
66
|
+
merged.members.push(m);
|
|
67
|
+
}
|
|
68
|
+
rooms.set(merged.id, merged);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
rooms.set(patch.room.id, patch.room);
|
|
72
|
+
}
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
case "room_delete":
|
|
76
|
+
rooms.delete(patch.roomId);
|
|
77
|
+
break;
|
|
78
|
+
case "message_add": {
|
|
79
|
+
const arr = messages.get(patch.roomId) ?? [];
|
|
80
|
+
arr.push(patch.message);
|
|
81
|
+
messages.set(patch.roomId, arr);
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
case "dm_add": {
|
|
85
|
+
const arr = dms.get(patch.key) ?? [];
|
|
86
|
+
arr.push(patch.message);
|
|
87
|
+
dms.set(patch.key, arr);
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
case "delivery":
|
|
91
|
+
// Delivery events are forwarded to the main thread as patches.
|
|
92
|
+
break;
|
|
93
|
+
case "message_read": {
|
|
94
|
+
if (patch.room) {
|
|
95
|
+
const msgs = messages.get(patch.room);
|
|
96
|
+
if (msgs) {
|
|
97
|
+
const msg = msgs.find((m) => m.id === patch.messageId);
|
|
98
|
+
if (msg && !msg.readBy.includes(patch.readBy)) {
|
|
99
|
+
msg.readBy.push(patch.readBy);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
for (const [, dmMsgs] of dms) {
|
|
105
|
+
const msg = dmMsgs.find((m) => m.id === patch.messageId);
|
|
106
|
+
if (msg && !msg.readBy.includes(patch.readBy)) {
|
|
107
|
+
msg.readBy.push(patch.readBy);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function getStateSnapshot() {
|
|
116
|
+
return {
|
|
117
|
+
agents: [...agents.values()],
|
|
118
|
+
rooms: [...rooms.values()],
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
// WebSocket connection to /ws/mesh
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
let ws;
|
|
125
|
+
let reconnectTimer;
|
|
126
|
+
let wsUrl;
|
|
127
|
+
function connect(url) {
|
|
128
|
+
wsUrl = url;
|
|
129
|
+
if (reconnectTimer !== undefined) {
|
|
130
|
+
clearTimeout(reconnectTimer);
|
|
131
|
+
reconnectTimer = undefined;
|
|
132
|
+
}
|
|
133
|
+
const socket = new WebSocket(url);
|
|
134
|
+
ws = socket;
|
|
135
|
+
socket.onopen = () => {
|
|
136
|
+
broadcastToPorts({ type: "connected" });
|
|
137
|
+
};
|
|
138
|
+
socket.onclose = () => {
|
|
139
|
+
ws = undefined;
|
|
140
|
+
broadcastToPorts({ type: "disconnected" });
|
|
141
|
+
scheduleReconnect();
|
|
142
|
+
};
|
|
143
|
+
socket.onerror = () => {
|
|
144
|
+
// onclose fires after this
|
|
145
|
+
};
|
|
146
|
+
socket.onmessage = (event) => {
|
|
147
|
+
const raw = JSON.parse(typeof event.data === "string" ? event.data : String(event.data));
|
|
148
|
+
handleServerMessage(raw);
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function scheduleReconnect() {
|
|
152
|
+
if (!wsUrl)
|
|
153
|
+
return;
|
|
154
|
+
reconnectTimer = setTimeout(() => {
|
|
155
|
+
if (wsUrl)
|
|
156
|
+
connect(wsUrl);
|
|
157
|
+
}, 3000);
|
|
158
|
+
}
|
|
159
|
+
function handleServerMessage(raw) {
|
|
160
|
+
if (isMeshStateMessage(raw)) {
|
|
161
|
+
if (raw.method === "state_sync") {
|
|
162
|
+
applyStateSync(raw.state);
|
|
163
|
+
broadcastToPorts({ type: "state", state: getStateSnapshot() });
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
applyPatch(raw.patch);
|
|
167
|
+
broadcastToPorts({ type: "patch", patch: raw.patch });
|
|
168
|
+
}
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
// Action responses from the server — { type: "result" } or { type: "error" }
|
|
172
|
+
if (typeof raw === "object" && raw !== null && "type" in raw) {
|
|
173
|
+
if (raw.type === "result" &&
|
|
174
|
+
"result" in raw &&
|
|
175
|
+
typeof raw.result === "object" &&
|
|
176
|
+
raw.result !== null &&
|
|
177
|
+
"content" in raw.result &&
|
|
178
|
+
typeof raw.result.content === "string" &&
|
|
179
|
+
"isError" in raw.result &&
|
|
180
|
+
typeof raw.result.isError === "boolean") {
|
|
181
|
+
broadcastToPorts({
|
|
182
|
+
type: "actionResult",
|
|
183
|
+
id: "",
|
|
184
|
+
result: { content: raw.result.content, isError: raw.result.isError },
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
else if (raw.type === "error" &&
|
|
188
|
+
"message" in raw &&
|
|
189
|
+
typeof raw.message === "string") {
|
|
190
|
+
broadcastToPorts({
|
|
191
|
+
type: "actionError",
|
|
192
|
+
id: "",
|
|
193
|
+
message: raw.message,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
function isMeshStateMessage(value) {
|
|
199
|
+
if (typeof value !== "object" || value === null)
|
|
200
|
+
return false;
|
|
201
|
+
if (!("method" in value))
|
|
202
|
+
return false;
|
|
203
|
+
const method = value.method;
|
|
204
|
+
return (typeof method === "string" &&
|
|
205
|
+
(method === "state_sync" || method === "state_update"));
|
|
206
|
+
}
|
|
207
|
+
// ---------------------------------------------------------------------------
|
|
208
|
+
// Port management — fan-out to all connected main-thread tabs
|
|
209
|
+
// ---------------------------------------------------------------------------
|
|
210
|
+
const ports = new Set();
|
|
211
|
+
function broadcastToPorts(msg) {
|
|
212
|
+
const data = JSON.stringify(msg);
|
|
213
|
+
for (const port of ports) {
|
|
214
|
+
try {
|
|
215
|
+
port.postMessage(data);
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// Port closed — cleaned up via port.onmessage error
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
function handlePortMessage(msg) {
|
|
223
|
+
switch (msg.type) {
|
|
224
|
+
case "init":
|
|
225
|
+
connect(msg.url);
|
|
226
|
+
break;
|
|
227
|
+
case "action": {
|
|
228
|
+
if (ws?.readyState === WebSocket.OPEN) {
|
|
229
|
+
ws.send(JSON.stringify(msg.action));
|
|
230
|
+
}
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
case "getState":
|
|
234
|
+
broadcastToPorts({ type: "state", state: getStateSnapshot() });
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
function isWorkerInbound(value) {
|
|
239
|
+
if (typeof value !== "object" || value === null)
|
|
240
|
+
return false;
|
|
241
|
+
if (!("type" in value))
|
|
242
|
+
return false;
|
|
243
|
+
const t = value.type;
|
|
244
|
+
return (typeof t === "string" &&
|
|
245
|
+
(t === "init" || t === "action" || t === "getState"));
|
|
246
|
+
}
|
|
247
|
+
// ---------------------------------------------------------------------------
|
|
248
|
+
// Entry point — listen for SharedWorker connections
|
|
249
|
+
// ---------------------------------------------------------------------------
|
|
250
|
+
self.addEventListener("connect", (event) => {
|
|
251
|
+
const rawPort = event.ports[0];
|
|
252
|
+
if (rawPort === undefined)
|
|
253
|
+
return;
|
|
254
|
+
// MessagePort satisfies MessagePortLike (has postMessage, close, onmessage)
|
|
255
|
+
ports.add(rawPort);
|
|
256
|
+
// Send current state to the new port
|
|
257
|
+
try {
|
|
258
|
+
rawPort.postMessage(JSON.stringify({
|
|
259
|
+
type: "state",
|
|
260
|
+
state: getStateSnapshot(),
|
|
261
|
+
}));
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
// Port not ready yet — will get state on next update
|
|
265
|
+
}
|
|
266
|
+
rawPort.onmessage = (e) => {
|
|
267
|
+
const parsed = JSON.parse(typeof e.data === "string" ? e.data : String(e.data));
|
|
268
|
+
if (isWorkerInbound(parsed)) {
|
|
269
|
+
handlePortMessage(parsed);
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
});
|
|
273
|
+
export {};
|
|
274
|
+
//# sourceMappingURL=mesh-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesh-worker.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/mesh-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message conversion — transforms wire-format events into display messages.
|
|
3
|
+
*
|
|
4
|
+
* Pure functions, no DOM or state dependency. Testable in isolation.
|
|
5
|
+
*/
|
|
6
|
+
import type { DeliveryEvent, DisplayMessage, RoomMessage } from "./types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Convert a delivery event to a display message for the UI.
|
|
9
|
+
* Returns undefined if the event should not be displayed
|
|
10
|
+
* (e.g. room_message for a room that isn't currently active).
|
|
11
|
+
*/
|
|
12
|
+
export declare function deliveryEventToMessage(event: DeliveryEvent, currentRoom: string | undefined): DisplayMessage | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* Convert a room message (from REST API history) to a display message.
|
|
15
|
+
*/
|
|
16
|
+
export declare function roomMessageToDisplay(m: RoomMessage): DisplayMessage;
|
|
17
|
+
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/messages.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE7E;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,cAAc,GAAG,SAAS,CAoE5B;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,WAAW,GAAG,cAAc,CAOnE"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message conversion — transforms wire-format events into display messages.
|
|
3
|
+
*
|
|
4
|
+
* Pure functions, no DOM or state dependency. Testable in isolation.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Convert a delivery event to a display message for the UI.
|
|
8
|
+
* Returns undefined if the event should not be displayed
|
|
9
|
+
* (e.g. room_message for a room that isn't currently active).
|
|
10
|
+
*/
|
|
11
|
+
export function deliveryEventToMessage(event, currentRoom) {
|
|
12
|
+
switch (event.type) {
|
|
13
|
+
case "room_message":
|
|
14
|
+
if (currentRoom === event.message.room) {
|
|
15
|
+
return {
|
|
16
|
+
type: "chat",
|
|
17
|
+
sender: event.message.from,
|
|
18
|
+
content: event.message.content,
|
|
19
|
+
timestamp: event.message.timestamp,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return undefined;
|
|
23
|
+
case "dm":
|
|
24
|
+
return {
|
|
25
|
+
type: "dm",
|
|
26
|
+
sender: event.message.from,
|
|
27
|
+
content: event.message.content,
|
|
28
|
+
timestamp: event.message.timestamp,
|
|
29
|
+
};
|
|
30
|
+
case "member_joined":
|
|
31
|
+
return { type: "system", text: `${event.agent} joined ${event.room}` };
|
|
32
|
+
case "member_left":
|
|
33
|
+
return { type: "system", text: `${event.agent} left ${event.room}` };
|
|
34
|
+
case "member_status":
|
|
35
|
+
return {
|
|
36
|
+
type: "status",
|
|
37
|
+
text: `${event.agent} is now ${event.status} in ${event.room}`,
|
|
38
|
+
};
|
|
39
|
+
case "delivery_status":
|
|
40
|
+
return {
|
|
41
|
+
type: "status",
|
|
42
|
+
text: `Message ${event.messageId} ${event.status} by ${event.agent}`,
|
|
43
|
+
};
|
|
44
|
+
case "room_members":
|
|
45
|
+
if (currentRoom === event.room) {
|
|
46
|
+
const memberList = event.members
|
|
47
|
+
.map((m) => `${m.name} (${m.status})`)
|
|
48
|
+
.join(", ");
|
|
49
|
+
return { type: "system", text: `Members: ${memberList}` };
|
|
50
|
+
}
|
|
51
|
+
return undefined;
|
|
52
|
+
case "room_invite": {
|
|
53
|
+
const desc = event.roomDescription ? ` — ${event.roomDescription}` : "";
|
|
54
|
+
return {
|
|
55
|
+
type: "system",
|
|
56
|
+
text: `${event.fromName} invited you to "${event.room}"${desc}`,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
case "invite_declined":
|
|
60
|
+
return {
|
|
61
|
+
type: "system",
|
|
62
|
+
text: `${event.agentName} declined invite to ${event.room}: "${event.reason}"`,
|
|
63
|
+
};
|
|
64
|
+
case "name_changed":
|
|
65
|
+
return {
|
|
66
|
+
type: "system",
|
|
67
|
+
text: `${event.oldName} is now known as ${event.newName}`,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Convert a room message (from REST API history) to a display message.
|
|
73
|
+
*/
|
|
74
|
+
export function roomMessageToDisplay(m) {
|
|
75
|
+
return {
|
|
76
|
+
type: "chat",
|
|
77
|
+
sender: m.from,
|
|
78
|
+
content: m.content,
|
|
79
|
+
timestamp: m.timestamp,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/messages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project tree — builds a nested directory tree from agent working directories.
|
|
3
|
+
*
|
|
4
|
+
* Pure function: agents + rooms → ProjectTree. No side effects.
|
|
5
|
+
* Project rooms (auto-created per cwd) are embedded in their directory nodes.
|
|
6
|
+
*/
|
|
7
|
+
import type { Agent, ProjectTree, Room } from "./types.js";
|
|
8
|
+
export declare function buildProjectTree(agents: Agent[], rooms: Room[]): ProjectTree;
|
|
9
|
+
//# sourceMappingURL=project-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-tree.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/project-tree.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAY,MAAM,YAAY,CAAC;AA0DrE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,WAAW,CA8C5E"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project tree — builds a nested directory tree from agent working directories.
|
|
3
|
+
*
|
|
4
|
+
* Pure function: agents + rooms → ProjectTree. No side effects.
|
|
5
|
+
* Project rooms (auto-created per cwd) are embedded in their directory nodes.
|
|
6
|
+
*/
|
|
7
|
+
function insertIntoTrie(node, segments, agent) {
|
|
8
|
+
const [seg, ...rest] = segments;
|
|
9
|
+
if (seg === undefined) {
|
|
10
|
+
node.agents.push(agent);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
let target = node.children.get(seg);
|
|
14
|
+
if (!target) {
|
|
15
|
+
target = { children: new Map(), agents: [] };
|
|
16
|
+
node.children.set(seg, target);
|
|
17
|
+
}
|
|
18
|
+
insertIntoTrie(target, rest, agent);
|
|
19
|
+
}
|
|
20
|
+
/** Ensure a branch path exists in the trie (creates intermediate nodes). */
|
|
21
|
+
function ensureBranch(node, segments) {
|
|
22
|
+
const [seg, ...rest] = segments;
|
|
23
|
+
if (seg === undefined)
|
|
24
|
+
return;
|
|
25
|
+
let child = node.children.get(seg);
|
|
26
|
+
if (!child) {
|
|
27
|
+
child = { children: new Map(), agents: [] };
|
|
28
|
+
node.children.set(seg, child);
|
|
29
|
+
}
|
|
30
|
+
ensureBranch(child, rest);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Build a nested project tree from agent cwd paths.
|
|
34
|
+
*
|
|
35
|
+
* - Trims the longest common prefix shared by ALL agent paths.
|
|
36
|
+
* - Agents in parent directories appear alongside child directories.
|
|
37
|
+
* - Empty branches are pruned.
|
|
38
|
+
* - Manual rooms (not auto-created per cwd) are separated out.
|
|
39
|
+
* - Children sorted: directories first (alphabetical), then agents (alphabetical).
|
|
40
|
+
*/
|
|
41
|
+
const PROJECT_ROOM_PREFIX = "Project room for ";
|
|
42
|
+
/** Check if a room is an auto-created project room. */
|
|
43
|
+
function isProjectRoom(room) {
|
|
44
|
+
return room.description.startsWith(PROJECT_ROOM_PREFIX);
|
|
45
|
+
}
|
|
46
|
+
/** Extract the cwd path from a project room's description. */
|
|
47
|
+
function projectRoomCwd(room) {
|
|
48
|
+
return room.description.slice(PROJECT_ROOM_PREFIX.length);
|
|
49
|
+
}
|
|
50
|
+
export function buildProjectTree(agents, rooms) {
|
|
51
|
+
const manualRooms = rooms.filter((r) => !isProjectRoom(r));
|
|
52
|
+
// Index project rooms by their cwd path
|
|
53
|
+
const projectRoomsByPath = new Map();
|
|
54
|
+
for (const room of rooms) {
|
|
55
|
+
if (isProjectRoom(room)) {
|
|
56
|
+
projectRoomsByPath.set(projectRoomCwd(room), room);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Use all project rooms as tree nodes even if no agents are in that directory
|
|
60
|
+
const allPaths = new Set();
|
|
61
|
+
for (const agent of agents) {
|
|
62
|
+
allPaths.add(agent.cwd);
|
|
63
|
+
}
|
|
64
|
+
for (const cwd of projectRoomsByPath.keys()) {
|
|
65
|
+
allPaths.add(cwd);
|
|
66
|
+
}
|
|
67
|
+
if (allPaths.size === 0) {
|
|
68
|
+
return { roots: [], manualRooms };
|
|
69
|
+
}
|
|
70
|
+
const paths = Array.from(allPaths);
|
|
71
|
+
const prefix = commonPathPrefix(paths);
|
|
72
|
+
const prefixSegments = prefix === "/" ? [] : splitPath(prefix);
|
|
73
|
+
// Group agents by their trimmed path
|
|
74
|
+
const root = { children: new Map(), agents: [] };
|
|
75
|
+
for (const agent of agents) {
|
|
76
|
+
const segments = splitPath(agent.cwd).slice(prefixSegments.length);
|
|
77
|
+
insertIntoTrie(root, segments, agent);
|
|
78
|
+
}
|
|
79
|
+
// Ensure directory branches exist for project room paths that have no agents
|
|
80
|
+
for (const cwd of projectRoomsByPath.keys()) {
|
|
81
|
+
const segments = splitPath(cwd).slice(prefixSegments.length);
|
|
82
|
+
ensureBranch(root, segments);
|
|
83
|
+
}
|
|
84
|
+
// Convert branch tree to TreeNode tree, embedding project rooms
|
|
85
|
+
const roots = branchToNodesWithRooms(root, prefix, "", projectRoomsByPath);
|
|
86
|
+
return { roots: sortChildren(roots), manualRooms };
|
|
87
|
+
}
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
// Internal helpers
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
function splitPath(p) {
|
|
92
|
+
// "/Users/joe/Developer" → ["Users", "joe", "Developer"]
|
|
93
|
+
return p.split("/").filter((s) => s.length > 0);
|
|
94
|
+
}
|
|
95
|
+
function joinPath(...segments) {
|
|
96
|
+
return "/" + segments.join("/");
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Find the longest common parent directory among all paths.
|
|
100
|
+
* Returns "/" if there's no common prefix beyond root.
|
|
101
|
+
*/
|
|
102
|
+
function commonPathPrefix(paths) {
|
|
103
|
+
if (paths.length === 0)
|
|
104
|
+
return "/";
|
|
105
|
+
const split = paths.map(splitPath);
|
|
106
|
+
const minLength = Math.min(...split.map((s) => s.length));
|
|
107
|
+
let commonLen = 0;
|
|
108
|
+
for (let i = 0; i < minLength; i++) {
|
|
109
|
+
const segment = split[0]?.[i];
|
|
110
|
+
if (segment === undefined)
|
|
111
|
+
break;
|
|
112
|
+
if (split.every((s) => s[i] === segment)) {
|
|
113
|
+
commonLen++;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Use parent of the common prefix so the last shared segment
|
|
120
|
+
// appears as a directory in the tree
|
|
121
|
+
if (commonLen > 0)
|
|
122
|
+
commonLen--;
|
|
123
|
+
if (commonLen === 0)
|
|
124
|
+
return "/";
|
|
125
|
+
return joinPath(...(split[0]?.slice(0, commonLen) ?? []));
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Convert the internal branch tree into TreeNode[], embedding project rooms.
|
|
129
|
+
*/
|
|
130
|
+
function branchToNodesWithRooms(branch, prefix, currentPath, projectRoomsByPath) {
|
|
131
|
+
const nodes = [];
|
|
132
|
+
// Subdirectories
|
|
133
|
+
for (const [name, child] of branch.children) {
|
|
134
|
+
const childPath = currentPath === "" && prefix === "/"
|
|
135
|
+
? "/" + name
|
|
136
|
+
: currentPath === ""
|
|
137
|
+
? prefix + "/" + name
|
|
138
|
+
: currentPath + "/" + name;
|
|
139
|
+
const childNodes = branchToNodesWithRooms(child, prefix, childPath, projectRoomsByPath);
|
|
140
|
+
if (childNodes.length > 0) {
|
|
141
|
+
// Check if this directory has a project room
|
|
142
|
+
const room = projectRoomsByPath.get(childPath);
|
|
143
|
+
nodes.push({
|
|
144
|
+
type: "directory",
|
|
145
|
+
name,
|
|
146
|
+
path: childPath,
|
|
147
|
+
...(room ? { roomId: room.id } : {}),
|
|
148
|
+
children: sortChildren(childNodes),
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Agents in this directory
|
|
153
|
+
for (const agent of branch.agents) {
|
|
154
|
+
nodes.push({
|
|
155
|
+
type: "agent",
|
|
156
|
+
name: agent.name,
|
|
157
|
+
agentId: agent.id,
|
|
158
|
+
status: agent.status,
|
|
159
|
+
cwd: agent.cwd,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
return nodes;
|
|
163
|
+
}
|
|
164
|
+
function sortChildren(nodes) {
|
|
165
|
+
return [...nodes].sort((a, b) => {
|
|
166
|
+
// Directories first, then agents
|
|
167
|
+
if (a.type !== b.type) {
|
|
168
|
+
return a.type === "directory" ? -1 : 1;
|
|
169
|
+
}
|
|
170
|
+
return a.name.localeCompare(b.name);
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=project-tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-tree.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/project-tree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
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
|
+
export interface RelayStatus {
|
|
13
|
+
connectedA: boolean;
|
|
14
|
+
connectedB: boolean;
|
|
15
|
+
urlA: string | undefined;
|
|
16
|
+
urlB: string | undefined;
|
|
17
|
+
forwardedCount: number;
|
|
18
|
+
errors: string[];
|
|
19
|
+
}
|
|
20
|
+
export type RelayStatusListener = (status: RelayStatus) => void;
|
|
21
|
+
export declare class RelayClient {
|
|
22
|
+
private worker;
|
|
23
|
+
private status;
|
|
24
|
+
private readonly listeners;
|
|
25
|
+
/** Connect to the relay SharedWorker. Idempotent. */
|
|
26
|
+
connect(): void;
|
|
27
|
+
/** Connect the relay to two mesh WebSocket endpoints. */
|
|
28
|
+
connectRelay(urlA: string, urlB: string): void;
|
|
29
|
+
/** Disconnect the relay from both mesh endpoints. */
|
|
30
|
+
disconnect(): void;
|
|
31
|
+
/** Get the current relay status (snapshot). */
|
|
32
|
+
get(): Readonly<RelayStatus>;
|
|
33
|
+
/** Subscribe to status changes. Returns an unsubscribe function. */
|
|
34
|
+
subscribe(listener: RelayStatusListener): () => void;
|
|
35
|
+
/** Destroy the client and release the SharedWorker port. */
|
|
36
|
+
destroy(): void;
|
|
37
|
+
private postToWorker;
|
|
38
|
+
private notify;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=relay-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-client.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/relay-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;AAMhE,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,MAAM,CAOZ;IACF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;IAE5D,qDAAqD;IACrD,OAAO,IAAI,IAAI;IAqBf,yDAAyD;IACzD,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9C,qDAAqD;IACrD,UAAU,IAAI,IAAI;IAIlB,+CAA+C;IAC/C,GAAG,IAAI,QAAQ,CAAC,WAAW,CAAC;IAI5B,oEAAoE;IACpE,SAAS,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,IAAI;IAOpD,4DAA4D;IAC5D,OAAO,IAAI,IAAI;IAOf,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,MAAM;CAMf"}
|