Skip to content

[feat] tui: fold/truncate tool-call input/output in transcript to reduce visual clutter #63

Description

@li-xiu-qi

问题场景

在 TUI 对话记录中,tool-call 的输入参数和完整输出被原样渲染在 assistant 回复之前。当工具调用频繁或输出较长时(例如 Bash 执行了一段脚本、读取了大段文件内容),整个 transcript 会被工具输出占满,用户需要滚动很久才能看到 assistant 真正的回复。

这导致两个问题:

  1. 视觉噪音大:用户通常只关心工具是否成功执行以及关键结果,不关心完整的内部参数或原始输出。
  2. 信息密度低:assistant 的核心回复被淹没在大量工具输出中。

当前行为

当前 TUI 会把 tool-call 的完整输入/输出作为普通 transcript entry 直接展开显示,和 assistant 回复混在一起。如下图所示:

Image

从图中可以看到,用户问题之后是一大段 Bash 脚本的工具输出,然后才是 assistant 的 Markdown 回复。

期望行为

默认情况下,tool-call 的输入和输出应该被折叠/截断展示,只保留关键信息:

  • 显示工具名称和一行摘要,例如 Used Bash (wsl -e bash -c '...')
  • 输入参数和输出结果默认只展示前几行,超出部分用灰色提示 ... (N more lines, ctrl-o to expand)
  • 用户可以通过快捷键(如 ctrl-o 或点击)展开查看完整内容
  • 折叠后的工具条目使用低对比度颜色(灰色),减少视觉干扰

参考实现效果:

Image

已经考虑过的替代方案

  1. 完全隐藏 tool-call 结果:只告诉用户“执行成功/失败”。这种方式最简洁,但会丢失可调试性,当工具执行结果不符合预期时用户无法查看细节。
  2. 把 tool-call 结果放到单独的侧面板或日志文件:保持 transcript 干净,但需要额外的 UI 复杂度和交互学习成本。
  3. 默认折叠 + 可展开:在简洁性和可调试性之间取得平衡,也是大多数现代 AI IDE/CLI(如 Claude Code、Cursor)采用的方案。

推荐方案 3。

相关代码

  • src/tui/app.tsxbuildTranscriptItemsTranscriptEntry 渲染逻辑
  • packages/core/src/tools/presentation.ts — tool 结果展示相关格式化
  • skills/builtin/src/command-output.ts / command-tool.ts — 命令行工具的输出处理

相关 issue / PR

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions