Skip to content

Commit 883e75b

Browse files
fix: route A2A return prompt through message tool
1 parent 962de1b commit 883e75b

3 files changed

Lines changed: 20 additions & 9 deletions

File tree

src/agents/openclaw-tools.sessions.test.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1156,8 +1156,12 @@ describe("sessions tools", () => {
11561156
`Agent 1 (requester) session: ${requesterKey}.`,
11571157
);
11581158
expect(initialAgentParams.extraSystemPrompt).toContain(
1159-
`Return replies with sessions_send(sessionKey: "${requesterKey}", message: ...).`,
1159+
'Return visible replies to the requester source conversation with message(action="send", message=...).',
11601160
);
1161+
expect(initialAgentParams.extraSystemPrompt).toContain(
1162+
"Do not call sessions_send back to the requester.",
1163+
);
1164+
expect(initialAgentParams.extraSystemPrompt).not.toContain("sessions_send(sessionKey:");
11611165
expect(initialAgentParams.extraSystemPrompt).toContain("Agent 1 (requester) channel: discord.");
11621166
expect(initialAgentParams.extraSystemPrompt).toContain(
11631167
"Agent 2 (target) session: <TARGET_SESSION>.",

src/agents/tools/sessions-send-helpers.test.ts

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ describe("resolvePingPongTurns", () => {
100100
});
101101

102102
describe("agent-to-agent prompt context", () => {
103-
it("includes the concrete requester session as the return path", () => {
103+
it("includes the concrete requester session as source-reply context", () => {
104104
const context = buildAgentToAgentMessageContext({
105105
requesterSessionKey: "agent:main:slack:channel:C123:thread:171.222",
106106
requesterChannel: "slack",
@@ -111,14 +111,16 @@ describe("agent-to-agent prompt context", () => {
111111
"Agent 1 (requester) session: agent:main:slack:channel:C123:thread:171.222.",
112112
);
113113
expect(context).toContain(
114-
'Return replies with sessions_send(sessionKey: "agent:main:slack:channel:C123:thread:171.222", message: ...).',
114+
'Return visible replies to the requester source conversation with message(action="send", message=...).',
115115
);
116+
expect(context).toContain("Do not call sessions_send back to the requester.");
116117
expect(context).toContain("Agent 1 (requester) channel: slack.");
117118
expect(context).toContain("Agent 2 (target) session: <TARGET_SESSION>.");
119+
expect(context).not.toContain("sessions_send(sessionKey:");
118120
expect(context).not.toContain("agent:worker:discord:channel:ops:run:run-123");
119121
});
120122

121-
it("keeps WhatsApp group requester keys concrete for return routing", () => {
123+
it("keeps WhatsApp group requester keys concrete for source-reply context", () => {
122124
const context = buildAgentToAgentMessageContext({
123125
requesterSessionKey: "agent:koro:whatsapp:group:[email protected]",
124126
requesterChannel: "whatsapp",
@@ -129,9 +131,11 @@ describe("agent-to-agent prompt context", () => {
129131
"Agent 1 (requester) session: agent:koro:whatsapp:group:[email protected].",
130132
);
131133
expect(context).toContain(
132-
'Return replies with sessions_send(sessionKey: "agent:koro:whatsapp:group:[email protected]", message: ...).',
134+
'Return visible replies to the requester source conversation with message(action="send", message=...).',
133135
);
136+
expect(context).toContain("Do not call sessions_send back to the requester.");
134137
expect(context).toContain("Agent 1 (requester) channel: whatsapp.");
138+
expect(context).not.toContain("sessions_send(sessionKey:");
135139
});
136140

137141
it("keeps ping-pong session lines placeholdered with concrete channel values", () => {
@@ -146,7 +150,8 @@ describe("agent-to-agent prompt context", () => {
146150

147151
expect(context).toContain("Current agent: Agent 2 (target).");
148152
expect(context).toContain("Agent 1 (requester) session: <REQUESTER_SESSION>.");
149-
expect(context).not.toContain("Return replies with sessions_send");
153+
expect(context).not.toContain("Return visible replies");
154+
expect(context).not.toContain("sessions_send(sessionKey:");
150155
expect(context).not.toContain("Agent 1 (requester) channel:");
151156
expect(context).toContain("Agent 2 (target) session: <TARGET_SESSION>.");
152157
expect(context).toContain("Agent 2 (target) channel: telegram.");
@@ -166,7 +171,8 @@ describe("agent-to-agent prompt context", () => {
166171

167172
expect(context).toContain("Current agent: Agent 1 (requester).");
168173
expect(context).toContain("Agent 1 (requester) session: <REQUESTER_SESSION>.");
169-
expect(context).not.toContain("Return replies with sessions_send");
174+
expect(context).not.toContain("Return visible replies");
175+
expect(context).not.toContain("sessions_send(sessionKey:");
170176
expect(context).not.toContain("agent:koro:whatsapp:group:[email protected]");
171177
});
172178

@@ -182,7 +188,8 @@ describe("agent-to-agent prompt context", () => {
182188
});
183189

184190
expect(context).toContain("Agent 1 (requester) session: <REQUESTER_SESSION>.");
185-
expect(context).not.toContain("Return replies with sessions_send");
191+
expect(context).not.toContain("Return visible replies");
192+
expect(context).not.toContain("sessions_send(sessionKey:");
186193
expect(context).not.toContain("agent:koro:whatsapp:group:[email protected]");
187194
expect(context).not.toContain("agent:alfred:main");
188195
});

src/agents/tools/sessions-send-helpers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ function buildAgentSessionLines(params: {
6868
: undefined;
6969
const requesterReturnLine =
7070
params.requesterSessionKey && params.includeRequesterReturnInstruction
71-
? `Return replies with sessions_send(sessionKey: "${params.requesterSessionKey}", message: ...).`
71+
? `Return visible replies to the requester source conversation with message(action="send", message=...). Do not call sessions_send back to the requester.`
7272
: undefined;
7373
return [
7474
requesterSessionLine,

0 commit comments

Comments
 (0)