dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
一个插件做会话与消息手术:撤回或编辑指令/回复(连思考过程一起改)、用原提问重新生成、按模型上下文级删除任意一条,以及会话归档、删除、跨工作区移动与工作区迁移。面向 DSH 0.1.5 / 0.2.x,已在 0.2.1-rc.3 实测。由三个 MIT 插件分叉合并而成(Jipcon/DSH-plugins 的 dsh-message-recall、hkkz9522 的 dsh-session-manager、DDDMUC 的 dsh-delete-turn),新增编辑回复、重新生成与工作区迁移。不要与这些插件或其它会话移动、消息删除类插件同时启用。
撤回、编辑指令与回复(连思考过程一起改)、用原提问重新生成、删除任意一条指令或回复、 会话归档/删除/跨工作区移动与工作区迁移。 一个 DSH 插件全都有 —— 装上它,插件列表里只多一行。
Recall, edit prompts and replies (reasoning included), regenerate with the original prompt,
delete any single prompt or reply, session archive/delete, cross-workspace move, and
workspace migration — all in one DSH plugin.
消息侧
删掉的内容离开模型上下文并从转录隐藏(后面每一轮都看不到它),原始只追加日志一个字节都不改写。 与上面的「编辑 / 重生成」是互补关系:那两个是"改完重来",这个是"当作没说过"。
会话 / 工作区侧
cwd与日志物理位置一起迁过去;有备份与回滚,失败不会留下半个状态。
点哪里 → 删掉什么
点哪里 · 删掉什么 用户消息行上的垃圾桶(排在「撤回 / 复制」后面) · 就这一条:真人提问或注入上下文行;助手回复留在原地 思考卡 / 工具调用卡上的垃圾桶 · 就这一步:该步的 assistant/message + 它请求的 tool/result(工具配对不会悬空),同回合其它步骤保留 助手回复操作条(复制 / 分支那一排)上的垃圾桶 · 整条回复:连思考、工具调用与注入上下文一起走;你的提问保留
过程行、失败行、重试行上的垃圾桶按「整条回复」处理。
它和「编辑 / 重生成」的分工
你想干的事 · 用哪个 改一句话然后重发 · 撤回 / 编辑我的消息 改我说过的话(含思考块) · 编辑我的回复 ✍️ 让这条回复重新生成 · 用原提问重新生成 ↻ 发错了、答偏了,想让后面每一轮都别再看到它 · 删除 🗑️
机制:确认后追加一个官方 surfaceOp: { op: 'replace', startSeq, endSeq } 替换事件 (与官方 /compact 同一套契约),被遮蔽的内容从此不再进入 deriveMessages(),转录里也一并隐藏。 原始 append-only 日志一个字节都不改写。 隐藏台账直接从日志里的替换事件重建 (source 标记 plugin:dsh-wm-toolkit),不依赖 localStorage,刷新/重启后依旧隐藏。
边界(诚实说明)
要"改完重来"请用编辑 / 重生成。
/compact 移出上下文的内容不再显示删除入口——它已经不在上下文里了。GET /wm-delete/state?sessionId=、POST /wm-delete/delete,仅回环 + 同源 + Host 本机。落地与拒绝都写进 $DSH_HOME/dsh-wm-delete.log(删除不可逆,必须留痕)。
dsh plugin --profile <你的 profile> add dsh-wm-toolkit
# 重启 DSH本地源码安装:
dsh plugin --profile <profile> add "file:/path/to/dsh-wm-toolkit"卸载:dsh plugin --profile remove dsh-wm-toolkit。 本插件不改写 DSH 自身文件(除一处可回滚的工作区菜单补丁,带 .dsh-wm-orig 备份与原生命令检测); 插件数据写在独立目录,卸载不会动你的会话档案。
⚠️ 装完 / 改完必须重启 DSH:宿主半边(路由)只在启动时读取。只改浏览器半边刷新页面即可。
它由三个各自独立维护的半边组合而成,三者都是 MIT 社区插件的分叉或移植(见 NOTICE.md):
半边 · 上游 · 我们新增 parts/recall · dsh-message-recall 2.6.1 · 编辑我的回复(含思考块)、用原提问重新生成/重试、分支预设与模型继承、家族自愈 parts/manager · dsh-session-manager 0.4.11 · 工作区文件夹真迁移(移目录 + 工件跟随 + cwd 重写 + 回滚)、未分组修复、启动自愈 parts/delete · dsh-delete-turn 0.1.3 · 改名与路由前缀、守卫与清理写法对齐本仓库、认两代 source 形状的台账、官方契约回归测试
DSH 的插件列表按包 / 插件 id 逐行列出的,所以"装上去就是一个插件"要求只有一个可解析的包; 而三个半边各有几百个顶层标识符(log / TEXT / apply …),直接合并源码极易撞名。于是做法是:
lib/index.js(生成物):导入各半边,依次 apply(ctx);任何一半抛错只记日志、不影响另一半,只有全部半边都失败才抛出(不让插件"半死不活")。服务依赖取各半边并集。
lib/client.js(生成物):一次 __ModuleLoader__.load(),工厂内部把各半边各自包进 IIFE,半边代码逐字节不变,作用域天然隔离。
build.mjs:从 parts/ 生成上面两个文件。改代码请改 parts/,然后 npm run build。组合层会把加载结果写进 $DSH_HOME/dsh-wm-toolkit.log(半边已应用 / 半边应用失败(已隔离) + 堆栈), 消息删除半边另写一份 $DSH_HOME/dsh-wm-delete.log(删除是不可逆操作,落地与拒绝都要留痕)。
dsh)Web 端,engines.dsh ^0.1.5-rc.1 || ^0.2.0-rc.1 || ^0.2.1-rc.1;Node ≥ 22。(写成显式 || 分支而不是 >=0.1.5-rc.1:node-semver 只放行「范围内某个比较符与该版本的 major.minor.patch 元组一致、且自身带预发布标签」的预发布版,宽泛的 >=0.1.5-rc.1 在 0.2.1 元组上没有带预发布标签的比较符,会静默排除整个 0.2.x 预发布线。)
webServer / sessions / agents / sessionPersistence /workspaceRegistry / agentPresets / settings / storageDomain / sessionQuery), 不修改引擎与官方 UI 包。
surfaceOp: { op: 'replace' } 契约(与 /compact 同一套机制),已在 DSH 0.1.5-rc.2 上用官方 foldSurface 做过契约回归。
删除 / 会话管理与工作区迁移均可用;rc.3 起工作区迁移的入口是左侧栏面板列表的「更多」菜单 (sidebar.panellist.actions),会话右上角不再有它。
没有真正的反删除)。需要"改完重来"请用编辑 / 重生成。
/compact 移出上下文的内容不再显示删除入口。truncate 语义:该回合之后的内容留在旧会话里;不提供"自动重放后续输入"。npm run build # 由 parts/ 生成 lib/
npm run test # 各半边的离线单测(11 套)lib/ 是生成物,请勿手改。发布流程见 RELEASE.md。 各半边的细节见 parts/recall/README.md、parts/manager/README.md、parts/delete/README.md。
测试构成(tests/run-all.mjs 依次执行并汇总):
套 · 覆盖 parts/recall/tests/wm-assistant-edit.test.mjs · 编辑我的回复 / 重生成核心(58 项) parts/recall/tests/purge-resurrected-queue.test.mjs · fork 复活队列清理·纯逻辑(15 项) parts/recall/tests/purge-queue-host.test.mjs · fork 复活队列清理·宿主集成(8 项) parts/manager/tests/wm-relocate.test.mjs · 会话迁移核心 parts/manager/tests/purge-orphan-projcache.test.mjs · 孤儿投影缓存清理(11 项) parts/manager/tests/reconcile-projcache-identity.test.mjs · 投影缓存 identity 对账(12 项) parts/delete/tests/wm-delete-logic.test.mjs · 删除逻辑:折叠 / 规划 / 台账 / 安全拒绝(26 项) parts/delete/tests/wm-delete-host.test.mjs · 删除宿主集成 + 官方 `foldSurface` 契约验收(20 项) parts/delete/tests/wm-delete-client.smoke.mjs · 浏览器半边冒烟(7 项) parts/delete/tests/wm-delete-placement.test.mjs · 删除按钮位置回归 + 新内容放行·迷你 DOM(17 项)
wm-delete-host.test.mjs 会动态载入本机 DSH 安装的官方 `foldSurface`(@deepseek-ai/dsh-session) 做 surface 契约验收,找不到时明确跳过而不是假通过。
打 tag 即发 —— GitHub Actions + npm Trusted Publishing,Git 和 npm 一起更新,不用发两次:
# 1) 改代码 → 升 package.json 的 version,并在 CHANGELOG.md 记一条
npm run build && npm run test
# 2) 提交推送
git add -A && git commit -m "release: X.Y.Z" && git push
# 3) 打 tag(必须与 package.json 版本一致,工作流会强制校验)
git tag -a vX.Y.Z -m "dsh-wm-toolkit X.Y.Z" && git push origin vX.Y.ZCI 会跑 build.mjs + tests/run-all.mjs + npm publish --provenance --access public。
前置条件(一次性):在 npm 包页面绑定 Trusted Publisher —— 五个字段的填法与当前状态见 RELEASE.md §3。绑定完成前,CI 会一路跑到 npm publish 才失败; 想补发一个已存在的版本时,用 Actions 页面的 Run workflow 手动触发(不校验 tag)。
MIT。三个半边的上游版权与许可声明完整保留,见 LICENSE 与 NOTICE.md。