diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx index 143150b929f..4a3ed12854f 100644 --- a/packages/app/src/pages/session.tsx +++ b/packages/app/src/pages/session.tsx @@ -1,4 +1,4 @@ -import { For, onCleanup, onMount, Show, Match, Switch, createMemo, createEffect, on } from "solid-js" +import { For, onCleanup, onMount, Show, Match, Switch, createMemo, createEffect, on, createSignal } from "solid-js" import { createMediaQuery } from "@solid-primitives/media" import { createResizeObserver } from "@solid-primitives/resize-observer" import { Dynamic } from "solid-js/web" @@ -171,6 +171,8 @@ export default function Page() { const tabs = createMemo(() => layout.tabs(sessionKey())) const view = createMemo(() => layout.view(sessionKey())) + const [showReasoning, setShowReasoning] = createSignal(false) + if (import.meta.env.DEV) { createEffect( on( @@ -540,6 +542,22 @@ export default function Page() { }) }, }, + { + id: "session.toggle.reasoning", + title: showReasoning() ? "Hide reasoning" : "Show reasoning", + description: "Toggle visibility of reasoning/thinking content", + category: "Session", + keybind: "mod+shift+r", + onSelect: () => { + setShowReasoning((prev) => !prev) + showToast({ + title: showReasoning() ? "Reasoning visible" : "Reasoning hidden", + description: showReasoning() + ? "Reasoning content will be shown in messages" + : "Reasoning content will be hidden from messages", + }) + }, + }, { id: "permissions.autoaccept", title: @@ -1187,6 +1205,7 @@ export default function Page() { messageID={message.id} lastUserMessageID={lastUserMessage()?.id} stepsExpanded={store.expanded[message.id] ?? false} + showReasoning={showReasoning()} onStepsExpandedToggle={() => setStore("expanded", message.id, (open: boolean | undefined) => !open) } 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 d91363954a1..c3a5d725579 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -504,6 +504,7 @@ export function Session() { title: showThinking() ? "Hide thinking" : "Show thinking", value: "session.toggle.thinking", category: "Session", + keybind: "thinking_toggle" as const, onSelect: (dialog) => { setShowThinking((prev) => !prev) dialog.clear() diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index 322ce273ab8..1a655a2ea06 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -671,6 +671,7 @@ export namespace Config { .default("h") .describe("Toggle code block concealment in messages"), tool_details: z.string().optional().default("none").describe("Toggle tool details visibility"), + thinking_toggle: z.string().optional().default("ctrl+alt+t").describe("Toggle thinking visibility"), model_list: z.string().optional().default("m").describe("List available models"), model_cycle_recent: z.string().optional().default("f2").describe("Next recently used model"), model_cycle_recent_reverse: z.string().optional().default("shift+f2").describe("Previous recently used model"), diff --git a/packages/ui/src/components/session-turn.tsx b/packages/ui/src/components/session-turn.tsx index ae1321bac14..2669a660d5d 100644 --- a/packages/ui/src/components/session-turn.tsx +++ b/packages/ui/src/components/session-turn.tsx @@ -122,6 +122,7 @@ export function SessionTurn( messageID: string lastUserMessageID?: string stepsExpanded?: boolean + showReasoning?: boolean onStepsExpandedToggle?: () => void onUserInteracted?: () => void classes?: { @@ -564,7 +565,7 @@ export function SessionTurn( message={assistantMessage} responsePartId={responsePartId()} hideResponsePart={hideResponsePart()} - hideReasoning={!working()} + hideReasoning={!working() && !props.showReasoning} /> )} diff --git a/packages/web/src/content/docs/keybinds.mdx b/packages/web/src/content/docs/keybinds.mdx index 267d194c099..cd7f2b57d79 100644 --- a/packages/web/src/content/docs/keybinds.mdx +++ b/packages/web/src/content/docs/keybinds.mdx @@ -18,6 +18,7 @@ OpenCode has a list of keybinds that you can customize through the OpenCode conf "username_toggle": "none", "status_view": "s", "tool_details": "none", + "thinking_toggle": "ctrl+alt+t", "session_export": "x", "session_new": "n", "session_list": "l",