fix(prompt): unmount model controls in shell mode (#20886)
This commit is contained in:
parent
c307505f8b
commit
2002f08f2e
2 changed files with 90 additions and 76 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
import type { ToolPart } from "@opencode-ai/sdk/v2/client"
|
import type { ToolPart } from "@opencode-ai/sdk/v2/client"
|
||||||
import { test, expect } from "../fixtures"
|
import { test, expect } from "../fixtures"
|
||||||
import { withSession } from "../actions"
|
import { withSession } from "../actions"
|
||||||
|
import { promptModelSelector, promptSelector, promptVariantSelector } from "../selectors"
|
||||||
|
|
||||||
const isBash = (part: unknown): part is ToolPart => {
|
const isBash = (part: unknown): part is ToolPart => {
|
||||||
if (!part || typeof part !== "object") return false
|
if (!part || typeof part !== "object") return false
|
||||||
|
|
@ -9,15 +10,6 @@ const isBash = (part: unknown): part is ToolPart => {
|
||||||
return "state" in part
|
return "state" in part
|
||||||
}
|
}
|
||||||
|
|
||||||
async function setAutoAccept(page: Parameters<typeof test>[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("shell mode runs a command in the project directory", async ({ page, project }) => {
|
||||||
test.setTimeout(120_000)
|
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) => {
|
await withSession(project.sdk, `e2e shell ${Date.now()}`, async (session) => {
|
||||||
project.trackSession(session.id)
|
project.trackSession(session.id)
|
||||||
await project.gotoSession(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 project.shell(cmd)
|
||||||
|
|
||||||
await expect
|
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") }))
|
.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)
|
||||||
|
})
|
||||||
|
|
|
||||||
|
|
@ -1480,6 +1480,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
|
||||||
/>
|
/>
|
||||||
</TooltipKeybind>
|
</TooltipKeybind>
|
||||||
</div>
|
</div>
|
||||||
|
<Show when={store.mode !== "shell"}>
|
||||||
<div data-component="prompt-model-control">
|
<div data-component="prompt-model-control">
|
||||||
<Show
|
<Show
|
||||||
when={providers.paid().length > 0}
|
when={providers.paid().length > 0}
|
||||||
|
|
@ -1571,6 +1572,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
|
||||||
/>
|
/>
|
||||||
</TooltipKeybind>
|
</TooltipKeybind>
|
||||||
</div>
|
</div>
|
||||||
|
</Show>
|
||||||
<TooltipKeybind
|
<TooltipKeybind
|
||||||
placement="top"
|
placement="top"
|
||||||
gutter={8}
|
gutter={8}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue