Skip to content

Releases: mutoharohfiqhiabcd-source/dsh-updater

dsh 自动更新 v1.0.5

Choose a tag to compare

@github-actions github-actions released this 27 Oct 15:15

v1.0.5 发布说明 —— 修复「等待关闭 DSH 超时 → 无法继续更新」

本文件是「最新一版」的更新说明,发布新版本前请改成当版内容。
GitHub Actions 在推送 v* tag 时会把这个文件的内容作为 Release 说明(body_path)。

🔗 相关链接

名称 链接
本仓库(桌面版 + DSH 插件本体) https://github.com/mutoharohfiqabcd-source/dsh-updater
npm 包页 https://www.npmjs.com/package/dsh-updater-plugin
DSH 官方仓库(插件宿主) https://github.com/deepseek-ai/deepseek-harness
最新 Release 下载 https://github.com/mutoharohfiqabcd-source/dsh-updater/releases/latest
功能介绍推文 https://x.com/0ncv2l/status/2106351434749161735

安装(二选一,装完重启 DSH):

:: 从 npm 安装 / 升级
dsh plugin --profile web add dsh-updater-plugin

:: 或从 GitHub 安装(安装地址一直没变)
dsh plugin --profile web add github:mutoharohfiqabcd-source/dsh-updater

🐛 本版修复

1. 自动关闭 DSH 找不到进程(导致「等待关闭 DSH 超时」)

现象:点更新并勾了「自动关闭 DSH」,结果看护进程一直等不到 DSH 关闭,
30 分钟后报「等待关闭 DSH 超时,这次更新已放弃」。

根因:核心是以 python -X utf8 启动的,而 processes_on_port 用
subprocess.run(["netstat", "-ano"], text=True) 读进程列表;中文 Windows 的
netstat 输出是 GBK,UTF-8 解码在 Python 的 reader 线程里抛
UnicodeDecodeError,函数吞掉异常后返回空列表 → 看护进程以为「DSH 没在运行」,
于是不会执行自动关闭,只能干等到超时。

修复:控制台命令一律先收字节、再按控制台代码页解码(Windows 优先
mbcs,即 cp936),netstat / tasklist / taskkill 不再解码失败;pnpm 实时日志
也改成跟随系统代码页,避免中文输出乱码。

2. 超时后红条常驻、界面像「再也不能更新」

现象:超时后更新器里一直挂着「等待关闭 DSH 超时,这次更新已放弃」,而且所有
行都是「未检测」、没有「更新」按钮。

修复:

  • expired / canceled 的旧任务不再返回给界面(顺手清掉清单),红条消失;
  • 官方版本查询失败时,用缓存里的 tags / versions 兜底算出参照版本,行状态
    不再全是「未检测」;
  • 客户端:unknown 状态(且上游查询已结束)也会显示「更新」按钮——
    网络再差也有更新入口,不会被锁死。

3. 顺带保留 v1.0.4 的改动

下载总时长上限仍是 10 小时(慢网络可以挂着慢慢下,随时可取消)。

🛠️ 技术细节

  • updater_core.py:新增 _decode_console_output() / _run_console();
    processes_on_port / close_dsh / running_node_count 全部改走字节+代码页解码;
    _run_pnpm_step 的编码跟随 locale.getpreferredencoding();
    新增 _best_known_ref(),detect_all 在官方版本抓取失败时用缓存清单兜底;
    pending_update_status 隐藏 expired/canceled 并清理清单
  • lib/client.js:DetectRows 允许 unknown 状态(上游查询结束后)显示更新按钮
  • 测试 188 → 195(GBK netstat/tasklist/taskkill 回归、自动关 DSH 找到进程、
    缓存兜底参照、过期/取消状态隐藏)

📦 本版资产

文件 说明
DeepSeekHarnessUpdater.exe Windows 独立版桌面工具(无需 Python)。版本号同步 1.0.5
dsh-updater-src-v1.0.5.zip Python 源码版:解压后双击 启动更新器.bat,或运行 python updater_gui.pyw(需 Python 3.10+,含 tkinter);同时附带 DSH 插件文件
SHA256.txt EXE 的 SHA256 校验值

网页版插件不在这些资产里:从 npm(dsh-updater-plugin)或本仓库直接安装即可。

⚠️ 注意

  • 网页插件升级仍需「卸载 → 重新安装」并重启 DSH(Host 半边不会热替换)
  • 更新下载需要能访问 GitHub;网络差时现在可以挂着慢慢下,也可以取消
  • 自动关闭模式会让当前 DSH 会话短暂断开(会话记录不受影响),重启后页面自动刷新
  • 桌面更新器 / Python 源码版 / DSH 插件三条线版本号统一为 1.0.5

dsh 自动更新 v1.0.4

Choose a tag to compare

@github-actions github-actions released this 24 Oct 01:58

v1.0.4 发布说明 —— 慢网络也能更完:下载上限放宽到 10 小时

本文件是「最新一版」的更新说明,发布新版本前请改成当版内容。
GitHub Actions 在推送 v* tag 时会把这个文件的内容作为 Release 说明(body_path)。

v1.0.3 把下载改成了后台任务并加了进度条;v1.0.4 根据实际网络情况,
把下载总时长上限从 15 分钟放宽到 10 小时,慢网也能挂着下完。

🔗 相关链接

名称 链接
本仓库(桌面版 + DSH 插件本体) https://github.com/mutoharohfiqabcd-source/dsh-updater
npm 包页 https://www.npmjs.com/package/dsh-updater-plugin
DSH 官方仓库(插件宿主) https://github.com/deepseek-ai/deepseek-harness
最新 Release 下载 https://github.com/mutoharohfiqabcd-source/dsh-updater/releases/latest
功能介绍推文 https://x.com/0ncv2l/status/2106351434749161735

安装(二选一,装完重启 DSH):

:: 从 npm 安装 / 升级
dsh plugin --profile web add dsh-updater-plugin

:: 或从 GitHub 安装(安装地址一直没变)
dsh plugin --profile web add github:mutoharohfiqabcd-source/dsh-updater

⚡ 本版变化

1. 下载总时长上限:15 分钟 → 10 小时

实测在很差的网络下,GitHub 官方 zip(约 43 MB)只有 14 KB/s,15 分钟连 1/3 都下不完,
直接被判「下载超时」太不友好。现在允许下载慢慢磨 10 小时:

  • 后台 worker 不会因为时间被掐断;
  • 对话框里的进度条一直显示百分比 / 已下载 / 速度 / 剩余时间;
  • 不想等了随时点「取消更新」,立刻结束下载并清理暂存。

断网/连不上的情况仍会按正常网络错误快速失败(连接超时、TLS 错误等),
不会无意义地空等 10 小时。

