XMoon/dsh-pi-tui

XMoon/dsh-pi-tui

DeepSeek Harness 的第三方 TUI 模式(dsh --profile pi-tui),基于内置 pi-tui fork 构建:覆盖主会话循环(审批、命令、会话切换与全文搜索),以及预设、技能、模型/设置菜单与斜杠命令。

UI 개선deepseek-harnessdsh

dsh-pi-tui

English | 简体中文

基于 Pi TUI 的 DeepSeek Harness 终端前端。

dsh-pi-tui 作为独立的 dsh bundle 安装到 profile 中,提供流式对话、工具调用、会话管理、Subagent、历史搜索、Shell、审批与设置等终端交互。模型、工具、Session、权限、Skills、Plan、Goal、Subagent 等运行时能力仍由 DeepSeek Harness 提供。

安装到 DSH Profile

Stable / latest

稳定版是普通用户的推荐渠道。请先安装 DSH,再将 TUI 添加到 pi-tui profile:

npm install -g --allow-scripts=@deepseek-ai/dsh-subprocess-local,koffi,node-pty @deepseek-ai/dsh@latest
dsh plugin --profile pi-tui -- add @xmoon76/dsh-pi-tui@latest
dsh --profile pi-tui

Next / npm 线(验证)

预览安装使用 DSH 的 alpha channel 与 TUI 的 next channel;安装 DSH 时需要显式允许其原生安装脚本:

npm install -g --allow-scripts=@deepseek-ai/dsh-subprocess-local,koffi,node-pty @deepseek-ai/dsh@alpha
dsh plugin --profile pi-tui -- add @xmoon76/dsh-pi-tui@next
dsh --profile pi-tui
这两个 channel 今天不构成可安装的兼容 pair。 它们只是通道指针:当前
@deepseek-ai/dsh@alpha 指向 0.2.1-alpha.5,而 @xmoon76/dsh-pi-tui@next
仍指向 0.5.2-rc.1(peer floor >=0.2.0-rc.2,npm semver 不接受不同
major.minor.patch tuple 的 prerelease)。请以下方版本对应表和
兼容性指南 的通用匹配原则为准;稳定版 0.5.3 发布在
@latest 而不是 @next,因此这两个移动 channel 上没有可安装的兼容组合。
本 checkout 的精确验证请使用 pnpm compat:dsh:npm。

隔离的 npm 驱动仍按本 checkout 声明的精确 DSH 版本运行,并执行完整的 build/test/package 路径:

pnpm compat:dsh:npm

具体的稳定版最低版本、next 兼容范围和回退路径见兼容性指南。

环境要求

  • DeepSeek Harness
  • Node.js ^22.19.0 || >=24

DSH 与 TUI 版本对应(重要)

TUI 包版本 · 对应的官方 DSH tags · 说明 0.5.3(stable / @latest) · dsh-v0.2.1-rc.2、dsh-v0.2.1-rc.3 · 当前已发布稳定版;peer floor 仍是 0.2.1-rc.2,本仓库当前 checkout 的精确验证目标已前移到 0.2.1-rc.3 0.5.1(stable,历史) · dsh-v0.2.0-rc.2 · 上一稳定版;最低与精确验证目标均为 0.2.0-rc.2 family 0.5.2-rc.1(next 通道预览,已发布) · dsh-v0.2.0-rc.2 · 上一轮 next 预览:已发布到 npm next 通道(2026-10-17);整套 peer floor 仍是 >=0.2.0-rc.2,不覆盖 0.2.1-rc.2 dsh-v0.2.1-rc.1(无配对 TUI) · 无 · 该中间版本没有本矩阵宣称兼容的已发布 TUI;不要为它复用 0.5.3 0.5.0(stable,历史) · dsh-v0.1.7-rc.2、dsh-v0.2.0-rc.1 · 上一稳定版;最低 0.1.7-rc.2,精确验证目标 0.2.0-rc.1 0.4.9(stable,历史) · dsh-v0.1.7-rc.2 · 上一稳定版;0.1.7-rc.2 runtime 的兼容 TUI 0.4.8(stable,历史) · dsh-v0.1.7-rc.1 · 上一稳定版;0.1.7-rc.1 runtime 的兼容 TUI 0.4.6(stable,历史) · dsh-v0.1.5-rc.1、dsh-v0.1.5-rc.2 · 上一稳定版;0.1.5 runtime 的兼容 TUI 0.4.7-alpha.2(next,历史) · dsh-v0.1.6-alpha.2 · 上一条 next 线;0.1.6-alpha.2 runtime 的兼容 TUI

