Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@resciencelab/declaw

Package Overview
Dependencies
Maintainers
1
Versions
8
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@resciencelab/declaw - npm Package Compare versions

Comparing version
0.2.3
to
0.3.0
+59
dist/transport-quic.d.ts
/**
* 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":";;;AAQA,2CAMoB;AAEpB,MAAa,kBAAkB;IACpB,EAAE,GAAgB,WAAW,CAAA;IAC9B,QAAQ,GAAW,EAAE,CAAA;IACrB,KAAK,GAAyB,IAAI,CAAA;IAClC,OAAO,GAAY,KAAK,CAAA;IACxB,SAAS,GAAgD,EAAE,CAAA;IAC3D,QAAQ,GAAW,EAAE,CAAA;IAE7B,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAA,mCAAuB,GAAE,CAAA;IAClC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAAkB,EAAE,IAA8B;QAC5D,IAAI,CAAC,QAAQ,GAAI,IAAI,EAAE,OAAkB,IAAI,EAAE,CAAA;QAC/C,MAAM,UAAU,GAAI,IAAI,EAAE,UAAuB,IAAI,EAAE,CAAA;QAEvD,mCAAmC;QACnC,IAAI,CAAC,IAAA,gCAAoB,GAAE,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAA;QACd,CAAC;QAED,yCAAyC;QACzC,MAAM,QAAQ,GAAG,IAAA,mCAAuB,GAAE,CAAA;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAA;YACrB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAA;YAChC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;YACnB,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAA;YACnC,OAAO,CAAC,GAAG,CAAC,uDAAuD,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;YACtF,OAAO,IAAI,CAAA;QACb,CAAC;QAED,gCAAgC;QAChC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,GAAG,MAAM,IAAA,0BAAc,EAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;YAC5D,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;gBACjB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAA;gBAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;gBACnB,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;gBAC/B,OAAO,CAAC,GAAG,CAAC,iDAAiD,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;gBAC5E,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACpB,IAAA,yBAAa,GAAE,CAAA;IACjB,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,KAAa;QACvC,0EAA0E;QAC1E,sEAAsE;QACtE,iDAAiD;IACnD,CAAC;IAED,SAAS,CAAC,OAA6C;QACrD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC9B,CAAC;IAED,WAAW;QACT,OAAO;YACL,SAAS,EAAE,WAAW;YACtB,OAAO,EAAE,IAAI,CAAC,QAAQ;YACtB,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,CAAC;YACX,GAAG,EAAE,KAAK;SACX,CAAA;IACH,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,QAAkB;QAC9B,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAA;QAC7B,MAAM,GAAG,GAAG,IAAA,mCAAuB,GAAE,CAAA;QACrC,IAAI,CAAC,GAAG;YAAE,OAAO,KAAK,CAAA;QACtB,IAAI,CAAC,KAAK,GAAG,GAAG,CAAA;QAChB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAA;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QACnB,QAAQ,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAA;QAC9B,OAAO,CAAC,GAAG,CAAC,wCAAwC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;QAClE,OAAO,IAAI,CAAA;IACb,CAAC;CACF;AApGD,gDAoGC"}
/**
* 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"}

@@ -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":";;;AAwCA,oCAwCC;AAED,oDAcC;AA3FD,+CAA2D;AAC3D,uCAA0D;AAC1D,uCAA8C;AAC9C,+CAAyC;AAE5B,QAAA,qBAAqB,GAAG;IACnC,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,oBAAoB,EAAE,KAAK;QAC3B,UAAU,EAAE;YACV,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YAC5B,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC;gBACtC,OAAO,EAAE,SAAS;aACnB;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EAAE,8CAA8C;aAC5D;SACF;KACF;IACD,OAAO,EAAE;QACP,QAAQ,EAAE;YACR,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,0EAA0E;SACjF;QACD,SAAS,EAAE;YACT,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,iCAAiC;SACxC;KACF;CACF,CAAA;AAED,SAAgB,YAAY,CAAC,QAAkB,EAAE,IAAY,EAAE,WAAyC;IACtG,OAAO;QACL,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE;YACJ,EAAE,EAAE,QAAQ;YACZ,KAAK,EAAE,QAAQ;YACf,cAAc,EAAE,cAAc;YAC9B,QAAQ,EAAE,kBAAkB;YAC5B,KAAK,EAAE,2DAA2D;YAClE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC;SACjD;QACD,YAAY,EAAE,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE;QACvC,YAAY,EAAE,6BAAqB;QACnC,MAAM,EAAE;YACN,cAAc,EAAE,CAAC,IAAa,EAAE,EAAE,CAAC,IAAA,oBAAU,GAAE;YAC/C,cAAc,EAAE,CAAC,IAAa,EAAE,SAA6B,EAAE,EAAE;gBAC/D,MAAM,EAAE,GAAG,SAAS,IAAI,EAAE,CAAA;gBAC1B,MAAM,IAAI,GAAG,IAAA,iBAAO,EAAC,EAAE,CAAC,CAAA;gBACxB,OAAO;oBACL,SAAS,EAAE,EAAE;oBACb,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,EAAE;oBAC5B,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE;iBACzB,CAAA;YACH,CAAC;SACF;QACD,QAAQ,EAAE;YACR,YAAY,EAAE,QAAiB;YAC/B,QAAQ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAmD,EAAE,EAAE;gBACrF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAA;gBACrC,MAAM,IAAI,GAAG,IAAA,iBAAO,EAAC,OAAO,CAAC,CAAA;gBAC7B,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,4BAAkB,EAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,OAAO,CAAA;gBACnF,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC,OAAO,CAAC,CAAA;gBACnC,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAc,EAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;gBAC3F,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,OAAO,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;gBACzE,CAAC;gBACD,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAA;YAC1B,CAAC;SACF;KACF,CAAA;AACH,CAAC;AAED,SAAgB,oBAAoB,CAAC,GAAQ;IAC3C,IAAA,uBAAS,EAAC,CAAC,GAAG,EAAE,EAAE;QAChB,IAAI,GAAG,CAAC,KAAK,KAAK,MAAM;YAAE,OAAM;QAChC,IAAI,CAAC;YACH,GAAG,CAAC,OAAO,EAAE,qBAAqB,EAAE,CAAC;gBACnC,SAAS,EAAE,QAAQ;gBACnB,SAAS,EAAE,GAAG,CAAC,IAAI;gBACnB,IAAI,EAAE,GAAG,CAAC,OAAO;gBACjB,QAAQ,EAAE,GAAG,CAAC,IAAI;aACnB,CAAC,CAAA;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;QAClE,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
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"}

@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,sCAUC;AAQD,sCAUC;AAGD,4CAkBC;AAGD,oDASC;AAGD,oCAUC;AAGD,kCAMC;AAGD,0CAaC;AAGD,oDAGC;AAOD,sCAeC;AAjJD;;;GAGG;AACH,gDAAkC;AAClC,iDAA8C;AAC9C,iDAA8C;AAC9C,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAGzB,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;AAE1D;;;GAGG;AACH,SAAgB,aAAa,CAAC,cAA0B;IACtD,MAAM,CAAC,GAAG,IAAA,eAAM,EAAC,cAAc,CAAC,CAAC;IACjC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,uBAAuB;IAClE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,cAA0B;IACtD,MAAM,CAAC,GAAG,IAAA,eAAM,EAAC,cAAc,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9B,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACf,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACpC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,+DAA+D;AAC/D,SAAgB,gBAAgB;IAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;IACnC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,sCAAsC;IAExF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAE1D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAErC,OAAO;QACL,OAAO;QACP,SAAS,EAAE,MAAM;QACjB,UAAU,EAAE,OAAO;QACnB,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC;QAChC,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC;KACjC,CAAC;AACJ,CAAC;AAED,8DAA8D;AAC9D,SAAgB,oBAAoB,CAAC,OAAe;IAClD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACnD,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAa,CAAC;IAClE,CAAC;IACD,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAC9B,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACtD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,6EAA6E;AAC7E,SAAgB,YAAY,CAAC,KAAc;IACzC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACzD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACrE,MAAM,CAAC,CAAC,CAAC,GAAG,YAAY,CAAE,KAAiC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,oFAAoF;AACpF,SAAgB,WAAW,CAAC,aAAqB,EAAE,IAA6B;IAC9E,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IACxD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAED,0DAA0D;AAC1D,SAAgB,eAAe,CAC7B,YAAoB,EACpB,IAA6B,EAC7B,YAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QACrD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,uDAAuD;AACvD,SAAgB,oBAAoB,CAAC,YAAoB;IACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACrD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACpE,CAAC;AAED;;;;GAIG;AACH,SAAgB,aAAa;IAC3B,MAAM,MAAM,GAAG,EAAE,CAAC,iBAAiB,EAAE,CAAC;IACtC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IACE,IAAI,CAAC,MAAM,KAAK,MAAM;gBACtB,CAAC,IAAI,CAAC,QAAQ;gBACd,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EACjC,CAAC;gBACD,OAAO,IAAI,CAAC,OAAO,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
{"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"}

@@ -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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"}
/**
* 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"}

@@ -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":";;AAUA,wCA4CC;AAMD,wCAUC;AAKD,4BAeC;AAtFD,yCAAyC;AAEzC;;;GAGG;AACI,KAAK,UAAU,cAAc,CAClC,QAAkB,EAClB,OAAe,EACf,KAAa,EACb,OAAe,EACf,OAAe,IAAI,EACnB,YAAoB,MAAM;IAE1B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,MAAM,OAAO,GAAkC;QAC7C,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,KAAK;QACL,OAAO;QACP,SAAS;KACV,CAAC;IAEF,MAAM,SAAS,GAAG,IAAA,sBAAW,EAAC,QAAQ,CAAC,UAAU,EAAE,OAAkC,CAAC,CAAC;IACvF,MAAM,GAAG,GAAe,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,CAAC;IAElD,MAAM,GAAG,GAAG,WAAW,OAAO,KAAK,IAAI,eAAe,CAAC;IAEvD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;QAExD,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,GAAG,CAAC;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;QAEH,YAAY,CAAC,KAAK,CAAC,CAAC;QAEpB,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,EAAE,CAAC;QAC9D,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1D,CAAC;AACH,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,cAAc,CAClC,QAAkB,EAClB,KAAiC,EACjC,OAAe,IAAI;IAEnB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC/B,MAAM,OAAO,CAAC,UAAU,CACtB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAChF,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,iCAAiC,KAAK,CAAC,MAAM,UAAU,CAAC,CAAC;AACvE,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,QAAQ,CAC5B,OAAe,EACf,OAAe,IAAI,EACnB,YAAoB,KAAK;IAEzB,MAAM,GAAG,GAAG,WAAW,OAAO,KAAK,IAAI,YAAY,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
{"version":3,"file":"peer-client.js","sourceRoot":"","sources":["../src/peer-client.ts"],"names":[],"mappings":"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"}

@@ -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"}

@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,0BAEC;AAED,wBAGC;AAED,8BAEC;AAED,gCAUC;AAUD,oDA+BC;AAGD,kDAKC;AAED,gCAGC;AAED,0BAEC;AAED,4CAEC;AAOD,gCAiBC;AAMD,kDA0BC;AAxLD;;;GAGG;AACH,uCAAyB;AACzB,2CAA6B;AAO7B,IAAI,MAAc,CAAC;AACnB,IAAI,KAAK,GAAc,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACrC,IAAI,UAAU,GAAyC,IAAI,CAAC;AAC5D,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAE9B,SAAS,IAAI;IACX,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,aAAa;IACpB,IAAI,UAAU,EAAE,CAAC;QACf,YAAY,CAAC,UAAU,CAAC,CAAC;QACzB,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,IAAI;IACX,IAAI,UAAU;QAAE,OAAO;IACvB,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE;QAC3B,UAAU,GAAG,IAAI,CAAC;QAClB,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC,EAAE,gBAAgB,CAAC,CAAC;AACvB,CAAC;AAED,SAAgB,OAAO;IACrB,IAAI,UAAU;QAAE,aAAa,EAAE,CAAC;AAClC,CAAC;AAED,SAAgB,MAAM,CAAC,OAAe;IACpC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC1C,IAAI,EAAE,CAAC;AACT,CAAC;AAED,SAAgB,SAAS;IACvB,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC5E,CAAC;AAED,SAAgB,UAAU,CAAC,OAAe,EAAE,QAAgB,EAAE;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,KAAK,GAAG,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC;QACzC,QAAQ,CAAC,QAAQ,GAAG,GAAG,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC5G,CAAC;IACD,aAAa,EAAE,CAAC;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,oBAAoB,CAClC,OAAe,EACf,SAAiB,EACjB,OAAyH,EAAE;IAE3H,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC,QAAQ,CAAC,SAAS;YAAE,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC;QACxD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAChC,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,QAAQ,GAAG,GAAG,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,aAAa;YAAE,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACzE,IAAI,IAAI,CAAC,OAAO;YAAE,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAClD,oDAAoD;QACpD,IAAI,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ;YAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAC9E,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG;YACrB,OAAO;YACP,SAAS;YACT,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,GAAG;YACd,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,GAAG;YAC9B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,QAAQ;YAC/B,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,CAAC;AACT,CAAC;AAED,0FAA0F;AAC1F,SAAgB,mBAAmB,CAAC,MAAc,EAAE;IAClD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;SAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,4CAA4C;SACvE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;SACvC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACnB,CAAC;AAED,SAAgB,UAAU,CAAC,OAAe;IACxC,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5B,aAAa,EAAE,CAAC;AAClB,CAAC;AAED,SAAgB,OAAO,CAAC,OAAe;IACrC,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;AACtC,CAAC;AAED,SAAgB,gBAAgB;IAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,SAAgB,UAAU,CAAC,QAAgB,EAAE,iBAA2B,EAAE;IACxE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC;IACrC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;YAAE,SAAS;QACzC,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAS;QAC5C,IAAI,MAAM,CAAC,QAAQ,GAAG,MAAM,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzB,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC;IACD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,gBAAgB,CAAC,CAAC;QACvD,aAAa,EAAE,CAAC;IAClB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,OAAe,EAAE,SAAiB;IACpE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEtC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,wCAAwC;QACxC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC1G,aAAa,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QACxB,4DAA4D;QAC5D,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC;QAC/B,QAAQ,CAAC,QAAQ,GAAG,GAAG,CAAC;QACxB,aAAa,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC,CAAC,wBAAwB;IACxC,CAAC;IAED,QAAQ,CAAC,QAAQ,GAAG,GAAG,CAAC;IACxB,IAAI,EAAE,CAAC;IACP,OAAO,IAAI,CAAC;AACd,CAAC"}
{"version":3,"file":"peer-db.js","sourceRoot":"","sources":["../src/peer-db.ts"],"names":[],"mappings":"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"}

@@ -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"}

@@ -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":"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"}
{"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"}

@@ -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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"}

@@ -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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"}
"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"}

@@ -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)"
}
}
}
{
"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