diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index f63f6cb1a..a860a8085 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -176,6 +176,24 @@ function App() { const exit = useExit() const promptRef = usePromptRef() + // Wire up console copy-to-clipboard via opentui's onCopySelection callback + renderer.console.onCopySelection = async (text: string) => { + if (Flag.OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT) { + renderer.clearSelection() + return + } + if (!text || text.length === 0) return + + const base64 = Buffer.from(text).toString("base64") + const osc52 = `\x1b]52;c;${base64}\x07` + const finalOsc52 = process.env["TMUX"] ? `\x1bPtmux;\x1b${osc52}\x1b\\` : osc52 + // @ts-expect-error writeOut is not in type definitions + renderer.writeOut(finalOsc52) + await Clipboard.copy(text) + .then(() => toast.show({ message: "Copied to clipboard", variant: "info" })) + .catch(toast.error) + renderer.clearSelection() + } const [terminalTitleEnabled, setTerminalTitleEnabled] = createSignal(kv.get("terminal_title_enabled", true)) createEffect(() => { @@ -444,7 +462,7 @@ function App() { { title: "Toggle console", category: "System", - value: "app.fps", + value: "app.console", onSelect: (dialog) => { renderer.console.toggle() dialog.clear()