不要把稳定线与 @next 预发布线混装。0.5.3 是当前已发布稳定版:它的最低 DSH 版本(peer floor)仍是 0.2.1-rc.2 family,而已发布的 0.5.3 与后续的 0.2.1-rc.3 也已实测配对(官方 preset assembly 在 rc.3 下通过);本仓库当前 checkout 的精确验证目标前移到 0.2.1-rc.3,这不改变 0.5.3 已发布包的身份与 floor。中间的 dsh-v0.2.1-rc.1 没有配对 TUI,0.5.2-rc.1 是上一轮已发布到 npm next 通道的 预览身份(配对 0.2.0-rc.2;它不覆盖 0.2.1-rc.2,因此新的稳定线使用 0.5.3 身份)。上一稳定版 0.5.1 继续配对 0.2.0-rc.2:它把整个 DSH peer floor 提升到 >=0.2.0-rc.2(Question 生命周期消费 rc.2 才发布的公开契约)。更早的 0.5.0 保持 >=0.1.7-rc.2 floor 不变(精确验证目标 0.2.0-rc.1);旧 runtime 会在正常的 不兼容边界以非零状态失败,请按上表安装配对的 TUI 线。上方的版本对应表是已发布 线的摘要;通用版本匹配原则与回退/诊断流程见兼容性指南;要查看 @next 的最新集成 状态,请看 next 分支 README。

新的 Agent preset 使用当前 roster 中选定的 id。DSH 允许合法的自定义 code preset;只要当前 roster 存在它,显式输入和持久化状态都会保留 code。 DSH V3 migration 负责历史 session header/selection 的 code -> ptc 转换; 当前 projection 会原样保留合法的自定义 code。省略请求的 legacy settings default 不再做任何别名映射:当前 roster 没有声明就是无效偏好。

Profile management

更新已安装的 TUI:

dsh plugin --profile pi-tui -- update @xmoon76/dsh-pi-tui

查看已安装插件:

dsh plugin --profile pi-tui -- list

卸载:

dsh plugin --profile pi-tui -- remove @xmoon76/dsh-pi-tui

恢复已有 Session:

dsh --profile pi-tui --session <session-id>

功能

对话与工具

  • 流式 Markdown 输出
  • Thinking 折叠与展开
  • Tool Call 卡片及运行状态
  • Tool / System 详情折叠
  • Transcript 全文搜索
  • 长会话历史折叠
  • Context、Token、模型和运行状态显示
  • Approval 与 ask_user_question 交互
  • Plan Review
  • Todo / Goal 状态展示
  • 可读的终端窗口标题
  • 长会话按有界窗口浏览,并保留翻页与实时跟随位置
  • 超长用户 Prompt 默认折叠为 head + marker + tail;普通与全屏非 Focus 下 Ctrl+O 展开、收回
  • Compaction / prune 后不会出现重复的幽灵 Tool Card

Ctrl+O 控制工具和系统详情,并在普通模式与全屏非 Focus 下展开/收起超长用户 Prompt;全屏 Focus 下它整体展开最近几个 Thought root 或全部收起,超长用户 Prompt 改用点击提示行(或搜索命中)展开、Ctrl+O 收回。Alt+T 单独控制 Thinking。

Conversation display

