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 48d6f9cb8e66..d3512c0a7ea0 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -94,6 +94,7 @@ const context = createContext<{ showTimestamps: () => boolean showDetails: () => boolean showGenericToolOutput: () => boolean + bashFollowCollapsed: () => boolean diffWrapMode: () => "word" | "none" providers: () => ReadonlyMap sync: ReturnType @@ -153,6 +154,7 @@ export function Session() { const [diffWrapMode] = kv.signal<"word" | "none">("diff_wrap_mode", "word") const [animationsEnabled, setAnimationsEnabled] = kv.signal("animations_enabled", true) const [showGenericToolOutput, setShowGenericToolOutput] = kv.signal("generic_tool_output_visibility", false) + const [bashFollowCollapsed, setBashFollowCollapsed] = kv.signal("bash_follow_collapsed", false) const wide = createMemo(() => dimensions().width > 120) const sidebarVisible = createMemo(() => { @@ -637,6 +639,16 @@ export function Session() { dialog.clear() }, }, + { + title: "Toggle collapsed bash follow", + value: "session.toggle.bash_follow_collapsed", + keybind: "bash_follow_collapsed", + category: "Session", + onSelect: (dialog) => { + setBashFollowCollapsed((prev) => !prev) + dialog.clear() + }, + }, { title: "Page up", value: "session.page.up", @@ -1025,6 +1037,7 @@ export function Session() { showTimestamps, showDetails, showGenericToolOutput, + bashFollowCollapsed, diffWrapMode, providers, sync, @@ -1759,6 +1772,7 @@ function BlockTool(props: { function Bash(props: ToolProps) { const { theme } = useTheme() + const ctx = use() const sync = useSync() const isRunning = createMemo(() => props.part.state.status === "running") const output = createMemo(() => stripAnsi(props.metadata.output?.trim() ?? "")) @@ -1767,6 +1781,7 @@ function Bash(props: ToolProps) { const overflow = createMemo(() => lines().length > 10) const limited = createMemo(() => { if (expanded() || !overflow()) return output() + if (ctx.bashFollowCollapsed()) return ["…", ...lines().slice(-10)].join("\n") return [...lines().slice(0, 10), "…"].join("\n") }) diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index 850bcc28bcd9..9ea4f3d10c50 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -658,6 +658,11 @@ export namespace Config { .default("h") .describe("Toggle code block concealment in messages"), tool_details: z.string().optional().default("none").describe("Toggle tool details visibility"), + bash_follow_collapsed: z + .string() + .optional() + .default("none") + .describe("Toggle bash output following in collapsed view"), 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"),