@resciencelab/declaw
Advanced tools
| /** | ||
| * UDP transport backend — zero-install fallback when Yggdrasil is unavailable. | ||
| * | ||
| * IMPORTANT: This is a plain UDP datagram transport, NOT a real QUIC | ||
| * implementation. It provides: | ||
| * - Unencrypted, unreliable UDP delivery (no retransmission, no ordering) | ||
| * - STUN-assisted NAT traversal for public endpoint discovery | ||
| * - Messages >MTU (~1400 bytes) may be silently dropped | ||
| * | ||
| * Security relies entirely on the application-layer Ed25519 signatures. | ||
| * When Node.js native QUIC (node:quic, Node 24+) becomes stable, this | ||
| * transport should be upgraded to use it for transport-layer encryption. | ||
| */ | ||
| import * as dgram from "node:dgram"; | ||
| import { Transport, TransportId, TransportEndpoint } from "./transport"; | ||
| import { Identity } from "./types"; | ||
| /** Check if Node.js native QUIC is available (node:quic, Node 24+). */ | ||
| declare function isNativeQuicAvailable(): boolean; | ||
| /** | ||
| * Perform a simple STUN binding request to discover our public IP:port. | ||
| * Returns null if STUN fails (e.g., no internet, firewall). | ||
| */ | ||
| declare function stunDiscover(socket: dgram.Socket, stunServer: string, timeoutMs?: number): Promise<{ | ||
| address: string; | ||
| port: number; | ||
| } | null>; | ||
| /** Parse a STUN Binding Response to extract the mapped address. */ | ||
| declare function parseStunResponse(data: Buffer): { | ||
| address: string; | ||
| port: number; | ||
| } | null; | ||
| export declare class UDPTransport implements Transport { | ||
| readonly id: TransportId; | ||
| private _address; | ||
| private _port; | ||
| private _active; | ||
| private _socket; | ||
| private _handlers; | ||
| private _publicEndpoint; | ||
| private _useNativeQuic; | ||
| get address(): string; | ||
| get publicEndpoint(): { | ||
| address: string; | ||
| port: number; | ||
| } | null; | ||
| start(identity: Identity, opts?: Record<string, unknown>): Promise<boolean>; | ||
| stop(): Promise<void>; | ||
| isActive(): boolean; | ||
| send(target: string, data: Buffer): Promise<void>; | ||
| onMessage(handler: (from: string, data: Buffer) => void): void; | ||
| getEndpoint(): TransportEndpoint; | ||
| } | ||
| /** Parse a host:port or [host]:port string. */ | ||
| declare function parseHostPort(addr: string): { | ||
| host: string; | ||
| port: number; | ||
| }; | ||
| export { parseHostPort, isNativeQuicAvailable, stunDiscover, parseStunResponse }; | ||
| //# sourceMappingURL=transport-quic.d.ts.map |
| {"version":3,"file":"transport-quic.d.ts","sourceRoot":"","sources":["../src/transport-quic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AAEnC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAUlC,uEAAuE;AACvE,iBAAS,qBAAqB,IAAI,OAAO,CAOxC;AAED;;;GAGG;AACH,iBAAe,YAAY,CACzB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,SAAS,GAAE,MAAa,GACvB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAwCnD;AAED,mEAAmE;AACnE,iBAAS,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA4CjF;AAED,qBAAa,YAAa,YAAW,SAAS;IAC5C,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,SAAS,CAAkD;IACnE,OAAO,CAAC,eAAe,CAAiD;IACxE,OAAO,CAAC,cAAc,CAAiB;IAEvC,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,cAAc;iBAPkB,MAAM;cAAQ,MAAM;aASvD;IAEK,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IA8F3E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,QAAQ,IAAI,OAAO;IAIb,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAevD,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAI9D,WAAW,IAAI,iBAAiB;CASjC;AAED,+CAA+C;AAC/C,iBAAS,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAenE;AAED,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,YAAY,EAAE,iBAAiB,EAAE,CAAA"} |
| "use strict"; | ||
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
| if (k2 === undefined) k2 = k; | ||
| var desc = Object.getOwnPropertyDescriptor(m, k); | ||
| if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { | ||
| desc = { enumerable: true, get: function() { return m[k]; } }; | ||
| } | ||
| Object.defineProperty(o, k2, desc); | ||
| }) : (function(o, m, k, k2) { | ||
| if (k2 === undefined) k2 = k; | ||
| o[k2] = m[k]; | ||
| })); | ||
| var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||
| Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||
| }) : function(o, v) { | ||
| o["default"] = v; | ||
| }); | ||
| var __importStar = (this && this.__importStar) || (function () { | ||
| var ownKeys = function(o) { | ||
| ownKeys = Object.getOwnPropertyNames || function (o) { | ||
| var ar = []; | ||
| for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; | ||
| return ar; | ||
| }; | ||
| return ownKeys(o); | ||
| }; | ||
| return function (mod) { | ||
| if (mod && mod.__esModule) return mod; | ||
| var result = {}; | ||
| if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); | ||
| __setModuleDefault(result, mod); | ||
| return result; | ||
| }; | ||
| })(); | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.UDPTransport = void 0; | ||
| exports.parseHostPort = parseHostPort; | ||
| exports.isNativeQuicAvailable = isNativeQuicAvailable; | ||
| exports.stunDiscover = stunDiscover; | ||
| exports.parseStunResponse = parseStunResponse; | ||
| /** | ||
| * UDP transport backend — zero-install fallback when Yggdrasil is unavailable. | ||
| * | ||
| * IMPORTANT: This is a plain UDP datagram transport, NOT a real QUIC | ||
| * implementation. It provides: | ||
| * - Unencrypted, unreliable UDP delivery (no retransmission, no ordering) | ||
| * - STUN-assisted NAT traversal for public endpoint discovery | ||
| * - Messages >MTU (~1400 bytes) may be silently dropped | ||
| * | ||
| * Security relies entirely on the application-layer Ed25519 signatures. | ||
| * When Node.js native QUIC (node:quic, Node 24+) becomes stable, this | ||
| * transport should be upgraded to use it for transport-layer encryption. | ||
| */ | ||
| const dgram = __importStar(require("node:dgram")); | ||
| const identity_1 = require("./identity"); | ||
| /** Well-known public STUN servers for NAT traversal. */ | ||
| const STUN_SERVERS = [ | ||
| "stun.l.google.com:19302", | ||
| "stun1.l.google.com:19302", | ||
| "stun.cloudflare.com:3478", | ||
| ]; | ||
| /** Check if Node.js native QUIC is available (node:quic, Node 24+). */ | ||
| function isNativeQuicAvailable() { | ||
| try { | ||
| require("node:quic"); | ||
| return true; | ||
| } | ||
| catch { | ||
| return false; | ||
| } | ||
| } | ||
| /** | ||
| * Perform a simple STUN binding request to discover our public IP:port. | ||
| * Returns null if STUN fails (e.g., no internet, firewall). | ||
| */ | ||
| async function stunDiscover(socket, stunServer, timeoutMs = 5000) { | ||
| const [host, portStr] = stunServer.split(":"); | ||
| const port = parseInt(portStr, 10); | ||
| return new Promise((resolve) => { | ||
| const timer = setTimeout(() => resolve(null), timeoutMs); | ||
| // STUN Binding Request (RFC 5389 minimal) | ||
| // Magic cookie: 0x2112A442 | ||
| const txId = Buffer.alloc(12); | ||
| for (let i = 0; i < 12; i++) | ||
| txId[i] = Math.floor(Math.random() * 256); | ||
| const msg = Buffer.alloc(20); | ||
| msg.writeUInt16BE(0x0001, 0); // Binding Request | ||
| msg.writeUInt16BE(0x0000, 2); // Message Length | ||
| msg.writeUInt32BE(0x2112a442, 4); // Magic Cookie | ||
| txId.copy(msg, 8); | ||
| const onMessage = (data) => { | ||
| clearTimeout(timer); | ||
| socket.removeListener("message", onMessage); | ||
| // Parse XOR-MAPPED-ADDRESS from STUN response | ||
| const parsed = parseStunResponse(data); | ||
| resolve(parsed); | ||
| }; | ||
| socket.on("message", onMessage); | ||
| // Resolve STUN server hostname before sending | ||
| require("node:dns").lookup(host, { family: 4 }, (err, address) => { | ||
| if (err) { | ||
| clearTimeout(timer); | ||
| socket.removeListener("message", onMessage); | ||
| resolve(null); | ||
| return; | ||
| } | ||
| socket.send(msg, 0, msg.length, port, address); | ||
| }); | ||
| }); | ||
| } | ||
| /** Parse a STUN Binding Response to extract the mapped address. */ | ||
| function parseStunResponse(data) { | ||
| if (data.length < 20) | ||
| return null; | ||
| const msgType = data.readUInt16BE(0); | ||
| if (msgType !== 0x0101) | ||
| return null; // Not a Binding Success Response | ||
| const msgLen = data.readUInt16BE(2); | ||
| let offset = 20; | ||
| while (offset < 20 + msgLen) { | ||
| const attrType = data.readUInt16BE(offset); | ||
| const attrLen = data.readUInt16BE(offset + 2); | ||
| offset += 4; | ||
| // XOR-MAPPED-ADDRESS (0x0020) or MAPPED-ADDRESS (0x0001) | ||
| if (attrType === 0x0020 && attrLen >= 8) { | ||
| const family = data[offset + 1]; | ||
| if (family === 0x01) { // IPv4 | ||
| const xPort = data.readUInt16BE(offset + 2) ^ 0x2112; | ||
| const xAddr = data.readUInt32BE(offset + 4) ^ 0x2112a442; | ||
| const a = (xAddr >>> 24) & 0xff; | ||
| const b = (xAddr >>> 16) & 0xff; | ||
| const c = (xAddr >>> 8) & 0xff; | ||
| const d = xAddr & 0xff; | ||
| return { address: `${a}.${b}.${c}.${d}`, port: xPort }; | ||
| } | ||
| } | ||
| else if (attrType === 0x0001 && attrLen >= 8) { | ||
| const family = data[offset + 1]; | ||
| if (family === 0x01) { // IPv4 | ||
| const port = data.readUInt16BE(offset + 2); | ||
| const a = data[offset + 4]; | ||
| const b = data[offset + 5]; | ||
| const c = data[offset + 6]; | ||
| const d = data[offset + 7]; | ||
| return { address: `${a}.${b}.${c}.${d}`, port }; | ||
| } | ||
| } | ||
| offset += attrLen; | ||
| // Pad to 4-byte boundary | ||
| if (attrLen % 4 !== 0) | ||
| offset += 4 - (attrLen % 4); | ||
| } | ||
| return null; | ||
| } | ||
| class UDPTransport { | ||
| id = "quic"; | ||
| _address = ""; | ||
| _port = 0; | ||
| _active = false; | ||
| _socket = null; | ||
| _handlers = []; | ||
| _publicEndpoint = null; | ||
| _useNativeQuic = false; | ||
| get address() { | ||
| return this._address; | ||
| } | ||
| get publicEndpoint() { | ||
| return this._publicEndpoint; | ||
| } | ||
| async start(identity, opts) { | ||
| const port = opts?.quicPort ?? 8098; | ||
| const testMode = opts?.testMode ?? false; | ||
| // Check for native QUIC support first | ||
| this._useNativeQuic = isNativeQuicAvailable(); | ||
| if (this._useNativeQuic) { | ||
| console.log("[transport:quic] Native QUIC available (node:quic)"); | ||
| } | ||
| try { | ||
| // Create UDP socket for QUIC transport | ||
| this._socket = dgram.createSocket("udp6"); | ||
| await new Promise((resolve, reject) => { | ||
| this._socket.on("error", reject); | ||
| this._socket.bind(port, "::", () => { | ||
| this._socket.removeListener("error", reject); | ||
| resolve(); | ||
| }); | ||
| }); | ||
| const actualPort = this._socket.address().port; | ||
| this._port = actualPort; | ||
| // Set up message handler | ||
| this._socket.on("message", (msg, rinfo) => { | ||
| const from = rinfo.address.includes(":") ? `[${rinfo.address}]:${rinfo.port}` : `${rinfo.address}:${rinfo.port}`; | ||
| for (const h of this._handlers) { | ||
| h(from, msg); | ||
| } | ||
| }); | ||
| // Try STUN discovery for public endpoint (skip in test mode). | ||
| // We also create a companion IPv4 UDP socket on the same port so the | ||
| // STUN-mapped port matches the port we are actually listening on. | ||
| if (!testMode) { | ||
| let stunSocket = null; | ||
| try { | ||
| stunSocket = dgram.createSocket("udp4"); | ||
| await new Promise((resolve, reject) => { | ||
| stunSocket.on("error", reject); | ||
| stunSocket.bind(actualPort, () => { | ||
| stunSocket.removeListener("error", reject); | ||
| resolve(); | ||
| }); | ||
| }); | ||
| } | ||
| catch { | ||
| // Port already taken on IPv4 — fall back to ephemeral port | ||
| try { | ||
| stunSocket?.close(); | ||
| } | ||
| catch { /* ignore */ } | ||
| stunSocket = dgram.createSocket("udp4"); | ||
| await new Promise((resolve, reject) => { | ||
| stunSocket.on("error", reject); | ||
| stunSocket.bind(0, () => { | ||
| stunSocket.removeListener("error", reject); | ||
| resolve(); | ||
| }); | ||
| }).catch(() => { stunSocket = null; }); | ||
| } | ||
| if (stunSocket) { | ||
| for (const server of STUN_SERVERS) { | ||
| try { | ||
| const result = await stunDiscover(stunSocket, server, 3000); | ||
| if (result) { | ||
| this._publicEndpoint = result; | ||
| // Use STUN-discovered public IP but always advertise the actual | ||
| // listening port (in case STUN socket was ephemeral). | ||
| this._address = `${result.address}:${actualPort}`; | ||
| console.log(`[transport:quic] Public endpoint: ${this._address} (via ${server})`); | ||
| break; | ||
| } | ||
| } | ||
| catch { /* try next */ } | ||
| } | ||
| try { | ||
| stunSocket.close(); | ||
| } | ||
| catch { /* ignore */ } | ||
| } | ||
| } | ||
| // Fallback to local address if STUN failed | ||
| if (!this._address) { | ||
| const localIp = (0, identity_1.getActualIpv6)() ?? "::1"; | ||
| this._address = `[${localIp}]:${actualPort}`; | ||
| console.log(`[transport:quic] Local endpoint: ${this._address} (STUN unavailable)`); | ||
| } | ||
| this._active = true; | ||
| console.log(`[transport:quic] Listening on UDP port ${actualPort}`); | ||
| return true; | ||
| } | ||
| catch (err) { | ||
| console.warn(`[transport:quic] Failed to start: ${err?.message}`); | ||
| return false; | ||
| } | ||
| } | ||
| async stop() { | ||
| this._active = false; | ||
| if (this._socket) { | ||
| this._socket.close(); | ||
| this._socket = null; | ||
| } | ||
| } | ||
| isActive() { | ||
| return this._active; | ||
| } | ||
| async send(target, data) { | ||
| if (!this._socket || !this._active) { | ||
| throw new Error("QUIC transport not active"); | ||
| } | ||
| const { host, port } = parseHostPort(target); | ||
| return new Promise((resolve, reject) => { | ||
| this._socket.send(data, 0, data.length, port, host, (err) => { | ||
| if (err) | ||
| reject(err); | ||
| else | ||
| resolve(); | ||
| }); | ||
| }); | ||
| } | ||
| onMessage(handler) { | ||
| this._handlers.push(handler); | ||
| } | ||
| getEndpoint() { | ||
| return { | ||
| transport: "quic", | ||
| address: this._address, | ||
| port: this._port, | ||
| priority: 10, | ||
| ttl: 3600, | ||
| }; | ||
| } | ||
| } | ||
| exports.UDPTransport = UDPTransport; | ||
| /** Parse a host:port or [host]:port string. */ | ||
| function parseHostPort(addr) { | ||
| // [ipv6]:port format | ||
| const bracketMatch = addr.match(/^\[([^\]]+)\]:(\d+)$/); | ||
| if (bracketMatch) { | ||
| return { host: bracketMatch[1], port: parseInt(bracketMatch[2], 10) }; | ||
| } | ||
| // host:port (IPv4 or hostname) | ||
| const lastColon = addr.lastIndexOf(":"); | ||
| if (lastColon > 0) { | ||
| return { | ||
| host: addr.slice(0, lastColon), | ||
| port: parseInt(addr.slice(lastColon + 1), 10), | ||
| }; | ||
| } | ||
| throw new Error(`Invalid address format: ${addr}`); | ||
| } | ||
| //# sourceMappingURL=transport-quic.js.map |
| {"version":3,"file":"transport-quic.js","sourceRoot":"","sources":["../src/transport-quic.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * Yggdrasil transport backend. | ||
| * | ||
| * Wraps existing Yggdrasil daemon management (detect external / spawn managed) | ||
| * behind the Transport interface. Uses HTTP over Yggdrasil IPv6 for messaging. | ||
| */ | ||
| import { Transport, TransportId, TransportEndpoint } from "./transport"; | ||
| import { Identity, YggdrasilInfo } from "./types"; | ||
| export declare class YggdrasilTransport implements Transport { | ||
| readonly id: TransportId; | ||
| private _address; | ||
| private _info; | ||
| private _active; | ||
| private _handlers; | ||
| private _dataDir; | ||
| get address(): string; | ||
| get info(): YggdrasilInfo | null; | ||
| get networkInfo(): { | ||
| peerCount: number; | ||
| publicPeers: number; | ||
| routeCount: number; | ||
| } | null; | ||
| start(identity: Identity, opts?: Record<string, unknown>): Promise<boolean>; | ||
| stop(): Promise<void>; | ||
| isActive(): boolean; | ||
| send(_target: string, _data: Buffer): Promise<void>; | ||
| onMessage(handler: (from: string, data: Buffer) => void): void; | ||
| getEndpoint(): TransportEndpoint; | ||
| /** | ||
| * Try to hot-connect to an external Yggdrasil daemon. | ||
| * Used when daemon becomes available after initial startup. | ||
| */ | ||
| tryHotConnect(identity: Identity): boolean; | ||
| } | ||
| //# sourceMappingURL=transport-yggdrasil.d.ts.map |
| {"version":3,"file":"transport-yggdrasil.d.ts","sourceRoot":"","sources":["../src/transport-yggdrasil.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACvE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AASjD,qBAAa,kBAAmB,YAAW,SAAS;IAClD,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,SAAS,CAAkD;IACnE,OAAO,CAAC,QAAQ,CAAa;IAE7B,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,IAAI,IAAI,aAAa,GAAG,IAAI,CAE/B;IAED,IAAI,WAAW;;;;aAEd;IAEK,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAoC3E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,QAAQ,IAAI,OAAO;IAIb,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzD,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAI9D,WAAW,IAAI,iBAAiB;IAUhC;;;OAGG;IACH,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO;CAW3C"} |
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.YggdrasilTransport = void 0; | ||
| const yggdrasil_1 = require("./yggdrasil"); | ||
| class YggdrasilTransport { | ||
| id = "yggdrasil"; | ||
| _address = ""; | ||
| _info = null; | ||
| _active = false; | ||
| _handlers = []; | ||
| _dataDir = ""; | ||
| get address() { | ||
| return this._address; | ||
| } | ||
| get info() { | ||
| return this._info; | ||
| } | ||
| get networkInfo() { | ||
| return (0, yggdrasil_1.getYggdrasilNetworkInfo)(); | ||
| } | ||
| async start(identity, opts) { | ||
| this._dataDir = opts?.dataDir ?? ""; | ||
| const extraPeers = opts?.extraPeers ?? []; | ||
| // Check if yggdrasil binary exists | ||
| if (!(0, yggdrasil_1.isYggdrasilAvailable)()) { | ||
| return false; | ||
| } | ||
| // Try to detect an existing daemon first | ||
| const external = (0, yggdrasil_1.detectExternalYggdrasil)(); | ||
| if (external) { | ||
| this._info = external; | ||
| this._address = external.address; | ||
| this._active = true; | ||
| identity.yggIpv6 = external.address; | ||
| console.log(`[transport:yggdrasil] Connected to external daemon: ${external.address}`); | ||
| return true; | ||
| } | ||
| // Try to spawn a managed daemon | ||
| if (this._dataDir) { | ||
| const info = await (0, yggdrasil_1.startYggdrasil)(this._dataDir, extraPeers); | ||
| if (info) { | ||
| this._info = info; | ||
| this._address = info.address; | ||
| this._active = true; | ||
| identity.yggIpv6 = info.address; | ||
| console.log(`[transport:yggdrasil] Started managed daemon: ${info.address}`); | ||
| return true; | ||
| } | ||
| } | ||
| return false; | ||
| } | ||
| async stop() { | ||
| this._active = false; | ||
| (0, yggdrasil_1.stopYggdrasil)(); | ||
| } | ||
| isActive() { | ||
| return this._active; | ||
| } | ||
| async send(_target, _data) { | ||
| // Yggdrasil messaging uses the HTTP peer-server/peer-client path, not raw | ||
| // transport-level sends. This is intentionally a no-op to satisfy the | ||
| // Transport interface contract without throwing. | ||
| } | ||
| onMessage(handler) { | ||
| this._handlers.push(handler); | ||
| } | ||
| getEndpoint() { | ||
| return { | ||
| transport: "yggdrasil", | ||
| address: this._address, | ||
| port: 8099, | ||
| priority: 1, | ||
| ttl: 86400, | ||
| }; | ||
| } | ||
| /** | ||
| * Try to hot-connect to an external Yggdrasil daemon. | ||
| * Used when daemon becomes available after initial startup. | ||
| */ | ||
| tryHotConnect(identity) { | ||
| if (this._active) | ||
| return true; | ||
| const ext = (0, yggdrasil_1.detectExternalYggdrasil)(); | ||
| if (!ext) | ||
| return false; | ||
| this._info = ext; | ||
| this._address = ext.address; | ||
| this._active = true; | ||
| identity.yggIpv6 = ext.address; | ||
| console.log(`[transport:yggdrasil] Hot-connected: ${ext.address}`); | ||
| return true; | ||
| } | ||
| } | ||
| exports.YggdrasilTransport = YggdrasilTransport; | ||
| //# sourceMappingURL=transport-yggdrasil.js.map |
| {"version":3,"file":"transport-yggdrasil.js","sourceRoot":"","sources":["../src/transport-yggdrasil.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * Transport abstraction layer for DeClaw P2P communication. | ||
| * | ||
| * Defines the interface that all transport backends (Yggdrasil, QUIC, native IPv6) | ||
| * must implement, plus the TransportManager that handles automatic selection. | ||
| */ | ||
| import { Identity, Endpoint } from "./types"; | ||
| export type TransportId = "yggdrasil" | "quic" | "native-ipv6"; | ||
| export interface TransportEndpoint { | ||
| transport: TransportId; | ||
| address: string; | ||
| port: number; | ||
| priority: number; | ||
| ttl: number; | ||
| } | ||
| export interface Transport { | ||
| readonly id: TransportId; | ||
| readonly address: string; | ||
| /** | ||
| * Initialize and start the transport. | ||
| * Returns true if the transport is available and started successfully. | ||
| */ | ||
| start(identity: Identity, opts?: Record<string, unknown>): Promise<boolean>; | ||
| /** Gracefully shut down the transport. */ | ||
| stop(): Promise<void>; | ||
| /** Whether this transport is currently active and can send/receive. */ | ||
| isActive(): boolean; | ||
| /** | ||
| * Send raw data to a target address on this transport. | ||
| * The address format depends on the transport (ygg IPv6, host:port, etc). | ||
| */ | ||
| send(target: string, data: Buffer): Promise<void>; | ||
| /** Register a handler for incoming data on this transport. */ | ||
| onMessage(handler: (from: string, data: Buffer) => void): void; | ||
| /** Get the endpoint descriptor for peer announcements. */ | ||
| getEndpoint(): TransportEndpoint; | ||
| } | ||
| /** | ||
| * TransportManager handles automatic transport selection and lifecycle. | ||
| * | ||
| * Selection order: | ||
| * 1. Detect Yggdrasil daemon → use YggdrasilTransport | ||
| * 2. Fallback → use UDPTransport (zero-install) | ||
| */ | ||
| export declare class TransportManager { | ||
| private _transports; | ||
| private _active; | ||
| private _all; | ||
| /** Register a transport backend. Order of registration = priority. */ | ||
| register(transport: Transport): void; | ||
| /** | ||
| * Try each registered transport in order. | ||
| * The first one that starts successfully becomes the active transport. | ||
| */ | ||
| start(identity: Identity, opts?: Record<string, unknown>): Promise<Transport | null>; | ||
| /** Stop all active transports. */ | ||
| stop(): Promise<void>; | ||
| /** Get the primary active transport. */ | ||
| get active(): Transport | null; | ||
| /** Get a specific transport by ID if active. */ | ||
| get(id: TransportId): Transport | undefined; | ||
| /** Get all active transports. */ | ||
| getAll(): Transport[]; | ||
| /** Get endpoints for all active transports (for peer announcements). */ | ||
| getEndpoints(): Endpoint[]; | ||
| /** Find a transport that can reach the given address. */ | ||
| resolveTransport(address: string): Transport | null; | ||
| } | ||
| //# sourceMappingURL=transport.d.ts.map |
| {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAE5C,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,MAAM,GAAG,aAAa,CAAA;AAE9D,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,WAAW,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IAExB;;;OAGG;IACH,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAE3E,0CAA0C;IAC1C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAErB,uEAAuE;IACvE,QAAQ,IAAI,OAAO,CAAA;IAEnB;;;OAGG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEjD,8DAA8D;IAC9D,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAA;IAE9D,0DAA0D;IAC1D,WAAW,IAAI,iBAAiB,CAAA;CACjC;AAED;;;;;;GAMG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAyC;IAC5D,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,IAAI,CAAkB;IAE9B,sEAAsE;IACtE,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAIpC;;;OAGG;IACG,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAmB1F,kCAAkC;IAC5B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,wCAAwC;IACxC,IAAI,MAAM,IAAI,SAAS,GAAG,IAAI,CAE7B;IAED,gDAAgD;IAChD,GAAG,CAAC,EAAE,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS;IAI3C,iCAAiC;IACjC,MAAM,IAAI,SAAS,EAAE;IAIrB,wEAAwE;IACxE,YAAY,IAAI,QAAQ,EAAE;IAa1B,yDAAyD;IACzD,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;CAWpD"} |
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.TransportManager = void 0; | ||
| /** | ||
| * TransportManager handles automatic transport selection and lifecycle. | ||
| * | ||
| * Selection order: | ||
| * 1. Detect Yggdrasil daemon → use YggdrasilTransport | ||
| * 2. Fallback → use UDPTransport (zero-install) | ||
| */ | ||
| class TransportManager { | ||
| _transports = new Map(); | ||
| _active = null; | ||
| _all = []; | ||
| /** Register a transport backend. Order of registration = priority. */ | ||
| register(transport) { | ||
| this._all.push(transport); | ||
| } | ||
| /** | ||
| * Try each registered transport in order. | ||
| * The first one that starts successfully becomes the active transport. | ||
| */ | ||
| async start(identity, opts) { | ||
| for (const t of this._all) { | ||
| console.log(`[transport] Trying ${t.id}...`); | ||
| const ok = await t.start(identity, opts); | ||
| if (ok) { | ||
| this._transports.set(t.id, t); | ||
| if (!this._active) { | ||
| this._active = t; | ||
| console.log(`[transport] Active transport: ${t.id} (${t.address})`); | ||
| } | ||
| else { | ||
| console.log(`[transport] Fallback available: ${t.id} (${t.address})`); | ||
| } | ||
| } | ||
| else { | ||
| console.log(`[transport] ${t.id} not available`); | ||
| } | ||
| } | ||
| return this._active; | ||
| } | ||
| /** Stop all active transports. */ | ||
| async stop() { | ||
| for (const t of this._transports.values()) { | ||
| await t.stop(); | ||
| } | ||
| this._transports.clear(); | ||
| this._active = null; | ||
| } | ||
| /** Get the primary active transport. */ | ||
| get active() { | ||
| return this._active; | ||
| } | ||
| /** Get a specific transport by ID if active. */ | ||
| get(id) { | ||
| return this._transports.get(id); | ||
| } | ||
| /** Get all active transports. */ | ||
| getAll() { | ||
| return Array.from(this._transports.values()); | ||
| } | ||
| /** Get endpoints for all active transports (for peer announcements). */ | ||
| getEndpoints() { | ||
| return Array.from(this._transports.values()).map((t) => { | ||
| const ep = t.getEndpoint(); | ||
| return { | ||
| transport: ep.transport, | ||
| address: ep.address, | ||
| port: ep.port, | ||
| priority: ep.priority, | ||
| ttl: ep.ttl, | ||
| }; | ||
| }); | ||
| } | ||
| /** Find a transport that can reach the given address. */ | ||
| resolveTransport(address) { | ||
| // Yggdrasil addresses start with 2xx: | ||
| if (/^2[0-9a-f]{2}:/i.test(address)) { | ||
| return this._transports.get("yggdrasil") ?? this._active; | ||
| } | ||
| // host:port format → QUIC | ||
| if (address.includes(":") && /\d+$/.test(address)) { | ||
| return this._transports.get("quic") ?? this._active; | ||
| } | ||
| return this._active; | ||
| } | ||
| } | ||
| exports.TransportManager = TransportManager; | ||
| //# sourceMappingURL=transport.js.map |
| {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":";;;AA+CA;;;;;;GAMG;AACH,MAAa,gBAAgB;IACnB,WAAW,GAAgC,IAAI,GAAG,EAAE,CAAA;IACpD,OAAO,GAAqB,IAAI,CAAA;IAChC,IAAI,GAAgB,EAAE,CAAA;IAE9B,sEAAsE;IACtE,QAAQ,CAAC,SAAoB;QAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC3B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK,CAAC,QAAkB,EAAE,IAA8B;QAC5D,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;YAC5C,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;YACxC,IAAI,EAAE,EAAE,CAAC;gBACP,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;gBAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;oBAClB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAA;oBAChB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAA;gBACrE,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAA;gBACvE,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAA;YAClD,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,kCAAkC;IAClC,KAAK,CAAC,IAAI;QACR,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,MAAM,CAAC,CAAC,IAAI,EAAE,CAAA;QAChB,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAA;QACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;IACrB,CAAC;IAED,wCAAwC;IACxC,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,gDAAgD;IAChD,GAAG,CAAC,EAAe;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACjC,CAAC;IAED,iCAAiC;IACjC,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAA;IAC9C,CAAC;IAED,wEAAwE;IACxE,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACrD,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;YAC1B,OAAO;gBACL,SAAS,EAAE,EAAE,CAAC,SAAkC;gBAChD,OAAO,EAAE,EAAE,CAAC,OAAO;gBACnB,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,QAAQ,EAAE,EAAE,CAAC,QAAQ;gBACrB,GAAG,EAAE,EAAE,CAAC,GAAG;aACZ,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,yDAAyD;IACzD,gBAAgB,CAAC,OAAe;QAC9B,sCAAsC;QACtC,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,OAAO,CAAA;QAC1D,CAAC;QACD,0BAA0B;QAC1B,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAClD,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAA;QACrD,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;CACF;AAnFD,4CAmFC"} |
Sorry, the diff of this file is not supported yet
| #!/usr/bin/env node | ||
| // Post-version hook: sync version from package.json → openclaw.plugin.json + SKILL.md | ||
| import { readFileSync, writeFileSync } from 'fs' | ||
| const { version } = JSON.parse(readFileSync('package.json', 'utf8')) | ||
| const plugin = JSON.parse(readFileSync('openclaw.plugin.json', 'utf8')) | ||
| plugin.version = version | ||
| writeFileSync('openclaw.plugin.json', JSON.stringify(plugin, null, 2) + '\n') | ||
| let skill = readFileSync('skills/declaw/SKILL.md', 'utf8') | ||
| skill = skill.replace(/^version: .*/m, `version: ${version}`) | ||
| writeFileSync('skills/declaw/SKILL.md', skill) | ||
| console.log(`Synced version ${version} → openclaw.plugin.json, skills/declaw/SKILL.md`) |
+5
-12
| /** | ||
| * OpenClaw channel registration for DeClaw P2P messaging. | ||
| * Registers "declaw" as a messaging channel so OpenClaw users can | ||
| * chat directly with peers via the standard OpenClaw UI. | ||
| * Account IDs are agentIds. | ||
| */ | ||
| import { Identity } from "./types"; | ||
| /** JSON Schema for channels.declaw — required for OpenClaw Control UI config form */ | ||
| import { SendOptions } from "./peer-client"; | ||
| export declare const CHANNEL_CONFIG_SCHEMA: { | ||
@@ -41,3 +40,3 @@ schema: { | ||
| }; | ||
| export declare function buildChannel(identity: Identity, port: number): { | ||
| export declare function buildChannel(identity: Identity, port: number, getSendOpts?: (id: string) => SendOptions): { | ||
| id: string; | ||
@@ -89,8 +88,6 @@ meta: { | ||
| config: { | ||
| /** List all known peer Yggdrasil addresses as "account IDs". */ | ||
| listAccountIds: (_cfg: unknown) => string[]; | ||
| /** Resolve an account ID (Ygg address) to an account config object. */ | ||
| resolveAccount: (_cfg: unknown, accountId: string | undefined) => { | ||
| accountId: string; | ||
| yggAddr: string; | ||
| agentId: string; | ||
| alias: string; | ||
@@ -104,3 +101,3 @@ }; | ||
| account: { | ||
| yggAddr: string; | ||
| agentId?: string; | ||
| }; | ||
@@ -112,7 +109,3 @@ }) => Promise<{ | ||
| }; | ||
| /** | ||
| * Wire incoming P2P messages to the OpenClaw gateway so they appear | ||
| * in the conversation UI as incoming channel messages. | ||
| */ | ||
| export declare function wireInboundToGateway(api: any): void; | ||
| //# sourceMappingURL=channel.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAKnC,qFAAqF;AACrF,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BjC,CAAA;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAcvD,gEAAgE;+BACzC,OAAO;QAC9B,uEAAuE;+BAChD,OAAO,aAAa,MAAM,GAAG,SAAS;;;;;;;;sCAQzB;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE;gBAAE,OAAO,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE;;;;EASvF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAcnD"} | ||
| {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,EAAkB,WAAW,EAAE,MAAM,eAAe,CAAA;AAK3D,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BjC,CAAA;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+BAc3E,OAAO;+BACP,OAAO,aAAa,MAAM,GAAG,SAAS;;;;;;;;sCAYzB;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE;gBAAE,OAAO,CAAC,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE;;;;EAaxF;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAcnD"} |
+24
-22
@@ -8,4 +8,4 @@ "use strict"; | ||
| const peer_db_1 = require("./peer-db"); | ||
| const peer_db_2 = require("./peer-db"); | ||
| const peer_server_1 = require("./peer-server"); | ||
| /** JSON Schema for channels.declaw — required for OpenClaw Control UI config form */ | ||
| exports.CHANNEL_CONFIG_SCHEMA = { | ||
@@ -25,3 +25,3 @@ schema: { | ||
| items: { type: "string" }, | ||
| description: "Yggdrasil IPv6 addresses allowed to DM (dmPolicy=allowlist)", | ||
| description: "Agent IDs allowed to DM (dmPolicy=allowlist)", | ||
| }, | ||
@@ -33,11 +33,11 @@ }, | ||
| label: "DM Policy", | ||
| help: "open: anyone, pairing: one-time code, allowlist: specific Yggdrasil addresses only", | ||
| help: "open: anyone, pairing: one-time code, allowlist: specific agent IDs only", | ||
| }, | ||
| allowFrom: { | ||
| label: "Allow From", | ||
| help: "Yggdrasil IPv6 addresses permitted to send DMs (used when dmPolicy is allowlist)", | ||
| help: "Agent IDs permitted to send DMs", | ||
| }, | ||
| }, | ||
| }; | ||
| function buildChannel(identity, port) { | ||
| function buildChannel(identity, port, getSendOpts) { | ||
| return { | ||
@@ -48,5 +48,5 @@ id: "declaw", | ||
| label: "DeClaw", | ||
| selectionLabel: "DeClaw (Yggdrasil P2P)", | ||
| selectionLabel: "DeClaw (P2P)", | ||
| docsPath: "/channels/declaw", | ||
| blurb: "Direct encrypted P2P messaging via Yggdrasil IPv6. No servers, no middlemen.", | ||
| blurb: "Direct encrypted P2P messaging. No servers, no middlemen.", | ||
| aliases: ["p2p", "ygg", "yggdrasil", "ipv6-p2p"], | ||
@@ -57,9 +57,11 @@ }, | ||
| config: { | ||
| /** List all known peer Yggdrasil addresses as "account IDs". */ | ||
| listAccountIds: (_cfg) => (0, peer_db_1.getPeerAddresses)(), | ||
| /** Resolve an account ID (Ygg address) to an account config object. */ | ||
| listAccountIds: (_cfg) => (0, peer_db_1.getPeerIds)(), | ||
| resolveAccount: (_cfg, accountId) => { | ||
| const addr = accountId ?? ""; | ||
| const peer = (0, peer_db_1.listPeers)().find((p) => p.yggAddr === addr); | ||
| return { accountId: addr, yggAddr: addr, alias: peer?.alias ?? addr }; | ||
| const id = accountId ?? ""; | ||
| const peer = (0, peer_db_1.getPeer)(id); | ||
| return { | ||
| accountId: id, | ||
| agentId: peer?.agentId ?? id, | ||
| alias: peer?.alias ?? id, | ||
| }; | ||
| }, | ||
@@ -70,5 +72,9 @@ }, | ||
| sendText: async ({ text, account }) => { | ||
| const result = await (0, peer_client_1.sendP2PMessage)(identity, account.yggAddr, "chat", text, port); | ||
| const agentId = account.agentId ?? ""; | ||
| const peer = (0, peer_db_1.getPeer)(agentId); | ||
| const targetAddr = (peer ? (0, peer_db_2.getEndpointAddress)(peer, "yggdrasil") : null) ?? agentId; | ||
| const opts = getSendOpts?.(agentId); | ||
| const result = await (0, peer_client_1.sendP2PMessage)(identity, targetAddr, "chat", text, port, 10_000, opts); | ||
| if (!result.ok) { | ||
| console.error(`[declaw] Failed to send to ${account.yggAddr}: ${result.error}`); | ||
| console.error(`[declaw] Failed to send to ${agentId}: ${result.error}`); | ||
| } | ||
@@ -80,6 +86,2 @@ return { ok: result.ok }; | ||
| } | ||
| /** | ||
| * Wire incoming P2P messages to the OpenClaw gateway so they appear | ||
| * in the conversation UI as incoming channel messages. | ||
| */ | ||
| function wireInboundToGateway(api) { | ||
@@ -92,9 +94,9 @@ (0, peer_server_1.onMessage)((msg) => { | ||
| channelId: "declaw", | ||
| accountId: msg.fromYgg, | ||
| accountId: msg.from, | ||
| text: msg.content, | ||
| senderId: msg.fromYgg, | ||
| senderId: msg.from, | ||
| }); | ||
| } | ||
| catch { | ||
| console.log(`[declaw] Message from ${msg.fromYgg.slice(0, 20)}...: ${msg.content}`); | ||
| console.log(`[declaw] Message from ${msg.from}: ${msg.content}`); | ||
| } | ||
@@ -101,0 +103,0 @@ }); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"channel.js","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"channel.js","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"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"} |
+2
-22
| import { Identity } from "./types"; | ||
| /** | ||
| * Derive a CGA-style ULA IPv6 address from Ed25519 public key bytes. | ||
| * Format: fd00:dead:beef:0000:<last 64 bits of sha256(pubkey)> | ||
| */ | ||
| export declare function deriveCgaIpv6(publicKeyBytes: Uint8Array): string; | ||
| /** | ||
| * Derive a Yggdrasil-compatible IPv6 address from Ed25519 public key bytes. | ||
| * Uses SHA-512, 200::/8 prefix. Matches yggdrasil-go's key-to-address logic. | ||
| * Note: actual routable address comes from the Yggdrasil daemon; this is the | ||
| * derived/expected address used for identity display before the daemon starts. | ||
| */ | ||
| export declare function deriveYggIpv6(publicKeyBytes: Uint8Array): string; | ||
| /** Generate a new Ed25519 keypair and derive all addresses. */ | ||
| export declare function deriveDidKey(publicKeyB64: string): string; | ||
| export declare function agentIdFromPublicKey(publicKeyB64: string): string; | ||
| export declare function generateIdentity(): Identity; | ||
| /** Load identity from file or generate and save a new one. */ | ||
| export declare function loadOrCreateIdentity(dataDir: string): Identity; | ||
| /** Recursively sort all object keys for deterministic JSON serialization. */ | ||
| export declare function canonicalize(value: unknown): unknown; | ||
| /** Sign a canonical message dict with the private key. Returns base64 signature. */ | ||
| export declare function signMessage(privateKeyB64: string, data: Record<string, unknown>): string; | ||
| /** Verify an Ed25519 signature. Returns true if valid. */ | ||
| export declare function verifySignature(publicKeyB64: string, data: Record<string, unknown>, signatureB64: string): boolean; | ||
| /** Compute agentId from a public key (sha256[:16]). */ | ||
| export declare function agentIdFromPublicKey(publicKeyB64: string): string; | ||
| /** | ||
| * Get the first non-loopback, non-link-local IPv6 address from network interfaces. | ||
| * Used in test/Docker mode where the actual container IPv6 is used instead of | ||
| * a derived Yggdrasil address. | ||
| */ | ||
| export declare function getActualIpv6(): string | null; | ||
| //# sourceMappingURL=identity.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAInC;;;GAGG;AACH,wBAAgB,aAAa,CAAC,cAAc,EAAE,UAAU,GAAG,MAAM,CAUhE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,cAAc,EAAE,UAAU,GAAG,MAAM,CAUhE;AAED,+DAA+D;AAC/D,wBAAgB,gBAAgB,IAAI,QAAQ,CAkB3C;AAED,8DAA8D;AAC9D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAS9D;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAUpD;AAED,oFAAoF;AACpF,wBAAgB,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAMxF;AAED,0DAA0D;AAC1D,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,YAAY,EAAE,MAAM,GACnB,OAAO,CAST;AAED,uDAAuD;AACvD,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAGjE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAe7C"} | ||
| {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAMlC,wBAAgB,aAAa,CAAC,cAAc,EAAE,UAAU,GAAG,MAAM,CAUhE;AAED,wBAAgB,aAAa,CAAC,cAAc,EAAE,UAAU,GAAG,MAAM,CAUhE;AA2BD,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAIzD;AAID,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAGjE;AAED,wBAAgB,gBAAgB,IAAI,QAAQ,CAgB3C;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAc9D;AAID,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAUpD;AAED,wBAAgB,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAMxF;AAED,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,YAAY,EAAE,MAAM,GACnB,OAAO,CAST;AAID,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAW7C"} |
+53
-37
@@ -38,2 +38,4 @@ "use strict"; | ||
| exports.deriveYggIpv6 = deriveYggIpv6; | ||
| exports.deriveDidKey = deriveDidKey; | ||
| exports.agentIdFromPublicKey = agentIdFromPublicKey; | ||
| exports.generateIdentity = generateIdentity; | ||
@@ -44,7 +46,8 @@ exports.loadOrCreateIdentity = loadOrCreateIdentity; | ||
| exports.verifySignature = verifySignature; | ||
| exports.agentIdFromPublicKey = agentIdFromPublicKey; | ||
| exports.getActualIpv6 = getActualIpv6; | ||
| /** | ||
| * Identity management: Ed25519 keypair generation, CGA and Yggdrasil address derivation. | ||
| * Ported from agents/identity.py in the agent-economy-ipv6-mvp project. | ||
| * Identity management: Ed25519 keypair generation and agent ID derivation. | ||
| * | ||
| * The Ed25519 keypair is the single source of truth for agent identity. | ||
| * Everything else — network addresses, transport protocols — is transient. | ||
| */ | ||
@@ -57,7 +60,4 @@ const nacl = __importStar(require("tweetnacl")); | ||
| const os = __importStar(require("os")); | ||
| // ── Address derivation (used by Yggdrasil transport) ──────────────────────── | ||
| const ULA_PREFIX = Buffer.from("fd00deadbeef0000", "hex"); | ||
| /** | ||
| * Derive a CGA-style ULA IPv6 address from Ed25519 public key bytes. | ||
| * Format: fd00:dead:beef:0000:<last 64 bits of sha256(pubkey)> | ||
| */ | ||
| function deriveCgaIpv6(publicKeyBytes) { | ||
@@ -67,3 +67,3 @@ const h = (0, sha256_1.sha256)(publicKeyBytes); | ||
| ULA_PREFIX.copy(ipv6Bytes, 0, 0, 8); | ||
| Buffer.from(h).copy(ipv6Bytes, 8, 24, 32); // last 8 bytes of hash | ||
| Buffer.from(h).copy(ipv6Bytes, 8, 24, 32); | ||
| const parts = []; | ||
@@ -75,8 +75,2 @@ for (let i = 0; i < 16; i += 2) { | ||
| } | ||
| /** | ||
| * Derive a Yggdrasil-compatible IPv6 address from Ed25519 public key bytes. | ||
| * Uses SHA-512, 200::/8 prefix. Matches yggdrasil-go's key-to-address logic. | ||
| * Note: actual routable address comes from the Yggdrasil daemon; this is the | ||
| * derived/expected address used for identity display before the daemon starts. | ||
| */ | ||
| function deriveYggIpv6(publicKeyBytes) { | ||
@@ -93,11 +87,44 @@ const h = (0, sha512_1.sha512)(publicKeyBytes); | ||
| } | ||
| /** Generate a new Ed25519 keypair and derive all addresses. */ | ||
| // ── did:key mapping ───────────────────────────────────────────────────────── | ||
| const MULTICODEC_ED25519_PREFIX = Buffer.from([0xed, 0x01]); | ||
| const BASE58_ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; | ||
| function base58Encode(buf) { | ||
| const digits = [0]; | ||
| for (const byte of buf) { | ||
| let carry = byte; | ||
| for (let j = 0; j < digits.length; j++) { | ||
| carry += digits[j] << 8; | ||
| digits[j] = carry % 58; | ||
| carry = (carry / 58) | 0; | ||
| } | ||
| while (carry > 0) { | ||
| digits.push(carry % 58); | ||
| carry = (carry / 58) | 0; | ||
| } | ||
| } | ||
| let str = ""; | ||
| for (let i = 0; i < buf.length && buf[i] === 0; i++) | ||
| str += "1"; | ||
| for (let i = digits.length - 1; i >= 0; i--) | ||
| str += BASE58_ALPHABET[digits[i]]; | ||
| return str; | ||
| } | ||
| function deriveDidKey(publicKeyB64) { | ||
| const pubBytes = Buffer.from(publicKeyB64, "base64"); | ||
| const prefixed = Buffer.concat([MULTICODEC_ED25519_PREFIX, pubBytes]); | ||
| return `did:key:z${base58Encode(prefixed)}`; | ||
| } | ||
| // ── Core identity ─────────────────────────────────────────────────────────── | ||
| function agentIdFromPublicKey(publicKeyB64) { | ||
| const pubBytes = Buffer.from(publicKeyB64, "base64"); | ||
| return Buffer.from((0, sha256_1.sha256)(pubBytes)).toString("hex").slice(0, 32); | ||
| } | ||
| function generateIdentity() { | ||
| const keypair = nacl.sign.keyPair(); | ||
| const pubBytes = keypair.publicKey; | ||
| const privBytes = keypair.secretKey.slice(0, 32); // nacl uses 64-byte secret (priv+pub) | ||
| const privBytes = keypair.secretKey.slice(0, 32); | ||
| const pubB64 = Buffer.from(pubBytes).toString("base64"); | ||
| const privB64 = Buffer.from(privBytes).toString("base64"); | ||
| const hashHex = Buffer.from((0, sha256_1.sha256)(pubBytes)).toString("hex"); | ||
| const agentId = hashHex.slice(0, 16); | ||
| const agentId = hashHex.slice(0, 32); | ||
| return { | ||
@@ -107,11 +134,13 @@ agentId, | ||
| privateKey: privB64, | ||
| cgaIpv6: deriveCgaIpv6(pubBytes), | ||
| yggIpv6: deriveYggIpv6(pubBytes), | ||
| }; | ||
| } | ||
| /** Load identity from file or generate and save a new one. */ | ||
| function loadOrCreateIdentity(dataDir) { | ||
| const idFile = path.join(dataDir, "identity.json"); | ||
| if (fs.existsSync(idFile)) { | ||
| return JSON.parse(fs.readFileSync(idFile, "utf-8")); | ||
| const raw = JSON.parse(fs.readFileSync(idFile, "utf-8")); | ||
| if (!raw.agentId && raw.publicKey) { | ||
| raw.agentId = agentIdFromPublicKey(raw.publicKey); | ||
| fs.writeFileSync(idFile, JSON.stringify(raw, null, 2)); | ||
| } | ||
| return raw; | ||
| } | ||
@@ -123,3 +152,3 @@ fs.mkdirSync(dataDir, { recursive: true }); | ||
| } | ||
| /** Recursively sort all object keys for deterministic JSON serialization. */ | ||
| // ── Canonical serialization + signing ─────────────────────────────────────── | ||
| function canonicalize(value) { | ||
@@ -137,3 +166,2 @@ if (Array.isArray(value)) | ||
| } | ||
| /** Sign a canonical message dict with the private key. Returns base64 signature. */ | ||
| function signMessage(privateKeyB64, data) { | ||
@@ -146,3 +174,2 @@ const privBytes = Buffer.from(privateKeyB64, "base64"); | ||
| } | ||
| /** Verify an Ed25519 signature. Returns true if valid. */ | ||
| function verifySignature(publicKeyB64, data, signatureB64) { | ||
@@ -159,12 +186,3 @@ try { | ||
| } | ||
| /** Compute agentId from a public key (sha256[:16]). */ | ||
| function agentIdFromPublicKey(publicKeyB64) { | ||
| const pubBytes = Buffer.from(publicKeyB64, "base64"); | ||
| return Buffer.from((0, sha256_1.sha256)(pubBytes)).toString("hex").slice(0, 16); | ||
| } | ||
| /** | ||
| * Get the first non-loopback, non-link-local IPv6 address from network interfaces. | ||
| * Used in test/Docker mode where the actual container IPv6 is used instead of | ||
| * a derived Yggdrasil address. | ||
| */ | ||
| // ── Utility ───────────────────────────────────────────────────────────────── | ||
| function getActualIpv6() { | ||
@@ -176,5 +194,3 @@ const ifaces = os.networkInterfaces(); | ||
| for (const info of iface) { | ||
| if (info.family === "IPv6" && | ||
| !info.internal && | ||
| !info.address.startsWith("fe80:")) { | ||
| if (info.family === "IPv6" && !info.internal && !info.address.startsWith("fe80:")) { | ||
| return info.address; | ||
@@ -181,0 +197,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"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"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA4GA,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAG,EAAE,GAAG,QA6hBxC"} | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAsGA,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAG,EAAE,GAAG,QA+hBxC"} |
+193
-199
@@ -40,14 +40,4 @@ "use strict"; | ||
| * | ||
| * Enables direct P2P communication between OpenClaw instances via Yggdrasil IPv6. | ||
| * Each node gets a globally-routable 200::/8 address derived from its Ed25519 keypair. | ||
| * Messages are signed and verified at the application layer (Ed25519). | ||
| * The Yggdrasil network layer provides additional cryptographic routing guarantees. | ||
| * | ||
| * Usage after install: | ||
| * openclaw p2p status — show your Yggdrasil address | ||
| * openclaw p2p add <ygg-addr> — add a peer | ||
| * openclaw p2p peers — list known peers | ||
| * openclaw p2p send <ygg-addr> <m> — send a direct message | ||
| * openclaw p2p ping <ygg-addr> — check reachability | ||
| * /p2p-status — show status in chat | ||
| * Agent ID (sha256(publicKey)[:16]) is the primary peer identifier. | ||
| * Network addresses (Yggdrasil IPv6, QUIC endpoint) are transport-layer concerns. | ||
| */ | ||
@@ -64,2 +54,5 @@ const os = __importStar(require("os")); | ||
| const channel_1 = require("./channel"); | ||
| const transport_1 = require("./transport"); | ||
| const transport_yggdrasil_1 = require("./transport-yggdrasil"); | ||
| const transport_quic_1 = require("./transport-quic"); | ||
| const DECLAW_TOOLS = [ | ||
@@ -77,6 +70,3 @@ "p2p_add_peer", "p2p_discover", "p2p_list_peers", | ||
| const jsonVal = JSON.stringify(merged); | ||
| (0, child_process_1.execSync)(`openclaw config set tools.alsoAllow '${jsonVal}'`, { | ||
| timeout: 5000, | ||
| stdio: "ignore", | ||
| }); | ||
| (0, child_process_1.execSync)(`openclaw config set tools.alsoAllow '${jsonVal}'`, { timeout: 5000, stdio: "ignore" }); | ||
| console.log(`[p2p] Auto-enabled ${missing.length} DeClaw tool(s) in tools.alsoAllow`); | ||
@@ -92,6 +82,3 @@ } | ||
| if (allow === undefined || allow === null) { | ||
| (0, child_process_1.execSync)(`openclaw config set plugins.allow '["declaw"]'`, { | ||
| timeout: 5000, | ||
| stdio: "ignore", | ||
| }); | ||
| (0, child_process_1.execSync)(`openclaw config set plugins.allow '["declaw"]'`, { timeout: 5000, stdio: "ignore" }); | ||
| console.log("[p2p] Set plugins.allow to [declaw]"); | ||
@@ -102,12 +89,7 @@ return; | ||
| const merged = [...allow, "declaw"]; | ||
| (0, child_process_1.execSync)(`openclaw config set plugins.allow '${JSON.stringify(merged)}'`, { | ||
| timeout: 5000, | ||
| stdio: "ignore", | ||
| }); | ||
| (0, child_process_1.execSync)(`openclaw config set plugins.allow '${JSON.stringify(merged)}'`, { timeout: 5000, stdio: "ignore" }); | ||
| console.log("[p2p] Added declaw to plugins.allow"); | ||
| } | ||
| } | ||
| catch { | ||
| // best effort | ||
| } | ||
| catch { /* best effort */ } | ||
| } | ||
@@ -119,11 +101,6 @@ function ensureChannelConfig(config) { | ||
| return; | ||
| (0, child_process_1.execSync)(`openclaw config set channels.declaw.dmPolicy '"pairing"'`, { | ||
| timeout: 5000, | ||
| stdio: "ignore", | ||
| }); | ||
| (0, child_process_1.execSync)(`openclaw config set channels.declaw.dmPolicy '"pairing"'`, { timeout: 5000, stdio: "ignore" }); | ||
| console.log("[p2p] Set channels.declaw.dmPolicy to pairing"); | ||
| } | ||
| catch { | ||
| // best effort | ||
| } | ||
| catch { /* best effort */ } | ||
| } | ||
@@ -138,3 +115,20 @@ let identity = null; | ||
| let _agentMeta = {}; | ||
| let _transportManager = null; | ||
| let _yggTransport = null; | ||
| let _quicTransport = null; | ||
| function buildSendOpts(peerIdOrAddr) { | ||
| const peer = peerIdOrAddr ? (0, peer_db_1.getPeer)(peerIdOrAddr) : null; | ||
| return { | ||
| endpoints: peer?.endpoints, | ||
| quicTransport: _quicTransport?.isActive() ? _quicTransport : undefined, | ||
| }; | ||
| } | ||
| function tryConnectExternalDaemon() { | ||
| if (_yggTransport && identity) { | ||
| const ok = _yggTransport.tryHotConnect(identity); | ||
| if (ok) { | ||
| yggInfo = _yggTransport.info; | ||
| return yggInfo; | ||
| } | ||
| } | ||
| const ext = (0, yggdrasil_1.detectExternalYggdrasil)(); | ||
@@ -149,7 +143,5 @@ if (!ext || !identity) | ||
| function register(api) { | ||
| // ── 1. Background service ────────────────────────────────────────────────── | ||
| api.registerService({ | ||
| id: "declaw-node", | ||
| start: async () => { | ||
| // Auto-enable DeClaw: plugin allowlist, tools, channel config | ||
| ensurePluginAllowed(api.config); | ||
@@ -163,7 +155,5 @@ ensureToolsAllowed(api.config); | ||
| _bootstrapPeers = cfg.bootstrap_peers ?? []; | ||
| const bootstrapPeers = _bootstrapPeers; | ||
| const discoveryIntervalMs = cfg.discovery_interval_ms ?? 10 * 60 * 1000; | ||
| const pluginVersion = require("../package.json").version; | ||
| _agentMeta = { name: cfg.agent_name ?? api.config?.identity?.name, version: pluginVersion }; | ||
| // Resolve test_mode: "auto" (default) detects Yggdrasil availability | ||
| const rawTestMode = cfg.test_mode ?? "auto"; | ||
@@ -173,3 +163,3 @@ const testMode = rawTestMode === "auto" ? !(0, yggdrasil_1.isYggdrasilAvailable)() : rawTestMode; | ||
| if (rawTestMode === "auto") { | ||
| console.log(`[p2p] test_mode=auto — resolved to ${testMode ? "true (yggdrasil not found)" : "false (yggdrasil available)"}`); | ||
| console.log(`[p2p] test_mode=auto -> resolved to ${testMode ? "true (yggdrasil not found)" : "false (yggdrasil available)"}`); | ||
| } | ||
@@ -179,3 +169,2 @@ else { | ||
| } | ||
| // Load or create Ed25519 identity | ||
| const isFirstRun = !require("fs").existsSync(path.join(dataDir, "identity.json")); | ||
@@ -188,21 +177,21 @@ identity = (0, identity_1.loadOrCreateIdentity)(dataDir); | ||
| } | ||
| else { | ||
| console.log(`[p2p] Name: (not set — openclaw config set plugins.entries.declaw.config.agent_name '"Your Name"')`); | ||
| _transportManager = new transport_1.TransportManager(); | ||
| _yggTransport = new transport_yggdrasil_1.YggdrasilTransport(); | ||
| _quicTransport = new transport_quic_1.UDPTransport(); | ||
| if (!testMode) { | ||
| _transportManager.register(_yggTransport); | ||
| } | ||
| console.log(`[p2p] CGA IPv6: ${identity.cgaIpv6}`); | ||
| if (testMode) { | ||
| const actualIpv6 = (0, identity_1.getActualIpv6)(); | ||
| if (actualIpv6) { | ||
| identity.yggIpv6 = actualIpv6; | ||
| console.log(`[p2p] Test mode: using actual IPv6 ${actualIpv6}`); | ||
| } | ||
| else { | ||
| console.log(`[p2p] Ygg (derived): ${identity.yggIpv6}`); | ||
| } | ||
| } | ||
| else { | ||
| console.log(`[p2p] Ygg (est): ${identity.yggIpv6} (derived, before daemon starts)`); | ||
| // Start Yggdrasil daemon (best-effort) | ||
| if ((0, yggdrasil_1.isYggdrasilAvailable)()) { | ||
| yggInfo = await (0, yggdrasil_1.startYggdrasil)(dataDir, extraPeers); | ||
| _transportManager.register(_quicTransport); | ||
| const quicPort = cfg.quic_port ?? 8098; | ||
| const activeTransport = await _transportManager.start(identity, { | ||
| dataDir, | ||
| extraPeers, | ||
| testMode, | ||
| quicPort, | ||
| }); | ||
| if (activeTransport) { | ||
| console.log(`[p2p] Active transport: ${activeTransport.id} -> ${activeTransport.address}`); | ||
| _agentMeta.endpoints = _transportManager.getEndpoints(); | ||
| if (_yggTransport.isActive()) { | ||
| yggInfo = _yggTransport.info; | ||
| if (yggInfo) { | ||
@@ -213,33 +202,48 @@ identity.yggIpv6 = yggInfo.address; | ||
| } | ||
| else { | ||
| console.warn("[p2p] yggdrasil not installed — run without Yggdrasil (local network only)"); | ||
| console.warn("[p2p] Install: https://yggdrasil-network.github.io/installation.html"); | ||
| else if (testMode) { | ||
| const actualIpv6 = (0, identity_1.getActualIpv6)(); | ||
| if (actualIpv6) { | ||
| identity.yggIpv6 = actualIpv6; | ||
| console.log(`[p2p] Test mode: using actual IPv6 ${actualIpv6}`); | ||
| } | ||
| } | ||
| if (_quicTransport.isActive()) { | ||
| console.log(`[p2p] QUIC endpoint: ${_quicTransport.address}`); | ||
| _quicTransport.onMessage((from, data) => { | ||
| (0, peer_server_1.handleUdpMessage)(data, from); | ||
| }); | ||
| } | ||
| } | ||
| // Start peer HTTP server | ||
| await (0, peer_server_1.startPeerServer)(peerPort, { testMode }); | ||
| // Register self metadata so /peer/announce responses include our name/version | ||
| (0, peer_server_1.setSelfMeta)({ yggAddr: identity.yggIpv6, publicKey: identity.publicKey, ..._agentMeta }); | ||
| // Wire incoming messages to OpenClaw gateway | ||
| else { | ||
| console.warn("[p2p] No transport available — falling back to local-only mode"); | ||
| if (testMode) { | ||
| const actualIpv6 = (0, identity_1.getActualIpv6)(); | ||
| if (actualIpv6) { | ||
| identity.yggIpv6 = actualIpv6; | ||
| } | ||
| } | ||
| } | ||
| await (0, peer_server_1.startPeerServer)(peerPort, { testMode, yggdrasilActive: _yggTransport?.isActive() ?? false }); | ||
| (0, peer_server_1.setSelfMeta)({ | ||
| agentId: identity.agentId, | ||
| publicKey: identity.publicKey, | ||
| ..._agentMeta, | ||
| }); | ||
| (0, channel_1.wireInboundToGateway)(api); | ||
| // First-run welcome message | ||
| if (isFirstRun) { | ||
| const addr = yggInfo?.address ?? identity.yggIpv6; | ||
| const ready = yggInfo !== null; | ||
| const quicActive = _quicTransport?.isActive(); | ||
| const welcomeLines = [ | ||
| "Welcome to DeClaw P2P!", | ||
| "", | ||
| ready | ||
| ? `Your P2P address: ${addr}` | ||
| : "Yggdrasil is not set up yet. Run: openclaw p2p setup", | ||
| `Your Agent ID: ${identity.agentId}`, | ||
| yggInfo | ||
| ? `Yggdrasil: ${yggInfo.address}` | ||
| : quicActive | ||
| ? `QUIC transport active: ${_quicTransport.address}\nFor full overlay networking, run: openclaw p2p setup` | ||
| : "Yggdrasil is not set up yet. Run: openclaw p2p setup", | ||
| "", | ||
| "Quick start:", | ||
| " openclaw p2p status — show your address", | ||
| " openclaw p2p status — show your agent ID", | ||
| " openclaw p2p discover — find peers on the network", | ||
| " openclaw p2p send <addr> <msg> — send a message", | ||
| "", | ||
| ...(!_agentMeta.name ? [ | ||
| "Tip: Give your agent a name so other peers know who you are:", | ||
| ' openclaw config set plugins.entries.declaw.config.agent_name \'"Your Name"\'', | ||
| ] : []), | ||
| " openclaw p2p send <id> <msg> — send a message", | ||
| ]; | ||
@@ -258,3 +262,2 @@ setTimeout(() => { | ||
| } | ||
| // DHT peer discovery — short delay if using external daemon, longer if just spawned | ||
| const defaultDelay = (yggInfo && yggInfo.pid > 0) ? 30_000 : 5_000; | ||
@@ -265,5 +268,5 @@ const startupDelayMs = cfg.startup_delay_ms ?? defaultDelay; | ||
| _startupTimer = null; | ||
| console.log(`[p2p:discovery] Starting bootstrap — identity.yggIpv6: ${identity?.yggIpv6}`); | ||
| await (0, peer_discovery_1.bootstrapDiscovery)(identity, peerPort, bootstrapPeers, _agentMeta); | ||
| (0, peer_discovery_1.startDiscoveryLoop)(identity, peerPort, discoveryIntervalMs, bootstrapPeers, _agentMeta); | ||
| console.log(`[p2p:discovery] Starting bootstrap — agentId: ${identity?.agentId}`); | ||
| await (0, peer_discovery_1.bootstrapDiscovery)(identity, peerPort, _bootstrapPeers, _agentMeta); | ||
| (0, peer_discovery_1.startDiscoveryLoop)(identity, peerPort, discoveryIntervalMs, _bootstrapPeers, _agentMeta); | ||
| }, startupDelayMs); | ||
@@ -277,18 +280,19 @@ }, | ||
| (0, peer_discovery_1.stopDiscoveryLoop)(); | ||
| // Broadcast signed leave tombstone to all known peers before shutting down | ||
| if (identity) { | ||
| await (0, peer_client_1.broadcastLeave)(identity, (0, peer_db_1.listPeers)(), peerPort); | ||
| await (0, peer_client_1.broadcastLeave)(identity, (0, peer_db_1.listPeers)(), peerPort, buildSendOpts()); | ||
| } | ||
| (0, peer_db_1.flushDb)(); | ||
| await (0, peer_server_1.stopPeerServer)(); | ||
| if (_transportManager) { | ||
| await _transportManager.stop(); | ||
| _transportManager = null; | ||
| } | ||
| (0, yggdrasil_1.stopYggdrasil)(); | ||
| }, | ||
| }); | ||
| // ── 2. OpenClaw Channel ──────────────────────────────────────────────────── | ||
| // ── Channel ──────────────────────────────────────────────────────────────── | ||
| if (identity) { | ||
| api.registerChannel({ plugin: (0, channel_1.buildChannel)(identity, peerPort) }); | ||
| api.registerChannel({ plugin: (0, channel_1.buildChannel)(identity, peerPort, buildSendOpts) }); | ||
| } | ||
| else { | ||
| // Register lazily after service starts — use a proxy channel | ||
| // that reads identity at send-time | ||
| api.registerChannel({ | ||
@@ -300,5 +304,5 @@ plugin: { | ||
| label: "DeClaw", | ||
| selectionLabel: "DeClaw (Yggdrasil P2P)", | ||
| selectionLabel: "DeClaw (P2P)", | ||
| docsPath: "/channels/declaw", | ||
| blurb: "Direct encrypted P2P messaging via Yggdrasil IPv6.", | ||
| blurb: "Direct encrypted P2P messaging.", | ||
| aliases: ["p2p", "ygg", "ipv6-p2p"], | ||
@@ -309,7 +313,10 @@ }, | ||
| config: { | ||
| listAccountIds: () => (identity ? (0, peer_db_1.listPeers)().map((p) => p.yggAddr) : []), | ||
| resolveAccount: (_, accountId) => ({ | ||
| accountId: accountId ?? "", | ||
| yggAddr: accountId ?? "", | ||
| }), | ||
| listAccountIds: () => (identity ? (0, peer_db_1.getPeerIds)() : []), | ||
| resolveAccount: (_, accountId) => { | ||
| const peer = accountId ? (0, peer_db_1.getPeer)(accountId) : null; | ||
| return { | ||
| accountId: accountId ?? "", | ||
| agentId: peer?.agentId ?? accountId ?? "", | ||
| }; | ||
| }, | ||
| }, | ||
@@ -321,3 +328,6 @@ outbound: { | ||
| return { ok: false }; | ||
| const r = await (0, peer_client_1.sendP2PMessage)(identity, account.yggAddr, "chat", text, peerPort); | ||
| const agentId = account.agentId ?? ""; | ||
| const peer = (0, peer_db_1.getPeer)(agentId); | ||
| const addr = (peer ? (0, peer_db_1.getEndpointAddress)(peer, "yggdrasil") : null) ?? agentId; | ||
| const r = await (0, peer_client_1.sendP2PMessage)(identity, addr, "chat", text, peerPort, 10_000, buildSendOpts(agentId)); | ||
| return { ok: r.ok }; | ||
@@ -329,8 +339,8 @@ }, | ||
| } | ||
| // ── 3. CLI commands ──────────────────────────────────────────────────────── | ||
| // ── CLI commands ─────────────────────────────────────────────────────────── | ||
| api.registerCli(({ program }) => { | ||
| const p2p = program.command("p2p").description("IPv6 P2P node management"); | ||
| const p2p = program.command("p2p").description("P2P node management"); | ||
| p2p | ||
| .command("status") | ||
| .description("Show this node's Yggdrasil address and status") | ||
| .description("Show this node's agent ID and status") | ||
| .action(() => { | ||
@@ -341,3 +351,3 @@ if (!identity) { | ||
| } | ||
| console.log("=== IPv6 P2P Node Status ==="); | ||
| console.log("=== P2P Node Status ==="); | ||
| if (_agentMeta.name) | ||
@@ -347,4 +357,9 @@ console.log(`Agent name: ${_agentMeta.name}`); | ||
| console.log(`Version: v${_agentMeta.version}`); | ||
| console.log(`CGA IPv6: ${identity.cgaIpv6}`); | ||
| console.log(`Yggdrasil: ${yggInfo?.address ?? identity.yggIpv6 + " (no daemon)"}`); | ||
| console.log(`Transport: ${_transportManager?.active?.id ?? "none"}`); | ||
| if (_yggTransport?.isActive()) { | ||
| console.log(`Yggdrasil: ${yggInfo?.address ?? identity.yggIpv6}`); | ||
| } | ||
| if (_quicTransport?.isActive()) { | ||
| console.log(`QUIC endpoint: ${_quicTransport.address}`); | ||
| } | ||
| console.log(`Peer port: ${peerPort}`); | ||
@@ -360,3 +375,3 @@ console.log(`Known peers: ${(0, peer_db_1.listPeers)().length}`); | ||
| if (peers.length === 0) { | ||
| console.log("No peers yet. Use 'openclaw p2p add <ygg-addr>' to add one."); | ||
| console.log("No peers yet. Use 'openclaw p2p add <agent-id>' to add one."); | ||
| return; | ||
@@ -369,32 +384,35 @@ } | ||
| const ver = peer.version ? ` [v${peer.version}]` : ""; | ||
| console.log(` ${peer.yggAddr}${label}${ver} last seen ${ago}s ago`); | ||
| const transports = peer.endpoints?.map((e) => e.transport).join(",") || "none"; | ||
| console.log(` ${peer.agentId}${label}${ver} [${transports}] last seen ${ago}s ago`); | ||
| } | ||
| }); | ||
| p2p | ||
| .command("add <yggAddr>") | ||
| .description("Add a peer by their Yggdrasil address") | ||
| .command("add <agentId>") | ||
| .description("Add a peer by agent ID") | ||
| .option("-a, --alias <alias>", "Human-readable alias for this peer") | ||
| .action((yggAddr, opts) => { | ||
| (0, peer_db_1.upsertPeer)(yggAddr, opts.alias ?? ""); | ||
| console.log(`Peer added: ${yggAddr}${opts.alias ? ` (${opts.alias})` : ""}`); | ||
| .action((agentId, opts) => { | ||
| (0, peer_db_1.upsertPeer)(agentId, opts.alias ?? ""); | ||
| console.log(`Peer added: ${agentId}${opts.alias ? ` (${opts.alias})` : ""}`); | ||
| }); | ||
| p2p | ||
| .command("remove <yggAddr>") | ||
| .command("remove <agentId>") | ||
| .description("Remove a peer") | ||
| .action((yggAddr) => { | ||
| (0, peer_db_1.removePeer)(yggAddr); | ||
| console.log(`Peer removed: ${yggAddr}`); | ||
| .action((agentId) => { | ||
| (0, peer_db_1.removePeer)(agentId); | ||
| console.log(`Peer removed: ${agentId}`); | ||
| }); | ||
| p2p | ||
| .command("ping <yggAddr>") | ||
| .command("ping <agentId>") | ||
| .description("Check if a peer is reachable") | ||
| .action(async (yggAddr) => { | ||
| console.log(`Pinging ${yggAddr}...`); | ||
| const ok = await (0, peer_client_1.pingPeer)(yggAddr, peerPort); | ||
| console.log(ok ? `✓ Reachable` : `✗ Unreachable`); | ||
| .action(async (agentId) => { | ||
| console.log(`Pinging ${agentId}...`); | ||
| const peer = (0, peer_db_1.getPeer)(agentId); | ||
| const addr = (peer ? (0, peer_db_1.getEndpointAddress)(peer, "yggdrasil") : null) ?? agentId; | ||
| const ok = await (0, peer_client_1.pingPeer)(addr, peerPort, 5_000, peer?.endpoints); | ||
| console.log(ok ? `Reachable` : `Unreachable`); | ||
| }); | ||
| p2p | ||
| .command("send <yggAddr> <message>") | ||
| .command("send <agentId> <message>") | ||
| .description("Send a direct message to a peer") | ||
| .action(async (yggAddr, message) => { | ||
| .action(async (agentId, message) => { | ||
| if (!identity) { | ||
@@ -404,8 +422,10 @@ console.error("Plugin not started. Restart the gateway first."); | ||
| } | ||
| const result = await (0, peer_client_1.sendP2PMessage)(identity, yggAddr, "chat", message, 8099); | ||
| const peer = (0, peer_db_1.getPeer)(agentId); | ||
| const addr = (peer ? (0, peer_db_1.getEndpointAddress)(peer, "yggdrasil") : null) ?? agentId; | ||
| const result = await (0, peer_client_1.sendP2PMessage)(identity, addr, "chat", message, 8099, 10_000, buildSendOpts(agentId)); | ||
| if (result.ok) { | ||
| console.log(`✓ Message sent to ${yggAddr}`); | ||
| console.log(`Message sent to ${agentId}`); | ||
| } | ||
| else { | ||
| console.error(`✗ Failed: ${result.error}`); | ||
| console.error(`Failed: ${result.error}`); | ||
| } | ||
@@ -440,3 +460,3 @@ }); | ||
| const time = new Date(m.receivedAt).toLocaleTimeString(); | ||
| console.log(` [${time}] from ${m.fromYgg.slice(0, 20)}...: ${m.content}`); | ||
| console.log(` [${time}] from ${m.from}: ${m.content}`); | ||
| } | ||
@@ -470,15 +490,18 @@ }); | ||
| }, { commands: ["p2p"] }); | ||
| // ── 4. Auto-reply slash commands ─────────────────────────────────────────── | ||
| // ── Slash commands ───────────────────────────────────────────────────────── | ||
| api.registerCommand({ | ||
| name: "p2p-status", | ||
| description: "Show IPv6 P2P node status", | ||
| description: "Show P2P node status", | ||
| handler: () => { | ||
| if (!identity) | ||
| return { text: "IPv6 P2P: not started yet." }; | ||
| return { text: "P2P: not started yet." }; | ||
| const peers = (0, peer_db_1.listPeers)(); | ||
| const addr = yggInfo?.address ?? identity.yggIpv6; | ||
| const activeTransport = _transportManager?.active; | ||
| return { | ||
| text: [ | ||
| `**IPv6 P2P Node**`, | ||
| `Address: \`${addr}\``, | ||
| `**P2P Node**`, | ||
| `Agent ID: \`${identity.agentId}\``, | ||
| `Transport: ${activeTransport?.id ?? "none"}`, | ||
| ...(_yggTransport?.isActive() ? [`Yggdrasil: \`${yggInfo?.address ?? identity.yggIpv6}\``] : []), | ||
| ...(_quicTransport?.isActive() ? [`QUIC: \`${_quicTransport.address}\``] : []), | ||
| `Peers: ${peers.length} known`, | ||
@@ -496,7 +519,7 @@ `Inbox: ${(0, peer_server_1.getInbox)().length} messages`, | ||
| if (peers.length === 0) | ||
| return { text: "No peers yet. Use `openclaw p2p add <addr>`." }; | ||
| return { text: "No peers yet. Use `openclaw p2p add <agent-id>`." }; | ||
| const lines = peers.map((p) => { | ||
| const label = p.alias ? ` — ${p.alias}` : ""; | ||
| const ver = p.version ? ` [v${p.version}]` : ""; | ||
| return `• \`${p.yggAddr}\`${label}${ver}`; | ||
| return `\`${p.agentId}\`${label}${ver}`; | ||
| }); | ||
@@ -506,27 +529,24 @@ return { text: `**Known Peers**\n${lines.join("\n")}` }; | ||
| }); | ||
| // ── 5. Agent tools (LLM-callable) ───────────────────────────────────────── | ||
| // ── Agent tools ──────────────────────────────────────────────────────────── | ||
| api.registerTool({ | ||
| name: "p2p_add_peer", | ||
| description: "Add a remote OpenClaw agent as a P2P peer using their Yggdrasil or ULA IPv6 address. " + | ||
| "Call this when the user provides another agent's IPv6 address and wants to communicate with them.", | ||
| description: "Add a remote OpenClaw agent as a P2P peer using their agent ID.", | ||
| parameters: { | ||
| type: "object", | ||
| properties: { | ||
| ygg_addr: { | ||
| agent_id: { | ||
| type: "string", | ||
| description: "The peer's Yggdrasil or ULA IPv6 address (e.g. fd77:1234::b or 200:1234::1)", | ||
| description: "The peer's agent ID (16-char hex string)", | ||
| }, | ||
| alias: { | ||
| type: "string", | ||
| description: "Optional human-readable name for this peer (e.g. 'Alice')", | ||
| description: "Optional human-readable name for this peer", | ||
| }, | ||
| }, | ||
| required: ["ygg_addr"], | ||
| required: ["agent_id"], | ||
| }, | ||
| async execute(_id, params) { | ||
| (0, peer_db_1.upsertPeer)(params.ygg_addr, params.alias ?? ""); | ||
| (0, peer_db_1.upsertPeer)(params.agent_id, params.alias ?? ""); | ||
| const label = params.alias ? ` (${params.alias})` : ""; | ||
| return { | ||
| content: [{ type: "text", text: `Peer added: ${params.ygg_addr}${label}` }], | ||
| }; | ||
| return { content: [{ type: "text", text: `Peer added: ${params.agent_id}${label}` }] }; | ||
| }, | ||
@@ -536,22 +556,11 @@ }); | ||
| name: "p2p_send_message", | ||
| description: "Send a direct encrypted P2P message to a known peer's agent. " + | ||
| "Use this when the user wants to send a message to another OpenClaw agent by their IPv6 address or alias. " + | ||
| "The message is signed with Ed25519 and delivered over IPv6 without any central server.", | ||
| description: "Send a direct encrypted P2P message to a peer by their agent ID.", | ||
| parameters: { | ||
| type: "object", | ||
| properties: { | ||
| ygg_addr: { | ||
| type: "string", | ||
| description: "The recipient peer's Yggdrasil or ULA IPv6 address", | ||
| }, | ||
| message: { | ||
| type: "string", | ||
| description: "The message content to send", | ||
| }, | ||
| port: { | ||
| type: "integer", | ||
| description: "The recipient peer's P2P server port (default 8099)", | ||
| }, | ||
| agent_id: { type: "string", description: "The recipient's agent ID" }, | ||
| message: { type: "string", description: "The message content to send" }, | ||
| port: { type: "integer", description: "Recipient's P2P server port (default 8099)" }, | ||
| }, | ||
| required: ["ygg_addr", "message"], | ||
| required: ["agent_id", "message"], | ||
| }, | ||
@@ -562,13 +571,9 @@ async execute(_id, params) { | ||
| } | ||
| // Use the peer's port (default 8099) — not peerPort which is the local listening port | ||
| const result = await (0, peer_client_1.sendP2PMessage)(identity, params.ygg_addr, "chat", params.message, params.port ?? 8099); | ||
| const peer = (0, peer_db_1.getPeer)(params.agent_id); | ||
| const addr = (peer ? (0, peer_db_1.getEndpointAddress)(peer, "yggdrasil") : null) ?? params.agent_id; | ||
| const result = await (0, peer_client_1.sendP2PMessage)(identity, addr, "chat", params.message, params.port ?? 8099, 10_000, buildSendOpts(params.agent_id)); | ||
| if (result.ok) { | ||
| return { | ||
| content: [{ type: "text", text: `Message delivered to ${params.ygg_addr}` }], | ||
| }; | ||
| return { content: [{ type: "text", text: `Message delivered to ${params.agent_id}` }] }; | ||
| } | ||
| return { | ||
| content: [{ type: "text", text: `Failed to deliver message: ${result.error}` }], | ||
| isError: true, | ||
| }; | ||
| return { content: [{ type: "text", text: `Failed to deliver: ${result.error}` }], isError: true }; | ||
| }, | ||
@@ -578,3 +583,3 @@ }); | ||
| name: "p2p_list_peers", | ||
| description: "List all known P2P peers this agent has communicated with or added manually.", | ||
| description: "List all known P2P peers.", | ||
| parameters: { type: "object", properties: {}, required: [] }, | ||
@@ -590,3 +595,3 @@ async execute(_id, _params) { | ||
| const ver = p.version ? ` [v${p.version}]` : ""; | ||
| return `• ${p.yggAddr}${label}${ver} — last seen ${ago}s ago`; | ||
| return `${p.agentId}${label}${ver} — last seen ${ago}s ago`; | ||
| }); | ||
@@ -598,4 +603,3 @@ return { content: [{ type: "text", text: lines.join("\n") }] }; | ||
| name: "p2p_status", | ||
| description: "Get this node's own Yggdrasil IPv6 address and P2P service status. " + | ||
| "Share this address with other users so they can reach this agent.", | ||
| description: "Get this node's agent ID and P2P service status.", | ||
| parameters: { type: "object", properties: {}, required: [] }, | ||
@@ -606,8 +610,11 @@ async execute(_id, _params) { | ||
| } | ||
| const addr = yggInfo?.address ?? identity.yggIpv6; | ||
| const peers = (0, peer_db_1.listPeers)(); | ||
| const inbox = (0, peer_server_1.getInbox)(); | ||
| const activeTransport = _transportManager?.active; | ||
| const lines = [ | ||
| ...((_agentMeta.name) ? [`Agent name: ${_agentMeta.name}`] : []), | ||
| `This agent's P2P address: ${addr}`, | ||
| `Agent ID: ${identity.agentId}`, | ||
| `Active transport: ${activeTransport?.id ?? "none"}`, | ||
| ...(_yggTransport?.isActive() ? [`Yggdrasil: ${yggInfo?.address ?? identity.yggIpv6}`] : []), | ||
| ...(_quicTransport?.isActive() ? [`QUIC endpoint: ${_quicTransport.address}`] : []), | ||
| `Plugin version: v${_agentMeta.version}`, | ||
@@ -622,4 +629,3 @@ `Known peers: ${peers.length}`, | ||
| name: "p2p_discover", | ||
| description: "Trigger an immediate DHT peer discovery round. Announces this node to bootstrap peers " + | ||
| "and absorbs their routing tables. Use when the user wants to find other agents on the network.", | ||
| description: "Trigger an immediate DHT peer discovery round.", | ||
| parameters: { type: "object", properties: {}, required: [] }, | ||
@@ -634,8 +640,3 @@ async execute(_id, _params) { | ||
| const total = (0, peer_db_1.listPeers)().length; | ||
| return { | ||
| content: [{ | ||
| type: "text", | ||
| text: `Discovery complete — ${found} new peer(s) found. Known peers: ${total}`, | ||
| }], | ||
| }; | ||
| return { content: [{ type: "text", text: `Discovery complete — ${found} new peer(s) found. Known peers: ${total}` }] }; | ||
| }, | ||
@@ -645,11 +646,6 @@ }); | ||
| name: "yggdrasil_check", | ||
| description: "Diagnose Yggdrasil installation and daemon status. " + | ||
| "Call this when: the user asks if P2P connectivity is working, asks how to get their address, " + | ||
| "p2p_send_message fails, or the user mentions they haven't installed Yggdrasil. " + | ||
| "Returns whether the binary is installed, whether the daemon is running, the current address " + | ||
| "and whether it is globally routable on the Yggdrasil network.", | ||
| description: "Diagnose Yggdrasil installation and daemon status.", | ||
| parameters: { type: "object", properties: {}, required: [] }, | ||
| async execute(_id, _params) { | ||
| const binaryAvailable = (0, yggdrasil_1.isYggdrasilAvailable)(); | ||
| // Already connected | ||
| if (yggInfo) { | ||
@@ -659,3 +655,4 @@ const netInfo = (0, yggdrasil_1.getYggdrasilNetworkInfo)(); | ||
| `Status: Ready`, | ||
| `Your P2P address: ${yggInfo.address}`, | ||
| `Agent ID: ${identity?.agentId}`, | ||
| `Yggdrasil: ${yggInfo.address}`, | ||
| `Known peers: ${(0, peer_db_1.listPeers)().length}`, | ||
@@ -668,22 +665,19 @@ ]; | ||
| } | ||
| // Not connected yet — try to hot-connect to external daemon | ||
| const connected = tryConnectExternalDaemon(); | ||
| if (connected) { | ||
| // Auto-trigger discovery in background | ||
| (0, peer_discovery_1.bootstrapDiscovery)(identity, peerPort, _bootstrapPeers, _agentMeta).catch(() => { }); | ||
| return { | ||
| content: [{ type: "text", text: `Status: Ready (just connected)\n` + | ||
| `Your P2P address: ${connected.address}\n` + | ||
| `Peer discovery started in background.` | ||
| content: [{ type: "text", text: `Status: Ready (just connected)\nAgent ID: ${identity?.agentId}\nYggdrasil: ${connected.address}\nPeer discovery started in background.` | ||
| }], | ||
| }; | ||
| } | ||
| // No daemon found — guide user | ||
| const action = binaryAvailable | ||
| ? "Yggdrasil is installed but no daemon is running." | ||
| : "Yggdrasil is not installed."; | ||
| const quicStatus = _quicTransport?.isActive() | ||
| ? `\nQUIC fallback: active (${_quicTransport.address})\nP2P messaging works without Yggdrasil via QUIC transport.` | ||
| : ""; | ||
| return { | ||
| content: [{ type: "text", text: `Status: Setup needed\n${action}\n\n` + | ||
| `Fix: Run the automated installer:\n openclaw p2p setup\n\n` + | ||
| `After setup, call yggdrasil_check again — it will connect automatically.` | ||
| content: [{ type: "text", text: `Status: ${_quicTransport?.isActive() ? "Degraded (QUIC only)" : "Setup needed"}\n${action}${quicStatus}\n\n` + | ||
| `For full Yggdrasil overlay, run:\n openclaw p2p setup\n\nAfter setup, call yggdrasil_check again — it will connect automatically.` | ||
| }], | ||
@@ -690,0 +684,0 @@ }; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} |
+19
-15
| /** | ||
| * P2P client — sends messages to other OpenClaw nodes via their Yggdrasil address. | ||
| * P2P client — sends signed messages to other OpenClaw nodes. | ||
| * | ||
| * Delivery strategy by endpoint priority: | ||
| * 1. QUIC/UDP transport | ||
| * 2. HTTP over Yggdrasil IPv6 | ||
| * 3. HTTP direct (any reachable address) | ||
| */ | ||
| import { Identity } from "./types"; | ||
| import { Identity, Endpoint } from "./types"; | ||
| import { Transport } from "./transport"; | ||
| export interface SendOptions { | ||
| endpoints?: Endpoint[]; | ||
| quicTransport?: Transport; | ||
| } | ||
| /** | ||
| * Build a signed P2PMessage and POST it to the target peer. | ||
| * Target URL: http://[<yggAddr>]:8099/peer/message | ||
| * Send a signed message to a peer. Tries endpoints by priority, | ||
| * falls back to direct HTTP at targetAddr. | ||
| */ | ||
| export declare function sendP2PMessage(identity: Identity, yggAddr: string, event: string, content: string, port?: number, timeoutMs?: number): Promise<{ | ||
| export declare function sendP2PMessage(identity: Identity, targetAddr: string, event: string, content: string, port?: number, timeoutMs?: number, opts?: SendOptions): Promise<{ | ||
| ok: boolean; | ||
| error?: string; | ||
| }>; | ||
| /** | ||
| * Broadcast a signed "leave" tombstone to all known peers on graceful shutdown. | ||
| * Fire-and-forget with a short timeout — best effort. | ||
| */ | ||
| export declare function broadcastLeave(identity: Identity, peers: Array<{ | ||
| yggAddr: string; | ||
| }>, port?: number): Promise<void>; | ||
| /** | ||
| * Ping a peer — returns true if reachable within timeout. | ||
| */ | ||
| export declare function pingPeer(yggAddr: string, port?: number, timeoutMs?: number): Promise<boolean>; | ||
| agentId: string; | ||
| endpoints?: Endpoint[]; | ||
| }>, port?: number, opts?: SendOptions): Promise<void>; | ||
| export declare function pingPeer(targetAddr: string, port?: number, timeoutMs?: number, endpoints?: Endpoint[]): Promise<boolean>; | ||
| //# sourceMappingURL=peer-client.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"peer-client.d.ts","sourceRoot":"","sources":["../src/peer-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAc,QAAQ,EAAE,MAAM,SAAS,CAAC;AAG/C;;;GAGG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAa,EACnB,SAAS,GAAE,MAAe,GACzB,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAqC1C;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EACjC,IAAI,GAAE,MAAa,GAClB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAa,EACnB,SAAS,GAAE,MAAc,GACxB,OAAO,CAAC,OAAO,CAAC,CAWlB"} | ||
| {"version":3,"file":"peer-client.d.ts","sourceRoot":"","sources":["../src/peer-client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAc,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAExD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AA2DvC,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAA;IACtB,aAAa,CAAC,EAAE,SAAS,CAAA;CAC1B;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAa,EACnB,SAAS,GAAE,MAAe,EAC1B,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyB1C;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAA;CAAE,CAAC,EACzD,IAAI,GAAE,MAAa,EACnB,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,wBAAsB,QAAQ,CAC5B,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,MAAa,EACnB,SAAS,GAAE,MAAc,EACzB,SAAS,CAAC,EAAE,QAAQ,EAAE,GACrB,OAAO,CAAC,OAAO,CAAC,CAqBlB"} |
+68
-18
@@ -7,10 +7,6 @@ "use strict"; | ||
| const identity_1 = require("./identity"); | ||
| /** | ||
| * Build a signed P2PMessage and POST it to the target peer. | ||
| * Target URL: http://[<yggAddr>]:8099/peer/message | ||
| */ | ||
| async function sendP2PMessage(identity, yggAddr, event, content, port = 8099, timeoutMs = 10_000) { | ||
| function buildSignedMessage(identity, event, content) { | ||
| const timestamp = Date.now(); | ||
| const payload = { | ||
| fromYgg: identity.yggIpv6, | ||
| from: identity.agentId, | ||
| publicKey: identity.publicKey, | ||
@@ -22,4 +18,9 @@ event, | ||
| const signature = (0, identity_1.signMessage)(identity.privateKey, payload); | ||
| const msg = { ...payload, signature }; | ||
| const url = `http://[${yggAddr}]:${port}/peer/message`; | ||
| return { ...payload, signature }; | ||
| } | ||
| async function sendViaHttp(msg, targetAddr, port, timeoutMs) { | ||
| const isIpv6 = targetAddr.includes(":"); | ||
| const url = isIpv6 | ||
| ? `http://[${targetAddr}]:${port}/peer/message` | ||
| : `http://${targetAddr}:${port}/peer/message`; | ||
| try { | ||
@@ -45,17 +46,66 @@ const ctrl = new AbortController(); | ||
| } | ||
| async function sendViaTransport(msg, target, transport) { | ||
| try { | ||
| const data = Buffer.from(JSON.stringify(msg)); | ||
| await transport.send(target, data); | ||
| return { ok: true }; | ||
| } | ||
| catch (err) { | ||
| return { ok: false, error: err.message ?? String(err) }; | ||
| } | ||
| } | ||
| /** | ||
| * Broadcast a signed "leave" tombstone to all known peers on graceful shutdown. | ||
| * Fire-and-forget with a short timeout — best effort. | ||
| * Send a signed message to a peer. Tries endpoints by priority, | ||
| * falls back to direct HTTP at targetAddr. | ||
| */ | ||
| async function broadcastLeave(identity, peers, port = 8099) { | ||
| async function sendP2PMessage(identity, targetAddr, event, content, port = 8099, timeoutMs = 10_000, opts) { | ||
| const msg = buildSignedMessage(identity, event, content); | ||
| if (opts?.quicTransport?.isActive() && opts?.endpoints?.length) { | ||
| const quicEp = opts.endpoints | ||
| .filter((e) => e.transport === "quic") | ||
| .sort((a, b) => a.priority - b.priority)[0]; | ||
| if (quicEp) { | ||
| const target = quicEp.port ? `${quicEp.address}:${quicEp.port}` : quicEp.address; | ||
| const result = await sendViaTransport(msg, target, opts.quicTransport); | ||
| if (result.ok) | ||
| return result; | ||
| console.warn(`[p2p:client] QUIC send to ${quicEp.address} failed, falling back to HTTP`); | ||
| } | ||
| } | ||
| if (opts?.endpoints?.length) { | ||
| const yggEp = opts.endpoints | ||
| .filter((e) => e.transport === "yggdrasil") | ||
| .sort((a, b) => a.priority - b.priority)[0]; | ||
| if (yggEp) { | ||
| return sendViaHttp(msg, yggEp.address, yggEp.port || port, timeoutMs); | ||
| } | ||
| } | ||
| return sendViaHttp(msg, targetAddr, port, timeoutMs); | ||
| } | ||
| async function broadcastLeave(identity, peers, port = 8099, opts) { | ||
| if (peers.length === 0) | ||
| return; | ||
| await Promise.allSettled(peers.map((p) => sendP2PMessage(identity, p.yggAddr, "leave", "", port, 3_000))); | ||
| console.log(`[p2p] Leave broadcast sent to ${peers.length} peer(s)`); | ||
| const reachable = peers.filter((p) => p.endpoints && p.endpoints.length > 0); | ||
| await Promise.allSettled(reachable.map((p) => { | ||
| const yggEp = p.endpoints.find((e) => e.transport === "yggdrasil"); | ||
| const addr = yggEp?.address ?? p.endpoints[0].address; | ||
| return sendP2PMessage(identity, addr, "leave", "", port, 3_000, { | ||
| ...opts, | ||
| endpoints: p.endpoints ?? opts?.endpoints, | ||
| }); | ||
| })); | ||
| console.log(`[p2p] Leave broadcast sent to ${reachable.length} peer(s)`); | ||
| } | ||
| /** | ||
| * Ping a peer — returns true if reachable within timeout. | ||
| */ | ||
| async function pingPeer(yggAddr, port = 8099, timeoutMs = 5_000) { | ||
| const url = `http://[${yggAddr}]:${port}/peer/ping`; | ||
| async function pingPeer(targetAddr, port = 8099, timeoutMs = 5_000, endpoints) { | ||
| if (endpoints?.length) { | ||
| const yggEp = endpoints.find((e) => e.transport === "yggdrasil"); | ||
| if (yggEp) { | ||
| targetAddr = yggEp.address; | ||
| port = yggEp.port || port; | ||
| } | ||
| } | ||
| const isIpv6 = targetAddr.includes(":"); | ||
| const url = isIpv6 | ||
| ? `http://[${targetAddr}]:${port}/peer/ping` | ||
| : `http://${targetAddr}:${port}/peer/ping`; | ||
| try { | ||
@@ -62,0 +112,0 @@ const ctrl = new AbortController(); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"peer-client.js","sourceRoot":"","sources":["../src/peer-client.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"peer-client.js","sourceRoot":"","sources":["../src/peer-client.ts"],"names":[],"mappings":"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"} |
+12
-26
@@ -1,15 +0,7 @@ | ||
| import { PeerRecord, DiscoveredPeerRecord } from "./types"; | ||
| import { DiscoveredPeerRecord, Endpoint } from "./types"; | ||
| export declare function flushDb(): void; | ||
| export declare function initDb(dataDir: string): void; | ||
| export declare function listPeers(): DiscoveredPeerRecord[]; | ||
| export declare function upsertPeer(yggAddr: string, alias?: string): void; | ||
| /** | ||
| * Upsert a peer discovered via bootstrap or gossip. | ||
| * Never overwrites a manually-added peer's alias or source. | ||
| * | ||
| * Provenance rule: if `lastSeen` is provided (gossip path), preserve the original | ||
| * timestamp — only advance if newer, never push to now based on indirect info. | ||
| * If `lastSeen` is omitted (direct contact path), update to now. | ||
| */ | ||
| export declare function upsertDiscoveredPeer(yggAddr: string, publicKey: string, opts?: { | ||
| export declare function upsertPeer(agentId: string, alias?: string): void; | ||
| export declare function upsertDiscoveredPeer(agentId: string, publicKey: string, opts?: { | ||
| alias?: string; | ||
@@ -20,19 +12,13 @@ version?: string; | ||
| lastSeen?: number; | ||
| endpoints?: Endpoint[]; | ||
| capabilities?: string[]; | ||
| }): void; | ||
| /** Return peers suitable for sharing during peer exchange (max N, most recently seen). */ | ||
| export declare function getPeersForExchange(max?: number): DiscoveredPeerRecord[]; | ||
| export declare function removePeer(yggAddr: string): void; | ||
| export declare function getPeer(yggAddr: string): PeerRecord | null; | ||
| export declare function getPeerAddresses(): string[]; | ||
| /** | ||
| * Remove peers whose lastSeen is older than maxAgeMs. | ||
| * Skips manually-added peers and any address in protectedAddrs (e.g. bootstrap nodes). | ||
| * Returns the count of pruned peers. | ||
| */ | ||
| export declare function pruneStale(maxAgeMs: number, protectedAddrs?: string[]): number; | ||
| /** | ||
| * TOFU: on first message from a peer, cache their public key. | ||
| * On subsequent messages the key must match. Returns false if mismatched. | ||
| */ | ||
| export declare function toufuVerifyAndCache(yggAddr: string, publicKey: string): boolean; | ||
| export declare function removePeer(agentId: string): void; | ||
| export declare function getPeer(agentId: string): DiscoveredPeerRecord | null; | ||
| export declare function getPeerIds(): string[]; | ||
| export declare function pruneStale(maxAgeMs: number, protectedIds?: string[]): number; | ||
| export declare function tofuVerifyAndCache(agentId: string, publicKey: string): boolean; | ||
| /** Extract a reachable address from a peer's endpoints for a given transport. */ | ||
| export declare function getEndpointAddress(peer: DiscoveredPeerRecord, transport: string): string | null; | ||
| //# sourceMappingURL=peer-db.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"peer-db.d.ts","sourceRoot":"","sources":["../src/peer-db.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAqC3D,wBAAgB,OAAO,IAAI,IAAI,CAE9B;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAG5C;AAED,wBAAgB,SAAS,IAAI,oBAAoB,EAAE,CAElD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,IAAI,CAUpE;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1H,IAAI,CA2BN;AAED,0FAA0F;AAC1F,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAW,GAAG,oBAAoB,EAAE,CAK5E;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGhD;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAE1D;AAED,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,GAAE,MAAM,EAAO,GAAG,MAAM,CAiBlF;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CA0B/E"} | ||
| {"version":3,"file":"peer-db.d.ts","sourceRoot":"","sources":["../src/peer-db.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AA0CxD,wBAAgB,OAAO,IAAI,IAAI,CAE9B;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAG5C;AAED,wBAAgB,SAAS,IAAI,oBAAoB,EAAE,CAElD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,IAAI,CAmBpE;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE;IACJ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAA;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB,GACL,IAAI,CA8BN;AAED,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAW,GAAG,oBAAoB,EAAE,CAK5E;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGhD;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAEpE;AAED,wBAAgB,UAAU,IAAI,MAAM,EAAE,CAErC;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,GAAE,MAAM,EAAO,GAAG,MAAM,CAgBhF;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAiC9E;AAED,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK/F"} |
+63
-49
@@ -44,8 +44,9 @@ "use strict"; | ||
| exports.getPeer = getPeer; | ||
| exports.getPeerAddresses = getPeerAddresses; | ||
| exports.getPeerIds = getPeerIds; | ||
| exports.pruneStale = pruneStale; | ||
| exports.toufuVerifyAndCache = toufuVerifyAndCache; | ||
| exports.tofuVerifyAndCache = tofuVerifyAndCache; | ||
| exports.getEndpointAddress = getEndpointAddress; | ||
| /** | ||
| * Local peer store with TOFU (Trust On First Use) logic. | ||
| * Persisted as a simple JSON file — no native dependencies required. | ||
| * Keyed by agentId. | ||
| */ | ||
@@ -55,3 +56,3 @@ const fs = __importStar(require("fs")); | ||
| let dbPath; | ||
| let store = { peers: {} }; | ||
| let store = { version: 2, peers: {} }; | ||
| let _saveTimer = null; | ||
@@ -62,8 +63,12 @@ const SAVE_DEBOUNCE_MS = 1000; | ||
| try { | ||
| store = JSON.parse(fs.readFileSync(dbPath, "utf-8")); | ||
| const raw = JSON.parse(fs.readFileSync(dbPath, "utf-8")); | ||
| store = { version: 2, peers: raw.peers ?? {} }; | ||
| } | ||
| catch { | ||
| store = { peers: {} }; | ||
| store = { version: 2, peers: {} }; | ||
| } | ||
| } | ||
| else { | ||
| store = { version: 2, peers: {} }; | ||
| } | ||
| } | ||
@@ -96,5 +101,5 @@ function saveImmediate() { | ||
| } | ||
| function upsertPeer(yggAddr, alias = "") { | ||
| function upsertPeer(agentId, alias = "") { | ||
| const now = Date.now(); | ||
| const existing = store.peers[yggAddr]; | ||
| const existing = store.peers[agentId]; | ||
| if (existing) { | ||
@@ -105,17 +110,18 @@ existing.alias = alias || existing.alias; | ||
| else { | ||
| store.peers[yggAddr] = { yggAddr, publicKey: "", alias, firstSeen: now, lastSeen: now, source: "manual" }; | ||
| store.peers[agentId] = { | ||
| agentId, | ||
| publicKey: "", | ||
| alias, | ||
| endpoints: [], | ||
| capabilities: [], | ||
| firstSeen: now, | ||
| lastSeen: now, | ||
| source: "manual", | ||
| }; | ||
| } | ||
| saveImmediate(); | ||
| } | ||
| /** | ||
| * Upsert a peer discovered via bootstrap or gossip. | ||
| * Never overwrites a manually-added peer's alias or source. | ||
| * | ||
| * Provenance rule: if `lastSeen` is provided (gossip path), preserve the original | ||
| * timestamp — only advance if newer, never push to now based on indirect info. | ||
| * If `lastSeen` is omitted (direct contact path), update to now. | ||
| */ | ||
| function upsertDiscoveredPeer(yggAddr, publicKey, opts = {}) { | ||
| function upsertDiscoveredPeer(agentId, publicKey, opts = {}) { | ||
| const now = Date.now(); | ||
| const existing = store.peers[yggAddr]; | ||
| const existing = store.peers[agentId]; | ||
| if (existing) { | ||
@@ -134,3 +140,6 @@ if (!existing.publicKey) | ||
| existing.version = opts.version; | ||
| // Refresh remote-declared name for non-manual peers | ||
| if (opts.endpoints?.length) | ||
| existing.endpoints = opts.endpoints; | ||
| if (opts.capabilities?.length) | ||
| existing.capabilities = opts.capabilities; | ||
| if (opts.alias && existing.source !== "manual") | ||
@@ -140,7 +149,9 @@ existing.alias = opts.alias; | ||
| else { | ||
| store.peers[yggAddr] = { | ||
| yggAddr, | ||
| store.peers[agentId] = { | ||
| agentId, | ||
| publicKey, | ||
| alias: opts.alias ?? "", | ||
| version: opts.version, | ||
| endpoints: opts.endpoints ?? [], | ||
| capabilities: opts.capabilities ?? [], | ||
| firstSeen: now, | ||
@@ -154,35 +165,28 @@ lastSeen: opts.lastSeen ?? now, | ||
| } | ||
| /** Return peers suitable for sharing during peer exchange (max N, most recently seen). */ | ||
| function getPeersForExchange(max = 20) { | ||
| return Object.values(store.peers) | ||
| .filter((p) => p.publicKey) // only share peers we have a public key for | ||
| .filter((p) => p.publicKey) | ||
| .sort((a, b) => b.lastSeen - a.lastSeen) | ||
| .slice(0, max); | ||
| } | ||
| function removePeer(yggAddr) { | ||
| delete store.peers[yggAddr]; | ||
| function removePeer(agentId) { | ||
| delete store.peers[agentId]; | ||
| saveImmediate(); | ||
| } | ||
| function getPeer(yggAddr) { | ||
| return store.peers[yggAddr] ?? null; | ||
| function getPeer(agentId) { | ||
| return store.peers[agentId] ?? null; | ||
| } | ||
| function getPeerAddresses() { | ||
| function getPeerIds() { | ||
| return Object.keys(store.peers); | ||
| } | ||
| /** | ||
| * Remove peers whose lastSeen is older than maxAgeMs. | ||
| * Skips manually-added peers and any address in protectedAddrs (e.g. bootstrap nodes). | ||
| * Returns the count of pruned peers. | ||
| */ | ||
| function pruneStale(maxAgeMs, protectedAddrs = []) { | ||
| function pruneStale(maxAgeMs, protectedIds = []) { | ||
| const cutoff = Date.now() - maxAgeMs; | ||
| let pruned = 0; | ||
| for (const addr of Object.keys(store.peers)) { | ||
| const record = store.peers[addr]; | ||
| for (const [id, record] of Object.entries(store.peers)) { | ||
| if (record.source === "manual") | ||
| continue; | ||
| if (protectedAddrs.includes(addr)) | ||
| if (protectedIds.includes(id)) | ||
| continue; | ||
| if (record.lastSeen < cutoff) { | ||
| delete store.peers[addr]; | ||
| delete store.peers[id]; | ||
| pruned++; | ||
@@ -197,12 +201,16 @@ } | ||
| } | ||
| /** | ||
| * TOFU: on first message from a peer, cache their public key. | ||
| * On subsequent messages the key must match. Returns false if mismatched. | ||
| */ | ||
| function toufuVerifyAndCache(yggAddr, publicKey) { | ||
| function tofuVerifyAndCache(agentId, publicKey) { | ||
| const now = Date.now(); | ||
| const existing = store.peers[yggAddr]; | ||
| const existing = store.peers[agentId]; | ||
| if (!existing) { | ||
| // Unknown peer — TOFU: accept and cache | ||
| store.peers[yggAddr] = { yggAddr, publicKey, alias: "", firstSeen: now, lastSeen: now, source: "gossip" }; | ||
| store.peers[agentId] = { | ||
| agentId, | ||
| publicKey, | ||
| alias: "", | ||
| endpoints: [], | ||
| capabilities: [], | ||
| firstSeen: now, | ||
| lastSeen: now, | ||
| source: "gossip", | ||
| }; | ||
| saveImmediate(); | ||
@@ -212,3 +220,2 @@ return true; | ||
| if (!existing.publicKey) { | ||
| // Known address (manually added) but no key yet — cache now | ||
| existing.publicKey = publicKey; | ||
@@ -220,3 +227,3 @@ existing.lastSeen = now; | ||
| if (existing.publicKey !== publicKey) { | ||
| return false; // Key mismatch — reject | ||
| return false; | ||
| } | ||
@@ -227,2 +234,9 @@ existing.lastSeen = now; | ||
| } | ||
| /** Extract a reachable address from a peer's endpoints for a given transport. */ | ||
| function getEndpointAddress(peer, transport) { | ||
| const ep = peer.endpoints | ||
| ?.filter((e) => e.transport === transport) | ||
| .sort((a, b) => a.priority - b.priority)[0]; | ||
| return ep?.address ?? null; | ||
| } | ||
| //# sourceMappingURL=peer-db.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"peer-db.js","sourceRoot":"","sources":["../src/peer-db.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"peer-db.js","sourceRoot":"","sources":["../src/peer-db.ts"],"names":[],"mappings":"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"} |
+12
-29
@@ -6,49 +6,32 @@ /** | ||
| * 1. On startup, connect to bootstrap nodes (hardcoded + config) | ||
| * 2. POST /peer/announce to each bootstrap → receive their peer list | ||
| * 3. Add discovered peers to local store | ||
| * 4. Fanout: also announce to the peers we just learned about (1 level deep) | ||
| * 5. Periodic loop: re-announce to a sample of known peers to keep the table fresh | ||
| * | ||
| * Any node that runs this plugin becomes a relay — it shares its peer table | ||
| * with anyone who announces to it, so the network self-heals over time. | ||
| * 2. POST /peer/announce to each bootstrap -> receive their peer list | ||
| * 3. Add discovered peers to local store (keyed by agentId) | ||
| * 4. Fanout: announce to a sample of newly-discovered peers (1 level deep) | ||
| * 5. Periodic loop: re-announce to a random sample to keep the table fresh | ||
| */ | ||
| import { Identity } from "./types"; | ||
| /** Fetch bootstrap node list from the published GitHub Pages JSON. */ | ||
| import { Identity, Endpoint } from "./types"; | ||
| export declare function fetchRemoteBootstrapPeers(): Promise<string[]>; | ||
| /** | ||
| * Hardcoded fallback used only when the remote list is unreachable. | ||
| * Update docs/bootstrap.json instead of editing this array. | ||
| */ | ||
| export declare const DEFAULT_BOOTSTRAP_PEERS: string[]; | ||
| /** | ||
| * POST /peer/announce to a single target node. | ||
| * Returns the list of peers they shared back, or null on failure. | ||
| */ | ||
| export declare function announceToNode(identity: Identity, targetYggAddr: string, port?: number, meta?: { | ||
| export declare function announceToNode(identity: Identity, targetAddr: string, port?: number, meta?: { | ||
| name?: string; | ||
| version?: string; | ||
| endpoints?: Endpoint[]; | ||
| }): Promise<Array<{ | ||
| yggAddr: string; | ||
| agentId: string; | ||
| publicKey: string; | ||
| alias?: string; | ||
| lastSeen: number; | ||
| endpoints?: Endpoint[]; | ||
| }> | null>; | ||
| /** | ||
| * Announce to all bootstrap nodes and absorb their peer tables. | ||
| * Then fanout to a sample of newly-discovered peers. | ||
| */ | ||
| export declare function bootstrapDiscovery(identity: Identity, port?: number, extraBootstrap?: string[], meta?: { | ||
| name?: string; | ||
| version?: string; | ||
| endpoints?: Endpoint[]; | ||
| }): Promise<number>; | ||
| /** | ||
| * Periodically re-announce to a random sample of known peers to keep the | ||
| * routing table fresh and propagate new nodes across the network. | ||
| */ | ||
| export declare function startDiscoveryLoop(identity: Identity, port?: number, intervalMs?: number, // default: every 10 minutes | ||
| extraBootstrap?: string[], meta?: { | ||
| export declare function startDiscoveryLoop(identity: Identity, port?: number, intervalMs?: number, extraBootstrap?: string[], meta?: { | ||
| name?: string; | ||
| version?: string; | ||
| endpoints?: Endpoint[]; | ||
| }): void; | ||
| export declare function stopDiscoveryLoop(): void; | ||
| //# sourceMappingURL=peer-discovery.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"peer-discovery.d.ts","sourceRoot":"","sources":["../src/peer-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,QAAQ,EAAoB,MAAM,SAAS,CAAC;AAOrD,sEAAsE;AACtE,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAenE;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,EAM3C,CAAC;AAqCF;;;GAGG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,MAAM,EACrB,IAAI,GAAE,MAAa,EACnB,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7C,OAAO,CAAC,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,CAAC,CAyCjG;AAID;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,QAAQ,EAClB,IAAI,GAAE,MAAa,EACnB,cAAc,GAAE,MAAM,EAAO,EAC7B,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7C,OAAO,CAAC,MAAM,CAAC,CAmEjB;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,QAAQ,EAClB,IAAI,GAAE,MAAa,EACnB,UAAU,GAAE,MAAuB,EAAG,4BAA4B;AAClE,cAAc,GAAE,MAAM,EAAO,EAC7B,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7C,IAAI,CAkDN;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAMxC"} | ||
| {"version":3,"file":"peer-discovery.d.ts","sourceRoot":"","sources":["../src/peer-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAO5C,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAenE;AAED,eAAO,MAAM,uBAAuB,EAAE,MAAM,EAM3C,CAAA;AAsDD,wBAAsB,cAAc,CAClC,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,MAAa,EACnB,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAA;CAAO,GACrE,OAAO,CAAC,KAAK,CAAC;IACf,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAA;CACvB,CAAC,GAAG,IAAI,CAAC,CAsDT;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,QAAQ,EAClB,IAAI,GAAE,MAAa,EACnB,cAAc,GAAE,MAAM,EAAO,EAC7B,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAA;CAAO,GACrE,OAAO,CAAC,MAAM,CAAC,CAqEjB;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,QAAQ,EAClB,IAAI,GAAE,MAAa,EACnB,UAAU,GAAE,MAAuB,EACnC,cAAc,GAAE,MAAM,EAAO,EAC7B,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAA;CAAO,GACrE,IAAI,CA+CN;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAMxC"} |
+88
-80
@@ -7,9 +7,6 @@ "use strict"; | ||
| * 1. On startup, connect to bootstrap nodes (hardcoded + config) | ||
| * 2. POST /peer/announce to each bootstrap → receive their peer list | ||
| * 3. Add discovered peers to local store | ||
| * 4. Fanout: also announce to the peers we just learned about (1 level deep) | ||
| * 5. Periodic loop: re-announce to a sample of known peers to keep the table fresh | ||
| * | ||
| * Any node that runs this plugin becomes a relay — it shares its peer table | ||
| * with anyone who announces to it, so the network self-heals over time. | ||
| * 2. POST /peer/announce to each bootstrap -> receive their peer list | ||
| * 3. Add discovered peers to local store (keyed by agentId) | ||
| * 4. Fanout: announce to a sample of newly-discovered peers (1 level deep) | ||
| * 5. Periodic loop: re-announce to a random sample to keep the table fresh | ||
| */ | ||
@@ -26,3 +23,2 @@ Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const BOOTSTRAP_JSON_URL = "https://resciencelab.github.io/DeClaw/bootstrap.json"; | ||
| /** Fetch bootstrap node list from the published GitHub Pages JSON. */ | ||
| async function fetchRemoteBootstrapPeers() { | ||
@@ -44,34 +40,27 @@ try { | ||
| } | ||
| /** | ||
| * Hardcoded fallback used only when the remote list is unreachable. | ||
| * Update docs/bootstrap.json instead of editing this array. | ||
| */ | ||
| exports.DEFAULT_BOOTSTRAP_PEERS = [ | ||
| "200:697f:bda:1e8e:706a:6c5e:630b:51d", // us-east-2 | ||
| "200:e1a5:b063:958:8f74:ec45:8eb0:e30e", // us-west-2 | ||
| "200:9cf6:eaf1:7d3e:14b0:5869:2140:b618", // eu-west-1 | ||
| "202:adbc:dde1:e272:1cdb:97d0:8756:4f77", // ap-northeast-1 | ||
| "200:5ec6:62dd:9e91:3752:820c:98f5:5863", // ap-southeast-1 | ||
| "200:697f:bda:1e8e:706a:6c5e:630b:51d", | ||
| "200:e1a5:b063:958:8f74:ec45:8eb0:e30e", | ||
| "200:9cf6:eaf1:7d3e:14b0:5869:2140:b618", | ||
| "202:adbc:dde1:e272:1cdb:97d0:8756:4f77", | ||
| "200:5ec6:62dd:9e91:3752:820c:98f5:5863", | ||
| ]; | ||
| const EXCHANGE_TIMEOUT_MS = 30_000; | ||
| const MAX_FANOUT_PEERS = 5; // how many newly-discovered peers to also announce to | ||
| const MAX_SHARED_PEERS = 20; // max peers we share in one exchange | ||
| const MAX_FANOUT_PEERS = 5; | ||
| const MAX_SHARED_PEERS = 20; | ||
| let _discoveryTimer = null; | ||
| // ── Signed announcement builder ─────────────────────────────────────────────── | ||
| function buildAnnouncement(identity, meta = {}) { | ||
| const myPeers = (0, peer_db_1.getPeersForExchange)(MAX_SHARED_PEERS).map((p) => { | ||
| const entry = { | ||
| yggAddr: p.yggAddr, | ||
| publicKey: p.publicKey, | ||
| lastSeen: p.lastSeen, | ||
| }; | ||
| if (p.alias) | ||
| entry.alias = p.alias; | ||
| return entry; | ||
| }); | ||
| const myPeers = (0, peer_db_1.getPeersForExchange)(MAX_SHARED_PEERS).map((p) => ({ | ||
| agentId: p.agentId, | ||
| publicKey: p.publicKey, | ||
| alias: p.alias || undefined, | ||
| lastSeen: p.lastSeen, | ||
| endpoints: p.endpoints ?? [], | ||
| })); | ||
| const ann = { | ||
| fromYgg: identity.yggIpv6, | ||
| from: identity.agentId, | ||
| publicKey: identity.publicKey, | ||
| timestamp: Date.now(), | ||
| peers: myPeers, | ||
| endpoints: meta.endpoints ?? [], | ||
| }; | ||
@@ -84,12 +73,35 @@ if (meta.name) | ||
| } | ||
| // ── Core exchange ───────────────────────────────────────────────────────────── | ||
| /** | ||
| * POST /peer/announce to a single target node. | ||
| * Returns the list of peers they shared back, or null on failure. | ||
| */ | ||
| async function announceToNode(identity, targetYggAddr, port = 8099, meta = {}) { | ||
| /** Extract the host portion from an endpoint address (strip port if present). */ | ||
| function hostFromAddress(addr) { | ||
| // [ipv6]:port → ipv6 | ||
| const bracketMatch = addr.match(/^\[([^\]]+)\]:(\d+)$/); | ||
| if (bracketMatch) | ||
| return bracketMatch[1]; | ||
| // ipv4:port → ipv4 (only if exactly one colon) | ||
| const parts = addr.split(":"); | ||
| if (parts.length === 2 && /^\d+$/.test(parts[1])) | ||
| return parts[0]; | ||
| return addr; | ||
| } | ||
| /** Get a reachable HTTP address (host only) from a peer's endpoints, preferring Yggdrasil. */ | ||
| function reachableAddr(peer) { | ||
| if (!peer.endpoints?.length) | ||
| return null; | ||
| const sorted = [...peer.endpoints].sort((a, b) => a.priority - b.priority); | ||
| const ygg = sorted.find((e) => e.transport === "yggdrasil"); | ||
| if (ygg) | ||
| return hostFromAddress(ygg.address); | ||
| const quic = sorted.find((e) => e.transport === "quic"); | ||
| if (quic) | ||
| return hostFromAddress(quic.address); | ||
| return sorted[0] ? hostFromAddress(sorted[0].address) : null; | ||
| } | ||
| async function announceToNode(identity, targetAddr, port = 8099, meta = {}) { | ||
| const payload = buildAnnouncement(identity, meta); | ||
| const signature = (0, identity_1.signMessage)(identity.privateKey, payload); | ||
| const announcement = { ...payload, signature }; | ||
| const url = `http://[${targetYggAddr}]:${port}/peer/announce`; | ||
| const isIpv6 = targetAddr.includes(":"); | ||
| const url = isIpv6 | ||
| ? `http://[${targetAddr}]:${port}/peer/announce` | ||
| : `http://${targetAddr}:${port}/peer/announce`; | ||
| try { | ||
@@ -107,27 +119,28 @@ const ctrl = new AbortController(); | ||
| const errText = await resp.text().catch(() => ""); | ||
| console.warn(`[p2p:discovery] Announce to ${targetYggAddr.slice(0, 20)}... rejected ${resp.status}: ${errText}`); | ||
| console.warn(`[p2p:discovery] Announce to ${targetAddr.slice(0, 20)}... rejected ${resp.status}: ${errText}`); | ||
| return null; | ||
| } | ||
| const body = await resp.json(); | ||
| // Store the responder's self-declared metadata if provided | ||
| if (body.self?.yggAddr && body.self?.publicKey) { | ||
| (0, peer_db_1.upsertDiscoveredPeer)(body.self.yggAddr, body.self.publicKey, { | ||
| if (body.self?.publicKey && body.self?.agentId) { | ||
| (0, peer_db_1.upsertDiscoveredPeer)(body.self.agentId, body.self.publicKey, { | ||
| alias: body.self.alias, | ||
| version: body.self.version, | ||
| discoveredVia: body.self.yggAddr, | ||
| discoveredVia: body.self.agentId, | ||
| source: "gossip", | ||
| endpoints: body.self.endpoints, | ||
| }); | ||
| } | ||
| return body.peers ?? null; | ||
| return (body.peers ?? []).map((p) => ({ | ||
| agentId: p.agentId ?? (p.publicKey ? (0, identity_1.agentIdFromPublicKey)(p.publicKey) : null), | ||
| publicKey: p.publicKey, | ||
| alias: p.alias, | ||
| lastSeen: p.lastSeen, | ||
| endpoints: p.endpoints ?? [], | ||
| })).filter((p) => p.agentId); | ||
| } | ||
| catch (err) { | ||
| console.warn(`[p2p:discovery] Announce to ${targetYggAddr.slice(0, 20)}... error: ${err?.message}`); | ||
| console.warn(`[p2p:discovery] Announce to ${targetAddr.slice(0, 20)}... error: ${err?.message}`); | ||
| return null; | ||
| } | ||
| } | ||
| // ── Bootstrap ───────────────────────────────────────────────────────────────── | ||
| /** | ||
| * Announce to all bootstrap nodes and absorb their peer tables. | ||
| * Then fanout to a sample of newly-discovered peers. | ||
| */ | ||
| async function bootstrapDiscovery(identity, port = 8099, extraBootstrap = [], meta = {}) { | ||
@@ -137,3 +150,3 @@ const remotePeers = await fetchRemoteBootstrapPeers(); | ||
| ...new Set([...remotePeers, ...exports.DEFAULT_BOOTSTRAP_PEERS, ...extraBootstrap]), | ||
| ].filter((a) => a && a !== identity.yggIpv6); | ||
| ].filter((a) => a && a !== identity.yggIpv6 && a !== identity.agentId); | ||
| if (bootstrapAddrs.length === 0) { | ||
@@ -159,5 +172,5 @@ console.log("[p2p:discovery] No bootstrap nodes configured — skipping initial discovery."); | ||
| for (const p of peers) { | ||
| if (p.yggAddr === identity.yggIpv6) | ||
| if (p.agentId === identity.agentId) | ||
| continue; | ||
| (0, peer_db_1.upsertDiscoveredPeer)(p.yggAddr, p.publicKey, { | ||
| (0, peer_db_1.upsertDiscoveredPeer)(p.agentId, p.publicKey, { | ||
| alias: p.alias, | ||
@@ -167,17 +180,19 @@ discoveredVia: addr, | ||
| lastSeen: p.lastSeen, | ||
| endpoints: p.endpoints, | ||
| }); | ||
| fanoutCandidates.push(p.yggAddr); | ||
| const peerAddr = reachableAddr(p); | ||
| if (peerAddr) | ||
| fanoutCandidates.push({ addr: peerAddr }); | ||
| totalDiscovered++; | ||
| } | ||
| console.log(`[p2p:discovery] Bootstrap ${addr.slice(0, 20)}... → +${peers.length} peers`); | ||
| console.log(`[p2p:discovery] Bootstrap ${addr.slice(0, 20)}... -> +${peers.length} peers`); | ||
| } | ||
| // Fanout: announce to a sample of newly-learned peers so they know about us too | ||
| const fanout = fanoutCandidates.slice(0, MAX_FANOUT_PEERS); | ||
| await Promise.allSettled(fanout.map((addr) => announceToNode(identity, addr, port, meta).then((peers) => { | ||
| await Promise.allSettled(fanout.map(({ addr }) => announceToNode(identity, addr, port, meta).then((peers) => { | ||
| if (!peers) | ||
| return; | ||
| for (const p of peers) { | ||
| if (p.yggAddr === identity.yggIpv6) | ||
| if (p.agentId === identity.agentId) | ||
| continue; | ||
| (0, peer_db_1.upsertDiscoveredPeer)(p.yggAddr, p.publicKey, { | ||
| (0, peer_db_1.upsertDiscoveredPeer)(p.agentId, p.publicKey, { | ||
| alias: p.alias, | ||
@@ -187,2 +202,3 @@ discoveredVia: addr, | ||
| lastSeen: p.lastSeen, | ||
| endpoints: p.endpoints, | ||
| }); | ||
@@ -194,15 +210,7 @@ } | ||
| } | ||
| // ── Periodic gossip loop ────────────────────────────────────────────────────── | ||
| /** | ||
| * Periodically re-announce to a random sample of known peers to keep the | ||
| * routing table fresh and propagate new nodes across the network. | ||
| */ | ||
| function startDiscoveryLoop(identity, port = 8099, intervalMs = 10 * 60 * 1000, // default: every 10 minutes | ||
| extraBootstrap = [], meta = {}) { | ||
| function startDiscoveryLoop(identity, port = 8099, intervalMs = 10 * 60 * 1000, extraBootstrap = [], meta = {}) { | ||
| if (_discoveryTimer) | ||
| return; | ||
| // Protect both hardcoded and dynamically-configured bootstrap addresses from pruning | ||
| const protectedAddrs = [...new Set([...exports.DEFAULT_BOOTSTRAP_PEERS, ...extraBootstrap])]; | ||
| const runGossip = async () => { | ||
| // Prune stale peers before gossiping (TTL = 3× interval) | ||
| (0, peer_db_1.pruneStale)(3 * intervalMs, protectedAddrs); | ||
@@ -212,26 +220,26 @@ const peers = (0, peer_db_1.listPeers)(); | ||
| return; | ||
| // Pick a random sample to exchange with | ||
| const sample = peers | ||
| .sort(() => Math.random() - 0.5) | ||
| .slice(0, MAX_FANOUT_PEERS); | ||
| const sample = peers.sort(() => Math.random() - 0.5).slice(0, MAX_FANOUT_PEERS); | ||
| let updated = 0; | ||
| await Promise.allSettled(sample.map(async (peer) => { | ||
| const received = await announceToNode(identity, peer.yggAddr, port, meta); | ||
| const addr = reachableAddr(peer); | ||
| if (!addr) | ||
| return; | ||
| const received = await announceToNode(identity, addr, port, meta); | ||
| if (!received) | ||
| return; | ||
| // Direct contact succeeded — update lastSeen to now (omit lastSeen in opts) | ||
| (0, peer_db_1.upsertDiscoveredPeer)(peer.yggAddr, peer.publicKey, { | ||
| (0, peer_db_1.upsertDiscoveredPeer)(peer.agentId, peer.publicKey, { | ||
| alias: peer.alias, | ||
| discoveredVia: peer.yggAddr, | ||
| discoveredVia: peer.agentId, | ||
| source: "gossip", | ||
| endpoints: peer.endpoints, | ||
| }); | ||
| for (const p of received) { | ||
| if (p.yggAddr === identity.yggIpv6) | ||
| if (p.agentId === identity.agentId) | ||
| continue; | ||
| // Indirect peers: preserve their original timestamp | ||
| (0, peer_db_1.upsertDiscoveredPeer)(p.yggAddr, p.publicKey, { | ||
| (0, peer_db_1.upsertDiscoveredPeer)(p.agentId, p.publicKey, { | ||
| alias: p.alias, | ||
| discoveredVia: peer.yggAddr, | ||
| discoveredVia: peer.agentId, | ||
| source: "gossip", | ||
| lastSeen: p.lastSeen, | ||
| endpoints: p.endpoints, | ||
| }); | ||
@@ -238,0 +246,0 @@ updated++; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"peer-discovery.js","sourceRoot":"","sources":["../src/peer-discovery.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;AAUH,8DAeC;AAqDD,wCA8CC;AAQD,gDAwEC;AAQD,gDAwDC;AAED,8CAMC;AAjRD,yCAAyC;AACzC,uCAA6F;AAE7F,MAAM,kBAAkB,GACtB,sDAAsD,CAAC;AAEzD,sEAAsE;AAC/D,KAAK,UAAU,yBAAyB;IAC7C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACtE,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAE9B,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;QACjG,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACU,QAAA,uBAAuB,GAAa;IAC/C,sCAAsC,EAAG,YAAY;IACrD,uCAAuC,EAAG,YAAY;IACtD,wCAAwC,EAAE,YAAY;IACtD,wCAAwC,EAAE,iBAAiB;IAC3D,wCAAwC,EAAE,iBAAiB;CAC5D,CAAC;AAEF,MAAM,mBAAmB,GAAG,MAAM,CAAC;AACnC,MAAM,gBAAgB,GAAG,CAAC,CAAC,CAAG,sDAAsD;AACpF,MAAM,gBAAgB,GAAG,EAAE,CAAC,CAAE,qCAAqC;AAEnE,IAAI,eAAe,GAA0B,IAAI,CAAC;AAElD,iFAAiF;AAEjF,SAAS,iBAAiB,CACxB,QAAkB,EAClB,OAA4C,EAAE;IAE9C,MAAM,OAAO,GAAG,IAAA,6BAAmB,EAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC9D,MAAM,KAAK,GAA6E;YACtF,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,QAAQ,EAAE,CAAC,CAAC,QAAQ;SACrB,CAAC;QACF,IAAI,CAAC,CAAC,KAAK;YAAE,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,GAAwC;QAC/C,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,KAAK,EAAE,OAAO;KACf,CAAC;IACF,IAAI,IAAI,CAAC,IAAI;QAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;IACrC,IAAI,IAAI,CAAC,OAAO;QAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iFAAiF;AAEjF;;;GAGG;AACI,KAAK,UAAU,cAAc,CAClC,QAAkB,EAClB,aAAqB,EACrB,OAAe,IAAI,EACnB,OAA4C,EAAE;IAE9C,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAA,sBAAW,EAAC,QAAQ,CAAC,UAAU,EAAE,OAAkC,CAAC,CAAC;IACvF,MAAM,YAAY,GAAqB,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,CAAC;IAEjE,MAAM,GAAG,GAAG,WAAW,aAAa,KAAK,IAAI,gBAAgB,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,mBAAmB,CAAC,CAAC;QAElE,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC5B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;YAClC,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;QAEH,YAAY,CAAC,KAAK,CAAC,CAAC;QAEpB,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,+BAA+B,aAAa,CAAC,KAAK,CAAC,CAAC,EAAC,EAAE,CAAC,gBAAgB,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC,CAAC;YAChH,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAuH,CAAC;QACpJ,2DAA2D;QAC3D,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;YAC/C,IAAA,8BAAoB,EAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;gBAC3D,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;gBACtB,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;gBAC1B,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;gBAChC,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,+BAA+B,aAAa,CAAC,KAAK,CAAC,CAAC,EAAC,EAAE,CAAC,cAAc,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QACnG,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF;;;GAGG;AACI,KAAK,UAAU,kBAAkB,CACtC,QAAkB,EAClB,OAAe,IAAI,EACnB,iBAA2B,EAAE,EAC7B,OAA4C,EAAE;IAE9C,MAAM,WAAW,GAAG,MAAM,yBAAyB,EAAE,CAAC;IACtD,MAAM,cAAc,GAAG;QACrB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,WAAW,EAAE,GAAG,+BAAuB,EAAE,GAAG,cAAc,CAAC,CAAC;KAC5E,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,OAAO,CAAC,CAAC;IAE7C,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC;QAC3F,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,qCAAqC,cAAc,CAAC,MAAM,wBAAwB,CAAC,CAAC;IAEhG,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,MAAM,gBAAgB,GAAa,EAAE,CAAC;IAEtC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QAChC,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC,CAAC,CACH,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW;YAAE,SAAS;QAC5C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;QACrC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,6BAA6B,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC;YAC9E,SAAS;QACX,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO;gBAAE,SAAS;YAC7C,IAAA,8BAAoB,EAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,EAAE;gBAC3C,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,aAAa,EAAE,IAAI;gBACnB,MAAM,EAAE,WAAW;gBACnB,QAAQ,EAAE,CAAC,CAAC,QAAQ;aACrB,CAAC,CAAC;YACH,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACjC,eAAe,EAAE,CAAC;QACpB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;IAC5F,CAAC;IAED,gFAAgF;IAChF,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAC3D,MAAM,OAAO,CAAC,UAAU,CACtB,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAClB,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QACxD,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO;gBAAE,SAAS;YAC7C,IAAA,8BAAoB,EAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,EAAE;gBAC3C,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,aAAa,EAAE,IAAI;gBACnB,MAAM,EAAE,QAAQ;gBAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CACH,CACF,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,wCAAwC,eAAe,mBAAmB,CAAC,CAAC;IACxF,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,iFAAiF;AAEjF;;;GAGG;AACH,SAAgB,kBAAkB,CAChC,QAAkB,EAClB,OAAe,IAAI,EACnB,aAAqB,EAAE,GAAG,EAAE,GAAG,IAAI,EAAG,4BAA4B;AAClE,iBAA2B,EAAE,EAC7B,OAA4C,EAAE;IAE9C,IAAI,eAAe;QAAE,OAAO;IAE5B,qFAAqF;IACrF,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,+BAAuB,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IAErF,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;QAC3B,yDAAyD;QACzD,IAAA,oBAAU,EAAC,CAAC,GAAG,UAAU,EAAE,cAAc,CAAC,CAAC;QAE3C,MAAM,KAAK,GAAG,IAAA,mBAAS,GAAE,CAAC;QAC1B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE/B,wCAAwC;QACxC,MAAM,MAAM,GAAG,KAAK;aACjB,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC;aAC/B,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAE9B,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,OAAO,CAAC,UAAU,CACtB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACxB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAC1E,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,4EAA4E;YAC5E,IAAA,8BAAoB,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE;gBACjD,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,aAAa,EAAE,IAAI,CAAC,OAAO;gBAC3B,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAC;YACH,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,IAAI,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO;oBAAE,SAAS;gBAC7C,oDAAoD;gBACpD,IAAA,8BAAoB,EAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,EAAE;oBAC3C,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,aAAa,EAAE,IAAI,CAAC,OAAO;oBAC3B,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;iBACrB,CAAC,CAAC;gBACH,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,kCAAkC,OAAO,eAAe,CAAC,CAAC;QACxE,CAAC;IACH,CAAC,CAAC;IAEF,eAAe,GAAG,WAAW,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,kDAAkD,UAAU,GAAG,IAAI,IAAI,CAAC,CAAC;AACvF,CAAC;AAED,SAAgB,iBAAiB;IAC/B,IAAI,eAAe,EAAE,CAAC;QACpB,aAAa,CAAC,eAAe,CAAC,CAAC;QAC/B,eAAe,GAAG,IAAI,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACrD,CAAC;AACH,CAAC"} | ||
| {"version":3,"file":"peer-discovery.js","sourceRoot":"","sources":["../src/peer-discovery.ts"],"names":[],"mappings":"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"} |
@@ -1,2 +0,2 @@ | ||
| import { P2PMessage } from "./types"; | ||
| import { P2PMessage, Endpoint } from "./types"; | ||
| export type MessageHandler = (msg: P2PMessage & { | ||
@@ -10,17 +10,23 @@ verified: boolean; | ||
| interface SelfMeta { | ||
| yggAddr?: string; | ||
| agentId?: string; | ||
| publicKey?: string; | ||
| alias?: string; | ||
| version?: string; | ||
| endpoints?: Endpoint[]; | ||
| } | ||
| export declare function setSelfMeta(meta: SelfMeta): void; | ||
| export declare function onMessage(handler: MessageHandler): void; | ||
| /** Check whether an IPv6 address is in the Yggdrasil 200::/7 range. */ | ||
| export declare function isYggdrasilAddr(addr: string): boolean; | ||
| export declare function startPeerServer(port?: number, opts?: { | ||
| testMode?: boolean; | ||
| yggdrasilActive?: boolean; | ||
| }): Promise<void>; | ||
| export declare function stopPeerServer(): Promise<void>; | ||
| export declare function getInbox(): typeof _inbox; | ||
| /** | ||
| * Process a raw UDP datagram as a P2PMessage. | ||
| * Returns true if the message was valid and handled, false otherwise. | ||
| */ | ||
| export declare function handleUdpMessage(data: Buffer, from: string): boolean; | ||
| export {}; | ||
| //# sourceMappingURL=peer-server.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"peer-server.d.ts","sourceRoot":"","sources":["../src/peer-server.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,UAAU,EAAoB,MAAM,SAAS,CAAC;AAIvD,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,KAAK,IAAI,CAAC;AAG/E,QAAA,MAAM,MAAM,EAAE,CAAC,UAAU,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,EAAO,CAAC;AAG9E,UAAU,QAAQ;IAAG,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE;AAG7F,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAEhD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAEvD;AAaD,uEAAuE;AACvE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED,wBAAsB,eAAe,CACnC,IAAI,GAAE,MAAa,EACnB,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GAChC,OAAO,CAAC,IAAI,CAAC,CAqHf;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAKpD;AAED,wBAAgB,QAAQ,IAAI,OAAO,MAAM,CAExC"} | ||
| {"version":3,"file":"peer-server.d.ts","sourceRoot":"","sources":["../src/peer-server.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAM9C,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,KAAK,IAAI,CAAA;AAG9E,QAAA,MAAM,MAAM,EAAE,CAAC,UAAU,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,EAAO,CAAA;AAG7E,UAAU,QAAQ;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAA;CACvB;AAGD,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAEhD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAEvD;AAYD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED,wBAAsB,eAAe,CACnC,IAAI,GAAE,MAAa,EACnB,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3D,OAAO,CAAC,IAAI,CAAC,CAwHf;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAKpD;AAED,wBAAgB,QAAQ,IAAI,OAAO,MAAM,CAExC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAmDpE"} |
+110
-60
@@ -12,11 +12,10 @@ "use strict"; | ||
| exports.getInbox = getInbox; | ||
| exports.handleUdpMessage = handleUdpMessage; | ||
| /** | ||
| * P2P peer HTTP server listening on [::]:8099. | ||
| * Handles incoming messages from other OpenClaw nodes via Yggdrasil. | ||
| * | ||
| * Trust model (ported from agents/peer.py, simplified — no central registry): | ||
| * 1. TCP source IP must be in 200::/8 (Yggdrasil) — network-layer auth | ||
| * 2. from_ygg in body must match TCP source IP — prevent body spoofing | ||
| * 3. Ed25519 signature must be valid — application-layer auth | ||
| * 4. TOFU: first message caches the public key; subsequent must match | ||
| * Trust model (transport-agnostic): | ||
| * Layer 1 — Transport security (TLS/Yggdrasil/WireGuard — handled by transport) | ||
| * Layer 2 — Ed25519 signature (universal trust anchor) | ||
| * Layer 3 — TOFU: agentId -> publicKey binding | ||
| */ | ||
@@ -26,2 +25,3 @@ const fastify_1 = __importDefault(require("fastify")); | ||
| const peer_db_1 = require("./peer-db"); | ||
| const MAX_MESSAGE_AGE_MS = 5 * 60 * 1000; // 5 minutes | ||
| let server = null; | ||
@@ -37,6 +37,5 @@ const _inbox = []; | ||
| } | ||
| /** Build the canonical object that the sender signed (all fields except signature). */ | ||
| function canonical(msg) { | ||
| return { | ||
| fromYgg: msg.fromYgg, | ||
| from: msg.from, | ||
| publicKey: msg.publicKey, | ||
@@ -48,3 +47,2 @@ event: msg.event, | ||
| } | ||
| /** Check whether an IPv6 address is in the Yggdrasil 200::/7 range. */ | ||
| function isYggdrasilAddr(addr) { | ||
@@ -56,23 +54,14 @@ const clean = addr.replace(/^::ffff:/, ""); | ||
| const testMode = opts.testMode ?? false; | ||
| const yggActive = opts.yggdrasilActive ?? false; | ||
| server = (0, fastify_1.default)({ logger: false }); | ||
| server.get("/peer/ping", async () => ({ ok: true, ts: Date.now() })); | ||
| server.get("/peer/inbox", async () => _inbox.slice(0, 100)); | ||
| // Return our known peer list (for passive discovery) | ||
| server.get("/peer/peers", async () => ({ | ||
| peers: (0, peer_db_1.getPeersForExchange)(20), | ||
| })); | ||
| // Peer exchange / announce endpoint | ||
| server.get("/peer/peers", async () => ({ peers: (0, peer_db_1.getPeersForExchange)(20) })); | ||
| server.post("/peer/announce", async (req, reply) => { | ||
| const ann = req.body; | ||
| const srcIp = req.socket.remoteAddress ?? ""; | ||
| if (!testMode) { | ||
| if (!isYggdrasilAddr(srcIp)) { | ||
| return reply.code(403).send({ error: "Source is not a Yggdrasil address" }); | ||
| } | ||
| const normalizedSrc = srcIp.replace(/^::ffff:/, ""); | ||
| if (ann.fromYgg !== normalizedSrc) { | ||
| return reply.code(403).send({ error: `fromYgg ${ann.fromYgg} does not match TCP source ${normalizedSrc}` }); | ||
| } | ||
| const srcIp = (req.socket.remoteAddress ?? "").replace(/^::ffff:/, ""); | ||
| // Network-layer gate: when Yggdrasil is active, only accept from 200::/7 | ||
| if (yggActive && !testMode && !isYggdrasilAddr(srcIp)) { | ||
| return reply.code(403).send({ error: `Non-Yggdrasil source ${srcIp} rejected` }); | ||
| } | ||
| // Verify signature over announcement fields (excluding signature itself) | ||
| const { signature, ...signable } = ann; | ||
@@ -82,25 +71,31 @@ if (!(0, identity_1.verifySignature)(ann.publicKey, signable, signature)) { | ||
| } | ||
| const _peers = ann.peers; | ||
| // TOFU: record the announcer | ||
| (0, peer_db_1.upsertDiscoveredPeer)(ann.fromYgg, ann.publicKey, { | ||
| const agentId = ann.from; | ||
| if (!agentId) { | ||
| return reply.code(400).send({ error: "Missing 'from' (agentId)" }); | ||
| } | ||
| if ((0, identity_1.agentIdFromPublicKey)(ann.publicKey) !== agentId) { | ||
| return reply.code(400).send({ error: "agentId does not match publicKey" }); | ||
| } | ||
| const endpoints = ann.endpoints ?? []; | ||
| (0, peer_db_1.upsertDiscoveredPeer)(agentId, ann.publicKey, { | ||
| alias: ann.alias, | ||
| version: ann.version, | ||
| discoveredVia: ann.fromYgg, | ||
| discoveredVia: agentId, | ||
| source: "gossip", | ||
| endpoints, | ||
| }); | ||
| // Absorb the peers they shared — preserve provenance timestamp | ||
| for (const p of ann.peers ?? []) { | ||
| if (p.yggAddr === ann.fromYgg) | ||
| continue; // skip self-referential entries | ||
| (0, peer_db_1.upsertDiscoveredPeer)(p.yggAddr, p.publicKey, { | ||
| if (!p.agentId || p.agentId === agentId) | ||
| continue; | ||
| (0, peer_db_1.upsertDiscoveredPeer)(p.agentId, p.publicKey, { | ||
| alias: p.alias, | ||
| discoveredVia: ann.fromYgg, | ||
| discoveredVia: agentId, | ||
| source: "gossip", | ||
| lastSeen: p.lastSeen, | ||
| endpoints: p.endpoints ?? [], | ||
| }); | ||
| } | ||
| console.log(`[p2p] ↔ peer-exchange from=${ann.fromYgg.slice(0, 20)}... shared=${ann.peers?.length ?? 0} peers`); | ||
| // Return our own peer list + self metadata so the caller learns our name/version | ||
| const self = _selfMeta.yggAddr | ||
| ? { yggAddr: _selfMeta.yggAddr, publicKey: _selfMeta.publicKey, alias: _selfMeta.alias, version: _selfMeta.version } | ||
| console.log(`[p2p] peer-exchange from=${agentId} shared=${ann.peers?.length ?? 0} peers`); | ||
| const self = _selfMeta.agentId | ||
| ? { agentId: _selfMeta.agentId, publicKey: _selfMeta.publicKey, alias: _selfMeta.alias, version: _selfMeta.version, endpoints: _selfMeta.endpoints } | ||
| : undefined; | ||
@@ -110,31 +105,37 @@ return { ok: true, ...(self ? { self } : {}), peers: (0, peer_db_1.getPeersForExchange)(20) }; | ||
| server.post("/peer/message", async (req, reply) => { | ||
| const msg = req.body; | ||
| const srcIp = req.socket.remoteAddress ?? ""; | ||
| if (!testMode) { | ||
| // Step 1: Verify source is Yggdrasil | ||
| if (!isYggdrasilAddr(srcIp)) { | ||
| return reply.code(403).send({ error: "Source is not a Yggdrasil address (200::/8 required)" }); | ||
| } | ||
| // Step 2: from_ygg must match TCP source IP | ||
| const normalizedSrc = srcIp.replace(/^::ffff:/, ""); | ||
| if (msg.fromYgg !== normalizedSrc) { | ||
| return reply.code(403).send({ | ||
| error: `from_ygg ${msg.fromYgg} does not match TCP source ${normalizedSrc}`, | ||
| }); | ||
| } | ||
| const raw = req.body; | ||
| const srcIp = (req.socket.remoteAddress ?? "").replace(/^::ffff:/, ""); | ||
| if (yggActive && !testMode && !isYggdrasilAddr(srcIp)) { | ||
| return reply.code(403).send({ error: `Non-Yggdrasil source ${srcIp} rejected` }); | ||
| } | ||
| // Step 3: Ed25519 signature | ||
| if (!(0, identity_1.verifySignature)(msg.publicKey, canonical(msg), msg.signature)) { | ||
| const sigData = canonical(raw); | ||
| if (!(0, identity_1.verifySignature)(raw.publicKey, sigData, raw.signature)) { | ||
| return reply.code(403).send({ error: "Invalid Ed25519 signature" }); | ||
| } | ||
| // Step 4: TOFU cache | ||
| if (!(0, peer_db_1.toufuVerifyAndCache)(msg.fromYgg, msg.publicKey)) { | ||
| const agentId = raw.from; | ||
| if (!agentId) { | ||
| return reply.code(400).send({ error: "Missing 'from' (agentId)" }); | ||
| } | ||
| if ((0, identity_1.agentIdFromPublicKey)(raw.publicKey) !== agentId) { | ||
| return reply.code(400).send({ error: "agentId does not match publicKey" }); | ||
| } | ||
| if (raw.timestamp && Math.abs(Date.now() - raw.timestamp) > MAX_MESSAGE_AGE_MS) { | ||
| return reply.code(400).send({ error: "Message timestamp too old or too far in the future" }); | ||
| } | ||
| if (!(0, peer_db_1.tofuVerifyAndCache)(agentId, raw.publicKey)) { | ||
| return reply.code(403).send({ | ||
| error: `Public key mismatch for ${msg.fromYgg} — possible key rotation, re-add peer`, | ||
| error: `Public key mismatch for ${agentId} — possible key rotation, re-add peer`, | ||
| }); | ||
| } | ||
| // Signed tombstone: peer is gracefully leaving — remove from routing table | ||
| const msg = { | ||
| from: agentId, | ||
| publicKey: raw.publicKey, | ||
| event: raw.event, | ||
| content: raw.content, | ||
| timestamp: raw.timestamp, | ||
| signature: raw.signature, | ||
| }; | ||
| if (msg.event === "leave") { | ||
| (0, peer_db_1.removePeer)(msg.fromYgg); | ||
| console.log(`[p2p] ← leave from=${msg.fromYgg.slice(0, 20)}... — removed from peer table`); | ||
| (0, peer_db_1.removePeer)(agentId); | ||
| console.log(`[p2p] <- leave from=${agentId} — removed from peer table`); | ||
| return { ok: true }; | ||
@@ -146,3 +147,3 @@ } | ||
| _inbox.pop(); | ||
| console.log(`[p2p] ← verified from=${msg.fromYgg.slice(0, 20)}... event=${msg.event}`); | ||
| console.log(`[p2p] <- verified from=${agentId} event=${msg.event}`); | ||
| _handlers.forEach((h) => h(entry)); | ||
@@ -163,2 +164,51 @@ return { ok: true }; | ||
| } | ||
| /** | ||
| * Process a raw UDP datagram as a P2PMessage. | ||
| * Returns true if the message was valid and handled, false otherwise. | ||
| */ | ||
| function handleUdpMessage(data, from) { | ||
| let raw; | ||
| try { | ||
| raw = JSON.parse(data.toString("utf-8")); | ||
| } | ||
| catch { | ||
| return false; | ||
| } | ||
| if (!raw || !raw.from || !raw.publicKey || !raw.event || !raw.signature) { | ||
| return false; | ||
| } | ||
| if ((0, identity_1.agentIdFromPublicKey)(raw.publicKey) !== raw.from) { | ||
| return false; | ||
| } | ||
| if (raw.timestamp && Math.abs(Date.now() - raw.timestamp) > MAX_MESSAGE_AGE_MS) { | ||
| return false; | ||
| } | ||
| const sigData = canonical(raw); | ||
| if (!(0, identity_1.verifySignature)(raw.publicKey, sigData, raw.signature)) { | ||
| return false; | ||
| } | ||
| if (!(0, peer_db_1.tofuVerifyAndCache)(raw.from, raw.publicKey)) { | ||
| return false; | ||
| } | ||
| const msg = { | ||
| from: raw.from, | ||
| publicKey: raw.publicKey, | ||
| event: raw.event, | ||
| content: raw.content, | ||
| timestamp: raw.timestamp, | ||
| signature: raw.signature, | ||
| }; | ||
| if (msg.event === "leave") { | ||
| (0, peer_db_1.removePeer)(raw.from); | ||
| console.log(`[p2p] <- leave (UDP) from=${raw.from}`); | ||
| return true; | ||
| } | ||
| const entry = { ...msg, verified: true, receivedAt: Date.now() }; | ||
| _inbox.unshift(entry); | ||
| if (_inbox.length > 500) | ||
| _inbox.pop(); | ||
| console.log(`[p2p] <- verified (UDP) from=${raw.from} event=${msg.event}`); | ||
| _handlers.forEach((h) => h(entry)); | ||
| return true; | ||
| } | ||
| //# sourceMappingURL=peer-server.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"peer-server.js","sourceRoot":"","sources":["../src/peer-server.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"peer-server.js","sourceRoot":"","sources":["../src/peer-server.ts"],"names":[],"mappings":"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"} |
+43
-24
@@ -0,1 +1,9 @@ | ||
| export type TransportType = "yggdrasil" | "quic" | "tailscale" | "tcp"; | ||
| export interface Endpoint { | ||
| transport: TransportType; | ||
| address: string; | ||
| port: number; | ||
| priority: number; | ||
| ttl: number; | ||
| } | ||
| export interface Identity { | ||
@@ -5,4 +13,4 @@ agentId: string; | ||
| privateKey: string; | ||
| cgaIpv6: string; | ||
| yggIpv6: string; | ||
| cgaIpv6?: string; | ||
| yggIpv6?: string; | ||
| } | ||
@@ -15,3 +23,3 @@ export interface YggdrasilInfo { | ||
| export interface P2PMessage { | ||
| fromYgg: string; | ||
| from: string; | ||
| publicKey: string; | ||
@@ -23,12 +31,37 @@ event: "chat" | "ping" | "pong" | "leave" | string; | ||
| } | ||
| export interface PeerAnnouncement { | ||
| from: string; | ||
| publicKey: string; | ||
| alias?: string; | ||
| version?: string; | ||
| endpoints: Endpoint[]; | ||
| capabilities?: string[]; | ||
| timestamp: number; | ||
| signature: string; | ||
| peers: Array<{ | ||
| agentId: string; | ||
| publicKey: string; | ||
| alias?: string; | ||
| endpoints: Endpoint[]; | ||
| lastSeen: number; | ||
| }>; | ||
| } | ||
| export interface PeerRecord { | ||
| yggAddr: string; | ||
| agentId: string; | ||
| publicKey: string; | ||
| alias: string; | ||
| endpoints: Endpoint[]; | ||
| capabilities: string[]; | ||
| firstSeen: number; | ||
| lastSeen: number; | ||
| } | ||
| export interface DiscoveredPeerRecord extends PeerRecord { | ||
| discoveredVia?: string; | ||
| source: "manual" | "bootstrap" | "gossip"; | ||
| version?: string; | ||
| } | ||
| export interface PluginConfig { | ||
| agent_name?: string; | ||
| peer_port?: number; | ||
| quic_port?: number; | ||
| data_dir?: string; | ||
@@ -41,24 +74,10 @@ yggdrasil_peers?: string[]; | ||
| } | ||
| /** Signed peer-exchange announcement sent to /peer/announce */ | ||
| export interface PeerAnnouncement { | ||
| fromYgg: string; | ||
| publicKey: string; | ||
| alias?: string; | ||
| version?: string; | ||
| export interface KeyRotation { | ||
| agentId: string; | ||
| oldPublicKey: string; | ||
| newPublicKey: string; | ||
| timestamp: number; | ||
| signature: string; | ||
| /** peers the sender knows about (shared for gossip) */ | ||
| peers: Array<{ | ||
| yggAddr: string; | ||
| publicKey: string; | ||
| alias?: string; | ||
| lastSeen: number; | ||
| }>; | ||
| signatureByOldKey: string; | ||
| signatureByNewKey: string; | ||
| } | ||
| /** Peer record with discovery metadata */ | ||
| export interface DiscoveredPeerRecord extends PeerRecord { | ||
| discoveredVia?: string; | ||
| source: "manual" | "bootstrap" | "gossip"; | ||
| version?: string; | ||
| } | ||
| //# sourceMappingURL=types.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,+DAA+D;AAC/D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,KAAK,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxF;AAED,0CAA0C;AAC1C,MAAM,WAAW,oBAAqB,SAAQ,UAAU;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"} | ||
| {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"} |
+1
-0
| "use strict"; | ||
| // ── Transport types ────────────────────────────────────────────────────────── | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| //# sourceMappingURL=types.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""} | ||
| {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA,gFAAgF"} |
+60
-15
@@ -5,5 +5,9 @@ { | ||
| "description": "Direct encrypted P2P communication between OpenClaw instances via Yggdrasil IPv6", | ||
| "version": "0.2.3", | ||
| "channels": ["declaw"], | ||
| "skills": ["./skills/declaw"], | ||
| "version": "0.3.0", | ||
| "channels": [ | ||
| "declaw" | ||
| ], | ||
| "skills": [ | ||
| "./skills/declaw" | ||
| ], | ||
| "configSchema": { | ||
@@ -20,4 +24,9 @@ "type": "object", | ||
| "default": 8099, | ||
| "description": "Local port for the P2P peer server" | ||
| "description": "Local port for the P2P peer server (HTTP)" | ||
| }, | ||
| "quic_port": { | ||
| "type": "integer", | ||
| "default": 8098, | ||
| "description": "Local port for the QUIC/UDP transport (fallback when Yggdrasil is unavailable)" | ||
| }, | ||
| "data_dir": { | ||
@@ -29,7 +38,19 @@ "type": "string", | ||
| "type": "array", | ||
| "items": { "type": "string" }, | ||
| "items": { | ||
| "type": "string" | ||
| }, | ||
| "description": "Additional Yggdrasil bootstrap peers" | ||
| }, | ||
| "test_mode": { | ||
| "oneOf": [{ "type": "boolean" }, { "type": "string", "enum": ["auto"] }], | ||
| "oneOf": [ | ||
| { | ||
| "type": "boolean" | ||
| }, | ||
| { | ||
| "type": "string", | ||
| "enum": [ | ||
| "auto" | ||
| ] | ||
| } | ||
| ], | ||
| "default": "auto", | ||
@@ -40,3 +61,5 @@ "description": "\"auto\" (default): use Yggdrasil if available, otherwise local-only. true: force local-only. false: require Yggdrasil." | ||
| "type": "array", | ||
| "items": { "type": "string" }, | ||
| "items": { | ||
| "type": "string" | ||
| }, | ||
| "description": "Bootstrap node Yggdrasil addresses for DHT peer discovery" | ||
@@ -57,11 +80,33 @@ }, | ||
| "uiHints": { | ||
| "agent_name": { "label": "Agent Name", "placeholder": "Alice's coder" }, | ||
| "peer_port": { "label": "Peer Server Port", "placeholder": "8099" }, | ||
| "data_dir": { "label": "Data Directory" }, | ||
| "yggdrasil_peers": { "label": "Extra Yggdrasil Peers" }, | ||
| "test_mode": { "label": "Test Mode (no Yggdrasil)" }, | ||
| "bootstrap_peers": { "label": "Bootstrap Peers" }, | ||
| "discovery_interval_ms": { "label": "Discovery Interval (ms)" }, | ||
| "startup_delay_ms": { "label": "Bootstrap Startup Delay (ms)" } | ||
| "agent_name": { | ||
| "label": "Agent Name", | ||
| "placeholder": "Alice's coder" | ||
| }, | ||
| "peer_port": { | ||
| "label": "Peer Server Port (HTTP)", | ||
| "placeholder": "8099" | ||
| }, | ||
| "quic_port": { | ||
| "label": "QUIC Transport Port (UDP)", | ||
| "placeholder": "8098" | ||
| }, | ||
| "data_dir": { | ||
| "label": "Data Directory" | ||
| }, | ||
| "yggdrasil_peers": { | ||
| "label": "Extra Yggdrasil Peers" | ||
| }, | ||
| "test_mode": { | ||
| "label": "Test Mode (no Yggdrasil)" | ||
| }, | ||
| "bootstrap_peers": { | ||
| "label": "Bootstrap Peers" | ||
| }, | ||
| "discovery_interval_ms": { | ||
| "label": "Discovery Interval (ms)" | ||
| }, | ||
| "startup_delay_ms": { | ||
| "label": "Bootstrap Startup Delay (ms)" | ||
| } | ||
| } | ||
| } |
+7
-2
| { | ||
| "name": "@resciencelab/declaw", | ||
| "version": "0.2.3", | ||
| "version": "0.3.0", | ||
| "description": "Direct P2P communication between OpenClaw instances over Yggdrasil IPv6", | ||
@@ -39,5 +39,9 @@ "main": "dist/index.js", | ||
| "dev": "tsc --watch", | ||
| "release": "bash scripts/release.sh", | ||
| "version": "changeset version && node scripts/sync-version.mjs", | ||
| "release": "npm run build && changeset publish", | ||
| "prepublishOnly": "npm run build" | ||
| }, | ||
| "publishConfig": { | ||
| "access": "public" | ||
| }, | ||
| "keywords": [ | ||
@@ -58,2 +62,3 @@ "openclaw", | ||
| "devDependencies": { | ||
| "@changesets/cli": "^2.30.0", | ||
| "@types/node": "^20.11.5", | ||
@@ -60,0 +65,0 @@ "typescript": "^5.3.3" |
| --- | ||
| name: declaw | ||
| description: Direct encrypted P2P messaging between OpenClaw agents over Yggdrasil IPv6. Peer discovery, messaging, and connectivity diagnostics. Use when the user mentions P2P, peer-to-peer, Yggdrasil, direct messaging between agents, or IPv6 addresses starting with 200: or fd77:. | ||
| version: 0.2.3 | ||
| version: 0.3.0 | ||
| metadata: | ||
@@ -6,0 +6,0 @@ openclaw: |
| #!/usr/bin/env bash | ||
| set -euo pipefail | ||
| # DeClaw — release script (creates Release PR) | ||
| # Usage: | ||
| # bash scripts/release.sh patch # 0.2.2 → 0.2.3 | ||
| # bash scripts/release.sh minor # 0.2.2 → 0.3.0 | ||
| # bash scripts/release.sh major # 0.2.2 → 1.0.0 | ||
| # | ||
| # Flow: | ||
| # 1. Local: preflight → build+test → version bump → create Release PR | ||
| # 2. CI: PR merge triggers release.yml → tag + GH Release + npm + ClawHub + backmerge | ||
| LEVEL="${1:-patch}" | ||
| if [[ "$LEVEL" != "patch" && "$LEVEL" != "minor" && "$LEVEL" != "major" ]]; then | ||
| echo "Usage: bash scripts/release.sh [patch|minor|major]" | ||
| exit 1 | ||
| fi | ||
| echo "=== DeClaw Release (${LEVEL}) ===" | ||
| # ── 0. Preflight ───────────────────────────────────────────────────────────── | ||
| BRANCH=$(git branch --show-current) | ||
| if [[ "$BRANCH" != "main" && "$BRANCH" != "develop" ]]; then | ||
| echo "Error: must be on 'main' or 'develop' branch (currently on '${BRANCH}')" | ||
| exit 1 | ||
| fi | ||
| if [[ -n "$(git status --porcelain)" ]]; then | ||
| echo "Error: working tree is not clean. Commit or stash changes first." | ||
| exit 1 | ||
| fi | ||
| git fetch origin main --quiet | ||
| LOCAL=$(git rev-parse main) | ||
| REMOTE=$(git rev-parse origin/main) | ||
| if [[ "$LOCAL" != "$REMOTE" ]]; then | ||
| echo "Error: local main differs from origin/main. Pull or push first." | ||
| exit 1 | ||
| fi | ||
| # ── 1. Build + test ────────────────────────────────────────────────────────── | ||
| echo "Building..." | ||
| npm run build | ||
| echo "Running tests..." | ||
| node --test test/*.test.mjs | ||
| # ── 2. Version bump ────────────────────────────────────────────────────────── | ||
| VERSION=$(npm version "$LEVEL" --no-git-tag-version | tr -d 'v') | ||
| echo "New version: ${VERSION}" | ||
| sed -i '' "s/\"version\": \"[^\"]*\"/\"version\": \"${VERSION}\"/" openclaw.plugin.json | ||
| sed -i '' "s/^version: .*/version: ${VERSION}/" skills/declaw/SKILL.md | ||
| echo "Version synced: package.json, openclaw.plugin.json, skills/declaw/SKILL.md" | ||
| # ── 3. Changelog check ─────────────────────────────────────────────────────── | ||
| if ! grep -q "\[${VERSION}\]" CHANGELOG.md; then | ||
| echo "" | ||
| echo "Warning: CHANGELOG.md does not contain a [${VERSION}] section." | ||
| read -p "Continue without changelog entry? (y/N) " -n 1 -r | ||
| echo | ||
| if [[ ! "$REPLY" =~ ^[Yy]$ ]]; then | ||
| echo "Aborting. Update CHANGELOG.md and re-run." | ||
| git checkout -- package.json package-lock.json openclaw.plugin.json skills/declaw/SKILL.md | ||
| exit 1 | ||
| fi | ||
| fi | ||
| # ── 4. Create release branch + PR ──────────────────────────────────────────── | ||
| RELEASE_BRANCH="release/v${VERSION}" | ||
| git checkout -b "$RELEASE_BRANCH" | ||
| git add -A | ||
| git commit -m "chore: release v${VERSION}" | ||
| git push -u origin "$RELEASE_BRANCH" | ||
| PR_URL=$(gh pr create \ | ||
| --base main \ | ||
| --head "$RELEASE_BRANCH" \ | ||
| --title "chore: release v${VERSION}" \ | ||
| --body "## Release v${VERSION} | ||
| ### Version bump | ||
| - \`package.json\` → ${VERSION} | ||
| - \`openclaw.plugin.json\` → ${VERSION} | ||
| - \`skills/declaw/SKILL.md\` → ${VERSION} | ||
| ### What happens on merge | ||
| CI (\`.github/workflows/release.yml\`) will automatically: | ||
| 1. Create git tag \`v${VERSION}\` | ||
| 2. Create GitHub Release (triggers npm publish) | ||
| 3. Publish skill to ClawHub | ||
| 4. Backmerge main → develop") | ||
| echo "" | ||
| echo "=== Release PR created ===" | ||
| echo " ${PR_URL}" | ||
| echo "" | ||
| echo "Next steps:" | ||
| echo " 1. Wait for CI checks to pass" | ||
| echo " 2. Merge the PR (squash)" | ||
| echo " 3. CI handles: tag → GH Release → npm → ClawHub → backmerge" | ||
| echo "" | ||
| git checkout main |
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
261339
29.15%59
28.26%3176
34.92%10
-9.09%3
50%