2. 顺带修掉「DSH 重启后页面偶尔不自动刷新」

v1.0.3 的自动刷新逻辑要求先观察到「DSH 断开」再观察到「恢复」才刷新;
如果进度轮询晚到、页面晚打开,可能永远观察不到断开事件,页面就停在等待状态。
现在 12 秒内没观察到断开也会刷新一次(DSH 已重启完成时正好用上)。

🛠️ 技术细节

  • updater_core.py:_UPDATE_STAGE_DOWNLOAD_TIMEOUT 900 → 36000 秒;
    download_file(max_total=...) 逻辑不变,只是上限放宽
  • index.js:非运行中目标的同步更新路由超时同步放宽到 10 小时;
    正在运行的目标仍走后台 worker(无请求超时)
  • lib/client.js:waiting-restart 轮询增加 12 秒兜底刷新
  • 测试 187 → 188(断言下载上限 = 36000 秒)

📦 本版资产

文件 说明
DeepSeekHarnessUpdater.exe Windows 独立版桌面工具(无需 Python)。功能与 v1.0.3 一致,版本号同步 1.0.4
dsh-updater-src-v1.0.4.zip Python 源码版:解压后双击 启动更新器.bat,或运行 python updater_gui.pyw(需 Python 3.10+,含 tkinter);同时附带 DSH 插件文件
SHA256.txt EXE 的 SHA256 校验值

网页版插件不在这些资产里:从 npm(dsh-updater-plugin)或本仓库直接安装即可。

⚠️ 注意

  • 网页插件升级仍需「卸载 → 重新安装」并重启 DSH(Host 半边不会热替换)
  • 更新下载需要能访问 GitHub;网络差时现在可以挂着慢慢下,也可以取消
  • 自动关闭模式会让当前 DSH 会话短暂断开(会话记录不受影响),重启后页面自动刷新
  • 桌面更新器 / Python 源码版 / DSH 插件三条线版本号统一为 1.0.4

dsh 自动更新 v1.0.3

Choose a tag to compare

@github-actions github-actions released this 22 Oct 12:57

v1.0.3 发布说明 —— 更新进度条 + 后台下载(不再卡 20 分钟超时)

本文件是「最新一版」的更新说明,发布新版本前请改成当版内容。
GitHub Actions 在推送 v* tag 时会把这个文件的内容作为 Release 说明(body_path)。

v1.0.2 把桌面更新器的流程搬进了插件;v1.0.3 修掉它最难受的两个体验问题:
看不到进度、下载慢时会一直卡到超时。

🔗 相关链接

名称 链接
本仓库(桌面版 + DSH 插件本体) https://github.com/mutoharohfiqabcd-source/dsh-updater
npm 包页 https://www.npmjs.com/package/dsh-updater-plugin
DSH 官方仓库(插件宿主) https://github.com/deepseek-ai/deepseek-harness
最新 Release 下载 https://github.com/mutoharohfiqabcd-source/dsh-updater/releases/latest
功能介绍推文 https://x.com/0ncv2l/status/2106351434749161735

安装(二选一,装完重启 DSH):

:: 从 npm 安装 / 升级
dsh plugin --profile web add dsh-updater-plugin

:: 或从 GitHub 安装(安装地址一直没变)
dsh plugin --profile web add github:mutoharohfiqabcd-source/dsh-updater

⚡ 本版变化

1. 下载/解压改成后台 worker —— 不再阻塞请求

之前:点「开始更新」后插件同步跑 Python 下载,网络慢就会一直卡在请求里,
最长 20 分钟超时(超时后下载进程还可能挂在后台)。

现在:POST /update-source 立刻返回,真正的下载/解压交给脱离 DSH 的后台 worker
(python updater_core.py --json stage-source ...),界面轮询 /update-progress
拿进度。HTTP 请求不会再超时。

2. 对话框里有实时进度条

进度来自 updater_core.py 写出的 %APPDATA%\dsh-updater\update-progress.json:

正在下载官方源码… 37% · 12.3 MB / 33.1 MB · 1.2 MB/s · 18s
[██████████░░░░░░░░░░░░░░░░]
下载期间可以取消;暂存完成后看护进程会自动关闭 DSH 并更新

覆盖:准备 → 下载 → 解压 → 暂存,每一步都有百分比、速度、剩余时间。

3. 下载期间可以「取消更新」

点对话框里的「取消更新」会结束后台 worker、清掉暂存目录、把进度标记为已取消。

4. 真的卡死会明确报错,而不是无限等

单次下载总时长上限 15 分钟:超过就报「下载超时(网络太慢)」,不会无声无息挂着。

5. 后续流程不变(仍是 v1.0.2 那套)

暂存完成后:按勾选自动关闭 DSH → 备份旧目录 → 换入新源码 → 按需
pnpm install / pnpm run build → 自动重启 DSH → 页面轮询到 DSH 恢复后自动刷新。
不勾自动关闭时仍是「提示你关 DSH → 关后自动应用 → 自动重启」。

🛠️ 技术细节

  • updater_core.py:download_file / _extract_zip_with_progress 新增 detail_cb
    (结构化进度)与 max_total(总时长上限);新增 update-progress.json 读写、
    --json update-progress 动作;cancel-staged 在还没有 manifest 时也能取消下载
  • index.js:/update-source 对「正在运行的 DSH」改为 detached 后台 worker;
    新增 GET /update-progress(直接读文件,不启动 Python);进度文件路径与
    updater_core.py 的 _settings_dir() 保持一致(支持 DSH_UPDATER_SETTINGS_DIR)
  • lib/client.js:新增进度条组件与轮询;下载中可取消;「先断后连」逻辑确保
    DSH 重启完成后才刷新页面(不会刚断开就误刷新)
  • 测试 183 → 187(staged/failed 进度落盘、下载中取消杀 worker、进度 CLI)

📦 本版资产

文件 说明
DeepSeekHarnessUpdater.exe Windows 独立版桌面工具(无需 Python)。功能与 v1.0.2 一致,版本号同步 1.0.3
dsh-updater-src-v1.0.3.zip Python 源码版:解压后双击 启动更新器.bat,或运行 python updater_gui.pyw(需 Python 3.10+,含 tkinter);同时附带 DSH 插件文件
SHA256.txt EXE 的 SHA256 校验值

网页版插件不在这些资产里:从 npm(dsh-updater-plugin)或本仓库直接安装即可。

⚠️ 注意

  • 网页插件升级仍需「卸载 → 重新安装」并重启 DSH(Host 半边不会热替换)
  • 更新下载需要能访问 GitHub;网络不好时会走得慢,但现在能看到进度、也能取消
  • 自动关闭模式会让当前 DSH 会话短暂断开(会话记录不受影响),重启后页面自动刷新
  • 桌面更新器 / Python 源码版 / DSH 插件三条线版本号统一为 1.0.3