/display 在三种展示预设间切换:full(默认)是普通 Transcript 展示;focus 将当前回合的 Thinking、Tool Call 和中间回复聚合为一个实时更新的 Thought 区块;compact 把连续的过程折叠为带 Header + Think: / Action: 预览的 Activity 段,会话与 assistant 的中间输出仍按时间顺序可见,注入的 notice / relay / recall 改为独立呈现(相邻的环境类注入合并为可展开的 Context 簇),展开用鼠标点击或 Ctrl+O。/settings 的 Display 行提供同一组取值并持久化;/focus 仍作为兼容命令保留。

需要查看过程时可以展开,关闭 Focus 后恢复普通 Transcript 展示。全屏 Focus 中可以按 Thought root 批量展开/收起,也可以单独点击卡片;切换或缩放时会保留 viewport。展示预设只影响界面投影,不修改 Session 中保存的事件。

沟通策略

/settings 提供两个独立的沟通设置。Progress updates 控制 Agent 工作时的中途更新节奏:milestones(默认)只在完整的阶段结束、方向实质变化或需要用户输入时简短汇报,不为「刚发现一个局部结论」而打断;frequent 在较长的多步工作中持续带用户跟进;off 完全不做过程叙述。Response style 控制可见回复的密度:default 不附加表达指导,concise 紧凑且结果优先,explanatory 补充原理、架构与取舍。两项切换都在下一次提示词组装时生效,无需重启 Agent,并跨会话保存。Focus 是展示能力而非第三个偏好:进入 Focus 时进度更新节只是暂时失效(不生成只含进度的中间消息),保存的节奏偏好不变,Response style 在 Focus 下仍然生效。

Session

支持 DSH 持久化 Session,包括:

  • 新建和恢复 Session
  • Session 切换
  • 重命名
  • Fork
  • Rewind
  • Session lineage
  • /export — 完整 Session 归档(含子代理与附件),保存到 Client 本地目录
  • /transcript — 可读 Markdown 对话记录,保存到 Client 本地目录

使用:

/sessions
/fork
/rewind
/export
/transcript

空闲且编辑器为空时也可以快速按两次 Esc 打开 Rewind。

Rewind 会从选中的历史 User Turn 创建新的 Child Session,并把对应 Prompt 放回编辑器。原 Session 不会被修改。

输入历史

Ctrl+R 打开输入历史搜索。

支持三个范围:

  • Current session
  • Current directory
  • All directories

历史结果包含 Prompt、工作目录、时间和 Session 信息。选中历史后只恢复到编辑器,不会立即发送。

普通的 ↑ / ↓ 仍用于快速浏览最近输入。

Subagent 与 Task Center

/tasks 打开完整 Task Center,显示当前 Session 中仍由 Job Registry / Subagent catalog 跟踪的工作;Footer 的 ↓(仅在光标位于编辑器最后一个可视行时)打开按需的 Quick 窗口,它默认不占行、出现在整个 Footer 之下。选中 Job 后进入全屏 Job 工作区:顶部一行显示 Job 身份、主题状态与大写状态及 [GAP]/[ERROR]/[SETTLED] 事实,下面是真实进度/说明、命令摘要与 Output/Command 阅读标签。Output 是官方非消耗式的实时输出预览(可滚动、可搜索,并明确标注为保留尾部而非完整历史),Command 页可阅读并按原文复制 shell 命令。工作区不会消耗模型的 job_output 游标,也不写入会话历史。

Task Center 的 ACTIVE / TRACKED 是展示范围:ACTIVE 只显示当前活动项,TRACKED 显示当前跟踪源(Job Registry / Subagent catalog)仍列出的全部项;TRACKED 不是 Session 执行历史。DSH 0.1.7 会在普通前台 bash / pwsh 执行期间临时注册 Job,使其可以在 Task Center 中观察和停止;如果命令在前台等待内完成,DSH 会移除该临时记录,最终结果仍保留在 Transcript 的 tool card 中。显式 run_in_background: true 或被提升为后台的 Job 在完成后,只要 Job Registry 继续保留其记录,就仍可在 TRACKED 中查看。

