diff options
| author | Dax Raad <[email protected]> | 2026-01-07 23:11:46 -0500 |
|---|---|---|
| committer | Dax Raad <[email protected]> | 2026-01-07 23:11:46 -0500 |
| commit | b3a2f9fb4ee00b5ad4ce24e2dad2abe1da3024ee (patch) | |
| tree | 662a7d2de4070628b91df077b8674d47a62ea3e2 | |
| parent | 8be5a298705533a88ee3ab379b72bfb2e7e27ddd (diff) | |
| download | opencode-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.tsx | 21 |
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> |