dsh 自动更新 v1.0.2

Choose a tag to compare

@github-actions github-actions released this 22 Oct 11:57

v1.0.2 发布说明 —— 插件内更新对话框:复刻桌面更新器的完整体验

本文件是「最新一版」的更新说明,发布新版本前请改成当版内容。
GitHub Actions 在推送 v* tag 时会把这个文件的内容作为 Release 说明(body_path)。

v1.0.1 把「更新」按钮改成弹桌面 EXE;v1.0.2 再往前走一步:插件自己把桌面更新器的
流程复刻出来
——不用离开 DSH,就能完成「下载 → 关 DSH → 替换 → 构建 → 重启 DSH」。

🔗 相关链接

名称 链接
本仓库(桌面版 + DSH 插件本体) https://github.com/mutoharohfiqabcd-source/dsh-updater
npm 包页 https://www.npmjs.com/package/dsh-updater-plugin
DSH 官方仓库(插件宿主) https://github.com/deepseek-ai/deepseek-harness
最新 Release 下载 https://github.com/mutoharohfiqabcd-source/dsh-updater/releases/latest
功能介绍推文 https://x.com/0ncv2l/status/2106351434749161735

安装(二选一,装完重启 DSH):

:: 从 npm 安装 / 升级
dsh plugin --profile web add dsh-updater-plugin

:: 或从 GitHub 安装(安装地址一直没变)
dsh plugin --profile web add github:mutoharohfiqabcd-source/dsh-updater

⚡ 本版变化

1. 点「更新」→ 插件内更新对话框(不再直接弹 EXE)

对话框里和桌面版一样有:

项目 说明
目标目录 要更新的源码检出(运行时 profile 会指向同一个检出)
版本 当前版本 → 官方最新版本
✅ 更新时自动关闭 DSH 看护进程会自动结束 DSH(只结束占用端口的 PID),完成后自动重启
☐ 替换后运行 pnpm install 依赖有变化时建议勾选
☐ 替换后运行 pnpm run build 用源码版启动 DSH 时必需
按钮 开始更新 / 关闭 / 改用桌面更新器(仍然可以启动 EXE)

2. 勾「自动关闭 DSH」后的完整流程(复刻桌面版)

  1. 插件下载官方源码到暂存目录(页面显示提示,可能要几分钟);
  2. 后台看护进程(脱离 DSH 独立存活)等 3 秒后自动关闭 DSH;
  3. 备份旧目录 → 换入新源码 → 搬回 node_modules / .git → 按需 pnpm install / pnpm run build;
  4. 用原来的启动参数自动重新启动 DSH;
  5. 页面轮询到 DSH 重新监听端口后自动刷新,看到的就是新版本。

仍保留手动模式:不勾「自动关闭 DSH」时,流程变成「提示你关 DSH → 关闭后自动应用 → 自动重启」。

3. 安全细节

  • 自动关闭只对占用端口的 PID 发 SIGTERM,不用 taskkill /T——看护进程是 DSH 的
    子进程,/T 会把它自己一起杀掉,导致更新卡死;
  • 旧目录整目录备份,构建失败自动回滚到旧版本再重启 DSH(不会「DSH 被弄没」);
  • 目录被别的实例占用时保留暂存更新,界面提供「重试应用」,不用重新下载;
  • 暂存后、关闭 DSH 前仍可「取消更新」。

📦 本版资产

文件 说明
DeepSeekHarnessUpdater.exe Windows 独立版桌面工具(无需 Python)。功能与 v1.0.1 一致,版本号同步 1.0.2
dsh-updater-src-v1.0.2.zip Python 源码版:解压后双击 启动更新器.bat,或运行 python updater_gui.pyw(需 Python 3.10+,含 tkinter);同时附带 DSH 插件文件
SHA256.txt EXE 的 SHA256 校验值

网页版插件不在这些资产里:从 npm(dsh-updater-plugin)或本仓库直接安装即可。

⚠️ 注意

  • 网页插件升级仍需「卸载 → 重新安装」并重启 DSH(Host 半边不会热替换)
  • 自动关闭模式会让当前 DSH 会话短暂断开(会话记录不受影响),重启后页面自动刷新
  • 同一目录启动了多个 DSH 实例时,建议先把它们都关掉再点更新(否则会进入「重试应用」)
  • 更新期间需要能访问 GitHub(下载官方源码);网络不好时下载会慢或失败,可稍后重试
  • 桌面更新器 / Python 源码版 / DSH 插件三条线版本号统一为 1.0.2

dsh 自动更新 v1.0.1

Choose a tag to compare

@github-actions github-actions released this 22 Oct 11:39

v1.0.1 发布说明 —— 「更新」按钮直接弹出桌面更新器窗口

本文件是「最新一版」的更新说明,发布新版本前请改成当版内容。
GitHub Actions 在推送 v* tag 时会把这个文件的内容作为 Release 说明(body_path)。

v1.0.0 是首个「完善版」;v1.0.1 修掉插件「更新」入口的几个问题,让更新 DSH 本体
回到桌面版那套成熟流程上。

🔗 相关链接

名称 链接
本仓库(桌面版 + DSH 插件本体) https://github.com/mutoharohfiqabcd-source/dsh-updater
npm 包页 https://www.npmjs.com/package/dsh-updater-plugin
DSH 官方仓库(插件宿主) https://github.com/deepseek-ai/deepseek-harness
最新 Release 下载 https://github.com/mutoharohfiqabcd-source/dsh-updater/releases/latest
功能介绍推文 https://x.com/0ncv2l/status/2106351434749161735

安装(二选一,装完重启 DSH):

:: 从 npm 安装 / 升级
dsh plugin --profile web add dsh-updater-plugin

:: 或从 GitHub 安装(安装地址一直没变)
dsh plugin --profile web add github:mutoharohfiqabcd-source/dsh-updater

⚡ 本版变化

1. 「检测」按钮改名「更新器」

标题栏三个按钮现在是「更新器 / 回滚 / 版本」,面板标题简化为「DSH 自动更新器」。
检测本来就是为了更新,不必再分开叫。

2. 「更新」按钮 → 直接弹出桌面更新器窗口

之前(v1.0.0) 现在(v1.0.1)
点「更新」后 插件自己下载暂存,提示你关 DSH,再靠看护进程替换 直接弹出桌面更新器窗口(EXE)
更新流程 插件内两段式:暂存 → 关 DSH → 替换+构建+重启 桌面版完整流程:检测 DSH 在跑 → 询问后自动关闭 DSH → 备份旧目录 → 下载官方源码 → 整目录替换(可选 pnpm install / pnpm run build)
适合谁 习惯「插件自己搞定」的人 想直接更新 DSH 本体、且复用桌面版成熟流程的人

