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,251 @@
|
|
|
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
|
+
import { createHash, createPublicKey, createSign, generateKeyPairSync, randomBytes, } from "node:crypto";
|
|
12
|
+
// ─── ASN.1 DER helpers ─────────────────────────────────────────────────────
|
|
13
|
+
/** Encode a DER length field. */
|
|
14
|
+
function derLength(length) {
|
|
15
|
+
if (length < 0x80)
|
|
16
|
+
return Buffer.from([length]);
|
|
17
|
+
if (length < 0x100)
|
|
18
|
+
return Buffer.from([0x81, length]);
|
|
19
|
+
return Buffer.from([0x82, (length >> 8) & 0xff, length & 0xff]);
|
|
20
|
+
}
|
|
21
|
+
/** Wrap content bytes in a DER tag. */
|
|
22
|
+
function derWrap(tag, content) {
|
|
23
|
+
return Buffer.concat([
|
|
24
|
+
Buffer.from([tag]),
|
|
25
|
+
derLength(content.length),
|
|
26
|
+
content,
|
|
27
|
+
]);
|
|
28
|
+
}
|
|
29
|
+
/** DER SEQUENCE. */
|
|
30
|
+
function derSequence(...items) {
|
|
31
|
+
return derWrap(0x30, Buffer.concat(items));
|
|
32
|
+
}
|
|
33
|
+
/** DER SET. */
|
|
34
|
+
function derSet(...items) {
|
|
35
|
+
return derWrap(0x31, Buffer.concat(items));
|
|
36
|
+
}
|
|
37
|
+
/** DER OBJECT IDENTIFIER from dotted-decimal string. */
|
|
38
|
+
function derOID(oid) {
|
|
39
|
+
const parts = oid.split(".").map(Number);
|
|
40
|
+
const first = parts[0];
|
|
41
|
+
const second = parts[1];
|
|
42
|
+
if (first === undefined || second === undefined) {
|
|
43
|
+
throw new Error(`Invalid OID: ${oid}`);
|
|
44
|
+
}
|
|
45
|
+
const bytes = [40 * first + second];
|
|
46
|
+
for (let i = 2; i < parts.length; i++) {
|
|
47
|
+
let value = parts[i];
|
|
48
|
+
if (value === undefined)
|
|
49
|
+
continue;
|
|
50
|
+
if (value < 128) {
|
|
51
|
+
bytes.push(value);
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const encoded = [];
|
|
55
|
+
encoded.push(value & 0x7f);
|
|
56
|
+
value >>= 7;
|
|
57
|
+
while (value > 0) {
|
|
58
|
+
encoded.push(0x80 | (value & 0x7f));
|
|
59
|
+
value >>= 7;
|
|
60
|
+
}
|
|
61
|
+
bytes.push(...encoded.reverse());
|
|
62
|
+
}
|
|
63
|
+
return derWrap(0x06, Buffer.from(bytes));
|
|
64
|
+
}
|
|
65
|
+
/** DER UTF8String. */
|
|
66
|
+
function derUTF8String(value) {
|
|
67
|
+
return derWrap(0x0c, Buffer.from(value, "utf8"));
|
|
68
|
+
}
|
|
69
|
+
/** DER INTEGER from a raw byte buffer (adds leading zero if high bit set). */
|
|
70
|
+
function derIntegerBytes(value) {
|
|
71
|
+
const firstByte = value[0];
|
|
72
|
+
if (firstByte === undefined || firstByte & 0x80) {
|
|
73
|
+
return derWrap(0x02, Buffer.concat([Buffer.from([0x00]), value]));
|
|
74
|
+
}
|
|
75
|
+
return derWrap(0x02, value);
|
|
76
|
+
}
|
|
77
|
+
/** DER BIT STRING (with zero unused-bits prefix). */
|
|
78
|
+
function derBitString(content) {
|
|
79
|
+
return derWrap(0x03, Buffer.concat([Buffer.from([0x00]), content]));
|
|
80
|
+
}
|
|
81
|
+
/** DER OCTET STRING. */
|
|
82
|
+
function derOctetString(content) {
|
|
83
|
+
return derWrap(0x04, content);
|
|
84
|
+
}
|
|
85
|
+
/** DER BOOLEAN. */
|
|
86
|
+
function derBoolean(value) {
|
|
87
|
+
return derWrap(0x01, Buffer.from([value ? 0xff : 0x00]));
|
|
88
|
+
}
|
|
89
|
+
/** DER UTCTime from a Date. Format: YYMMDDHHMMSSZ */
|
|
90
|
+
function derUTCTime(date) {
|
|
91
|
+
const str = [
|
|
92
|
+
String(date.getUTCFullYear() % 100).padStart(2, "0"),
|
|
93
|
+
String(date.getUTCMonth() + 1).padStart(2, "0"),
|
|
94
|
+
String(date.getUTCDate()).padStart(2, "0"),
|
|
95
|
+
String(date.getUTCHours()).padStart(2, "0"),
|
|
96
|
+
String(date.getUTCMinutes()).padStart(2, "0"),
|
|
97
|
+
String(date.getUTCSeconds()).padStart(2, "0"),
|
|
98
|
+
"Z",
|
|
99
|
+
].join("");
|
|
100
|
+
return derWrap(0x17, Buffer.from(str, "ascii"));
|
|
101
|
+
}
|
|
102
|
+
// ─── OID constants ──────────────────────────────────────────────────────────
|
|
103
|
+
/** ECDSA with SHA-256 signature algorithm. */
|
|
104
|
+
const OID_ECDSA_WITH_SHA256 = "1.2.840.10045.4.3.2";
|
|
105
|
+
/** Common Name attribute. */
|
|
106
|
+
const OID_CN = "2.5.4.3";
|
|
107
|
+
/** Subject Key Identifier extension. */
|
|
108
|
+
const OID_SKI = "2.5.29.14";
|
|
109
|
+
/** Subject Alternative Name extension. */
|
|
110
|
+
const OID_SAN = "2.5.29.17";
|
|
111
|
+
/** Basic Constraints extension. */
|
|
112
|
+
const OID_BASIC_CONSTRAINTS = "2.5.29.19";
|
|
113
|
+
// ─── Certificate building ───────────────────────────────────────────────────
|
|
114
|
+
/**
|
|
115
|
+
* Build a self-signed X.509 v3 certificate in DER format.
|
|
116
|
+
*
|
|
117
|
+
* Structure (RFC 5280 §4.1):
|
|
118
|
+
* Certificate ::= SEQUENCE { tbsCertificate, signatureAlgorithm, signatureValue }
|
|
119
|
+
*/
|
|
120
|
+
function buildCertificateDer(tbsCertificate, signatureAlgorithm, signature) {
|
|
121
|
+
return derSequence(tbsCertificate, signatureAlgorithm, derBitString(signature));
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Build the TBSCertificate DER structure.
|
|
125
|
+
*
|
|
126
|
+
* Structure (RFC 5280 §4.1.2):
|
|
127
|
+
* version [0] EXPLICIT INTEGER (v3 = 2),
|
|
128
|
+
* serialNumber INTEGER,
|
|
129
|
+
* signature AlgorithmIdentifier,
|
|
130
|
+
* issuer Name,
|
|
131
|
+
* validity { notBefore, notAfter },
|
|
132
|
+
* subject Name,
|
|
133
|
+
* subjectPublicKeyInfo SubjectPublicKeyInfo,
|
|
134
|
+
* extensions [3] EXPLICIT Extensions OPTIONAL
|
|
135
|
+
*/
|
|
136
|
+
function buildTbsCertificate(serial, signatureAlgorithm, issuerSubject, validity, subjectPublicKeyInfoDer, extensions) {
|
|
137
|
+
// version: [0] EXPLICIT { INTEGER 2 } → a0 03 02 01 02
|
|
138
|
+
const version = derWrap(0xa0, derIntegerBytes(Buffer.from([2])));
|
|
139
|
+
return derSequence(version, derIntegerBytes(serial), signatureAlgorithm, issuerSubject, // issuer
|
|
140
|
+
validity, issuerSubject, // subject (same as issuer for self-signed)
|
|
141
|
+
subjectPublicKeyInfoDer, derWrap(0xa3, derSequence(extensions)));
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Build the X.509v3 extensions.
|
|
145
|
+
*
|
|
146
|
+
* Includes:
|
|
147
|
+
* - Subject Key Identifier (SHA-1 hash of the public key DER)
|
|
148
|
+
* - Subject Alternative Name (DNS:localhost, IP:127.0.0.1)
|
|
149
|
+
* - Basic Constraints (CA:FALSE, critical)
|
|
150
|
+
*/
|
|
151
|
+
function buildExtensions(publicKeyDer) {
|
|
152
|
+
// Subject Key Identifier
|
|
153
|
+
const ski = createHash("sha1").update(publicKeyDer).digest();
|
|
154
|
+
const skiExtension = derSequence(derOID(OID_SKI), derOctetString(derOctetString(ski)));
|
|
155
|
+
// Subject Alternative Name
|
|
156
|
+
const sanValue = derSequence(derWrap(0x82, Buffer.from("localhost", "ascii")), // dNSName
|
|
157
|
+
derWrap(0x87, Buffer.from([127, 0, 0, 1])));
|
|
158
|
+
const sanExtension = derSequence(derOID(OID_SAN), derOctetString(sanValue));
|
|
159
|
+
// Basic Constraints (CA:FALSE, critical)
|
|
160
|
+
const bcExtension = derSequence(derOID(OID_BASIC_CONSTRAINTS), derBoolean(true), // critical
|
|
161
|
+
derOctetString(derSequence()));
|
|
162
|
+
return Buffer.concat([skiExtension, sanExtension, bcExtension]);
|
|
163
|
+
}
|
|
164
|
+
// ─── Public API ─────────────────────────────────────────────────────────────
|
|
165
|
+
/**
|
|
166
|
+
* Generate a fresh cryptographic identity: ECDSA P-256 keypair and self-signed
|
|
167
|
+
* X.509 certificate. The fingerprint of the certificate serves as the peer ID.
|
|
168
|
+
*
|
|
169
|
+
* Key material stays in memory only — never written to disk.
|
|
170
|
+
*/
|
|
171
|
+
export function generateIdentity() {
|
|
172
|
+
// When encoding options are specified, generateKeyPairSync returns
|
|
173
|
+
// { publicKey: string, privateKey: string } in PEM format.
|
|
174
|
+
const keyPair = generateKeyPairSync("ec", {
|
|
175
|
+
namedCurve: "P-256",
|
|
176
|
+
publicKeyEncoding: { type: "spki", format: "pem" },
|
|
177
|
+
privateKeyEncoding: { type: "pkcs8", format: "pem" },
|
|
178
|
+
});
|
|
179
|
+
const publicKeyDer = createPublicKey(keyPair.publicKey).export({
|
|
180
|
+
type: "spki",
|
|
181
|
+
format: "der",
|
|
182
|
+
});
|
|
183
|
+
// Random serial number (20 bytes). Clear the high bit to ensure positive.
|
|
184
|
+
const serialBytes = createHash("sha256")
|
|
185
|
+
.update(randomBytes(16))
|
|
186
|
+
.digest()
|
|
187
|
+
.subarray(0, 20);
|
|
188
|
+
const serial = Buffer.from(serialBytes);
|
|
189
|
+
const firstSerialByte = serial[0];
|
|
190
|
+
if (firstSerialByte !== undefined)
|
|
191
|
+
serial[0] = firstSerialByte & 0x7f;
|
|
192
|
+
// Validity period: now through 365 days from now
|
|
193
|
+
const now = new Date();
|
|
194
|
+
const expires = new Date(now.getTime() + 365 * 24 * 60 * 60 * 1000);
|
|
195
|
+
// Subject/Issuer Name: SEQUENCE { SET { SEQUENCE { OID, value } } }
|
|
196
|
+
const subject = derSequence(derSet(derSequence(derOID(OID_CN), derUTF8String("agent-comms"))));
|
|
197
|
+
// Signature algorithm: ecdsa-with-SHA256
|
|
198
|
+
const sigAlgSeq = derSequence(derOID(OID_ECDSA_WITH_SHA256));
|
|
199
|
+
// Validity
|
|
200
|
+
const validity = derSequence(derUTCTime(now), derUTCTime(expires));
|
|
201
|
+
// Extensions
|
|
202
|
+
const extensions = buildExtensions(publicKeyDer);
|
|
203
|
+
// TBSCertificate
|
|
204
|
+
const tbsCert = buildTbsCertificate(serial, sigAlgSeq, subject, validity, publicKeyDer, extensions);
|
|
205
|
+
// Sign the TBSCertificate
|
|
206
|
+
const signer = createSign("SHA256");
|
|
207
|
+
signer.update(tbsCert);
|
|
208
|
+
const signature = signer.sign(keyPair.privateKey);
|
|
209
|
+
// Assemble the full certificate
|
|
210
|
+
const certDer = buildCertificateDer(tbsCert, sigAlgSeq, signature);
|
|
211
|
+
// PEM-encode
|
|
212
|
+
const certificate = derToCertificatePem(certDer);
|
|
213
|
+
return {
|
|
214
|
+
privateKey: keyPair.privateKey,
|
|
215
|
+
certificate,
|
|
216
|
+
fingerprint: getCertificateFingerprint(certificate),
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Compute the SHA-256 fingerprint of a PEM-encoded certificate.
|
|
221
|
+
* Returns hex-encoded with colon separators (standard format): "AB:CD:EF:..."
|
|
222
|
+
*/
|
|
223
|
+
export function getCertificateFingerprint(certificate) {
|
|
224
|
+
const der = pemToDer(certificate);
|
|
225
|
+
const hex = createHash("sha256").update(der).digest("hex").toUpperCase();
|
|
226
|
+
const matched = hex.match(/.{2}/g);
|
|
227
|
+
if (matched === null)
|
|
228
|
+
return "";
|
|
229
|
+
return matched.join(":");
|
|
230
|
+
}
|
|
231
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
232
|
+
/** Decode a PEM-encoded certificate to raw DER bytes. */
|
|
233
|
+
function pemToDer(pem) {
|
|
234
|
+
const b64 = pem
|
|
235
|
+
.replace(/-----BEGIN CERTIFICATE-----/, "")
|
|
236
|
+
.replace(/-----END CERTIFICATE-----/, "")
|
|
237
|
+
.replace(/\s/g, "");
|
|
238
|
+
return Buffer.from(b64, "base64");
|
|
239
|
+
}
|
|
240
|
+
/** Encode DER bytes as a PEM certificate string. */
|
|
241
|
+
function derToCertificatePem(der) {
|
|
242
|
+
const b64 = der.toString("base64").match(/.{1,64}/g);
|
|
243
|
+
const lines = b64 ?? [];
|
|
244
|
+
return [
|
|
245
|
+
"-----BEGIN CERTIFICATE-----",
|
|
246
|
+
...lines,
|
|
247
|
+
"-----END CERTIFICATE-----",
|
|
248
|
+
"",
|
|
249
|
+
].join("\n");
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/core/identity.ts"],"names":[],"mappings":"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"}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -9,7 +9,18 @@ export { FileStore, CommsError } from "./store.js";
|
|
|
9
9
|
export { MeshStore } from "./mesh-store.js";
|
|
10
10
|
export { CommsTool } from "./tool.js";
|
|
11
11
|
export type { CommsContext, CommsResult } from "./tool.js";
|
|
12
|
-
export { buildAction, formatDeliveryEvent, ensureRegistered, drainAndFormat, MCP_TOOL_PARAMS, } from "./bridge.js";
|
|
12
|
+
export { buildAction, formatDeliveryEvent, isActionableEvent, ensureRegistered, ensureProjectRoom, drainAndFormat, MCP_TOOL_PARAMS, } from "./bridge.js";
|
|
13
13
|
export type { RegistrationResult } from "./bridge.js";
|
|
14
|
+
export { generateVapidKeys } from "./vapid.js";
|
|
15
|
+
export type { VapidKeys } from "./vapid.js";
|
|
16
|
+
export { PushManager } from "./push-manager.js";
|
|
17
|
+
export type { PushSubscription, PushPayload } from "./push-manager.js";
|
|
18
|
+
export { DiscoveryManager } from "./discovery.js";
|
|
19
|
+
export type { DiscoveredMesh, DiscoveryBackend, AdvertiseOptions, } from "./discovery.js";
|
|
20
|
+
export { MdnsDiscoveryBackend } from "./discovery-mdns.js";
|
|
21
|
+
export { TailscaleDiscoveryBackend } from "./discovery-tailscale.js";
|
|
14
22
|
export * from "./types.js";
|
|
23
|
+
export type { ListenerInfo, ListenerPolicy, ConnectionHandle, } from "./transport.js";
|
|
24
|
+
export { FederationManager } from "./federation.js";
|
|
25
|
+
export type { FedLink, FedCallbacks } from "./federation.js";
|
|
15
26
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/core/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EACd,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,cAAc,YAAY,CAAC;AAC3B,YAAY,EACV,YAAY,EACZ,cAAc,EACd,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/core/index.js
CHANGED
|
@@ -7,6 +7,12 @@
|
|
|
7
7
|
export { FileStore, CommsError } from "./store.js";
|
|
8
8
|
export { MeshStore } from "./mesh-store.js";
|
|
9
9
|
export { CommsTool } from "./tool.js";
|
|
10
|
-
export { buildAction, formatDeliveryEvent, ensureRegistered, drainAndFormat, MCP_TOOL_PARAMS, } from "./bridge.js";
|
|
10
|
+
export { buildAction, formatDeliveryEvent, isActionableEvent, ensureRegistered, ensureProjectRoom, drainAndFormat, MCP_TOOL_PARAMS, } from "./bridge.js";
|
|
11
|
+
export { generateVapidKeys } from "./vapid.js";
|
|
12
|
+
export { PushManager } from "./push-manager.js";
|
|
13
|
+
export { DiscoveryManager } from "./discovery.js";
|
|
14
|
+
export { MdnsDiscoveryBackend } from "./discovery-mdns.js";
|
|
15
|
+
export { TailscaleDiscoveryBackend } from "./discovery-tailscale.js";
|
|
11
16
|
export * from "./types.js";
|
|
17
|
+
export { FederationManager } from "./federation.js";
|
|
12
18
|
//# sourceMappingURL=index.js.map
|
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EACd,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAMlD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,cAAc,YAAY,CAAC;AAM3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -1,17 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* MeshStore —
|
|
2
|
+
* MeshStore — transport-agnostic peer mesh for agent communication.
|
|
3
3
|
*
|
|
4
4
|
* Each bridge instance is a peer in the mesh. Peers discover each other
|
|
5
5
|
* via a coordinator (the first instance to bind the well-known port).
|
|
6
6
|
* All state is held in memory and synchronised between peers.
|
|
7
|
-
* Delivery events are pushed directly over
|
|
7
|
+
* Delivery events are pushed directly over the transport — no polling,
|
|
8
|
+
* no filesystem.
|
|
8
9
|
*
|
|
9
|
-
*
|
|
10
|
+
* Transport is injected via the constructor. TcpTransport for localhost
|
|
11
|
+
* TCP, TlsTransport for encrypted connections, etc.
|
|
10
12
|
*/
|
|
13
|
+
import type { SerialisedState } from "./wire-protocol.js";
|
|
14
|
+
import { DiscoveryManager } from "./discovery.js";
|
|
15
|
+
import { FederationManager } from "./federation.js";
|
|
16
|
+
import type { FedLink } from "./federation.js";
|
|
17
|
+
import type { MeshStatePatch } from "./wire-protocol.js";
|
|
18
|
+
import type { MeshTransport, TransportEvents } from "./transport.js";
|
|
11
19
|
import type { CommsStore } from "./comms-store.js";
|
|
12
|
-
import type { AgentIdentity, DeliveryEvent, DmMessage, Room, RoomMessage, RoomType, Visibility } from "./types.js";
|
|
20
|
+
import type { AgentIdentity, DeliveryEvent, DmMessage, MeshVisibility, NetworkInterface, Room, RoomMessage, RoomType, Visibility } from "./types.js";
|
|
21
|
+
import type { ListenerInfo } from "./transport.js";
|
|
13
22
|
export declare class MeshStore implements CommsStore {
|
|
14
|
-
|
|
23
|
+
peerId: string;
|
|
15
24
|
readonly startedAt: string;
|
|
16
25
|
readonly coordinatorPort: number;
|
|
17
26
|
private agents;
|
|
@@ -20,38 +29,60 @@ export declare class MeshStore implements CommsStore {
|
|
|
20
29
|
private dms;
|
|
21
30
|
private deliveryQueues;
|
|
22
31
|
private identityCache;
|
|
23
|
-
private
|
|
24
|
-
private dataPort;
|
|
25
|
-
private coordinatorServer;
|
|
26
|
-
private isCoordinator;
|
|
27
|
-
private peerConnections;
|
|
28
|
-
/** All sockets accepted by the data server — destroyed on shutdown. */
|
|
29
|
-
private dataServerSockets;
|
|
30
|
-
/** All sockets accepted by the coordinator server — destroyed on shutdown. */
|
|
31
|
-
private coordinatorServerSockets;
|
|
32
|
-
/** Socket connected to the coordinator (client side) — destroyed on shutdown. */
|
|
33
|
-
private coordinatorSocket;
|
|
32
|
+
private transport;
|
|
34
33
|
private peerInfo;
|
|
35
34
|
private staleCheckTimer;
|
|
35
|
+
private isShutDown;
|
|
36
|
+
private pendingMarkReadTimers;
|
|
37
|
+
private pendingInboundConnections;
|
|
36
38
|
onDelivery: ((agentId: string, event: DeliveryEvent) => void | Promise<void>) | undefined;
|
|
39
|
+
/** Fires for every state patch — both locally generated and remote. */
|
|
40
|
+
onPatch: ((patch: MeshStatePatch) => void | Promise<void>) | undefined;
|
|
41
|
+
/** Serialise the full mesh state for state_sync messages. */
|
|
42
|
+
serialise(): SerialisedState;
|
|
43
|
+
private lastLocalDeliveryKey;
|
|
44
|
+
private localDeliveryKeys;
|
|
45
|
+
discovery: DiscoveryManager;
|
|
46
|
+
federation: FederationManager;
|
|
37
47
|
constructor(coordinatorPort?: number);
|
|
48
|
+
/** Replace the transport (e.g. with TlsTransport for encrypted connections). */
|
|
49
|
+
setTransport(transport: MeshTransport): void;
|
|
38
50
|
init(): Promise<void>;
|
|
39
|
-
private
|
|
40
|
-
private
|
|
41
|
-
private connectToCoordinator;
|
|
42
|
-
private handleCoordinatorResponse;
|
|
43
|
-
private becomeCoordinator;
|
|
44
|
-
private handleCoordinatorConnection;
|
|
51
|
+
private handlePeerList;
|
|
52
|
+
private handlePeerJoined;
|
|
45
53
|
private handleIntroduction;
|
|
46
|
-
private
|
|
54
|
+
private handlePeerConnected;
|
|
47
55
|
private handleDataMessage;
|
|
56
|
+
private handleBecomeCoordinator;
|
|
57
|
+
private handlePeerDisconnected;
|
|
58
|
+
private handleConnectionRequest;
|
|
59
|
+
/** Accept a pending inbound connection. */
|
|
60
|
+
acceptConnection(connectionId: string): Promise<void>;
|
|
61
|
+
/** Reject a pending inbound connection. */
|
|
62
|
+
rejectConnection(connectionId: string, reason: string): Promise<void>;
|
|
63
|
+
/** List all pending inbound connections awaiting approval. */
|
|
64
|
+
listPendingConnections(): {
|
|
65
|
+
connectionId: string;
|
|
66
|
+
peerId: string;
|
|
67
|
+
dataPort: number;
|
|
68
|
+
name: string;
|
|
69
|
+
fingerprint: string;
|
|
70
|
+
}[];
|
|
71
|
+
/** Initiate an outbound connection to a remote coordinator requiring approval.
|
|
72
|
+
* Fires the connect_request and returns immediately. The connection
|
|
73
|
+
* completes asynchronously when the coordinator accepts or rejects. */
|
|
74
|
+
connectToRemote(host: string, port: number): Promise<void>;
|
|
75
|
+
/** Start only the data server without connecting to a coordinator.
|
|
76
|
+
* Used for testing scenarios where the peer connects via connectToRemote. */
|
|
77
|
+
startDataServerOnly(): Promise<void>;
|
|
78
|
+
/** Returns the TransportEvents object that bridges should pass to the transport constructor. */
|
|
79
|
+
get events(): TransportEvents;
|
|
48
80
|
private applyPatch;
|
|
49
|
-
private connectToPeerData;
|
|
50
|
-
private broadcastToDataConnections;
|
|
51
81
|
private broadcastPatch;
|
|
52
82
|
private deliverLocallyAndBroadcast;
|
|
53
83
|
private deliverToRoom;
|
|
54
84
|
private notifyRoomsOfStatus;
|
|
85
|
+
private notifyRoomsOfNameChange;
|
|
55
86
|
private emitDeliveryStatus;
|
|
56
87
|
private findMessageSender;
|
|
57
88
|
private markRead;
|
|
@@ -77,6 +108,7 @@ export declare class MeshStore implements CommsStore {
|
|
|
77
108
|
type: RoomType;
|
|
78
109
|
owner: string;
|
|
79
110
|
description: string;
|
|
111
|
+
federated?: boolean;
|
|
80
112
|
}): Promise<Room>;
|
|
81
113
|
getRoom(id: string): Promise<Room | undefined>;
|
|
82
114
|
listRooms(requesterId: string): Promise<Room[]>;
|
|
@@ -95,7 +127,24 @@ export declare class MeshStore implements CommsStore {
|
|
|
95
127
|
private stopStaleCheck;
|
|
96
128
|
private probeStaleAgents;
|
|
97
129
|
private isProcessAlive;
|
|
98
|
-
|
|
130
|
+
/** Set mesh discovery visibility. Delegates to discovery manager. */
|
|
131
|
+
setVisibility(level: MeshVisibility, adapter?: string): Promise<void>;
|
|
132
|
+
/** Get current mesh discovery visibility. */
|
|
133
|
+
getVisibility(adapter?: string): MeshVisibility;
|
|
134
|
+
addListener(host: string, port: number, policy: string): Promise<string>;
|
|
135
|
+
removeListener(id: string): Promise<void>;
|
|
136
|
+
listListeners(): ListenerInfo[];
|
|
137
|
+
getNetworkInterfaces(): NetworkInterface[];
|
|
138
|
+
fedConnect(host: string, port: number, name?: string): Promise<string>;
|
|
139
|
+
fedDisconnect(linkId: string): Promise<void>;
|
|
140
|
+
fedLinks(): FedLink[];
|
|
141
|
+
private handleFedAgentVisible;
|
|
142
|
+
private handleFedAgentGone;
|
|
143
|
+
private handleFedRoomMessage;
|
|
144
|
+
private handleFedRoomJoin;
|
|
145
|
+
private handleFedRoomLeave;
|
|
146
|
+
private getVisibleAgentsForFed;
|
|
147
|
+
private getFederatedRoomMembershipsForFed;
|
|
99
148
|
shutdown(): Promise<void>;
|
|
100
149
|
}
|
|
101
150
|
//# sourceMappingURL=mesh-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mesh-store.d.ts","sourceRoot":"","sources":["../../src/core/mesh-store.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"mesh-store.d.ts","sourceRoot":"","sources":["../../src/core/mesh-store.ts"],"names":[],"mappings":"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"}
|