diff --git a/packages/app/e2e/regression/session-timeline-header.spec.ts b/packages/app/e2e/regression/session-timeline-header.spec.ts new file mode 100644 index 000000000000..0f12f6ec4059 --- /dev/null +++ b/packages/app/e2e/regression/session-timeline-header.spec.ts @@ -0,0 +1,30 @@ +import { expect, test } from "@playwright/test" +import { base64Encode } from "@opencode-ai/core/util/encode" +import { fixture } from "../smoke/session-timeline.fixture" +import { mockOpenCodeServer } from "../utils/mock-server" +import { expectAppVisible } from "../utils/waits" + +const sessionID = "ses_untitled_header_regression" + +test("keeps the header visible for a persisted untitled session", async ({ page }) => { + await mockOpenCodeServer(page, { + sessions: [{ ...fixture.sessions[0], id: sessionID, title: "" }], + provider: fixture.provider, + directory: fixture.directory, + project: fixture.project, + pageMessages: () => ({ items: [] }), + }) + await page.addInitScript(() => { + localStorage.setItem("settings.v3", JSON.stringify({ general: { newLayoutDesigns: true } })) + }) + + await page.goto(`/${base64Encode(fixture.directory)}/session/${sessionID}`) + await expectAppVisible(page.getByRole("textbox", { name: "Prompt" })) + const header = page.locator("[data-session-title]") + await expect(header).toBeVisible() + await expect(header.getByRole("button", { name: "More options" })).toBeVisible() + + await page.goto(`/${base64Encode(fixture.directory)}/session`) + await expectAppVisible(page.getByRole("textbox", { name: "Prompt" })) + await expect(page.locator("[data-session-title]")).toHaveCount(0) +}) diff --git a/packages/app/src/pages/session/timeline/message-timeline.tsx b/packages/app/src/pages/session/timeline/message-timeline.tsx index 25abdc9e7341..408965a10314 100644 --- a/packages/app/src/pages/session/timeline/message-timeline.tsx +++ b/packages/app/src/pages/session/timeline/message-timeline.tsx @@ -329,7 +329,7 @@ export function MessageTimeline(props: { if (value) return value return language.t("command.session.new") }) - const showHeader = createMemo(() => !!(titleValue() || parentID())) + const showHeader = createMemo(() => !!sessionID()) const projection = createTimelineProjection({ messages: sessionMessages, userMessages: () => props.userMessages,