插件里找不到本地更新器 EXE 时,会自动回退到原来的插件内更新流程,不会点了没反应。

3. 更新器 EXE 永远挑最新的

profile 里配置的 updaterPath 可能指向很旧的构建(本机配置还指着一个 0.8.0 的 dist)。
现在会把「配置路径 + searchDirs」里的 EXE 全部找出来,按修改时间取最新的
(文件名带 updater / dsh 优先),不会再弹出旧版本。

4. 修复「点了更新报 log is not defined」

上一版(未发布到 npm 的开发提交)里接口返回 502、面板红字报错,但 EXE 其实已经启动。
v1.0.1 修好,现在正常返回 200,窗口弹出、提示正常显示。

📦 本版资产

文件 说明
DeepSeekHarnessUpdater.exe Windows 独立版桌面工具(无需 Python)。本版内容与 v1.0.0 功能一致,版本号同步为 1.0.1
dsh-updater-src-v1.0.1.zip Python 源码版:解压后双击 启动更新器.bat,或运行 python updater_gui.pyw(需 Python 3.10+,含 tkinter);同时附带 DSH 插件文件
SHA256.txt EXE 的 SHA256 校验值

网页版插件不在这些资产里:从 npm(dsh-updater-plugin)或本仓库直接安装即可。

⚠️ 注意

  • 网页插件升级仍需「卸载 → 重新安装」并重启 DSH(DSH 插件页不支持自动更新;
    Host 半边不会热替换,不重启会出现旧按钮 404 / 旧路径报错)
  • 插件点「更新」弹出的桌面更新器会先关掉当前 DSH(有确认框),更新完重新打开 DSH 即可;
    会话记录不受影响
  • 同一目录启动了多个 DSH 实例时,桌面更新器更新前需要把它们全部关闭
  • 桌面更新器 / Python 源码版 / DSH 插件三条线版本号统一为 1.0.1

dsh 自动更新 v1.0.0

Choose a tag to compare

@github-actions github-actions released this 22 Oct 10:22

v1.0.0 发布说明 —— 首个完善版:在 DSH 插件里直接更新 DSH

⭐ v1.0.0 是本项目第一个「完善版」:桌面 EXE、Python 源码版、DSH 插件三条线功能齐全、
行为一致;检测、回滚、插件内更新 DSH 全部可用,npm / GitHub 两种安装方式均已端到端验证。

本文件是「最新一版」的更新说明,发布新版本前请改成当版内容。
GitHub Actions 在推送 v* tag 时会把这个文件的内容作为 Release 说明(body_path)。

🔗 相关链接

名称 链接
本仓库(桌面版 + DSH 插件本体) https://github.com/mutoharohfiqhiabcd-source/dsh-updater
npm 包页 https://www.npmjs.com/package/dsh-updater-plugin
DSH 官方仓库(插件宿主) https://github.com/deepseek-ai/deepseek-harness
最新 Release 下载 https://github.com/mutoharohfiqhiabcd-source/dsh-updater/releases/latest
功能介绍推文 https://x.com/0ncv2l/status/2106351434749161735

安装(二选一,装完重启 DSH):

:: 从 npm 安装
dsh plugin --profile web add dsh-updater-plugin

:: 或从 GitHub 安装(安装地址一直没变)
dsh plugin --profile web add github:mutoharohfiqhiabcd-source/dsh-updater

⚡ 本版新功能:在插件里点一下就能更新 DSH

「检测」面板里,可更新的源码检出那一行会多出一个「更新」按钮:

  1. 点两下确认(第一次变「确认更新?」,第二次才执行);
  2. 插件自动下载官方源码并暂存(此时不碰正在运行的 DSH 目录);
  3. 完成后提示你关闭 DSH(同一目录开了多个实例就都关掉);
  4. 后台看护进程在 DSH 关闭后自动完成:整目录替换 → 按需 pnpm install →
    按需 pnpm run build → 自动重新启动 DSH(约 2~5 分钟);
  5. 刷新页面,版本已经更新。

下载、替换、构建、重启的全过程都有日志(界面里会显示日志路径),
什么时候该关、关掉之后在干什么,都不用猜。

🧠 为什么不能「点完立刻在线替换」

Windows 不允许对一个正被其他进程当作工作目录的目录改名(实测 Move-Item
直接报「文件正被另一进程使用」)。而 DSH 的源码检出正是它自己的运行目录,
所以只能拆成两段:

阶段 时机 做什么
① 暂存 DSH 运行中(安全) 下载官方源码 → 解压到目标同级暂存目录 → 写清单、启动看护进程
② 应用 DSH 关闭后(看护进程) 旧目录改名为备份 → 暂存目录换到位 → 恢复 node_modules/.git → 按需 install/build → 重启 DSH

这样替换那一刻磁盘上的文件不会被任何进程占用,也才能保证「构建失败还能回到旧版本」。

🔒 安全设计(都是自动的)

  • 旧目录整目录备份:替换前改名成 *.dsh-bak-时间戳,更新失败自动回滚;
  • 构建失败自动回滚:pnpm run build 失败会把旧目录换回来,保证重启后一定能用;
  • 目录被占用不判死刑:如果关闭 DSH 后目录仍被别的实例占用,暂存更新会保留,
    界面提示「重试应用」——关掉占用进程再点一次即可,不用重新下载;
  • 可取消:暂存后、关闭 DSH 前可随时「取消更新」(会结束看护进程并清理暂存目录);
  • 换错目标不会乱动手:应用前重新校验目标仍是 DSH 源码检出、版本与清单一致;
  • 只处理源码检出;npm 全局安装不在本功能范围。
    运行时 profile 如果其 @deepseek-ai/dsh 是指向源码检出的 junction(本机就是),
    那一行也会有「更新」按钮
    ——它更新的就是这个源码检出,更新并重启后,
    所有使用该运行时的 profile 都会变成新版本。

📋 使用步骤

步骤 你会看到
1. 检测 → 点「更新」→ 再点「确认更新?」 行尾变成「下载中…(可能要几分钟)」
2. 下载完成 面板顶部出现「更新包已就绪:旧版本 → 新版本」+ 关闭提示
3. 关闭 DSH(所有从该目录启动的实例) ——(DSH 已退出,看护进程接手)
4. 等待 2~5 分钟 DSH 会自动重新启动
5. 刷新 DSH 页面 → 再点「检测」 版本已是最新,顶部显示「上次更新完成」

