agent-comms 1.14.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.map +1 -1
- package/dist/bridges/pi/index.js +39 -17
- package/dist/bridges/pi/index.js.map +1 -1
- package/dist/bridges/user/controller.d.ts +9 -1
- package/dist/bridges/user/controller.d.ts.map +1 -1
- package/dist/bridges/user/controller.js +25 -1
- package/dist/bridges/user/controller.js.map +1 -1
- package/dist/bridges/user/tui.js +2 -0
- package/dist/bridges/user/tui.js.map +1 -1
- package/dist/bridges/user/web/build.d.ts +2 -0
- package/dist/bridges/user/web/build.d.ts.map +1 -1
- package/dist/bridges/user/web/build.js +44 -0
- package/dist/bridges/user/web/build.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/App.d.ts +5 -0
- package/dist/bridges/user/web/frontend/components/App.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/App.js +1 -1
- package/dist/bridges/user/web/frontend/components/App.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/ProjectTree.js +6 -3
- package/dist/bridges/user/web/frontend/components/ProjectTree.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/RelayPanel.d.ts +15 -0
- package/dist/bridges/user/web/frontend/components/RelayPanel.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/components/RelayPanel.js +46 -0
- package/dist/bridges/user/web/frontend/components/RelayPanel.js.map +1 -0
- package/dist/bridges/user/web/frontend/components/Sidebar.d.ts +7 -2
- package/dist/bridges/user/web/frontend/components/Sidebar.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/Sidebar.js +15 -9
- package/dist/bridges/user/web/frontend/components/Sidebar.js.map +1 -1
- package/dist/bridges/user/web/frontend/input.js +1 -1
- package/dist/bridges/user/web/frontend/input.js.map +1 -1
- package/dist/bridges/user/web/frontend/main.js +73 -5
- package/dist/bridges/user/web/frontend/main.js.map +1 -1
- package/dist/bridges/user/web/frontend/mesh-client.d.ts +43 -0
- package/dist/bridges/user/web/frontend/mesh-client.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/mesh-client.js +132 -0
- package/dist/bridges/user/web/frontend/mesh-client.js.map +1 -0
- package/dist/bridges/user/web/frontend/mesh-worker.d.ts +14 -0
- package/dist/bridges/user/web/frontend/mesh-worker.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/mesh-worker.js +274 -0
- package/dist/bridges/user/web/frontend/mesh-worker.js.map +1 -0
- package/dist/bridges/user/web/frontend/relay-client.d.ts +40 -0
- package/dist/bridges/user/web/frontend/relay-client.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/relay-client.js +97 -0
- package/dist/bridges/user/web/frontend/relay-client.js.map +1 -0
- package/dist/bridges/user/web/frontend/relay-worker.d.ts +15 -0
- package/dist/bridges/user/web/frontend/relay-worker.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/relay-worker.js +366 -0
- package/dist/bridges/user/web/frontend/relay-worker.js.map +1 -0
- package/dist/bridges/user/web/frontend/sw.d.ts +16 -0
- package/dist/bridges/user/web/frontend/sw.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/sw.js +145 -0
- package/dist/bridges/user/web/frontend/sw.js.map +1 -0
- package/dist/bridges/user/web/frontend/url-sync.d.ts +48 -0
- package/dist/bridges/user/web/frontend/url-sync.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/url-sync.js +74 -0
- package/dist/bridges/user/web/frontend/url-sync.js.map +1 -0
- package/dist/bridges/user/web/server.d.ts +10 -3
- package/dist/bridges/user/web/server.d.ts.map +1 -1
- package/dist/bridges/user/web/server.js +254 -12
- package/dist/bridges/user/web/server.js.map +1 -1
- package/dist/core/bridge.d.ts +28 -0
- package/dist/core/bridge.d.ts.map +1 -1
- package/dist/core/bridge.js +137 -0
- package/dist/core/bridge.js.map +1 -1
- package/dist/core/comms-store.d.ts +22 -1
- package/dist/core/comms-store.d.ts.map +1 -1
- package/dist/core/discovery-mdns.d.ts +33 -0
- package/dist/core/discovery-mdns.d.ts.map +1 -0
- package/dist/core/discovery-mdns.js +182 -0
- package/dist/core/discovery-mdns.js.map +1 -0
- package/dist/core/discovery-tailscale.d.ts +40 -0
- package/dist/core/discovery-tailscale.d.ts.map +1 -0
- package/dist/core/discovery-tailscale.js +158 -0
- package/dist/core/discovery-tailscale.js.map +1 -0
- package/dist/core/discovery.d.ts +82 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/core/discovery.js +194 -0
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/federation.d.ts +100 -0
- package/dist/core/federation.d.ts.map +1 -0
- package/dist/core/federation.js +411 -0
- package/dist/core/federation.js.map +1 -0
- package/dist/core/identity.d.ts +31 -0
- package/dist/core/identity.d.ts.map +1 -0
- package/dist/core/identity.js +251 -0
- package/dist/core/identity.js.map +1 -0
- package/dist/core/index.d.ts +11 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/mesh-store.d.ts +72 -26
- package/dist/core/mesh-store.d.ts.map +1 -1
- package/dist/core/mesh-store.js +467 -352
- package/dist/core/mesh-store.js.map +1 -1
- package/dist/core/push-manager.d.ts +41 -0
- package/dist/core/push-manager.d.ts.map +1 -0
- package/dist/core/push-manager.js +60 -0
- package/dist/core/push-manager.js.map +1 -0
- package/dist/core/store.d.ts +21 -1
- package/dist/core/store.d.ts.map +1 -1
- package/dist/core/store.js +44 -0
- package/dist/core/store.js.map +1 -1
- package/dist/core/tcp-transport.d.ts +77 -0
- package/dist/core/tcp-transport.d.ts.map +1 -0
- package/dist/core/tcp-transport.js +596 -0
- package/dist/core/tcp-transport.js.map +1 -0
- package/dist/core/test/identity.unit.test.d.ts +5 -0
- package/dist/core/test/identity.unit.test.d.ts.map +1 -0
- package/dist/core/test/identity.unit.test.js +70 -0
- package/dist/core/test/identity.unit.test.js.map +1 -0
- package/dist/core/tls-transport.d.ts +69 -0
- package/dist/core/tls-transport.d.ts.map +1 -0
- package/dist/core/tls-transport.js +602 -0
- package/dist/core/tls-transport.js.map +1 -0
- package/dist/core/tool.d.ts +23 -2
- package/dist/core/tool.d.ts.map +1 -1
- package/dist/core/tool.js +269 -1
- package/dist/core/tool.js.map +1 -1
- package/dist/core/transport.d.ts +166 -0
- package/dist/core/transport.d.ts.map +1 -0
- package/dist/core/transport.js +20 -0
- package/dist/core/transport.js.map +1 -0
- package/dist/core/types.d.ts +136 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +71 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/vapid.d.ts +22 -0
- package/dist/core/vapid.d.ts.map +1 -0
- package/dist/core/vapid.js +50 -0
- package/dist/core/vapid.js.map +1 -0
- package/dist/core/web-push.d.ts +37 -0
- package/dist/core/web-push.d.ts.map +1 -0
- package/dist/core/web-push.js +198 -0
- package/dist/core/web-push.js.map +1 -0
- package/dist/core/wire-protocol.d.ts +131 -0
- package/dist/core/wire-protocol.d.ts.map +1 -0
- package/dist/core/wire-protocol.js +54 -0
- package/dist/core/wire-protocol.js.map +1 -0
- package/dist/core/ws-transport.d.ts +71 -0
- package/dist/core/ws-transport.d.ts.map +1 -0
- package/dist/core/ws-transport.js +560 -0
- package/dist/core/ws-transport.js.map +1 -0
- package/dist/test/approval.integration.test.d.ts +9 -0
- package/dist/test/approval.integration.test.d.ts.map +1 -0
- package/dist/test/approval.integration.test.js +361 -0
- package/dist/test/approval.integration.test.js.map +1 -0
- package/dist/test/delivery-receipt.helper.d.ts +16 -0
- package/dist/test/delivery-receipt.helper.d.ts.map +1 -0
- package/dist/test/delivery-receipt.helper.js +409 -0
- package/dist/test/delivery-receipt.helper.js.map +1 -0
- package/dist/test/delivery-receipt.runner.d.ts +13 -0
- package/dist/test/delivery-receipt.runner.d.ts.map +1 -0
- package/dist/test/delivery-receipt.runner.js +51 -0
- package/dist/test/delivery-receipt.runner.js.map +1 -0
- package/dist/test/federation.integration.test.d.ts +15 -0
- package/dist/test/federation.integration.test.d.ts.map +1 -0
- package/dist/test/federation.integration.test.js +218 -0
- package/dist/test/federation.integration.test.js.map +1 -0
- package/dist/test/listener-policy.integration.test.d.ts +9 -0
- package/dist/test/listener-policy.integration.test.d.ts.map +1 -0
- package/dist/test/listener-policy.integration.test.js +239 -0
- package/dist/test/listener-policy.integration.test.js.map +1 -0
- package/dist/test/tls-transport.integration.test.d.ts +8 -0
- package/dist/test/tls-transport.integration.test.d.ts.map +1 -0
- package/dist/test/tls-transport.integration.test.js +158 -0
- package/dist/test/tls-transport.integration.test.js.map +1 -0
- package/dist/test/visibility.integration.test.d.ts +12 -0
- package/dist/test/visibility.integration.test.d.ts.map +1 -0
- package/dist/test/visibility.integration.test.js +181 -0
- package/dist/test/visibility.integration.test.js.map +1 -0
- package/package.json +4 -1
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FederationManager — manages TLS links between mesh coordinators.
|
|
3
|
+
*
|
|
4
|
+
* Federation links are persistent TLS connections between coordinators on
|
|
5
|
+
* different machines. They forward agent presence, room memberships, and
|
|
6
|
+
* messages for rooms marked as federated. Non-federated rooms never leave
|
|
7
|
+
* the local mesh.
|
|
8
|
+
*
|
|
9
|
+
* Each link uses certificate pinning (the same trust model as TlsTransport).
|
|
10
|
+
* The wire protocol runs over the same newline-delimited JSON framing as the
|
|
11
|
+
* local mesh, but with `fed_*` method types.
|
|
12
|
+
*/
|
|
13
|
+
import * as tls from "node:tls";
|
|
14
|
+
import { encode, isMeshMessage, MessageBuffer } from "./wire-protocol.js";
|
|
15
|
+
import { nanoid } from "./nanoid.js";
|
|
16
|
+
import { generateIdentity } from "./identity.js";
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Constants
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
const FED_PING_INTERVAL_MS = 30_000;
|
|
21
|
+
const FED_PING_TIMEOUT_MS = 10_000;
|
|
22
|
+
const FED_VERSION = "1.0.0";
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// FederationManager
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
export class FederationManager {
|
|
27
|
+
links = new Map();
|
|
28
|
+
identity;
|
|
29
|
+
meshId;
|
|
30
|
+
meshName;
|
|
31
|
+
callbacks;
|
|
32
|
+
pingTimers = new Map();
|
|
33
|
+
shutDown = false;
|
|
34
|
+
pendingPongs = new Map();
|
|
35
|
+
constructor(meshId, meshName, callbacks) {
|
|
36
|
+
this.meshId = meshId;
|
|
37
|
+
this.meshName = meshName;
|
|
38
|
+
this.callbacks = callbacks;
|
|
39
|
+
this.identity = generateIdentity();
|
|
40
|
+
}
|
|
41
|
+
/** The TLS identity used for federation connections. */
|
|
42
|
+
get tlsIdentity() {
|
|
43
|
+
return this.identity;
|
|
44
|
+
}
|
|
45
|
+
// -----------------------------------------------------------------------
|
|
46
|
+
// Outbound links
|
|
47
|
+
// -----------------------------------------------------------------------
|
|
48
|
+
/**
|
|
49
|
+
* Establish an outbound federation link to a remote coordinator.
|
|
50
|
+
* Returns the local link ID once the handshake completes.
|
|
51
|
+
*/
|
|
52
|
+
async connect(host, port, name) {
|
|
53
|
+
if (this.shutDown)
|
|
54
|
+
throw new Error("FederationManager is shut down");
|
|
55
|
+
const linkId = nanoid(8);
|
|
56
|
+
const socket = await this.tlsConnect(host, port);
|
|
57
|
+
const link = {
|
|
58
|
+
id: linkId,
|
|
59
|
+
remoteMeshId: "",
|
|
60
|
+
remoteName: name ?? `${host}:${String(port)}`,
|
|
61
|
+
socket,
|
|
62
|
+
ready: false,
|
|
63
|
+
direction: "outbound",
|
|
64
|
+
};
|
|
65
|
+
this.links.set(linkId, link);
|
|
66
|
+
// Send handshake
|
|
67
|
+
const handshake = {
|
|
68
|
+
method: "fed_handshake",
|
|
69
|
+
meshId: this.meshId,
|
|
70
|
+
name: this.meshName,
|
|
71
|
+
version: FED_VERSION,
|
|
72
|
+
};
|
|
73
|
+
await this.writeToSocket(socket, handshake);
|
|
74
|
+
// Wire up incoming message handling
|
|
75
|
+
this.wireSocket(linkId, socket);
|
|
76
|
+
// Wait for fed_ack (with timeout)
|
|
77
|
+
await this.waitForHandshake(linkId, 5000);
|
|
78
|
+
return linkId;
|
|
79
|
+
}
|
|
80
|
+
// -----------------------------------------------------------------------
|
|
81
|
+
// Inbound links (server)
|
|
82
|
+
// -----------------------------------------------------------------------
|
|
83
|
+
/**
|
|
84
|
+
* Handle an incoming TLS connection that sent a fed_handshake.
|
|
85
|
+
* Called by the transport layer when a federation connection arrives.
|
|
86
|
+
*/
|
|
87
|
+
async handleInbound(socket) {
|
|
88
|
+
if (this.shutDown) {
|
|
89
|
+
socket.destroy();
|
|
90
|
+
throw new Error("FederationManager is shut down");
|
|
91
|
+
}
|
|
92
|
+
const linkId = nanoid(8);
|
|
93
|
+
const link = {
|
|
94
|
+
id: linkId,
|
|
95
|
+
remoteMeshId: "",
|
|
96
|
+
remoteName: "unknown",
|
|
97
|
+
socket,
|
|
98
|
+
ready: false,
|
|
99
|
+
direction: "inbound",
|
|
100
|
+
};
|
|
101
|
+
this.links.set(linkId, link);
|
|
102
|
+
this.wireSocket(linkId, socket);
|
|
103
|
+
// Wait for the remote side's handshake
|
|
104
|
+
await this.waitForHandshake(linkId, 5000);
|
|
105
|
+
return linkId;
|
|
106
|
+
}
|
|
107
|
+
// -----------------------------------------------------------------------
|
|
108
|
+
// Link management
|
|
109
|
+
// -----------------------------------------------------------------------
|
|
110
|
+
/** Disconnect a specific federation link. */
|
|
111
|
+
async disconnect(linkId) {
|
|
112
|
+
const link = this.links.get(linkId);
|
|
113
|
+
if (!link)
|
|
114
|
+
return;
|
|
115
|
+
this.clearLinkTimers(linkId);
|
|
116
|
+
link.ready = false;
|
|
117
|
+
link.socket.unref();
|
|
118
|
+
link.socket.destroy();
|
|
119
|
+
this.links.delete(linkId);
|
|
120
|
+
}
|
|
121
|
+
/** List all active federation links. */
|
|
122
|
+
listLinks() {
|
|
123
|
+
return [...this.links.values()].filter((l) => l.ready);
|
|
124
|
+
}
|
|
125
|
+
// -----------------------------------------------------------------------
|
|
126
|
+
// Broadcasting to federated links
|
|
127
|
+
// -----------------------------------------------------------------------
|
|
128
|
+
/** Broadcast an agent visibility event to all ready links. */
|
|
129
|
+
async broadcastAgentVisible(agent) {
|
|
130
|
+
const msg = { method: "fed_agent_visible", agent };
|
|
131
|
+
await this.broadcastToReady(msg);
|
|
132
|
+
}
|
|
133
|
+
/** Broadcast an agent gone event to all ready links. */
|
|
134
|
+
async broadcastAgentGone(agentId) {
|
|
135
|
+
const msg = { method: "fed_agent_gone", agentId };
|
|
136
|
+
await this.broadcastToReady(msg);
|
|
137
|
+
}
|
|
138
|
+
/** Forward a room message to all ready links (federated rooms only). */
|
|
139
|
+
async forwardRoomMessage(roomId, message) {
|
|
140
|
+
const msg = { method: "fed_room_message", roomId, message };
|
|
141
|
+
await this.broadcastToReady(msg);
|
|
142
|
+
}
|
|
143
|
+
/** Broadcast a room join to all ready links. */
|
|
144
|
+
async broadcastRoomJoin(roomId, agentId, agentName) {
|
|
145
|
+
const msg = {
|
|
146
|
+
method: "fed_room_join",
|
|
147
|
+
roomId,
|
|
148
|
+
agentId,
|
|
149
|
+
agentName,
|
|
150
|
+
};
|
|
151
|
+
await this.broadcastToReady(msg);
|
|
152
|
+
}
|
|
153
|
+
/** Broadcast a room leave to all ready links. */
|
|
154
|
+
async broadcastRoomLeave(roomId, agentId) {
|
|
155
|
+
const msg = { method: "fed_room_leave", roomId, agentId };
|
|
156
|
+
await this.broadcastToReady(msg);
|
|
157
|
+
}
|
|
158
|
+
// -----------------------------------------------------------------------
|
|
159
|
+
// Shutdown
|
|
160
|
+
// -----------------------------------------------------------------------
|
|
161
|
+
async shutdown() {
|
|
162
|
+
this.shutDown = true;
|
|
163
|
+
for (const linkId of [...this.links.keys()]) {
|
|
164
|
+
await this.disconnect(linkId);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// -----------------------------------------------------------------------
|
|
168
|
+
// Internal — TLS connection
|
|
169
|
+
// -----------------------------------------------------------------------
|
|
170
|
+
tlsConnect(host, port) {
|
|
171
|
+
return new Promise((resolve, reject) => {
|
|
172
|
+
const socket = tls.connect({
|
|
173
|
+
key: this.identity.privateKey,
|
|
174
|
+
cert: this.identity.certificate,
|
|
175
|
+
host,
|
|
176
|
+
port,
|
|
177
|
+
rejectUnauthorized: false,
|
|
178
|
+
requestCert: true,
|
|
179
|
+
}, () => {
|
|
180
|
+
resolve(socket);
|
|
181
|
+
});
|
|
182
|
+
const timer = setTimeout(() => {
|
|
183
|
+
socket.destroy();
|
|
184
|
+
reject(new Error(`Federation connection timeout to ${host}:${String(port)}`));
|
|
185
|
+
}, 5000);
|
|
186
|
+
socket.on("error", (err) => {
|
|
187
|
+
clearTimeout(timer);
|
|
188
|
+
reject(err);
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
// -----------------------------------------------------------------------
|
|
193
|
+
// Internal — socket wiring
|
|
194
|
+
// -----------------------------------------------------------------------
|
|
195
|
+
wireSocket(linkId, socket) {
|
|
196
|
+
const buffer = new MessageBuffer();
|
|
197
|
+
socket.on("data", (data) => {
|
|
198
|
+
const items = buffer.append(data.toString());
|
|
199
|
+
for (const item of items) {
|
|
200
|
+
if (isMeshMessage(item)) {
|
|
201
|
+
void this.handleMessage(linkId, item);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
socket.on("error", () => {
|
|
206
|
+
void this.disconnect(linkId);
|
|
207
|
+
});
|
|
208
|
+
socket.on("close", () => {
|
|
209
|
+
void this.disconnect(linkId);
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
// -----------------------------------------------------------------------
|
|
213
|
+
// Internal — message handling
|
|
214
|
+
// -----------------------------------------------------------------------
|
|
215
|
+
async handleMessage(linkId, msg) {
|
|
216
|
+
const link = this.links.get(linkId);
|
|
217
|
+
if (!link || this.shutDown)
|
|
218
|
+
return;
|
|
219
|
+
switch (msg.method) {
|
|
220
|
+
case "fed_handshake": {
|
|
221
|
+
// Inbound connection sending its handshake
|
|
222
|
+
link.remoteMeshId = msg.meshId;
|
|
223
|
+
link.remoteName = msg.name;
|
|
224
|
+
link.ready = true;
|
|
225
|
+
// Respond with ack
|
|
226
|
+
const ack = {
|
|
227
|
+
method: "fed_ack",
|
|
228
|
+
meshId: this.meshId,
|
|
229
|
+
name: this.meshName,
|
|
230
|
+
version: FED_VERSION,
|
|
231
|
+
};
|
|
232
|
+
await this.writeToSocket(link.socket, ack);
|
|
233
|
+
// Sync local state to the new link
|
|
234
|
+
await this.syncStateToLink(linkId);
|
|
235
|
+
// Start ping for this link
|
|
236
|
+
this.startPing(linkId);
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
case "fed_ack": {
|
|
240
|
+
link.remoteMeshId = msg.meshId;
|
|
241
|
+
link.remoteName = msg.name;
|
|
242
|
+
link.ready = true;
|
|
243
|
+
// Sync local state to the new link
|
|
244
|
+
await this.syncStateToLink(linkId);
|
|
245
|
+
// Start ping for this link
|
|
246
|
+
this.startPing(linkId);
|
|
247
|
+
break;
|
|
248
|
+
}
|
|
249
|
+
case "fed_agent_visible": {
|
|
250
|
+
await this.callbacks.onAgentVisible(msg.agent);
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
case "fed_agent_gone": {
|
|
254
|
+
await this.callbacks.onAgentGone(msg.agentId);
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
case "fed_room_message": {
|
|
258
|
+
await this.callbacks.onRoomMessage(msg.roomId, msg.message);
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
case "fed_room_join": {
|
|
262
|
+
await this.callbacks.onRoomJoin(msg.roomId, msg.agentId, msg.agentName);
|
|
263
|
+
break;
|
|
264
|
+
}
|
|
265
|
+
case "fed_room_leave": {
|
|
266
|
+
await this.callbacks.onRoomLeave(msg.roomId, msg.agentId);
|
|
267
|
+
break;
|
|
268
|
+
}
|
|
269
|
+
case "fed_ping": {
|
|
270
|
+
const pong = { method: "fed_pong" };
|
|
271
|
+
await this.writeToSocket(link.socket, pong);
|
|
272
|
+
break;
|
|
273
|
+
}
|
|
274
|
+
case "fed_pong": {
|
|
275
|
+
const pending = this.pendingPongs.get(linkId);
|
|
276
|
+
if (pending) {
|
|
277
|
+
clearTimeout(pending);
|
|
278
|
+
this.pendingPongs.delete(linkId);
|
|
279
|
+
}
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// -----------------------------------------------------------------------
|
|
285
|
+
// Internal — state sync
|
|
286
|
+
// -----------------------------------------------------------------------
|
|
287
|
+
/**
|
|
288
|
+
* After handshake, push our visible agents and federated room memberships
|
|
289
|
+
* to the newly connected link.
|
|
290
|
+
*/
|
|
291
|
+
async syncStateToLink(linkId) {
|
|
292
|
+
const link = this.links.get(linkId);
|
|
293
|
+
if (!link?.ready)
|
|
294
|
+
return;
|
|
295
|
+
// Sync visible agents
|
|
296
|
+
const agents = this.callbacks.getVisibleAgents();
|
|
297
|
+
for (const agent of agents) {
|
|
298
|
+
const msg = { method: "fed_agent_visible", agent };
|
|
299
|
+
await this.writeToSocket(link.socket, msg);
|
|
300
|
+
}
|
|
301
|
+
// Sync federated room memberships
|
|
302
|
+
const rooms = this.callbacks.getFederatedRoomMemberships();
|
|
303
|
+
for (const [roomId, memberIds] of rooms) {
|
|
304
|
+
for (const memberId of memberIds) {
|
|
305
|
+
const agent = this.callbacks
|
|
306
|
+
.getVisibleAgents()
|
|
307
|
+
.find((a) => a.id === memberId);
|
|
308
|
+
const agentName = agent?.name ?? memberId;
|
|
309
|
+
const msg = {
|
|
310
|
+
method: "fed_room_join",
|
|
311
|
+
roomId,
|
|
312
|
+
agentId: memberId,
|
|
313
|
+
agentName,
|
|
314
|
+
};
|
|
315
|
+
await this.writeToSocket(link.socket, msg);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// -----------------------------------------------------------------------
|
|
320
|
+
// Internal — handshake waiting
|
|
321
|
+
// -----------------------------------------------------------------------
|
|
322
|
+
waitForHandshake(linkId, timeoutMs) {
|
|
323
|
+
return new Promise((resolve, reject) => {
|
|
324
|
+
const startTime = Date.now();
|
|
325
|
+
const check = () => {
|
|
326
|
+
const link = this.links.get(linkId);
|
|
327
|
+
if (link?.ready) {
|
|
328
|
+
resolve();
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
if (Date.now() - startTime > timeoutMs) {
|
|
332
|
+
void this.disconnect(linkId);
|
|
333
|
+
reject(new Error(`Federation handshake timeout for link ${linkId}`));
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
setTimeout(check, 50);
|
|
337
|
+
};
|
|
338
|
+
check();
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
// -----------------------------------------------------------------------
|
|
342
|
+
// Internal — ping/pong health monitoring
|
|
343
|
+
// -----------------------------------------------------------------------
|
|
344
|
+
startPing(linkId) {
|
|
345
|
+
if (this.pingTimers.has(linkId))
|
|
346
|
+
return;
|
|
347
|
+
const timer = setInterval(() => {
|
|
348
|
+
void this.sendPing(linkId);
|
|
349
|
+
}, FED_PING_INTERVAL_MS);
|
|
350
|
+
this.pingTimers.set(linkId, timer);
|
|
351
|
+
}
|
|
352
|
+
async sendPing(linkId) {
|
|
353
|
+
const link = this.links.get(linkId);
|
|
354
|
+
if (!link?.ready)
|
|
355
|
+
return;
|
|
356
|
+
const msg = { method: "fed_ping" };
|
|
357
|
+
await this.writeToSocket(link.socket, msg);
|
|
358
|
+
// Set pong timeout
|
|
359
|
+
const timer = setTimeout(() => {
|
|
360
|
+
// No pong received — disconnect the link
|
|
361
|
+
void this.disconnect(linkId);
|
|
362
|
+
}, FED_PING_TIMEOUT_MS);
|
|
363
|
+
this.pendingPongs.set(linkId, timer);
|
|
364
|
+
}
|
|
365
|
+
// -----------------------------------------------------------------------
|
|
366
|
+
// Internal — helpers
|
|
367
|
+
// -----------------------------------------------------------------------
|
|
368
|
+
async writeToSocket(socket, msg) {
|
|
369
|
+
if (socket.destroyed)
|
|
370
|
+
return;
|
|
371
|
+
const data = encode(msg);
|
|
372
|
+
await new Promise((resolve, reject) => {
|
|
373
|
+
socket.write(data, "utf-8", (err) => {
|
|
374
|
+
if (err)
|
|
375
|
+
reject(err);
|
|
376
|
+
else
|
|
377
|
+
resolve();
|
|
378
|
+
});
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
async broadcastToReady(msg) {
|
|
382
|
+
const data = encode(msg);
|
|
383
|
+
const writes = [];
|
|
384
|
+
for (const [, link] of this.links) {
|
|
385
|
+
if (!link.ready || link.socket.destroyed)
|
|
386
|
+
continue;
|
|
387
|
+
writes.push(new Promise((resolve) => {
|
|
388
|
+
link.socket.write(data, "utf-8", (err) => {
|
|
389
|
+
if (err) {
|
|
390
|
+
void this.disconnect(link.id);
|
|
391
|
+
}
|
|
392
|
+
resolve();
|
|
393
|
+
});
|
|
394
|
+
}));
|
|
395
|
+
}
|
|
396
|
+
await Promise.all(writes);
|
|
397
|
+
}
|
|
398
|
+
clearLinkTimers(linkId) {
|
|
399
|
+
const pingTimer = this.pingTimers.get(linkId);
|
|
400
|
+
if (pingTimer !== undefined) {
|
|
401
|
+
clearInterval(pingTimer);
|
|
402
|
+
this.pingTimers.delete(linkId);
|
|
403
|
+
}
|
|
404
|
+
const pongTimer = this.pendingPongs.get(linkId);
|
|
405
|
+
if (pongTimer !== undefined) {
|
|
406
|
+
clearTimeout(pongTimer);
|
|
407
|
+
this.pendingPongs.delete(linkId);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
//# sourceMappingURL=federation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"federation.js","sourceRoot":"","sources":["../../src/core/federation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cryptographic identity generation for mesh peers.
|
|
3
|
+
*
|
|
4
|
+
* Each MeshStore instance generates an ECDSA P-256 keypair and a self-signed
|
|
5
|
+
* X.509 certificate on first run. The peer ID is derived from the SHA-256
|
|
6
|
+
* fingerprint of the certificate (DER-encoded, hex with colons), replacing
|
|
7
|
+
* the previous nanoid(8) approach.
|
|
8
|
+
*
|
|
9
|
+
* Key material stays in memory only — never written to disk.
|
|
10
|
+
*/
|
|
11
|
+
export interface PeerIdentity {
|
|
12
|
+
/** PEM-encoded PKCS#8 private key. */
|
|
13
|
+
privateKey: string;
|
|
14
|
+
/** PEM-encoded self-signed X.509 certificate. */
|
|
15
|
+
certificate: string;
|
|
16
|
+
/** SHA-256 fingerprint of the certificate (DER), hex-encoded with colons. */
|
|
17
|
+
fingerprint: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Generate a fresh cryptographic identity: ECDSA P-256 keypair and self-signed
|
|
21
|
+
* X.509 certificate. The fingerprint of the certificate serves as the peer ID.
|
|
22
|
+
*
|
|
23
|
+
* Key material stays in memory only — never written to disk.
|
|
24
|
+
*/
|
|
25
|
+
export declare function generateIdentity(): PeerIdentity;
|
|
26
|
+
/**
|
|
27
|
+
* Compute the SHA-256 fingerprint of a PEM-encoded certificate.
|
|
28
|
+
* Returns hex-encoded with colon separators (standard format): "AB:CD:EF:..."
|
|
29
|
+
*/
|
|
30
|
+
export declare function getCertificateFingerprint(certificate: string): string;
|
|
31
|
+
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/core/identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAYH,MAAM,WAAW,YAAY;IAC3B,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,WAAW,EAAE,MAAM,CAAC;CACrB;AA6MD;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,YAAY,CAmE/C;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAMrE"}
|