diff options
| author | Sebastian <[email protected]> | 2026-02-04 07:35:57 +0100 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-02-04 00:35:57 -0600 |
| commit | 64bafce6650bd0ebebf962aed01b2dcfc82459f8 (patch) | |
| tree | 1f66377fead24037e9206538b7941e7a819d73d8 /packages | |
| parent | 5588453cbede8c84c3ac7429d7d208fe140c0d20 (diff) | |
| download | opencode-64bafce6650bd0ebebf962aed01b2dcfc82459f8.tar.gz opencode-64bafce6650bd0ebebf962aed01b2dcfc82459f8.zip | |
restore direct osc52 (#12071)
Diffstat (limited to 'packages')
| -rw-r--r-- | packages/opencode/src/cli/cmd/tui/app.tsx | 1 | ||||
| -rw-r--r-- | packages/opencode/src/cli/cmd/tui/util/clipboard.ts | 26 |
2 files changed, 14 insertions, 13 deletions
diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index c5f88a7c6..744203760 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -187,7 +187,6 @@ function App() { const route = useRoute() const dimensions = useTerminalDimensions() const renderer = useRenderer() - Clipboard.setRenderer(renderer) renderer.disableStdoutInterception() const dialog = useDialog() const local = useLocal() diff --git a/packages/opencode/src/cli/cmd/tui/util/clipboard.ts b/packages/opencode/src/cli/cmd/tui/util/clipboard.ts index ad1f86e30..4be678734 100644 --- a/packages/opencode/src/cli/cmd/tui/util/clipboard.ts +++ b/packages/opencode/src/cli/cmd/tui/util/clipboard.ts @@ -1,12 +1,23 @@ import { $ } from "bun" -import type { CliRenderer } from "@opentui/core" import { platform, release } from "os" import clipboardy from "clipboardy" import { lazy } from "../../../../util/lazy.js" import { tmpdir } from "os" import path from "path" -const rendererRef = { current: undefined as CliRenderer | undefined } +/** + * Writes text to clipboard via OSC 52 escape sequence. + * This allows clipboard operations to work over SSH by having + * the terminal emulator handle the clipboard locally. + */ +function writeOsc52(text: string): void { + if (!process.stdout.isTTY) return + const base64 = Buffer.from(text).toString("base64") + const osc52 = `\x1b]52;c;${base64}\x07` + const passthrough = process.env["TMUX"] || process.env["STY"] + const sequence = passthrough ? `\x1bPtmux;\x1b${osc52}\x1b\\` : osc52 + process.stdout.write(sequence) +} export namespace Clipboard { export interface Content { @@ -14,10 +25,6 @@ export namespace Clipboard { mime: string } - export function setRenderer(renderer: CliRenderer | undefined): void { - rendererRef.current = renderer - } - export async function read(): Promise<Content | undefined> { const os = platform() @@ -146,12 +153,7 @@ export namespace Clipboard { }) export async function copy(text: string): Promise<void> { - const renderer = rendererRef.current - if (renderer) { - // Try OSC52 but don't early return - always fall back to native method - // OSC52 may report success but not actually work in all terminals - renderer.copyToClipboardOSC52(text) - } + writeOsc52(text) await getCopyMethod()(text) } } |
