From e1ff653ade197cf1e63a87552fd0a2322436600a Mon Sep 17 00:00:00 2001 From: Shakker Date: Mon, 25 May 2026 17:59:14 +0100 Subject: [PATCH] fix: preserve queued media user turns for pi followups --- src/auto-reply/reply/followup-runner.test.ts | 33 ++++++++++++++++++++ src/auto-reply/reply/followup-runner.ts | 1 + 2 files changed, 34 insertions(+) diff --git a/src/auto-reply/reply/followup-runner.test.ts b/src/auto-reply/reply/followup-runner.test.ts index 5bec4fa37f5d..7d5f82e51d5e 100644 --- a/src/auto-reply/reply/followup-runner.test.ts +++ b/src/auto-reply/reply/followup-runner.test.ts @@ -547,6 +547,39 @@ function createQueuedRun( } describe("createFollowupRunner reply-lane admission", () => { + it("passes prepared media user turns to embedded runtime dispatch", async () => { + const userMessageForPersistence = { + role: "user", + content: "describe this", + MediaPath: "/tmp/image.png", + MediaType: "image/png", + } as never; + runEmbeddedPiAgentMock.mockResolvedValueOnce({ + payloads: [{ text: "done" }], + meta: {}, + }); + const runner = createFollowupRunner({ + typing: createMockTypingController(), + typingMode: "instant", + sessionKey: "main", + defaultModel: "anthropic/claude", + }); + + await runner( + createQueuedRun({ + userMessageForPersistence, + run: { + provider: "anthropic", + model: "claude", + }, + }), + ); + + expect(runEmbeddedPiAgentMock).toHaveBeenCalledOnce(); + const call = requireLastMockCallArg(runEmbeddedPiAgentMock, "run embedded pi agent"); + expect(call.userMessageForPersistence).toBe(userMessageForPersistence); + }); + it("runs queued followups with the session id returned by admission", async () => { const active = createReplyOperationForTest({ sessionKey: "main", diff --git a/src/auto-reply/reply/followup-runner.ts b/src/auto-reply/reply/followup-runner.ts index a55543bfbcea..7521374ce74f 100644 --- a/src/auto-reply/reply/followup-runner.ts +++ b/src/auto-reply/reply/followup-runner.ts @@ -820,6 +820,7 @@ export function createFollowupRunner(params: { skillsSnapshot: run.skillsSnapshot, prompt: queued.prompt, transcriptPrompt: queued.transcriptPrompt, + userMessageForPersistence: effectiveQueued.userMessageForPersistence, currentInboundEventKind: queued.currentInboundEventKind, currentInboundContext: queued.currentInboundContext, extraSystemPrompt: run.extraSystemPrompt,