Skip to content

Commit 8ed5132

Browse files
committed
fix(reply): keep sessions_send delivery single-owner
1 parent 2cd6078 commit 8ed5132

4 files changed

Lines changed: 18 additions & 1 deletion

File tree

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1481,6 +1481,7 @@ describe("sessions tools", () => {
14811481
isStreaming: () => true,
14821482
isCompacting: () => false,
14831483
supportsTranscriptCommitWait: true,
1484+
sourceReplyDeliveryMode: "message_tool_only",
14841485
abort: () => {},
14851486
},
14861487
runScopedCallerKey,
@@ -1533,6 +1534,7 @@ describe("sessions tools", () => {
15331534
debounceMs: 0,
15341535
deliveryTimeoutMs: 30_000,
15351536
waitForTranscriptCommit: true,
1537+
sourceReplyDeliveryMode: "message_tool_only",
15361538
});
15371539

15381540
await vi.waitFor(() => {
@@ -1587,6 +1589,7 @@ describe("sessions tools", () => {
15871589
queueMessage,
15881590
isStreaming: () => true,
15891591
isCompacting: () => false,
1592+
sourceReplyDeliveryMode: "message_tool_only",
15901593
abort: () => {},
15911594
},
15921595
runScopedCallerKey,
@@ -1622,6 +1625,7 @@ describe("sessions tools", () => {
16221625
steeringMode: "all",
16231626
debounceMs: 0,
16241627
deliveryTimeoutMs: 30_000,
1628+
sourceReplyDeliveryMode: "message_tool_only",
16251629
});
16261630
expect(calls.some((call) => call.method === "agent")).toBe(false);
16271631
});
@@ -1638,6 +1642,7 @@ describe("sessions tools", () => {
16381642
isStreaming: () => true,
16391643
isCompacting: () => false,
16401644
supportsTranscriptCommitWait: true,
1645+
sourceReplyDeliveryMode: "message_tool_only",
16411646
abort: () => {},
16421647
},
16431648
runScopedCallerKey,

src/agents/tools/agent-step.test.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,15 @@ describe("runAgentStep", () => {
5252
message?: string;
5353
sessionKey?: string;
5454
deliver?: boolean;
55+
sourceReplyDeliveryMode?: string;
5556
lane?: string;
5657
inputProvenance?: { kind?: string; sourceTool?: string };
5758
}
5859
| undefined;
5960
expect(params?.message).toContain("[Inter-session message");
6061
expect(params?.sessionKey).toBe("agent:main:subagent:child");
6162
expect(params?.deliver).toBe(false);
63+
expect(params?.sourceReplyDeliveryMode).toBe("message_tool_only");
6264
expect(params?.lane).toBe("nested:agent:main:subagent:child");
6365
expect(params?.inputProvenance?.kind).toBe("inter_session");
6466
expect(params?.inputProvenance?.sourceTool).toBe("sessions_send");
@@ -119,10 +121,11 @@ describe("runAgentStep", () => {
119121
expect(gatewayCalls).toStrictEqual([]);
120122
expect(agentCommandFromIngress).toHaveBeenCalledTimes(1);
121123
const ingressCalls = agentCommandFromIngress.mock.calls as unknown as Array<
122-
[{ message?: string; transcriptMessage?: string }]
124+
[{ message?: string; sourceReplyDeliveryMode?: string; transcriptMessage?: string }]
123125
>;
124126
const ingress = ingressCalls[0]?.[0];
125127
expect(ingress?.message).toContain("internal announce step");
128+
expect(ingress?.sourceReplyDeliveryMode).toBe("message_tool_only");
126129
expect(ingress?.transcriptMessage).toBe("");
127130
});
128131
});

src/agents/tools/agent-step.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ export async function runAgentStep(params: {
6969
transcriptMessage: params.transcriptMessage,
7070
sessionKey: params.sessionKey,
7171
deliver: false,
72+
sourceReplyDeliveryMode: "message_tool_only",
7273
channel,
7374
lane,
7475
runId: stepIdem,
@@ -89,6 +90,7 @@ export async function runAgentStep(params: {
8990
sessionKey: params.sessionKey,
9091
idempotencyKey: stepIdem,
9192
deliver: false,
93+
sourceReplyDeliveryMode: "message_tool_only",
9294
channel,
9395
lane,
9496
extraSystemPrompt: params.extraSystemPrompt,

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,11 +226,17 @@ async function startAgentRun(params: {
226226
const messageText =
227227
typeof params.sendParams.message === "string" ? params.sendParams.message : undefined;
228228
if (activeRunSessionId && fallbackSessionKey && messageText) {
229+
const sourceReplyDeliveryMode =
230+
params.sendParams.sourceReplyDeliveryMode === "automatic" ||
231+
params.sendParams.sourceReplyDeliveryMode === "message_tool_only"
232+
? params.sendParams.sourceReplyDeliveryMode
233+
: undefined;
229234
const queueOptions: EmbeddedAgentQueueMessageOptions = {
230235
steeringMode: "all",
231236
debounceMs: 0,
232237
deliveryTimeoutMs: params.deliveryTimeoutMs,
233238
waitForTranscriptCommit: true,
239+
...(sourceReplyDeliveryMode ? { sourceReplyDeliveryMode } : {}),
234240
};
235241
let queueOutcome = await queueEmbeddedAgentMessageWithOutcomeAsync(
236242
activeRunSessionId,
@@ -557,6 +563,7 @@ export function createSessionsSendTool(opts?: {
557563
sessionKey: resolvedKey,
558564
idempotencyKey,
559565
deliver: false,
566+
sourceReplyDeliveryMode: "message_tool_only" as const,
560567
channel: INTERNAL_MESSAGE_CHANNEL,
561568
lane: resolveNestedAgentLaneForSession(resolvedKey),
562569
extraSystemPrompt: agentMessageContext,

0 commit comments

Comments
 (0)