agent-comms 3.24.0 → 3.26.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/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +1 -1
- package/dist/bridges/user/web/dist/bundle.js +15 -15
- package/dist/bridges/user/web/dist/mesh-worker.js +64 -1
- package/dist/bridges/user/web/dist/sw.js +1 -1
- package/dist/bridges/user/web/frontend/api.d.ts +3 -1
- package/dist/bridges/user/web/frontend/api.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/api.js +47 -0
- package/dist/bridges/user/web/frontend/api.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/App.d.ts +2 -1
- package/dist/bridges/user/web/frontend/components/App.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/App.js +8 -2
- package/dist/bridges/user/web/frontend/components/App.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/MeshGraphView.d.ts +14 -0
- package/dist/bridges/user/web/frontend/components/MeshGraphView.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/components/MeshGraphView.js +58 -0
- package/dist/bridges/user/web/frontend/components/MeshGraphView.js.map +1 -0
- package/dist/bridges/user/web/frontend/components/MeshPanel.d.ts +12 -0
- package/dist/bridges/user/web/frontend/components/MeshPanel.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/components/MeshPanel.js +39 -0
- package/dist/bridges/user/web/frontend/components/MeshPanel.js.map +1 -0
- package/dist/bridges/user/web/frontend/components/MeshTraceView.d.ts +18 -0
- package/dist/bridges/user/web/frontend/components/MeshTraceView.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/components/MeshTraceView.js +29 -0
- package/dist/bridges/user/web/frontend/components/MeshTraceView.js.map +1 -0
- package/dist/bridges/user/web/frontend/main.js +12 -2
- package/dist/bridges/user/web/frontend/main.js.map +1 -1
- package/dist/bridges/user/web/frontend/mesh-worker.d.ts +59 -43
- package/dist/bridges/user/web/frontend/mesh-worker.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/mesh-worker.js +84 -1
- package/dist/bridges/user/web/frontend/mesh-worker.js.map +1 -1
- package/dist/bridges/user/web/frontend/state.d.ts +4 -1
- package/dist/bridges/user/web/frontend/state.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/state.js +5 -0
- package/dist/bridges/user/web/frontend/state.js.map +1 -1
- package/dist/bridges/user/web/frontend/tab-contract.d.ts +691 -0
- package/dist/bridges/user/web/frontend/tab-contract.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/tab-contract.js +13 -0
- package/dist/bridges/user/web/frontend/tab-contract.js.map +1 -0
- package/dist/bridges/user/web/frontend/types.d.ts +28 -0
- package/dist/bridges/user/web/frontend/types.d.ts.map +1 -1
- package/dist/bridges/user/web/server.d.ts +2 -0
- package/dist/bridges/user/web/server.d.ts.map +1 -1
- package/dist/bridges/user/web/server.js +44 -0
- package/dist/bridges/user/web/server.js.map +1 -1
- package/dist/bridges/user/web/test/web-server.integration.test.js +42 -0
- package/dist/bridges/user/web/test/web-server.integration.test.js.map +1 -1
- package/dist/core/mesh-graph.d.ts +5 -1
- package/dist/core/mesh-graph.d.ts.map +1 -1
- package/dist/core/mesh-graph.js +21 -12
- package/dist/core/mesh-graph.js.map +1 -1
- package/dist/test/mesh-graph.test.d.ts +5 -0
- package/dist/test/mesh-graph.test.d.ts.map +1 -0
- package/dist/test/mesh-graph.test.js +87 -0
- package/dist/test/mesh-graph.test.js.map +1 -0
- package/package.json +3 -1
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Renders sidebar + chat area inside an AppShell. Receives state and action callbacks from the imperative shell in main.tsx.
|
|
5
5
|
*/
|
|
6
|
-
import type { Agent, DisplayMessage, Room } from "../types.js";
|
|
6
|
+
import type { Agent, DisplayMessage, MeshGraph, Room } from "../types.js";
|
|
7
7
|
export interface AppProps {
|
|
8
8
|
rooms: readonly Room[];
|
|
9
9
|
agents: readonly Agent[];
|
|
@@ -11,6 +11,7 @@ export interface AppProps {
|
|
|
11
11
|
dmTarget: string | undefined;
|
|
12
12
|
messages: readonly DisplayMessage[];
|
|
13
13
|
connected: boolean;
|
|
14
|
+
meshGraph: MeshGraph | undefined;
|
|
14
15
|
onJoinRoom: (roomId: string) => void;
|
|
15
16
|
onSelectAgent: (agentId: string) => void;
|
|
16
17
|
onRenameAgent: (agentId: string, newName: string) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/App.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/App.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAO1E,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IACvB,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC;IACjC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,YAAY,EAAE,CACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,EACrC,WAAW,EAAE,MAAM,KAChB,IAAI,CAAC;IACV,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,eAAe,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,+BAuDlC"}
|
|
@@ -4,16 +4,22 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
4
4
|
*
|
|
5
5
|
* Renders sidebar + chat area inside an AppShell. Receives state and action callbacks from the imperative shell in main.tsx.
|
|
6
6
|
*/
|
|
7
|
-
import { AppShell } from "@mantine/core";
|
|
7
|
+
import { AppShell, SegmentedControl } from "@mantine/core";
|
|
8
8
|
import { useDisclosure } from "@mantine/hooks";
|
|
9
|
+
import { useState } from "react";
|
|
9
10
|
import { ChatArea } from "./ChatArea.js";
|
|
11
|
+
import { MeshPanel } from "./MeshPanel.js";
|
|
10
12
|
import { Sidebar } from "./Sidebar.js";
|
|
11
13
|
export function App(props) {
|
|
12
14
|
const [navOpened, { toggle: toggleNav }] = useDisclosure(true);
|
|
15
|
+
const [mainView, setMainView] = useState("chat");
|
|
13
16
|
return (_jsxs(AppShell, { navbar: {
|
|
14
17
|
width: 260,
|
|
15
18
|
breakpoint: "sm",
|
|
16
19
|
collapsed: { desktop: !navOpened, mobile: !navOpened },
|
|
17
|
-
}, children: [
|
|
20
|
+
}, children: [_jsxs(AppShell.Navbar, { children: [_jsx(Sidebar, { rooms: props.rooms, agents: props.agents, currentRoom: props.currentRoom, onJoinRoom: props.onJoinRoom, onSelectAgent: props.onSelectAgent, onRenameAgent: props.onRenameAgent, onCreateRoom: props.onCreateRoom, onJoinRoomInput: props.onJoinRoomInput }), _jsx(SegmentedControl, { m: "xs", size: "xs", fullWidth: true, value: mainView, onChange: setMainView, data: [
|
|
21
|
+
{ label: "Chat", value: "chat" },
|
|
22
|
+
{ label: "Mesh", value: "mesh" },
|
|
23
|
+
] })] }), _jsx(AppShell.Main, { h: "100vh", children: mainView === "chat" ? (_jsx(ChatArea, { messages: props.messages, rooms: props.rooms, currentRoom: props.currentRoom, dmTarget: props.dmTarget, connected: props.connected, sidebarOpened: navOpened, onToggleSidebar: toggleNav, onSendAction: props.onSendAction, onLeaveRoom: props.onLeaveRoom, onConnectToMesh: props.onConnectToMesh })) : (_jsx(MeshPanel, { graph: props.meshGraph })) })] }));
|
|
18
24
|
}
|
|
19
25
|
//# sourceMappingURL=App.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/App.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/App.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AA0BvC,MAAM,UAAU,GAAG,CAAC,KAAe;IACjC,MAAM,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAW,MAAM,CAAC,CAAC;IAE3D,OAAO,CACL,MAAC,QAAQ,IACP,MAAM,EAAE;YACN,KAAK,EAAE,GAAG;YACV,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE;SACvD,aAED,MAAC,QAAQ,CAAC,MAAM,eACd,KAAC,OAAO,IACN,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,UAAU,EAAE,KAAK,CAAC,UAAU,EAC5B,aAAa,EAAE,KAAK,CAAC,aAAa,EAClC,aAAa,EAAE,KAAK,CAAC,aAAa,EAClC,YAAY,EAAE,KAAK,CAAC,YAAY,EAChC,eAAe,EAAE,KAAK,CAAC,eAAe,GACtC,EACF,KAAC,gBAAgB,IACf,CAAC,EAAC,IAAI,EACN,IAAI,EAAC,IAAI,EACT,SAAS,QACT,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE;4BACJ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;4BAChC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;yBACjC,GACD,IACc,EAClB,KAAC,QAAQ,CAAC,IAAI,IAAC,CAAC,EAAC,OAAO,YACrB,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,CACrB,KAAC,QAAQ,IACP,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,SAAS,EAAE,KAAK,CAAC,SAAS,EAC1B,aAAa,EAAE,SAAS,EACxB,eAAe,EAAE,SAAS,EAC1B,YAAY,EAAE,KAAK,CAAC,YAAY,EAChC,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,eAAe,EAAE,KAAK,CAAC,eAAe,GACtC,CACH,CAAC,CAAC,CAAC,CACF,KAAC,SAAS,IAAC,KAAK,EAAE,KAAK,CAAC,SAAS,GAAI,CACtC,GACa,IACP,CACZ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MeshGraphView — force-directed rendering of the mesh's connection graph (agent-comms#201).
|
|
3
|
+
*
|
|
4
|
+
* Uses d3-force purely for layout: forceSimulation computes node positions, which are then rendered as plain SVG driven by React, not by d3's own DOM manipulation. The simulation is run to convergence synchronously (a fixed tick count, no requestAnimationFrame loop) so a render is a pure function of `graph` -- deterministic, and cheap enough to redo in full whenever the graph changes, matching how the rest of the mesh's live state already re-renders wholesale on every WS-driven refresh rather than patching in place.
|
|
5
|
+
*/
|
|
6
|
+
import type { MeshGraph } from "../types.js";
|
|
7
|
+
interface MeshGraphViewProps {
|
|
8
|
+
graph: MeshGraph;
|
|
9
|
+
selectedDevice: string | undefined;
|
|
10
|
+
onSelectDevice: (deviceId: string) => void;
|
|
11
|
+
}
|
|
12
|
+
export declare function MeshGraphView({ graph, selectedDevice, onSelectDevice, }: MeshGraphViewProps): import("react").JSX.Element;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=MeshGraphView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MeshGraphView.d.ts","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/MeshGraphView.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,UAAU,kBAAkB;IAC1B,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C;AAyDD,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,cAAc,EACd,cAAc,GACf,EAAE,kBAAkB,+BAuEpB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* MeshGraphView — force-directed rendering of the mesh's connection graph (agent-comms#201).
|
|
4
|
+
*
|
|
5
|
+
* Uses d3-force purely for layout: forceSimulation computes node positions, which are then rendered as plain SVG driven by React, not by d3's own DOM manipulation. The simulation is run to convergence synchronously (a fixed tick count, no requestAnimationFrame loop) so a render is a pure function of `graph` -- deterministic, and cheap enough to redo in full whenever the graph changes, matching how the rest of the mesh's live state already re-renders wholesale on every WS-driven refresh rather than patching in place.
|
|
6
|
+
*/
|
|
7
|
+
import { Box, Text } from "@mantine/core";
|
|
8
|
+
import { useMemo } from "react";
|
|
9
|
+
import { forceCenter, forceLink, forceManyBody, forceSimulation, } from "d3-force";
|
|
10
|
+
/** Fixed simulation extent -- the SVG's own viewBox is set to match, so layout is independent of the element's actual rendered size on screen. */
|
|
11
|
+
const LAYOUT_WIDTH = 600;
|
|
12
|
+
const LAYOUT_HEIGHT = 400;
|
|
13
|
+
/** How many ticks to run the simulation before treating it as settled. d3-force's own alphaDecay (default ~0.0228) reaches alpha's minimum (0.001) in ~300 ticks; running a fixed, generous count synchronously is simpler and just as deterministic as watching for convergence, for a graph this small. */
|
|
14
|
+
const SIMULATION_TICKS = 300;
|
|
15
|
+
const NODE_RADIUS = 10;
|
|
16
|
+
/** Length of the truncated device-id hex label shown next to each node -- enough to distinguish devices at a glance without a full 64-character hash crowding the graph. */
|
|
17
|
+
const LABEL_HEX_LENGTH = 8;
|
|
18
|
+
/** Vertical gap between a node's own circle and its label, below NODE_RADIUS. */
|
|
19
|
+
const LABEL_OFFSET = 12;
|
|
20
|
+
function layoutGraph(graph) {
|
|
21
|
+
const nodes = graph.nodes.map((id) => ({ id }));
|
|
22
|
+
const links = graph.edges.map((edge) => ({
|
|
23
|
+
source: edge.from,
|
|
24
|
+
target: edge.to,
|
|
25
|
+
kind: edge.kind,
|
|
26
|
+
}));
|
|
27
|
+
const simulation = forceSimulation(nodes)
|
|
28
|
+
.force("link", forceLink(links).id((node) => node.id))
|
|
29
|
+
.force("charge", forceManyBody())
|
|
30
|
+
.force("center", forceCenter(LAYOUT_WIDTH / 2, LAYOUT_HEIGHT / 2))
|
|
31
|
+
.stop();
|
|
32
|
+
for (let tick = 0; tick < SIMULATION_TICKS; tick++) {
|
|
33
|
+
simulation.tick();
|
|
34
|
+
}
|
|
35
|
+
return { nodes, links };
|
|
36
|
+
}
|
|
37
|
+
/** A force-linked node's own source/target start as the plain device-id strings passed into forceLink's data; forceSimulation mutates them in place into the resolved LaidOutNode objects once the simulation runs. Narrows a link endpoint back to that resolved node so its x/y can be read for rendering. */
|
|
38
|
+
function resolvedNode(endpoint) {
|
|
39
|
+
return typeof endpoint === "object" ? endpoint : undefined;
|
|
40
|
+
}
|
|
41
|
+
export function MeshGraphView({ graph, selectedDevice, onSelectDevice, }) {
|
|
42
|
+
const { nodes, links } = useMemo(() => layoutGraph(graph), [graph]);
|
|
43
|
+
if (nodes.length === 0) {
|
|
44
|
+
return (_jsx(Text, { c: "dimmed", p: "md", children: "No known devices in the mesh graph." }));
|
|
45
|
+
}
|
|
46
|
+
return (_jsx(Box, { p: "md", children: _jsxs("svg", { role: "img", "aria-label": "Mesh connection graph", viewBox: `0 0 ${String(LAYOUT_WIDTH)} ${String(LAYOUT_HEIGHT)}`, width: "100%", style: { maxHeight: LAYOUT_HEIGHT }, children: [links.map((link) => {
|
|
47
|
+
const source = resolvedNode(link.source);
|
|
48
|
+
const target = resolvedNode(link.target);
|
|
49
|
+
if (!source || !target)
|
|
50
|
+
return null;
|
|
51
|
+
return (_jsx("line", { x1: source.x, y1: source.y, x2: target.x, y2: target.y, stroke: "var(--mantine-color-dark-3)", strokeWidth: 1.5, strokeDasharray: link.kind === "relay" ? "4 3" : undefined }, `${source.id}-${target.id}`));
|
|
52
|
+
}), nodes.map((node) => (_jsxs("g", { transform: `translate(${String(node.x ?? 0)}, ${String(node.y ?? 0)})`, onClick: () => {
|
|
53
|
+
onSelectDevice(node.id);
|
|
54
|
+
}, style: { cursor: "pointer" }, role: "button", "aria-label": `Device ${node.id}`, children: [_jsx("circle", { r: NODE_RADIUS, fill: node.id === selectedDevice
|
|
55
|
+
? "var(--mantine-color-accent-5)"
|
|
56
|
+
: "var(--mantine-color-dark-2)", stroke: "var(--mantine-color-accent-5)", strokeWidth: node.id === selectedDevice ? 2 : 0 }), _jsx("text", { y: NODE_RADIUS + LABEL_OFFSET, textAnchor: "middle", fontSize: 10, fill: "var(--mantine-color-text)", children: node.id.slice(0, LABEL_HEX_LENGTH) })] }, node.id)))] }) }));
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=MeshGraphView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MeshGraphView.js","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/MeshGraphView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MeshPanel — the mesh view: connection graph plus path-trace (agent-comms#201).
|
|
3
|
+
*
|
|
4
|
+
* Owns the trace request lifecycle (loading/error/result) since it's a genuine on-demand network round trip, not reactive state the way agents/rooms/the graph itself are. Clicking a node in the graph selects it as the trace target, so the two sub-views share one selection.
|
|
5
|
+
*/
|
|
6
|
+
import type { MeshGraph } from "../types.js";
|
|
7
|
+
interface MeshPanelProps {
|
|
8
|
+
graph: MeshGraph | undefined;
|
|
9
|
+
}
|
|
10
|
+
export declare function MeshPanel({ graph }: MeshPanelProps): import("react").JSX.Element;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=MeshPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MeshPanel.d.ts","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/MeshPanel.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,aAAa,CAAC;AAI9D,UAAU,cAAc;IACtB,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;CAC9B;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,cAAc,+BA6DlD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* MeshPanel — the mesh view: connection graph plus path-trace (agent-comms#201).
|
|
4
|
+
*
|
|
5
|
+
* Owns the trace request lifecycle (loading/error/result) since it's a genuine on-demand network round trip, not reactive state the way agents/rooms/the graph itself are. Clicking a node in the graph selects it as the trace target, so the two sub-views share one selection.
|
|
6
|
+
*/
|
|
7
|
+
import { Stack, Tabs, Text } from "@mantine/core";
|
|
8
|
+
import { useState } from "react";
|
|
9
|
+
import { fetchMeshTrace } from "../api.js";
|
|
10
|
+
import { MeshGraphView } from "./MeshGraphView.js";
|
|
11
|
+
import { MeshTraceView } from "./MeshTraceView.js";
|
|
12
|
+
export function MeshPanel({ graph }) {
|
|
13
|
+
const [selectedTarget, setSelectedTarget] = useState(undefined);
|
|
14
|
+
const [loading, setLoading] = useState(false);
|
|
15
|
+
const [error, setError] = useState(undefined);
|
|
16
|
+
const [result, setResult] = useState(undefined);
|
|
17
|
+
function handleTrace() {
|
|
18
|
+
if (selectedTarget === undefined)
|
|
19
|
+
return;
|
|
20
|
+
setLoading(true);
|
|
21
|
+
setError(undefined);
|
|
22
|
+
setResult(undefined);
|
|
23
|
+
fetchMeshTrace(selectedTarget)
|
|
24
|
+
.then((traceResult) => {
|
|
25
|
+
setResult(traceResult);
|
|
26
|
+
})
|
|
27
|
+
.catch((err) => {
|
|
28
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
29
|
+
})
|
|
30
|
+
.finally(() => {
|
|
31
|
+
setLoading(false);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
if (graph === undefined) {
|
|
35
|
+
return (_jsx(Text, { c: "dimmed", p: "md", children: "Mesh graph is not available on this connection." }));
|
|
36
|
+
}
|
|
37
|
+
return (_jsxs(Tabs, { defaultValue: "graph", children: [_jsxs(Tabs.List, { children: [_jsx(Tabs.Tab, { value: "graph", children: "Graph" }), _jsx(Tabs.Tab, { value: "trace", children: "Trace" })] }), _jsx(Tabs.Panel, { value: "graph", children: _jsx(MeshGraphView, { graph: graph, selectedDevice: selectedTarget, onSelectDevice: setSelectedTarget }) }), _jsx(Tabs.Panel, { value: "trace", children: _jsx(Stack, { children: _jsx(MeshTraceView, { targets: graph.nodes, selectedTarget: selectedTarget, onSelectTarget: setSelectedTarget, onTrace: handleTrace, loading: loading, error: error, result: result }) }) })] }));
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=MeshPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MeshPanel.js","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/MeshPanel.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMnD,MAAM,UAAU,SAAS,CAAC,EAAE,KAAK,EAAkB;IACjD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAClD,SAAS,CACV,CAAC;IACF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAqB,SAAS,CAAC,CAAC;IAClE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAA8B,SAAS,CAAC,CAAC;IAE7E,SAAS,WAAW;QAClB,IAAI,cAAc,KAAK,SAAS;YAAE,OAAO;QACzC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpB,SAAS,CAAC,SAAS,CAAC,CAAC;QACrB,cAAc,CAAC,cAAc,CAAC;aAC3B,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE;YACpB,SAAS,CAAC,WAAW,CAAC,CAAC;QACzB,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACtB,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,CACL,KAAC,IAAI,IAAC,CAAC,EAAC,QAAQ,EAAC,CAAC,EAAC,IAAI,gEAEhB,CACR,CAAC;IACJ,CAAC;IAED,OAAO,CACL,MAAC,IAAI,IAAC,YAAY,EAAC,OAAO,aACxB,MAAC,IAAI,CAAC,IAAI,eACR,KAAC,IAAI,CAAC,GAAG,IAAC,KAAK,EAAC,OAAO,sBAAiB,EACxC,KAAC,IAAI,CAAC,GAAG,IAAC,KAAK,EAAC,OAAO,sBAAiB,IAC9B,EACZ,KAAC,IAAI,CAAC,KAAK,IAAC,KAAK,EAAC,OAAO,YACvB,KAAC,aAAa,IACZ,KAAK,EAAE,KAAK,EACZ,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,iBAAiB,GACjC,GACS,EACb,KAAC,IAAI,CAAC,KAAK,IAAC,KAAK,EAAC,OAAO,YACvB,KAAC,KAAK,cACJ,KAAC,aAAa,IACZ,OAAO,EAAE,KAAK,CAAC,KAAK,EACpB,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,iBAAiB,EACjC,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,GACd,GACI,GACG,IACR,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MeshTraceView — target picker plus live path-trace result for mesh_trace (agent-comms#201).
|
|
3
|
+
*
|
|
4
|
+
* Purely presentational: the trace itself (a real, on-demand network round trip rather than reactive state) is owned by the parent, which fetches on the "Trace" click and passes the outcome back down. This keeps the component trivially testable without mocking fetch.
|
|
5
|
+
*/
|
|
6
|
+
import type { MeshTraceResult } from "../types.js";
|
|
7
|
+
interface MeshTraceViewProps {
|
|
8
|
+
targets: readonly string[];
|
|
9
|
+
selectedTarget: string | undefined;
|
|
10
|
+
onSelectTarget: (deviceId: string) => void;
|
|
11
|
+
onTrace: () => void;
|
|
12
|
+
loading: boolean;
|
|
13
|
+
error: string | undefined;
|
|
14
|
+
result: MeshTraceResult | undefined;
|
|
15
|
+
}
|
|
16
|
+
export declare function MeshTraceView({ targets, selectedTarget, onSelectTarget, onTrace, loading, error, result, }: MeshTraceViewProps): import("react").JSX.Element;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=MeshTraceView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MeshTraceView.d.ts","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/MeshTraceView.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,UAAU,kBAAkB;IAC1B,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,EAAE,eAAe,GAAG,SAAS,CAAC;CACrC;AAcD,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,cAAc,EACd,cAAc,EACd,OAAO,EACP,OAAO,EACP,KAAK,EACL,MAAM,GACP,EAAE,kBAAkB,+BAqDpB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* MeshTraceView — target picker plus live path-trace result for mesh_trace (agent-comms#201).
|
|
4
|
+
*
|
|
5
|
+
* Purely presentational: the trace itself (a real, on-demand network round trip rather than reactive state) is owned by the parent, which fetches on the "Trace" click and passes the outcome back down. This keeps the component trivially testable without mocking fetch.
|
|
6
|
+
*/
|
|
7
|
+
import { Badge, Button, Group, Select, Stack, Text } from "@mantine/core";
|
|
8
|
+
/** Length of the truncated device-id hex label shown in the target picker -- matches MeshGraphView's own node-label truncation. */
|
|
9
|
+
const LABEL_HEX_LENGTH = 8;
|
|
10
|
+
function describeSide(side) {
|
|
11
|
+
if (!side.relayed)
|
|
12
|
+
return "direct";
|
|
13
|
+
return side.hubAddress !== undefined
|
|
14
|
+
? `relayed via ${side.hubAddress}`
|
|
15
|
+
: "relayed";
|
|
16
|
+
}
|
|
17
|
+
export function MeshTraceView({ targets, selectedTarget, onSelectTarget, onTrace, loading, error, result, }) {
|
|
18
|
+
const options = targets.map((id) => ({
|
|
19
|
+
value: id,
|
|
20
|
+
label: id.slice(0, LABEL_HEX_LENGTH),
|
|
21
|
+
}));
|
|
22
|
+
return (_jsxs(Stack, { p: "md", gap: "sm", children: [_jsxs(Group, { align: "flex-end", gap: "xs", children: [_jsx(Select, { label: "Target device", placeholder: "Choose a device", size: "xs", data: options, value: selectedTarget ?? null, onChange: (value) => {
|
|
23
|
+
if (value !== null)
|
|
24
|
+
onSelectTarget(value);
|
|
25
|
+
} }), _jsx(Button, { size: "xs", disabled: selectedTarget === undefined || loading, loading: loading, onClick: onTrace, children: "Trace" })] }), error !== undefined && _jsx(Text, { c: "red", children: error }), result !== undefined && (_jsxs(Stack, { gap: 4, children: [_jsxs(Group, { gap: "xs", children: [_jsx(Badge, { color: result.outcome.result === "ok" ? "green" : "red", children: result.outcome.result === "ok"
|
|
26
|
+
? "ok"
|
|
27
|
+
: (result.outcome.code ?? "error") }), _jsxs(Text, { size: "sm", children: [result.rttMs, "ms round trip"] })] }), _jsxs(Text, { size: "sm", c: "dimmed", children: ["Local: ", describeSide(result.local)] }), result.remote !== undefined && (_jsxs(Text, { size: "sm", c: "dimmed", children: ["Remote: ", describeSide(result.remote)] }))] }))] }));
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=MeshTraceView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MeshTraceView.js","sourceRoot":"","sources":["../../../../../../src/bridges/user/web/frontend/components/MeshTraceView.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAa1E,mIAAmI;AACnI,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B,SAAS,YAAY,CACnB,IAAyD;IAEzD,IAAI,CAAC,IAAI,CAAC,OAAO;QAAE,OAAO,QAAQ,CAAC;IACnC,OAAO,IAAI,CAAC,UAAU,KAAK,SAAS;QAClC,CAAC,CAAC,eAAe,IAAI,CAAC,UAAU,EAAE;QAClC,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAC5B,OAAO,EACP,cAAc,EACd,cAAc,EACd,OAAO,EACP,OAAO,EACP,KAAK,EACL,MAAM,GACa;IACnB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACnC,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC;KACrC,CAAC,CAAC,CAAC;IAEJ,OAAO,CACL,MAAC,KAAK,IAAC,CAAC,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,aACpB,MAAC,KAAK,IAAC,KAAK,EAAC,UAAU,EAAC,GAAG,EAAC,IAAI,aAC9B,KAAC,MAAM,IACL,KAAK,EAAC,eAAe,EACrB,WAAW,EAAC,iBAAiB,EAC7B,IAAI,EAAC,IAAI,EACT,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,cAAc,IAAI,IAAI,EAC7B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;4BAClB,IAAI,KAAK,KAAK,IAAI;gCAAE,cAAc,CAAC,KAAK,CAAC,CAAC;wBAC5C,CAAC,GACD,EACF,KAAC,MAAM,IACL,IAAI,EAAC,IAAI,EACT,QAAQ,EAAE,cAAc,KAAK,SAAS,IAAI,OAAO,EACjD,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,sBAGT,IACH,EAEP,KAAK,KAAK,SAAS,IAAI,KAAC,IAAI,IAAC,CAAC,EAAC,KAAK,YAAE,KAAK,GAAQ,EAEnD,MAAM,KAAK,SAAS,IAAI,CACvB,MAAC,KAAK,IAAC,GAAG,EAAE,CAAC,aACX,MAAC,KAAK,IAAC,GAAG,EAAC,IAAI,aACb,KAAC,KAAK,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,YAC3D,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI;oCAC7B,CAAC,CAAC,IAAI;oCACN,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAC9B,EACR,MAAC,IAAI,IAAC,IAAI,EAAC,IAAI,aAAE,MAAM,CAAC,KAAK,qBAAqB,IAC5C,EACR,MAAC,IAAI,IAAC,IAAI,EAAC,IAAI,EAAC,CAAC,EAAC,QAAQ,wBAChB,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,IAC7B,EACN,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,CAC9B,MAAC,IAAI,IAAC,IAAI,EAAC,IAAI,EAAC,CAAC,EAAC,QAAQ,yBACf,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,IAC/B,CACR,IACK,CACT,IACK,CACT,CAAC;AACJ,CAAC"}
|
|
@@ -9,7 +9,7 @@ import { createRoot } from "react-dom/client";
|
|
|
9
9
|
import { MantineProvider } from "@mantine/core";
|
|
10
10
|
import { useEffect } from "react";
|
|
11
11
|
import { App } from "./components/App.js";
|
|
12
|
-
import { CommsWs, fetchAgents, fetchRoomMessages, fetchRooms } from "./api.js";
|
|
12
|
+
import { CommsWs, fetchAgents, fetchMeshGraph, fetchRoomMessages, fetchRooms, } from "./api.js";
|
|
13
13
|
import { parseInput, routeAction } from "./input.js";
|
|
14
14
|
import { State } from "./state.js";
|
|
15
15
|
import { useClientState } from "./use-client-state.js";
|
|
@@ -120,6 +120,16 @@ async function refreshState() {
|
|
|
120
120
|
const [agents, rooms] = await Promise.all([fetchAgents(), fetchRooms()]);
|
|
121
121
|
state.setAgents(agents);
|
|
122
122
|
state.setRooms(rooms);
|
|
123
|
+
await refreshMeshGraph();
|
|
124
|
+
}
|
|
125
|
+
/** Refreshes the mesh's connection graph on the same triggers refreshState already reacts to (agent-comms#201) -- a failure here (most commonly this bridge running on a FileStore rather than a real mesh transport, so mesh_graph simply isn't supported) leaves state.meshGraph as it was rather than breaking the agents/rooms refresh it rides alongside. */
|
|
126
|
+
async function refreshMeshGraph() {
|
|
127
|
+
try {
|
|
128
|
+
state.setMeshGraph(await fetchMeshGraph());
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// Not mesh-backed, or the transport doesn't support mesh_graph -- leave meshGraph unset.
|
|
132
|
+
}
|
|
123
133
|
}
|
|
124
134
|
async function onJoinRoom(roomId) {
|
|
125
135
|
state.setDmTarget(undefined);
|
|
@@ -205,7 +215,7 @@ function Root() {
|
|
|
205
215
|
useEffect(() => {
|
|
206
216
|
syncUrl({ currentRoom: s.currentRoom, dmTarget: s.dmTarget });
|
|
207
217
|
}, [s.currentRoom, s.dmTarget]);
|
|
208
|
-
return (_jsx(App, { rooms: s.rooms, agents: s.agents, currentRoom: s.currentRoom, dmTarget: s.dmTarget, messages: s.messages, connected: s.connected, onJoinRoom: (roomId) => {
|
|
218
|
+
return (_jsx(App, { rooms: s.rooms, agents: s.agents, currentRoom: s.currentRoom, dmTarget: s.dmTarget, messages: s.messages, connected: s.connected, meshGraph: s.meshGraph, onJoinRoom: (roomId) => {
|
|
209
219
|
void onJoinRoom(roomId);
|
|
210
220
|
}, onSelectAgent: onSelectAgent, onRenameAgent: onRenameAgent, onLeaveRoom: onLeaveRoom, onSendAction: handleSendAction, onCreateRoom: onCreateRoom, onJoinRoomInput: onJoinRoomInput, onConnectToMesh: onConnectToMesh }));
|
|
211
221
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/main.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,aAAa,MAAM,iCAAiC,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/main.tsx"],"names":[],"mappings":"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"}
|
|
@@ -5,50 +5,17 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Built as a separate IIFE bundle (mesh-worker.js) so the SharedWorker runs in its own global scope independent of the main app bundle.
|
|
7
7
|
*/
|
|
8
|
+
import { MeshEventPublisher } from "../event-publisher.js";
|
|
9
|
+
import type { AgentIdentity as CoreAgentIdentity, Room as CoreRoom, RoomMessage as CoreRoomMessage, DmMessage as CoreDmMessage } from "../../../../core/types.js";
|
|
8
10
|
interface MessagePortLike {
|
|
9
11
|
postMessage: (message: unknown) => void;
|
|
10
12
|
close: () => void;
|
|
11
13
|
onmessage: ((event: MessageEvent) => void) | null;
|
|
12
14
|
}
|
|
13
|
-
export
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
cwd: string;
|
|
18
|
-
pid: number;
|
|
19
|
-
startedAt: string;
|
|
20
|
-
visibility: "visible" | "hidden" | "ghost";
|
|
21
|
-
status: "active" | "idle" | "busy" | "offline";
|
|
22
|
-
tags: string[];
|
|
23
|
-
subscribedRooms: string[];
|
|
24
|
-
}
|
|
25
|
-
export interface Room {
|
|
26
|
-
id: string;
|
|
27
|
-
name: string;
|
|
28
|
-
type: "public" | "private" | "secret";
|
|
29
|
-
owner: string;
|
|
30
|
-
createdAt: string;
|
|
31
|
-
description: string;
|
|
32
|
-
members: string[];
|
|
33
|
-
invited: string[];
|
|
34
|
-
}
|
|
35
|
-
interface RoomMessage {
|
|
36
|
-
id: string;
|
|
37
|
-
from: string;
|
|
38
|
-
room: string;
|
|
39
|
-
content: string;
|
|
40
|
-
timestamp: string;
|
|
41
|
-
replyTo?: string | undefined;
|
|
42
|
-
readBy: string[];
|
|
43
|
-
}
|
|
44
|
-
interface DmMessage {
|
|
45
|
-
id: string;
|
|
46
|
-
from: string;
|
|
47
|
-
to: string;
|
|
48
|
-
content: string;
|
|
49
|
-
timestamp: string;
|
|
50
|
-
readBy: string[];
|
|
51
|
-
}
|
|
15
|
+
export type AgentIdentity = CoreAgentIdentity;
|
|
16
|
+
export type Room = CoreRoom;
|
|
17
|
+
type RoomMessage = CoreRoomMessage;
|
|
18
|
+
type DmMessage = CoreDmMessage;
|
|
52
19
|
interface DeliveryEvent {
|
|
53
20
|
type: string;
|
|
54
21
|
[key: string]: unknown;
|
|
@@ -93,17 +60,66 @@ interface StateSnapshot {
|
|
|
93
60
|
agents: AgentIdentity[];
|
|
94
61
|
rooms: Room[];
|
|
95
62
|
}
|
|
96
|
-
export declare const agents: Map<string,
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
63
|
+
export declare const agents: Map<string, {
|
|
64
|
+
id: string;
|
|
65
|
+
version: number;
|
|
66
|
+
name: string;
|
|
67
|
+
harness: string;
|
|
68
|
+
cwd: string;
|
|
69
|
+
pid: number;
|
|
70
|
+
startedAt: string;
|
|
71
|
+
visibility: "visible" | "hidden" | "ghost";
|
|
72
|
+
status: "active" | "idle" | "busy" | "offline";
|
|
73
|
+
tags: string[];
|
|
74
|
+
subscribedRooms: string[];
|
|
75
|
+
}>;
|
|
76
|
+
export declare const rooms: Map<string, {
|
|
77
|
+
id: string;
|
|
78
|
+
version: number;
|
|
79
|
+
name: string;
|
|
80
|
+
type: "public" | "private" | "secret";
|
|
81
|
+
owner: string;
|
|
82
|
+
createdAt: string;
|
|
83
|
+
description: string;
|
|
84
|
+
members: string[];
|
|
85
|
+
invited: string[];
|
|
86
|
+
memberJoins: Record<string, number>;
|
|
87
|
+
memberLeaves: Record<string, number>;
|
|
88
|
+
invitedJoins: Record<string, number>;
|
|
89
|
+
invitedLeaves: Record<string, number>;
|
|
90
|
+
}>;
|
|
91
|
+
export declare const messages: Map<string, {
|
|
92
|
+
id: string;
|
|
93
|
+
from: string;
|
|
94
|
+
room: string;
|
|
95
|
+
content: string;
|
|
96
|
+
timestamp: string;
|
|
97
|
+
readBy: string[];
|
|
98
|
+
replyTo?: string | undefined;
|
|
99
|
+
streamingBehavior?: "steer" | "followUp" | "info" | undefined;
|
|
100
|
+
}[]>;
|
|
101
|
+
export declare const dms: Map<string, {
|
|
102
|
+
id: string;
|
|
103
|
+
from: string;
|
|
104
|
+
to: string;
|
|
105
|
+
content: string;
|
|
106
|
+
timestamp: string;
|
|
107
|
+
readBy: string[];
|
|
108
|
+
streamingBehavior?: "steer" | "followUp" | "info" | undefined;
|
|
109
|
+
}[]>;
|
|
100
110
|
export declare function applyStateSync(state: SerialisedState): void;
|
|
101
111
|
/**
|
|
102
112
|
* Applies one server-sent patch to local state. Never merges with the existing local copy -- the worker holds a single WebSocket connection to exactly one server, and the server has already computed the fully-merged, authoritative record (delivery-engine.ts's own version-gated CRDT merge) before ever broadcasting it, so whatever a patch carries IS the correct state, full stop. Merging on top of a possibly-stale local copy (the previous behaviour) can only make things worse -- e.g. resurrecting a room or member the server already removed, since the worker has no version field to know its own copy might already be the older one.
|
|
103
113
|
*/
|
|
104
114
|
export declare function applyPatch(patch: MeshStatePatch): void;
|
|
105
115
|
export declare function getStateSnapshot(): StateSnapshot;
|
|
116
|
+
/** Republishes every event this worker receives from the real server to any tab subscribed via the worker's own oRPC downstream (tab-contract.ts's subscribeEvents). Resumable the same way the server's own publisher is -- a tab's oRPC client can reconnect to this worker (a new MessagePort, or the same one after a drop) and resume from its own lastEventId. */
|
|
117
|
+
export declare const localPublisher: MeshEventPublisher;
|
|
106
118
|
export declare function connect(url: string): void;
|
|
107
119
|
export declare const ports: Set<MessagePortLike>;
|
|
120
|
+
/**
|
|
121
|
+
* Wires the new oRPC tab-contract.ts downstream onto a port -- dark, nothing in mesh-client.ts speaks it yet, but it's real and independently reachable. Exported (read-only: never assigns any of the port's own properties, unlike the legacy protocol's onmessage wiring below) so a test can drive it directly against a real MessagePort pair without simulating a real SharedWorker "connect" event.
|
|
122
|
+
*/
|
|
123
|
+
export declare function upgradeTabRpcPort(port: Readonly<MessagePort>): void;
|
|
108
124
|
export {};
|
|
109
125
|
//# sourceMappingURL=mesh-worker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mesh-worker.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/mesh-worker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"mesh-worker.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/mesh-worker.ts"],"names":[],"mappings":"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"}
|