/plugins 打开当前 profile 的全屏 Plugin Manager:目录固定为 TUI & Extensions / Official DSH / Third-party / Experimental(实验组最后),窄屏单栏、宽屏双栏,可搜索、筛选、查看来源与状态,并从官方目录执行安装、启用/禁用与删除;结果以 Host 实际返回的版本、重启要求和错误为准。正在提供当前界面的 dsh-pi-tui 只读且不可从自身界面禁用或移除。/settings 的顶级 Plugins 分类原地打开同一页面,返回时保留 Settings 的分类、滚动与选择。页面内按 d 打开只读的 Diagnostics:按 owner 分组显示 extension 贡献的 active/failed/shadowed 状态与完整 lastError、各 registry 计数、实际 capabilities,以及无法证明 Loader entry 归属的贡献(单列 Unassociated extension contributions);c 复制所选事实、C 复制全部、r 重新读取、Esc 返回。Diagnostics 只读 extension ledger,不把 Host 包安装状态或安装日志混入其中;copy 仍只证明已发送,不证明操作系统剪贴板已收到。

Experimental 组的 14 个官方 rc.2 实验包在 Detail 中给出固定的终端可用面与限制/风险说明(Web-only、Host-only、B04 的 WEB_ONLY/Host 行未挂载(Owner 已接受)、B13/B14 的已验证 one-shot/provider 边界等),这些说明只随精确官方包身份出现,不随启用状态伪装成 Host 能力通过;升级指引按 Host 事实区分「随 DSH 发行升级」「profile 包先 Remove 再显式 Install」「官方 on-demand 目标」和「当前 TUI 由外部管理」,不提供原地更新、版本选择器或静默重装。

Subagent 按完整 lineage 显示,包括嵌套创建的 descendant:

main
├─ subagent A
│  └─ subagent B
└─ subagent C

浏览器会区分:

  • continuable
  • one-shot
  • running / inactive
  • nested descendant
  • Job Registry 跟踪的 Job(含运行中的前台 shell)

Footer ↓ 打开的 Quick 窗口默认不占行,只在编辑器最后一个可视行按 ↓ 时展开到 Footer 之下:↑↓ / PgUp / PgDn 选择,Enter 用真实任务身份打开既有详情,↑(首行)或 Esc 返回编辑器并保留草稿;列表末尾的 “Open Task Center” 行进入完整 Task Center。

完整 Task Center 额外提供 A 切换 Active / Tracked、/ 搜索、Tab / Shift+Tab 双向切换类型、S(确认后)停止所选任务以及 R 刷新 / 重试。Quick 窗口只消费上述导航键,其余输入一律 no-op,不会进入搜索、停止确认或任务管理状态,因此 Esc 始终一层关闭。

已经结束的 one-shot Subagent 仍可以打开并查看持久化 Transcript。

对于当前 Session 的直接 continuable Child,可以进入交互式 Viewer,并直接向该 Subagent 发送后续消息(走 DSH 官方 subagents.prompt() 人类输入通道——按顺序排队为 Child 自己的下一个 turn,并保留 user 来源)。Child 使用自己的 Transcript、Draft 和运行状态,不会修改主 Session 的输入。

更深层的 nested Subagent 默认以只读方式查看。

官方 Subagent 模型选择(DSH subagent-model-selection 设置)可在 /settings 中开关并维护 allowlist:开启后新建 Session 的官方 subagent 工具可以按调用 选择子 Agent 的 provider/model(受 allowlist 限制)。设置在 Session 组合时采样, 不会改写已在运行的 Session 的工具。

Shell

编辑器支持两种 Shell 模式:

! git status

在宿主(Host)环境执行命令,并把输出提交到当前 Session。

!! git status

同样在宿主环境执行,但输出不进入模型上下文(仅卡片展示)。

! / !! 是独立的编辑器模式,而不是普通文本前缀。进入 Shell 模式后 Prompt 和补全行为会同步切换。