🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI
← 全部攻略

把 AI 编程会话搬回终端:dsh-tianshu-tui 的渲染分层与投影设计

工具 / 效率类文章2026/10/13 发布2 次阅读

dsh-tianshu-tui 是官方 DeepSeek Harness 上的交互式终端 TUI 面板插件(仓库 huiliyi37/dsh-tianshu-tui,Apache-2.0,站点 286 星)。它值得细读的地方不在功能清单,而在一个取舍:把「界面」压缩成纯展示层。终端里看到的一切都从会话事件流派生,理解这条主线,文档里那些看着零散的设计——自研极简 ANSI 引擎、只增滚动转录、投影层、fails loud 的服务依赖——才会连成一套自洽的架构。

纯展示层:一个不注册任何面的 UI

README 的「Model Experience」一栏写的是「无」。这不是谦虚,而是明确的设计陈述:TUI 渲染已记录的会话事件,并转发普通用户输入,自身不注册任何 prompt、工具或上下文面。落到工程上,意味着你敲进输入行的内容,最终以一条普通日志消息的身份进入会话,而不是某种 TUI 私有通道。对模型侧来说,输入来自终端还是别的前端,形状是一致的;KV Cache 也因此没有直接受影响的路径,请求影响归属 session 与 loop 包。UI 不参与建模这条边界,直接决定了后面所有分层。

自研 ANSI 引擎与只增滚动转录

渲染核心是自研的极简 ANSI 引擎,强调轻量渲染。滚动转录的关键字是「只增」:内容追加到底部,历史不就地改写,重放和恢复因此变成一件简单的事。启动时会话恢复经同一渲染桥重放完整转录,恢复后的视图与当初实时推进出来的视图共享同一套渲染路径,不存在两套代码各自演化。恢复面板会把可恢复会话列表写入滚动区,/session switch 之后同样走这条桥。

事件流投影:状态从哪来

既然 UI 不持有状态,状态就必须有来处,答案是投影:所有渲染状态都派生自会话事件。README 的架构文档把这一层称为投影层,并诚实标注了接线进度——四个纯折叠模型里,turn-summary(turn/end 摘要行)与 summary-state(/status 的会话汇总段)已经接线,后者在宿主投影总线缺失时仍有数据;activity-status 与 activity-store 则有意保留未接线,理由写在文档里:statusline 已是自包含投影,替换没有收益,activity-store 暂无消费方。

在渲染侧,这套投影外显为对话流、工具卡与各类 live-region 面板。工具结果按 harness presenter 的意图结算成滚动区卡片:diff 渲染结构化红绿差异,与审批预览共用同一套渲染;terminal 结果带命令标题、cwd 与退出或信号徽标;其余折叠为文本卡片。

推理通道的可视化:头行、折叠与 Ctrl+O

think 通道最能说明分层取向。思考中,滚动区上方以实时 shimmer 头行流动;段末折叠成一行紧凑信息,形如 ✻ 思考 (3.2s) · 12 行;需要细看时按 Ctrl+O 在原位展开全文。默认折叠、按需展开,是这个插件较少见的一个取舍。ctrl+o 被保留给推理展开,因此 TuiRunnerConfig 里 editorKey 的缺省是 ctrl_e,不会与之冲突。

装配方式:bundle patch 与 TuiRunnerConfig

插件的进入方式不是替换宿主,而是挂在 bundle patch 上:在 dsh-base 之上插入一个 tui-runner 插件,声明两行即可。

- id: tui-runner
  name: '@huiliyi37/dsh-tianshu-tui'

行为面由 TuiRunnerConfig 控制,且全部可选。stdin / stdout 用于流注入,缺省走进程流;initialSessionId 指定恢复的会话;editorKey 缺省 ctrl_e;vimEnabled 缺省 false;vision 下的 supportsVision 与 bridgeEnabled 未传入时,分别经 llm catalog 刷新、按宿主 visionBridge 服务存在性自动探测;workflowHistoryLimit 缺省 50;lsp 缺省启用、单次拉取超时 2000ms。全部可选意味着装配面很薄。

服务依赖:必需三个,可选九个

依赖被切成两档。sessions / agents / agentDefaultModel 是必需项,走必选 inject;goals / subagents / memory / compact / tasks / skills / sessionProjections / workflowEngine / planMode 是可选。可选不等于可以沉默地缺:未装配时,相关命令与面板会 fails loud 报不可用,绝不静默吞,也不阻塞 TUI 启动。实践里 /status、/tasks、/subagents、/workflow 这类面板在宿主服务缺失时会明确回显警告,而不是留一片空白。

LSP 诊断的边界:只进本地展示缓存

LSP 支持同样遵守「UI 不侵占会话」的规矩:诊断只进 TUI 本地的展示缓存,不写会话事件,也不注册任何模型面。需要说明的是,模型工具面是另一回事——lsp_goto_definition / lsp_find_references / lsp_diagnostics 随包内置,由伴生插件 @huiliyi37/dsh-lsp 提供,bundle patch 自动 insert,装 TUI 一个包即得展示桥加模型工具面,二者共享同一套 LSP server。运行时局限 README 也写得直接:server 初始化慢于默认 2s 超时会静默无诊断,下次触碰文件重拉;大仓库的 tsserver 会常驻内存,没有空闲回收;切会话不重启 server,rootUri 沿用首会话的 cwd。

另外如实说明扫描结论:本站对该插件的静态扫描为 🔵 含敏感能力(可执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量),尚无人工评估。站点写明这是能力清单、不是危险判定,是否安装请自行权衡。

总结

把一个终端 UI 做到「所有状态都派生自会话事件、自身不注册任何面」,换来的是渲染路径可重放、恢复与实时推进共用一套桥、模型侧行为不因前端而漂移;想对照同类插件的中文清单与安装形态见 DeepSeek Harness Hub 插件清单。

适合与不适合

适合:习惯长时间停留在终端、希望会话恢复后视图与实时推进一致的开发者;需要把推理过程默认折叠、只在必要时展开保持滚动区整洁的人;想要 LSP 诊断上工具卡徽标、又不希望它污染会话事件的场景;需要在多模型之间用 /model 与 /effort 热切、且不想重启会话的会话型工作流。

不适合:不接受纯键盘操作、依赖鼠标点选的用户;Node 仍在 22.19 以下、不愿装 pnpm、也不打算把宿主升到 0.2.0-rc.1 及以上的环境;只把终端当兜底、以图形界面为主的使用方式。

标签:dsh-tianshu-tui、DeepSeek Harness、终端 TUI、事件流投影

本文由 DeepSeek Harness Hub 自动整理,数据来源于插件详情页。

回到顶部