如果更新失败,DSH 也会被重新启动(旧版本),页面里会显示失败原因与日志路径,
旧版本备份还在,可以用「回滚」按钮退回去。

🛠️ 本版改动(技术细节)

  • updater_core.py:新增 5 个 --json 动作 —— stage-source / update-source /
    update-status / cancel-staged / resume-staged;暂存、清单、看护进程、
    替换/回滚、自动重启都在核心层实现,桌面 GUI 行为不变;
  • 看护进程用 DETACHED_PROCESS + pythonw 启动(DSH 退出不会带走它),
    轮询端口确认 DSH 已关闭后才动手;完成后用原来的 argv / 工作目录重新拉起 DSH;
  • index.js:新增 /update-source、/update-status、/cancel-update、
    /resume-update 四个路由;自动识别「目标目录就是当前运行 DSH 的根目录」——
    是则走暂存流程,否则直接更新;
  • lib/client.js:检测面板新增「更新」按钮(两次确认)与待应用更新横幅
    (就绪 / 应用中 / 完成 / 失败 / 超时 / 取消,含取消与重试按钮),中英文案;
  • 「更新」按钮不只出现在源码检出行:运行时 profile 的 @deepseek-ai/dsh 若是指向
    源码检出的 junction,对应的 desktop / headless / web 行也会出现按钮
    (点哪行都是
    更新同一个源码检出,检测结果里带 update_target 字段);
  • 测试 155 → 179(新增 24 条:暂存不碰目标目录、应用并保留 node_modules、
    构建失败回滚、目录被占用保留暂存可重试、取消/重试、看护脚本语法、
    junction 运行时解析、update_target 语义等)。

⚙️ 说明

  • 需要本机 Python 3.10+(插件本来就用它做检测/回滚;没有 Python 时更新按钮不可用);
  • pnpm install 只在 pnpm-lock.yaml 变化时执行;
    pnpm run build 只在目标目录本来就有 apps/cli/lib(说明你用构建产物启动 DSH)时执行;
  • 首次构建可能比较慢,请耐心等看护进程日志里的「已重新启动 DSH」。

📦 本版资产

文件 说明
DeepSeekHarnessUpdater.exe Windows 独立版桌面工具(无需 Python)。含 v0.8.1 的检测提速
dsh-updater-src-v1.0.0.zip Python 源码版:解压后双击 启动更新器.bat,或运行 python updater_gui.pyw(需 Python 3.10+,含 tkinter);同时附带 DSH 插件文件
SHA256.txt EXE 的 SHA256 校验值

网页版插件不在这些资产里:从 npm(dsh-updater-plugin)或本仓库直接安装即可。

⚠️ 已知限制

  • 在线更新针对源码检出(以及 junction 指向源码检出的运行时 profile);
    纯 npm 安装的运行时 / npm 全局请用桌面版或手动处理
  • 同一目录启动了多个 DSH 实例时,更新前需要把它们全部关闭
  • 网页插件升级仍需「卸载 → 重新安装」并重启 DSH(DSH 插件页不支持自动更新)
  • 断网时只显示本地结果,官方版本一栏会提示查询失败
  • 回滚窗口最旧的一个备份若读不出 package.json 的版本,会显示「回到 备份版本」
  • 「使用 GPU 加速」目前仅记录偏好:DSH 尚未提供 GPU 加速选项

dsh 自动更新 v0.9.0

Choose a tag to compare

@github-actions github-actions released this 18 Oct 13:21

v0.9.0 发布说明 —— 上架 npm + 插件包名迁移(安装地址不变)

本文件是「最新一版」的更新说明,发布新版本前请改成当版内容。
GitHub Actions 在推送 v* tag 时会把这个文件的内容作为 Release 说明(body_path)。

🔗 相关链接

名称 链接
本仓库(桌面版 + DSH 插件本体) https://github.com/mutoharohfiqhiabcd-source/dsh-updater
npm 包页(v0.9.0 起) https://www.npmjs.com/package/dsh-updater-plugin
DSH 官方仓库(插件宿主) https://github.com/deepseek-ai/deepseek-harness
最新 Release 下载 https://github.com/mutoharohfiqhiabcd-source/dsh-updater/releases/latest
功能介绍推文 https://x.com/0ncv2l/status/2106351434749161735

📦 这一版:插件上了 npm,包名改成 dsh-updater-plugin

npm 上的 dsh-updater 这个名字已经被别人的同名插件占用(不是本仓库),
所以本版把包名改成 dsh-updater-plugin 并正式发布到 npm。

GitHub 安装地址完全没变(仓库名还是 dsh-updater),只是包的内部名字变了:

项目 之前 现在
GitHub 安装 spec github:mutoharohfiqhiabcd-source/dsh-updater 不变
npm 安装 spec (没有) dsh-updater-plugin
插件在 DSH 里显示的名字 dsh-updater dsh-updater-plugin
桌面 EXE / 源码版 zip 不变 不变(版本号跟着升到 0.9.0)

已经在用旧版插件的:卸载旧插件 → 按下面任一方式重装 → 重启 DSH。
(DSH 的插件升级本来就必须重启,「旧名 + 新名」也不建议同时装。)

📥 安装 / 升级

DSH 网页插件(两种方式任选)

:: 方式 A:从 npm 安装(v0.9.0 起可用)
dsh plugin --profile web add dsh-updater-plugin

:: 方式 B:从 GitHub 安装(一直可用,安装地址没变)
dsh plugin --profile web add github:mutoharohfiqhiabcd-source/dsh-updater

图形界面:DSH 侧边栏 → 插件 → 添加插件 → 填 dsh-updater-plugin
或 github:mutoharohfiqhiabcd-source/dsh-updater → 安装 → 重启 DSH。

桌面版

你用的是 怎么升
桌面 EXE 下载本页的 DeepSeekHarnessUpdater.exe 覆盖旧的
源码版 / Python 版 下载 dsh-updater-src-v0.9.0.zip 解压替换

⚠️ 插件运行在 DSH 主进程内、不受工作区沙箱限制;检测 / 回滚 / 下载 / 启动都会
真实读写磁盘。检测与回滚需要本机有 Python 3.10+,没装时界面会明确提示。

⚡ 顺带回顾:检测已经变快了(v0.8.1 起)

场景 旧版 现在
5 分钟内重复检测(命中缓存) 93.6 秒 0.52 秒
冷启动(真的联网查一次) 93.6 秒 1.7 ~ 6 秒(取决于网络)
只查本机安装(离线模式) 0.35 秒 0.43 秒

