diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx index b9b2e2a62..62bf0fa79 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -93,6 +93,7 @@ import { DialogGoUpsell } from "../../component/dialog-go-upsell" import { DialogTokenPlan } from "../../component/dialog-token-plan" import { SessionRetry } from "@/session/retry" import { getRevertDiffFiles } from "../../util/revert-diff" +import { conversationScrollKey } from "./scroll" addDefaultParsers(parsers.parsers) @@ -1082,8 +1083,9 @@ export function Session() { } }) - // snap to bottom when session changes - createEffect(on(() => route.sessionID, toBottom)) + // Snap to bottom when the rendered conversation changes. Subagent views share + // the same sessionID, so key by agentID as well as sessionID. + createEffect(on(() => conversationScrollKey({ sessionID: route.sessionID, agentID: currentAgentID() }), toBottom)) return ( { + expect(conversationScrollKey({ sessionID: "ses_1", agentID: "main" })).toBe("ses_1:main") + expect(conversationScrollKey({ sessionID: "ses_1", agentID: "agent_1" })).toBe("ses_1:agent_1") +}) + +test("conversationScrollKey defaults missing agentID to main", () => { + expect(conversationScrollKey({ sessionID: "ses_1" })).toBe("ses_1:main") +})