@perkos/perkos-a2a 0.9.2 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bridge-agent.js +89 -4
- package/dist/bridge-agent.js.map +1 -1
- package/dist/conv-registry.d.ts +32 -0
- package/dist/conv-registry.d.ts.map +1 -0
- package/dist/conv-registry.js +56 -0
- package/dist/conv-registry.js.map +1 -0
- package/dist/gateway-health.d.ts +84 -0
- package/dist/gateway-health.d.ts.map +1 -0
- package/dist/gateway-health.js +148 -0
- package/dist/gateway-health.js.map +1 -0
- package/dist/tools-jwt.d.ts +12 -0
- package/dist/tools-jwt.d.ts.map +1 -0
- package/dist/tools-jwt.js +33 -0
- package/dist/tools-jwt.js.map +1 -0
- package/dist/tools-token-listener.d.ts +50 -0
- package/dist/tools-token-listener.d.ts.map +1 -0
- package/dist/tools-token-listener.js +128 -0
- package/dist/tools-token-listener.js.map +1 -0
- package/package.json +6 -3
package/dist/bridge-agent.js
CHANGED
|
@@ -11,10 +11,13 @@
|
|
|
11
11
|
* A2A_AGENT_NAME=hermes A2A_RUNTIME=hermes-api HERMES_API_URL=http://127.0.0.1:8642 perkos-a2a-agent
|
|
12
12
|
*/
|
|
13
13
|
import { readFileSync } from "fs";
|
|
14
|
-
import { randomUUID } from "crypto";
|
|
14
|
+
import { randomBytes, randomUUID } from "crypto";
|
|
15
15
|
import { createServer as createHttpServer } from "node:http";
|
|
16
16
|
import { A2AServer } from "./server.js";
|
|
17
17
|
import { ChatClient } from "./chat-client.js";
|
|
18
|
+
import { ConvRegistry } from "./conv-registry.js";
|
|
19
|
+
import { startGatewayHealthReporter } from "./gateway-health.js";
|
|
20
|
+
import { startToolsTokenListener } from "./tools-token-listener.js";
|
|
18
21
|
function argValue(flag) {
|
|
19
22
|
const idx = process.argv.indexOf(flag);
|
|
20
23
|
if (idx === -1)
|
|
@@ -84,6 +87,25 @@ function loadConfig() {
|
|
|
84
87
|
function chatReplyPort() {
|
|
85
88
|
return Number(process.env.A2A_CHAT_REPLY_PORT || "5060");
|
|
86
89
|
}
|
|
90
|
+
/** Port the bridge listens on for Tools-API JWT mint requests. */
|
|
91
|
+
function toolsTokenPort() {
|
|
92
|
+
return Number(process.env.A2A_TOOLS_TOKEN_PORT || "5070");
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Bridge-auth secret used by the Tools-API token listener. Read from
|
|
96
|
+
* env if provided (so multi-process deployments can pre-share it with
|
|
97
|
+
* the Hermes plugin); otherwise generate a random one and surface it
|
|
98
|
+
* via an env var the same container can read. This keeps single-host
|
|
99
|
+
* deployments zero-config.
|
|
100
|
+
*/
|
|
101
|
+
function resolveBridgeAuthSecret() {
|
|
102
|
+
const fromEnv = process.env.A2A_BRIDGE_AUTH_SECRET?.trim();
|
|
103
|
+
if (fromEnv && fromEnv.length >= 16)
|
|
104
|
+
return fromEnv;
|
|
105
|
+
const generated = randomBytes(24).toString("hex");
|
|
106
|
+
process.env.A2A_BRIDGE_AUTH_SECRET = generated;
|
|
107
|
+
return generated;
|
|
108
|
+
}
|
|
87
109
|
function taskMarker(task) {
|
|
88
110
|
return `[A2A_RESULT:${task.id}]`;
|
|
89
111
|
}
|
|
@@ -141,6 +163,8 @@ function parseWalletFromIdentity(identity) {
|
|
|
141
163
|
function buildChatMessage(frame) {
|
|
142
164
|
const walletAddress = parseWalletFromIdentity(frame.from);
|
|
143
165
|
const marker = `[PERKOS_CHAT:${frame.convId}]`;
|
|
166
|
+
const toolsApiUrl = process.env.A2A_TOOLS_API_URL?.trim();
|
|
167
|
+
const toolsTokenEndpoint = `http://127.0.0.1:${toolsTokenPort()}/v1/tools-token`;
|
|
144
168
|
return [
|
|
145
169
|
marker,
|
|
146
170
|
`From: ${frame.from}`,
|
|
@@ -151,6 +175,17 @@ function buildChatMessage(frame) {
|
|
|
151
175
|
"To respond, POST to http://127.0.0.1:<A2A_CHAT_REPLY_PORT>/chat/reply with:",
|
|
152
176
|
` { "convId": "${frame.convId}", "walletAddress": "${walletAddress ?? ""}", "text": "<your reply>" }`,
|
|
153
177
|
"",
|
|
178
|
+
toolsApiUrl
|
|
179
|
+
? [
|
|
180
|
+
"PerkOS Tools API is available for this conversation:",
|
|
181
|
+
` - Base URL: ${toolsApiUrl}`,
|
|
182
|
+
` - To call a tool, first POST to ${toolsTokenEndpoint} with`,
|
|
183
|
+
` { "convId": "${frame.convId}" }`,
|
|
184
|
+
" and X-Bridge-Auth: <A2A_BRIDGE_AUTH_SECRET> to mint a short-lived JWT.",
|
|
185
|
+
" - Then POST to <toolsApiUrl>/v1/tools/<toolName> with Authorization: Bearer <token>.",
|
|
186
|
+
].join("\n")
|
|
187
|
+
: "",
|
|
188
|
+
"",
|
|
154
189
|
"Message body:",
|
|
155
190
|
frame.text,
|
|
156
191
|
].filter(Boolean).join("\n");
|
|
@@ -267,6 +302,13 @@ async function main() {
|
|
|
267
302
|
});
|
|
268
303
|
await server.start();
|
|
269
304
|
logger.info(`[perkos-a2a] standalone bridge running for ${config.agentName} (${config.runtime?.kind || "hermes"})`);
|
|
305
|
+
// Kick off the messaging-gateways health report. Fire-and-forget —
|
|
306
|
+
// a slow POST must never block bridge startup. The reporter waits
|
|
307
|
+
// PERKOS_GATEWAY_REPORT_DELAY_MS (default 30s) before POSTing so
|
|
308
|
+
// Hermes has had a chance to actually attempt platform connect.
|
|
309
|
+
// No-ops cleanly when PERKOS_AGENT_ID/A2A_AGENT_NAME/A2A_RELAY_API_KEY
|
|
310
|
+
// aren't set (older deploys).
|
|
311
|
+
void startGatewayHealthReporter({ logger });
|
|
270
312
|
// -------------------------------------------------------------------------
|
|
271
313
|
// Optional: PerkOS-Chat client for user-facing conversations.
|
|
272
314
|
//
|
|
@@ -277,6 +319,8 @@ async function main() {
|
|
|
277
319
|
// -------------------------------------------------------------------------
|
|
278
320
|
let chat = null;
|
|
279
321
|
let stopChatListener = null;
|
|
322
|
+
let stopToolsTokenListener = null;
|
|
323
|
+
const convRegistry = new ConvRegistry();
|
|
280
324
|
const chatCfg = config.chat;
|
|
281
325
|
if (chatCfg?.enabled && chatCfg.apiKey) {
|
|
282
326
|
chat = new ChatClient({
|
|
@@ -286,6 +330,9 @@ async function main() {
|
|
|
286
330
|
logger,
|
|
287
331
|
onChatDeliver: async (frame) => {
|
|
288
332
|
try {
|
|
333
|
+
const wallet = parseWalletFromIdentity(frame.from);
|
|
334
|
+
if (wallet)
|
|
335
|
+
convRegistry.touch(frame.convId, wallet, "user");
|
|
289
336
|
await deliverToHermes(config, buildChatMessage(frame));
|
|
290
337
|
}
|
|
291
338
|
catch (err) {
|
|
@@ -303,14 +350,52 @@ async function main() {
|
|
|
303
350
|
else if (chatCfg?.enabled && !chatCfg.apiKey) {
|
|
304
351
|
logger.error("[perkos-chat] chat.enabled=true but no apiKey (set A2A_CHAT_API_KEY or A2A_RELAY_API_KEY)");
|
|
305
352
|
}
|
|
306
|
-
|
|
353
|
+
// Tools-API token listener. Only starts when both env vars are set,
|
|
354
|
+
// since the runtime plugin can't call the API without them anyway.
|
|
355
|
+
const toolsJwtSecret = process.env.A2A_TOOLS_JWT_SECRET?.trim();
|
|
356
|
+
const toolsApiUrl = process.env.A2A_TOOLS_API_URL?.trim();
|
|
357
|
+
if (toolsJwtSecret && toolsApiUrl) {
|
|
358
|
+
if (toolsJwtSecret.length < 32) {
|
|
359
|
+
logger.error("[tools-token] A2A_TOOLS_JWT_SECRET must be >=32 chars; listener disabled");
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
const bridgeAuthSecret = resolveBridgeAuthSecret();
|
|
363
|
+
const ttl = Number(process.env.A2A_TOOLS_TOKEN_TTL_SECONDS || "60");
|
|
364
|
+
convRegistry.startReaper();
|
|
365
|
+
const { stop } = startToolsTokenListener({
|
|
366
|
+
port: toolsTokenPort(),
|
|
367
|
+
bridgeAuthSecret,
|
|
368
|
+
toolsJwtSecret,
|
|
369
|
+
toolsApiUrl,
|
|
370
|
+
registry: convRegistry,
|
|
371
|
+
tokenTtlSeconds: Number.isFinite(ttl) ? ttl : 60,
|
|
372
|
+
logger: {
|
|
373
|
+
info: (m) => logger.info(m),
|
|
374
|
+
error: (m) => logger.error(m),
|
|
375
|
+
},
|
|
376
|
+
});
|
|
377
|
+
stopToolsTokenListener = stop;
|
|
378
|
+
logger.info(`[tools-token] enabled (tools API: ${toolsApiUrl}); plugin must present A2A_BRIDGE_AUTH_SECRET`);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
else if (toolsJwtSecret || toolsApiUrl) {
|
|
382
|
+
logger.warn?.("[tools-token] partial config — both A2A_TOOLS_JWT_SECRET and A2A_TOOLS_API_URL are required; listener disabled");
|
|
383
|
+
}
|
|
384
|
+
const stop = async () => {
|
|
307
385
|
logger.info("[perkos-a2a] standalone bridge shutting down");
|
|
308
386
|
chat?.stop();
|
|
309
387
|
stopChatListener?.();
|
|
388
|
+
convRegistry.stopReaper();
|
|
389
|
+
if (stopToolsTokenListener) {
|
|
390
|
+
try {
|
|
391
|
+
await stopToolsTokenListener();
|
|
392
|
+
}
|
|
393
|
+
catch { /* swallow */ }
|
|
394
|
+
}
|
|
310
395
|
process.exit(0);
|
|
311
396
|
};
|
|
312
|
-
process.on("SIGINT", stop);
|
|
313
|
-
process.on("SIGTERM", stop);
|
|
397
|
+
process.on("SIGINT", () => void stop());
|
|
398
|
+
process.on("SIGTERM", () => void stop());
|
|
314
399
|
}
|
|
315
400
|
main().catch((err) => {
|
|
316
401
|
console.error(`[perkos-a2a] standalone bridge failed: ${err instanceof Error ? err.stack || err.message : String(err)}`);
|
package/dist/bridge-agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge-agent.js","sourceRoot":"","sources":["../src/bridge-agent.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bridge-agent.js","sourceRoot":"","sources":["../src/bridge-agent.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAIpE,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACjC,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,YAAY,CAAI,IAAY,EAAE,QAAW;IAChD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG;QAAE,OAAO,QAAQ,CAAC;IAC1B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,wBAAwB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACrG,CAAC;AACH,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACpF,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAoB,CAAC;IACzE,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;IAC1F,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO;QAChD,IAAI;QACJ,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,SAAS;QAChD,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;QACrC,IAAI,EAAG,OAAO,CAAC,GAAG,CAAC,QAAoC,IAAI,MAAM;QACjE,MAAM,EAAE,YAAY,CAAC,YAAY,EAAE,EAAE,CAAC;QACtC,KAAK,EAAE,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;QACpC,QAAQ,EAAE,YAAY,CAAC,eAAe,EAAE,EAAE,CAAC;QAC3C,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;YAC5B,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;YAC5G,CAAC,CAAC,SAAS;QACb,KAAK,EAAE,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa;YAC9C,CAAC,CAAC;gBACE,OAAO,EAAE,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;gBAC3D,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE;gBACpC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE;gBAC3C,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC5F,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;aAChG;YACH,CAAC,CAAC,SAAS;QACb,OAAO,EAAE;YACP,IAAI,EAAG,OAAO,CAAC,GAAG,CAAC,WAA6G,IAAI,QAAQ;YAC5I,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;YACvC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;YAC3C,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB;YACnF,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB;SACtD;QACD,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,WAAW,EAAE,KAAK,MAAM;YAC1D,CAAC,CAAC;gBACE,OAAO,EAAE,IAAI;gBACb,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,4BAA4B;gBAC7D,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE;gBAC3E,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB;gBAC1C,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB;oBACrD,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;oBAC5C,CAAC,CAAC,SAAS;aACd;YACH,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,SAAS,aAAa;IACpB,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,MAAM,CAAC,CAAC;AAC3D,CAAC;AAED,kEAAkE;AAClE,SAAS,cAAc;IACrB,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,MAAM,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;;GAMG;AACH,SAAS,uBAAuB;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,EAAE,CAAC;IAC3D,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE;QAAE,OAAO,OAAO,CAAC;IACpD,MAAM,SAAS,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,SAAS,CAAC;IAC/C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,IAAU;IAC5B,OAAO,eAAe,IAAI,CAAC,EAAE,GAAG,CAAC;AACnC,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAU,EAAE,IAAY;IACnD,MAAM,IAAI,GAAI,IAAI,CAAC,QAAQ,EAAE,SAAoB,IAAI,SAAS,CAAC;IAC/D,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO;QACL,MAAM;QACN,SAAS,IAAI,EAAE;QACf,YAAY,IAAI,CAAC,EAAE,EAAE;QACrB,eAAe,IAAI,CAAC,SAAS,EAAE;QAC/B,EAAE;QACF,qFAAqF;QACrF,8CAA8C,MAAM,EAAE;QACtD,mDAAmD;QACnD,EAAE;QACF,IAAI;KACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,MAAuB,EAAE,OAAe;IACrE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,uBAAuB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrJ,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,eAAe,CAAC;IACvI,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,KAAK,CAAC;IAClH,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IACxK,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,EAAE,CAAC;IAChF,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,qBAAqB,EAAE,UAAU;QACjC,sBAAsB,EAAE,UAAU;KACnC,CAAC;IACF,IAAI,KAAK;QAAE,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;IAErD,MAAM,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,kBAAkB,CAAC,UAAU,CAAC,sBAAsB,CAAC;QAChE,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,cAAc,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE;QACtH,CAAC,CAAC,kBAAkB,CAAC,UAAU,CAAC,UAAU,CAAC;YACzC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE;YAC5C,CAAC,CAAC,kBAAkB,CAAC,UAAU,CAAC,eAAe,CAAC;gBAC9C,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;gBACpF,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;IAEhC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3F,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,MAAM,QAAQ,GAAG,KAAK,IAAI,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/G,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,SAAS,uBAAuB,CAAC,QAAgB;IAC/C,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/E,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3D,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAiD;IACzE,MAAM,aAAa,GAAG,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,gBAAgB,KAAK,CAAC,MAAM,GAAG,CAAC;IAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAC1D,MAAM,kBAAkB,GAAG,oBAAoB,cAAc,EAAE,iBAAiB,CAAC;IACjF,OAAO;QACL,MAAM;QACN,SAAS,KAAK,CAAC,IAAI,EAAE;QACrB,iBAAiB,KAAK,CAAC,MAAM,EAAE;QAC/B,aAAa,CAAC,CAAC,CAAC,WAAW,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE;QAC/C,EAAE;QACF,+DAA+D;QAC/D,6EAA6E;QAC7E,kBAAkB,KAAK,CAAC,MAAM,wBAAwB,aAAa,IAAI,EAAE,6BAA6B;QACtG,EAAE;QACF,WAAW;YACT,CAAC,CAAC;gBACE,sDAAsD;gBACtD,iBAAiB,WAAW,EAAE;gBAC9B,qCAAqC,kBAAkB,OAAO;gBAC9D,sBAAsB,KAAK,CAAC,MAAM,KAAK;gBACvC,4EAA4E;gBAC5E,wFAAwF;aACzF,CAAC,IAAI,CAAC,IAAI,CAAC;YACd,CAAC,CAAC,EAAE;QACN,EAAE;QACF,eAAe;QACf,KAAK,CAAC,IAAI;KACX,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,sBAAsB,CAAC,IAAgB,EAAE,IAAY,EAAE,MAAe;IAC7E,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACjD,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,aAAa,EAAE,CAAC;YACvD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;iBACvD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QACD,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACxB,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,OAAO;YAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9E,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;YACvB,IAAI,IAAkF,CAAC;YACvF,IAAI,CAAC;gBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;qBACvD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACtD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;qBACvD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,yCAAyC,EAAE,CAAC,CAAC,CAAC;gBAC7E,OAAO;YACT,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;qBACvD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,uEAAuE,EAAE,CAAC,CAAC,CAAC;gBAC3G,4DAA4D;YAC9D,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC;oBAClC,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,aAAa,EAAE,IAAI,CAAC,aAAa;oBACjC,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,IAAI,CAAC,OAAO;iBACtB,CAAC,CAAC;gBACH,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;oBACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;yBACvD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBACjC,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;oBACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;yBACvD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,IAAI,CAAC,0DAA0D,IAAI,aAAa,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;AAC9B,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,OAAO,CAAC;IACvB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE7C,MAAM,CAAC,oBAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC/C,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,QAAQ,CAAC;QACrD,IAAI,CAAC,MAAM,GAAG;YACZ,KAAK,EAAE,SAAS;YAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,WAAW,WAAW,EAAE,CAAC,EAAE;SAC1G,CAAC;QAEF,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,YAAY,CAAC,EAAE,CAAC;YAC/D,MAAM,eAAe,CAAC,MAAM,EAAE,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YAC/D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAClB,IAAI,EAAE,UAAU;gBAChB,UAAU,EAAE,UAAU,EAAE;gBACxB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iCAAiC,EAAE,CAAC;aACnE,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAClB,IAAI,EAAE,UAAU;gBAChB,UAAU,EAAE,UAAU,EAAE;gBACxB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;aAC9D,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,uBAAuB,WAAW,yEAAyE,CAAC,CAAC;IAC/H,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,qBAAqB,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE;QAC/C,IAAI,CAAC,MAAM,GAAG;YACZ,KAAK,EAAE,QAAQ;YACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE;SACvE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACrB,MAAM,CAAC,IAAI,CAAC,8CAA8C,MAAM,CAAC,SAAS,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEpH,mEAAmE;IACnE,kEAAkE;IAClE,iEAAiE;IACjE,gEAAgE;IAChE,uEAAuE;IACvE,8BAA8B;IAC9B,KAAK,0BAA0B,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAE5C,4EAA4E;IAC5E,8DAA8D;IAC9D,EAAE;IACF,4EAA4E;IAC5E,4EAA4E;IAC5E,qEAAqE;IACrE,wDAAwD;IACxD,4EAA4E;IAE5E,IAAI,IAAI,GAAsB,IAAI,CAAC;IACnC,IAAI,gBAAgB,GAAwB,IAAI,CAAC;IACjD,IAAI,sBAAsB,GAAiC,IAAI,CAAC;IAChE,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IAExC,MAAM,OAAO,GAA2B,MAAM,CAAC,IAAI,CAAC;IACpD,IAAI,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACvC,IAAI,GAAG,IAAI,UAAU,CAAC;YACpB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,MAAM,EAAE,OAAO;YACf,QAAQ,EAAE;gBACR,MAAM;gBACN,aAAa,EAAE,KAAK,EAAE,KAAiD,EAAE,EAAE;oBACzE,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBACnD,IAAI,MAAM;4BAAE,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;wBAC7D,MAAM,eAAe,CAAC,MAAM,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;oBACzD,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,MAAM,CAAC,KAAK,CAAC,yCAAyC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAC5G,CAAC;gBACH,CAAC;gBACD,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBAC7B,MAAM,CAAC,IAAI,CAAC,6BAA6B,KAAK,CAAC,MAAM,WAAW,KAAK,CAAC,WAAW,KAAK,KAAK,CAAC,YAAY,CAAC,MAAM,gBAAgB,CAAC,CAAC;gBACnI,CAAC;aACF;SACF,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,gBAAgB,GAAG,sBAAsB,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,MAAM,CAAC,CAAC;IAC3E,CAAC;SAAM,IAAI,OAAO,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,2FAA2F,CAAC,CAAC;IAC5G,CAAC;IAED,oEAAoE;IACpE,mEAAmE;IACnE,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,EAAE,CAAC;IAChE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAC1D,IAAI,cAAc,IAAI,WAAW,EAAE,CAAC;QAClC,IAAI,cAAc,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC/B,MAAM,CAAC,KAAK,CACV,0EAA0E,CAC3E,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,gBAAgB,GAAG,uBAAuB,EAAE,CAAC;YACnD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,IAAI,CAAC,CAAC;YACpE,YAAY,CAAC,WAAW,EAAE,CAAC;YAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,uBAAuB,CAAC;gBACvC,IAAI,EAAE,cAAc,EAAE;gBACtB,gBAAgB;gBAChB,cAAc;gBACd,WAAW;gBACX,QAAQ,EAAE,YAAY;gBACtB,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBAChD,MAAM,EAAE;oBACN,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;oBAC3B,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;iBAC9B;aACF,CAAC,CAAC;YACH,sBAAsB,GAAG,IAAI,CAAC;YAC9B,MAAM,CAAC,IAAI,CACT,qCAAqC,WAAW,+CAA+C,CAChG,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,cAAc,IAAI,WAAW,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,EAAE,CACX,gHAAgH,CACjH,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACtB,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC5D,IAAI,EAAE,IAAI,EAAE,CAAC;QACb,gBAAgB,EAAE,EAAE,CAAC;QACrB,YAAY,CAAC,UAAU,EAAE,CAAC;QAC1B,IAAI,sBAAsB,EAAE,CAAC;YAC3B,IAAI,CAAC;gBAAC,MAAM,sBAAsB,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,0CAA0C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracks active chat conversations the bridge is currently relaying.
|
|
3
|
+
*
|
|
4
|
+
* Used by `tools-token-listener` to authorize Tools-API token mints:
|
|
5
|
+
* the listener will only mint a token for a convId that the bridge has
|
|
6
|
+
* seen a chat_deliver for in the last `staleAfterMs` window. This binds
|
|
7
|
+
* the wallet to the conv server-side — the runtime cannot ask for a
|
|
8
|
+
* token for a wallet that isn't its current caller.
|
|
9
|
+
*/
|
|
10
|
+
export type Role = "user" | "admin";
|
|
11
|
+
export type ConvEntry = {
|
|
12
|
+
wallet: string;
|
|
13
|
+
role: Role;
|
|
14
|
+
lastSeen: number;
|
|
15
|
+
};
|
|
16
|
+
export declare class ConvRegistry {
|
|
17
|
+
private readonly map;
|
|
18
|
+
private readonly staleAfterMs;
|
|
19
|
+
private reaper;
|
|
20
|
+
constructor(opts?: {
|
|
21
|
+
staleAfterMs?: number;
|
|
22
|
+
});
|
|
23
|
+
/** Record that the bridge is currently handling a chat for this wallet/conv. */
|
|
24
|
+
touch(convId: string, wallet: string, role?: Role): void;
|
|
25
|
+
/** Lookup — returns undefined if the conv is unknown or stale. */
|
|
26
|
+
get(convId: string): ConvEntry | undefined;
|
|
27
|
+
size(): number;
|
|
28
|
+
startReaper(intervalMs?: number): void;
|
|
29
|
+
stopReaper(): void;
|
|
30
|
+
private sweep;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=conv-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conv-registry.d.ts","sourceRoot":"","sources":["../src/conv-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpC,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgC;IACpD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,MAAM,CAA+B;gBAEjC,IAAI,GAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAO;IAIhD,gFAAgF;IAChF,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,IAAa,GAAG,IAAI;IAIhE,kEAAkE;IAClE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAU1C,IAAI,IAAI,MAAM;IAId,WAAW,CAAC,UAAU,SAAS,GAAG,IAAI;IAOtC,UAAU,IAAI,IAAI;IAOlB,OAAO,CAAC,KAAK;CAMd"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracks active chat conversations the bridge is currently relaying.
|
|
3
|
+
*
|
|
4
|
+
* Used by `tools-token-listener` to authorize Tools-API token mints:
|
|
5
|
+
* the listener will only mint a token for a convId that the bridge has
|
|
6
|
+
* seen a chat_deliver for in the last `staleAfterMs` window. This binds
|
|
7
|
+
* the wallet to the conv server-side — the runtime cannot ask for a
|
|
8
|
+
* token for a wallet that isn't its current caller.
|
|
9
|
+
*/
|
|
10
|
+
export class ConvRegistry {
|
|
11
|
+
map = new Map();
|
|
12
|
+
staleAfterMs;
|
|
13
|
+
reaper = null;
|
|
14
|
+
constructor(opts = {}) {
|
|
15
|
+
this.staleAfterMs = opts.staleAfterMs ?? 10 * 60 * 1000;
|
|
16
|
+
}
|
|
17
|
+
/** Record that the bridge is currently handling a chat for this wallet/conv. */
|
|
18
|
+
touch(convId, wallet, role = "user") {
|
|
19
|
+
this.map.set(convId, { wallet: wallet.toLowerCase(), role, lastSeen: Date.now() });
|
|
20
|
+
}
|
|
21
|
+
/** Lookup — returns undefined if the conv is unknown or stale. */
|
|
22
|
+
get(convId) {
|
|
23
|
+
const entry = this.map.get(convId);
|
|
24
|
+
if (!entry)
|
|
25
|
+
return undefined;
|
|
26
|
+
if (Date.now() - entry.lastSeen > this.staleAfterMs) {
|
|
27
|
+
this.map.delete(convId);
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
return entry;
|
|
31
|
+
}
|
|
32
|
+
size() {
|
|
33
|
+
return this.map.size;
|
|
34
|
+
}
|
|
35
|
+
startReaper(intervalMs = 60_000) {
|
|
36
|
+
if (this.reaper)
|
|
37
|
+
return;
|
|
38
|
+
this.reaper = setInterval(() => this.sweep(), intervalMs);
|
|
39
|
+
// Reaper is a maintenance task; don't keep the event loop alive for it.
|
|
40
|
+
this.reaper.unref?.();
|
|
41
|
+
}
|
|
42
|
+
stopReaper() {
|
|
43
|
+
if (this.reaper) {
|
|
44
|
+
clearInterval(this.reaper);
|
|
45
|
+
this.reaper = null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
sweep() {
|
|
49
|
+
const cutoff = Date.now() - this.staleAfterMs;
|
|
50
|
+
for (const [convId, entry] of this.map) {
|
|
51
|
+
if (entry.lastSeen < cutoff)
|
|
52
|
+
this.map.delete(convId);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=conv-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conv-registry.js","sourceRoot":"","sources":["../src/conv-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,MAAM,OAAO,YAAY;IACN,GAAG,GAAG,IAAI,GAAG,EAAqB,CAAC;IACnC,YAAY,CAAS;IAC9B,MAAM,GAA0B,IAAI,CAAC;IAE7C,YAAY,OAAkC,EAAE;QAC9C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC1D,CAAC;IAED,gFAAgF;IAChF,KAAK,CAAC,MAAc,EAAE,MAAc,EAAE,OAAa,MAAM;QACvD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,kEAAkE;IAClE,GAAG,CAAC,MAAc;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACpD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,WAAW,CAAC,UAAU,GAAG,MAAM;QAC7B,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,UAAU,CAAC,CAAC;QAC1D,wEAAwE;QACxE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;IACxB,CAAC;IAED,UAAU;QACR,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAEO,KAAK;QACX,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC;QAC9C,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACvC,IAAI,KAAK,CAAC,QAAQ,GAAG,MAAM;gBAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway health reporter.
|
|
3
|
+
*
|
|
4
|
+
* The PerkOS mini-app's `POST /api/agents/[agentId]/gateways/[type]/status`
|
|
5
|
+
* route flips a gateway's status from "pending" (set when the wallet
|
|
6
|
+
* configures it in the wizard) to "active" or "error". Without
|
|
7
|
+
* something calling it, every gateway sits at "pending" forever in
|
|
8
|
+
* the admin panel even when it's actually responding to messages.
|
|
9
|
+
*
|
|
10
|
+
* This module is the bridge's side of that endpoint. At startup it
|
|
11
|
+
* reads the runtime's env to learn which gateways the operator
|
|
12
|
+
* enabled, waits a configurable amount of time to give Hermes a
|
|
13
|
+
* chance to actually attempt connect, then POSTs `active` for each
|
|
14
|
+
* configured gateway. POST failures are logged but never block the
|
|
15
|
+
* bridge — the admin panel staying at "pending" is preferable to a
|
|
16
|
+
* dead bridge.
|
|
17
|
+
*
|
|
18
|
+
* Why presence-based reporting (not real Hermes platform polling):
|
|
19
|
+
* Hermes upstream exposes connected-platform state only as a
|
|
20
|
+
* Python-internal getter (gateway/config.py: get_connected_platforms).
|
|
21
|
+
* There's no HTTP route we can hit from the sidecar without first
|
|
22
|
+
* building one. Reporting "active" for every configured gateway
|
|
23
|
+
* is the simplest signal that's better than the "pending forever"
|
|
24
|
+
* floor. Once Hermes adds the route (or we ship our own plugin
|
|
25
|
+
* that exposes it), this module can be extended to read real
|
|
26
|
+
* state without changing its contract with the mini-app.
|
|
27
|
+
*
|
|
28
|
+
* Inputs (env, all optional):
|
|
29
|
+
* PERKOS_AGENT_ID — per-wallet agent doc id (required to
|
|
30
|
+
* form the URL). Without it, we skip
|
|
31
|
+
* reporting silently (acceptable: the
|
|
32
|
+
* bridge predates the gateways feature
|
|
33
|
+
* in some deploys).
|
|
34
|
+
* A2A_AGENT_NAME — global agent name; sent as x-agent-name
|
|
35
|
+
* header so the gateways/status endpoint
|
|
36
|
+
* can verify the relay key.
|
|
37
|
+
* A2A_RELAY_API_KEY — bearer for the gateways/status endpoint
|
|
38
|
+
* (same secret the bridge already uses
|
|
39
|
+
* to authenticate to chat.perkos.xyz).
|
|
40
|
+
* PERKOS_GATEWAY_STATUS_URL — base URL, defaults to
|
|
41
|
+
* https://app.perkos.xyz/api/agents.
|
|
42
|
+
* PERKOS_GATEWAY_REPORT_DELAY_MS — how long to wait after bridge
|
|
43
|
+
* start before reporting. Default 30s.
|
|
44
|
+
*
|
|
45
|
+
* Inputs (env, per-gateway):
|
|
46
|
+
* TELEGRAM_ENABLED / FARCASTER_ENABLED / SLACK_ENABLED — set "true"
|
|
47
|
+
* by perkos-entrypoint.sh on the
|
|
48
|
+
* runtime container when the gateway
|
|
49
|
+
* has its required secrets. The
|
|
50
|
+
* ECS task def now passes these env
|
|
51
|
+
* vars to the bridge as well (see
|
|
52
|
+
* PerkOS#TBD).
|
|
53
|
+
*/
|
|
54
|
+
type Logger = {
|
|
55
|
+
info: (...args: unknown[]) => void;
|
|
56
|
+
warn: (...args: unknown[]) => void;
|
|
57
|
+
error: (...args: unknown[]) => void;
|
|
58
|
+
};
|
|
59
|
+
type Env = Readonly<Record<string, string | undefined>>;
|
|
60
|
+
export declare const KNOWN_GATEWAYS: readonly ["telegram", "farcaster", "slack"];
|
|
61
|
+
export type KnownGateway = (typeof KNOWN_GATEWAYS)[number];
|
|
62
|
+
export type GatewayHealthOptions = {
|
|
63
|
+
env?: Env;
|
|
64
|
+
logger?: Logger;
|
|
65
|
+
/** Override the fetch implementation (tests). */
|
|
66
|
+
fetcher?: typeof fetch;
|
|
67
|
+
/** Override the delay before posting (tests; default reads env). */
|
|
68
|
+
delayMs?: number;
|
|
69
|
+
};
|
|
70
|
+
export type ReportOutcome = {
|
|
71
|
+
gateway: KnownGateway;
|
|
72
|
+
ok: boolean;
|
|
73
|
+
status: number | null;
|
|
74
|
+
error?: string;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* One-shot reporter. Schedules itself after the configured delay,
|
|
78
|
+
* then resolves with the list of per-gateway outcomes. The bridge
|
|
79
|
+
* never awaits this; it's fire-and-forget so a slow POST can't
|
|
80
|
+
* delay agent boot.
|
|
81
|
+
*/
|
|
82
|
+
export declare function startGatewayHealthReporter(opts?: GatewayHealthOptions): Promise<ReportOutcome[]>;
|
|
83
|
+
export {};
|
|
84
|
+
//# sourceMappingURL=gateway-health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-health.d.ts","sourceRoot":"","sources":["../src/gateway-health.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AAEH,KAAK,MAAM,GAAG;IACZ,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACnC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACnC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACrC,CAAC;AAEF,KAAK,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AAExD,eAAO,MAAM,cAAc,6CAA8C,CAAC;AAC1E,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAa3D,MAAM,MAAM,oBAAoB,GAAG;IACjC,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,YAAY,CAAC;IACtB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,GAAE,oBAAyB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAwDpG"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway health reporter.
|
|
3
|
+
*
|
|
4
|
+
* The PerkOS mini-app's `POST /api/agents/[agentId]/gateways/[type]/status`
|
|
5
|
+
* route flips a gateway's status from "pending" (set when the wallet
|
|
6
|
+
* configures it in the wizard) to "active" or "error". Without
|
|
7
|
+
* something calling it, every gateway sits at "pending" forever in
|
|
8
|
+
* the admin panel even when it's actually responding to messages.
|
|
9
|
+
*
|
|
10
|
+
* This module is the bridge's side of that endpoint. At startup it
|
|
11
|
+
* reads the runtime's env to learn which gateways the operator
|
|
12
|
+
* enabled, waits a configurable amount of time to give Hermes a
|
|
13
|
+
* chance to actually attempt connect, then POSTs `active` for each
|
|
14
|
+
* configured gateway. POST failures are logged but never block the
|
|
15
|
+
* bridge — the admin panel staying at "pending" is preferable to a
|
|
16
|
+
* dead bridge.
|
|
17
|
+
*
|
|
18
|
+
* Why presence-based reporting (not real Hermes platform polling):
|
|
19
|
+
* Hermes upstream exposes connected-platform state only as a
|
|
20
|
+
* Python-internal getter (gateway/config.py: get_connected_platforms).
|
|
21
|
+
* There's no HTTP route we can hit from the sidecar without first
|
|
22
|
+
* building one. Reporting "active" for every configured gateway
|
|
23
|
+
* is the simplest signal that's better than the "pending forever"
|
|
24
|
+
* floor. Once Hermes adds the route (or we ship our own plugin
|
|
25
|
+
* that exposes it), this module can be extended to read real
|
|
26
|
+
* state without changing its contract with the mini-app.
|
|
27
|
+
*
|
|
28
|
+
* Inputs (env, all optional):
|
|
29
|
+
* PERKOS_AGENT_ID — per-wallet agent doc id (required to
|
|
30
|
+
* form the URL). Without it, we skip
|
|
31
|
+
* reporting silently (acceptable: the
|
|
32
|
+
* bridge predates the gateways feature
|
|
33
|
+
* in some deploys).
|
|
34
|
+
* A2A_AGENT_NAME — global agent name; sent as x-agent-name
|
|
35
|
+
* header so the gateways/status endpoint
|
|
36
|
+
* can verify the relay key.
|
|
37
|
+
* A2A_RELAY_API_KEY — bearer for the gateways/status endpoint
|
|
38
|
+
* (same secret the bridge already uses
|
|
39
|
+
* to authenticate to chat.perkos.xyz).
|
|
40
|
+
* PERKOS_GATEWAY_STATUS_URL — base URL, defaults to
|
|
41
|
+
* https://app.perkos.xyz/api/agents.
|
|
42
|
+
* PERKOS_GATEWAY_REPORT_DELAY_MS — how long to wait after bridge
|
|
43
|
+
* start before reporting. Default 30s.
|
|
44
|
+
*
|
|
45
|
+
* Inputs (env, per-gateway):
|
|
46
|
+
* TELEGRAM_ENABLED / FARCASTER_ENABLED / SLACK_ENABLED — set "true"
|
|
47
|
+
* by perkos-entrypoint.sh on the
|
|
48
|
+
* runtime container when the gateway
|
|
49
|
+
* has its required secrets. The
|
|
50
|
+
* ECS task def now passes these env
|
|
51
|
+
* vars to the bridge as well (see
|
|
52
|
+
* PerkOS#TBD).
|
|
53
|
+
*/
|
|
54
|
+
export const KNOWN_GATEWAYS = ["telegram", "farcaster", "slack"];
|
|
55
|
+
const DEFAULT_BASE_URL = "https://app.perkos.xyz/api/agents";
|
|
56
|
+
const DEFAULT_DELAY_MS = 30_000;
|
|
57
|
+
const POST_TIMEOUT_MS = 10_000;
|
|
58
|
+
function enabledFromEnv(env, gateway) {
|
|
59
|
+
const flag = env[`${gateway.toUpperCase()}_ENABLED`];
|
|
60
|
+
if (!flag)
|
|
61
|
+
return false;
|
|
62
|
+
const v = flag.trim().toLowerCase();
|
|
63
|
+
return v === "true" || v === "1" || v === "yes";
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* One-shot reporter. Schedules itself after the configured delay,
|
|
67
|
+
* then resolves with the list of per-gateway outcomes. The bridge
|
|
68
|
+
* never awaits this; it's fire-and-forget so a slow POST can't
|
|
69
|
+
* delay agent boot.
|
|
70
|
+
*/
|
|
71
|
+
export function startGatewayHealthReporter(opts = {}) {
|
|
72
|
+
const env = opts.env ?? process.env;
|
|
73
|
+
const log = opts.logger ?? console;
|
|
74
|
+
const fetcher = opts.fetcher ?? fetch;
|
|
75
|
+
const agentId = env.PERKOS_AGENT_ID?.trim();
|
|
76
|
+
const agentName = env.A2A_AGENT_NAME?.trim();
|
|
77
|
+
const relayKey = env.A2A_RELAY_API_KEY?.trim();
|
|
78
|
+
if (!agentId || !agentName || !relayKey) {
|
|
79
|
+
// Not a failure — old deploys / dev containers may not set these.
|
|
80
|
+
// The admin panel will show "pending" for the affected gateways
|
|
81
|
+
// until the operator rotates the bridge.
|
|
82
|
+
log.info("[gateway-health] missing PERKOS_AGENT_ID / A2A_AGENT_NAME / A2A_RELAY_API_KEY — skipping startup health report");
|
|
83
|
+
return Promise.resolve([]);
|
|
84
|
+
}
|
|
85
|
+
const enabled = KNOWN_GATEWAYS.filter((g) => enabledFromEnv(env, g));
|
|
86
|
+
if (!enabled.length) {
|
|
87
|
+
log.info("[gateway-health] no gateways enabled in env — nothing to report");
|
|
88
|
+
return Promise.resolve([]);
|
|
89
|
+
}
|
|
90
|
+
const baseUrl = (env.PERKOS_GATEWAY_STATUS_URL?.trim() || DEFAULT_BASE_URL).replace(/\/+$/, "");
|
|
91
|
+
const delayMs = opts.delayMs ??
|
|
92
|
+
(() => {
|
|
93
|
+
const raw = env.PERKOS_GATEWAY_REPORT_DELAY_MS;
|
|
94
|
+
if (!raw)
|
|
95
|
+
return DEFAULT_DELAY_MS;
|
|
96
|
+
const parsed = Number(raw);
|
|
97
|
+
return Number.isFinite(parsed) && parsed >= 0 ? parsed : DEFAULT_DELAY_MS;
|
|
98
|
+
})();
|
|
99
|
+
log.info(`[gateway-health] will report ${enabled.join(", ")} as active in ${delayMs}ms`);
|
|
100
|
+
return new Promise((resolve) => {
|
|
101
|
+
setTimeout(async () => {
|
|
102
|
+
const results = [];
|
|
103
|
+
for (const gateway of enabled) {
|
|
104
|
+
results.push(await postOne(fetcher, log, {
|
|
105
|
+
baseUrl,
|
|
106
|
+
agentId,
|
|
107
|
+
agentName,
|
|
108
|
+
relayKey,
|
|
109
|
+
gateway,
|
|
110
|
+
}));
|
|
111
|
+
}
|
|
112
|
+
resolve(results);
|
|
113
|
+
}, delayMs);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
async function postOne(fetcher, log, args) {
|
|
117
|
+
const url = `${args.baseUrl}/${encodeURIComponent(args.agentId)}/gateways/${args.gateway}/status`;
|
|
118
|
+
const controller = new AbortController();
|
|
119
|
+
const timer = setTimeout(() => controller.abort(), POST_TIMEOUT_MS);
|
|
120
|
+
try {
|
|
121
|
+
const response = await fetcher(url, {
|
|
122
|
+
method: "POST",
|
|
123
|
+
signal: controller.signal,
|
|
124
|
+
headers: {
|
|
125
|
+
authorization: `Bearer ${args.relayKey}`,
|
|
126
|
+
"x-agent-name": args.agentName,
|
|
127
|
+
"content-type": "application/json",
|
|
128
|
+
},
|
|
129
|
+
body: JSON.stringify({ status: "active" }),
|
|
130
|
+
});
|
|
131
|
+
if (response.ok) {
|
|
132
|
+
log.info(`[gateway-health] reported ${args.gateway} → active (${response.status})`);
|
|
133
|
+
return { gateway: args.gateway, ok: true, status: response.status };
|
|
134
|
+
}
|
|
135
|
+
const text = await response.text().catch(() => "");
|
|
136
|
+
log.warn(`[gateway-health] ${args.gateway} report rejected ${response.status}: ${text.slice(0, 200)}`);
|
|
137
|
+
return { gateway: args.gateway, ok: false, status: response.status, error: text };
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
141
|
+
log.warn(`[gateway-health] ${args.gateway} report errored: ${msg}`);
|
|
142
|
+
return { gateway: args.gateway, ok: false, status: null, error: msg };
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
clearTimeout(timer);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=gateway-health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-health.js","sourceRoot":"","sources":["../src/gateway-health.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type ToolsClaims = {
|
|
2
|
+
wallet: string;
|
|
3
|
+
convId: string;
|
|
4
|
+
role: "user" | "admin";
|
|
5
|
+
requestId: string;
|
|
6
|
+
};
|
|
7
|
+
export declare function signToolsToken(claims: ToolsClaims, secret: string, ttlSeconds?: number): {
|
|
8
|
+
token: string;
|
|
9
|
+
iat: number;
|
|
10
|
+
exp: number;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=tools-jwt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools-jwt.d.ts","sourceRoot":"","sources":["../src/tools-jwt.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AASF,wBAAgB,cAAc,CAC5B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,EACd,UAAU,SAAK,GACd;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAY7C"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mint HS256 JWTs the PerkOS-Platform-Tools-API will accept.
|
|
3
|
+
*
|
|
4
|
+
* The token shape MUST match what the Tools API verifier expects in
|
|
5
|
+
* `src/auth/jwt.ts` over there:
|
|
6
|
+
*
|
|
7
|
+
* { wallet: "0x...", convId: "assistant-0x...", role: "user"|"admin",
|
|
8
|
+
* requestId: "uuid", iat: <epoch>, exp: <iat + ttl> }
|
|
9
|
+
*
|
|
10
|
+
* The shared secret is set via env (A2A_TOOLS_JWT_SECRET) and never
|
|
11
|
+
* leaves this process — the bridge is the only entity that holds it.
|
|
12
|
+
* Hermes runtimes ask this bridge for a fresh token via the local
|
|
13
|
+
* listener (see tools-token-listener.ts).
|
|
14
|
+
*/
|
|
15
|
+
import { createHmac } from "node:crypto";
|
|
16
|
+
function b64url(buf) {
|
|
17
|
+
return buf.toString("base64")
|
|
18
|
+
.replace(/=+$/, "")
|
|
19
|
+
.replace(/\+/g, "-")
|
|
20
|
+
.replace(/\//g, "_");
|
|
21
|
+
}
|
|
22
|
+
export function signToolsToken(claims, secret, ttlSeconds = 60) {
|
|
23
|
+
if (!secret || secret.length < 32) {
|
|
24
|
+
throw new Error("signToolsToken: secret too short (need >=32 chars)");
|
|
25
|
+
}
|
|
26
|
+
const iat = Math.floor(Date.now() / 1000);
|
|
27
|
+
const exp = iat + Math.max(1, Math.min(ttlSeconds, 600));
|
|
28
|
+
const header = b64url(Buffer.from(JSON.stringify({ alg: "HS256", typ: "JWT" })));
|
|
29
|
+
const payload = b64url(Buffer.from(JSON.stringify({ ...claims, iat, exp })));
|
|
30
|
+
const signature = b64url(createHmac("sha256", secret).update(`${header}.${payload}`).digest());
|
|
31
|
+
return { token: `${header}.${payload}.${signature}`, iat, exp };
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=tools-jwt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools-jwt.js","sourceRoot":"","sources":["../src/tools-jwt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AASzC,SAAS,MAAM,CAAC,GAAW;IACzB,OAAO,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;SAC1B,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,MAAmB,EACnB,MAAc,EACd,UAAU,GAAG,EAAE;IAEf,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,SAAS,GAAG,MAAM,CACtB,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CACrE,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,OAAO,IAAI,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local HTTP listener that mints Tools-API JWTs for the active runtime.
|
|
3
|
+
*
|
|
4
|
+
* POST /v1/tools-token
|
|
5
|
+
* headers: X-Bridge-Auth: <shared secret with runtime plugin>
|
|
6
|
+
* body: { convId: string, requestId?: string }
|
|
7
|
+
* → 200 { token, exp, toolsApiUrl }
|
|
8
|
+
* → 400 { error: "..." } (bad body)
|
|
9
|
+
* → 401 { error: "..." } (bad/missing bridge auth)
|
|
10
|
+
* → 404 { error: "unknown or stale conv" } (conv not in registry)
|
|
11
|
+
*
|
|
12
|
+
* GET /healthz → 200 { ok: true, conv_count }
|
|
13
|
+
*
|
|
14
|
+
* Binds 127.0.0.1 only. The bridge is the only entity that knows
|
|
15
|
+
* A2A_TOOLS_JWT_SECRET — Hermes never sees it; it just receives short
|
|
16
|
+
* derived tokens.
|
|
17
|
+
*
|
|
18
|
+
* Authorization model — three layers of defense:
|
|
19
|
+
* 1. Network: listener is bound to 127.0.0.1, so only same-host
|
|
20
|
+
* processes can reach it.
|
|
21
|
+
* 2. Bridge-auth: caller must present X-Bridge-Auth matching the
|
|
22
|
+
* bridge's startup secret. This stops other processes on the
|
|
23
|
+
* same host (e.g. neighboring containers if 127.0.0.1 is shared)
|
|
24
|
+
* from minting tokens.
|
|
25
|
+
* 3. Conv binding: the listener only mints for convIds the bridge
|
|
26
|
+
* is currently handling (touched via chat_deliver in last 10m).
|
|
27
|
+
* Even with valid auth, the runtime can't mint a token for a
|
|
28
|
+
* wallet that isn't the active caller.
|
|
29
|
+
*/
|
|
30
|
+
import { type Server } from "node:http";
|
|
31
|
+
import { ConvRegistry } from "./conv-registry.js";
|
|
32
|
+
export type ToolsTokenListenerOptions = {
|
|
33
|
+
port: number;
|
|
34
|
+
bridgeAuthSecret: string;
|
|
35
|
+
toolsJwtSecret: string;
|
|
36
|
+
toolsApiUrl: string;
|
|
37
|
+
registry: ConvRegistry;
|
|
38
|
+
/** TTL of minted tokens, in seconds. Default 60. */
|
|
39
|
+
tokenTtlSeconds?: number;
|
|
40
|
+
logger?: {
|
|
41
|
+
info: (msg: string) => void;
|
|
42
|
+
error: (msg: string) => void;
|
|
43
|
+
warn?: (msg: string) => void;
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
export declare function startToolsTokenListener(opts: ToolsTokenListenerOptions): {
|
|
47
|
+
server: Server;
|
|
48
|
+
stop: () => Promise<void>;
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=tools-token-listener.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools-token-listener.d.ts","sourceRoot":"","sources":["../src/tools-token-listener.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,EAAsC,KAAK,MAAM,EAAuB,MAAM,WAAW,CAAC;AAGjG,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,CAAC;IACvB,oDAAoD;IACpD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;CACtG,CAAC;AAwCF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,yBAAyB,GAAG;IACxE,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAwEA"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local HTTP listener that mints Tools-API JWTs for the active runtime.
|
|
3
|
+
*
|
|
4
|
+
* POST /v1/tools-token
|
|
5
|
+
* headers: X-Bridge-Auth: <shared secret with runtime plugin>
|
|
6
|
+
* body: { convId: string, requestId?: string }
|
|
7
|
+
* → 200 { token, exp, toolsApiUrl }
|
|
8
|
+
* → 400 { error: "..." } (bad body)
|
|
9
|
+
* → 401 { error: "..." } (bad/missing bridge auth)
|
|
10
|
+
* → 404 { error: "unknown or stale conv" } (conv not in registry)
|
|
11
|
+
*
|
|
12
|
+
* GET /healthz → 200 { ok: true, conv_count }
|
|
13
|
+
*
|
|
14
|
+
* Binds 127.0.0.1 only. The bridge is the only entity that knows
|
|
15
|
+
* A2A_TOOLS_JWT_SECRET — Hermes never sees it; it just receives short
|
|
16
|
+
* derived tokens.
|
|
17
|
+
*
|
|
18
|
+
* Authorization model — three layers of defense:
|
|
19
|
+
* 1. Network: listener is bound to 127.0.0.1, so only same-host
|
|
20
|
+
* processes can reach it.
|
|
21
|
+
* 2. Bridge-auth: caller must present X-Bridge-Auth matching the
|
|
22
|
+
* bridge's startup secret. This stops other processes on the
|
|
23
|
+
* same host (e.g. neighboring containers if 127.0.0.1 is shared)
|
|
24
|
+
* from minting tokens.
|
|
25
|
+
* 3. Conv binding: the listener only mints for convIds the bridge
|
|
26
|
+
* is currently handling (touched via chat_deliver in last 10m).
|
|
27
|
+
* Even with valid auth, the runtime can't mint a token for a
|
|
28
|
+
* wallet that isn't the active caller.
|
|
29
|
+
*/
|
|
30
|
+
import { createServer } from "node:http";
|
|
31
|
+
import { timingSafeEqual, randomUUID } from "node:crypto";
|
|
32
|
+
import { signToolsToken } from "./tools-jwt.js";
|
|
33
|
+
function constantTimeEqual(a, b) {
|
|
34
|
+
// Both inputs may differ in length; pad to the same length to keep
|
|
35
|
+
// the comparison length-stable, then bail on length mismatch.
|
|
36
|
+
if (a.length !== b.length) {
|
|
37
|
+
// Still do a dummy compare to avoid early-exit timing signal.
|
|
38
|
+
const pad = Buffer.alloc(Math.max(a.length, b.length, 1), 0);
|
|
39
|
+
timingSafeEqual(pad, pad);
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
return timingSafeEqual(Buffer.from(a), Buffer.from(b));
|
|
43
|
+
}
|
|
44
|
+
async function readBody(req, maxBytes = 8192) {
|
|
45
|
+
return new Promise((resolve, reject) => {
|
|
46
|
+
let raw = "";
|
|
47
|
+
req.setEncoding("utf8");
|
|
48
|
+
req.on("data", (chunk) => {
|
|
49
|
+
raw += chunk;
|
|
50
|
+
if (raw.length > maxBytes) {
|
|
51
|
+
req.destroy(new Error("body too large"));
|
|
52
|
+
reject(new Error("body too large"));
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
req.on("end", () => resolve(raw));
|
|
56
|
+
req.on("error", reject);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
function sendJson(res, code, body) {
|
|
60
|
+
if (res.headersSent) {
|
|
61
|
+
res.end(JSON.stringify(body));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
res
|
|
65
|
+
.writeHead(code, { "content-type": "application/json" })
|
|
66
|
+
.end(JSON.stringify(body));
|
|
67
|
+
}
|
|
68
|
+
export function startToolsTokenListener(opts) {
|
|
69
|
+
const logger = opts.logger ?? console;
|
|
70
|
+
const ttl = opts.tokenTtlSeconds ?? 60;
|
|
71
|
+
const server = createServer(async (req, res) => {
|
|
72
|
+
try {
|
|
73
|
+
if (req.method === "GET" && req.url === "/healthz") {
|
|
74
|
+
sendJson(res, 200, { ok: true, conv_count: opts.registry.size() });
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (req.method !== "POST" || req.url !== "/v1/tools-token") {
|
|
78
|
+
sendJson(res, 404, { error: "not found" });
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const presented = req.headers["x-bridge-auth"];
|
|
82
|
+
const authHeader = Array.isArray(presented) ? presented[0] : presented;
|
|
83
|
+
if (!authHeader || !constantTimeEqual(authHeader, opts.bridgeAuthSecret)) {
|
|
84
|
+
sendJson(res, 401, { error: "bridge auth missing or invalid" });
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
let body;
|
|
88
|
+
try {
|
|
89
|
+
body = JSON.parse((await readBody(req)) || "{}");
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
sendJson(res, 400, { error: "invalid JSON" });
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (!body.convId || typeof body.convId !== "string") {
|
|
96
|
+
sendJson(res, 400, { error: "missing convId" });
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const entry = opts.registry.get(body.convId);
|
|
100
|
+
if (!entry) {
|
|
101
|
+
sendJson(res, 404, { error: "unknown or stale conv" });
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const { token, exp } = signToolsToken({
|
|
105
|
+
wallet: entry.wallet,
|
|
106
|
+
convId: body.convId,
|
|
107
|
+
role: entry.role,
|
|
108
|
+
requestId: body.requestId ?? randomUUID(),
|
|
109
|
+
}, opts.toolsJwtSecret, ttl);
|
|
110
|
+
sendJson(res, 200, { token, exp, toolsApiUrl: opts.toolsApiUrl });
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
114
|
+
logger.error(`[tools-token] ${msg}`);
|
|
115
|
+
sendJson(res, 500, { error: "internal" });
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
server.listen(opts.port, "127.0.0.1", () => {
|
|
119
|
+
logger.info(`[tools-token] listener on http://127.0.0.1:${opts.port}/v1/tools-token (TTL ${ttl}s)`);
|
|
120
|
+
});
|
|
121
|
+
const stop = async () => {
|
|
122
|
+
await new Promise((resolve, reject) => {
|
|
123
|
+
server.close((err) => (err ? reject(err) : resolve()));
|
|
124
|
+
});
|
|
125
|
+
};
|
|
126
|
+
return { server, stop };
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=tools-token-listener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools-token-listener.js","sourceRoot":"","sources":["../src/tools-token-listener.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@perkos/perkos-a2a",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "A2A Protocol communication plugin for OpenClaw — Agent-to-Agent protocol implementation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -40,7 +40,9 @@
|
|
|
40
40
|
"scripts": {
|
|
41
41
|
"build": "tsc && node scripts/bundle.mjs",
|
|
42
42
|
"dev": "tsc --watch",
|
|
43
|
-
"lint": "tsc --noEmit"
|
|
43
|
+
"lint": "tsc --noEmit",
|
|
44
|
+
"test": "vitest run",
|
|
45
|
+
"test:watch": "vitest"
|
|
44
46
|
},
|
|
45
47
|
"openclaw": {
|
|
46
48
|
"extensions": [
|
|
@@ -77,7 +79,8 @@
|
|
|
77
79
|
"@types/node": "^22.19.19",
|
|
78
80
|
"@types/ws": "^8.5.0",
|
|
79
81
|
"esbuild": "^0.28.0",
|
|
80
|
-
"typescript": "^5.7.0"
|
|
82
|
+
"typescript": "^5.7.0",
|
|
83
|
+
"vitest": "^3.2.4"
|
|
81
84
|
},
|
|
82
85
|
"peerDependencies": {
|
|
83
86
|
"openclaw": ">=2026.3.0"
|