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,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Federation integration test — verifies that two MeshStore instances on
|
|
3
|
+
* different "machines" (simulated via separate TCP meshes) can federate
|
|
4
|
+
* through coordinator-to-coordinator TLS links.
|
|
5
|
+
*
|
|
6
|
+
* Tests:
|
|
7
|
+
* 1. Establish federation link between two meshes
|
|
8
|
+
* 2. Agent presence propagates across federation
|
|
9
|
+
* 3. Messages in federated rooms propagate across federation
|
|
10
|
+
* 4. Non-federated rooms are isolated (messages never cross)
|
|
11
|
+
*
|
|
12
|
+
* Run: node dist/test/federation.integration.test.js
|
|
13
|
+
*/
|
|
14
|
+
import { MeshStore } from "../core/mesh-store.js";
|
|
15
|
+
import * as assert from "node:assert/strict";
|
|
16
|
+
import * as net from "node:net";
|
|
17
|
+
// Use high ports to avoid collisions with real meshes
|
|
18
|
+
const MESH_A_PORT = 28876;
|
|
19
|
+
const MESH_B_PORT = 28877;
|
|
20
|
+
const FED_PORT_A = 28878;
|
|
21
|
+
function sleep(ms) {
|
|
22
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
23
|
+
}
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Helpers
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
/**
|
|
28
|
+
* Create a mesh store that also listens on a second port for federation
|
|
29
|
+
* inbound connections. Returns the store and the federation listener port.
|
|
30
|
+
*/
|
|
31
|
+
async function createMesh(name, coordinatorPort) {
|
|
32
|
+
const store = new MeshStore(coordinatorPort);
|
|
33
|
+
const deliveries = [];
|
|
34
|
+
store.onDelivery = (_agentId, event) => {
|
|
35
|
+
deliveries.push(event);
|
|
36
|
+
};
|
|
37
|
+
await store.init();
|
|
38
|
+
await store.registerAgent({
|
|
39
|
+
name,
|
|
40
|
+
harness: "test",
|
|
41
|
+
cwd: `/test/${name}`,
|
|
42
|
+
pid: process.pid,
|
|
43
|
+
visibility: "visible",
|
|
44
|
+
tags: [],
|
|
45
|
+
});
|
|
46
|
+
return { store, deliveries };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Find a free port on localhost.
|
|
50
|
+
*/
|
|
51
|
+
function findFreePort() {
|
|
52
|
+
return new Promise((resolve, reject) => {
|
|
53
|
+
const server = net.createServer();
|
|
54
|
+
server.listen(0, "127.0.0.1", () => {
|
|
55
|
+
const addr = server.address();
|
|
56
|
+
if (typeof addr === "object" && addr !== null) {
|
|
57
|
+
const port = addr.port;
|
|
58
|
+
server.close(() => resolve(port));
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
server.close(() => reject(new Error("Failed to get port")));
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
server.on("error", reject);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
// Test runner
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
async function main() {
|
|
71
|
+
console.log("=== Federation Integration Tests ===\n");
|
|
72
|
+
// Create two separate meshes (simulating two machines)
|
|
73
|
+
console.log("Creating mesh A (coordinator)...");
|
|
74
|
+
const a = await createMesh("mesh-a-agent", MESH_A_PORT);
|
|
75
|
+
await sleep(100);
|
|
76
|
+
console.log("Creating mesh B (coordinator)...");
|
|
77
|
+
const b = await createMesh("mesh-b-agent", MESH_B_PORT);
|
|
78
|
+
await sleep(100);
|
|
79
|
+
// Find a free port for the federation server
|
|
80
|
+
const fedPort = await findFreePort();
|
|
81
|
+
console.log(`Using federation port ${String(fedPort)}`);
|
|
82
|
+
// Start a TLS federation server on mesh A that the FederationManager
|
|
83
|
+
// can accept connections on. We use the federation manager's TLS identity.
|
|
84
|
+
const fedServer = await startFedServer(a.store.federation.tlsIdentity, fedPort, a.store);
|
|
85
|
+
await sleep(100);
|
|
86
|
+
// --- Test 1: Establish federation link ---
|
|
87
|
+
console.log("\nTest 1: Establish federation link...");
|
|
88
|
+
const linkId = await b.store.fedConnect("127.0.0.1", fedPort);
|
|
89
|
+
console.log(` Link established: ${linkId}`);
|
|
90
|
+
assert.ok(linkId, "Should return a link ID");
|
|
91
|
+
const linksB = b.store.fedLinks();
|
|
92
|
+
assert.strictEqual(linksB.length, 1, "B should have 1 federation link");
|
|
93
|
+
const link = linksB[0];
|
|
94
|
+
assert.ok(link, "Link should exist");
|
|
95
|
+
assert.ok(link.remoteMeshId.length > 0, "Remote mesh ID should be present");
|
|
96
|
+
await sleep(200);
|
|
97
|
+
// --- Test 2: Agent presence propagates ---
|
|
98
|
+
console.log("Test 2: Agent presence propagates...");
|
|
99
|
+
// After federation, B should see A's agent as a federated agent
|
|
100
|
+
const agentsB = await b.store.listAgents(b.store.peerId);
|
|
101
|
+
console.log(` B sees ${String(agentsB.length)} agent(s)`);
|
|
102
|
+
const fedAgentsB = agentsB.filter((ag) => ag.tags.includes("federated"));
|
|
103
|
+
assert.ok(fedAgentsB.length >= 1, "B should see at least 1 federated agent from A");
|
|
104
|
+
// A should see B's agent as a federated agent
|
|
105
|
+
const agentsA = await a.store.listAgents(a.store.peerId);
|
|
106
|
+
console.log(` A sees ${String(agentsA.length)} agent(s)`);
|
|
107
|
+
const fedAgentsA = agentsA.filter((ag) => ag.tags.includes("federated"));
|
|
108
|
+
assert.ok(fedAgentsA.length >= 1, "A should see at least 1 federated agent from B");
|
|
109
|
+
// --- Test 3: Federated room messages propagate ---
|
|
110
|
+
console.log("Test 3: Federated room messages propagate...");
|
|
111
|
+
// Create a federated room on mesh A
|
|
112
|
+
const fedRoomId = `fed-room-${String(Date.now())}`;
|
|
113
|
+
const fedRoom = await a.store.createRoom({
|
|
114
|
+
name: fedRoomId,
|
|
115
|
+
type: "public",
|
|
116
|
+
owner: a.store.peerId,
|
|
117
|
+
description: "Federated test room",
|
|
118
|
+
federated: true,
|
|
119
|
+
});
|
|
120
|
+
console.log(` Created federated room: ${fedRoom.id}`);
|
|
121
|
+
await sleep(200);
|
|
122
|
+
// Create the same federated room on mesh B (same ID)
|
|
123
|
+
const fedRoomB = await b.store.createRoom({
|
|
124
|
+
name: fedRoomId,
|
|
125
|
+
type: "public",
|
|
126
|
+
owner: b.store.peerId,
|
|
127
|
+
description: "Federated test room",
|
|
128
|
+
federated: true,
|
|
129
|
+
});
|
|
130
|
+
console.log(` Created matching federated room on B: ${fedRoomB.id}`);
|
|
131
|
+
await sleep(200);
|
|
132
|
+
// Clear deliveries
|
|
133
|
+
a.deliveries.length = 0;
|
|
134
|
+
b.deliveries.length = 0;
|
|
135
|
+
// Send a message from A's agent in the federated room
|
|
136
|
+
const msg = await a.store.sendRoomMessage(fedRoom.id, a.store.peerId, "Hello from mesh A!");
|
|
137
|
+
console.log(` A sent: "${msg.content}"`);
|
|
138
|
+
await sleep(500);
|
|
139
|
+
// B should receive the federated message
|
|
140
|
+
const fedMsgs = b.deliveries.filter((e) => e.type === "room_message" && e.message.content === "Hello from mesh A!");
|
|
141
|
+
console.log(` B received ${String(fedMsgs.length)} federated message(s)`);
|
|
142
|
+
assert.ok(fedMsgs.length >= 1, "B should receive the federated room message");
|
|
143
|
+
// --- Test 4: Non-federated rooms are isolated ---
|
|
144
|
+
console.log("Test 4: Non-federated rooms are isolated...");
|
|
145
|
+
// Create a non-federated room on mesh A
|
|
146
|
+
const localRoomId = `local-room-${String(Date.now())}`;
|
|
147
|
+
console.log(` Creating non-federated room: ${localRoomId}`);
|
|
148
|
+
const localRoom = await a.store.createRoom({
|
|
149
|
+
name: localRoomId,
|
|
150
|
+
type: "public",
|
|
151
|
+
owner: a.store.peerId,
|
|
152
|
+
description: "Local-only room",
|
|
153
|
+
// federated defaults to false
|
|
154
|
+
});
|
|
155
|
+
console.log(` Created non-federated room: ${localRoom.id}, federated=${String(localRoom.federated)}`);
|
|
156
|
+
await sleep(100);
|
|
157
|
+
// Clear deliveries
|
|
158
|
+
b.deliveries.length = 0;
|
|
159
|
+
// Send a message in the non-federated room
|
|
160
|
+
console.log(" Sending message in non-federated room...");
|
|
161
|
+
await a.store.sendRoomMessage(localRoom.id, a.store.peerId, "Secret local message");
|
|
162
|
+
console.log(" Message sent.");
|
|
163
|
+
await sleep(100);
|
|
164
|
+
// B should NOT receive this message
|
|
165
|
+
const leakedMsgs = b.deliveries.filter((e) => e.type === "room_message" && e.message.content === "Secret local message");
|
|
166
|
+
console.log(` B received ${String(leakedMsgs.length)} leaked message(s)`);
|
|
167
|
+
assert.strictEqual(leakedMsgs.length, 0, "B should NOT receive non-federated room messages");
|
|
168
|
+
// --- Test 5: Federation link listing ---
|
|
169
|
+
console.log("Test 5: Federation link listing...");
|
|
170
|
+
const linksA = a.store.fedLinks();
|
|
171
|
+
assert.strictEqual(linksA.length, 1, "A should have 1 federation link");
|
|
172
|
+
console.log(` A links: ${linksA.map((l) => l.remoteName).join(", ")}`);
|
|
173
|
+
// --- Test 6: Disconnect federation link ---
|
|
174
|
+
console.log("Test 6: Disconnect federation link...");
|
|
175
|
+
await b.store.fedDisconnect(linkId);
|
|
176
|
+
await sleep(200);
|
|
177
|
+
const linksAfter = b.store.fedLinks();
|
|
178
|
+
assert.strictEqual(linksAfter.length, 0, "B should have 0 federation links after disconnect");
|
|
179
|
+
// --- Cleanup ---
|
|
180
|
+
console.log("\nCleaning up...");
|
|
181
|
+
fedServer.close();
|
|
182
|
+
await a.store.shutdown();
|
|
183
|
+
await b.store.shutdown();
|
|
184
|
+
console.log("\n✓ All federation tests passed!");
|
|
185
|
+
}
|
|
186
|
+
// ---------------------------------------------------------------------------
|
|
187
|
+
// Federation TLS server (simulates coordinator-to-coordinator link)
|
|
188
|
+
// ---------------------------------------------------------------------------
|
|
189
|
+
import * as tls from "node:tls";
|
|
190
|
+
/**
|
|
191
|
+
* Start a simple TLS server that accepts federation connections and
|
|
192
|
+
* delegates them to the FederationManager on the given store.
|
|
193
|
+
*/
|
|
194
|
+
function startFedServer(identity, port, store) {
|
|
195
|
+
return new Promise((resolve, reject) => {
|
|
196
|
+
const server = tls.createServer({
|
|
197
|
+
key: identity.privateKey,
|
|
198
|
+
cert: identity.certificate,
|
|
199
|
+
rejectUnauthorized: false,
|
|
200
|
+
requestCert: true,
|
|
201
|
+
}, (socket) => {
|
|
202
|
+
// Delegate to the FederationManager's inbound handler
|
|
203
|
+
void store.federation.handleInbound(socket).catch((err) => {
|
|
204
|
+
console.error("Fed inbound error:", err);
|
|
205
|
+
socket.destroy();
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
server.listen(port, "127.0.0.1", () => {
|
|
209
|
+
resolve(server);
|
|
210
|
+
});
|
|
211
|
+
server.on("error", reject);
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
main().catch((err) => {
|
|
215
|
+
console.error("Test failed:", err);
|
|
216
|
+
process.exit(1);
|
|
217
|
+
});
|
|
218
|
+
//# sourceMappingURL=federation.integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"federation.integration.test.js","sourceRoot":"","sources":["../../src/test/federation.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests for multi-listener coordinator support.
|
|
3
|
+
*
|
|
4
|
+
* Verifies that the coordinator can listen on multiple adapters,
|
|
5
|
+
* each with its own policy, and that listeners can be added and
|
|
6
|
+
* removed dynamically.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=listener-policy.integration.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listener-policy.integration.test.d.ts","sourceRoot":"","sources":["../../src/test/listener-policy.integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests for multi-listener coordinator support.
|
|
3
|
+
*
|
|
4
|
+
* Verifies that the coordinator can listen on multiple adapters,
|
|
5
|
+
* each with its own policy, and that listeners can be added and
|
|
6
|
+
* removed dynamically.
|
|
7
|
+
*/
|
|
8
|
+
import * as net from "node:net";
|
|
9
|
+
import { MeshStore } from "../core/mesh-store.js";
|
|
10
|
+
import { CommsTool } from "../core/tool.js";
|
|
11
|
+
import { buildAction } from "../core/bridge.js";
|
|
12
|
+
import * as assert from "node:assert/strict";
|
|
13
|
+
import { test, describe } from "node:test";
|
|
14
|
+
const TEST_PORT = 19880;
|
|
15
|
+
describe("listener policy", () => {
|
|
16
|
+
void test("coordinator starts with a single default localhost listener", async () => {
|
|
17
|
+
const store = new MeshStore(TEST_PORT);
|
|
18
|
+
await store.init();
|
|
19
|
+
const listeners = store.listListeners();
|
|
20
|
+
assert.equal(listeners.length, 1, "Should have exactly one listener");
|
|
21
|
+
assert.equal(listeners[0]?.policy, "full", "Default listener should have full policy");
|
|
22
|
+
assert.equal(listeners[0]?.isDefault, true, "Default listener should be marked as default");
|
|
23
|
+
assert.equal(listeners[0]?.host, "127.0.0.1", "Default listener should be on localhost");
|
|
24
|
+
assert.equal(listeners[0]?.port, TEST_PORT, "Default listener should be on the coordinator port");
|
|
25
|
+
await store.shutdown();
|
|
26
|
+
});
|
|
27
|
+
void test("addListener creates an additional listener", async () => {
|
|
28
|
+
const store = new MeshStore(TEST_PORT);
|
|
29
|
+
await store.init();
|
|
30
|
+
const id = await store.addListener("127.0.0.1", 0, "observe");
|
|
31
|
+
assert.ok(id, "Should return a listener ID");
|
|
32
|
+
const listeners = store.listListeners();
|
|
33
|
+
assert.equal(listeners.length, 2, "Should have two listeners");
|
|
34
|
+
const newListener = listeners.find((l) => l.id === id);
|
|
35
|
+
assert.ok(newListener, "New listener should be listed");
|
|
36
|
+
assert.equal(newListener.policy, "observe", "New listener should have observe policy");
|
|
37
|
+
assert.equal(newListener.isDefault, false, "New listener should not be default");
|
|
38
|
+
assert.ok(newListener.port > 0, "Should have an assigned port");
|
|
39
|
+
await store.shutdown();
|
|
40
|
+
});
|
|
41
|
+
void test("removeListener removes a non-default listener", async () => {
|
|
42
|
+
const store = new MeshStore(TEST_PORT);
|
|
43
|
+
await store.init();
|
|
44
|
+
const id = await store.addListener("127.0.0.1", 0, "observe");
|
|
45
|
+
assert.equal(store.listListeners().length, 2);
|
|
46
|
+
await store.removeListener(id);
|
|
47
|
+
const listeners = store.listListeners();
|
|
48
|
+
assert.equal(listeners.length, 1, "Should be back to one listener");
|
|
49
|
+
assert.equal(listeners[0]?.isDefault, true, "Remaining listener should be the default");
|
|
50
|
+
await store.shutdown();
|
|
51
|
+
});
|
|
52
|
+
void test("removeListener rejects removing the default listener", async () => {
|
|
53
|
+
const store = new MeshStore(TEST_PORT);
|
|
54
|
+
await store.init();
|
|
55
|
+
const listeners = store.listListeners();
|
|
56
|
+
const defaultId = listeners[0]?.id;
|
|
57
|
+
assert.ok(defaultId, "Should have a default listener");
|
|
58
|
+
await assert.rejects(() => store.removeListener(defaultId), /Cannot remove the default/, "Should reject removing default listener");
|
|
59
|
+
await store.shutdown();
|
|
60
|
+
});
|
|
61
|
+
void test("observe listener accepts connections but enforces policy", async () => {
|
|
62
|
+
const store = new MeshStore(TEST_PORT);
|
|
63
|
+
await store.init();
|
|
64
|
+
const id = await store.addListener("127.0.0.1", 0, "observe");
|
|
65
|
+
const listeners = store.listListeners();
|
|
66
|
+
const observeListener = listeners.find((l) => l.id === id);
|
|
67
|
+
assert.ok(observeListener, "Observe listener should exist");
|
|
68
|
+
// Verify a peer can connect to the observe listener's port
|
|
69
|
+
const canConnect = await new Promise((resolve) => {
|
|
70
|
+
const socket = net.createConnection({
|
|
71
|
+
port: observeListener.port,
|
|
72
|
+
host: "127.0.0.1",
|
|
73
|
+
});
|
|
74
|
+
socket.on("connect", () => {
|
|
75
|
+
socket.destroy();
|
|
76
|
+
resolve(true);
|
|
77
|
+
});
|
|
78
|
+
socket.on("error", () => {
|
|
79
|
+
socket.destroy();
|
|
80
|
+
resolve(false);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
assert.ok(canConnect, "Should be able to connect to observe listener");
|
|
84
|
+
await store.shutdown();
|
|
85
|
+
});
|
|
86
|
+
void test("mesh_listeners action returns all listeners via CommsTool", async () => {
|
|
87
|
+
const store = new MeshStore(TEST_PORT);
|
|
88
|
+
await store.init();
|
|
89
|
+
const agent = await store.registerAgent({
|
|
90
|
+
name: "test-agent",
|
|
91
|
+
harness: "test",
|
|
92
|
+
cwd: "/test",
|
|
93
|
+
pid: process.pid,
|
|
94
|
+
visibility: "visible",
|
|
95
|
+
tags: [],
|
|
96
|
+
});
|
|
97
|
+
await store.addListener("127.0.0.1", 0, "rooms-only");
|
|
98
|
+
const tool = new CommsTool(store);
|
|
99
|
+
const result = await tool.handle({ agentId: agent.id, harness: "test", cwd: "/test", pid: process.pid }, { action: "mesh_listeners" });
|
|
100
|
+
assert.ok(!result.isError, "Should not be an error");
|
|
101
|
+
assert.ok(result.content.includes("full"), "Should list the default full listener");
|
|
102
|
+
assert.ok(result.content.includes("rooms-only"), "Should list the rooms-only listener");
|
|
103
|
+
await store.shutdown();
|
|
104
|
+
});
|
|
105
|
+
void test("mesh_interfaces action returns available network adapters", async () => {
|
|
106
|
+
const store = new MeshStore(TEST_PORT);
|
|
107
|
+
await store.init();
|
|
108
|
+
const agent = await store.registerAgent({
|
|
109
|
+
name: "test-agent",
|
|
110
|
+
harness: "test",
|
|
111
|
+
cwd: "/test",
|
|
112
|
+
pid: process.pid,
|
|
113
|
+
visibility: "visible",
|
|
114
|
+
tags: [],
|
|
115
|
+
});
|
|
116
|
+
const tool = new CommsTool(store);
|
|
117
|
+
const result = await tool.handle({ agentId: agent.id, harness: "test", cwd: "/test", pid: process.pid }, { action: "mesh_interfaces" });
|
|
118
|
+
assert.ok(!result.isError, "Should not be an error");
|
|
119
|
+
assert.ok(result.content.includes("lo") || result.content.includes("IPv4"), "Should list network interfaces");
|
|
120
|
+
await store.shutdown();
|
|
121
|
+
});
|
|
122
|
+
void test("mesh_unlisten removes listener via CommsTool", async () => {
|
|
123
|
+
const store = new MeshStore(TEST_PORT);
|
|
124
|
+
await store.init();
|
|
125
|
+
const agent = await store.registerAgent({
|
|
126
|
+
name: "test-agent",
|
|
127
|
+
harness: "test",
|
|
128
|
+
cwd: "/test",
|
|
129
|
+
pid: process.pid,
|
|
130
|
+
visibility: "visible",
|
|
131
|
+
tags: [],
|
|
132
|
+
});
|
|
133
|
+
const listenerId = await store.addListener("127.0.0.1", 0, "observe");
|
|
134
|
+
const tool = new CommsTool(store);
|
|
135
|
+
const result = await tool.handle({ agentId: agent.id, harness: "test", cwd: "/test", pid: process.pid }, { action: "mesh_unlisten", id: listenerId });
|
|
136
|
+
assert.ok(!result.isError, "Should not be an error");
|
|
137
|
+
assert.ok(result.content.includes("removed"), "Should confirm removal");
|
|
138
|
+
const listeners = store.listListeners();
|
|
139
|
+
assert.equal(listeners.length, 1, "Should be back to one listener");
|
|
140
|
+
await store.shutdown();
|
|
141
|
+
});
|
|
142
|
+
void test("mesh_listen adds listener via CommsTool", async () => {
|
|
143
|
+
const store = new MeshStore(TEST_PORT);
|
|
144
|
+
await store.init();
|
|
145
|
+
const agent = await store.registerAgent({
|
|
146
|
+
name: "test-agent",
|
|
147
|
+
harness: "test",
|
|
148
|
+
cwd: "/test",
|
|
149
|
+
pid: process.pid,
|
|
150
|
+
visibility: "visible",
|
|
151
|
+
tags: [],
|
|
152
|
+
});
|
|
153
|
+
const tool = new CommsTool(store);
|
|
154
|
+
const result = await tool.handle({ agentId: agent.id, harness: "test", cwd: "/test", pid: process.pid }, { action: "mesh_listen", host: "127.0.0.1", policy: "observe" });
|
|
155
|
+
assert.ok(!result.isError, "Should not be an error");
|
|
156
|
+
assert.ok(result.content.includes("Listener added"), "Should confirm addition");
|
|
157
|
+
const listeners = store.listListeners();
|
|
158
|
+
assert.equal(listeners.length, 2, "Should have two listeners");
|
|
159
|
+
await store.shutdown();
|
|
160
|
+
});
|
|
161
|
+
void test("buildAction parses mesh_listen with host and policy", () => {
|
|
162
|
+
const action = buildAction({
|
|
163
|
+
action: "mesh_listen",
|
|
164
|
+
host: "192.168.1.1",
|
|
165
|
+
port: 9999,
|
|
166
|
+
policy: "observe",
|
|
167
|
+
});
|
|
168
|
+
assert.equal(action.action, "mesh_listen");
|
|
169
|
+
if (action.action === "mesh_listen") {
|
|
170
|
+
assert.equal(action.host, "192.168.1.1");
|
|
171
|
+
assert.equal(action.port, 9999);
|
|
172
|
+
assert.equal(action.policy, "observe");
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
void test("buildAction parses mesh_unlisten", () => {
|
|
176
|
+
const action = buildAction({
|
|
177
|
+
action: "mesh_unlisten",
|
|
178
|
+
id: "abc123",
|
|
179
|
+
});
|
|
180
|
+
assert.equal(action.action, "mesh_unlisten");
|
|
181
|
+
if (action.action === "mesh_unlisten") {
|
|
182
|
+
assert.equal(action.id, "abc123");
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
void test("buildAction parses mesh_listeners", () => {
|
|
186
|
+
const action = buildAction({ action: "mesh_listeners" });
|
|
187
|
+
assert.equal(action.action, "mesh_listeners");
|
|
188
|
+
});
|
|
189
|
+
void test("buildAction parses mesh_interfaces", () => {
|
|
190
|
+
const action = buildAction({ action: "mesh_interfaces" });
|
|
191
|
+
assert.equal(action.action, "mesh_interfaces");
|
|
192
|
+
});
|
|
193
|
+
void test("connections via non-default listener carry policy in handle", async () => {
|
|
194
|
+
const store = new MeshStore(TEST_PORT);
|
|
195
|
+
await store.init();
|
|
196
|
+
// Add an observe listener
|
|
197
|
+
const listenerId = await store.addListener("127.0.0.1", 0, "observe");
|
|
198
|
+
const listeners = store.listListeners();
|
|
199
|
+
const observeListener = listeners.find((l) => l.id === listenerId);
|
|
200
|
+
assert.ok(observeListener, "Should find the observe listener");
|
|
201
|
+
// Connect to the observe listener and send an introduce message
|
|
202
|
+
// The transport should tag the connection handle with policy="observe"
|
|
203
|
+
//
|
|
204
|
+
// We intercept at the transport.events level because store.events
|
|
205
|
+
// is a getter that creates a fresh object each call.
|
|
206
|
+
const receivedHandle = await new Promise((resolve) => {
|
|
207
|
+
const timeout = setTimeout(() => resolve(null), 3000);
|
|
208
|
+
const transport = store.transport;
|
|
209
|
+
const originalOnIntroduction = (handle, msg) => transport.events.onIntroduction(handle, msg);
|
|
210
|
+
transport.events.onIntroduction = (handle, msg) => {
|
|
211
|
+
// Capture the handle's policy
|
|
212
|
+
resolve({ policy: handle.policy });
|
|
213
|
+
clearTimeout(timeout);
|
|
214
|
+
// Call the original handler
|
|
215
|
+
originalOnIntroduction(handle, msg);
|
|
216
|
+
};
|
|
217
|
+
const socket = net.createConnection({
|
|
218
|
+
port: observeListener.port,
|
|
219
|
+
host: "127.0.0.1",
|
|
220
|
+
});
|
|
221
|
+
socket.on("connect", () => {
|
|
222
|
+
socket.write(JSON.stringify({
|
|
223
|
+
method: "introduce",
|
|
224
|
+
peerId: "test-observe-peer",
|
|
225
|
+
dataPort: 19999,
|
|
226
|
+
}) + "\n");
|
|
227
|
+
});
|
|
228
|
+
socket.on("error", () => {
|
|
229
|
+
socket.destroy();
|
|
230
|
+
clearTimeout(timeout);
|
|
231
|
+
resolve(null);
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
assert.ok(receivedHandle, "Should receive an introduction");
|
|
235
|
+
assert.equal(receivedHandle.policy, "observe", "Handle should carry observe policy");
|
|
236
|
+
await store.shutdown();
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
//# sourceMappingURL=listener-policy.integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listener-policy.integration.test.js","sourceRoot":"","sources":["../../src/test/listener-policy.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TlsTransport integration test — verifies that two MeshStore instances
|
|
3
|
+
* can communicate over TLS with certificate pinning.
|
|
4
|
+
*
|
|
5
|
+
* Run: node dist/test/tls-transport.integration.test.js
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=tls-transport.integration.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tls-transport.integration.test.d.ts","sourceRoot":"","sources":["../../src/test/tls-transport.integration.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|