ARTICLE · 1117642
【DSH 插件·开发工具】在终端用 dsh-TUI 前,先看清它接管的那一片
你在服务器上用 SSH 加 tmux 干活,DeepSeek Harness 的交互界面却只有 Web 端:起一个只监听本机的服务,打印 URL,你把端口转发回本地,再在浏览器里看会话、批操作。能用,但每次审批都要跳出终端。你想把这一切留在 tmux 里,于是搜到了 dsh-TUI:装上它,终端里就有了全屏界面、鼠标操作和订阅账号登录。装一个 UI 插件听起来是无风险的小事,但它接管的那一片恰好是你最敏感的部分——所有会话、全部键盘输入、模型登录凭据。这篇文章把这块地看清楚。
文章看的是 @deepseek-harness-tui/dsh-tui@0.12.0,MIT 许可,npm 上有六名维护者,发布链带 SLSA provenance;宿主基线是 DeepSeek Harness dsh-v0.2.0-rc.2,正是这个版本声明的首要兼容目标。

▲ 注入面:纯插件形态,插入 19 个服务行、覆盖 8 个宿主配置、禁用 22 个宿主工具行;会话存储与 Web 端共用。
官方留下的空位
先说这个插件为什么存在。官方仓库在 2026 年 8 月 4 日删掉了自带的 TUI 包,决策记录写得很直白:Web 仍是随包发布的交互界面,终端交互层留给社区重写。也就是说,今天在宿主基线里已经没有任何官方终端界面,你的选项只剩浏览器、一次性脚本,或者第三方插件。
dsh-TUI 接这个空位的方式是纯插件:不改宿主代码,全部通过 Cordis profile 层生效。它的 manifest 插入 19 个自有服务行,覆盖 8 个宿主配置行,禁用 22 个宿主工具行——禁用不是砍功能,而是把模型可见的工具集交给 preset 体系管理,避免最小 agent 泄漏宿主层工具。
两个设计决定了它的使用体验。第一,它读写与 Web 端相同的 JSONL 会话存储,路径在 ~/.dsh/sessions,从浏览器切到终端不丢历史,反过来也一样。第二,它对官方实现退让:10 个插入行带有自我禁用逻辑,一旦检测到对应官方行已启用就自动让位,混用 Web 和 TUI 的 profile 时会复用官方监听器,不另起炉灶。
它接管什么
这是装之前真正要过的一遍清单:渲染层拿走什么、登录凭据放在哪、什么情况下它会自己连网,以及平台之间安全默认值的差别。
渲染层接管整个终端。全屏 ink 界面意味着 alternate screen、鼠标追踪、括号粘贴全都由插件驱动,你敲下的每个键都先经过它。这是终端 UI 的本性,不是缺陷,但它决定了你对这个包的信任等级应当对齐你对宿主本身的信任等级。
登录面比 Web 端更进一步。v0.12.0 内置账号登录,通过 /provider 或 /auth 管理 ChatGPT、Codex、Claude、Grok 的订阅登录;DeepSeek 浏览器授权由宿主承载。OAuth 客户端配置不在插件里,而是运行时取自宿主的 pi-ai 模块——插件没有硬编码任何域名或 client id。凭据落地集中在一个 credentials.json,权限 0600。集中是双刃:好备份,但一次泄漏就是全部供应商的令牌。
网络行为在静态审计后边界清楚:启动时唯一的主动外联,是向 registry.npmjs.org 发一次 GET 查询最新版本元数据,不带任何标识符,四秒超时后静默放弃。其余网络要么由用户主动触发(如 /balance),要么只走回环地址(IDE WebSocket、OAuth 回调)。遥测默认关闭。
供应链这一面有具体数字可以放心:锁文件里 620 个依赖项全部带 sha512 校验,没有一个来自 git 或任意 URL;发布 tarball 与源码仓库在 tag v0.12.0 上逐文件对过,35 个共同文件里 34 个字节相同,唯一差异是发布流程把 8 个 workspace 依赖替换成了固定版本号,属于构建产物而非篡改。图片处理用的 sharp 是可选依赖,精确锁定 0.35.4 且不随包分发,原生模块交给宿主环境按平台解析。
安全默认值在平台上不对称,这是全篇最重要的警告:Windows 上沙箱默认 danger-full-access 且审批策略 never——模型发起的每个 bash 和文件操作都不受沙箱限制、不经确认直接执行。作者的理由是上游没有可用的 win32 沙箱链,但结果就是你把终端信任模型当成了全部防线。macOS 和 Linux 默认 workspace-write 加 ask,姿态正常。
还有一处中间风险值得知道:manifest 里有 33 处加载期执行的 !!js 表达式,它们在 manifest 装载时、任何同意门之前运行。发行版里这些表达式都是良性的环境读取和路径探测,但一旦有人改了这个文件,它就是代码执行入口。所以安装来源要用 registry 包,项目文档也明确不支持 git URL 安装。

