@perkos/perkos-a2a 0.8.22 → 0.8.24
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.d.ts.map +1 -1
- package/dist/agentic-actions.js +81 -8
- package/dist/agentic-actions.js.map +1 -1
- package/dist/index.js +73 -9
- package/dist/index.js.map +2 -2
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentic-actions.d.ts","sourceRoot":"","sources":["../src/agentic-actions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,KAAK,aAAa,GAAG;IACnB,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtE,CAAC;AAEF,KAAK,MAAM,GAAG;IAAE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"agentic-actions.d.ts","sourceRoot":"","sources":["../src/agentic-actions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,KAAK,aAAa,GAAG;IACnB,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtE,CAAC;AAEF,KAAK,MAAM,GAAG;IAAE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;CAAE,CAAC;AA+K1F,wBAAsB,oBAAoB,CAAC,KAAK,EAAE;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,OAAO,CAAC,CAwGnB"}
|
package/dist/agentic-actions.js
CHANGED
|
@@ -16,8 +16,16 @@ function requestedMarker(text, fallback) {
|
|
|
16
16
|
}
|
|
17
17
|
return fallback;
|
|
18
18
|
}
|
|
19
|
+
function stripDelegationNoise(text) {
|
|
20
|
+
return text
|
|
21
|
+
.replace(/^Delegated by .*?\.\s*/i, "")
|
|
22
|
+
.replace(/^Delegated request:\s*/i, "")
|
|
23
|
+
.replace(/^A2A-DELEGATION[^\n]*\n?/gim, "")
|
|
24
|
+
.replace(/End with DELEGATED_A2A_DONE\.?/gi, "")
|
|
25
|
+
.trim();
|
|
26
|
+
}
|
|
19
27
|
function detectTarget(text, selfName) {
|
|
20
|
-
const routingText = text
|
|
28
|
+
const routingText = stripDelegationNoise(text);
|
|
21
29
|
const candidates = [
|
|
22
30
|
["Perkos-Claw-Tester", ["perkos-claw-tester", "openclaw", "open claw", "claw"]],
|
|
23
31
|
["Perkos-Hermes-Tester", ["perkos-hermes-tester", "hermes"]],
|
|
@@ -32,13 +40,14 @@ function detectTarget(text, selfName) {
|
|
|
32
40
|
return undefined;
|
|
33
41
|
}
|
|
34
42
|
function detectReplyTarget(text, selfName) {
|
|
35
|
-
|
|
43
|
+
const routingText = stripDelegationNoise(text);
|
|
44
|
+
if (selfName !== "Morpheus-A2A-Receiver" && includesAny(routingText, ["morpheus-a2a-receiver", "morpheus"])) {
|
|
36
45
|
return "Morpheus-A2A-Receiver";
|
|
37
46
|
}
|
|
38
|
-
if (selfName !== "Perkos-Claw-Tester" && includesAny(
|
|
47
|
+
if (selfName !== "Perkos-Claw-Tester" && includesAny(routingText, ["perkos-claw-tester", "openclaw", "open claw"])) {
|
|
39
48
|
return "Perkos-Claw-Tester";
|
|
40
49
|
}
|
|
41
|
-
if (selfName !== "Perkos-Hermes-Tester" && includesAny(
|
|
50
|
+
if (selfName !== "Perkos-Hermes-Tester" && includesAny(routingText, ["perkos-hermes-tester", "hermes"])) {
|
|
42
51
|
return "Perkos-Hermes-Tester";
|
|
43
52
|
}
|
|
44
53
|
return undefined;
|
|
@@ -102,9 +111,59 @@ function extractTaskFinalText(result) {
|
|
|
102
111
|
}
|
|
103
112
|
return snippets.at(-1) || JSON.stringify(result);
|
|
104
113
|
}
|
|
114
|
+
function hasA2ARelayExplainTask(text) {
|
|
115
|
+
return includesAny(text, ["a2a relay", "relay a2a", "qué es un a2a relay", "what an a2a relay is"]);
|
|
116
|
+
}
|
|
117
|
+
function answerA2ARelay(selfName) {
|
|
118
|
+
return [
|
|
119
|
+
`${selfName} result:`,
|
|
120
|
+
"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.",
|
|
121
|
+
"It handles registration, discovery, message routing, heartbeats, and delivery fallback while each agent keeps its own runtime and local permissions.",
|
|
122
|
+
].join("\n");
|
|
123
|
+
}
|
|
124
|
+
function delegationDepth(text) {
|
|
125
|
+
const match = text.match(/A2A-DELEGATION[^\n]*depth=(\d+)/i);
|
|
126
|
+
return match?.[1] ? Number(match[1]) : 0;
|
|
127
|
+
}
|
|
128
|
+
function cleanNestedResult(text, finalMarker) {
|
|
129
|
+
const escaped = finalMarker.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
130
|
+
return text
|
|
131
|
+
.replace(new RegExp(`\\n?${escaped}\\s*$`, "g"), "")
|
|
132
|
+
.replace(/\n?DELEGATED_A2A_DONE\s*$/g, "")
|
|
133
|
+
.trim();
|
|
134
|
+
}
|
|
135
|
+
function buildDelegatedMessage(input) {
|
|
136
|
+
const { originalText, selfName, target, marker } = input;
|
|
137
|
+
const depth = delegationDepth(originalText) + 1;
|
|
138
|
+
const clean = stripDelegationNoise(originalText);
|
|
139
|
+
const header = `A2A-DELEGATION origin=${selfName} target=${target} depth=${depth}`;
|
|
140
|
+
if (hasA2ARelayExplainTask(clean)) {
|
|
141
|
+
if (target === "Perkos-Hermes-Tester") {
|
|
142
|
+
return [
|
|
143
|
+
header,
|
|
144
|
+
"Complete this task directly. Briefly explain what an A2A relay is and why agents use it.",
|
|
145
|
+
"Do not delegate this request further unless explicitly required by a new instruction.",
|
|
146
|
+
"End with DELEGATED_A2A_DONE.",
|
|
147
|
+
].join("\n");
|
|
148
|
+
}
|
|
149
|
+
return [
|
|
150
|
+
header,
|
|
151
|
+
"Use A2A to ask Perkos-Hermes-Tester to briefly explain what an A2A relay is and why agents use it.",
|
|
152
|
+
"Return Hermes' useful result in your response.",
|
|
153
|
+
`End exactly with ${marker}.`,
|
|
154
|
+
].join("\n");
|
|
155
|
+
}
|
|
156
|
+
return [
|
|
157
|
+
header,
|
|
158
|
+
"Complete or delegate the following task once. Do not echo this request back to agents already named in the route.",
|
|
159
|
+
clean,
|
|
160
|
+
`End exactly with ${marker}.`,
|
|
161
|
+
].join("\n");
|
|
162
|
+
}
|
|
105
163
|
export async function tryHandleAgenticTask(input) {
|
|
106
164
|
const { selfName, server, task, text, logger } = input;
|
|
107
|
-
const
|
|
165
|
+
const cleanText = stripDelegationNoise(text);
|
|
166
|
+
const wantsDelegation = includesAny(cleanText, ["usa comunicación a2a", "usar comunicación a2a", "pídele", "dile a", "delegate", "delegar", "tell", "ask"]);
|
|
108
167
|
const wantsEthResearch = includesAny(text, ["precio de eth", "eth price", "ethereum price", "precio actual de eth"]);
|
|
109
168
|
const wantsReply = includesAny(text, ["responda a", "envíe", "envia", "send", "reply", "morpheus"]);
|
|
110
169
|
if (includesAny(text, ["A2A_COMM_TEST", "communication test", "ping test"])) {
|
|
@@ -115,6 +174,11 @@ export async function tryHandleAgenticTask(input) {
|
|
|
115
174
|
].join("\n"));
|
|
116
175
|
return true;
|
|
117
176
|
}
|
|
177
|
+
if (hasA2ARelayExplainTask(cleanText) && (!wantsDelegation || cleanText.toLowerCase().startsWith("complete this task directly"))) {
|
|
178
|
+
const marker = requestedMarker(text, "DELEGATED_A2A_DONE");
|
|
179
|
+
completeTaskWithReply(task, [answerA2ARelay(selfName), "", marker].join("\n"));
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
118
182
|
if (wantsEthResearch && (!wantsDelegation || text.trim().toLowerCase().startsWith("delegated research request"))) {
|
|
119
183
|
const research = await researchEthPrice();
|
|
120
184
|
const replyTarget = wantsReply ? detectReplyTarget(text, selfName) : undefined;
|
|
@@ -144,18 +208,28 @@ export async function tryHandleAgenticTask(input) {
|
|
|
144
208
|
const target = detectTarget(text, selfName);
|
|
145
209
|
if (!target)
|
|
146
210
|
return false;
|
|
211
|
+
if (delegationDepth(text) >= 4) {
|
|
212
|
+
completeTaskWithReply(task, [
|
|
213
|
+
`A2A delegation stopped by ${selfName}: max delegation depth reached.`,
|
|
214
|
+
"This prevents routing loops across heterogeneous agents.",
|
|
215
|
+
requestedMarker(text, "A2A_DELEGATION_STOPPED"),
|
|
216
|
+
].join("\n"));
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
147
219
|
const replyTarget = wantsReply ? detectReplyTarget(text, selfName) : undefined;
|
|
220
|
+
const finalMarker = requestedMarker(text, "TRI_HERMES_DONE");
|
|
148
221
|
const delegatedMessage = wantsEthResearch
|
|
149
222
|
? [
|
|
223
|
+
`A2A-DELEGATION origin=${selfName} target=${target} depth=${delegationDepth(text) + 1}`,
|
|
150
224
|
"Delegated research request. Research the current ETH price using available live/public APIs.",
|
|
151
225
|
"Return concise findings with source names, timestamp if available, and limitations.",
|
|
152
226
|
replyTarget ? `If possible, send the final result to ${replyTarget} via A2A.` : "",
|
|
153
227
|
"End with DELEGATED_ETH_RESEARCH_DONE.",
|
|
154
228
|
].filter(Boolean).join("\n")
|
|
155
|
-
:
|
|
229
|
+
: buildDelegatedMessage({ originalText: text, selfName, target, marker: finalMarker });
|
|
156
230
|
logger.info(`[perkos-a2a] Agentic delegation: ${selfName} -> ${target}${replyTarget ? ` -> ${replyTarget}` : ""}`);
|
|
157
231
|
const delegatedResult = await server.sendTask(target, delegatedMessage);
|
|
158
|
-
const delegatedText = extractTaskFinalText(delegatedResult);
|
|
232
|
+
const delegatedText = cleanNestedResult(extractTaskFinalText(delegatedResult), finalMarker);
|
|
159
233
|
let replyResultText = "";
|
|
160
234
|
if (replyTarget && replyTarget !== target) {
|
|
161
235
|
const replyMessage = [
|
|
@@ -168,7 +242,6 @@ export async function tryHandleAgenticTask(input) {
|
|
|
168
242
|
const replyResult = await server.sendTask(replyTarget, replyMessage);
|
|
169
243
|
replyResultText = extractTaskFinalText(replyResult);
|
|
170
244
|
}
|
|
171
|
-
const finalMarker = requestedMarker(text, "TRI_HERMES_DONE");
|
|
172
245
|
completeTaskWithReply(task, [
|
|
173
246
|
`Agentic A2A delegation completed by ${selfName}.`,
|
|
174
247
|
`Delegated target: ${target}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentic-actions.js","sourceRoot":"","sources":["../src/agentic-actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAS3D,SAAS,WAAW,CAAC,IAAY,EAAE,KAAe;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,QAAgB;IACrD,MAAM,QAAQ,GAAG;QACf,2DAA2D;QAC3D,oDAAoD;QACpD,2BAA2B;KAC5B,CAAC;IACF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAChD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,
|
|
1
|
+
{"version":3,"file":"agentic-actions.js","sourceRoot":"","sources":["../src/agentic-actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAS3D,SAAS,WAAW,CAAC,IAAY,EAAE,KAAe;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,QAAgB;IACrD,MAAM,QAAQ,GAAG;QACf,2DAA2D;QAC3D,oDAAoD;QACpD,2BAA2B;KAC5B,CAAC;IACF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAChD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACxC,OAAO,IAAI;SACR,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC;SACtC,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC;SACtC,OAAO,CAAC,6BAA6B,EAAE,EAAE,CAAC;SAC1C,OAAO,CAAC,kCAAkC,EAAE,EAAE,CAAC;SAC/C,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,QAAgB;IAClD,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,UAAU,GAA8B;QAC5C,CAAC,oBAAoB,EAAE,CAAC,oBAAoB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QAC/E,CAAC,sBAAsB,EAAE,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;QAC5D,CAAC,uBAAuB,EAAE,CAAC,uBAAuB,EAAE,UAAU,CAAC,CAAC;KACjE,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,UAAU,EAAE,CAAC;QACvC,IAAI,IAAI,KAAK,QAAQ;YAAE,SAAS;QAChC,IAAI,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IACnD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,QAAgB;IACvD,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,QAAQ,KAAK,uBAAuB,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC,uBAAuB,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;QAC5G,OAAO,uBAAuB,CAAC;IACjC,CAAC;IACD,IAAI,QAAQ,KAAK,oBAAoB,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC,oBAAoB,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QACnH,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IACD,IAAI,QAAQ,KAAK,sBAAsB,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;QACxG,OAAO,sBAAsB,CAAC;IAChC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,GAAW;IAClC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,yBAAyB,EAAE;QAChF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;KACpC,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,aAAa,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACxE,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,oIAAoI,CAAQ,CAAC;QACxK,MAAM,GAAG,GAAG,EAAE,EAAE,QAAQ,CAAC;QACzB,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7G,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACxG,OAAO,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,MAAM,aAAa,OAAO,EAAE,CAAC,CAAC;QAC9G,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,0BAA0B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,iDAAiD,CAAQ,CAAC;QACrF,MAAM,MAAM,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC;QAChC,IAAI,MAAM;YAAE,OAAO,CAAC,IAAI,CAAC,2BAA2B,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,yBAAyB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QAChD,OAAO;YACL,kFAAkF;YAClF,gJAAgJ;SACjJ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,OAAO;QACL,sCAAsC;QACtC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC;QACzC,0FAA0F;KAC3F,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAe;IAC3C,MAAM,SAAS,GAAG,MAAa,CAAC;IAChC,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE,MAAM,IAAI,SAAS,CAAC;IACpG,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,WAAW,GAAG,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;IACvD,KAAK,MAAM,IAAI,IAAI,WAAW;QAAE,IAAI,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ;YAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7F,KAAK,MAAM,QAAQ,IAAI,IAAI,EAAE,SAAS,IAAI,EAAE,EAAE,CAAC;QAC7C,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,KAAK,IAAI,EAAE;YAAE,IAAI,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ;gBAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzG,CAAC;IACD,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY;IAC1C,OAAO,WAAW,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,qBAAqB,EAAE,sBAAsB,CAAC,CAAC,CAAC;AACtG,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,OAAO;QACL,GAAG,QAAQ,UAAU;QACrB,gMAAgM;QAChM,sJAAsJ;KACvJ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC7D,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,WAAmB;IAC1D,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IACnE,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,OAAO,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;SACnD,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC;SACzC,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,qBAAqB,CAAC,KAK9B;IACC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACzD,MAAM,KAAK,GAAG,eAAe,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,yBAAyB,QAAQ,WAAW,MAAM,UAAU,KAAK,EAAE,CAAC;IAEnF,IAAI,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,IAAI,MAAM,KAAK,sBAAsB,EAAE,CAAC;YACtC,OAAO;gBACL,MAAM;gBACN,0FAA0F;gBAC1F,uFAAuF;gBACvF,8BAA8B;aAC/B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;QACD,OAAO;YACL,MAAM;YACN,oGAAoG;YACpG,gDAAgD;YAChD,oBAAoB,MAAM,GAAG;SAC9B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,OAAO;QACL,MAAM;QACN,mHAAmH;QACnH,KAAK;QACL,oBAAoB,MAAM,GAAG;KAC9B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAM1C;IACC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACvD,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,eAAe,GAAG,WAAW,CAAC,SAAS,EAAE,CAAC,sBAAsB,EAAE,uBAAuB,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAC5J,MAAM,gBAAgB,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,sBAAsB,CAAC,CAAC,CAAC;IACrH,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;IAEpG,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,eAAe,EAAE,oBAAoB,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QAC5E,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACpD,qBAAqB,CAAC,IAAI,EAAE;YAC1B,GAAG,QAAQ,qDAAqD;YAChE,MAAM;SACP,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,sBAAsB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,eAAe,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,6BAA6B,CAAC,CAAC,EAAE,CAAC;QACjI,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;QAC3D,qBAAqB,CAAC,IAAI,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,gBAAgB,IAAI,CAAC,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,4BAA4B,CAAC,CAAC,EAAE,CAAC;QACjH,MAAM,QAAQ,GAAG,MAAM,gBAAgB,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/E,IAAI,eAAe,GAAG,EAAE,CAAC;QACzB,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE;gBACrD,wBAAwB,QAAQ,GAAG;gBACnC,EAAE;gBACF,QAAQ;gBACR,EAAE;gBACF,6BAA6B;aAC9B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACd,eAAe,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;QAC1D,qBAAqB,CAAC,IAAI,EAAE;YAC1B,QAAQ;YACR,EAAE;YACF,WAAW,CAAC,CAAC,CAAC,gBAAgB,WAAW,GAAG,CAAC,CAAC,CAAC,SAAS;YACxD,eAAe,CAAC,CAAC,CAAC,2BAA2B,eAAe,EAAE,CAAC,CAAC,CAAC,SAAS;YAC1E,MAAM;SACP,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,eAAe;QAAE,OAAO,KAAK,CAAC;IAEnC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAE1B,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,qBAAqB,CAAC,IAAI,EAAE;YAC1B,6BAA6B,QAAQ,iCAAiC;YACtE,0DAA0D;YAC1D,eAAe,CAAC,IAAI,EAAE,wBAAwB,CAAC;SAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/E,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAC7D,MAAM,gBAAgB,GAAG,gBAAgB;QACvC,CAAC,CAAC;YACE,yBAAyB,QAAQ,WAAW,MAAM,UAAU,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YACvF,8FAA8F;YAC9F,qFAAqF;YACrF,WAAW,CAAC,CAAC,CAAC,yCAAyC,WAAW,WAAW,CAAC,CAAC,CAAC,EAAE;YAClF,uCAAuC;SACxC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9B,CAAC,CAAC,qBAAqB,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IAEzF,MAAM,CAAC,IAAI,CAAC,oCAAoC,QAAQ,OAAO,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,OAAO,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnH,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACxE,MAAM,aAAa,GAAG,iBAAiB,CAAC,oBAAoB,CAAC,eAAe,CAAC,EAAE,WAAW,CAAC,CAAC;IAE5F,IAAI,eAAe,GAAG,EAAE,CAAC;IACzB,IAAI,WAAW,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAC1C,MAAM,YAAY,GAAG;YACnB,yBAAyB,MAAM,kBAAkB,QAAQ,GAAG;YAC5D,EAAE;YACF,aAAa;YACb,EAAE;YACF,+DAA+D;SAChE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QACrE,eAAe,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACtD,CAAC;IAED,qBAAqB,CAAC,IAAI,EAAE;QAC1B,uCAAuC,QAAQ,GAAG;QAClD,qBAAqB,MAAM,EAAE;QAC7B,WAAW,CAAC,CAAC,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS;QACxD,EAAE;QACF,mBAAmB;QACnB,aAAa;QACb,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;QAChC,eAAe,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,SAAS;QACtD,eAAe,IAAI,SAAS;QAC5B,EAAE;QACF,WAAW;KACZ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9B,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -27357,8 +27357,11 @@ function requestedMarker(text, fallback) {
|
|
|
27357
27357
|
}
|
|
27358
27358
|
return fallback;
|
|
27359
27359
|
}
|
|
27360
|
+
function stripDelegationNoise(text) {
|
|
27361
|
+
return text.replace(/^Delegated by .*?\.\s*/i, "").replace(/^Delegated request:\s*/i, "").replace(/^A2A-DELEGATION[^\n]*\n?/gim, "").replace(/End with DELEGATED_A2A_DONE\.?/gi, "").trim();
|
|
27362
|
+
}
|
|
27360
27363
|
function detectTarget(text, selfName) {
|
|
27361
|
-
const routingText = text
|
|
27364
|
+
const routingText = stripDelegationNoise(text);
|
|
27362
27365
|
const candidates = [
|
|
27363
27366
|
["Perkos-Claw-Tester", ["perkos-claw-tester", "openclaw", "open claw", "claw"]],
|
|
27364
27367
|
["Perkos-Hermes-Tester", ["perkos-hermes-tester", "hermes"]],
|
|
@@ -27371,13 +27374,14 @@ function detectTarget(text, selfName) {
|
|
|
27371
27374
|
return void 0;
|
|
27372
27375
|
}
|
|
27373
27376
|
function detectReplyTarget(text, selfName) {
|
|
27374
|
-
|
|
27377
|
+
const routingText = stripDelegationNoise(text);
|
|
27378
|
+
if (selfName !== "Morpheus-A2A-Receiver" && includesAny(routingText, ["morpheus-a2a-receiver", "morpheus"])) {
|
|
27375
27379
|
return "Morpheus-A2A-Receiver";
|
|
27376
27380
|
}
|
|
27377
|
-
if (selfName !== "Perkos-Claw-Tester" && includesAny(
|
|
27381
|
+
if (selfName !== "Perkos-Claw-Tester" && includesAny(routingText, ["perkos-claw-tester", "openclaw", "open claw"])) {
|
|
27378
27382
|
return "Perkos-Claw-Tester";
|
|
27379
27383
|
}
|
|
27380
|
-
if (selfName !== "Perkos-Hermes-Tester" && includesAny(
|
|
27384
|
+
if (selfName !== "Perkos-Hermes-Tester" && includesAny(routingText, ["perkos-hermes-tester", "hermes"])) {
|
|
27381
27385
|
return "Perkos-Hermes-Tester";
|
|
27382
27386
|
}
|
|
27383
27387
|
return void 0;
|
|
@@ -27433,9 +27437,56 @@ function extractTaskFinalText(result) {
|
|
|
27433
27437
|
}
|
|
27434
27438
|
return snippets.at(-1) || JSON.stringify(result);
|
|
27435
27439
|
}
|
|
27440
|
+
function hasA2ARelayExplainTask(text) {
|
|
27441
|
+
return includesAny(text, ["a2a relay", "relay a2a", "qu\xE9 es un a2a relay", "what an a2a relay is"]);
|
|
27442
|
+
}
|
|
27443
|
+
function answerA2ARelay(selfName) {
|
|
27444
|
+
return [
|
|
27445
|
+
`${selfName} result:`,
|
|
27446
|
+
"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.",
|
|
27447
|
+
"It handles registration, discovery, message routing, heartbeats, and delivery fallback while each agent keeps its own runtime and local permissions."
|
|
27448
|
+
].join("\n");
|
|
27449
|
+
}
|
|
27450
|
+
function delegationDepth(text) {
|
|
27451
|
+
const match = text.match(/A2A-DELEGATION[^\n]*depth=(\d+)/i);
|
|
27452
|
+
return match?.[1] ? Number(match[1]) : 0;
|
|
27453
|
+
}
|
|
27454
|
+
function cleanNestedResult(text, finalMarker) {
|
|
27455
|
+
const escaped = finalMarker.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
27456
|
+
return text.replace(new RegExp(`\\n?${escaped}\\s*$`, "g"), "").replace(/\n?DELEGATED_A2A_DONE\s*$/g, "").trim();
|
|
27457
|
+
}
|
|
27458
|
+
function buildDelegatedMessage(input) {
|
|
27459
|
+
const { originalText, selfName, target, marker } = input;
|
|
27460
|
+
const depth = delegationDepth(originalText) + 1;
|
|
27461
|
+
const clean = stripDelegationNoise(originalText);
|
|
27462
|
+
const header = `A2A-DELEGATION origin=${selfName} target=${target} depth=${depth}`;
|
|
27463
|
+
if (hasA2ARelayExplainTask(clean)) {
|
|
27464
|
+
if (target === "Perkos-Hermes-Tester") {
|
|
27465
|
+
return [
|
|
27466
|
+
header,
|
|
27467
|
+
"Complete this task directly. Briefly explain what an A2A relay is and why agents use it.",
|
|
27468
|
+
"Do not delegate this request further unless explicitly required by a new instruction.",
|
|
27469
|
+
"End with DELEGATED_A2A_DONE."
|
|
27470
|
+
].join("\n");
|
|
27471
|
+
}
|
|
27472
|
+
return [
|
|
27473
|
+
header,
|
|
27474
|
+
"Use A2A to ask Perkos-Hermes-Tester to briefly explain what an A2A relay is and why agents use it.",
|
|
27475
|
+
"Return Hermes' useful result in your response.",
|
|
27476
|
+
`End exactly with ${marker}.`
|
|
27477
|
+
].join("\n");
|
|
27478
|
+
}
|
|
27479
|
+
return [
|
|
27480
|
+
header,
|
|
27481
|
+
"Complete or delegate the following task once. Do not echo this request back to agents already named in the route.",
|
|
27482
|
+
clean,
|
|
27483
|
+
`End exactly with ${marker}.`
|
|
27484
|
+
].join("\n");
|
|
27485
|
+
}
|
|
27436
27486
|
async function tryHandleAgenticTask(input) {
|
|
27437
27487
|
const { selfName, server, task, text, logger } = input;
|
|
27438
|
-
const
|
|
27488
|
+
const cleanText = stripDelegationNoise(text);
|
|
27489
|
+
const wantsDelegation = includesAny(cleanText, ["usa comunicaci\xF3n a2a", "usar comunicaci\xF3n a2a", "p\xEDdele", "dile a", "delegate", "delegar", "tell", "ask"]);
|
|
27439
27490
|
const wantsEthResearch = includesAny(text, ["precio de eth", "eth price", "ethereum price", "precio actual de eth"]);
|
|
27440
27491
|
const wantsReply = includesAny(text, ["responda a", "env\xEDe", "envia", "send", "reply", "morpheus"]);
|
|
27441
27492
|
if (includesAny(text, ["A2A_COMM_TEST", "communication test", "ping test"])) {
|
|
@@ -27446,6 +27497,11 @@ async function tryHandleAgenticTask(input) {
|
|
|
27446
27497
|
].join("\n"));
|
|
27447
27498
|
return true;
|
|
27448
27499
|
}
|
|
27500
|
+
if (hasA2ARelayExplainTask(cleanText) && (!wantsDelegation || cleanText.toLowerCase().startsWith("complete this task directly"))) {
|
|
27501
|
+
const marker = requestedMarker(text, "DELEGATED_A2A_DONE");
|
|
27502
|
+
completeTaskWithReply(task, [answerA2ARelay(selfName), "", marker].join("\n"));
|
|
27503
|
+
return true;
|
|
27504
|
+
}
|
|
27449
27505
|
if (wantsEthResearch && (!wantsDelegation || text.trim().toLowerCase().startsWith("delegated research request"))) {
|
|
27450
27506
|
const research = await researchEthPrice();
|
|
27451
27507
|
const replyTarget2 = wantsReply ? detectReplyTarget(text, selfName) : void 0;
|
|
@@ -27474,17 +27530,26 @@ ${replyResultText2}` : void 0,
|
|
|
27474
27530
|
if (!wantsDelegation) return false;
|
|
27475
27531
|
const target = detectTarget(text, selfName);
|
|
27476
27532
|
if (!target) return false;
|
|
27533
|
+
if (delegationDepth(text) >= 4) {
|
|
27534
|
+
completeTaskWithReply(task, [
|
|
27535
|
+
`A2A delegation stopped by ${selfName}: max delegation depth reached.`,
|
|
27536
|
+
"This prevents routing loops across heterogeneous agents.",
|
|
27537
|
+
requestedMarker(text, "A2A_DELEGATION_STOPPED")
|
|
27538
|
+
].join("\n"));
|
|
27539
|
+
return true;
|
|
27540
|
+
}
|
|
27477
27541
|
const replyTarget = wantsReply ? detectReplyTarget(text, selfName) : void 0;
|
|
27542
|
+
const finalMarker = requestedMarker(text, "TRI_HERMES_DONE");
|
|
27478
27543
|
const delegatedMessage = wantsEthResearch ? [
|
|
27544
|
+
`A2A-DELEGATION origin=${selfName} target=${target} depth=${delegationDepth(text) + 1}`,
|
|
27479
27545
|
"Delegated research request. Research the current ETH price using available live/public APIs.",
|
|
27480
27546
|
"Return concise findings with source names, timestamp if available, and limitations.",
|
|
27481
27547
|
replyTarget ? `If possible, send the final result to ${replyTarget} via A2A.` : "",
|
|
27482
27548
|
"End with DELEGATED_ETH_RESEARCH_DONE."
|
|
27483
|
-
].filter(Boolean).join("\n") :
|
|
27484
|
-
End with DELEGATED_A2A_DONE.`;
|
|
27549
|
+
].filter(Boolean).join("\n") : buildDelegatedMessage({ originalText: text, selfName, target, marker: finalMarker });
|
|
27485
27550
|
logger.info(`[perkos-a2a] Agentic delegation: ${selfName} -> ${target}${replyTarget ? ` -> ${replyTarget}` : ""}`);
|
|
27486
27551
|
const delegatedResult = await server.sendTask(target, delegatedMessage);
|
|
27487
|
-
const delegatedText = extractTaskFinalText(delegatedResult);
|
|
27552
|
+
const delegatedText = cleanNestedResult(extractTaskFinalText(delegatedResult), finalMarker);
|
|
27488
27553
|
let replyResultText = "";
|
|
27489
27554
|
if (replyTarget && replyTarget !== target) {
|
|
27490
27555
|
const replyMessage = [
|
|
@@ -27497,7 +27562,6 @@ End with DELEGATED_A2A_DONE.`;
|
|
|
27497
27562
|
const replyResult = await server.sendTask(replyTarget, replyMessage);
|
|
27498
27563
|
replyResultText = extractTaskFinalText(replyResult);
|
|
27499
27564
|
}
|
|
27500
|
-
const finalMarker = requestedMarker(text, "TRI_HERMES_DONE");
|
|
27501
27565
|
completeTaskWithReply(task, [
|
|
27502
27566
|
`Agentic A2A delegation completed by ${selfName}.`,
|
|
27503
27567
|
`Delegated target: ${target}`,
|