前言¶
在 DSH Desktop 里跑长会话时,常见做法是改问法后新开一条会话,或在侧栏里堆出大量 fork 分支,标题还常常是工作区目录名。DeepSeek Harness 的插件体系允许把这类交互补在客户端侧;dsh-client-ui-tweaks 是社区维护的客户端插件,面向「同一条工作线多次改问」「侧栏一行代表一个分支族」「会话标题随内容更新」这几类日常整理成本,且不改写已有对话内容。
下面介绍它做什么、如何安装,以及几条与 README 一致的可复现用法。
这是什么¶
dsh-client-ui-tweaks(GitHub:ProgrammerAsahi/dsh-client-ui-tweaks,维护者 ProgrammerAsahi)是 DSH Desktop 的社区 UI 插件,分类为客户端。当前 package 版本为 0.3.0,MIT 许可证。
它通过 Cordis 注入 web 配置,在浏览器端改 DOM、在宿主侧提供少量 HTTP 路由;行为固定,没有插件级配置项。适用前提是你在用 DSH Desktop 的 web profile,并愿意以 link: 本地包方式注册依赖。
核心功能¶
编辑并重发(fork 分支)¶
每条已持久化的用户消息旁会出现铅笔按钮(在复制按钮旁)。点击后在原位打开内联编辑器,内容预填;Enter 发送,Esc 或红色按钮取消,编辑过程中无其它副作用。
发送时在 fork 语义下切分支:分支锚定在「被编辑消息所在轮次的前一个 turn/end」,编辑后的草稿成为该分支的第一条新消息。若编辑的是会话的第一条消息(没有上一轮),则走全新空白会话而非 fork。
fork 会继承排队中的下一轮消息并可能重复作答;插件通过 POST /edit-resend-inbox 读取继承的消息 id,并在子会话打开前用 updateQueue 移除。被编辑消息下方有 ‹ n/N › 箭头,可在原版与各分支版本间切换;对同一条消息的多次编辑会合并进同一根分支族。
侧栏分支族合并¶
侧栏按「分支族」显示:每个族只占一行。可见行优先级为:当前成员 > 运行中 > 刚完成 > 最近更新。分支会话共用父级标题(重命名会写入并固定 session/title),与顶栏保持一致。
打开某族会话时默认进入最近更新的成员;用箭头切换版本时不会触发这类重定向。行与 session id 的映射优先走 React fiber 读到 SessionNodeItem 的 props.node.id;不可用时回退到(标题、时间标签)配对。链式 fork 按根合并,孤立的隐藏行会自动恢复。
若你需要在同一消息下并排对比多个分支,这个插件不适合:它刻意把每个族折叠成一行。
自动摘要标题¶
首条消息标题:最多等待 12 秒采用 DSH 内置生成器的结果(使用会话模型);若内置路径静默失败,则用插件从首条用户消息生成,以保证标题与后续效果触发。
生成顺序:先读会话日志里的会话对话模型;再三级回退 K3 → MiMo flash → DeepSeek flash。所用层级记录在 autotitle.json。提示词侧做了 JSON 框定与「数据而非指令」声明;若生成结果像散文(句读、破折号或超过 45 字符)会被拒绝。
/compact 后的重命名仅由插件处理(DSH 无内置 compact 档):从会话日志中的 compaction 摘要重新生成标题。用户手动改过的标题(session/title 且 source.kind:"user")、已由 edit-resend 统一标题的分支族、以及在触发窗口外已稳定的标题,插件不会覆盖。
像素 shimmer 标题动效¶
标题落定后,侧栏该行播放像素 shimmer:透明像素网格纹理(2px 块、2px 间距,与 StateDot 颗粒一致)、深蓝光带自右向左扫过(像素阶跃硬边、软肩与核心线)、标题下方约 4px 波形隆起后回落,再淡出。颜色跟随当前 StateDot 强调色;canvas 在标题文字下方,用 setTimeout 链驱动,隐藏窗口时也会播放。
安装与启用¶
插件是纯 ESM 包,无需构建。README 在 macOS 上验证的路径为:DSH Desktop 与本地 web profile 共用 ~/.dsh。
1、将源码放到本地目录(README 给出的方式):
git clone https://github.com/ProgrammerAsahi/dsh-client-ui-tweaks.git ~/dsh-plugins/dsh-client-ui-tweaks
2、在 web profile 的 ~/.dsh/profiles/web/package.json 里注册 link: 依赖(路径换成你的用户名):
{
"dependencies": {
"dsh-client-ui-tweaks": "link:/Users/<you>/dsh-plugins/dsh-client-ui-tweaks"
}
}
3、把 "dsh-client-ui-tweaks" 加入该 profile 的 dsh.profile.bundles 列表,重启 DSH Desktop;包内 cordis.patch.yml 会插入插件注册。
卸载时:去掉上述两处注册、删除 node_modules 中的 symlink,并删除源码目录。
推荐(非插件配置):在机器级 ~/.dsh/cordis.patch.yml 把内置标题生成器的 maxOutputTokens 从 64 提到 4096,否则思考型模型容易耗尽预算并静默失败;说明见仓库 docs/pitfalls.md。
宿主侧扫描长会话日志依赖系统上的 zstd CLI。
典型用法¶
改问法并保留历史版本
1、在长会话里找到要改的用户消息,点铅笔,在内联框里改文案后 Enter。
2、在消息下方的 ‹ n/N › 间切换原版与各 fork,对比不同问法下的后续对话。
3、侧栏仍是一行代表这一「工作线」,状态点仍反映 DSH 原生 StateDot。
compact 后刷新标题
在会话里执行 /compact 后,插件会从 compaction 摘要重新生成标题;若标题刚生成,侧栏行会播放 shimmer。
与内置标题生成器配合
首条消息发送后,插件先等内置生成器最多 12 秒;未 settled 则走插件回退链,并在 autotitle.json 留下记录,便于区分插件写入与用户 pinned 的标题。
适用场景与注意¶
适合
- 长会话里反复换问法,不想每次从零开新会话。
- 侧栏 fork 过多,希望一行对应一条工作线而非每个分支一行。
- 希望首条消息与
/compact之后都有内容向摘要标题,并接受标题落定时的侧栏动效。
不适合
- 需要在 UI 上并排查看同一消息的多个分支。
安全与权限
插件随当前 DSH 进程权限运行,会读写 profile 下的会话日志并注入客户端脚本。安装前请自行审阅 GitHub 源码 与 MIT 许可证,确认符合你的环境策略。社区插件目录 SkillHub 条目 与 DeepSeek / 幻方无官方从属关系,并非官方应用商店。
已知限制以仓库 README 的「Known Limitations and Deferred Work」为准;实现细节(fork 锚点、队列清理、标题仅以 session/title 事件为准等)见 README「Understand the implementation」折叠段。
结尾¶
dsh-client-ui-tweaks 把 edit-resend 与 ‹ n/N › 版本切换、侧栏分支族单行合并、分支统一标题、首条与 /compact 自动摘要标题,以及标题落定时的像素 shimmer,收进一个无构建步骤的本地 link: 包;不改写已有对话正文,适合长期 triage 同一工作线。