diff --git a/packages/app/e2e/prompt/prompt-shell.spec.ts b/packages/app/e2e/prompt/prompt-shell.spec.ts index d81f1d4c40..28fa02dcd3 100644 --- a/packages/app/e2e/prompt/prompt-shell.spec.ts +++ b/packages/app/e2e/prompt/prompt-shell.spec.ts @@ -1,6 +1,7 @@ import type { ToolPart } from "@opencode-ai/sdk/v2/client" import { test, expect } from "../fixtures" import { withSession } from "../actions" +import { promptModelSelector, promptSelector, promptVariantSelector } from "../selectors" const isBash = (part: unknown): part is ToolPart => { if (!part || typeof part !== "object") return false @@ -9,15 +10,6 @@ const isBash = (part: unknown): part is ToolPart => { return "state" in part } -async function setAutoAccept(page: Parameters[0]["page"], enabled: boolean) { - const button = page.locator('[data-action="prompt-permissions"]').first() - await expect(button).toBeVisible() - const pressed = (await button.getAttribute("aria-pressed")) === "true" - if (pressed === enabled) return - await button.click() - await expect(button).toHaveAttribute("aria-pressed", enabled ? "true" : "false") -} - test("shell mode runs a command in the project directory", async ({ page, project }) => { test.setTimeout(120_000) @@ -27,7 +19,12 @@ test("shell mode runs a command in the project directory", async ({ page, projec await withSession(project.sdk, `e2e shell ${Date.now()}`, async (session) => { project.trackSession(session.id) await project.gotoSession(session.id) - await setAutoAccept(page, true) + const button = page.locator('[data-action="prompt-permissions"]').first() + await expect(button).toBeVisible() + if ((await button.getAttribute("aria-pressed")) !== "true") { + await button.click() + await expect(button).toHaveAttribute("aria-pressed", "true") + } await project.shell(cmd) await expect @@ -57,3 +54,18 @@ test("shell mode runs a command in the project directory", async ({ page, projec .toEqual(expect.objectContaining({ cwd: project.directory, output: expect.stringContaining("README.md") })) }) }) + +test("shell mode unmounts model and variant controls", async ({ page, project }) => { + await project.open() + + const prompt = page.locator(promptSelector).first() + await expect(page.locator(promptModelSelector)).toHaveCount(1) + await expect(page.locator(promptVariantSelector)).toHaveCount(1) + + await prompt.click() + await page.keyboard.type("!") + + await expect(prompt).toHaveAttribute("aria-label", /enter shell command/i) + await expect(page.locator(promptModelSelector)).toHaveCount(0) + await expect(page.locator(promptVariantSelector)).toHaveCount(0) +}) diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx index 338b04ba65..653e89f511 100644 --- a/packages/app/src/components/prompt-input.tsx +++ b/packages/app/src/components/prompt-input.tsx @@ -1480,27 +1480,60 @@ export const PromptInput: Component = (props) => { /> -
- 0} - fallback={ + +
+ 0} + fallback={ + + + + } + > - + - } - > + +
+
- - - - - - {local.model.current()?.name ?? language.t("dialog.model.select.title")} - - - + (x === "default" ? language.t("common.default") : x)} - onSelect={(x) => local.model.variant.set(x === "default" ? undefined : x)} - class="capitalize max-w-[160px] text-text-base" - valueClass="truncate text-13-regular text-text-base" - triggerStyle={control()} - triggerProps={{ "data-action": "prompt-model-variant" }} - variant="ghost" - /> - -
+
+