▲ 生命周期:全局启动器引导 profile,manifest 装载后进入 ink 渲染;卸载无钩子,多处状态会留下。
隔离环境里跑一次
静态结论需要在运行中对照。复现环境是 macOS arm64 加 Node 25,临时 HOME 和临时 DSH_HOME,registry 指向本地记录器;安装命令带 --ignore-scripts,宿主和插件都以固定版本装入。
结果与静态审计一致。PTY 里启动 18 秒,欢迎屏正常渲染:会话列表、工作区栏、键位提示、底部状态行都在。网络记录恰好一条——那条启动时的版本查询 GET,别无其他。文件系统新增恰好 10 个文件,全部落在预期边界内:偏好和索引在 ~/.dsh-tui,会话、存储和 profile 配置在隔离的 DSH_HOME 里;真实用户目录零触碰。安装全程没有任何生命周期脚本执行,profile 体积约 71MB。

▲ 隔离复现:ink 欢迎屏渲染正常,会话列表与工作区栏可见。

▲ 增量对账:10 个新文件全部落在插件自有边界内,网络外联仅一条版本查询。
也要诚实说明没跑到的地方:真实 OAuth 登录没有执行(那需要真实账号,会把凭据写进隔离 HOME);模型在沙箱下实际发起 bash 和文件操作没有触发;Windows 路径按静态结论直接排除,未做复现。所以运行时结论是“与静态审计一致”,而不是“全功能验证”。
和官方 Web 怎么选
同一份工作,两个表面,差异集中在三条轴上:你在哪里干活、怎么登录模型、会话历史是否连续。
工作位置。Web 端是浏览器加本机端口,SSH 场景打印 URL 后由你自己处理转发;TUI 在任意终端和 tmux 分屏里原生运行,鼠标可直接用,还带 Kitty/Sixel 图片、Mermaid 的 Unicode 渲染和上下文进度条这类终端专属能力。如果你的日常是 SSH 加 tmux,这是第一等和第二等体验的差别;如果你的日常是桌面浏览器,Web 端随宿主自带,无需装任何东西。
登录面。Web 端的模型设置是 API-key 形态,自己管理密钥;TUI 内置订阅账号的 OAuth 登录,不用手工配 key。代价是 SSH 固定端口转发场景下回调对齐要靠全局包版本一致。
会话连续性。两者共用同一个 JSONL 存储,这一点前面说过;TUI 额外提供 dsh-tui migrate,可以把 Claude Code、Codex、Grok Build 的历史导入成一等会话。从其他 agent 迁移过来是受支持的路径,不是黑科技。
生态里另有几个终端界面插件,各有取向:pi 风格的套件偏重子代理转向,SSH 专属版本主打断线重连和纯 ANSI,多会话工作台强调持久助手。它们都走同一条 dsh 插件 API,但社区规模和维护节奏都差着一个量级。dsh-TUI 是其中唯一有六名 npm 维护者、SLSA provenance 和全平台独立安装包的,这也是它被选为本文对象的原因。

▲ 同一工作三个轴的对比:工作位置、登录面、会话连续性;底层 dsh-base 服务相同。
安装判断
结论是 install,适用对象很具体:macOS 或 Linux、宿主 dsh-v0.2.0-rc.2、想要终端原生体验、接受 OAuth 登录走宿主 pi-ai、接受会话存储与 Web 端共用 JSONL。不适用的人同样清楚:Windows 用户(默认无沙箱且无审批,这条足以否决)、只跑一次性脚本的人(用宿主自带的 headless 模式更干净)、需要把会话放进持久多用户后端的人(JSONL 文件存储就是它的全部)。
装之前有一个必须记住的陷阱:npm 上还存在一个不带 scope 的 dsh-tui,属于另一个项目——同一维护者在 13 小时内连发 21 个版本后停更,没有 provenance,而且它和本文这个包注册了同一个全局命令,装错会在 bin 上冲突。过去 30 天,scoped 包下载 41,189 次,unscoped 包 1,894 次,多打一个 scope 是整个安装流程里最便宜也最关键的一步。
最小下一步:在临时 HOME 下执行 npm i -g @deepseek-ai/dsh @deepseek-harness-tui/dsh-tui@0.12.0,然后 dsh-tui --version 确认启动器与 profile 都解析到 0.12.0,再进入正式环境。卸载时记得它没有卸载钩子:profile 目录、~/.dsh-tui 偏好、共享会话存储和 OAuth 凭据都会留下,彻底清理要靠 dsh 的 profile 移除或手动删除。
参考:https://github.com/ccch1mneyyy/dsh-TUI/tree/v0.12.0 ;https://www.npmjs.com/package/@deepseek-harness-tui/dsh-tui