summaryrefslogtreecommitdiffhomepage
path: root/packages
diff options
context:
space:
mode:
Diffstat (limited to 'packages')
-rw-r--r--packages/opencode/package.json4
-rw-r--r--packages/opencode/src/cli/cmd/tui/app.tsx1
-rw-r--r--packages/opencode/src/cli/cmd/tui/util/clipboard.ts26
3 files changed, 17 insertions, 14 deletions
diff --git a/packages/opencode/package.json b/packages/opencode/package.json
index 45074b96c..4afb72430 100644
--- a/packages/opencode/package.json
+++ b/packages/opencode/package.json
@@ -82,8 +82,8 @@
"@opencode-ai/sdk": "workspace:*",
"@opencode-ai/util": "workspace:*",
"@openrouter/ai-sdk-provider": "1.5.4",
- "@opentui/core": "0.1.76",
- "@opentui/solid": "0.1.76",
+ "@opentui/core": "0.1.75",
+ "@opentui/solid": "0.1.75",
"@parcel/watcher": "2.5.1",
"@pierre/diffs": "catalog:",
"@solid-primitives/event-bus": "1.1.2",
diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx
index 2e1ffa4f0..713def2e5 100644
--- a/packages/opencode/src/cli/cmd/tui/app.tsx
+++ b/packages/opencode/src/cli/cmd/tui/app.tsx
@@ -186,7 +186,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 5c27a26cd..0e287fbc4 100644
--- a/packages/opencode/src/cli/cmd/tui/util/clipboard.ts
+++ b/packages/opencode/src/cli/cmd/tui/util/clipboard.ts
@@ -1,12 +1,24 @@
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`
+ // tmux and screen require DCS passthrough wrapping
+ 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 +26,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,11 +154,7 @@ export namespace Clipboard {
})
export async function copy(text: string): Promise<void> {
- const renderer = rendererRef.current
- if (renderer) {
- const copied = renderer.copyToClipboardOSC52(text)
- if (copied) return
- }
+ writeOsc52(text)
await getCopyMethod()(text)
}
}