@perkos/perkos-a2a 0.9.0 → 0.9.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/dist/agentic-actions.js +472 -0
- package/dist/agentic-actions.js.map +1 -0
- package/dist/chat-client.d.ts +77 -0
- package/dist/chat-client.d.ts.map +1 -0
- package/dist/chat-client.js +364 -0
- package/dist/chat-client.js.map +1 -0
- package/dist/chat-store.d.ts +87 -0
- package/dist/chat-store.d.ts.map +1 -0
- package/dist/chat-store.js +233 -0
- package/dist/chat-store.js.map +1 -0
- package/dist/chat-types.d.ts +166 -0
- package/dist/chat-types.d.ts.map +1 -0
- package/dist/chat-types.js +13 -0
- package/dist/chat-types.js.map +1 -0
- package/dist/pairing.js +66 -0
- package/dist/pairing.js.map +1 -0
- package/dist/relay-client.js +222 -0
- package/dist/relay-client.js.map +1 -0
- package/dist/relay.js +274 -0
- package/dist/relay.js.map +1 -0
- package/dist/runtime-reply.js +137 -0
- package/dist/runtime-reply.js.map +1 -0
- package/dist/server.js +611 -0
- package/dist/server.js.map +1 -0
- package/package.json +5 -33
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
import { completeTaskWithReply } from "./runtime-reply.js";
|
|
2
|
+
const FALLBACK_AGENT_ALIASES = [
|
|
3
|
+
["Perkos-Claw-Tester", ["perkos-claw-tester", "openclaw", "open claw", "claw"]],
|
|
4
|
+
["Perkos-Hermes-Tester", ["perkos-hermes-tester", "hermes"]],
|
|
5
|
+
["Morpheus-A2A-Receiver", ["morpheus-a2a-receiver", "morpheus"]],
|
|
6
|
+
["Apollo", ["apollo"]],
|
|
7
|
+
];
|
|
8
|
+
function includesAny(text, terms) {
|
|
9
|
+
const lower = text.toLowerCase();
|
|
10
|
+
return terms.some((term) => lower.includes(term.toLowerCase()));
|
|
11
|
+
}
|
|
12
|
+
function requestedMarker(text, fallback) {
|
|
13
|
+
const patterns = [
|
|
14
|
+
/termina(?:r)?(?:\s+exactamente)?\s+con\s+([A-Z0-9_]{6,})/i,
|
|
15
|
+
/end(?:s)?(?:\s+exactly)?\s+with\s+([A-Z0-9_]{6,})/i,
|
|
16
|
+
/marker\s+([A-Z0-9_]{6,})/i,
|
|
17
|
+
];
|
|
18
|
+
for (const pattern of patterns) {
|
|
19
|
+
const match = text.match(pattern);
|
|
20
|
+
if (match?.[1])
|
|
21
|
+
return match[1].toUpperCase();
|
|
22
|
+
}
|
|
23
|
+
return fallback;
|
|
24
|
+
}
|
|
25
|
+
function stripDelegationNoise(text) {
|
|
26
|
+
return text
|
|
27
|
+
.replace(/^Delegated by .*?\.\s*/i, "")
|
|
28
|
+
.replace(/^Delegated request:\s*/i, "")
|
|
29
|
+
.replace(/^A2A-DELEGATION[^\n]*\n?/gim, "")
|
|
30
|
+
.replace(/End with DELEGATED_A2A_DONE\.?/gi, "")
|
|
31
|
+
.trim();
|
|
32
|
+
}
|
|
33
|
+
function normalizeKey(value) {
|
|
34
|
+
return value
|
|
35
|
+
.toLowerCase()
|
|
36
|
+
.normalize("NFKD")
|
|
37
|
+
.replace(/[\u0300-\u036f]/g, "")
|
|
38
|
+
.replace(/[^a-z0-9]+/g, " ")
|
|
39
|
+
.trim()
|
|
40
|
+
.replace(/\s+/g, " ");
|
|
41
|
+
}
|
|
42
|
+
function compactKey(value) {
|
|
43
|
+
return normalizeKey(value).replace(/\s+/g, "");
|
|
44
|
+
}
|
|
45
|
+
function addAlias(aliases, alias, canonical) {
|
|
46
|
+
const normalized = normalizeKey(alias);
|
|
47
|
+
if (normalized)
|
|
48
|
+
aliases.set(normalized, canonical);
|
|
49
|
+
const compact = compactKey(alias);
|
|
50
|
+
if (compact)
|
|
51
|
+
aliases.set(compact, canonical);
|
|
52
|
+
}
|
|
53
|
+
function aliasesForName(name) {
|
|
54
|
+
const base = normalizeKey(name);
|
|
55
|
+
const compact = compactKey(name);
|
|
56
|
+
const withoutTester = base.replace(/\btester\b/g, "").replace(/\s+/g, " ").trim();
|
|
57
|
+
const parts = base.split(" ").filter(Boolean);
|
|
58
|
+
return Array.from(new Set([
|
|
59
|
+
name,
|
|
60
|
+
base,
|
|
61
|
+
compact,
|
|
62
|
+
withoutTester,
|
|
63
|
+
parts.at(-1) || "",
|
|
64
|
+
parts.at(0) || "",
|
|
65
|
+
].filter(Boolean)));
|
|
66
|
+
}
|
|
67
|
+
async function buildAgentDirectory(server, selfName) {
|
|
68
|
+
const names = new Set();
|
|
69
|
+
const aliases = new Map();
|
|
70
|
+
names.add(selfName);
|
|
71
|
+
for (const [name, extraAliases] of FALLBACK_AGENT_ALIASES) {
|
|
72
|
+
names.add(name);
|
|
73
|
+
for (const alias of [name, ...extraAliases])
|
|
74
|
+
addAlias(aliases, alias, name);
|
|
75
|
+
}
|
|
76
|
+
if (server.discoverPeers) {
|
|
77
|
+
try {
|
|
78
|
+
const peers = await server.discoverPeers();
|
|
79
|
+
for (const [name, entry] of Object.entries(peers)) {
|
|
80
|
+
const canonical = entry.card?.name || name;
|
|
81
|
+
if (!canonical || canonical === selfName)
|
|
82
|
+
continue;
|
|
83
|
+
names.add(canonical);
|
|
84
|
+
for (const alias of aliasesForName(canonical))
|
|
85
|
+
addAlias(aliases, alias, canonical);
|
|
86
|
+
if (name !== canonical)
|
|
87
|
+
for (const alias of aliasesForName(name))
|
|
88
|
+
addAlias(aliases, alias, canonical);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// Discovery is opportunistic; relay may be temporarily unavailable.
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
for (const name of names)
|
|
96
|
+
for (const alias of aliasesForName(name))
|
|
97
|
+
addAlias(aliases, alias, name);
|
|
98
|
+
return { names: Array.from(names), aliases };
|
|
99
|
+
}
|
|
100
|
+
function resolveAgentName(raw, directory, selfName, allowSelf = false) {
|
|
101
|
+
const cleaned = raw.replace(/^@/, "").trim();
|
|
102
|
+
if (!cleaned)
|
|
103
|
+
return undefined;
|
|
104
|
+
const normalized = normalizeKey(cleaned);
|
|
105
|
+
const compact = compactKey(cleaned);
|
|
106
|
+
for (const name of directory.names) {
|
|
107
|
+
if (!allowSelf && name === selfName)
|
|
108
|
+
continue;
|
|
109
|
+
if (normalizeKey(name) === normalized || compactKey(name) === compact)
|
|
110
|
+
return name;
|
|
111
|
+
}
|
|
112
|
+
const exact = directory.aliases.get(normalized) || directory.aliases.get(compact);
|
|
113
|
+
if (exact && (allowSelf || exact !== selfName))
|
|
114
|
+
return exact;
|
|
115
|
+
const hits = [];
|
|
116
|
+
const entries = Array.from(directory.aliases.entries()).sort((a, b) => b[0].length - a[0].length);
|
|
117
|
+
for (const [alias, canonical] of entries) {
|
|
118
|
+
if (!allowSelf && canonical === selfName)
|
|
119
|
+
continue;
|
|
120
|
+
if (alias.length < 4)
|
|
121
|
+
continue;
|
|
122
|
+
const normalizedIndex = normalized.indexOf(alias);
|
|
123
|
+
const compactIndex = compact.indexOf(alias.replace(/\s+/g, ""));
|
|
124
|
+
const index = normalizedIndex >= 0 ? normalizedIndex : compactIndex;
|
|
125
|
+
if (index >= 0)
|
|
126
|
+
hits.push({ canonical, index, aliasLength: alias.length });
|
|
127
|
+
}
|
|
128
|
+
hits.sort((a, b) => a.index - b.index || b.aliasLength - a.aliasLength);
|
|
129
|
+
if (hits[0])
|
|
130
|
+
return hits[0].canonical;
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
function findMentionedAgents(text, directory, selfName) {
|
|
134
|
+
const normalized = normalizeKey(stripDelegationNoise(text));
|
|
135
|
+
const compact = compactKey(stripDelegationNoise(text));
|
|
136
|
+
const hits = [];
|
|
137
|
+
const seen = new Set();
|
|
138
|
+
const entries = Array.from(directory.aliases.entries()).sort((a, b) => b[0].length - a[0].length);
|
|
139
|
+
for (const [alias, canonical] of entries) {
|
|
140
|
+
if (canonical === selfName || alias.length < 3 || seen.has(canonical))
|
|
141
|
+
continue;
|
|
142
|
+
const idx = normalized.indexOf(alias);
|
|
143
|
+
const compactIdx = compact.indexOf(alias.replace(/\s+/g, ""));
|
|
144
|
+
const index = idx >= 0 ? idx : compactIdx;
|
|
145
|
+
if (index >= 0) {
|
|
146
|
+
hits.push({ name: canonical, index });
|
|
147
|
+
seen.add(canonical);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return hits.sort((a, b) => a.index - b.index).map((hit) => hit.name);
|
|
151
|
+
}
|
|
152
|
+
function parseArrowRoute(text, directory, selfName) {
|
|
153
|
+
const clean = stripDelegationNoise(text);
|
|
154
|
+
const routeLine = clean.split(/\n/).find((line) => /(?:->|→|=>|➡)/.test(line));
|
|
155
|
+
if (!routeLine)
|
|
156
|
+
return [];
|
|
157
|
+
const route = routeLine
|
|
158
|
+
.split(/(?:->|→|=>|➡)/)
|
|
159
|
+
.map((part) => resolveAgentName(part, directory, selfName) || (normalizeKey(part).includes(normalizeKey(selfName)) ? selfName : undefined))
|
|
160
|
+
.filter(Boolean);
|
|
161
|
+
return Array.from(new Set(route));
|
|
162
|
+
}
|
|
163
|
+
function detectTarget(text, selfName, directory) {
|
|
164
|
+
const route = parseDelegationEnvelope(text).route;
|
|
165
|
+
if (route.length)
|
|
166
|
+
return nextRouteTarget(route, selfName);
|
|
167
|
+
const arrowRoute = parseArrowRoute(text, directory, selfName);
|
|
168
|
+
if (arrowRoute.length)
|
|
169
|
+
return nextRouteTarget(arrowRoute, selfName) || arrowRoute.find((name) => name !== selfName);
|
|
170
|
+
return findMentionedAgents(text, directory, selfName)[0];
|
|
171
|
+
}
|
|
172
|
+
function detectReplyTarget(text, selfName, directory) {
|
|
173
|
+
const envelope = parseDelegationEnvelope(text);
|
|
174
|
+
if (envelope.notify && envelope.notify !== selfName)
|
|
175
|
+
return envelope.notify;
|
|
176
|
+
const clean = stripDelegationNoise(text);
|
|
177
|
+
const patterns = [
|
|
178
|
+
/(?:reply|respond|notify|send|return|env[ií]a|enviar|responde|notifica)(?:\s+the\s+result)?\s+(?:to|a)\s+([A-Za-z0-9_. -]{2,80}?)(?:[.;,\n]|$)/i,
|
|
179
|
+
/(?:notify|notifica|reply|responde)\s+([A-Za-z0-9_. -]{2,80}?)(?:[.;,\n]|$)/i,
|
|
180
|
+
/(?:final|ultimo|último).*?(?:notify|notifica|responde|reply).*?(?:to|a)?\s+([A-Za-z0-9_. -]{2,80}?)(?:[.;,\n]|$)/i,
|
|
181
|
+
];
|
|
182
|
+
for (const pattern of patterns) {
|
|
183
|
+
const match = clean.match(pattern);
|
|
184
|
+
const resolved = match?.[1] ? resolveAgentName(match[1], directory, selfName, true) : undefined;
|
|
185
|
+
if (resolved)
|
|
186
|
+
return resolved;
|
|
187
|
+
}
|
|
188
|
+
if (includesAny(clean, ["responda a", "envíe", "envia", "send", "reply", "notify", "notifica", "morpheus"])) {
|
|
189
|
+
const mentioned = findMentionedAgents(clean, directory, selfName);
|
|
190
|
+
return mentioned.at(-1);
|
|
191
|
+
}
|
|
192
|
+
return undefined;
|
|
193
|
+
}
|
|
194
|
+
async function fetchJson(url) {
|
|
195
|
+
const response = await fetch(url, {
|
|
196
|
+
headers: { accept: "application/json", "user-agent": "perkos-a2a-research/0.8" },
|
|
197
|
+
signal: AbortSignal.timeout(10_000),
|
|
198
|
+
});
|
|
199
|
+
if (!response.ok)
|
|
200
|
+
throw new Error(`${url} returned ${response.status}`);
|
|
201
|
+
return response.json();
|
|
202
|
+
}
|
|
203
|
+
async function researchEthPrice() {
|
|
204
|
+
const sources = [];
|
|
205
|
+
try {
|
|
206
|
+
const cg = await fetchJson("https://api.coingecko.com/api/v3/simple/price?ids=ethereum&vs_currencies=usd&include_24hr_change=true&include_last_updated_at=true");
|
|
207
|
+
const eth = cg?.ethereum;
|
|
208
|
+
if (eth?.usd) {
|
|
209
|
+
const updated = eth.last_updated_at ? new Date(Number(eth.last_updated_at) * 1000).toISOString() : "unknown";
|
|
210
|
+
const change = typeof eth.usd_24h_change === "number" ? ` (${eth.usd_24h_change.toFixed(2)}% 24h)` : "";
|
|
211
|
+
sources.push(`CoinGecko ETH/USD: $${Number(eth.usd).toLocaleString("en-US")}${change}, updated ${updated}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
catch (err) {
|
|
215
|
+
sources.push(`CoinGecko unavailable: ${err instanceof Error ? err.message : String(err)}`);
|
|
216
|
+
}
|
|
217
|
+
try {
|
|
218
|
+
const cb = await fetchJson("https://api.coinbase.com/v2/prices/ETH-USD/spot");
|
|
219
|
+
const amount = cb?.data?.amount;
|
|
220
|
+
if (amount)
|
|
221
|
+
sources.push(`Coinbase ETH/USD spot: $${Number(amount).toLocaleString("en-US")}`);
|
|
222
|
+
}
|
|
223
|
+
catch (err) {
|
|
224
|
+
sources.push(`Coinbase unavailable: ${err instanceof Error ? err.message : String(err)}`);
|
|
225
|
+
}
|
|
226
|
+
if (!sources.some((s) => s.includes("ETH/USD"))) {
|
|
227
|
+
return [
|
|
228
|
+
"No pude confirmar el precio vivo de ETH desde las APIs públicas en este momento.",
|
|
229
|
+
"Metodología recomendada: consultar CoinGecko `/simple/price`, Coinbase `/v2/prices/ETH-USD/spot`, Binance/Kraken ticker y comparar timestamps.",
|
|
230
|
+
].join("\n");
|
|
231
|
+
}
|
|
232
|
+
return [
|
|
233
|
+
"Resultado de research de precio ETH:",
|
|
234
|
+
...sources.map((source) => `- ${source}`),
|
|
235
|
+
"Nota: validar con más de una fuente antes de usarlo para trading/decisiones financieras.",
|
|
236
|
+
].join("\n");
|
|
237
|
+
}
|
|
238
|
+
function extractTaskFinalText(result) {
|
|
239
|
+
const anyResult = result;
|
|
240
|
+
const task = anyResult.result?.result || anyResult.result || anyResult.payload?.result || anyResult;
|
|
241
|
+
const snippets = [];
|
|
242
|
+
const statusParts = task?.status?.message?.parts || [];
|
|
243
|
+
for (const part of statusParts)
|
|
244
|
+
if (typeof part?.text === "string")
|
|
245
|
+
snippets.push(part.text);
|
|
246
|
+
for (const artifact of task?.artifacts || []) {
|
|
247
|
+
for (const part of artifact?.parts || [])
|
|
248
|
+
if (typeof part?.text === "string")
|
|
249
|
+
snippets.push(part.text);
|
|
250
|
+
}
|
|
251
|
+
return snippets.at(-1) || JSON.stringify(result);
|
|
252
|
+
}
|
|
253
|
+
function hasA2ARelayExplainTask(text) {
|
|
254
|
+
return includesAny(text, ["a2a relay", "relay a2a", "qué es un a2a relay", "what an a2a relay is"]);
|
|
255
|
+
}
|
|
256
|
+
function answerA2ARelay(selfName) {
|
|
257
|
+
return [
|
|
258
|
+
`${selfName} result:`,
|
|
259
|
+
"An A2A relay is a transport/router that lets agents exchange tasks and responses by agent name even when they are behind NAT, on different runtimes, or on the same host with different ports.",
|
|
260
|
+
"It handles registration, discovery, message routing, heartbeats, and delivery fallback while each agent keeps its own runtime and local permissions.",
|
|
261
|
+
].join("\n");
|
|
262
|
+
}
|
|
263
|
+
function parseDelegationEnvelope(text) {
|
|
264
|
+
const line = text.match(/^A2A-DELEGATION[^\n]*/im)?.[0] || "";
|
|
265
|
+
const routeRaw = line.match(/\broute=([^\s]+)/i)?.[1];
|
|
266
|
+
const notifyRaw = line.match(/\bnotify=([^\s]+)/i)?.[1];
|
|
267
|
+
const markerRaw = line.match(/\bmarker=([A-Z0-9_]{6,})/i)?.[1];
|
|
268
|
+
const depthRaw = line.match(/\bdepth=(\d+)/i)?.[1];
|
|
269
|
+
return {
|
|
270
|
+
route: routeRaw ? routeRaw.split(/[|,]/).map((x) => x.trim()).filter(Boolean) : [],
|
|
271
|
+
notify: notifyRaw && notifyRaw !== "none" ? notifyRaw : undefined,
|
|
272
|
+
marker: markerRaw,
|
|
273
|
+
depth: depthRaw ? Number(depthRaw) : 0,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
function delegationDepth(text) {
|
|
277
|
+
return parseDelegationEnvelope(text).depth;
|
|
278
|
+
}
|
|
279
|
+
function nextRouteTarget(route, selfName) {
|
|
280
|
+
const selfIndex = route.findIndex((name) => name === selfName);
|
|
281
|
+
if (selfIndex >= 0)
|
|
282
|
+
return route.slice(selfIndex + 1).find((name) => name !== selfName);
|
|
283
|
+
return route.find((name) => name !== selfName);
|
|
284
|
+
}
|
|
285
|
+
function cleanNestedResult(text, finalMarker) {
|
|
286
|
+
const escaped = finalMarker.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
287
|
+
return text
|
|
288
|
+
.replace(new RegExp(`\n?${escaped}\s*$`, "g"), "")
|
|
289
|
+
.replace(/\n?DELEGATED_A2A_DONE\s*$/g, "")
|
|
290
|
+
.trim();
|
|
291
|
+
}
|
|
292
|
+
function routeForDelegation(selfName, target, text, directory) {
|
|
293
|
+
const envelopeRoute = parseDelegationEnvelope(text).route;
|
|
294
|
+
if (envelopeRoute.length)
|
|
295
|
+
return Array.from(new Set(envelopeRoute));
|
|
296
|
+
const arrowRoute = parseArrowRoute(text, directory, selfName);
|
|
297
|
+
if (arrowRoute.length)
|
|
298
|
+
return Array.from(new Set(arrowRoute.includes(selfName) ? arrowRoute : [selfName, ...arrowRoute]));
|
|
299
|
+
const mentions = findMentionedAgents(text, directory, selfName).filter((name) => name !== selfName);
|
|
300
|
+
const route = [selfName, target, ...mentions.filter((name) => name !== target)];
|
|
301
|
+
return Array.from(new Set(route));
|
|
302
|
+
}
|
|
303
|
+
function buildDelegatedMessage(input) {
|
|
304
|
+
const { originalText, selfName, target, route, marker, notify } = input;
|
|
305
|
+
const depth = delegationDepth(originalText) + 1;
|
|
306
|
+
const clean = stripDelegationNoise(originalText);
|
|
307
|
+
const header = `A2A-DELEGATION origin=${selfName} target=${target} route=${route.join("|")} notify=${notify || "none"} depth=${depth} marker=${marker}`;
|
|
308
|
+
if (hasA2ARelayExplainTask(clean) && !nextRouteTarget(route, target)) {
|
|
309
|
+
return [
|
|
310
|
+
header,
|
|
311
|
+
"Complete this task directly. Briefly explain what an A2A relay is and why agents use it.",
|
|
312
|
+
"Do not delegate this request further unless explicitly required by a new instruction.",
|
|
313
|
+
"End with DELEGATED_A2A_DONE.",
|
|
314
|
+
].join("\n");
|
|
315
|
+
}
|
|
316
|
+
return [
|
|
317
|
+
header,
|
|
318
|
+
"Complete or delegate the following task once. Follow the A2A-DELEGATION route exactly. Do not echo this request back to agents already named in the route.",
|
|
319
|
+
clean,
|
|
320
|
+
notify ? `When the route is complete, send or return the final useful result to ${notify}.` : "Return the final useful result to the caller.",
|
|
321
|
+
`End exactly with ${marker}.`,
|
|
322
|
+
].join("\n");
|
|
323
|
+
}
|
|
324
|
+
async function completeTerminalTask(input) {
|
|
325
|
+
const { selfName, server, task, text, marker, replyTarget, runtimeResponder } = input;
|
|
326
|
+
const cleanText = stripDelegationNoise(text);
|
|
327
|
+
const wantsEthResearch = includesAny(cleanText, ["precio de eth", "eth price", "ethereum price", "precio actual de eth"]);
|
|
328
|
+
let finalText;
|
|
329
|
+
if (includesAny(cleanText, ["A2A_COMM_TEST", "communication test", "ping test", "confirm receipt", "confirm receive", "confirmar recibo", "confirma recibo"])) {
|
|
330
|
+
finalText = [`${selfName} received and completed the A2A communication test.`, marker].join("\n");
|
|
331
|
+
}
|
|
332
|
+
else if (hasA2ARelayExplainTask(cleanText)) {
|
|
333
|
+
finalText = [answerA2ARelay(selfName), "", marker].join("\n");
|
|
334
|
+
}
|
|
335
|
+
else if (wantsEthResearch) {
|
|
336
|
+
finalText = [await researchEthPrice(), "", marker].join("\n");
|
|
337
|
+
}
|
|
338
|
+
else if (runtimeResponder) {
|
|
339
|
+
const reply = await runtimeResponder(cleanText, marker);
|
|
340
|
+
finalText = [reply, "", marker].join("\n");
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
finalText = [`${selfName} completed the delegated A2A task.`, cleanText, marker].join("\n");
|
|
344
|
+
}
|
|
345
|
+
if (replyTarget && replyTarget !== selfName) {
|
|
346
|
+
const replyResult = await server.sendTask(replyTarget, [
|
|
347
|
+
`Final A2A result from ${selfName}:`,
|
|
348
|
+
"",
|
|
349
|
+
cleanNestedResult(finalText, marker),
|
|
350
|
+
"",
|
|
351
|
+
"A2A_FINAL_NOTIFICATION_OK",
|
|
352
|
+
].join("\n"));
|
|
353
|
+
finalText = [
|
|
354
|
+
cleanNestedResult(finalText, marker),
|
|
355
|
+
"",
|
|
356
|
+
`Forwarded final result to ${replyTarget}.`,
|
|
357
|
+
extractTaskFinalText(replyResult),
|
|
358
|
+
"",
|
|
359
|
+
marker,
|
|
360
|
+
].join("\n");
|
|
361
|
+
}
|
|
362
|
+
completeTaskWithReply(task, finalText);
|
|
363
|
+
}
|
|
364
|
+
export async function tryHandleAgenticTask(input) {
|
|
365
|
+
const { selfName, server, task, text, logger, runtimeResponder } = input;
|
|
366
|
+
const directory = await buildAgentDirectory(server, selfName);
|
|
367
|
+
const envelope = parseDelegationEnvelope(text);
|
|
368
|
+
const cleanText = stripDelegationNoise(text);
|
|
369
|
+
const wantsDelegation = includesAny(cleanText, ["usa comunicación a2a", "usar comunicación a2a", "pídele", "pidele", "dile a", "delegate", "delegar", "tell", "ask", "route", "chain", "handoff", "notify", "notifica"]);
|
|
370
|
+
const wantsEthResearch = includesAny(cleanText, ["precio de eth", "eth price", "ethereum price", "precio actual de eth"]);
|
|
371
|
+
const finalMarker = envelope.marker || requestedMarker(text, envelope.route.length ? "DELEGATED_A2A_DONE" : "TRI_HERMES_DONE");
|
|
372
|
+
if (/^(Final A2A result|Delegated result from|Research result from)\b/i.test(cleanText) && !envelope.route.length) {
|
|
373
|
+
completeTaskWithReply(task, [`${selfName} received the final A2A notification.`, "", cleanText, "", requestedMarker(text, "A2A_NOTIFICATION_RECEIVED")].join("\n"));
|
|
374
|
+
return true;
|
|
375
|
+
}
|
|
376
|
+
if (includesAny(cleanText, ["A2A_COMM_TEST", "communication test", "ping test", "confirm receipt", "confirm receive", "confirmar recibo", "confirma recibo"]) && !wantsDelegation && !envelope.route.length) {
|
|
377
|
+
completeTaskWithReply(task, [
|
|
378
|
+
`${selfName} received and completed the A2A communication test.`,
|
|
379
|
+
finalMarker,
|
|
380
|
+
].join("\n"));
|
|
381
|
+
return true;
|
|
382
|
+
}
|
|
383
|
+
if (hasA2ARelayExplainTask(cleanText) && !wantsDelegation && !envelope.route.length) {
|
|
384
|
+
completeTaskWithReply(task, [answerA2ARelay(selfName), "", finalMarker].join("\n"));
|
|
385
|
+
return true;
|
|
386
|
+
}
|
|
387
|
+
if (wantsEthResearch && !wantsDelegation && !envelope.route.length) {
|
|
388
|
+
const research = await researchEthPrice();
|
|
389
|
+
const replyTarget = detectReplyTarget(text, selfName, directory);
|
|
390
|
+
let replyResultText = "";
|
|
391
|
+
if (replyTarget) {
|
|
392
|
+
const replyResult = await server.sendTask(replyTarget, [
|
|
393
|
+
`Research result from ${selfName}:`,
|
|
394
|
+
"",
|
|
395
|
+
research,
|
|
396
|
+
"",
|
|
397
|
+
"DELEGATED_ETH_RESEARCH_DONE",
|
|
398
|
+
].join("\n"));
|
|
399
|
+
replyResultText = extractTaskFinalText(replyResult);
|
|
400
|
+
}
|
|
401
|
+
completeTaskWithReply(task, [
|
|
402
|
+
research,
|
|
403
|
+
"",
|
|
404
|
+
replyTarget ? `Forwarded to ${replyTarget}.` : undefined,
|
|
405
|
+
replyResultText ? `Reply delivery result:\n${replyResultText}` : undefined,
|
|
406
|
+
finalMarker,
|
|
407
|
+
].filter(Boolean).join("\n"));
|
|
408
|
+
return true;
|
|
409
|
+
}
|
|
410
|
+
if (!wantsDelegation && !envelope.route.length)
|
|
411
|
+
return false;
|
|
412
|
+
if (delegationDepth(text) >= 8) {
|
|
413
|
+
completeTaskWithReply(task, [
|
|
414
|
+
`A2A delegation stopped by ${selfName}: max delegation depth reached.`,
|
|
415
|
+
"This prevents routing loops across heterogeneous agents.",
|
|
416
|
+
requestedMarker(text, "A2A_DELEGATION_STOPPED"),
|
|
417
|
+
].join("\n"));
|
|
418
|
+
return true;
|
|
419
|
+
}
|
|
420
|
+
const target = detectTarget(text, selfName, directory);
|
|
421
|
+
const replyTarget = detectReplyTarget(text, selfName, directory);
|
|
422
|
+
if (!target) {
|
|
423
|
+
await completeTerminalTask({ selfName, server, task, text, marker: finalMarker, replyTarget, runtimeResponder });
|
|
424
|
+
return true;
|
|
425
|
+
}
|
|
426
|
+
const route = routeForDelegation(selfName, target, text, directory);
|
|
427
|
+
const next = nextRouteTarget(route, selfName) || target;
|
|
428
|
+
if (!next || next === selfName) {
|
|
429
|
+
await completeTerminalTask({ selfName, server, task, text, marker: finalMarker, replyTarget, runtimeResponder });
|
|
430
|
+
return true;
|
|
431
|
+
}
|
|
432
|
+
const delegatedMessage = wantsEthResearch
|
|
433
|
+
? [
|
|
434
|
+
`A2A-DELEGATION origin=${selfName} target=${next} route=${route.join("|")} notify=${replyTarget || "none"} depth=${delegationDepth(text) + 1} marker=${finalMarker}`,
|
|
435
|
+
"Delegated research request. Research the current ETH price using available live/public APIs.",
|
|
436
|
+
"Return concise findings with source names, timestamp if available, and limitations.",
|
|
437
|
+
replyTarget ? `If possible, send the final result to ${replyTarget} via A2A.` : "Return the final useful result to the caller.",
|
|
438
|
+
"End with DELEGATED_ETH_RESEARCH_DONE.",
|
|
439
|
+
].filter(Boolean).join("\n")
|
|
440
|
+
: buildDelegatedMessage({ originalText: text, selfName, target: next, route, marker: finalMarker, notify: replyTarget });
|
|
441
|
+
logger.info(`[perkos-a2a] Agentic delegation: ${selfName} -> ${next}${replyTarget ? ` -> notify ${replyTarget}` : ""}; route=${route.join(" -> ")}`);
|
|
442
|
+
const delegatedResult = await server.sendTask(next, delegatedMessage);
|
|
443
|
+
const delegatedText = cleanNestedResult(extractTaskFinalText(delegatedResult), finalMarker);
|
|
444
|
+
let replyResultText = "";
|
|
445
|
+
if (replyTarget && replyTarget !== next && !delegatedText.includes("Forwarded final result to")) {
|
|
446
|
+
const replyMessage = [
|
|
447
|
+
`Delegated result from ${next}, forwarded by ${selfName}:`,
|
|
448
|
+
"",
|
|
449
|
+
delegatedText,
|
|
450
|
+
"",
|
|
451
|
+
"End-to-end A2A chain completed. TRI_AGENTIC_RESULT_DELIVERED.",
|
|
452
|
+
].join("\n");
|
|
453
|
+
const replyResult = await server.sendTask(replyTarget, replyMessage);
|
|
454
|
+
replyResultText = extractTaskFinalText(replyResult);
|
|
455
|
+
}
|
|
456
|
+
completeTaskWithReply(task, [
|
|
457
|
+
`Agentic A2A delegation completed by ${selfName}.`,
|
|
458
|
+
`Delegated target: ${next}`,
|
|
459
|
+
`Route: ${route.join(" -> ")}`,
|
|
460
|
+
replyTarget ? `Reply target: ${replyTarget}` : undefined,
|
|
461
|
+
"",
|
|
462
|
+
"Delegated result:",
|
|
463
|
+
delegatedText,
|
|
464
|
+
replyResultText ? "" : undefined,
|
|
465
|
+
replyResultText ? "Reply delivery result:" : undefined,
|
|
466
|
+
replyResultText || undefined,
|
|
467
|
+
"",
|
|
468
|
+
finalMarker,
|
|
469
|
+
].filter(Boolean).join("\n"));
|
|
470
|
+
return true;
|
|
471
|
+
}
|
|
472
|
+
//# sourceMappingURL=agentic-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentic-actions.js","sourceRoot":"","sources":["../src/agentic-actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PerkOS-Chat client.
|
|
3
|
+
*
|
|
4
|
+
* Connects an agent to `wss://chat.perkos.xyz/chat`. Handles auth, automatic
|
|
5
|
+
* reconnect with exponential backoff, heartbeat, persistent JSONL storage of
|
|
6
|
+
* incoming and outgoing messages, and history pagination.
|
|
7
|
+
*
|
|
8
|
+
* This is a sibling of `RelayClient` (which speaks the A2A task protocol).
|
|
9
|
+
* Same runtime conventions, different wire format — chat uses framed JSON
|
|
10
|
+
* with role-aware auth instead of A2A JSON-RPC.
|
|
11
|
+
*
|
|
12
|
+
* Companion server: github.com/PerkOS-xyz/PerkOS-Chat
|
|
13
|
+
*/
|
|
14
|
+
import { ChatStore } from "./chat-store.js";
|
|
15
|
+
import type { ChatConfig, ChatDeliverFrame, ChatMessageInboundFrame, ChannelJoinFrame } from "./chat-types.js";
|
|
16
|
+
export interface ChatClientHandlers {
|
|
17
|
+
/** Called when a user (or another agent) sent a message in a conv we participate in. */
|
|
18
|
+
onChatDeliver?: (msg: ChatMessageInboundFrame | ChatDeliverFrame) => void | Promise<void>;
|
|
19
|
+
/** Called when the server adds us to a new conv. */
|
|
20
|
+
onChannelJoin?: (frame: ChannelJoinFrame) => void | Promise<void>;
|
|
21
|
+
/** Optional logging hooks. Default routes to console.log/console.error. */
|
|
22
|
+
logger?: {
|
|
23
|
+
info: (...a: unknown[]) => void;
|
|
24
|
+
error: (...a: unknown[]) => void;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export declare class ChatClient {
|
|
28
|
+
private ws;
|
|
29
|
+
private readonly config;
|
|
30
|
+
private readonly agentName;
|
|
31
|
+
private readonly handlers;
|
|
32
|
+
private readonly logger;
|
|
33
|
+
private readonly store;
|
|
34
|
+
private reconnectMs;
|
|
35
|
+
private reconnectTimer;
|
|
36
|
+
private heartbeatTimer;
|
|
37
|
+
private connected;
|
|
38
|
+
private authed;
|
|
39
|
+
private stopped;
|
|
40
|
+
constructor(opts: {
|
|
41
|
+
agentName: string;
|
|
42
|
+
config: ChatConfig;
|
|
43
|
+
handlers?: ChatClientHandlers;
|
|
44
|
+
});
|
|
45
|
+
/** Storage handle — exposed so consumers can read history without going through the wire. */
|
|
46
|
+
getStore(): ChatStore;
|
|
47
|
+
isConnected(): boolean;
|
|
48
|
+
start(): void;
|
|
49
|
+
stop(): void;
|
|
50
|
+
/**
|
|
51
|
+
* Send a reply from this agent into a conversation. Appends to the local
|
|
52
|
+
* store optimistically, then sends to the server. If the WS is offline,
|
|
53
|
+
* the local store is still updated and the message is dropped from the
|
|
54
|
+
* wire — callers should re-send after reconnect if guaranteed delivery is
|
|
55
|
+
* required (the simple agent loop should just regenerate from history).
|
|
56
|
+
*/
|
|
57
|
+
sendReply(opts: {
|
|
58
|
+
convId: string;
|
|
59
|
+
walletAddress: string;
|
|
60
|
+
text: string;
|
|
61
|
+
replyTo?: string | null;
|
|
62
|
+
}): Promise<{
|
|
63
|
+
id: string;
|
|
64
|
+
delivered: boolean;
|
|
65
|
+
}>;
|
|
66
|
+
private connect;
|
|
67
|
+
private handleFrame;
|
|
68
|
+
private persistInbound;
|
|
69
|
+
private handleChannelJoin;
|
|
70
|
+
private respondToReceiptRequest;
|
|
71
|
+
private respondToHistoryRequest;
|
|
72
|
+
private sendFrame;
|
|
73
|
+
private startHeartbeat;
|
|
74
|
+
private scheduleReconnect;
|
|
75
|
+
private clearTimers;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=chat-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-client.d.ts","sourceRoot":"","sources":["../src/chat-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,EAAE,SAAS,EAA6B,MAAM,iBAAiB,CAAC;AACvE,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAGhB,uBAAuB,EACvB,gBAAgB,EAGjB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,kBAAkB;IACjC,wFAAwF;IACxF,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,uBAAuB,GAAG,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1F,oDAAoD;IACpD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,2EAA2E;IAC3E,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;QAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;KAAE,CAAC;CAChF;AASD,qBAAa,UAAU;IACrB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmE;IAC1F,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwE;IAC/F,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAElC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,IAAI,EAAE;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,UAAU,CAAC;QACnB,QAAQ,CAAC,EAAE,kBAAkB,CAAC;KAC/B;IAmBD,6FAA6F;IAC7F,QAAQ,IAAI,SAAS;IAIrB,WAAW,IAAI,OAAO;IAItB,KAAK,IAAI,IAAI;IAab,IAAI,IAAI,IAAI;IAaZ;;;;;;OAMG;IACG,SAAS,CAAC,IAAI,EAAE;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACzB,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IA4B/C,OAAO,CAAC,OAAO;YA2DD,WAAW;YAqDX,cAAc;YAed,iBAAiB;YAwBjB,uBAAuB;YAuCvB,uBAAuB;IAmBrC,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,WAAW;CAIpB"}
|