From 8378d523ce64112ecd9463de2b6aeb103dfc6383 Mon Sep 17 00:00:00 2001 From: roboomp Date: Sat, 1 Aug 2026 17:10:36 +0000 Subject: [PATCH] fix(collab): converted guest prompts in side requests Routed direct custom-message conversion through the collab steering transform so side requests and compaction see the same enveloped user turn as primary requests. Extended the regression test to exercise convertToLlm without transformContext. --- packages/coding-agent/src/session/messages.ts | 4 ++++ packages/coding-agent/test/session-messages.test.ts | 13 +++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/coding-agent/src/session/messages.ts b/packages/coding-agent/src/session/messages.ts index 58626f533..c7ddc5c84 100644 --- a/packages/coding-agent/src/session/messages.ts +++ b/packages/coding-agent/src/session/messages.ts @@ -1166,6 +1166,10 @@ function convertOne(m: AgentMessage, interruptedNext: boolean): Message[] { } case "custom": { if (!isCustomMessageContent(m.content)) return []; + if (isSteeringUserMessage(m)) { + const converted = convertMessageToLlm(wrapSteeringUserMessage(m)); + return converted ? [converted] : []; + } if (isUserInvokedSkillPrompt(m)) { return [ { diff --git a/packages/coding-agent/test/session-messages.test.ts b/packages/coding-agent/test/session-messages.test.ts index 35de44478..ed3fefbfd 100644 --- a/packages/coding-agent/test/session-messages.test.ts +++ b/packages/coding-agent/test/session-messages.test.ts @@ -383,7 +383,7 @@ describe("wrapSteeringForModel", () => { expect(wrappedText).not.toContain("&"); }); - it("presents user-attributed collab prompts as wrapped user turns", () => { + it("presents user-attributed collab prompts as wrapped user turns on every conversion path", () => { const message: AgentMessage = { role: "custom", customType: COLLAB_PROMPT_MESSAGE_TYPE, @@ -394,14 +394,19 @@ describe("wrapSteeringForModel", () => { timestamp: 1, }; + const directlyConverted = convertToLlm([message]); const wrapped = wrapSteeringForModel([message]); - const providerMessages = convertToLlm(wrapped); + const primaryProviderMessages = convertToLlm(wrapped); + expect(directlyConverted).toHaveLength(1); + expect(directlyConverted[0]?.role).toBe("user"); + expect(getUserText(directlyConverted[0])).toContain(""); + expect(getUserText(directlyConverted[0])).toContain("Reply with exactly PONG"); expect(wrapped[0]?.role).toBe("user"); expect(getUserText(wrapped[0])).toContain(""); expect(getUserText(wrapped[0])).toContain("Reply with exactly PONG"); - expect(providerMessages).toHaveLength(1); - expect(providerMessages[0]?.role).toBe("user"); + expect(primaryProviderMessages).toHaveLength(1); + expect(primaryProviderMessages[0]?.role).toBe("user"); expect(message).toMatchObject({ role: "custom", details: { from: "guest" },