← 返回列表
✓ 可直接安装
DeepSeek Harness 消息删除插件 —— 把一条消息从模型上下文里真正拿掉,同时从当前转录里隐藏它。…
自动检查通过:npm 包已发布且 engines 声明满足基线(声明 Node >=22);该结论来自程序自动检查,未经人工实机验证。 · 最近上游提交 2026/9/25 · 已提供中文文档
针对 DeepSeek Harness 的逐消息删除:通过官方的 surface-replace 契约,从派生的模型上下文中移除一条用户消息、一个回复步骤或一整条助手回复,并在不重写仅追加日志的情况下将其从可见记录中隐藏。
综合分
31.5
GitHub 分
31.5
用户评分
—
★ Stars
2
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add dsh-delete-turnnpm 包 dsh-delete-turn 已校验归属本仓库,走 npm 安装最省事
信任档位:已验证本站已于 2 天前真实安装成功(L4 · 真实安装)
- 是什么
- dsh 原生插件 · market
- 装得上吗
- 本站已真实安装成功(L4 · 真实安装,非静态推断)
- 安全吗
- 本站尚未对该插件做风险分级(暂未覆盖,不等同于无风险)
- 还在维护吗
- 活跃:最近一次提交在 0 天前
档位由下列信号合成:本站实装验证(真实安装,当前最高到 L4)· 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。下方各区块是它的证据明细。 验证判据与等级说明 →
🟢实装验证通过· 2026/9/23
由本站实装验证器在真实 dsh 环境安装成功,非静态推断。
数据截至 2026/9/26(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查✓ 自动检查通过
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-delete-turn @ 0.1.0
✓Node 引擎要求 >=22 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/21 09:01:44
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动
README
由 DeepSeek 最新模型翻译生成dsh-delete-turn
DeepSeek Harness 消息删除插件 —— 把一条消息从模型上下文里真正拿掉,同时从当前转录里隐藏它。 助手回复挂在官方 conversation.chat.assistant-actions 槽位;用户消息、注入上下文与工具调用卡由 DOM 增强补上入口。确认后经官方 surface-replace 契约追加替换事件:模型后续看到的历史里不再有这条内容,而原始会话日志一个字节都不改写。
中文 · English
中文
▲ 悬停消息行时出现的删除按钮(复制按钮右侧)
为什么需要它
DSH 的会话日志是 append-only 的:说错话、发错提示词、模型答偏了,这些内容会一直留在模型上下文里,污染后续每一轮。官方只提供了「压缩」(/compact)这种整段摘要机制,没有单条消息级别的删除。
这个插件把删除放回消息本身:
- 用户消息 → 删这一条;
- 思考卡 / 工具调用卡 → 删这一步(该步的 assistant/message 与它请求的 tool/result 一起走,工具配对永不悬空);
- 助手回复(官方操作条)→ 删这条回复连同它的思考、工具调用与注入上下文(你的提问保留);
- 注入上下文行、失败回合行 → 同样有删除入口。
特性
- 模型上下文级删除 —— 追加一条官方 surfaceOp: { op: 'replace', startSeq, endSeq } 替换事件,被遮蔽的内容不再进入 deriveMessages();与宿主 /compact 同一套官方契约
- 转录级隐藏 —— 客户端按 data-chat-flow- 锚点与官方 useChat 快照定位行,删除后折叠退场;刷新、重启 DSH、换标签页后依旧隐藏
- 日志即台账 —— 隐藏依据直接从日志里的替换事件重建(替换事件的消息 source 标记为本插件),不依赖 localStorage、不需要预检,也不会和其它插件(如压缩)的替换混淆
- 原生视觉 —— 复用官方 primitives 的 Modal / Button 与主题 token,明暗主题自动适配;图标与全部文案为原创
- 中英双语 —— 弹窗、提示、错误原因随系统语言即时切换
- 安全边界 —— 只接受回环地址且 Host 为本机的请求;目标必须是当前 surface 节点、不能碰系统提示词头、回合进行中拒绝、已被删除的目标拒绝并给出机器原因码
截图
▲ 删除前确认:说明影响范围,原始日志不改写
▲ 删除后:该行从转录中消失,后续内容自然上移
安装
npm 安装(web profile)
dsh plugin --profile web add dsh-delete-turn
本地工作区(开发)
dsh plugin --profile web add link:/path/to/dsh-delete-turn
安装后需要完全重启 DSH 进程(宿主侧插件树只在启动时读取)。浏览器端 bundle 由宿主按请求动态 serve,重启后硬刷新页面即可生效。核实是否加载:
dsh --profile web --dump-config # 应出现 "# == dsh-delete-turn" 段落
使用
1. 悬停任意消息行,点击行尾的垃圾桶按钮;助手回复的按钮在官方操作条(复制 / 分叉旁边)。
2. 确认弹窗会说明这次删除的影响范围,点「删除」。
3. 目标行折叠退场;模型上下文在下一轮请求重建时不再包含它。
工作原理
UI(官方槽按钮 / DOM 增强按钮)
→ 确认弹窗
→ POST /dsh-delete-turn/delete { sessionId, mode, seq? / messageId? / turn? }
宿主:
sessionQuery.readSession() 读完整日志(live 优先)
自实现 surface fold → 当前 surface 节点 + 历史替换遮蔽集
校验(当前节点 / 区间干净 / 回合已闭合 / 不碰系统头)
session.append('user/message', 短标记占位, {
surfaceOp: { op: 'replace', startSeq, endSeq },
sourceEventSeqs: [被遮蔽的全部 seq],
})
等待官方 session/flush 持久化检查点
→ 返回 { hidden: [{ seq, mode }] }
客户端:
useChat 快照把 data-chat-flow-key 映射到节点,按 hidden 集合折叠行
GET /dsh-delete-turn/state 在每次打开会话时重建 hidden 集合
设计要点:
- 为什么占位是短标记而不是空内容:官方格式校验把 system/message 钉在「打开中的 step」上(不能用于回合外的删除),而 assistant/message 禁止携带 sourceEventSeqs(无法声明被遮蔽节点)。压缩检查点用的正是 user/message 替换;占位必须带一小段文本([deleted]),因为严格网关会拒绝空内容的 user 消息(user message must have content),而标记文本不会重放被删除的内容。
- 为什么不读 React fiber / CSS 哈希类名:行定位只用官方 data-chat-flow- 锚点与官方 useChat 标准 hook,宿主 UI 重构不会静默失效。
- 为什么刷新后仍然隐藏:隐藏台账不是浏览器本地状态,而是日志里替换事件的可重放推导;宿主 /state 路由在每次打开会话时重建它。
已知限制
- append-only 语义下没有「反删除」:被遮蔽的内容无法真正恢复,删除不可撤销(原始日志仍在,可用官方工具自行重建会话)。
- 回合进行中不允许删除;请等回复结束后操作。
- 系统提示词头(surface 节点 0)不可删除。
- 助手操作条的删除范围是整条回复;要只删某一步,请用思考卡 / 工具卡上的按钮。
- 过程行(「已思考」「用时 N 秒」)不单独提供删除入口:它的范围同样是整条回复,与操作条重复,因此只保留操作条那一个。
- 已经被官方压缩(/compact)移出模型上下文的内容不再显示删除入口:它已经不在上下文里,转录用意保留;入口只在内容仍可删时才出现。
- 宿主侧插件树仅在 DSH 启动时加载:安装、更新插件后必须完全重启 DSH。
兼容性
- 实测 DSH 0.1.6-alpha.2 与 0.1.7-alpha.2(web profile,Safari / WebKit 与 Chromium 内核均验证)。
- 会话格式 v3 与 v4 都支持:v4 迁移会把插件 source 展平为 plugin:dsh-delete-turn,隐藏台账会同时识别 { kind: 'plugin', plugin: ... } 与 { kind: 'plugin:...' } 两代形状。
- 宿主半区零运行时依赖,全部服务经 cordis ctx 解析;缺少 sessionQuery 时回退到 live 会话快照。
- 不修改 DSH 官方源码,不写任何私有事件类型。
License
MIT
English
▲ The delete action appears when a message row is hovered
Why
A DSH session log is append-only: a wrong prompt or a bad answer stays in the model context and pollutes every later turn. The only official tool is whole-range compaction (/compact); there is no per-message delete.
This plugin puts deletion back on the message itself:
- user message → remove that one message;
- reasoning card / tool card → remove that step (the step's assistant/message and the tool/result it requested leave together, so tool pairs never dangle);
- assistant reply (official action strip) → remove the whole reply attempt with its reasoning, tool calls and injected context (your prompt stays);
- injected-context rows and failed-turn rows get an entry too.
Features
- Context-level delete — appends the official surfaceOp: { op: 'replace', startSeq, endSeq } intent; shadowed content no longer reaches deriveMessages(). Same contract as /compact.
- Transcript-level hide — rows are located through official data-chat-flow- anchors and the official useChat snapshot, then collapse out. The hide survives a reload, a DSH restart and other tabs.
- The log is the ledger — hidden seqs are re-derived from the replacement events themselves (their message source is marked with this plugin), so there is no localStorage sidecar, no preflight, and no confusion with compaction replacements.
- Native look — official primitives (Modal / Button) and theme tokens; icon and all copy are original.
- Bilingual — zh/en dictionaries follow the active locale.
- 安全边界 — 仅限回环路由;目标必须是当前表面节点,系统提示词头部受保护,正在运行的回合会被拒绝,已删除的目标会以机器码失败。
截图
▲ 确认框会说明确切范围;日志永远不会被重写
▲ 删除后该行从对话记录中消失
安装
npm(web 配置)
dsh plugin --profile web add dsh-delete-turn
本地工作区(开发)
dsh plugin --profile web add link:/path/to/dsh-delete-turn
然后完全重启 DSH 进程(宿主插件树仅在启动时读取)。浏览器包是动态提供的,因此重启后硬刷新一次即可。验证:
dsh --profile web --dump-config # 预期出现一个 "# == dsh-delete-turn" 区段
用法
1. 悬停在某条消息行上,点击其末尾的垃圾桶操作;助手操作位于官方操作条中,紧挨着复制/分支。
2. 对话框会说明确切范围;点击 Delete。
3. 该行会折叠消失;当下一次请求被重建时,模型上下文将不再包含它。
工作原理
UI(官方槽位操作 / DOM 增强操作)
→ 确认对话框
→ POST /dsh-delete-turn/delete { sessionId, mode, seq? / messageId? / turn? }
宿主:
sessionQuery.readSession() 读取完整日志(优先实时)
本地表面折叠 → 当前表面节点 + 历史被遮蔽的 seq
校验(当前节点 / 干净窗口 / 已关闭回合 / 受保护头部)
session.append('user/message', 短标记占位符, {
surfaceOp: { op: 'replace', startSeq, endSeq },
sourceEventSeqs: [每个被遮蔽的 seq],
})
await 官方 session/flush 持久化检查点
→ { hidden: [{ seq, mode }] }
浏览器:
useChat 快照将 data-chat-flow-key 映射到节点;隐藏的 seq 会折叠对应行
GET /dsh-delete-turn/state 在每次会话打开时重建隐藏集合
设计说明:
- 为什么占位符是短标记,而不是空内容:官方格式校验将 system/message 固定在一个打开的步骤上(无法用于带外删除),并禁止在 assistant/message 上使用 sourceEventSeqs(因此它无法引用被遮蔽的节点)。压缩检查点使用 user/message 替换;占位符必须携带一段短文本([deleted]),因为严格的网关会拒绝没有内容的用户消息(user message must have content),而该标记永远不会重放被移除的内容。
- 为什么不用 React fiber 或 CSS-module 哈希:行是通过官方 data-chat-flow- 锚点和官方 useChat 标准钩子来定位的,因此宿主 UI 重构不会悄无声息地使这些操作失效。
- 为什么重新加载后依然隐藏:账本不是浏览器状态;它是对日志中替换事件的重放,由宿主的 /state 路由重建。
已知限制
- 仅追加语义不提供撤销删除:被遮蔽的内容无法真正恢复,且删除不可逆(原始日志仍然存在;官方工具可以从中重建会话)。
- 正在运行的回合无法删除;请等待其结束。
- 系统提示词头部(表面节点 0)受保护。
- 助手操作条会删除整个回复尝试;请使用推理/工具卡片来移除单个步骤。
- 过程/披露行(“Thinking”、“N s”)本身不携带条目:它的作用域是整个回复,而操作条已经覆盖了这一点,因此重复项已被移除。
- 已被官方压缩(/compact)从模型上下文中移除的内容不再提供删除操作:它已不在上下文中,而记录出于有意保留它。
- 宿主插件树仅在 DSH 启动时加载:安装或更新插件后请完全重启 DSH。
兼容性
- 已针对 DSH 0.1.6-alpha.2 和 0.1.7-alpha.2 验证(web 配置;WebKit 和 Chromium 引擎)。
- 同时支持 v3 和 v4 两种会话格式:v4 迁移会将插件源扁平化为 plugin:dsh-delete-turn,隐藏账本可识别 { kind: 'plugin', plugin: ... } 和 { kind: 'plugin:...' } 两种形态。
- 宿主部分零运行时依赖,并通过 cordis 上下文解析所有服务;当 sessionQuery 缺失时,它会回退到实时会话快照。
- 不修改任何 DSH 源代码,也不写入任何私有事件类型。
许可证
MIT