dsh-client-ui-tweaks:长会话里的编辑重发、侧栏合并与自动标题

前言

在 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 同一工作线。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye