From d6c8b33e230e94615d8927487541e2c488a0a59b Mon Sep 17 00:00:00 2001 From: Idris Gadi Date: Mon, 26 Jan 2026 23:12:22 +0530 Subject: [PATCH 1/5] fix: move some commands to global command pallete commands moved: - code concealment - timestamps - thinking - tool details - scrollbar visible --- packages/opencode/src/cli/cmd/tui/app.tsx | 61 +++++++++++++++++ .../src/cli/cmd/tui/routes/session/index.tsx | 68 ++----------------- 2 files changed, 67 insertions(+), 62 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index 10d7a25f88f..3e24a0f1135 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -206,6 +206,11 @@ function App() { renderer.clearSelection() } const [terminalTitleEnabled, setTerminalTitleEnabled] = createSignal(kv.get("terminal_title_enabled", true)) + const [codeConceal, setCodeConceal] = kv.signal("conceal_code", true) + const [timestamps, setTimestamps] = kv.signal<"hide" | "show">("timestamps", "hide") + const [showThinking, setShowThinking] = kv.signal("thinking_visibility", true) + const [showDetails, setShowDetails] = kv.signal("tool_details_visibility", true) + const [_,setShowScrollbar] = kv.signal("scrollbar_visible", false) createEffect(() => { console.log(JSON.stringify(route.data)) @@ -580,6 +585,62 @@ function App() { dialog.clear() }, }, + { + title: codeConceal() ? "Disable code concealment" : "Enable code concealment", + value: "app.toggle.conceal", + keybind: "messages_toggle_conceal", + category: "System", + onSelect: (dialog) => { + setCodeConceal((prev) => !prev) + dialog.clear() + }, + }, + { + title: timestamps() === "show" ? "Hide timestamps" : "Show timestamps", + value: "app.toggle.timestamps", + category: "System", + slash: { + name: "timestamps", + aliases: ["toggle-timestamps"], + }, + onSelect: (dialog) => { + setTimestamps((prev) => (prev === "show" ? "hide" : "show")) + dialog.clear() + }, + }, + { + title: showThinking() ? "Hide thinking" : "Show thinking", + value: "app.toggle.thinking", + category: "System", + slash: { + name: "thinking", + aliases: ["toggle-thinking"], + }, + onSelect: (dialog) => { + setShowThinking((prev) => !prev) + dialog.clear() + }, + }, + { + title: showDetails() ? "Hide tool details" : "Show tool details", + value: "app.toggle.actions", + keybind: "tool_details", + category: "System", + onSelect: (dialog) => { + setShowDetails((prev) => !prev) + dialog.clear() + }, + }, + { + title: "Toggle session scrollbar", + value: "app.toggle.scrollbar", + keybind: "scrollbar_toggle", + category: "System", + onSelect: (dialog) => { + setShowScrollbar((prev) => !prev) + 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 5f47562d2e3..53891526929 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -139,12 +139,12 @@ export function Session() { const dimensions = useTerminalDimensions() const [sidebar, setSidebar] = kv.signal<"auto" | "hide">("sidebar", "hide") const [sidebarOpen, setSidebarOpen] = createSignal(false) - const [conceal, setConceal] = createSignal(true) - const [showThinking, setShowThinking] = kv.signal("thinking_visibility", true) - const [timestamps, setTimestamps] = kv.signal<"hide" | "show">("timestamps", "hide") - const [showDetails, setShowDetails] = kv.signal("tool_details_visibility", true) - const [showAssistantMetadata, setShowAssistantMetadata] = kv.signal("assistant_metadata_visibility", true) - const [showScrollbar, setShowScrollbar] = kv.signal("scrollbar_visible", false) + const [conceal] = kv.signal("conceal_code", true) + const [showThinking] = kv.signal("thinking_visibility", true) + const [timestamps] = kv.signal<"hide" | "show">("timestamps", "hide") + const [showDetails] = kv.signal("tool_details_visibility", true) + const [showAssistantMetadata] = kv.signal("assistant_metadata_visibility", true) + const [showScrollbar] = kv.signal("scrollbar_visible", false) const [diffWrapMode] = kv.signal<"word" | "none">("diff_wrap_mode", "word") const [animationsEnabled, setAnimationsEnabled] = kv.signal("animations_enabled", true) @@ -502,62 +502,6 @@ export function Session() { dialog.clear() }, }, - { - title: conceal() ? "Disable code concealment" : "Enable code concealment", - value: "session.toggle.conceal", - keybind: "messages_toggle_conceal" as any, - category: "Session", - onSelect: (dialog) => { - setConceal((prev) => !prev) - dialog.clear() - }, - }, - { - title: showTimestamps() ? "Hide timestamps" : "Show timestamps", - value: "session.toggle.timestamps", - category: "Session", - slash: { - name: "timestamps", - aliases: ["toggle-timestamps"], - }, - onSelect: (dialog) => { - setTimestamps((prev) => (prev === "show" ? "hide" : "show")) - dialog.clear() - }, - }, - { - title: showThinking() ? "Hide thinking" : "Show thinking", - value: "session.toggle.thinking", - category: "Session", - slash: { - name: "thinking", - aliases: ["toggle-thinking"], - }, - onSelect: (dialog) => { - setShowThinking((prev) => !prev) - dialog.clear() - }, - }, - { - title: showDetails() ? "Hide tool details" : "Show tool details", - value: "session.toggle.actions", - keybind: "tool_details", - category: "Session", - onSelect: (dialog) => { - setShowDetails((prev) => !prev) - dialog.clear() - }, - }, - { - title: "Toggle session scrollbar", - value: "session.toggle.scrollbar", - keybind: "scrollbar_toggle", - category: "Session", - onSelect: (dialog) => { - setShowScrollbar((prev) => !prev) - dialog.clear() - }, - }, { title: "Page up", value: "session.page.up", From 8b174a44b40fa7693aacd82b4de0407c1c18ce5e Mon Sep 17 00:00:00 2001 From: Idris Gadi Date: Mon, 26 Jan 2026 23:17:16 +0530 Subject: [PATCH 2/5] chore: removed unused signal --- packages/opencode/src/cli/cmd/tui/routes/session/index.tsx | 1 - 1 file changed, 1 deletion(-) 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 53891526929..df08cdc6c77 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -146,7 +146,6 @@ export function Session() { const [showAssistantMetadata] = kv.signal("assistant_metadata_visibility", true) const [showScrollbar] = kv.signal("scrollbar_visible", false) const [diffWrapMode] = kv.signal<"word" | "none">("diff_wrap_mode", "word") - const [animationsEnabled, setAnimationsEnabled] = kv.signal("animations_enabled", true) const wide = createMemo(() => dimensions().width > 120) const sidebarVisible = createMemo(() => { From 10e5dc0666ef9b03f413f1bc07713981d9dfc606 Mon Sep 17 00:00:00 2001 From: Idris Gadi Date: Mon, 26 Jan 2026 23:19:33 +0530 Subject: [PATCH 3/5] fix: use kv.signal method --- packages/opencode/src/cli/cmd/tui/app.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index 3e24a0f1135..858af04c807 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -205,7 +205,7 @@ function App() { .catch(toast.error) renderer.clearSelection() } - const [terminalTitleEnabled, setTerminalTitleEnabled] = createSignal(kv.get("terminal_title_enabled", true)) + const [terminalTitleEnabled, setTerminalTitleEnabled] = kv.signal("terminal_title_enabled", true) const [codeConceal, setCodeConceal] = kv.signal("conceal_code", true) const [timestamps, setTimestamps] = kv.signal<"hide" | "show">("timestamps", "hide") const [showThinking, setShowThinking] = kv.signal("thinking_visibility", true) @@ -559,7 +559,6 @@ function App() { onSelect: (dialog) => { setTerminalTitleEnabled((prev) => { const next = !prev - kv.set("terminal_title_enabled", next) if (!next) renderer.setTerminalTitle("") return next }) From f0131995bab495baa2540a92ad9bdb7e1196500b Mon Sep 17 00:00:00 2001 From: Idris Gadi Date: Mon, 26 Jan 2026 23:23:12 +0530 Subject: [PATCH 4/5] fix: use kv.signal instead of direct kv.get and kv.set --- packages/opencode/src/cli/cmd/tui/app.tsx | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index 858af04c807..34f325cf903 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -210,7 +210,10 @@ function App() { const [timestamps, setTimestamps] = kv.signal<"hide" | "show">("timestamps", "hide") const [showThinking, setShowThinking] = kv.signal("thinking_visibility", true) const [showDetails, setShowDetails] = kv.signal("tool_details_visibility", true) - const [_,setShowScrollbar] = kv.signal("scrollbar_visible", false) + const [_, setShowScrollbar] = kv.signal("scrollbar_visible", false) + const [animationsEnabled, setAnimationsEnabled] = kv.signal("animations_enabled", true) + const [diffWrapMode, setDiffWrapMode] = kv.signal<"word" | "none">("diff_wrap_mode", "word") + const [openrouterWarning, setOpenrouterWarning] = kv.signal("openrouter_warning", false) createEffect(() => { console.log(JSON.stringify(route.data)) @@ -566,21 +569,20 @@ function App() { }, }, { - title: kv.get("animations_enabled", true) ? "Disable animations" : "Enable animations", + title: animationsEnabled() ? "Disable animations" : "Enable animations", value: "app.toggle.animations", category: "System", onSelect: (dialog) => { - kv.set("animations_enabled", !kv.get("animations_enabled", true)) + setAnimationsEnabled((prev) => !prev) dialog.clear() }, }, { - title: kv.get("diff_wrap_mode", "word") === "word" ? "Disable diff wrapping" : "Enable diff wrapping", + title: diffWrapMode() === "word" ? "Disable diff wrapping" : "Enable diff wrapping", value: "app.toggle.diffwrap", category: "System", onSelect: (dialog) => { - const current = kv.get("diff_wrap_mode", "word") - kv.set("diff_wrap_mode", current === "word" ? "none" : "word") + setDiffWrapMode((prev) => (prev === "word" ? "none" : "word")) dialog.clear() }, }, @@ -645,13 +647,13 @@ function App() { createEffect(() => { const currentModel = local.model.current() if (!currentModel) return - if (currentModel.providerID === "openrouter" && !kv.get("openrouter_warning", false)) { + if (currentModel.providerID === "openrouter" && !openrouterWarning()) { untrack(() => { DialogAlert.show( dialog, "Warning", "While openrouter is a convenient way to access LLMs your request will often be routed to subpar providers that do not work well in our testing.\n\nFor reliable access to models check out OpenCode Zen\nhttps://opencode.ai/zen", - ).then(() => kv.set("openrouter_warning", true)) + ).then(() => setOpenrouterWarning(() => true)) }) } }) From 1e719f44fd3e5a8db4a4d2d0f31c43dadf9d2161 Mon Sep 17 00:00:00 2001 From: Idris Gadi Date: Mon, 26 Jan 2026 23:54:04 +0530 Subject: [PATCH 5/5] fix: organize system command order that makes sense --- packages/opencode/src/cli/cmd/tui/app.tsx | 172 +++++++++++----------- 1 file changed, 86 insertions(+), 86 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index 34f325cf903..bf6a7b228ff 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -477,81 +477,77 @@ function App() { category: "System", }, { - title: "Help", - value: "help.show", - slash: { - name: "help", - }, - onSelect: () => { - dialog.replace(() => ) - }, + title: animationsEnabled() ? "Disable animations" : "Enable animations", + value: "app.toggle.animations", category: "System", + onSelect: (dialog) => { + setAnimationsEnabled((prev) => !prev) + dialog.clear() + }, }, { - title: "Open docs", - value: "docs.open", - onSelect: () => { - open("https://opencode.ai/docs").catch(() => {}) + title: diffWrapMode() === "word" ? "Disable diff wrapping" : "Enable diff wrapping", + value: "app.toggle.diffwrap", + category: "System", + onSelect: (dialog) => { + setDiffWrapMode((prev) => (prev === "word" ? "none" : "word")) dialog.clear() }, - category: "System", }, { - title: "Exit the app", - value: "app.exit", - slash: { - name: "exit", - aliases: ["quit", "q"], - }, - onSelect: () => exit(), + title: codeConceal() ? "Disable code concealment" : "Enable code concealment", + value: "app.toggle.conceal", + keybind: "messages_toggle_conceal", category: "System", + onSelect: (dialog) => { + setCodeConceal((prev) => !prev) + dialog.clear() + }, }, { - title: "Toggle debug panel", + title: timestamps() === "show" ? "Hide timestamps" : "Show timestamps", + value: "app.toggle.timestamps", category: "System", - value: "app.debug", + slash: { + name: "timestamps", + aliases: ["toggle-timestamps"], + }, onSelect: (dialog) => { - renderer.toggleDebugOverlay() + setTimestamps((prev) => (prev === "show" ? "hide" : "show")) dialog.clear() }, }, { - title: "Toggle console", + title: showThinking() ? "Hide thinking" : "Show thinking", + value: "app.toggle.thinking", category: "System", - value: "app.console", + slash: { + name: "thinking", + aliases: ["toggle-thinking"], + }, onSelect: (dialog) => { - renderer.console.toggle() + setShowThinking((prev) => !prev) dialog.clear() }, }, { - title: "Write heap snapshot", + title: showDetails() ? "Hide tool details" : "Show tool details", + value: "app.toggle.actions", + keybind: "tool_details", category: "System", - value: "app.heap_snapshot", onSelect: (dialog) => { - const path = writeHeapSnapshot() - toast.show({ - variant: "info", - message: `Heap snapshot written to ${path}`, - duration: 5000, - }) + setShowDetails((prev) => !prev) dialog.clear() }, }, { - title: "Suspend terminal", - value: "terminal.suspend", - keybind: "terminal_suspend", + title: "Toggle session scrollbar", + value: "app.toggle.scrollbar", + keybind: "scrollbar_toggle", category: "System", - hidden: true, - onSelect: () => { - process.once("SIGCONT", () => { - renderer.resume() - }) - - renderer.suspend() - // pid=0 means send the signal to all processes in the process group - process.kill(0, "SIGTSTP") + onSelect: (dialog) => { + setShowScrollbar((prev) => !prev) + dialog.clear() }, }, { @@ -569,78 +565,82 @@ function App() { }, }, { - title: animationsEnabled() ? "Disable animations" : "Enable animations", - value: "app.toggle.animations", + title: "Toggle debug panel", category: "System", + value: "app.debug", onSelect: (dialog) => { - setAnimationsEnabled((prev) => !prev) + renderer.toggleDebugOverlay() dialog.clear() }, }, { - title: diffWrapMode() === "word" ? "Disable diff wrapping" : "Enable diff wrapping", - value: "app.toggle.diffwrap", + title: "Toggle console", category: "System", + value: "app.console", onSelect: (dialog) => { - setDiffWrapMode((prev) => (prev === "word" ? "none" : "word")) + renderer.console.toggle() dialog.clear() }, }, { - title: codeConceal() ? "Disable code concealment" : "Enable code concealment", - value: "app.toggle.conceal", - keybind: "messages_toggle_conceal", + title: "Write heap snapshot", category: "System", + value: "app.heap_snapshot", onSelect: (dialog) => { - setCodeConceal((prev) => !prev) + const path = writeHeapSnapshot() + toast.show({ + variant: "info", + message: `Heap snapshot written to ${path}`, + duration: 5000, + }) dialog.clear() }, }, { - title: timestamps() === "show" ? "Hide timestamps" : "Show timestamps", - value: "app.toggle.timestamps", + title: "Suspend terminal", + value: "terminal.suspend", + keybind: "terminal_suspend", category: "System", - slash: { - name: "timestamps", - aliases: ["toggle-timestamps"], - }, - onSelect: (dialog) => { - setTimestamps((prev) => (prev === "show" ? "hide" : "show")) - dialog.clear() + hidden: true, + onSelect: () => { + process.once("SIGCONT", () => { + renderer.resume() + }) + + renderer.suspend() + // pid=0 means send the signal to all processes in the process group + process.kill(0, "SIGTSTP") }, }, { - title: showThinking() ? "Hide thinking" : "Show thinking", - value: "app.toggle.thinking", - category: "System", + title: "Help", + value: "help.show", slash: { - name: "thinking", - aliases: ["toggle-thinking"], + name: "help", }, - onSelect: (dialog) => { - setShowThinking((prev) => !prev) - dialog.clear() + onSelect: () => { + dialog.replace(() => ) }, + category: "System", }, { - title: showDetails() ? "Hide tool details" : "Show tool details", - value: "app.toggle.actions", - keybind: "tool_details", - category: "System", - onSelect: (dialog) => { - setShowDetails((prev) => !prev) + title: "Open docs", + value: "docs.open", + onSelect: () => { + open("https://opencode.ai/docs").catch(() => {}) dialog.clear() }, + category: "System", }, { - title: "Toggle session scrollbar", - value: "app.toggle.scrollbar", - keybind: "scrollbar_toggle", - category: "System", - onSelect: (dialog) => { - setShowScrollbar((prev) => !prev) - dialog.clear() + title: "Exit app", + value: "app.exit", + slash: { + name: "exit", + aliases: ["quit", "q"], }, + onSelect: () => exit(), + category: "System", }, ])