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 55ab4d54d..f5a7f6f6c 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -98,6 +98,7 @@ const context = createContext<{ showThinking: () => boolean showTimestamps: () => boolean showDetails: () => boolean + showGenericToolOutput: () => boolean diffWrapMode: () => "word" | "none" sync: ReturnType }>() @@ -152,6 +153,7 @@ export function Session() { const [showHeader, setShowHeader] = kv.signal("header_visible", true) 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 wide = createMemo(() => dimensions().width > 120) const sidebarVisible = createMemo(() => { @@ -600,6 +602,15 @@ export function Session() { dialog.clear() }, }, + { + title: showGenericToolOutput() ? "Hide generic tool output" : "Show generic tool output", + value: "session.toggle.generic_tool_output", + category: "Session", + onSelect: (dialog) => { + setShowGenericToolOutput((prev) => !prev) + dialog.clear() + }, + }, { title: "Page up", value: "session.page.up", @@ -974,6 +985,7 @@ export function Session() { showThinking, showTimestamps, showDetails, + showGenericToolOutput, diffWrapMode, sync, }} @@ -1508,10 +1520,40 @@ type ToolProps = { part: ToolPart } function GenericTool(props: ToolProps) { + const { theme } = useTheme() + const ctx = use() + const output = createMemo(() => props.output?.trim() ?? "") + const [expanded, setExpanded] = createSignal(false) + const lines = createMemo(() => output().split("\n")) + const maxLines = 3 + const overflow = createMemo(() => lines().length > maxLines) + const limited = createMemo(() => { + if (expanded() || !overflow()) return output() + return [...lines().slice(0, maxLines), "…"].join("\n") + }) + return ( - - {props.tool} {input(props.input)} - + + {props.tool} {input(props.input)} + + } + > + setExpanded((prev) => !prev) : undefined} + > + + {limited()} + + {expanded() ? "Click to collapse" : "Click to expand"} + + + + ) }