dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DSH 插件市场的补丁层:一键更新全部(退出后自动完成并重开)+ 更新安全网(启动失败自动回退)+ 本地插件更新检测与快照回滚。
给 DSH 插件市场补四块缺口:一键更新全部、更新前红绿灯、更新失败自动回退、本地插件更新检测。
DSH 的插件市场(dshmarket)已经很好用,但有三件事它自己做不了:
link: 挂进来的本地开发插件,市场不检测它们的更新。这个插件把这三件事接过来:在 DSH 里点一下,退出 DSH,剩下的它自己做完,并把 DSH 开回来。
按钮在哪:市场 「分组」页面里,「本地化插件」 模块的右上角(和「⟳ 检测更新」并排)。
找不到?它会自动兜底,不会因为分组怎么改就消失:
上图是兜底位置:把所有分组都删掉时,按钮出现在「未分组」的右上角。
点开后:
pnpm),并补写 dsh.profile.bundles点完没反应是旧版最大的问题——现在排队成功当场就有进度窗和「已排队 N 个」的按钮状态;排队期间再点按钮不会报错,而是打开排队详情(可以取消)。
勾选面板里逐包标风险,点「更新」之前就能看出来:
红灯和白灯默认不勾选:它们表示「这个包更可能出问题 / 还没被验证」,不是禁止更新。想装就手动勾上;真出问题有下面的启动自检 + 自动回退兜底。
node_modules//package.json 里的真实版本。pnpm 有时因为 engines 之类的问题返回非零退出码、可文件其实已经写进去了——以前会被误判成失败,现在按真实结果记账。更新完重启,如果 DSH 起不来:
重启 → 60 秒自检 → 发现新的 crash-*-web-boot.log
→ 解析出是哪个插件崩的 → 只回退「本次更新过的」
→ 抢在「禁用全部插件」对话框被点之前结束进程
→ 装回旧版本 → 重启 → 再自检一次为什么需要:桌面端启动失败会弹一个只有「禁用全部插件」按钮的窗口,点下去 sanitizeProfile() 会改名 patch 文件、重置 bundles —— 你的定制会全部失效。这个助手会在你点它之前,自己把问题处理掉。
如果新起的宿主进程提前退出(常见于旧实例的子进程还没退干净、被单实例锁顶掉),助手会等 8 秒确认是否已有实例接管,不会像旧版那样直接放行。
有些插件更新后不会让 DSH 崩溃,却会把 Agent 预设弄没:它们的 dsh.bundle.patch.yml 会给官方 preset 注入某个服务,或者依赖自己 insert 的条目。一旦那个服务被你在 patch 里 disabled: true,四个 preset 会全部停在 pending —— 设置页「Agent 预设」整页空白、旧会话报 Unknown agent preset: xxx。
这类失败不写 crash log,启动自检看不见。所以更新完、重启前,助手会扫一遍本次更新包自带的 bundle patch,把风险点名写进日志和进度窗,例如:
⚠ 组合风险:billion-context 依赖自己 insert 的条目 "bili-native",
而你的 profile 把它禁用了 —— 可能导致插件或 preset 失效更新前还会备份 package.json / cordis.patch.yml / .dsh-market/state.json,万一真被 sanitize 了也能捞回来。
先在市场「分组」页新建一个名为「本地化插件」的分组,把 link: 插件加进去,再点 ⟳ 检测更新:
从 v1.2.4 起这个分组不再由插件自动创建——插件只读state.json,不写它。原因是这个文件由市场和一个长期运行的内存对象共同维护,插件再插一脚会造成groups/groupOrder错位(表现为"分组还在,但点分配到报分组不存在")。分组和成员现在完全归你自己管。
点完按钮右下角就会弹一个原生小窗,四步轨:更新 → 自检 → 回退 → 重启,每个阶段换颜色,不用盯着黑屏猜它有没有在跑。
v1.2.0 起:
dsh plugin add … → ok/FAIL)——DSH 关掉后,这是唯一能看到进度的地方market-expand-更新失败-.txt:失败包、自检结论、组合风险、日志和备份路径全在里面,DSH 起不来也不用翻 .dsh左:更新中(蓝色,显示 4/6 · 包名 → 版本) 右上:启动失败后自动回退(橙色,前两步已绿,正在回退肇事插件) 右下:完成(全绿)
三张截图为 v1.0 的旧布局;v1.2 窗口更高,中间多了滚动的日志区。
不是替代品,是补丁层。 dshmarket 负责「逛、装、卸、分组、备份、诊断」这些日常;本插件只补它做不了的三件事。两者可以同时安装,互不干扰。
dsh plugin --profile <profile> add dsh-market-expand官方桌面端请在应用自己的「设置 → 插件」里安装——那个 profile 归应用的插件管理器所有。
检测 GitHub 源、查询 registry 时可能需要代理。本插件从环境变量读取,不写死任何地址:
变量 · 说明 DSH_GIT_PROXY · 优先级最高,如 http://127.0.0.1:7890 HTTPS_PROXY / HTTP_PROXY · 标准变量,兜底 DSH_GIT_INSECURE=1 · 自签证书环境才需要,放宽 git 的 TLS 校验(默认不放宽)
一个都没有就直连。也可以写在 ~/.dsh/.env 里,插件启动时会自动读。
只在需要更新时、且 DSH 完全退出之后:
~/.dsh/market-expand/ —— 队列、报告、日志、更新前备份、进度状态package.json(依赖与 bundles)与 node_modulescrash-*-web-boot.log,不修改market-expand-更新失败-.txt不会碰你的 cordis.patch.yml、会话和记忆库。
engines 等返回非零、但文件其实已写入时,按 node_modules 里真实版本记账,不再误判失败;⑤pnpm 11 的 allowBuilds 自动放行(v1.3.1 起)+ git 源连不上时走 codeload 快照兜底(先探包入口文件,仓库不带构建产物的跳过)。ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED——pnpm 11 要求在 profile 的 pnpm-workspace.yaml 里按「包名@精确 tarball URL」放行该包的 build scripts,而按 commit 钉版本的 git 依赖每换一个 commit 键就变一次,于是每次更新都撞同一处、回滚也一样装不上。现在从 pnpm 报错里解析出精确 key,追加到 allowBuilds(只加不删,旧 commit 的键留给回滚;已存在不写;改前备份 pnpm-workspace.yaml.bak-)后原地重试一次;解析不出就只报告、不乱改配置。②失败分类新增 allow-builds(构建脚本未放行)与 network(git fetch 128 / 域名解析失败 / 连接超时),不再混进「没有可用的更新通道」;文案直接说清是「没放行」还是「连不上 GitHub」、下一步该做什么。idleTimeoutMs 对齐,GitHub 源的包本来就可能装 5 分钟以上);超时后用 taskkill /T /F 杀整棵进程树(旧版只杀外层 cmd.exe,残留的 node 会一直占着 profile 写锁,导致后面每个包都白等 120 秒后失败);遇到写锁被占用时先等锁释放、再重试一次;回退 `pnpm` 前确认没有残留的官方 CLI 进程(两条通道并发写会把 profile 写坏);失败报告按超时 / 写锁占用 / 通道不可用分类,不再一律写「没有可用的更新通道」。补掉「重启假阳性」:旧自检只看「进程存活 + 没 crash 日志」,进程活着但窗口没出来也会报「通过」——现在查主窗口句柄,90 秒没窗口就判定卡住,杀进程重开一次,并把窗口恢复到前台(不再只留任务栏);窗口一出现立即收尾;启动期间进度窗每 4 秒刷新「已等 N 秒」。另外修掉 2026-10-22 的「认证 cookie 撑爆」事故:桌面版每次启动新增一条 dsh-auth-*(随机端口命名、60 天有效、从不清理),攒到 71 条时 Cookie 头超过 Node 默认 16KB 上限 → host 拒收 → Electron 欢迎页认证失败 → 窗口不出现(手动双击也打不开)。现在**每次重启宿主前自动清理 dsh-auth-* 并备份 cookie 库**;no-window 时读宿主 stdout,识别到 Web authentication failed 就标记 auth-cookie-overflow 并清理后重试。conhost.exe 启动(桌面端终于能看到)、贴右下角、实时滚动日志、关闭按钮无焦点框、成功后保留 5 分钟;按钮状态每 4 秒轮询;自检时长按包数动态(1 个 10 秒 → 10 个 30 秒);README 加「更新按钮在哪」。/update 不再二次扫描(避免静默丢包);排队中可取消。MIT