From 5608a92e355503ff6ec43ec6480b4ff1020b19b0 Mon Sep 17 00:00:00 2001 From: Ariane Emory Date: Mon, 26 Jan 2026 10:46:44 -0500 Subject: [PATCH] feat: move diff_style from config to kv.json and add toggle menu - Remove diff_style from TUI config schema - Update diff rendering to read from kv.json instead of config - Change 'stacked' value to 'unified' for consistency - Add System menu item to toggle between auto and unified diff styles - Menu items immediately update diffs when toggled --- packages/opencode/src/cli/cmd/tui/app.tsx | 10 ++++++++++ .../opencode/src/cli/cmd/tui/routes/session/index.tsx | 10 ++++++---- .../src/cli/cmd/tui/routes/session/permission.tsx | 7 ++++--- packages/opencode/src/config/config.ts | 4 ---- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index 340b972ac6c..2606f72175c 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -570,6 +570,16 @@ function App() { dialog.clear() }, }, + { + title: kv.get("diff_style", "auto") === "auto" ? "Use unified diff style" : "Use automatic diff style", + value: "tui.diff_style.toggle", + category: "System", + onSelect: (dialog) => { + const current = kv.get("diff_style", "auto") + kv.set("diff_style", current === "auto" ? "unified" : "auto") + dialog.clear() + }, + }, ]) createEffect(() => { diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx index c73a520428b..ed6295b3d23 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -1819,11 +1819,12 @@ function Task(props: ToolProps) { function Edit(props: ToolProps) { const ctx = use() + const kv = useKV() const { theme, syntax } = useTheme() const view = createMemo(() => { - const diffStyle = ctx.sync.data.config.tui?.diff_style - if (diffStyle === "stacked") return "unified" + const diffStyle = kv.get("diff_style", "auto") + if (diffStyle === "unified") return "unified" // Default to "auto" behavior return ctx.width > 120 ? "split" : "unified" }) @@ -1888,13 +1889,14 @@ function Edit(props: ToolProps) { function ApplyPatch(props: ToolProps) { const ctx = use() + const kv = useKV() const { theme, syntax } = useTheme() const files = createMemo(() => props.metadata.files ?? []) const view = createMemo(() => { - const diffStyle = ctx.sync.data.config.tui?.diff_style - if (diffStyle === "stacked") return "unified" + const diffStyle = kv.get("diff_style", "auto") + if (diffStyle === "unified") return "unified" return ctx.width > 120 ? "split" : "unified" }) diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx index 9e79c76bf51..459d0991c90 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx @@ -8,6 +8,7 @@ import type { PermissionRequest } from "@opencode-ai/sdk/v2" import { useSDK } from "../../context/sdk" import { SplitBorder } from "../../component/border" import { useSync } from "../../context/sync" +import { useKV } from "../../context/kv" import { useTextareaKeybindings } from "../../component/textarea-keybindings" import path from "path" import { LANGUAGE_EXTENSIONS } from "@/lsp/language" @@ -48,15 +49,15 @@ function EditBody(props: { request: PermissionRequest }) { const themeState = useTheme() const theme = themeState.theme const syntax = themeState.syntax - const sync = useSync() + const kv = useKV() const dimensions = useTerminalDimensions() const filepath = createMemo(() => (props.request.metadata?.filepath as string) ?? "") const diff = createMemo(() => (props.request.metadata?.diff as string) ?? "") const view = createMemo(() => { - const diffStyle = sync.data.config.tui?.diff_style - if (diffStyle === "stacked") return "unified" + const diffStyle = kv.get("diff_style", "auto") + if (diffStyle === "unified") return "unified" return dimensions().width > 120 ? "split" : "unified" }) diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index 020e626cba8..8e73aa51e9a 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -806,10 +806,6 @@ export namespace Config { }) .optional() .describe("Scroll acceleration settings"), - diff_style: z - .enum(["auto", "stacked"]) - .optional() - .describe("Control diff rendering style: 'auto' adapts to terminal width, 'stacked' always shows single column"), }) export const Server = z