@vaultysclaw/agent-runtime 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +38 -0
- package/dist/base-agent.d.ts +182 -0
- package/dist/base-agent.d.ts.map +1 -0
- package/dist/base-agent.js +1003 -0
- package/dist/base-agent.js.map +1 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/intent-verify.d.ts +30 -0
- package/dist/intent-verify.d.ts.map +1 -0
- package/dist/intent-verify.js +55 -0
- package/dist/intent-verify.js.map +1 -0
- package/dist/peer-grant-verify.d.ts +16 -0
- package/dist/peer-grant-verify.d.ts.map +1 -0
- package/dist/peer-grant-verify.js +39 -0
- package/dist/peer-grant-verify.js.map +1 -0
- package/dist/peer-manager.d.ts +63 -0
- package/dist/peer-manager.d.ts.map +1 -0
- package/dist/peer-manager.js +448 -0
- package/dist/peer-manager.js.map +1 -0
- package/package.json +42 -0
- package/src/base-agent.ts +1332 -0
- package/src/config.ts +13 -0
- package/src/index.ts +8 -0
- package/src/intent-verify.ts +72 -0
- package/src/peer-grant-verify.ts +58 -0
- package/src/peer-manager.ts +696 -0
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PeerManager — lazy WebRTC peer-to-peer channel manager.
|
|
3
|
+
*
|
|
4
|
+
* Each agent has a deterministic PeerJS ID derived as sha256(did), so peers
|
|
5
|
+
* can discover each other without a registry. Connections are opened on
|
|
6
|
+
* demand (first invoke) and kept alive for reuse.
|
|
7
|
+
*
|
|
8
|
+
* Security model:
|
|
9
|
+
* Every new data-channel connection runs a full Challenger SRP exchange
|
|
10
|
+
* (same 4-round pattern as the control-plane WebSocket auth) before any
|
|
11
|
+
* payload is exchanged. After auth the remote DID is verified against the
|
|
12
|
+
* local peer catalog (signed by the control plane) before accepting.
|
|
13
|
+
*/
|
|
14
|
+
import { createHash } from "crypto";
|
|
15
|
+
import pino from "pino";
|
|
16
|
+
import { Challenger, crypto as vCrypto } from "@vaultys/id";
|
|
17
|
+
import { verifyPeerGrant } from "./peer-grant-verify.js";
|
|
18
|
+
const Buffer = vCrypto.Buffer;
|
|
19
|
+
// Write to stderr so pino's sonic-boom direct-fd writes don't leak into the
|
|
20
|
+
// MCP stdio pipe (sonic-boom uses fs.write(fd) and bypasses process.stdout.write).
|
|
21
|
+
const logger = pino({ name: "peer-manager" }, process.stderr);
|
|
22
|
+
/** Timeout for a full SRP handshake (ms). */
|
|
23
|
+
const HANDSHAKE_TIMEOUT_MS = 30000;
|
|
24
|
+
/** Timeout for a remote skill invocation (ms). */
|
|
25
|
+
const INVOKE_TIMEOUT_MS = 60000;
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// Helpers
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
/** Compute the deterministic PeerJS peer ID for a given DID. */
|
|
30
|
+
export function peerIdForDid(did) {
|
|
31
|
+
return createHash("sha256").update(did).digest("hex");
|
|
32
|
+
}
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// PeerManager
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
export class PeerManager {
|
|
37
|
+
constructor(vaultysId) {
|
|
38
|
+
/** Server's raw public key bytes — used to verify peer grant certificates. */
|
|
39
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
40
|
+
this.serverPublicKey = null;
|
|
41
|
+
/** Peer catalog pushed by the control plane. */
|
|
42
|
+
this.peerCatalog = [];
|
|
43
|
+
/** Active authenticated connections keyed by remote DID. */
|
|
44
|
+
this.connections = new Map();
|
|
45
|
+
/** In-flight connect() promises (dedup concurrent connect attempts). */
|
|
46
|
+
this.connecting = new Map();
|
|
47
|
+
/** Called when a remote agent invokes a skill on us. */
|
|
48
|
+
this.invokeHandler = null;
|
|
49
|
+
/** The listener channel waiting for incoming connections. */
|
|
50
|
+
this.listenerChannel = null;
|
|
51
|
+
this.ownVaultysId = vaultysId.toVersion(1);
|
|
52
|
+
}
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
// Public API
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
/** Set the server public key after first auth, for certificate verification. */
|
|
57
|
+
setServerPublicKey(key) {
|
|
58
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
59
|
+
this.serverPublicKey = Buffer.from(key);
|
|
60
|
+
}
|
|
61
|
+
/** Replace the peer catalog with a fresh one from the control plane. */
|
|
62
|
+
updatePeerCatalog(catalog) {
|
|
63
|
+
this.peerCatalog = catalog;
|
|
64
|
+
}
|
|
65
|
+
/** Register the function that handles incoming skill invocations. */
|
|
66
|
+
onInvoke(handler) {
|
|
67
|
+
this.invokeHandler = handler;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Start listening for incoming connections under our deterministic PeerJS ID.
|
|
71
|
+
* Should be called once after startup and server-key is known.
|
|
72
|
+
*/
|
|
73
|
+
async startListening() {
|
|
74
|
+
const { PeerjsChannel } = await import("@vaultys/channel-peerjs");
|
|
75
|
+
const ownPeerId = peerIdForDid(this.ownVaultysId.did);
|
|
76
|
+
logger.info({ ownDid: this.ownVaultysId.did, peerId: ownPeerId }, "Starting P2P listener");
|
|
77
|
+
// PeerjsChannel responder — listens under ownPeerId
|
|
78
|
+
const listener = new PeerjsChannel(ownPeerId);
|
|
79
|
+
this.listenerChannel = listener;
|
|
80
|
+
// Accept connections in the background
|
|
81
|
+
this.acceptLoop(listener).catch((err) => {
|
|
82
|
+
logger.error({ err }, "accept loop error");
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Invoke a skill on a remote agent.
|
|
87
|
+
* Lazy: opens a connection if none exists.
|
|
88
|
+
*/
|
|
89
|
+
async invoke(targetDid, action, params = {}) {
|
|
90
|
+
logger.info({ targetDid, action }, "Invoking remote agent skill");
|
|
91
|
+
const conn = await this.getOrConnect(targetDid);
|
|
92
|
+
const requestId = vCrypto.randomBytes(8).toString("hex");
|
|
93
|
+
return new Promise((resolve, reject) => {
|
|
94
|
+
const timer = setTimeout(() => {
|
|
95
|
+
conn.pending.delete(requestId);
|
|
96
|
+
reject(new Error(`Invoke timeout for remote agent ${targetDid} action=${action}`));
|
|
97
|
+
}, INVOKE_TIMEOUT_MS);
|
|
98
|
+
conn.pending.set(requestId, { resolve, reject, timer });
|
|
99
|
+
const msg = { type: "invoke", requestId, action, params };
|
|
100
|
+
conn.channel
|
|
101
|
+
.send(Buffer.from(JSON.stringify(msg)))
|
|
102
|
+
.catch((err) => {
|
|
103
|
+
conn.pending.delete(requestId);
|
|
104
|
+
clearTimeout(timer);
|
|
105
|
+
reject(err);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/** Close all connections and stop listening. */
|
|
110
|
+
async shutdown() {
|
|
111
|
+
if (this.listenerChannel) {
|
|
112
|
+
await this.listenerChannel.close().catch(() => { });
|
|
113
|
+
this.listenerChannel = null;
|
|
114
|
+
}
|
|
115
|
+
for (const conn of this.connections.values()) {
|
|
116
|
+
await conn.channel.close().catch(() => { });
|
|
117
|
+
}
|
|
118
|
+
this.connections.clear();
|
|
119
|
+
}
|
|
120
|
+
// ---------------------------------------------------------------------------
|
|
121
|
+
// Private — outgoing connections
|
|
122
|
+
// ---------------------------------------------------------------------------
|
|
123
|
+
/** Return a cached connection or establish a new one. */
|
|
124
|
+
async getOrConnect(targetDid) {
|
|
125
|
+
const existing = this.connections.get(targetDid);
|
|
126
|
+
if (existing) {
|
|
127
|
+
logger.debug({ targetDid }, "Reusing existing P2P connection");
|
|
128
|
+
return existing;
|
|
129
|
+
}
|
|
130
|
+
// Dedup: if a connect is already in flight, wait for it
|
|
131
|
+
const inflight = this.connecting.get(targetDid);
|
|
132
|
+
if (inflight) {
|
|
133
|
+
logger.debug({ targetDid }, "Connection in-flight — waiting");
|
|
134
|
+
return inflight;
|
|
135
|
+
}
|
|
136
|
+
// Verify we have a valid peer grant before connecting
|
|
137
|
+
const grant = this.findGrant(targetDid);
|
|
138
|
+
if (!grant) {
|
|
139
|
+
logger.warn({ targetDid, catalogSize: this.peerCatalog.length }, "No peer grant for remote agent");
|
|
140
|
+
throw new Error(`No peer grant for remote agent ${targetDid}`);
|
|
141
|
+
}
|
|
142
|
+
logger.debug({ targetDid, grantId: grant.id }, "Found peer grant — connecting");
|
|
143
|
+
const promise = this.connectToAgent(targetDid, grant);
|
|
144
|
+
this.connecting.set(targetDid, promise);
|
|
145
|
+
try {
|
|
146
|
+
const conn = await promise;
|
|
147
|
+
this.connections.set(targetDid, conn);
|
|
148
|
+
return conn;
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
this.connecting.delete(targetDid);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
findGrant(targetDid) {
|
|
155
|
+
return this.peerCatalog.find((g) => g.targetDid === targetDid);
|
|
156
|
+
}
|
|
157
|
+
async connectToAgent(targetDid, _grant) {
|
|
158
|
+
const { PeerjsChannel } = await import("@vaultys/channel-peerjs");
|
|
159
|
+
const targetPeerId = peerIdForDid(targetDid);
|
|
160
|
+
logger.info({ targetDid, targetPeerId, ownDid: this.ownVaultysId.did }, "Initiating P2P connection");
|
|
161
|
+
// Connect as initiator using the target's deterministic peer ID
|
|
162
|
+
const channel = new PeerjsChannel(targetPeerId, "initiator");
|
|
163
|
+
try {
|
|
164
|
+
await withTimeout(channel.start(), HANDSHAKE_TIMEOUT_MS, `connect to ${targetPeerId}`);
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
logger.error({ targetDid, targetPeerId, err }, "PeerJS channel.start() failed — target may not be listening");
|
|
168
|
+
throw err;
|
|
169
|
+
}
|
|
170
|
+
logger.info({ targetDid, targetPeerId }, "PeerJS channel connected, starting SRP auth (initiator)");
|
|
171
|
+
// Run Challenger as initiator
|
|
172
|
+
const challenger = new Challenger(this.ownVaultysId);
|
|
173
|
+
challenger.version = 1;
|
|
174
|
+
challenger.createChallenge("p2p", "agent");
|
|
175
|
+
let verified = false;
|
|
176
|
+
let remoteDid = "";
|
|
177
|
+
for (let round = 0; round < 4; round++) {
|
|
178
|
+
const cert = challenger.getCertificate();
|
|
179
|
+
logger.debug({ targetDid, round, certLen: cert.length }, "Sending auth_round (initiator)");
|
|
180
|
+
const msg = {
|
|
181
|
+
type: "auth_round",
|
|
182
|
+
round,
|
|
183
|
+
data: Buffer.from(cert).toString("base64"),
|
|
184
|
+
};
|
|
185
|
+
await channel.send(Buffer.from(JSON.stringify(msg)));
|
|
186
|
+
logger.debug({ targetDid, round }, "Waiting for auth_round reply");
|
|
187
|
+
const raw = await withTimeout(channel.receive(), HANDSHAKE_TIMEOUT_MS, `auth round ${round} receive`);
|
|
188
|
+
const reply = JSON.parse(Buffer.from(raw).toString("utf-8"));
|
|
189
|
+
logger.debug({ targetDid, round, replyType: reply.type }, "Received auth reply");
|
|
190
|
+
if (reply.type === "auth_failed") {
|
|
191
|
+
logger.warn({ targetDid, reason: reply.reason }, "Remote agent rejected auth");
|
|
192
|
+
throw new Error(`Remote agent rejected auth: ${reply.reason}`);
|
|
193
|
+
}
|
|
194
|
+
if (reply.type !== "auth_round") {
|
|
195
|
+
logger.warn({ targetDid, round, replyType: reply.type }, "Unexpected message during auth");
|
|
196
|
+
throw new Error("Unexpected message during auth");
|
|
197
|
+
}
|
|
198
|
+
const remoteCert = Buffer.from(reply.data, "base64");
|
|
199
|
+
await challenger.update(remoteCert);
|
|
200
|
+
if (challenger.hasFailed()) {
|
|
201
|
+
logger.warn({ targetDid, round }, "Challenger.hasFailed() after update");
|
|
202
|
+
throw new Error("Challenger failed during auth");
|
|
203
|
+
}
|
|
204
|
+
if (challenger.isComplete()) {
|
|
205
|
+
const contact = challenger.getContactId();
|
|
206
|
+
remoteDid = contact.toVersion(1).did;
|
|
207
|
+
logger.debug({ targetDid, remoteDid, round }, "Challenger complete");
|
|
208
|
+
// Verify the remote agent is who we expected
|
|
209
|
+
if (remoteDid !== targetDid) {
|
|
210
|
+
logger.warn({ expected: targetDid, got: remoteDid }, "Remote DID mismatch");
|
|
211
|
+
await channel.send(Buffer.from(JSON.stringify({
|
|
212
|
+
type: "auth_failed",
|
|
213
|
+
reason: "DID mismatch",
|
|
214
|
+
})));
|
|
215
|
+
throw new Error(`Remote DID mismatch: expected ${targetDid} got ${remoteDid}`);
|
|
216
|
+
}
|
|
217
|
+
await channel.send(Buffer.from(JSON.stringify({ type: "auth_complete" })));
|
|
218
|
+
verified = true;
|
|
219
|
+
logger.info({ targetDid, remoteDid }, "SRP auth complete (initiator) — connection established");
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (!verified) {
|
|
224
|
+
logger.warn({ targetDid }, "Auth did not complete within 4 rounds");
|
|
225
|
+
throw new Error("Auth did not complete within 4 rounds");
|
|
226
|
+
}
|
|
227
|
+
const conn = { remoteDid, channel, pending: new Map() };
|
|
228
|
+
// Listen for incoming messages (results + reverse invocations)
|
|
229
|
+
this.pipeMessages(conn).catch((err) => {
|
|
230
|
+
logger.warn({ remoteDid, err }, "pipe error — closing connection");
|
|
231
|
+
this.connections.delete(remoteDid);
|
|
232
|
+
});
|
|
233
|
+
return conn;
|
|
234
|
+
}
|
|
235
|
+
// ---------------------------------------------------------------------------
|
|
236
|
+
// Private — incoming connections
|
|
237
|
+
// ---------------------------------------------------------------------------
|
|
238
|
+
/** Accept incoming connections in a loop. */
|
|
239
|
+
async acceptLoop(listener) {
|
|
240
|
+
logger.info({ ownDid: this.ownVaultysId.did }, "P2P accept loop started");
|
|
241
|
+
while (true) {
|
|
242
|
+
try {
|
|
243
|
+
logger.debug("Waiting for next incoming P2P connection");
|
|
244
|
+
await listener.start(); // blocks until a peer connects
|
|
245
|
+
logger.info("Incoming P2P connection accepted, starting auth handler");
|
|
246
|
+
// Each accepted connection gets its own copy of the channel
|
|
247
|
+
this.handleIncoming(listener).catch((err) => {
|
|
248
|
+
logger.warn({ err }, "incoming connection handler error");
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
logger.error({ err }, "accept loop interrupted");
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
async handleIncoming(channel) {
|
|
258
|
+
const challenger = new Challenger(this.ownVaultysId);
|
|
259
|
+
challenger.version = 1;
|
|
260
|
+
// Responder does NOT call createChallenge — it waits for the initiator's first round
|
|
261
|
+
logger.debug({ ownDid: this.ownVaultysId.did }, "Handling incoming P2P connection (responder)");
|
|
262
|
+
let remoteDid = "";
|
|
263
|
+
let authenticated = false;
|
|
264
|
+
for (let round = 0; round < 4; round++) {
|
|
265
|
+
logger.debug({ round }, "Waiting for auth_round from initiator");
|
|
266
|
+
const raw = await withTimeout(channel.receive(), HANDSHAKE_TIMEOUT_MS, `incoming auth round ${round}`);
|
|
267
|
+
const msg = JSON.parse(Buffer.from(raw).toString("utf-8"));
|
|
268
|
+
logger.debug({ round, msgType: msg.type }, "Received message from initiator");
|
|
269
|
+
if (msg.type === "auth_complete") {
|
|
270
|
+
// Initiator confirmed — but we haven't confirmed yet; auth is done
|
|
271
|
+
logger.info({ round }, "Received auth_complete from initiator");
|
|
272
|
+
authenticated = true;
|
|
273
|
+
break;
|
|
274
|
+
}
|
|
275
|
+
if (msg.type !== "auth_round") {
|
|
276
|
+
logger.warn({ round, msgType: msg.type }, "Unexpected message type during incoming auth");
|
|
277
|
+
await channel.send(Buffer.from(JSON.stringify({
|
|
278
|
+
type: "auth_failed",
|
|
279
|
+
reason: "Protocol error",
|
|
280
|
+
})));
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
const remoteCert = Buffer.from(msg.data, "base64");
|
|
284
|
+
await challenger.update(remoteCert);
|
|
285
|
+
if (challenger.hasFailed()) {
|
|
286
|
+
logger.warn({ round }, "Challenger.hasFailed() on incoming connection");
|
|
287
|
+
await channel.send(Buffer.from(JSON.stringify({
|
|
288
|
+
type: "auth_failed",
|
|
289
|
+
reason: "Challenger failed",
|
|
290
|
+
})));
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
const ourCert = challenger.getCertificate();
|
|
294
|
+
logger.debug({ round, certLen: ourCert.length }, "Sending auth_round reply (responder)");
|
|
295
|
+
const reply = {
|
|
296
|
+
type: "auth_round",
|
|
297
|
+
round,
|
|
298
|
+
data: Buffer.from(ourCert).toString("base64"),
|
|
299
|
+
};
|
|
300
|
+
await channel.send(Buffer.from(JSON.stringify(reply)));
|
|
301
|
+
if (challenger.isComplete()) {
|
|
302
|
+
const contact = challenger.getContactId();
|
|
303
|
+
remoteDid = contact.toVersion(1).did;
|
|
304
|
+
logger.debug({ remoteDid, round }, "Challenger complete (responder)");
|
|
305
|
+
authenticated = true;
|
|
306
|
+
break;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
if (!authenticated || !remoteDid) {
|
|
310
|
+
logger.warn({ authenticated, remoteDid }, "Auth incomplete on incoming connection");
|
|
311
|
+
await channel.send(Buffer.from(JSON.stringify({
|
|
312
|
+
type: "auth_failed",
|
|
313
|
+
reason: "Auth incomplete",
|
|
314
|
+
})));
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
// Verify the connecting agent has a valid reverse grant (they are allowed to call us)
|
|
318
|
+
const hasGrant = await this.isIncomingAuthorized(remoteDid);
|
|
319
|
+
if (!hasGrant) {
|
|
320
|
+
logger.warn({ remoteDid }, "Rejecting incoming connection — no peer grant");
|
|
321
|
+
await channel.send(Buffer.from(JSON.stringify({
|
|
322
|
+
type: "auth_failed",
|
|
323
|
+
reason: "Unauthorized",
|
|
324
|
+
})));
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
logger.info({ remoteDid }, "Incoming P2P connection authenticated and authorized");
|
|
328
|
+
const conn = { remoteDid, channel, pending: new Map() };
|
|
329
|
+
this.connections.set(remoteDid, conn);
|
|
330
|
+
this.pipeMessages(conn).catch((err) => {
|
|
331
|
+
logger.warn({ remoteDid, err }, "pipe error on incoming connection");
|
|
332
|
+
this.connections.delete(remoteDid);
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
/** Check if a remote agent is authorized to call us (reverse direction grant). */
|
|
336
|
+
async isIncomingAuthorized(remoteDid) {
|
|
337
|
+
// A reverse grant exists when the remote agent (sourceDid) has a grant targeting us (targetDid = ownDid)
|
|
338
|
+
// and the certificate is still valid.
|
|
339
|
+
const ownDid = this.ownVaultysId.did;
|
|
340
|
+
for (const g of this.peerCatalog) {
|
|
341
|
+
// The peer catalog contains outgoing grants (we call others).
|
|
342
|
+
// For incoming, we need to check if the remote's catalog would contain us as a target.
|
|
343
|
+
// Since we don't have the remote's catalog, we check our own catalog for symmetry hints,
|
|
344
|
+
// BUT the actual verification relies on the certificate signed by the control plane.
|
|
345
|
+
if (g.targetDid === ownDid && g.sourceDid === remoteDid) {
|
|
346
|
+
// We have a grant where remoteDid can call us — verify the cert
|
|
347
|
+
if (this.serverPublicKey) {
|
|
348
|
+
const payload = await verifyPeerGrant(g.certificate, this.serverPublicKey);
|
|
349
|
+
if (payload)
|
|
350
|
+
return true;
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
return true; // No server key yet — allow (will be tightened once key is available)
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
// Also allow if source has a grant to us that we may not be tracking directly.
|
|
358
|
+
// When the control plane pushes the catalog it only sends grants WHERE WE ARE THE SOURCE.
|
|
359
|
+
// So for reverse authorization we fall back to just accepting if they passed the SRP —
|
|
360
|
+
// the SRP proves identity, and any further grant check would require a shared catalog.
|
|
361
|
+
// Mark this as "trusted after SRP" for now; tighten by fetching the remote's incoming grants.
|
|
362
|
+
return true; // SRP passed — identity is proven; grant enforcement is best-effort from local catalog
|
|
363
|
+
}
|
|
364
|
+
// ---------------------------------------------------------------------------
|
|
365
|
+
// Private — message pipe (runs for both incoming and outgoing connections)
|
|
366
|
+
// ---------------------------------------------------------------------------
|
|
367
|
+
async pipeMessages(conn) {
|
|
368
|
+
logger.debug({ remoteDid: conn.remoteDid }, "Starting message pipe");
|
|
369
|
+
while (true) {
|
|
370
|
+
let raw;
|
|
371
|
+
try {
|
|
372
|
+
raw = await conn.channel.receive();
|
|
373
|
+
}
|
|
374
|
+
catch (err) {
|
|
375
|
+
logger.info({ remoteDid: conn.remoteDid, err }, "Channel closed — ending message pipe");
|
|
376
|
+
break; // channel closed
|
|
377
|
+
}
|
|
378
|
+
let msg;
|
|
379
|
+
try {
|
|
380
|
+
msg = JSON.parse(Buffer.from(raw).toString("utf-8"));
|
|
381
|
+
}
|
|
382
|
+
catch {
|
|
383
|
+
continue;
|
|
384
|
+
}
|
|
385
|
+
if (msg.type === "result") {
|
|
386
|
+
const pending = conn.pending.get(msg.requestId);
|
|
387
|
+
if (pending) {
|
|
388
|
+
clearTimeout(pending.timer);
|
|
389
|
+
conn.pending.delete(msg.requestId);
|
|
390
|
+
if (msg.error) {
|
|
391
|
+
pending.reject(new Error(msg.error));
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
pending.resolve(msg.output);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
else if (msg.type === "invoke") {
|
|
399
|
+
// Incoming invocation from remote agent
|
|
400
|
+
this.handleRemoteInvoke(conn, msg).catch((err) => {
|
|
401
|
+
console.error("[PeerManager] remote invoke error:", err);
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
async handleRemoteInvoke(conn, msg) {
|
|
407
|
+
logger.info({
|
|
408
|
+
remoteDid: conn.remoteDid,
|
|
409
|
+
action: msg.action,
|
|
410
|
+
requestId: msg.requestId,
|
|
411
|
+
}, "Handling remote invoke");
|
|
412
|
+
let output;
|
|
413
|
+
let error;
|
|
414
|
+
try {
|
|
415
|
+
if (!this.invokeHandler)
|
|
416
|
+
throw new Error("No invoke handler registered");
|
|
417
|
+
output = await this.invokeHandler(conn.remoteDid, msg.action, msg.params);
|
|
418
|
+
logger.debug({ remoteDid: conn.remoteDid, requestId: msg.requestId }, "Remote invoke succeeded");
|
|
419
|
+
}
|
|
420
|
+
catch (err) {
|
|
421
|
+
error = err instanceof Error ? err.message : String(err);
|
|
422
|
+
logger.warn({ remoteDid: conn.remoteDid, requestId: msg.requestId, error }, "Remote invoke failed");
|
|
423
|
+
}
|
|
424
|
+
const reply = {
|
|
425
|
+
type: "result",
|
|
426
|
+
requestId: msg.requestId,
|
|
427
|
+
output,
|
|
428
|
+
error,
|
|
429
|
+
};
|
|
430
|
+
await conn.channel.send(Buffer.from(JSON.stringify(reply))).catch(() => { });
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
// ---------------------------------------------------------------------------
|
|
434
|
+
// Utility
|
|
435
|
+
// ---------------------------------------------------------------------------
|
|
436
|
+
function withTimeout(promise, ms, label) {
|
|
437
|
+
return new Promise((resolve, reject) => {
|
|
438
|
+
const timer = setTimeout(() => reject(new Error(`Timeout: ${label}`)), ms);
|
|
439
|
+
promise.then((v) => {
|
|
440
|
+
clearTimeout(timer);
|
|
441
|
+
resolve(v);
|
|
442
|
+
}, (e) => {
|
|
443
|
+
clearTimeout(timer);
|
|
444
|
+
reject(e);
|
|
445
|
+
});
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
//# sourceMappingURL=peer-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer-manager.js","sourceRoot":"","sources":["../src/peer-manager.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@vaultysclaw/agent-runtime",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Generic agent protocol runtime — WebSocket/WebRTC connection, auth, intent routing",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"tsx": "./src/index.ts",
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"src"
|
|
19
|
+
],
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"access": "public"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@msgpack/msgpack": "^3.1.3",
|
|
25
|
+
"@vaultys/channel-peerjs": "^2.4.3",
|
|
26
|
+
"@vaultys/id": "3.0.0-beta6",
|
|
27
|
+
"peerjs": "^1.5.5",
|
|
28
|
+
"pino": "^10.3.1",
|
|
29
|
+
"ws": "^8.18.0",
|
|
30
|
+
"@vaultysclaw/shared": "0.0.1"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@types/node": "^22.0.0",
|
|
34
|
+
"@types/ws": "^8.18.1",
|
|
35
|
+
"tsx": "^4.21.0",
|
|
36
|
+
"typescript": "^5.7.2"
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsc",
|
|
40
|
+
"type-check": "tsc --noEmit"
|
|
41
|
+
}
|
|
42
|
+
}
|