From 5c25c389619892d309ae05fa24787049a627a6ee Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" <219766164+opencode-agent[bot]@users.noreply.github.com> Date: Tue, 25 Aug 2026 18:19:28 +0530 Subject: [PATCH] fix(tui): paste into active custom answers (#44849) Co-authored-by: rekram1-node --- packages/tui/src/routes/session/form.tsx | 8 ++++++- packages/tui/test/cli/tui/form.test.tsx | 29 ++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/packages/tui/src/routes/session/form.tsx b/packages/tui/src/routes/session/form.tsx index f9c1a3027af..de93cfb4bd8 100644 --- a/packages/tui/src/routes/session/form.tsx +++ b/packages/tui/src/routes/session/form.tsx @@ -329,7 +329,13 @@ export function FormPrompt(props: { form: FormWithLocation }) { usePaste((event) => { if (keymap.mode.current() !== FORM_MODE) return - if (!pasteCustom(stripAnsiSequences(decodePasteBytes(event.bytes)).replace(/\r\n?/g, "\n"))) return + const value = stripAnsiSequences(decodePasteBytes(event.bytes)).replace(/\r\n?/g, "\n") + if (store.editing && renderer.currentFocusedEditor === textarea) { + textarea.insertText(value) + event.preventDefault() + return + } + if (!pasteCustom(value)) return event.preventDefault() }) diff --git a/packages/tui/test/cli/tui/form.test.tsx b/packages/tui/test/cli/tui/form.test.tsx index 6f3efe9e615..4c762f9c9b5 100644 --- a/packages/tui/test/cli/tui/form.test.tsx +++ b/packages/tui/test/cli/tui/form.test.tsx @@ -310,6 +310,35 @@ test("pasting on a custom choice opens its editor without submitting", async () } }) +test("pasting in an active custom editor inserts at the cursor", async () => { + await using tmp = await tmpdir() + const prompt = await mountForm(tmp.path, 80, [ + { + key: "target", + type: "string", + options: [{ value: "staging", label: "Staging" }], + custom: true, + }, + ]) + try { + prompt.app.mockInput.pressArrow("down") + prompt.app.mockInput.pressEnter() + await prompt.app.waitFor(() => prompt.app.renderer.currentFocusedEditor !== null) + await prompt.app.mockInput.typeText("prodwest") + const editor = prompt.app.renderer.currentFocusedEditor + if (editor) editor.cursorOffset = 4 + + await prompt.app.mockInput.pasteBracketedText("uction ") + await prompt.app.waitFor(() => prompt.app.renderer.currentFocusedEditor?.plainText === "production west") + await prompt.app.mockInput.typeText("!") + + expect(prompt.app.renderer.currentFocusedEditor?.plainText).toBe("production !west") + expect(prompt.replies).toEqual([]) + } finally { + prompt.app.renderer.destroy() + } +}) + test("clipboard shortcut opens a custom choice editor without submitting", async () => { await using tmp = await tmpdir() const prompt = await mountForm(