原理:多源并发赛跑(GitHub 官方源 + jsDelivr 镜像 + npm 官方源 + npmmirror 镜像 +
并发重试)、npm 元数据改走 HTTP 接口(去掉 33 秒的 npm view 子进程)、
必需项到手立即返回、结果本地缓存 5 分钟。详见 v0.8.1 的 Release 说明。

🖼️ 长这样

会话标题栏的三个按钮

回滚面板(点一次确认、再点一次才执行) 插件管理页
回滚面板 插件管理页

桌面版的样子见 README。

🔧 本版改了什么

  • package.json 包名:dsh-updater → dsh-updater-plugin(npm 发布用);
  • cordis.patch.yml 里 bundle 行引用的模块名同步改成新包名;
  • 网页客户端产物 lib/client.js 的模块注册 id 同步改新包名
    (DSH 的模块系统要求注册 id 等于包名,测试里有断言防漏改);
  • Host 半边插件名同步改新包名;
  • README / Release 说明补上 npm 安装方式;
  • 新增测试守护:bundle patch 里的模块名必须等于 package.json 的包名。

接口路由 /dsh-updater/api/*、会话标题栏的三个按钮、工具名 dsh_updater
都没有变,行为与 v0.8.1 完全一致。

⚙️ 工程改进

  • 测试 154 → 155 项(新增「包名与 bundle patch 一致性」守护);
  • CI 继续在 Ubuntu + Windows、Python 3.10 / 3.12 四组矩阵上跑冒烟测试;
  • 打包源码版 zip 时会自动带上新包名与新文档。

📦 本版资产

文件 说明
DeepSeekHarnessUpdater.exe Windows 独立版桌面工具(无需 Python)。含 v0.8.1 的检测提速
dsh-updater-src-v0.9.0.zip Python 源码版:解压后双击 启动更新器.bat,或运行 python updater_gui.pyw(需 Python 3.10+,含 tkinter);同时附带 DSH 插件文件
SHA256.txt EXE 的 SHA256 校验值

网页版插件不在这些资产里:从 npm(dsh-updater-plugin)或本仓库直接安装即可。

⚠️ 已知限制

  • 网页插件升级需要「卸载 → 重新安装」并重启 DSH(DSH 的插件页明说不支持自动更新)
  • 断网时只显示本地结果,官方版本一栏会提示查询失败
  • 回滚窗口最旧的一个备份若读不出 package.json 的版本,会显示「回到 备份版本」
  • 切换语言后若个别文字仍显示为其它语言,点一次「🔄 重新检测」刷新即可
  • 「使用 GPU 加速」目前仅记录偏好:DSH 尚未提供 GPU 加速选项

dsh 自动更新 v0.8.1

Choose a tag to compare

@github-actions github-actions released this 18 Oct 10:14

v0.8.1 发布说明 —— 检测提速:90 秒 → 半秒

本文件是「最新一版」的更新说明,发布新版本前请改成当版内容。
GitHub Actions 在推送 v* tag 时会把这个文件的内容作为 Release 说明(body_path)。

🔗 相关链接

名称 链接
本仓库(桌面版 + DSH 插件本体) https://github.com/mutoharohfiqhiabcd-source/dsh-updater
DSH 插件安装地址(填进 DSH「插件 → 添加插件」) github:mutoharohfiqhiabcd-source/dsh-updater
DSH 官方仓库(插件宿主) https://github.com/deepseek-ai/deepseek-harness
最新 Release 下载 https://github.com/mutoharohfiqhiabcd-source/dsh-updater/releases/latest
功能介绍推文 https://x.com/0ncv2l/status/2106351434749161735

一行安装(装完重启 DSH):

dsh plugin --profile web add github:mutoharohfiqhiabcd-source/dsh-updater

⚡ 这一版只干一件事:把「检测更新」从 90 秒压到半秒

之前点一次「检测」,在中国大陆的网络下经常要等 一分半 才有结果;现在:

场景 旧版 v0.8.1(实测)
5 分钟内重复检测(命中缓存) 93.6 秒 0.52 秒
冷启动(真的联网查一次) 93.6 秒 1.7 ~ 6 秒(取决于网络;网络好 1.7s,差时 5~9s)
只查本机安装(离线模式) 0.35 秒 0.43 秒

测法:真实调用正在运行的 DSH 插件接口 /dsh-updater/api/detect,并直接跑
python updater_core.py --json detect。桌面版与网页插件共用同一套检测代码,
所以两边同时变快。

🔍 为什么原来那么慢(逐项实测,不是猜)

  1. 旧实现串行发 7 个网络请求,每个超时 20~25 秒;
  2. 最拖后腿的是 npm view versions 子进程 —— 实测 32.8 秒;
  3. GitHub 的接口在国内网络下 TLS 握手会被随机卡住:同一个 URL 一次 2.6 秒成功、
    一次 25 秒超时。7 个请求串起来,最坏要等 7 次超时 —— 实测整次 93.6 秒;
  4. 其实本地扫描只要 0.32 秒,根本不是瓶颈。

🔧 怎么改的

  • 多源并发赛跑:每类数据同时发多个候选(GitHub 官方源 + jsDelivr 镜像 +
    npm 官方源 + npmmirror 镜像 + 并发重试),谁先成功用谁;单个请求 5 秒超时,
    整轮最多等 8 秒;
  • npm 元数据改用 HTTP 接口(application/vnd.npm.install-v1+json,
    一次拿回 dist-tags + 全部版本 + engines),彻底去掉 33 秒的 npm view 子进程,
    也不再要求本机装过 npm;
  • 必需项到手就收工:只要拿到「GitHub master 版本」和「任一 npm 版本通道」,
    就立即返回判断结果,不再为「最近提交 / tags 清单」这类展示细节白等 5 秒;
  • 本地缓存:%APPDATA%\dsh-updater\official-cache.json,完整结果缓存 5 分钟;
    抓取不完整时只缓存 30 秒(防止一次网络失败把之后 5 分钟都锁死在错误结果上);
  • 「更新器自身最新版本」检查也缓存 5 分钟;本机 Node 版本只查询一次;
  • 网页插件请求 GitHub Release 增加 8 秒超时(原先网络卡住时「版本」面板会一直转圈)。

诚实说明:所有源都失败时,界面会如实显示「官方版本获取失败」,
不会拿旧版本假装「已是最新」;jsDelivr 兜底最坏只会让我们晚一个版本发现更新,
不会误报「可更新」。

🖼️ 长这样

会话标题栏的三个按钮

回滚面板(点一次确认、再点一次才执行) 插件管理页
回滚面板 插件管理页

桌面版的样子见 README。

📥 怎么升级

你用的是 怎么升
桌面 EXE(旧版不会自动变快) 下载本页的 DeepSeekHarnessUpdater.exe 覆盖旧的即可
源码版 / Python 版 下载 dsh-updater-src-v0.8.1.zip 解压替换
DSH 网页插件 DSH 侧边栏 → 插件 → 卸载 → 添加插件填 github:mutoharohfiqhiabcd-source/dsh-updater → 重启 DSH

⚠️ 网页插件升级必须重启 DSH:磁盘文件换掉后,运行中的 DSH 仍持有旧的 Host 半边。

⚠️ 插件运行在 DSH 主进程内、不受工作区沙箱限制;检测 / 回滚 / 下载 / 启动都会
真实读写磁盘。检测与回滚需要本机有 Python 3.10+,没装时界面会明确提示。

⚙️ 工程改进

  • 测试 140 → 154 项,新增的 14 条全部围绕这次的提速逻辑,防它以后悄悄退化:
    • 缓存命中必须零网络直接返回(并返回副本,调用方改不坏缓存);
    • 不完整结果只缓存 30 秒;完整结果 5 分钟内有效;
    • 抓取失败时可以沿用旧的 tags / 版本清单,但 latest 版本绝不能用旧值冒充;
    • 多源请求必须真并发(3 个 0.25s 请求总耗时 < 0.6s,串行要 0.75s);
    • 必需项到齐必须立即返回,不为可选项干等超时;
    • jsDelivr 的 tags 是字典、api.github.com 的 tags 是列表,两种格式都要能解析;
    • --fresh 参数必须能强制绕过缓存(发版验证用)。
  • 网页插件仍是手写的闭包工厂产物(lib/client.js),从 GitHub 直装不会触发
    pnpm 的 allowBuilds 授权询问。

📦 本版资产

文件 说明
DeepSeekHarnessUpdater.exe Windows 独立版桌面工具(无需 Python)。本版已含检测提速
dsh-updater-src-v0.8.1.zip Python 源码版:解压后双击 启动更新器.bat,或运行 python updater_gui.pyw(需 Python 3.10+,含 tkinter);同时附带 DSH 插件文件
SHA256.txt EXE 的 SHA256 校验值

网页版插件不在这些资产里:它直接从本仓库安装(见上),不需要下载 EXE。

⚠️ 已知限制

  • 网页插件升级需要「卸载 → 重新安装」(DSH 的插件页明说不支持自动更新)
  • 断网时只显示本地结果,官方版本一栏会提示查询失败
  • 回滚窗口最旧的一个备份若读不出 package.json 的版本,会显示「回到 备份版本」
  • 切换语言后若个别文字仍显示为其它语言,点一次「🔄 重新检测」刷新即可
  • 「使用 GPU 加速」目前仅记录偏好:DSH 尚未提供 GPU 加速选项

dsh 自动更新 v0.8.0

Choose a tag to compare

@github-actions github-actions released this 03 Oct 11:34

v0.8.0 发布说明 —— 网页版插件格式(不是软件更新)

本文件是「最新一版」的更新说明,发布新版本前请改成当版内容。
GitHub Actions 在推送 v* tag 时会把这个文件的内容作为 Release 说明(body_path)。

🔗 相关链接

名称 链接
本仓库(桌面版 + DSH 插件本体) https://github.com/mutoharohfiqhiabcd-source/dsh-updater
DSH 插件安装地址(填进 DSH「插件 → 添加插件」) github:mutoharohfiqhiabcd-source/dsh-updater
DSH 官方仓库(插件宿主) https://github.com/deepseek-ai/deepseek-harness
最新 Release 下载 https://github.com/mutoharohfiqhiabcd-source/dsh-updater/releases/latest
功能介绍推文 https://x.com/0ncv2l/status/2106351434749161735

一行安装(装完重启 DSH):

dsh plugin --profile web add github:mutoharohfiqhiabcd-source/dsh-updater

🖼️ 长这样

会话标题栏的三个按钮

回滚面板(点一次确认、再点一次才执行) 插件管理页
回滚面板 插件管理页

桌面版的样子见 README。

❗ 先说清楚:这一版的主角不是软件

v0.8.0 没有对桌面程序做任何功能改动。桌面 EXE / 源码版仍在,只是跟着版本号
重建了一份,功能与 v0.7.7 完全一致。

这一版发布的是 DSH 网页版插件格式:本仓库从 v0.7.7 起同时是一个 DSH 插件包,
v0.8.0 把它补完 —— 装进 DSH 后,会话标题栏会多出「检测 / 回滚 / 版本」三个按钮。

也就是说:

用法 形态 需要下载 EXE 吗
桌面小工具(一直有) Windows 程序(EXE / Python) 需要
在 DSH 网页界面里直接用(本版新增) DSH 插件(网页版) 不需要

🧩 本版新增:会话标题栏的三个按钮

装好插件后,每个会话的标题栏(「1 个后台任务」那一排)会出现:

按钮 作用
↻ 检测 先本地秒开(0.45 秒,不发网络请求)列出本机所有 DSH 安装:源码检出 / npm 全局 / 运行时 profile,各自版本与参照版本;官方最新版本随后异步补上,查不到会明说,不会一直转圈
↩ 回滚 列出源码备份、npm 回滚点、profile 回滚点;点一次变「确认回滚?」再点一次才执行;执行前会先把当前目录也存成一份新备份,所以回滚本身可逆
ⓘ 版本 更新器自身版本、最新 Release、本机 Python、本地 EXE 与归档、各安装的版本

三个按钮不是在网页里重写逻辑,而是调用本仓库的 updater_core.py
(新增 --json 命令行模式),与桌面版共用同一套代码。

📥 怎么装这个网页版插件

图形界面:DSH 侧边栏 → 插件 → 添加插件 → 填
github:mutoharohfiqhiabcd-source/dsh-updater → 安装。

命令行:

dsh plugin --profile web add github:mutoharohfiqhiabcd-source/dsh-updater

装完重启一次 DSH 即可在每个会话标题栏看到三个按钮。

⚠️ 升级场景务必重启:磁盘上的文件换掉后,运行中的 DSH 仍持有旧的 Host 半边,
此时刷新页面按钮会出现、但一按就报 404。

⚠️ 插件运行在 DSH 主进程内、不受工作区沙箱限制;检测 / 回滚 / 下载 / 启动都会
真实读写磁盘。检测与回滚需要本机有 Python 3.10+,没装时界面会明确提示,
版本信息不受影响。

❗ 重要修复:之前的「源码版 zip」根本跑不起来

现象:下载 dsh-updater-src-v*.zip(README 里的正式安装方式之一)解压后,
双击 启动更新器.bat 或运行 python updater_gui.pyw,第一行就报错:

ModuleNotFoundError: No module named 'i18n'

原因:打包脚本 pack_source.py 的白名单只列了 7 个文件,漏掉了全部
i18n 语言模块
(i18n.py、i18n_data.py、各语言包共 12 个)。而
updater_core.py 第 29 行就是 from i18n import t,所以解压出来必然起不来。
这个坑在 v0.7.7 及更早的版本里一直存在。

修复:语言包改为按 i18n*.py 通配自动打包(以后新增语言也不会再漏),
并新增测试 test_source_zip_is_runnable —— 它会把 zip 解压到临时目录、
真的 import updater_core 跑一次,而不是只看清单。

源码版 zip 现在有 26 个文件,同时带上插件文件,解压后「桌面版」和
「DSH 网页插件」两种用法都能直接用。建议之前下过源码版的用户重新下载。

🔧 顺手修掉的另一个问题

带 BOM 的 package.json 会被误判成「不是有效的 DSH 源码检出」

Windows 上的记事本与部分编辑器会给 UTF-8 文件写 BOM,而 json.loads 遇到 BOM
会直接抛错。结果是:明明是正确的检出目录,检测说它不是,回滚也被安全阀挡下来。
现在读取 JSON 一律用 utf-8-sig(没有 BOM 时行为不变)。

⚙️ 工程改进

  • 测试 132 → 140 项,新增的守护都用真实踩过的坑写成:
    • 源码版 zip 解压后必须真的能 import(真实执行,不看清单)
    • files 白名单必须覆盖 updater_core.py 的全部运行时模块
      (漏一个 i18n 文件,用户在插件里就会 ImportError,本地开发完全复现不出来)
    • package.json 版本必须等于 GUI 的 APP_VERSION
    • 插件声明三件套(dsh.client / ./client 导出 / 产物)必须对齐
    • 带 BOM 的检出目录仍能被识别
    • --offline 模式一个网络请求都不发
  • 网页插件是手写的闭包工厂产物(lib/client.js),仓库里没有构建脚本 ——
    所以从 GitHub 直装不会触发 pnpm 的 allowBuilds 授权询问。

📦 本版资产

文件 说明
DeepSeekHarnessUpdater.exe Windows 独立版桌面工具(无需 Python)。与 v0.7.7 功能一致,仅版本号更新
dsh-updater-src-v0.8.0.zip Python 源码版:解压后双击 启动更新器.bat,或运行 python updater_gui.pyw(需 Python 3.10+,含 tkinter)。本版起才真正可用(此前漏打包语言模块);同时附带 DSH 插件文件
SHA256.txt EXE 的 SHA256 校验值

网页版插件不在这些资产里:它直接从本仓库安装(见上),不需要下载 EXE。
本 Release 附带的 EXE 只是桌面版的例行重建。

⚠️ 已知限制

  • 网页插件升级需要「卸载 → 重新安装」(DSH 的插件页明说不支持自动更新)
  • 插件里的「检测」在断网时只显示本地结果,官方版本一栏会提示查询失败
  • 回滚窗口最旧的一个备份若读不出 package.json 的版本,会显示「回到 备份版本」
  • 切换语言后若个别文字仍显示为其它语言,点一次「🔄 重新检测」刷新即可
  • 「使用 GPU 加速」目前仅记录偏好:DSH 尚未提供 GPU 加速选项

dsh 自动更新 v0.7.7

Choose a tag to compare

@github-actions github-actions released this 26 Sep 18:01

v0.7.7 更新说明(修订版)

本文件是「最新一版」的更新说明,发布新版本前请改成当版内容。
GitHub Actions 在推送 v* tag 时会把这个文件的内容作为 Release 说明(body_path)。

注:本版在原 v0.7.7 之后补了一个修复,版本号不变,Release 就地更新。

🔧 重要修复(务必更新)

深色 / 浅色设置没有被真正记住

原 v0.7.7 声称「深色模式会被记住」,实际上只记住了一半:

启动时恢复了 _dark 这个标志,却没有同步重建调色板 CLR。CLR 是模块级
变量,模块导入时固定为浅色,只有点「切换主题」才会更新它。于是出现错位:

  • 偏好档里存的是深色 → 程序认为自己是深色(_dark=True)
  • 但界面仍然是浅色(CLR 还是浅色)
  • 下次点「切换主题」还会反过来:标志变成浅色,界面却应用深色

现在启动时会按已保存的主题同步重建 CLR,标志与配色不再错位。

已验证:写入 dark_mode: true 的偏好档 → 全新进程启动 →
_dark=True 且 CLR['bg']=#12161c、CLR['row_bg']['update']=#3a2f16(均为深色)✓

新增回归测试 test_startup_syncs_palette_with_saved_theme 锁住该约束。

✨ 本版其它改动

深色模式会被记住

切换主题后会写入 preferences.json,下次启动直接沿用(本次修复让它真正生效)。

回滚窗口在深色模式下整体纯黑

窗口、列表、滚动条、原生标题栏一律纯黑,与主窗口的深蓝灰区分开。
浅色模式维持原样。实现用本窗口专属样式名(Rb.*),不影响主窗口。

深色模式下的可读性

位置 原问题
「语言」下拉框 _setup_style 从未配置 TCombobox,clam 主题给出白底黑字,深色下是空白白框
插件 / 技能窗口横幅 背景写死浅色,深色下刺眼
按钮按下态 按下色写死浅色
回滚窗口提示文案 Hint.TLabel 被使用却未定义,ttk 渲染成一块黑底

⚙️ 工程改进

  • 新增 test_all_used_ttk_styles_are_defined:比对「源码里使用的 ttk 样式」与
    「_setup_style 里定义的样式」,漏定义不会再溜过去
  • 新增 test_startup_syncs_palette_with_saved_theme:锁住主题标志与配色的同步
  • 测试 130 → 132 项

📦 本版资产(两种版本)

文件 说明
DeepSeekHarnessUpdater.exe Windows 独立版(无需 Python),双击即用
dsh-updater-src-v0.7.7.zip Python 源码版:解压后双击 启动更新器.bat,或运行 python updater_gui.pyw(需 Python 3.10+,含 tkinter)
SHA256.txt EXE 的 SHA256 校验值

上版本用户若已安装:直接覆盖 exe 即可,数据(CSV 导出)与本地设置不受影响。

⚠️ 已知限制

  • 回滚窗口最旧的一个备份若读不出 package.json 的版本,会显示「回到 备份版本」
  • 下拉框展开后的列表使用 Tk option 数据库上色,未能在开发机上回读验证
  • 切换语言后若个别文字仍显示为其它语言,点一次「🔄 重新检测」刷新即可
  • 「使用 GPU 加速」目前仅记录偏好:DSH 尚未提供 GPU 加速选项