import { expect, fakeServerState, gotoWorkbench, test } from "../fixtures/test"; import { selectors } from "../fixtures/selectors"; test("new optimistic session first turn does not submit local thr_* as upstream thread", async ({ page }) => { await gotoWorkbench(page); await page.locator(selectors.sessionCreate).click(); const activeTab = page.locator('.session-tab[data-active="true"]'); await expect(activeTab).toHaveAttribute("data-session-id", /^ses_/u); const sessionId = await activeTab.getAttribute("data-session-id"); expect(sessionId).toBeTruthy(); await page.locator(selectors.commandInput).fill("web-probe D601 v0.3 smoke: reply with exactly OK."); await expect(page.locator(selectors.commandSend)).toBeEnabled(); await page.locator(selectors.commandSend).click(); await expect.poll(async () => ((await fakeServerState(page)).chatRequests as unknown[]).length).toBe(1); const state = await fakeServerState(page); const request = (state.chatRequests as Record[])[0]; if (!request) throw new Error("expected one chat request"); expect(request.conversationId).toBeUndefined(); expect(request.projectId).toBeUndefined(); expect(request.workspaceId).toBeUndefined(); expect(request.sessionId).toBe(sessionId); expect(request.threadId ?? null).toBeNull(); expect((state.legacyRequestLedger as unknown[]).length).toBe(0); }); test.describe("server authoritative session create", () => { test.use({ scenarioId: "server-authoritative-create" }); test("new session adopts backend selected conversation before submit", async ({ page }) => { await gotoWorkbench(page); await page.locator(selectors.sessionCreate).click(); await expect(page).toHaveURL(/\/workbench\/sessions\/ses_server_created/u); await expect(page.locator('.session-tab[data-session-id="ses_server_created"]')).toHaveAttribute("data-active", "true"); await expect(page.locator('.session-tab[data-session-id="ses_server_created"]')).toHaveAttribute("data-running", "false"); await page.locator(selectors.commandInput).fill("server authoritative create smoke"); await expect(page.locator(selectors.commandSend)).toBeEnabled(); await page.locator(selectors.commandSend).click(); await expect.poll(async () => ((await fakeServerState(page)).chatRequests as unknown[]).length).toBe(1); const state = await fakeServerState(page); const request = (state.chatRequests as Record[])[0]; expect(request?.conversationId).toBeUndefined(); expect(request?.projectId).toBeUndefined(); expect(request?.workspaceId).toBeUndefined(); expect(request?.sessionId).toBe("ses_server_created"); expect((state.legacyRequestLedger as unknown[]).length).toBe(0); }); }); test.describe("session create and delete authority", () => { test.use({ scenarioId: "server-authoritative-create" }); test("created session becomes active and deleted session stays archived after reload", async ({ page }) => { await gotoWorkbench(page); await page.locator(selectors.sessionCreate).click(); await expect(page).toHaveURL(/\/workbench\/sessions\/ses_server_created/u); await expect(page.locator('.session-tab[data-session-id="ses_server_created"]')).toHaveAttribute("data-active", "true"); await expect(page.locator(selectors.commandSend)).toBeDisabled(); await page.locator(selectors.sessionDelete).click(); await expect(page.locator('.session-tab[data-session-id="ses_server_created"]')).toHaveCount(0); await page.reload(); await expect(page.locator('.session-tab[data-session-id="ses_server_created"]')).toHaveCount(0); const state = await fakeServerState(page); const deleted = (state.sessions as Array<{ sessionId?: string; status?: string }>).find((item) => item.sessionId === "ses_server_created"); expect(deleted?.status).toBe("archived"); }); });