summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2026-01-07 23:11:46 -0500
committerDax Raad <[email protected]>2026-01-07 23:11:46 -0500
commitb3a2f9fb4ee00b5ad4ce24e2dad2abe1da3024ee (patch)
tree662a7d2de4070628b91df077b8674d47a62ea3e2
parent8be5a298705533a88ee3ab379b72bfb2e7e27ddd (diff)
downloadopencode-b3a2f9fb4ee00b5ad4ce24e2dad2abe1da3024ee.tar.gz
opencode-b3a2f9fb4ee00b5ad4ce24e2dad2abe1da3024ee.zip
tui: add expandable bash output for long commands to improve readability
-rw-r--r--packages/opencode/src/cli/cmd/tui/routes/session/index.tsx21
1 files changed, 18 insertions, 3 deletions
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 0037f23bb..dbd6743c8 100644
--- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
+++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
@@ -1518,15 +1518,30 @@ function BlockTool(props: { title: string; children: JSX.Element; onClick?: () =
}
function Bash(props: ToolProps<typeof BashTool>) {
- const output = createMemo(() => stripAnsi(props.metadata.output?.trim() ?? ""))
const { theme } = useTheme()
+ const output = createMemo(() => stripAnsi(props.metadata.output?.trim() ?? ""))
+ const [expanded, setExpanded] = createSignal(false)
+ const lines = createMemo(() => output().split("\n"))
+ const overflow = createMemo(() => lines().length > 10)
+ const limited = createMemo(() => {
+ if (expanded() || !overflow()) return output()
+ return [...lines().slice(0, 10), "…"].join("\n")
+ })
+
return (
<Switch>
<Match when={props.metadata.output !== undefined}>
- <BlockTool title={"# " + (props.input.description ?? "Shell")} part={props.part}>
+ <BlockTool
+ title={"# " + (props.input.description ?? "Shell")}
+ part={props.part}
+ onClick={overflow() ? () => setExpanded((prev) => !prev) : undefined}
+ >
<box gap={1}>
<text fg={theme.text}>$ {props.input.command}</text>
- <text fg={theme.text}>{output()}</text>
+ <text fg={theme.text}>{limited()}</text>
+ <Show when={overflow()}>
+ <text fg={theme.textMuted}>{expanded() ? "Click to collapse" : "Click to expand"}</text>
+ </Show>
</box>
</BlockTool>
</Match>