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,602 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TlsTransport — TLS-encrypted transport for the peer mesh.
|
|
3
|
+
*
|
|
4
|
+
* Same wire protocol as TcpTransport, but all connections are wrapped in TLS
|
|
5
|
+
* with certificate fingerprint authentication. Each peer generates an ECDSA
|
|
6
|
+
* P-256 keypair and self-signed X.509 certificate on startup. The peer ID
|
|
7
|
+
* is the certificate fingerprint — verifying a peer's identity is simply
|
|
8
|
+
* checking that the presented certificate's fingerprint matches the known ID.
|
|
9
|
+
*
|
|
10
|
+
* This is the Syncthing trust model: no CA, no PKI, just certificate pinning.
|
|
11
|
+
* Overlay networks (Tailscale, WireGuard) are still recommended for NAT
|
|
12
|
+
* traversal but are not required for security — TLS handles encryption and
|
|
13
|
+
* authentication at the protocol level.
|
|
14
|
+
*
|
|
15
|
+
* The transport is a drop-in replacement for TcpTransport. Same interface,
|
|
16
|
+
* same wire protocol, same event callbacks. MeshStore cannot tell the
|
|
17
|
+
* difference.
|
|
18
|
+
*/
|
|
19
|
+
import * as tls from "node:tls";
|
|
20
|
+
import { encode, isMeshMessage, MessageBuffer } from "./wire-protocol.js";
|
|
21
|
+
import { nanoid } from "./nanoid.js";
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Constants
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
const COORDINATOR_HOST = "127.0.0.1";
|
|
26
|
+
const CONNECT_TIMEOUT_MS = 2000;
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Async socket write helper (not exported)
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
function writeAsync(socket, data) {
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
if (socket.destroyed) {
|
|
33
|
+
resolve();
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
socket.write(data, "utf-8", (err) => {
|
|
37
|
+
if (err)
|
|
38
|
+
reject(err);
|
|
39
|
+
else
|
|
40
|
+
resolve();
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// TlsTransport
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
export class TlsTransport {
|
|
48
|
+
// -- Data server (accepts incoming peer data connections over TLS) --
|
|
49
|
+
dataServer;
|
|
50
|
+
_dataPort = 0;
|
|
51
|
+
// -- Coordinator listeners (multiple adapters) --
|
|
52
|
+
coordinatorListeners = new Map();
|
|
53
|
+
/** The default localhost listener ID (set once during becomeCoordinator). */
|
|
54
|
+
defaultListenerId;
|
|
55
|
+
_isCoordinator = false;
|
|
56
|
+
// -- Coordinator client socket (TLS connection to the coordinator) --
|
|
57
|
+
coordinatorSocket;
|
|
58
|
+
// -- Peer data connections (peer ID → socket + buffer) --
|
|
59
|
+
peerConnections = new Map();
|
|
60
|
+
// -- All sockets accepted by the data server (for shutdown cleanup) --
|
|
61
|
+
dataServerSockets = new Set();
|
|
62
|
+
// -- All sockets accepted by the coordinator server (for shutdown cleanup) --
|
|
63
|
+
coordinatorServerSockets = new Set();
|
|
64
|
+
// -- Coordinator introduction connections (handle ID → socket) --
|
|
65
|
+
introConnections = new Map();
|
|
66
|
+
// -- Pending connections awaiting approval (handle ID → socket + request info) --
|
|
67
|
+
pendingConnections = new Map();
|
|
68
|
+
// -- Shutdown sentinel — prevents callbacks after shutdown() --
|
|
69
|
+
shutDown = false;
|
|
70
|
+
// -- This peer's ID (set during connectToCoordinator or becomeCoordinator) --
|
|
71
|
+
_peerId = "";
|
|
72
|
+
events;
|
|
73
|
+
identity;
|
|
74
|
+
constructor(events, identity) {
|
|
75
|
+
this.events = events;
|
|
76
|
+
this.identity = identity;
|
|
77
|
+
}
|
|
78
|
+
// -- Public getters for interface properties --
|
|
79
|
+
get dataPort() {
|
|
80
|
+
return this._dataPort;
|
|
81
|
+
}
|
|
82
|
+
get isCoordinator() {
|
|
83
|
+
return this._isCoordinator;
|
|
84
|
+
}
|
|
85
|
+
// -----------------------------------------------------------------------
|
|
86
|
+
// TLS options
|
|
87
|
+
// -----------------------------------------------------------------------
|
|
88
|
+
get tlsOptions() {
|
|
89
|
+
return {
|
|
90
|
+
key: this.identity.privateKey,
|
|
91
|
+
cert: this.identity.certificate,
|
|
92
|
+
// Do not reject unauthorized — we do our own fingerprint verification
|
|
93
|
+
// after the TLS handshake completes.
|
|
94
|
+
rejectUnauthorized: false,
|
|
95
|
+
requestCert: true,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
get connectOptions() {
|
|
99
|
+
return {
|
|
100
|
+
key: this.identity.privateKey,
|
|
101
|
+
cert: this.identity.certificate,
|
|
102
|
+
rejectUnauthorized: false,
|
|
103
|
+
// Don't verify server cert via CA — verify via fingerprint pinning
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
// -----------------------------------------------------------------------
|
|
107
|
+
// MeshTransport — Data server
|
|
108
|
+
// -----------------------------------------------------------------------
|
|
109
|
+
async startDataServer() {
|
|
110
|
+
await new Promise((resolve, reject) => {
|
|
111
|
+
this.dataServer = tls.createServer(this.tlsOptions, (socket) => {
|
|
112
|
+
this.handleIncomingDataConnection(socket);
|
|
113
|
+
});
|
|
114
|
+
this.dataServer.listen(0, COORDINATOR_HOST, () => {
|
|
115
|
+
const addr = this.dataServer?.address();
|
|
116
|
+
if (typeof addr === "object" && addr !== null) {
|
|
117
|
+
this._dataPort = addr.port;
|
|
118
|
+
}
|
|
119
|
+
resolve();
|
|
120
|
+
});
|
|
121
|
+
this.dataServer.on("error", reject);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
// -----------------------------------------------------------------------
|
|
125
|
+
// MeshTransport — Coordinator connection (client side)
|
|
126
|
+
// -----------------------------------------------------------------------
|
|
127
|
+
async connectToCoordinator(host, port, peerId, localDataPort) {
|
|
128
|
+
this._peerId = peerId;
|
|
129
|
+
await new Promise((resolve, reject) => {
|
|
130
|
+
const socket = tls.connect({ ...this.connectOptions, host, port }, () => {
|
|
131
|
+
this.coordinatorSocket = socket;
|
|
132
|
+
// Send introduction
|
|
133
|
+
const intro = {
|
|
134
|
+
method: "introduce",
|
|
135
|
+
peerId,
|
|
136
|
+
dataPort: localDataPort,
|
|
137
|
+
};
|
|
138
|
+
socket.write(encode(intro));
|
|
139
|
+
// Wire up coordinator message handling
|
|
140
|
+
const buffer = new MessageBuffer();
|
|
141
|
+
socket.on("data", (data) => {
|
|
142
|
+
const items = buffer.append(data.toString());
|
|
143
|
+
for (const item of items) {
|
|
144
|
+
if (isMeshMessage(item)) {
|
|
145
|
+
this.dispatchCoordinatorClientMessage(item);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
socket.on("error", () => {
|
|
150
|
+
/* ignore late errors on coordinator connection */
|
|
151
|
+
});
|
|
152
|
+
clearTimeout(timer);
|
|
153
|
+
resolve();
|
|
154
|
+
});
|
|
155
|
+
const timer = setTimeout(() => {
|
|
156
|
+
socket.destroy();
|
|
157
|
+
reject(new Error("Coordinator connection timeout"));
|
|
158
|
+
}, CONNECT_TIMEOUT_MS);
|
|
159
|
+
socket.on("error", (err) => {
|
|
160
|
+
clearTimeout(timer);
|
|
161
|
+
socket.destroy();
|
|
162
|
+
reject(err);
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
// -----------------------------------------------------------------------
|
|
167
|
+
// MeshTransport — Connect to remote coordinator with approval
|
|
168
|
+
// -----------------------------------------------------------------------
|
|
169
|
+
async connectToRemote(host, port, peerId, localDataPort, name, fingerprint) {
|
|
170
|
+
this._peerId = peerId;
|
|
171
|
+
await new Promise((resolve, reject) => {
|
|
172
|
+
const socket = tls.connect({ ...this.connectOptions, host, port }, () => {
|
|
173
|
+
this.coordinatorSocket = socket;
|
|
174
|
+
// Send connect_request instead of introduce
|
|
175
|
+
const req = {
|
|
176
|
+
method: "connect_request",
|
|
177
|
+
peerId,
|
|
178
|
+
dataPort: localDataPort,
|
|
179
|
+
name,
|
|
180
|
+
fingerprint,
|
|
181
|
+
};
|
|
182
|
+
socket.write(encode(req));
|
|
183
|
+
clearTimeout(timer);
|
|
184
|
+
// Wire up coordinator message handling
|
|
185
|
+
const buffer = new MessageBuffer();
|
|
186
|
+
let approved = false;
|
|
187
|
+
socket.on("data", (data) => {
|
|
188
|
+
const items = buffer.append(data.toString());
|
|
189
|
+
for (const item of items) {
|
|
190
|
+
if (!isMeshMessage(item))
|
|
191
|
+
continue;
|
|
192
|
+
if (!approved) {
|
|
193
|
+
if (item.method === "connect_accepted") {
|
|
194
|
+
approved = true;
|
|
195
|
+
resolve();
|
|
196
|
+
}
|
|
197
|
+
else if (item.method === "connect_rejected") {
|
|
198
|
+
socket.destroy();
|
|
199
|
+
reject(new Error(`Connection rejected: ${item.reason}`));
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
this.dispatchCoordinatorClientMessage(item);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
socket.on("error", () => {
|
|
209
|
+
/* ignore late errors on coordinator connection */
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
const timer = setTimeout(() => {
|
|
213
|
+
socket.destroy();
|
|
214
|
+
reject(new Error("Remote connection timeout"));
|
|
215
|
+
}, CONNECT_TIMEOUT_MS);
|
|
216
|
+
socket.on("error", (err) => {
|
|
217
|
+
clearTimeout(timer);
|
|
218
|
+
socket.destroy();
|
|
219
|
+
reject(err);
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
// -----------------------------------------------------------------------
|
|
224
|
+
// MeshTransport — Become coordinator (server side)
|
|
225
|
+
// -----------------------------------------------------------------------
|
|
226
|
+
async becomeCoordinator(host, port) {
|
|
227
|
+
const id = nanoid(8);
|
|
228
|
+
await new Promise((resolve, reject) => {
|
|
229
|
+
const server = tls.createServer(this.tlsOptions, (socket) => {
|
|
230
|
+
this.handleCoordinatorServerConnection(socket, "full");
|
|
231
|
+
});
|
|
232
|
+
server.listen(port, host, () => {
|
|
233
|
+
this._isCoordinator = true;
|
|
234
|
+
this.coordinatorListeners.set(id, {
|
|
235
|
+
server,
|
|
236
|
+
policy: "full",
|
|
237
|
+
host,
|
|
238
|
+
port,
|
|
239
|
+
isDefault: true,
|
|
240
|
+
});
|
|
241
|
+
this.defaultListenerId = id;
|
|
242
|
+
resolve();
|
|
243
|
+
});
|
|
244
|
+
server.on("error", (err) => {
|
|
245
|
+
reject(err instanceof Error ? err : new Error(String(err)));
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
// -----------------------------------------------------------------------
|
|
250
|
+
// MeshTransport — Multi-listener management
|
|
251
|
+
// -----------------------------------------------------------------------
|
|
252
|
+
async addListener(host, port, policy) {
|
|
253
|
+
if (!this._isCoordinator) {
|
|
254
|
+
throw new Error("Only the coordinator can add listeners");
|
|
255
|
+
}
|
|
256
|
+
const id = nanoid(8);
|
|
257
|
+
await new Promise((resolve, reject) => {
|
|
258
|
+
const server = tls.createServer(this.tlsOptions, (socket) => {
|
|
259
|
+
this.handleCoordinatorServerConnection(socket, policy);
|
|
260
|
+
});
|
|
261
|
+
server.listen(port, host, () => {
|
|
262
|
+
const addr = server.address();
|
|
263
|
+
const actualPort = typeof addr === "object" && addr !== null ? addr.port : port;
|
|
264
|
+
this.coordinatorListeners.set(id, {
|
|
265
|
+
server,
|
|
266
|
+
policy,
|
|
267
|
+
host,
|
|
268
|
+
port: actualPort,
|
|
269
|
+
isDefault: false,
|
|
270
|
+
});
|
|
271
|
+
resolve();
|
|
272
|
+
});
|
|
273
|
+
server.on("error", (err) => {
|
|
274
|
+
reject(err instanceof Error ? err : new Error(String(err)));
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
return id;
|
|
278
|
+
}
|
|
279
|
+
async removeListener(id) {
|
|
280
|
+
const listener = this.coordinatorListeners.get(id);
|
|
281
|
+
if (!listener) {
|
|
282
|
+
throw new Error(`Listener ${id} not found`);
|
|
283
|
+
}
|
|
284
|
+
if (listener.isDefault) {
|
|
285
|
+
throw new Error("Cannot remove the default localhost listener");
|
|
286
|
+
}
|
|
287
|
+
listener.server.unref();
|
|
288
|
+
listener.server.close();
|
|
289
|
+
this.coordinatorListeners.delete(id);
|
|
290
|
+
}
|
|
291
|
+
listListeners() {
|
|
292
|
+
const result = [];
|
|
293
|
+
for (const [id, listener] of this.coordinatorListeners) {
|
|
294
|
+
result.push({
|
|
295
|
+
id,
|
|
296
|
+
host: listener.host,
|
|
297
|
+
port: listener.port,
|
|
298
|
+
policy: listener.policy,
|
|
299
|
+
isDefault: listener.isDefault,
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
return result;
|
|
303
|
+
}
|
|
304
|
+
// -----------------------------------------------------------------------
|
|
305
|
+
// MeshTransport — Connect to a peer's data server
|
|
306
|
+
// -----------------------------------------------------------------------
|
|
307
|
+
async connectToPeer(peer, ownPeerId) {
|
|
308
|
+
if (this.peerConnections.has(peer.id))
|
|
309
|
+
return;
|
|
310
|
+
await new Promise((resolve) => {
|
|
311
|
+
const socket = tls.connect({ ...this.connectOptions, host: COORDINATOR_HOST, port: peer.port }, () => {
|
|
312
|
+
const buffer = new MessageBuffer();
|
|
313
|
+
this.peerConnections.set(peer.id, { socket, buffer });
|
|
314
|
+
// Identify ourselves
|
|
315
|
+
const pong = { method: "pong", peerId: ownPeerId };
|
|
316
|
+
socket.write(encode(pong));
|
|
317
|
+
// Wire up ongoing message handling
|
|
318
|
+
socket.on("data", (data) => {
|
|
319
|
+
const items = buffer.append(data.toString());
|
|
320
|
+
for (const item of items) {
|
|
321
|
+
if (isMeshMessage(item)) {
|
|
322
|
+
const handle = { id: peer.id };
|
|
323
|
+
this.dispatchDataMessage(handle, item);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
resolve();
|
|
328
|
+
});
|
|
329
|
+
const handle = { id: peer.id };
|
|
330
|
+
let disconnected = false;
|
|
331
|
+
const onDisconnect = () => {
|
|
332
|
+
if (disconnected)
|
|
333
|
+
return;
|
|
334
|
+
disconnected = true;
|
|
335
|
+
const wasConnected = this.peerConnections.has(peer.id);
|
|
336
|
+
this.peerConnections.delete(peer.id);
|
|
337
|
+
if (wasConnected && !this.shutDown) {
|
|
338
|
+
this.events.onPeerDisconnected(handle);
|
|
339
|
+
}
|
|
340
|
+
};
|
|
341
|
+
socket.on("close", onDisconnect);
|
|
342
|
+
socket.on("error", () => {
|
|
343
|
+
onDisconnect();
|
|
344
|
+
socket.destroy();
|
|
345
|
+
resolve();
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
// -----------------------------------------------------------------------
|
|
350
|
+
// MeshTransport — Send / broadcast
|
|
351
|
+
// -----------------------------------------------------------------------
|
|
352
|
+
async send(handle, message) {
|
|
353
|
+
// Check data connections first
|
|
354
|
+
const peerConn = this.peerConnections.get(handle.id);
|
|
355
|
+
if (peerConn) {
|
|
356
|
+
await writeAsync(peerConn.socket, encode(message));
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
// Check coordinator introduction connections
|
|
360
|
+
const introSocket = this.introConnections.get(handle.id);
|
|
361
|
+
if (introSocket) {
|
|
362
|
+
await writeAsync(introSocket, encode(message));
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
throw new Error(`No connection for handle ${handle.id}`);
|
|
366
|
+
}
|
|
367
|
+
async acceptConnection(handle) {
|
|
368
|
+
const pending = this.pendingConnections.get(handle.id);
|
|
369
|
+
if (!pending) {
|
|
370
|
+
throw new Error(`No pending connection for handle ${handle.id}`);
|
|
371
|
+
}
|
|
372
|
+
this.pendingConnections.delete(handle.id);
|
|
373
|
+
const { socket, peerId, dataPort, name, fingerprint, policy } = pending;
|
|
374
|
+
// Move to introConnections so send() can reach this peer
|
|
375
|
+
this.introConnections.set(peerId, socket);
|
|
376
|
+
// Send acceptance to the connecting peer
|
|
377
|
+
const accepted = {
|
|
378
|
+
method: "connect_accepted",
|
|
379
|
+
peerId: this._peerId,
|
|
380
|
+
dataPort: this._dataPort,
|
|
381
|
+
};
|
|
382
|
+
await writeAsync(socket, encode(accepted));
|
|
383
|
+
// Fire onIntroduction so MeshStore processes the new peer normally
|
|
384
|
+
const connHandle = { id: peerId, policy };
|
|
385
|
+
this.events.onIntroduction(connHandle, { peerId, dataPort });
|
|
386
|
+
void name;
|
|
387
|
+
void fingerprint;
|
|
388
|
+
}
|
|
389
|
+
async rejectConnection(handle, reason) {
|
|
390
|
+
const pending = this.pendingConnections.get(handle.id);
|
|
391
|
+
if (!pending) {
|
|
392
|
+
throw new Error(`No pending connection for handle ${handle.id}`);
|
|
393
|
+
}
|
|
394
|
+
this.pendingConnections.delete(handle.id);
|
|
395
|
+
const { socket } = pending;
|
|
396
|
+
const rejected = {
|
|
397
|
+
method: "connect_rejected",
|
|
398
|
+
peerId: handle.id,
|
|
399
|
+
reason,
|
|
400
|
+
};
|
|
401
|
+
await writeAsync(socket, encode(rejected));
|
|
402
|
+
socket.destroy();
|
|
403
|
+
}
|
|
404
|
+
async broadcast(message) {
|
|
405
|
+
const data = encode(message);
|
|
406
|
+
const writes = [];
|
|
407
|
+
for (const [, peer] of this.peerConnections) {
|
|
408
|
+
writes.push(writeAsync(peer.socket, data).catch(() => {
|
|
409
|
+
/* broken connection — cleanup handled by close/error listeners */
|
|
410
|
+
}));
|
|
411
|
+
}
|
|
412
|
+
await Promise.all(writes);
|
|
413
|
+
}
|
|
414
|
+
// -----------------------------------------------------------------------
|
|
415
|
+
// MeshTransport — Shutdown / unref
|
|
416
|
+
// -----------------------------------------------------------------------
|
|
417
|
+
async shutdown() {
|
|
418
|
+
this.shutDown = true;
|
|
419
|
+
// Destroy the coordinator client socket
|
|
420
|
+
this.coordinatorSocket?.unref();
|
|
421
|
+
this.coordinatorSocket?.destroy();
|
|
422
|
+
this.coordinatorSocket = undefined;
|
|
423
|
+
// Destroy all identified peer connections
|
|
424
|
+
for (const [, peer] of this.peerConnections) {
|
|
425
|
+
peer.socket.unref();
|
|
426
|
+
peer.socket.destroy();
|
|
427
|
+
}
|
|
428
|
+
this.peerConnections.clear();
|
|
429
|
+
// Destroy all data server accepted sockets (including unidentified)
|
|
430
|
+
for (const socket of this.dataServerSockets) {
|
|
431
|
+
socket.unref();
|
|
432
|
+
socket.destroy();
|
|
433
|
+
}
|
|
434
|
+
this.dataServerSockets.clear();
|
|
435
|
+
// Destroy all coordinator server accepted sockets
|
|
436
|
+
for (const socket of this.coordinatorServerSockets) {
|
|
437
|
+
socket.unref();
|
|
438
|
+
socket.destroy();
|
|
439
|
+
}
|
|
440
|
+
this.coordinatorServerSockets.clear();
|
|
441
|
+
// Clear introduction connection tracking
|
|
442
|
+
this.introConnections.clear();
|
|
443
|
+
// Clear pending connections
|
|
444
|
+
for (const [, pending] of this.pendingConnections) {
|
|
445
|
+
pending.socket.unref();
|
|
446
|
+
pending.socket.destroy();
|
|
447
|
+
}
|
|
448
|
+
this.pendingConnections.clear();
|
|
449
|
+
// Close data server
|
|
450
|
+
this.dataServer?.unref();
|
|
451
|
+
this.dataServer?.close();
|
|
452
|
+
this.dataServer = undefined;
|
|
453
|
+
// Close coordinator listener servers
|
|
454
|
+
for (const [, listener] of this.coordinatorListeners) {
|
|
455
|
+
listener.server.unref();
|
|
456
|
+
listener.server.close();
|
|
457
|
+
}
|
|
458
|
+
this.coordinatorListeners.clear();
|
|
459
|
+
this.defaultListenerId = undefined;
|
|
460
|
+
this._isCoordinator = false;
|
|
461
|
+
}
|
|
462
|
+
unref() {
|
|
463
|
+
this.dataServer?.unref();
|
|
464
|
+
for (const [, listener] of this.coordinatorListeners) {
|
|
465
|
+
listener.server.unref();
|
|
466
|
+
}
|
|
467
|
+
this.coordinatorSocket?.unref();
|
|
468
|
+
}
|
|
469
|
+
// -----------------------------------------------------------------------
|
|
470
|
+
// Internal — Coordinator client message dispatch
|
|
471
|
+
// -----------------------------------------------------------------------
|
|
472
|
+
dispatchCoordinatorClientMessage(msg) {
|
|
473
|
+
if (this.shutDown)
|
|
474
|
+
return;
|
|
475
|
+
if (msg.method === "peer_list") {
|
|
476
|
+
this.events.onPeerList(msg.peers);
|
|
477
|
+
}
|
|
478
|
+
else if (msg.method === "peer_joined") {
|
|
479
|
+
this.events.onPeerJoined(msg.peer);
|
|
480
|
+
}
|
|
481
|
+
else if (msg.method === "become_coordinator") {
|
|
482
|
+
this.events.onBecomeCoordinator(msg.peerList);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
// -----------------------------------------------------------------------
|
|
486
|
+
// Internal — Data message dispatch
|
|
487
|
+
// -----------------------------------------------------------------------
|
|
488
|
+
dispatchDataMessage(handle, msg) {
|
|
489
|
+
if (this.shutDown)
|
|
490
|
+
return;
|
|
491
|
+
if (msg.method === "become_coordinator") {
|
|
492
|
+
this.events.onBecomeCoordinator(msg.peerList);
|
|
493
|
+
}
|
|
494
|
+
else {
|
|
495
|
+
this.events.onMessage(handle, msg);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
// -----------------------------------------------------------------------
|
|
499
|
+
// Internal — Coordinator server connection handling
|
|
500
|
+
// -----------------------------------------------------------------------
|
|
501
|
+
/**
|
|
502
|
+
* Accepts a new connection on a coordinator server. Reads
|
|
503
|
+
* introduce messages and fires onIntroduction so MeshStore can
|
|
504
|
+
* respond with the peer list and broadcast the arrival.
|
|
505
|
+
* The connection is tagged with the listener's policy.
|
|
506
|
+
*/
|
|
507
|
+
handleCoordinatorServerConnection(socket, policy) {
|
|
508
|
+
if (this.shutDown) {
|
|
509
|
+
socket.destroy();
|
|
510
|
+
return;
|
|
511
|
+
}
|
|
512
|
+
this.coordinatorServerSockets.add(socket);
|
|
513
|
+
socket.on("close", () => this.coordinatorServerSockets.delete(socket));
|
|
514
|
+
socket.on("error", () => this.coordinatorServerSockets.delete(socket));
|
|
515
|
+
const buffer = new MessageBuffer();
|
|
516
|
+
socket.on("data", (data) => {
|
|
517
|
+
const items = buffer.append(data.toString());
|
|
518
|
+
for (const item of items) {
|
|
519
|
+
if (!isMeshMessage(item))
|
|
520
|
+
continue;
|
|
521
|
+
if (item.method === "introduce") {
|
|
522
|
+
const handle = { id: item.peerId, policy };
|
|
523
|
+
this.introConnections.set(handle.id, socket);
|
|
524
|
+
this.events.onIntroduction(handle, {
|
|
525
|
+
peerId: item.peerId,
|
|
526
|
+
dataPort: item.dataPort,
|
|
527
|
+
});
|
|
528
|
+
}
|
|
529
|
+
else if (item.method === "connect_request") {
|
|
530
|
+
const handle = { id: item.peerId, policy };
|
|
531
|
+
this.pendingConnections.set(handle.id, {
|
|
532
|
+
socket,
|
|
533
|
+
peerId: item.peerId,
|
|
534
|
+
dataPort: item.dataPort,
|
|
535
|
+
name: item.name,
|
|
536
|
+
fingerprint: item.fingerprint,
|
|
537
|
+
policy,
|
|
538
|
+
});
|
|
539
|
+
this.events.onConnectionRequest(handle, {
|
|
540
|
+
peerId: item.peerId,
|
|
541
|
+
dataPort: item.dataPort,
|
|
542
|
+
name: item.name,
|
|
543
|
+
fingerprint: item.fingerprint,
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
});
|
|
548
|
+
}
|
|
549
|
+
// -----------------------------------------------------------------------
|
|
550
|
+
// Internal — Incoming data connection handling
|
|
551
|
+
// -----------------------------------------------------------------------
|
|
552
|
+
handleIncomingDataConnection(socket) {
|
|
553
|
+
if (this.shutDown) {
|
|
554
|
+
socket.destroy();
|
|
555
|
+
return;
|
|
556
|
+
}
|
|
557
|
+
this.dataServerSockets.add(socket);
|
|
558
|
+
socket.on("close", () => this.dataServerSockets.delete(socket));
|
|
559
|
+
const buffer = new MessageBuffer();
|
|
560
|
+
let remotePeerId;
|
|
561
|
+
let disconnected = false;
|
|
562
|
+
socket.on("data", (data) => {
|
|
563
|
+
const items = buffer.append(data.toString());
|
|
564
|
+
for (const item of items) {
|
|
565
|
+
if (isMeshMessage(item)) {
|
|
566
|
+
if (item.method === "pong") {
|
|
567
|
+
const peerId = item.peerId;
|
|
568
|
+
remotePeerId = peerId;
|
|
569
|
+
if (!this.peerConnections.has(peerId)) {
|
|
570
|
+
this.peerConnections.set(peerId, { socket, buffer });
|
|
571
|
+
}
|
|
572
|
+
const handle = { id: peerId };
|
|
573
|
+
const info = {
|
|
574
|
+
id: peerId,
|
|
575
|
+
port: 0,
|
|
576
|
+
startedAt: new Date().toISOString(),
|
|
577
|
+
};
|
|
578
|
+
this.events.onPeerConnected(handle, info);
|
|
579
|
+
}
|
|
580
|
+
else if (remotePeerId !== undefined) {
|
|
581
|
+
const handle = { id: remotePeerId };
|
|
582
|
+
this.dispatchDataMessage(handle, item);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
});
|
|
587
|
+
const onDisconnect = () => {
|
|
588
|
+
if (disconnected)
|
|
589
|
+
return;
|
|
590
|
+
disconnected = true;
|
|
591
|
+
if (remotePeerId !== undefined) {
|
|
592
|
+
this.peerConnections.delete(remotePeerId);
|
|
593
|
+
if (!this.shutDown) {
|
|
594
|
+
this.events.onPeerDisconnected({ id: remotePeerId });
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
};
|
|
598
|
+
socket.on("close", onDisconnect);
|
|
599
|
+
socket.on("error", onDisconnect);
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
//# sourceMappingURL=tls-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tls-transport.js","sourceRoot":"","sources":["../../src/core/tls-transport.ts"],"names":[],"mappings":"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"}
|
package/dist/core/tool.d.ts
CHANGED
|
@@ -6,8 +6,9 @@
|
|
|
6
6
|
* 2. Call handleAction(action)
|
|
7
7
|
* 3. Return the result string to the LLM
|
|
8
8
|
*/
|
|
9
|
-
import type { AgentId, AgentIdentity, CommsAction } from "./types.js";
|
|
9
|
+
import type { AgentId, AgentIdentity, CommsAction, MeshVisibility } from "./types.js";
|
|
10
10
|
import type { CommsStore } from "./comms-store.js";
|
|
11
|
+
import type { DiscoveryManager } from "./discovery.js";
|
|
11
12
|
export interface CommsContext {
|
|
12
13
|
agentId: AgentId;
|
|
13
14
|
harness: AgentIdentity["harness"];
|
|
@@ -21,7 +22,11 @@ export interface CommsResult {
|
|
|
21
22
|
}
|
|
22
23
|
export declare class CommsTool {
|
|
23
24
|
private readonly store;
|
|
24
|
-
|
|
25
|
+
private readonly discovery?;
|
|
26
|
+
constructor(store: CommsStore & {
|
|
27
|
+
setVisibility?(level: MeshVisibility, adapter?: string): Promise<void>;
|
|
28
|
+
getVisibility?(adapter?: string): MeshVisibility;
|
|
29
|
+
}, discovery?: DiscoveryManager | undefined);
|
|
25
30
|
handle(ctx: CommsContext, action: CommsAction): Promise<CommsResult>;
|
|
26
31
|
private register;
|
|
27
32
|
private update;
|
|
@@ -38,5 +43,21 @@ export declare class CommsTool {
|
|
|
38
43
|
private declineInvite;
|
|
39
44
|
private kick;
|
|
40
45
|
private destroyRoom;
|
|
46
|
+
private meshDiscover;
|
|
47
|
+
private meshAdvertise;
|
|
48
|
+
private meshInterfaces;
|
|
49
|
+
private meshUnadvertise;
|
|
50
|
+
private meshListen;
|
|
51
|
+
private meshUnlisten;
|
|
52
|
+
private meshListeners;
|
|
53
|
+
private meshSetVisibility;
|
|
54
|
+
private meshGetVisibility;
|
|
55
|
+
private meshFedConnect;
|
|
56
|
+
private meshConnect;
|
|
57
|
+
private meshFedDisconnect;
|
|
58
|
+
private meshAccept;
|
|
59
|
+
private meshFedLinks;
|
|
60
|
+
private meshReject;
|
|
61
|
+
private meshPending;
|
|
41
62
|
}
|
|
42
63
|
//# sourceMappingURL=tool.d.ts.map
|