agent-comms 3.19.0 → 3.21.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/cc-peer/front-runtime.d.ts.map +1 -1
- package/dist/bridges/cc-peer/front-runtime.js +2 -1
- package/dist/bridges/cc-peer/front-runtime.js.map +1 -1
- package/dist/bridges/cc-peer/run.d.ts.map +1 -1
- package/dist/bridges/cc-peer/run.js +2 -1
- package/dist/bridges/cc-peer/run.js.map +1 -1
- package/dist/bridges/user/web/contract.d.ts +1796 -0
- package/dist/bridges/user/web/contract.d.ts.map +1 -0
- package/dist/bridges/user/web/contract.js +120 -0
- package/dist/bridges/user/web/contract.js.map +1 -0
- package/dist/bridges/user/web/dist/bundle.js +49 -565
- package/dist/bridges/user/web/{frontend → dist}/index.html +1 -1
- package/dist/bridges/user/web/dist/mesh-worker.js +1 -1
- package/dist/bridges/user/web/dist/sw.js +1 -1
- package/dist/bridges/user/web/frontend/components/App.d.ts +3 -4
- package/dist/bridges/user/web/frontend/components/App.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/App.js +11 -9
- package/dist/bridges/user/web/frontend/components/App.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/ChatArea.d.ts +5 -2
- package/dist/bridges/user/web/frontend/components/ChatArea.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/ChatArea.js +12 -8
- package/dist/bridges/user/web/frontend/components/ChatArea.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/CreateRoomForm.d.ts +1 -1
- package/dist/bridges/user/web/frontend/components/CreateRoomForm.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/CreateRoomForm.js +19 -13
- package/dist/bridges/user/web/frontend/components/CreateRoomForm.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/JoinForm.d.ts +1 -1
- package/dist/bridges/user/web/frontend/components/JoinForm.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/JoinForm.js +7 -7
- package/dist/bridges/user/web/frontend/components/JoinForm.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/Message.d.ts +1 -1
- package/dist/bridges/user/web/frontend/components/Message.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/Message.js +10 -6
- package/dist/bridges/user/web/frontend/components/Message.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/MessageList.d.ts +1 -1
- package/dist/bridges/user/web/frontend/components/MessageList.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/MessageList.js +8 -6
- package/dist/bridges/user/web/frontend/components/MessageList.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/ProjectTree.d.ts +2 -3
- package/dist/bridges/user/web/frontend/components/ProjectTree.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/ProjectTree.js +38 -22
- package/dist/bridges/user/web/frontend/components/ProjectTree.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/Sidebar.d.ts +3 -2
- package/dist/bridges/user/web/frontend/components/Sidebar.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/Sidebar.js +9 -6
- package/dist/bridges/user/web/frontend/components/Sidebar.js.map +1 -1
- package/dist/bridges/user/web/frontend/main.d.ts +3 -4
- package/dist/bridges/user/web/frontend/main.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/main.js +40 -37
- package/dist/bridges/user/web/frontend/main.js.map +1 -1
- package/dist/bridges/user/web/frontend/messages.d.ts +1 -0
- package/dist/bridges/user/web/frontend/messages.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/messages.js +6 -0
- package/dist/bridges/user/web/frontend/messages.js.map +1 -1
- package/dist/bridges/user/web/frontend/sw.js +2 -9
- package/dist/bridges/user/web/frontend/sw.js.map +1 -1
- package/dist/bridges/user/web/frontend/theme.d.ts +154 -0
- package/dist/bridges/user/web/frontend/theme.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/theme.js +36 -0
- package/dist/bridges/user/web/frontend/theme.js.map +1 -0
- package/dist/bridges/user/web/frontend/use-client-state.d.ts +6 -0
- package/dist/bridges/user/web/frontend/use-client-state.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/use-client-state.js +8 -0
- package/dist/bridges/user/web/frontend/use-client-state.js.map +1 -0
- package/dist/bridges/user/web/server.js +9 -3
- package/dist/bridges/user/web/server.js.map +1 -1
- package/dist/bridges/user/web/test/contract.unit.test.d.ts +2 -0
- package/dist/bridges/user/web/test/contract.unit.test.d.ts.map +1 -0
- package/dist/bridges/user/web/test/contract.unit.test.js +56 -0
- package/dist/bridges/user/web/test/contract.unit.test.js.map +1 -0
- package/dist/bridges/user/web/vite.config.d.ts +10 -0
- package/dist/bridges/user/web/vite.config.d.ts.map +1 -0
- package/dist/bridges/user/web/vite.config.js +66 -0
- package/dist/bridges/user/web/vite.config.js.map +1 -0
- package/dist/core/bridge-mesh.d.ts +2 -0
- package/dist/core/bridge-mesh.d.ts.map +1 -1
- package/dist/core/bridge-mesh.js +5 -1
- package/dist/core/bridge-mesh.js.map +1 -1
- package/dist/core/bridge.d.ts +1 -0
- package/dist/core/bridge.d.ts.map +1 -1
- package/dist/core/bridge.js +5 -0
- package/dist/core/bridge.js.map +1 -1
- package/dist/core/gossip-directory.d.ts +6 -2
- package/dist/core/gossip-directory.d.ts.map +1 -1
- package/dist/core/gossip-directory.js +25 -4
- package/dist/core/gossip-directory.js.map +1 -1
- package/dist/core/mesh-store.d.ts +14 -0
- package/dist/core/mesh-store.d.ts.map +1 -1
- package/dist/core/mesh-store.js +40 -0
- package/dist/core/mesh-store.js.map +1 -1
- package/dist/core/package-version.d.ts +4 -0
- package/dist/core/package-version.d.ts.map +1 -1
- package/dist/core/package-version.js +2 -1
- package/dist/core/package-version.js.map +1 -1
- package/dist/core/peer-versions.d.ts +16 -0
- package/dist/core/peer-versions.d.ts.map +1 -0
- package/dist/core/peer-versions.js +42 -0
- package/dist/core/peer-versions.js.map +1 -0
- package/dist/core/room-lifecycle.d.ts +5 -5
- package/dist/core/room-lifecycle.d.ts.map +1 -1
- package/dist/core/room-lifecycle.js +11 -5
- package/dist/core/room-lifecycle.js.map +1 -1
- package/dist/core/room-lookup.d.ts +9 -0
- package/dist/core/room-lookup.d.ts.map +1 -0
- package/dist/core/room-lookup.js +26 -0
- package/dist/core/room-lookup.js.map +1 -0
- package/dist/core/room-messaging.d.ts +2 -2
- package/dist/core/room-messaging.d.ts.map +1 -1
- package/dist/core/room-messaging.js +5 -2
- package/dist/core/room-messaging.js.map +1 -1
- package/dist/core/tool.d.ts +16 -0
- package/dist/core/tool.d.ts.map +1 -1
- package/dist/core/tool.js +10 -4
- package/dist/core/tool.js.map +1 -1
- package/dist/core/transport.d.ts +4 -0
- package/dist/core/transport.d.ts.map +1 -1
- package/dist/core/types.d.ts +6 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +4 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/version-report-actions.d.ts +18 -0
- package/dist/core/version-report-actions.d.ts.map +1 -0
- package/dist/core/version-report-actions.js +51 -0
- package/dist/core/version-report-actions.js.map +1 -0
- package/dist/core/wire-mesh-core-version.d.ts +6 -0
- package/dist/core/wire-mesh-core-version.d.ts.map +1 -0
- package/dist/core/wire-mesh-core-version.js +20 -0
- package/dist/core/wire-mesh-core-version.js.map +1 -0
- package/dist/core/wire-mesh-transport.d.ts +4 -0
- package/dist/core/wire-mesh-transport.d.ts.map +1 -1
- package/dist/core/wire-mesh-transport.js +8 -9
- package/dist/core/wire-mesh-transport.js.map +1 -1
- package/dist/test/agent-comms-version-gossip.integration.test.d.ts +5 -0
- package/dist/test/agent-comms-version-gossip.integration.test.d.ts.map +1 -0
- package/dist/test/agent-comms-version-gossip.integration.test.js +103 -0
- package/dist/test/agent-comms-version-gossip.integration.test.js.map +1 -0
- package/dist/test/peer-versions.test.d.ts +5 -0
- package/dist/test/peer-versions.test.d.ts.map +1 -0
- package/dist/test/peer-versions.test.js +68 -0
- package/dist/test/peer-versions.test.js.map +1 -0
- package/dist/test/query-version.integration.test.d.ts +5 -0
- package/dist/test/query-version.integration.test.d.ts.map +1 -0
- package/dist/test/query-version.integration.test.js +64 -0
- package/dist/test/query-version.integration.test.js.map +1 -0
- package/dist/test/send-by-room-name.test.d.ts +5 -0
- package/dist/test/send-by-room-name.test.d.ts.map +1 -0
- package/dist/test/send-by-room-name.test.js +77 -0
- package/dist/test/send-by-room-name.test.js.map +1 -0
- package/dist/test/tool-version-reporting.test.js +38 -0
- package/dist/test/tool-version-reporting.test.js.map +1 -1
- package/dist/test/version-report-actions.test.d.ts +5 -0
- package/dist/test/version-report-actions.test.d.ts.map +1 -0
- package/dist/test/version-report-actions.test.js +88 -0
- package/dist/test/version-report-actions.test.js.map +1 -0
- package/dist/test/wire-mesh-core-version.test.d.ts +5 -0
- package/dist/test/wire-mesh-core-version.test.d.ts.map +1 -0
- package/dist/test/wire-mesh-core-version.test.js +14 -0
- package/dist/test/wire-mesh-core-version.test.js.map +1 -0
- package/package.json +23 -7
- package/dist/bridges/user/web/build.d.ts +0 -12
- package/dist/bridges/user/web/build.d.ts.map +0 -1
- package/dist/bridges/user/web/build.js +0 -95
- package/dist/bridges/user/web/build.js.map +0 -1
- package/dist/bridges/user/web/frontend/dom.d.ts +0 -25
- package/dist/bridges/user/web/frontend/dom.d.ts.map +0 -1
- package/dist/bridges/user/web/frontend/dom.js +0 -48
- package/dist/bridges/user/web/frontend/dom.js.map +0 -1
- package/dist/bridges/user/web/generated-html.d.ts +0 -6
- package/dist/bridges/user/web/generated-html.d.ts.map +0 -1
- package/dist/bridges/user/web/generated-html.js +0 -179
- package/dist/bridges/user/web/generated-html.js.map +0 -1
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-comms#212 -- create a room, then address it by its plain local name (exactly as the README's own usage examples and CommsAction's documented `send`/`join_room`/etc parameters show, e.g. `target: "code-review"`) fails with ROOM_NOT_FOUND. MeshStore's real room identity is the owner-qualified `<owner-hex>/<local-name>` path (room-path.ts's ownerNamedRoomPath), which no caller can construct from a bare name alone -- these tests prove every room-touching tool action accepts the same plain name createRoom's own confirmation message and listRooms/read_room already surface back to the caller.
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from "vitest";
|
|
5
|
+
import { MeshStore } from "../core/mesh-store.js";
|
|
6
|
+
import { CommsTool } from "../core/tool.js";
|
|
7
|
+
import { buildAction } from "../core/bridge.js";
|
|
8
|
+
import { wireTestTransport } from "./test-transport.js";
|
|
9
|
+
const DEVICE_ID_HEX_LENGTH = 64;
|
|
10
|
+
async function makeToolAndOwner() {
|
|
11
|
+
const store = new MeshStore();
|
|
12
|
+
await wireTestTransport(store);
|
|
13
|
+
const owner = await store.registerAgent({
|
|
14
|
+
name: "owner",
|
|
15
|
+
harness: "pi",
|
|
16
|
+
cwd: "/tmp/p",
|
|
17
|
+
pid: process.pid,
|
|
18
|
+
visibility: "visible",
|
|
19
|
+
tags: [],
|
|
20
|
+
});
|
|
21
|
+
const tool = new CommsTool(store);
|
|
22
|
+
const ctx = {
|
|
23
|
+
agentId: owner.id,
|
|
24
|
+
harness: "pi",
|
|
25
|
+
cwd: "/tmp/p",
|
|
26
|
+
pid: process.pid,
|
|
27
|
+
};
|
|
28
|
+
return { store, tool, ctx };
|
|
29
|
+
}
|
|
30
|
+
describe("addressing a room by its plain local name", () => {
|
|
31
|
+
it("send finds a just-created room by name, not just its full owner-qualified id", async () => {
|
|
32
|
+
const { tool, ctx } = await makeToolAndOwner();
|
|
33
|
+
const created = await tool.handle(ctx, buildAction({
|
|
34
|
+
action: "create_room",
|
|
35
|
+
room: "code-review",
|
|
36
|
+
type: "public",
|
|
37
|
+
}));
|
|
38
|
+
expect(created.isError).toBe(false);
|
|
39
|
+
const sent = await tool.handle(ctx, buildAction({
|
|
40
|
+
action: "send",
|
|
41
|
+
target: "code-review",
|
|
42
|
+
content: "Batch 3 done.",
|
|
43
|
+
}));
|
|
44
|
+
expect(sent.isError).toBe(false);
|
|
45
|
+
expect(sent.content).not.toContain("ROOM_NOT_FOUND");
|
|
46
|
+
});
|
|
47
|
+
it("join_room re-joining by name and read_room by name both succeed after create_room", async () => {
|
|
48
|
+
const { tool, ctx } = await makeToolAndOwner();
|
|
49
|
+
await tool.handle(ctx, buildAction({ action: "create_room", room: "general", type: "public" }));
|
|
50
|
+
const joined = await tool.handle(ctx, buildAction({ action: "join_room", room: "general" }));
|
|
51
|
+
expect(joined.isError).toBe(false);
|
|
52
|
+
const read = await tool.handle(ctx, buildAction({ action: "read_room", room: "general" }));
|
|
53
|
+
expect(read.isError).toBe(false);
|
|
54
|
+
});
|
|
55
|
+
it("leave_room by name succeeds after create_room", async () => {
|
|
56
|
+
const { tool, ctx } = await makeToolAndOwner();
|
|
57
|
+
await tool.handle(ctx, buildAction({ action: "create_room", room: "standup", type: "public" }));
|
|
58
|
+
const left = await tool.handle(ctx, buildAction({ action: "leave_room", room: "standup" }));
|
|
59
|
+
expect(left.isError).toBe(false);
|
|
60
|
+
});
|
|
61
|
+
it("refuses to guess when two different owners' rooms share the same plain name", async () => {
|
|
62
|
+
const { store, tool, ctx } = await makeToolAndOwner();
|
|
63
|
+
const otherOwner = "b".repeat(DEVICE_ID_HEX_LENGTH);
|
|
64
|
+
await tool.handle(ctx, buildAction({ action: "create_room", room: "general", type: "public" }));
|
|
65
|
+
// A second room, owned by a different device, that happens to share the same local name -- names are only unique per-owner, so this is a legitimate state to end up in (e.g. via legacy full-state replication), not something createRoom itself needs to prevent.
|
|
66
|
+
await store.createRoom({
|
|
67
|
+
name: "general",
|
|
68
|
+
type: "public",
|
|
69
|
+
owner: otherOwner,
|
|
70
|
+
description: "",
|
|
71
|
+
});
|
|
72
|
+
const sent = await tool.handle(ctx, buildAction({ action: "send", target: "general", content: "hi" }));
|
|
73
|
+
expect(sent.isError).toBe(true);
|
|
74
|
+
expect(sent.content).toContain("AMBIGUOUS_ROOM_NAME");
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=send-by-room-name.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send-by-room-name.test.js","sourceRoot":"","sources":["../../src/test/send-by-room-name.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import { MeshStore } from "../core/mesh-store.js";
|
|
|
6
6
|
import { CommsTool } from "../core/tool.js";
|
|
7
7
|
import { buildAction } from "../core/bridge.js";
|
|
8
8
|
import { getOwnPackageVersion } from "../core/package-version.js";
|
|
9
|
+
import { getWireMeshCoreVersion } from "../core/wire-mesh-core-version.js";
|
|
9
10
|
import { wireTestTransport } from "./test-transport.js";
|
|
10
11
|
async function registeredContext(store) {
|
|
11
12
|
const agent = await store.registerAgent({
|
|
@@ -44,6 +45,31 @@ describe("whoami reports this bridge's own version", () => {
|
|
|
44
45
|
const result = await tool.handle(ctx, buildAction({ action: "whoami" }));
|
|
45
46
|
expect(result.content).toContain("Update available: 99.0.0");
|
|
46
47
|
});
|
|
48
|
+
it("includes a Wire-mesh-core line matching the installed dependency's own version", async () => {
|
|
49
|
+
const store = new MeshStore();
|
|
50
|
+
await wireTestTransport(store);
|
|
51
|
+
const ctx = await registeredContext(store);
|
|
52
|
+
const tool = new CommsTool(store);
|
|
53
|
+
const result = await tool.handle(ctx, buildAction({ action: "whoami" }));
|
|
54
|
+
expect(result.content).toContain(`Wire-mesh-core: ${getWireMeshCoreVersion()}`);
|
|
55
|
+
});
|
|
56
|
+
it("does not mention a Cc-peer version when this store never wired one", async () => {
|
|
57
|
+
const store = new MeshStore();
|
|
58
|
+
await wireTestTransport(store);
|
|
59
|
+
const ctx = await registeredContext(store);
|
|
60
|
+
const tool = new CommsTool(store);
|
|
61
|
+
const result = await tool.handle(ctx, buildAction({ action: "whoami" }));
|
|
62
|
+
expect(result.content).not.toContain("Cc-peer:");
|
|
63
|
+
});
|
|
64
|
+
it("mentions the Cc-peer version once the store's own getter is set, as though fronting/bridging cc-peer", async () => {
|
|
65
|
+
const store = new MeshStore();
|
|
66
|
+
await wireTestTransport(store);
|
|
67
|
+
const ctx = await registeredContext(store);
|
|
68
|
+
const tool = new CommsTool(store);
|
|
69
|
+
store.getCcPeerVersion = () => "9.9.9";
|
|
70
|
+
const result = await tool.handle(ctx, buildAction({ action: "whoami" }));
|
|
71
|
+
expect(result.content).toContain("Cc-peer: 9.9.9");
|
|
72
|
+
});
|
|
47
73
|
});
|
|
48
74
|
describe("update reports this bridge's own version", () => {
|
|
49
75
|
it("includes the package's own version in the Updated summary", async () => {
|
|
@@ -63,5 +89,17 @@ describe("update reports this bridge's own version", () => {
|
|
|
63
89
|
const result = await tool.handle(ctx, buildAction({ action: "update", status: "idle" }));
|
|
64
90
|
expect(result.content).toContain("Update available: 99.0.0");
|
|
65
91
|
});
|
|
92
|
+
it("includes the installed wire-mesh-core version, and cc-peer's once wired", async () => {
|
|
93
|
+
const store = new MeshStore();
|
|
94
|
+
await wireTestTransport(store);
|
|
95
|
+
const ctx = await registeredContext(store);
|
|
96
|
+
const tool = new CommsTool(store);
|
|
97
|
+
const before = await tool.handle(ctx, buildAction({ action: "update", status: "busy" }));
|
|
98
|
+
expect(before.content).toContain(`wireMeshCore=${getWireMeshCoreVersion()}`);
|
|
99
|
+
expect(before.content).not.toContain("ccPeer=");
|
|
100
|
+
store.getCcPeerVersion = () => "9.9.9";
|
|
101
|
+
const after = await tool.handle(ctx, buildAction({ action: "update", status: "idle" }));
|
|
102
|
+
expect(after.content).toContain("ccPeer=9.9.9");
|
|
103
|
+
});
|
|
66
104
|
});
|
|
67
105
|
//# sourceMappingURL=tool-version-reporting.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-version-reporting.test.js","sourceRoot":"","sources":["../../src/test/tool-version-reporting.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tool-version-reporting.test.js","sourceRoot":"","sources":["../../src/test/tool-version-reporting.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for version-report-actions.ts's pure formatting/action helpers (agent-comms#198) -- exercised directly against fake stores rather than a real MeshStore, mirroring gateway-trust-actions.ts's own test style for the same reason: every one of these is a pure translation from whatever the store answers into either a CommsResult or a formatted line, with no mesh machinery of its own to set up.
|
|
3
|
+
*/
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=version-report-actions.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-report-actions.test.d.ts","sourceRoot":"","sources":["../../src/test/version-report-actions.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for version-report-actions.ts's pure formatting/action helpers (agent-comms#198) -- exercised directly against fake stores rather than a real MeshStore, mirroring gateway-trust-actions.ts's own test style for the same reason: every one of these is a pure translation from whatever the store answers into either a CommsResult or a formatted line, with no mesh machinery of its own to set up.
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from "vitest";
|
|
5
|
+
import { formatListedAgentVersions, formatSelfVersionLines, formatSelfVersionSuffix, handleQueryVersion, } from "../core/version-report-actions.js";
|
|
6
|
+
import { getOwnPackageVersion } from "../core/package-version.js";
|
|
7
|
+
import { getWireMeshCoreVersion } from "../core/wire-mesh-core-version.js";
|
|
8
|
+
describe("handleQueryVersion", () => {
|
|
9
|
+
it("reports not-mesh-backed when the store has no queryVersion method", async () => {
|
|
10
|
+
const result = await handleQueryVersion({}, { action: "query_version", device: "abc123" });
|
|
11
|
+
expect(result.isError).toBe(true);
|
|
12
|
+
expect(result.content).toContain("requires a mesh-backed store");
|
|
13
|
+
});
|
|
14
|
+
it("reports the peer's live version on success", async () => {
|
|
15
|
+
const store = {
|
|
16
|
+
queryVersion: async (deviceId) => {
|
|
17
|
+
await Promise.resolve();
|
|
18
|
+
expect(deviceId).toBe("abc123");
|
|
19
|
+
return { version: "1.2.3" };
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
const result = await handleQueryVersion(store, {
|
|
23
|
+
action: "query_version",
|
|
24
|
+
device: "abc123",
|
|
25
|
+
});
|
|
26
|
+
expect(result.isError).toBe(false);
|
|
27
|
+
expect(result.content).toBe("abc123 is running wire-mesh-core 1.2.3.");
|
|
28
|
+
});
|
|
29
|
+
it("reports the store's own error on failure", async () => {
|
|
30
|
+
const store = {
|
|
31
|
+
queryVersion: async () => {
|
|
32
|
+
await Promise.resolve();
|
|
33
|
+
return { error: "unauthorized" };
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
const result = await handleQueryVersion(store, {
|
|
37
|
+
action: "query_version",
|
|
38
|
+
device: "abc123",
|
|
39
|
+
});
|
|
40
|
+
expect(result.isError).toBe(true);
|
|
41
|
+
expect(result.content).toBe("Failed to query abc123's version: unauthorized");
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
describe("formatSelfVersionLines / formatSelfVersionSuffix", () => {
|
|
45
|
+
it("includes only the wire-mesh-core line when no cc-peer getter is wired", () => {
|
|
46
|
+
expect(formatSelfVersionLines(undefined)).toEqual([
|
|
47
|
+
`Wire-mesh-core: ${getWireMeshCoreVersion()}`,
|
|
48
|
+
]);
|
|
49
|
+
expect(formatSelfVersionSuffix(undefined)).toBe(`, wireMeshCore=${getWireMeshCoreVersion()}`);
|
|
50
|
+
});
|
|
51
|
+
it("includes a cc-peer line/suffix once a getter answers one", () => {
|
|
52
|
+
const getCcPeerVersion = () => "9.9.9";
|
|
53
|
+
expect(formatSelfVersionLines(getCcPeerVersion)).toEqual([
|
|
54
|
+
`Wire-mesh-core: ${getWireMeshCoreVersion()}`,
|
|
55
|
+
"Cc-peer: 9.9.9",
|
|
56
|
+
]);
|
|
57
|
+
expect(formatSelfVersionSuffix(getCcPeerVersion)).toBe(`, wireMeshCore=${getWireMeshCoreVersion()}, ccPeer=9.9.9`);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe("formatListedAgentVersions", () => {
|
|
61
|
+
it("reads local versions for the requester's own entry, ignoring the store's peer getters", () => {
|
|
62
|
+
const store = {
|
|
63
|
+
getPeerAgentCommsVersion: () => "should-not-be-used",
|
|
64
|
+
getPeerWireMeshCoreVersion: () => "should-not-be-used",
|
|
65
|
+
getPeerCcPeerVersion: () => "should-not-be-used",
|
|
66
|
+
};
|
|
67
|
+
const formatted = formatListedAgentVersions(store, "self-device", true, () => "9.9.9");
|
|
68
|
+
expect(formatted).toBe(`agent-comms ${getOwnPackageVersion()}, wire-mesh-core ${getWireMeshCoreVersion()}, cc-peer 9.9.9`);
|
|
69
|
+
});
|
|
70
|
+
it("reads gossiped versions for another peer, defaulting to unknown when never gossiped", () => {
|
|
71
|
+
const knownPeer = formatListedAgentVersions({
|
|
72
|
+
getPeerAgentCommsVersion: () => "3.0.0",
|
|
73
|
+
getPeerWireMeshCoreVersion: () => "1.50.0",
|
|
74
|
+
}, "peer-device", false, undefined);
|
|
75
|
+
expect(knownPeer).toBe("agent-comms 3.0.0, wire-mesh-core 1.50.0");
|
|
76
|
+
const unknownPeer = formatListedAgentVersions({}, "peer-device", false, undefined);
|
|
77
|
+
expect(unknownPeer).toBe("agent-comms unknown, wire-mesh-core unknown");
|
|
78
|
+
});
|
|
79
|
+
it("includes a peer's cc-peer version only when the store actually reports one", () => {
|
|
80
|
+
const formatted = formatListedAgentVersions({
|
|
81
|
+
getPeerAgentCommsVersion: () => "3.0.0",
|
|
82
|
+
getPeerWireMeshCoreVersion: () => "1.50.0",
|
|
83
|
+
getPeerCcPeerVersion: () => "1.5.0",
|
|
84
|
+
}, "peer-device", false, undefined);
|
|
85
|
+
expect(formatted).toBe("agent-comms 3.0.0, wire-mesh-core 1.50.0, cc-peer 1.5.0");
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=version-report-actions.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-report-actions.test.js","sourceRoot":"","sources":["../../src/test/version-report-actions.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* getWireMeshCoreVersion reads this process's own installed wire-mesh-core dependency's real package.json version (agent-comms#198) -- asserted here against a real semver-shaped string rather than a specific value, since the exact installed version is whatever the lockfile currently pins and would make this test rot the moment it's bumped.
|
|
3
|
+
*/
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=wire-mesh-core-version.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire-mesh-core-version.test.d.ts","sourceRoot":"","sources":["../../src/test/wire-mesh-core-version.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* getWireMeshCoreVersion reads this process's own installed wire-mesh-core dependency's real package.json version (agent-comms#198) -- asserted here against a real semver-shaped string rather than a specific value, since the exact installed version is whatever the lockfile currently pins and would make this test rot the moment it's bumped.
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from "vitest";
|
|
5
|
+
import { getWireMeshCoreVersion } from "../core/wire-mesh-core-version.js";
|
|
6
|
+
describe("getWireMeshCoreVersion", () => {
|
|
7
|
+
it("returns a semver-shaped version string", () => {
|
|
8
|
+
expect(getWireMeshCoreVersion()).toMatch(/^\d+\.\d+\.\d+/);
|
|
9
|
+
});
|
|
10
|
+
it("returns the identical, cached value on a second call", () => {
|
|
11
|
+
expect(getWireMeshCoreVersion()).toBe(getWireMeshCoreVersion());
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=wire-mesh-core-version.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire-mesh-core-version.test.js","sourceRoot":"","sources":["../../src/test/wire-mesh-core-version.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAE3E,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,sBAAsB,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,sBAAsB,EAAE,CAAC,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-comms",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.21.0",
|
|
4
4
|
"description": "Cross-harness communication mesh for LLM agents — rooms, DMs, presence, and real-time push delivery over TCP",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "pnpm@12.4.1+sha512.2e81e399d73fe8390dab25e06aa788ab7a5908248d2f5a370f82b481147a6a7a367bf8048f9a6fdb6460f21a66f0542dedb8b94ca2c8723596741920b1656d4c",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"scripts": {
|
|
49
49
|
"prepare": "husky",
|
|
50
50
|
"build:frontend": "turbo run build:frontend:run",
|
|
51
|
-
"build:frontend:run": "
|
|
51
|
+
"build:frontend:run": "vite build --config src/bridges/user/web/vite.config.ts",
|
|
52
52
|
"build": "turbo run build:run",
|
|
53
53
|
"build:run": "tsc && tsx scripts/copy-web-assets.ts && printf '#!/usr/bin/env node\n' | cat - dist/cli.js > dist/cli.tmp && mv dist/cli.tmp dist/cli.js",
|
|
54
54
|
"generate:server-json": "tsx scripts/sync-release-metadata.ts",
|
|
@@ -85,16 +85,24 @@
|
|
|
85
85
|
"@stryker-mutator/api": "10.0.0",
|
|
86
86
|
"@stryker-mutator/core": "10.0.0",
|
|
87
87
|
"@stryker-mutator/typescript-checker": "10.0.0",
|
|
88
|
+
"@testing-library/jest-dom": "7.0.1",
|
|
89
|
+
"@testing-library/react": "16.3.3",
|
|
90
|
+
"@testing-library/user-event": "14.6.7",
|
|
88
91
|
"@types/bun": "1.3.14",
|
|
89
92
|
"@types/node": "^26.1.1",
|
|
93
|
+
"@types/react": "19.3.0",
|
|
94
|
+
"@types/react-dom": "19.3.0",
|
|
90
95
|
"@types/ws": "8.18.1",
|
|
96
|
+
"@vitejs/plugin-react": "6.1.1",
|
|
91
97
|
"conventional-changelog-conventionalcommits": "10.2.1",
|
|
92
|
-
"esbuild": "0.28.1",
|
|
93
98
|
"eslint": "10.7.0",
|
|
94
99
|
"eslint-config-prettier": "10.1.8",
|
|
100
|
+
"eslint-plugin-jsx-a11y": "6.10.2",
|
|
95
101
|
"eslint-plugin-prettier": "5.5.6",
|
|
96
|
-
"
|
|
102
|
+
"eslint-plugin-react": "7.37.5",
|
|
103
|
+
"eslint-plugin-react-hooks": "7.1.1",
|
|
97
104
|
"husky": "9.1.7",
|
|
105
|
+
"jsdom": "30.1.0",
|
|
98
106
|
"lint-staged": "17.0.8",
|
|
99
107
|
"prettier": "3.9.5",
|
|
100
108
|
"semantic-release": "25.0.7",
|
|
@@ -102,16 +110,24 @@
|
|
|
102
110
|
"turbo": "2.10.13",
|
|
103
111
|
"typescript": "^6.0.3",
|
|
104
112
|
"typescript-eslint": "8.69.0",
|
|
113
|
+
"vite": "8.3.0",
|
|
114
|
+
"vite-plugin-pwa": "1.3.0",
|
|
105
115
|
"vitest": "5.0.0"
|
|
106
116
|
},
|
|
107
117
|
"dependencies": {
|
|
118
|
+
"@mantine/core": "9.6.1",
|
|
119
|
+
"@mantine/hooks": "9.6.1",
|
|
108
120
|
"@modelcontextprotocol/sdk": "1.30.0",
|
|
121
|
+
"@orpc/client": "2.0.0-beta.35",
|
|
122
|
+
"@orpc/contract": "2.0.0-beta.35",
|
|
123
|
+
"@orpc/server": "2.0.0-beta.35",
|
|
109
124
|
"cbor2": "2.3.0",
|
|
110
|
-
"cc-peer": "1.
|
|
125
|
+
"cc-peer": "1.5.0",
|
|
111
126
|
"openpgp": "6.3.1",
|
|
112
|
-
"
|
|
127
|
+
"react": "19.3.0",
|
|
128
|
+
"react-dom": "19.3.0",
|
|
113
129
|
"typebox": "1.3.6",
|
|
114
|
-
"wire-mesh-core": "1.
|
|
130
|
+
"wire-mesh-core": "1.57.0",
|
|
115
131
|
"ws": "8.21.1",
|
|
116
132
|
"zod": "4.4.3"
|
|
117
133
|
},
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Build script — bundles the Preact frontend into web/dist/bundle.js.
|
|
3
|
-
*
|
|
4
|
-
* esbuild compiles main.tsx (with inlined CSS) into a single JS bundle.
|
|
5
|
-
* The server loads bundle.js and index.html into memory at startup.
|
|
6
|
-
*
|
|
7
|
-
* Also copies the web app manifest and PWA icons to dist/ for serving.
|
|
8
|
-
*
|
|
9
|
-
* Usage: pnpm build:frontend
|
|
10
|
-
*/
|
|
11
|
-
export {};
|
|
12
|
-
//# sourceMappingURL=build.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../../src/bridges/user/web/build.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Build script — bundles the Preact frontend into web/dist/bundle.js.
|
|
3
|
-
*
|
|
4
|
-
* esbuild compiles main.tsx (with inlined CSS) into a single JS bundle.
|
|
5
|
-
* The server loads bundle.js and index.html into memory at startup.
|
|
6
|
-
*
|
|
7
|
-
* Also copies the web app manifest and PWA icons to dist/ for serving.
|
|
8
|
-
*
|
|
9
|
-
* Usage: pnpm build:frontend
|
|
10
|
-
*/
|
|
11
|
-
import * as esbuild from "esbuild";
|
|
12
|
-
import * as fs from "node:fs";
|
|
13
|
-
import * as path from "node:path";
|
|
14
|
-
import { fileURLToPath } from "node:url";
|
|
15
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
16
|
-
const FRONTEND_DIR = path.join(__dirname, "frontend");
|
|
17
|
-
const DIST_DIR = path.join(__dirname, "dist");
|
|
18
|
-
/**
|
|
19
|
-
* esbuild plugin to inline CSS as a side-effect import.
|
|
20
|
-
* Replaces `import "./styles.css"` with a <style> injection at runtime.
|
|
21
|
-
*/
|
|
22
|
-
const inlineCssPlugin = {
|
|
23
|
-
name: "inline-css",
|
|
24
|
-
setup(build) {
|
|
25
|
-
build.onResolve({ filter: /\.css$/ }, (args) => {
|
|
26
|
-
return {
|
|
27
|
-
path: path.resolve(args.resolveDir, args.path),
|
|
28
|
-
namespace: "inline-css",
|
|
29
|
-
};
|
|
30
|
-
});
|
|
31
|
-
build.onLoad({ filter: /.*/, namespace: "inline-css" }, async (args) => {
|
|
32
|
-
const css = await fs.promises.readFile(args.path, "utf8");
|
|
33
|
-
const escaped = JSON.stringify(css);
|
|
34
|
-
return {
|
|
35
|
-
contents: `document.head.appendChild(Object.assign(document.createElement("style"), { textContent: ${escaped} }));`,
|
|
36
|
-
loader: "js",
|
|
37
|
-
};
|
|
38
|
-
});
|
|
39
|
-
},
|
|
40
|
-
};
|
|
41
|
-
async function main() {
|
|
42
|
-
// Start from a clean output dir so stale artifacts (e.g. renamed bundles,
|
|
43
|
-
// leftover sourcemaps) can't linger and get swept into the published
|
|
44
|
-
// package by the copy-web-assets step.
|
|
45
|
-
fs.rmSync(DIST_DIR, { recursive: true, force: true });
|
|
46
|
-
fs.mkdirSync(DIST_DIR, { recursive: true });
|
|
47
|
-
await esbuild.build({
|
|
48
|
-
entryPoints: [path.join(FRONTEND_DIR, "main.tsx")],
|
|
49
|
-
bundle: true,
|
|
50
|
-
minify: true,
|
|
51
|
-
target: "es2020",
|
|
52
|
-
format: "iife",
|
|
53
|
-
outfile: path.join(DIST_DIR, "bundle.js"),
|
|
54
|
-
plugins: [inlineCssPlugin],
|
|
55
|
-
jsx: "automatic",
|
|
56
|
-
jsxImportSource: "preact",
|
|
57
|
-
});
|
|
58
|
-
// Build the service worker as a separate bundle.
|
|
59
|
-
// Service workers run in a separate context with no DOM access,
|
|
60
|
-
// so this is intentionally a standalone IIFE with no imports.
|
|
61
|
-
await esbuild.build({
|
|
62
|
-
entryPoints: [path.join(FRONTEND_DIR, "sw.ts")],
|
|
63
|
-
bundle: true,
|
|
64
|
-
minify: true,
|
|
65
|
-
target: "es2020",
|
|
66
|
-
format: "iife",
|
|
67
|
-
outfile: path.join(DIST_DIR, "sw.js"),
|
|
68
|
-
});
|
|
69
|
-
// Build the mesh SharedWorker as a separate bundle.
|
|
70
|
-
// SharedWorkers run in their own global scope, shared across tabs.
|
|
71
|
-
// The worker contains inlined types and no external dependencies —
|
|
72
|
-
// all state management logic is self-contained.
|
|
73
|
-
await esbuild.build({
|
|
74
|
-
entryPoints: [path.join(FRONTEND_DIR, "mesh-worker.ts")],
|
|
75
|
-
bundle: true,
|
|
76
|
-
minify: true,
|
|
77
|
-
target: "es2020",
|
|
78
|
-
format: "iife",
|
|
79
|
-
outfile: path.join(DIST_DIR, "mesh-worker.js"),
|
|
80
|
-
});
|
|
81
|
-
// Copy web app manifest to dist/
|
|
82
|
-
fs.copyFileSync(path.join(FRONTEND_DIR, "manifest.json"), path.join(DIST_DIR, "manifest.json"));
|
|
83
|
-
// Copy PWA icons to dist/icons/
|
|
84
|
-
const iconsDir = path.join(DIST_DIR, "icons");
|
|
85
|
-
fs.mkdirSync(iconsDir, { recursive: true });
|
|
86
|
-
for (const file of fs.readdirSync(path.join(FRONTEND_DIR, "icons"))) {
|
|
87
|
-
fs.copyFileSync(path.join(FRONTEND_DIR, "icons", file), path.join(iconsDir, file));
|
|
88
|
-
}
|
|
89
|
-
console.log(`Built frontend: ${DIST_DIR}`);
|
|
90
|
-
}
|
|
91
|
-
main().catch((err) => {
|
|
92
|
-
console.error(err);
|
|
93
|
-
process.exit(1);
|
|
94
|
-
});
|
|
95
|
-
//# sourceMappingURL=build.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../../src/bridges/user/web/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DOM utilities for the web UI.
|
|
3
|
-
*
|
|
4
|
-
* escapeHtml and formatTime are used by message rendering.
|
|
5
|
-
* requireElement is used by the entry point to grab the root mount point.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Query selector that throws if the element is missing.
|
|
9
|
-
* Use for elements that must exist in the HTML shell.
|
|
10
|
-
*/
|
|
11
|
-
export declare function requireElement(root: ParentNode, selector: string): HTMLElement;
|
|
12
|
-
export declare function requireElement<K extends keyof HTMLElementTagNameMap>(root: ParentNode, selector: string, tag: K): HTMLElementTagNameMap[K];
|
|
13
|
-
/**
|
|
14
|
-
* HTML-escape a string for safe insertion.
|
|
15
|
-
* With Preact JSX, text content is auto-escaped — this is only needed
|
|
16
|
-
* when constructing raw HTML strings.
|
|
17
|
-
*/
|
|
18
|
-
export declare function escapeHtml(text: string): string;
|
|
19
|
-
export declare function formatTime(timestamp: string): string;
|
|
20
|
-
/**
|
|
21
|
-
* Get an input or select element from an event target.
|
|
22
|
-
* Avoids type assertions by using instanceof narrowing.
|
|
23
|
-
*/
|
|
24
|
-
export declare function inputFromEvent(e: Event): HTMLInputElement | HTMLSelectElement;
|
|
25
|
-
//# sourceMappingURL=dom.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/dom.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC;AAChF,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,qBAAqB,EAClE,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,CAAC,GACL,qBAAqB,CAAC,CAAC,CAAC,CAAC;AAgB5B;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM/C;AAQD,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,GAAG,gBAAgB,GAAG,iBAAiB,CAS7E"}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DOM utilities for the web UI.
|
|
3
|
-
*
|
|
4
|
-
* escapeHtml and formatTime are used by message rendering.
|
|
5
|
-
* requireElement is used by the entry point to grab the root mount point.
|
|
6
|
-
*/
|
|
7
|
-
export function requireElement(root, selector, tag) {
|
|
8
|
-
const el = root.querySelector(selector);
|
|
9
|
-
if (!el)
|
|
10
|
-
throw new Error(`Required element not found: ${selector}`);
|
|
11
|
-
if (tag !== undefined && el.tagName.toLowerCase() !== tag) {
|
|
12
|
-
throw new Error(`Element ${selector} must be <${tag}>, got <${el.tagName.toLowerCase()}>`);
|
|
13
|
-
}
|
|
14
|
-
return el;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* HTML-escape a string for safe insertion.
|
|
18
|
-
* With Preact JSX, text content is auto-escaped — this is only needed
|
|
19
|
-
* when constructing raw HTML strings.
|
|
20
|
-
*/
|
|
21
|
-
export function escapeHtml(text) {
|
|
22
|
-
return text
|
|
23
|
-
.replace(/&/g, "&")
|
|
24
|
-
.replace(/</g, "<")
|
|
25
|
-
.replace(/>/g, ">")
|
|
26
|
-
.replace(/"/g, """);
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Format an ISO timestamp to HH:MM:SS for display.
|
|
30
|
-
*/
|
|
31
|
-
const ISO_TIME_OF_DAY_START = 11;
|
|
32
|
-
const ISO_TIME_OF_DAY_END = 19;
|
|
33
|
-
export function formatTime(timestamp) {
|
|
34
|
-
return timestamp.slice(ISO_TIME_OF_DAY_START, ISO_TIME_OF_DAY_END);
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Get an input or select element from an event target.
|
|
38
|
-
* Avoids type assertions by using instanceof narrowing.
|
|
39
|
-
*/
|
|
40
|
-
export function inputFromEvent(e) {
|
|
41
|
-
const target = e.target;
|
|
42
|
-
if (target instanceof HTMLInputElement ||
|
|
43
|
-
target instanceof HTMLSelectElement) {
|
|
44
|
-
return target;
|
|
45
|
-
}
|
|
46
|
-
throw new Error("Event target is not an input element");
|
|
47
|
-
}
|
|
48
|
-
//# sourceMappingURL=dom.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dom.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/frontend/dom.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,MAAM,UAAU,cAAc,CAC5B,IAAgB,EAChB,QAAgB,EAChB,GAAY;IAEZ,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAc,QAAQ,CAAC,CAAC;IACrD,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;IACpE,IAAI,GAAG,KAAK,SAAS,IAAI,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CACb,WAAW,QAAQ,aAAa,GAAG,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAC1E,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACjC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B,MAAM,UAAU,UAAU,CAAC,SAAiB;IAC1C,OAAO,SAAS,CAAC,KAAK,CAAC,qBAAqB,EAAE,mBAAmB,CAAC,CAAC;AACrE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,CAAQ;IACrC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACxB,IACE,MAAM,YAAY,gBAAgB;QAClC,MAAM,YAAY,iBAAiB,EACnC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GENERATED FILE — do not edit.
|
|
3
|
-
* Rebuild with: pnpm build:frontend
|
|
4
|
-
*/
|
|
5
|
-
export declare const FRONTEND_HTML = "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Agent Comms</title>\n</head>\n<body>\n\n<div id=\"sidebar\">\n <h2>Agent Comms</h2>\n <div class=\"sidebar-section\">\n <h3>Rooms</h3>\n <div id=\"room-list\"></div>\n <h3>Agents</h3>\n <div id=\"agent-list\"></div>\n </div>\n</div>\n\n<div id=\"main\">\n <div id=\"header\">Select a room</div>\n <div id=\"messages\"></div>\n <div id=\"input-bar\">\n <input id=\"input\" type=\"text\" placeholder=\"Type a message or /command...\" autocomplete=\"off\" />\n <button id=\"send-btn\">Send</button>\n </div>\n</div>\n\n <script>\n\"use strict\";(()=>{var O=Object.defineProperty;var U=(e,n,t)=>n in e?O(e,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[n]=t;var m=(e,n,t)=>U(e,typeof n!=\"symbol\"?n+\"\":n,t);document.head.appendChild(Object.assign(document.createElement(\"style\"),{textContent:`:root {\n --bg: #1a1a2e;\n --surface: #16213e;\n --border: #0f3460;\n --text: #e4e4e4;\n --dim: #888;\n --accent: #00b4d8;\n --green: #06d6a0;\n --red: #ef476f;\n --yellow: #ffd166;\n --purple: #b5838d;\n}\n* { margin: 0; padding: 0; box-sizing: border-box; }\nbody {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n background: var(--bg);\n color: var(--text);\n height: 100vh;\n display: flex;\n}\n#sidebar {\n width: 260px;\n background: var(--surface);\n border-right: 1px solid var(--border);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n#sidebar h2 {\n padding: 12px 16px;\n font-size: 14px;\n color: var(--accent);\n border-bottom: 1px solid var(--border);\n}\n.sidebar-section {\n flex: 1;\n overflow-y: auto;\n padding: 8px;\n}\n.sidebar-section h3 {\n font-size: 11px;\n text-transform: uppercase;\n color: var(--dim);\n padding: 8px 8px 4px;\n}\n.room-item, .agent-item {\n padding: 6px 10px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n.room-item:hover, .agent-item:hover { background: rgba(255,255,255,0.05); }\n.room-item.active { background: var(--border); }\n.status-dot {\n width: 8px; height: 8px;\n border-radius: 50%;\n display: inline-block;\n}\n.status-dot.active { background: var(--green); }\n.status-dot.idle { background: var(--yellow); }\n.status-dot.busy { background: var(--red); }\n.status-dot.offline { background: var(--dim); }\n#main {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n#header {\n padding: 12px 20px;\n border-bottom: 1px solid var(--border);\n font-size: 15px;\n font-weight: 600;\n background: var(--surface);\n}\n#messages {\n flex: 1;\n overflow-y: auto;\n padding: 16px 20px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n.msg {\n font-size: 13px;\n line-height: 1.5;\n}\n.msg .sender { font-weight: 600; color: var(--accent); }\n.msg .time { color: var(--dim); font-size: 11px; margin-left: 8px; }\n.msg.system { color: var(--dim); font-style: italic; }\n.msg.status { color: var(--yellow); font-size: 12px; }\n.msg.dm { color: var(--purple); }\n.msg .dm-badge {\n background: var(--purple);\n color: #fff;\n font-size: 10px;\n padding: 1px 5px;\n border-radius: 3px;\n font-weight: 600;\n}\n#input-bar {\n display: flex;\n padding: 12px 20px;\n gap: 8px;\n background: var(--surface);\n border-top: 1px solid var(--border);\n}\n#input {\n flex: 1;\n background: var(--bg);\n border: 1px solid var(--border);\n border-radius: 6px;\n padding: 8px 12px;\n color: var(--text);\n font-size: 13px;\n outline: none;\n}\n#input:focus { border-color: var(--accent); }\n#send-btn {\n background: var(--accent);\n border: none;\n border-radius: 6px;\n padding: 8px 16px;\n color: #fff;\n font-weight: 600;\n cursor: pointer;\n}\n#send-btn:hover { opacity: 0.9; }\n#empty-state {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--dim);\n font-size: 14px;\n}\n`}));function q(e){return typeof e==\"object\"&&e!==null}function K(e){return Array.isArray(e)}function J(e){return Array.isArray(e)}function B(e){return Array.isArray(e)}function G(e){return q(e)&&typeof e.type==\"string\"}async function M(){let n=await(await fetch(\"/api/agents\")).json();if(!K(n))throw new Error(\"Invalid agents response\");return n}async function A(){let n=await(await fetch(\"/api/rooms\")).json();if(!J(n))throw new Error(\"Invalid rooms response\");return n}async function C(e,n){let t=n?`/api/rooms/${encodeURIComponent(e)}/messages?since=${encodeURIComponent(n)}`:`/api/rooms/${encodeURIComponent(e)}/messages`,s=await(await fetch(t)).json();if(!B(s))throw new Error(\"Invalid messages response\");return s}var f=class{constructor(n){m(this,\"ws\");m(this,\"reconnectTimer\");m(this,\"handler\");this.handler=n}connect(){let n=location.protocol===\"https:\"?\"wss:\":\"ws:\",t=new WebSocket(`${n}//${location.host}`);this.ws=t,t.onopen=()=>{this.handler.onOpen?.()},t.onclose=()=>{this.handler.onClose?.(),this.scheduleReconnect()},t.onerror=()=>{},t.onmessage=o=>{let s=JSON.parse(typeof o.data==\"string\"?o.data:String(o.data));G(s)&&this.handler.onFrame?.(s)}}sendAction(n){let t=this.ws;t?.readyState===WebSocket.OPEN&&t.send(JSON.stringify(n))}disconnect(){this.reconnectTimer!==void 0&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0);let n=this.ws;n&&n.close(),this.ws=void 0}scheduleReconnect(){this.reconnectTimer=setTimeout(()=>{this.connect()},3e3)}};function l(e,n,t){let o=e.querySelector(n);if(!o)throw new Error(`Required element not found: ${n}`);if(t&&o.tagName.toLowerCase()!==t)throw new Error(`Element ${n} must be <${t}>, got <${o.tagName.toLowerCase()}>`);return o}function p(e,n){let t=e.createElement(\"div\");return t.textContent=n,t.innerHTML}function $(e,n,t,...o){let s=e.createElement(n);if(t)for(let[r,a]of Object.entries(t))s.setAttribute(r,a);for(let r of o)typeof r==\"string\"?s.appendChild(e.createTextNode(r)):s.appendChild(r);return s}function h(e){e.innerHTML=\"\"}function k(e){return e.slice(11,19)}function L(e,n,t){let o=e.trim();return o.length===0?{kind:\"ignored\"}:o.startsWith(\"/\")?Q(o,n):n?{kind:\"action\",action:{action:\"send\",target:n,content:o}}:t?{kind:\"action\",action:{action:\"dm\",target:t,content:o}}:{kind:\"local\",result:{type:\"error\",text:\"Join a room or select an agent first\"}}}function Q(e,n){let t=e.slice(1).split(/\\s+/),o=(t[0]??\"\").toLowerCase();switch(o){case\"join\":return t[1]?{kind:\"action\",action:{action:\"join_room\",room:t[1]}}:{kind:\"local\",result:{type:\"error\",text:\"Usage: /join <room>\"}};case\"leave\":return{kind:\"action\",action:{action:\"leave_room\",room:t[1]??n??\"\"}};case\"rooms\":return{kind:\"action\",action:{action:\"list_rooms\"}};case\"agents\":return{kind:\"action\",action:{action:\"list_agents\"}};case\"dm\":return!t[1]||!t[2]?{kind:\"local\",result:{type:\"error\",text:\"Usage: /dm <agent> <message>\"}}:{kind:\"action\",action:{action:\"dm\",target:t[1],content:t.slice(2).join(\" \")}};case\"create\":return t[1]?{kind:\"action\",action:{action:\"create_room\",name:t[1],type:\"public\"}}:{kind:\"local\",result:{type:\"error\",text:\"Usage: /create <name>\"}};case\"destroy\":return t[1]?{kind:\"action\",action:{action:\"destroy_room\",room:t[1]}}:{kind:\"local\",result:{type:\"error\",text:\"Usage: /destroy <room>\"}};case\"help\":return{kind:\"local\",result:{type:\"help\",text:\"Commands: /join, /leave, /rooms, /agents, /dm, /create, /destroy, /help\"}};default:return{kind:\"local\",result:{type:\"unknown\",text:`Unknown command: /${o}`}}}}function S(e,n,t,o,s){let r=k(s),a=e.createElement(\"div\");a.className=\"msg\",a.innerHTML=`<span class=\"sender\">${p(e,t)}</span><span class=\"time\">${r}</span>: ${p(e,o)}`,n.messagesEl.appendChild(a),n.messagesEl.scrollTop=n.messagesEl.scrollHeight}function V(e,n,t,o,s){let r=k(s),a=e.createElement(\"div\");a.className=\"msg dm\",a.innerHTML=`<span class=\"dm-badge\">DM</span> <span class=\"sender\">${p(e,t)}</span><span class=\"time\">${r}</span>: ${p(e,o)}`,n.messagesEl.appendChild(a),n.messagesEl.scrollTop=n.messagesEl.scrollHeight}function c(e,n,t){let o=e.createElement(\"div\");o.className=\"msg system\",o.textContent=t,n.messagesEl.appendChild(o),n.messagesEl.scrollTop=n.messagesEl.scrollHeight}function y(e,n,t){let o=e.createElement(\"div\");o.className=\"msg status\",o.textContent=t,n.messagesEl.appendChild(o),n.messagesEl.scrollTop=n.messagesEl.scrollHeight}function w(e){h(e.messagesEl)}function H(e,n,t,o){switch(t.type){case\"room_message\":o===t.message.room&&S(e,n,t.message.from,t.message.content,t.message.timestamp);break;case\"dm\":V(e,n,t.message.from,t.message.content,t.message.timestamp);break;case\"member_joined\":c(e,n,`${t.agent} joined ${t.room}`);break;case\"member_left\":c(e,n,`${t.agent} left ${t.room}`);break;case\"member_status\":y(e,n,`${t.agent} is now ${t.status} in ${t.room}`);break;case\"delivery_status\":y(e,n,`Message ${t.messageId} ${t.status} by ${t.agent}`);break;case\"room_members\":if(o===t.room){let s=t.members.map(r=>`${r.name} (${r.status})`).join(\", \");c(e,n,`Members: ${s}`)}break;case\"room_invite\":{let s=t.roomDescription?` \\u2014 ${t.roomDescription}`:\"\";c(e,n,`${t.fromName} invited you to \"${t.room}\"${s}`);break}case\"invite_declined\":c(e,n,`${t.agentName} declined invite to ${t.room}: \"${t.reason}\"`);break}}function N(e,n,t,o,s){h(n.roomListEl);for(let r of t){let a=o===r.id,E=r.type.charAt(0).toUpperCase(),F=r.members.length,g=e.createElement(\"div\");g.className=`room-item${a?\" active\":\"\"}`,g.innerHTML=`${E} ${p(e,r.name)} <span style=\"color:var(--dim)\">(${String(F)})</span>`,g.onclick=()=>{s(r.id)},n.roomListEl.appendChild(g)}}function j(e,n,t,o){h(n.agentListEl);for(let s of t){let r=e.createElement(\"div\");r.className=\"agent-item\";let a=$(e,\"span\",{class:`status-dot ${s.status}`}),E=e.createTextNode(` ${s.name}`);r.appendChild(a),r.appendChild(E),o&&(r.onclick=()=>{o(s.id)}),n.agentListEl.appendChild(r)}}function x(e,n){e.headerEl.textContent=n}function D(e,n,t){for(let o of t)S(e,n,o.from,o.content,o.timestamp)}var _={currentRoom:void 0,dmTarget:void 0,agents:[],rooms:[],connected:!1},b=class{constructor(){m(this,\"state\",{..._});m(this,\"listeners\",new Set)}subscribe(n){return this.listeners.add(n),()=>{this.listeners.delete(n)}}get(){return this.state}setCurrentRoom(n){this.state={...this.state,currentRoom:n},this.notify()}setDmTarget(n){this.state={...this.state,dmTarget:n},this.notify()}setAgents(n){this.state={...this.state,agents:n},this.notify()}setRooms(n){this.state={...this.state,rooms:n},this.notify()}setConnected(n){this.state={...this.state,connected:n},this.notify()}applyState(n,t){this.state={...this.state,agents:n,rooms:t},this.notify()}reset(){this.state={..._},this.notify()}notify(){let n=this.state;for(let t of this.listeners)t(n)}};var X=l(document,\"#messages\"),u=l(document,\"#input\",\"input\"),R=l(document,\"#header\"),Y=l(document,\"#room-list\"),Z=l(document,\"#agent-list\"),d={messagesEl:X},I={roomListEl:Y,agentListEl:Z},i=new b;i.subscribe(e=>{N(document,I,e.rooms,e.currentRoom,ne),j(document,I,e.agents,te)});var P=new f({onOpen:()=>{i.setConnected(!0),c(document,d,\"Connected to mesh\")},onClose:()=>{i.setConnected(!1),c(document,d,\"Disconnected \\u2014 reconnecting...\")},onFrame:ee});function ee(e){switch(e.type){case\"delivery\":H(document,d,e.event,i.get().currentRoom),(e.event.type===\"member_joined\"||e.event.type===\"member_left\"||e.event.type===\"member_status\")&&T();break;case\"result\":if(c(document,d,e.result.content),!e.result.isError){if(v?.action===\"join_room\"&&!i.get().currentRoom){let n=v.room;i.setDmTarget(void 0),i.setCurrentRoom(n),x({headerEl:R},n)}T()}v=void 0;break;case\"error\":y(document,d,`Error: ${e.message}`);break;case\"state\":i.applyState(e.agents,e.rooms);break}}var v;function W(e){v=e,P.sendAction(e)}async function T(){let[e,n]=await Promise.all([M(),A()]);i.setAgents(e),i.setRooms(n)}async function ne(e){i.setDmTarget(void 0),i.setCurrentRoom(e),x({headerEl:R},e),w(d),W({action:\"join_room\",room:e});let n=await C(e);D(document,d,n),c(document,d,`Joined ${e}`),u.focus()}function te(e){i.setCurrentRoom(void 0),i.setDmTarget(e),w(d),x({headerEl:R},`DM with ${e}`),u.focus()}function z(){let e=u.value;u.value=\"\";let n=L(e,i.get().currentRoom,i.get().dmTarget);switch(n.kind){case\"action\":W(n.action);break;case\"local\":c(document,d,n.result.text);break;case\"ignored\":break}}var oe=l(document,\"#send-btn\");oe.onclick=z;u.addEventListener(\"keydown\",e=>{e.key===\"Enter\"&&z()});P.connect();T();u.focus();})();\n\n </script>\n</body>\n</html>\n";
|
|
6
|
-
//# sourceMappingURL=generated-html.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generated-html.d.ts","sourceRoot":"","sources":["../../../../src/bridges/user/web/generated-html.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,aAAa,ggZA6KzB,CAAC"}
|