在对话里直接改写历史消息与附件,无需重新生成
30.8/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查未通过:仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add jyXR0042/dsh-message-editor该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · chat
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 31 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装仓库 package.json 标记 private,未发布到 npm,需从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-message-editor @ 0.2.2
✓Node 引擎要求 >=22 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/10 21:28:15
安全扫描自动 · 静态分析源码v2.7.0🟢 扫描:未发现敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。
写入剪贴板(不计风险)
查看扫描证据(共 3 处,展示前 3 条)
- 写入剪贴板lib/client.js:697
async function writeClipboard(text) { - 写入剪贴板lib/client.js:700
await navigator.clipboard.writeText(text); - 写入剪贴板lib/client.js:780
void writeClipboard(text).then((accepted) => {
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 就地编辑历史消息
- 编辑消息附件
- 任意轮次重新生成
在 DeepSeek Harness 会话里就地编辑自己的消息——冷编辑,不重新生成,不耗 token。任意一轮都能重新生成,还能移除附件。
README
由 DeepSeek 最新模型翻译生成dsh-message-editor
在 DeepSeek Harness 的对话里直接修改任意一条历史消息 —— 模型输出的文本、你自己输入的文本,以及附件。默认冷修改:不重新生成。 对话里显示的就是修改后的内容,后续模型调用读到的也是修改后的内容。
功能
- 自己发的消息可以就地改写。 用户消息的操作行里有一个铅笔,正文原地变成内联编辑器:layer-1 表面上的描边卡片,胶囊形的「保存 / 取消」,Enter 保存、Shift+Enter 换行、Esc 取消。全程不触发重新生成,不重新流式输出,不消耗 token。
- 模型回复可以「重新生成本轮」。 模型那条回复的操作行里有一个圆形箭头,和复制 / 分支 / 点赞并排 —— 沿用宿主自己那条操作栏的几何与悬停行为。点一下就让模型重新回答这一轮,旧回答从对话和上下文里一起消失。
注意:模型回复不能被「改写」。 这不是本插件的取舍,而是会话格式的硬约束:任何表层替换都必须在 sourceEventSeqs 里逐一引用它遮蔽的节点,而 assistant/message 明确拒绝携带这个字段(它自带 source stream)。两条规则合起来没有合法写法,所以改写模型消息在这版格式上不可能生效。早期版本试过:保存看似成功、标记为「下一步生效」,然后永远刷新失败 —— 模型始终看到原文。
展开完整文档(README 剩余 1 节)
dsh-message-editor
在 DeepSeek Harness 的对话里直接修改任意一条历史消息 —— 模型输出的文本、你自己输入的文本,以及附件。默认冷修改:不重新生成。 对话里显示的就是修改后的内容,后续模型调用读到的也是修改后的内容。
功能
- 自己发的消息可以就地改写。 用户消息的操作行里有一个铅笔,正文原地变成内联编辑器:layer-1 表面上的描边卡片,胶囊形的「保存 / 取消」,Enter 保存、Shift+Enter 换行、Esc 取消。全程不触发重新生成,不重新流式输出,不消耗 token。
- 模型回复可以「重新生成本轮」。 模型那条回复的操作行里有一个圆形箭头,和复制 / 分支 / 点赞并排 —— 沿用宿主自己那条操作栏的几何与悬停行为。点一下就让模型重新回答这一轮,旧回答从对话和上下文里一起消失。
注意:模型回复不能被「改写」。 这不是本插件的取舍,而是会话格式的硬约束:任何表层替换都必须在 sourceEventSeqs 里逐一引用它遮蔽的节点,而 assistant/message 明确拒绝携带这个字段(它自带 source stream)。两条规则合起来没有合法写法,所以改写模型消息在这版格式上不可能生效。早期版本试过:保存看似成功、标记为「下一步生效」,然后永远刷新失败 —— 模型始终看到原文。现在这个调用会直接报错说明原因,绝不假装成功。(实测:30 份会话日志里,模型消息的替换记录数为 0。)
- 改完用户消息可以重新生成。 编辑自己的输入时,编辑器里多一个「保存并重新生成」:保存修改,同时让模型基于新内容重新回答。旧的回答会一起从对话和上下文里移除,不会出现「两个回答叠在一起」。默认的「保存」仍然只是冷修改。
- 附件也能改。 用户消息里的图片和文件会显示成附件标签,点一下标记为移除,保存后这个内容块就不会再进入模型上下文。
- 可撤销。 冷修改过的用户消息会显示「已修改」标记和撤销按钮,一键恢复日志里的原文。(重新生成会用新回答取代旧回答,不提供撤销。)
- 持久、可回放。 修改是会话日志里的一次追加事件,不是原地改写。刷新、恢复、fork、回放都保留,原文永远不会被破坏。
实现原理
会话日志只追加不修改,而 Harness 在它之上渲染两个不同的视图:
- 模型可见表层:一次折叠,每条消息解析为当前遮蔽它的那个节点;
- 人类对话记录:只接收 append 来源的事件,这样一次替换就不会抹掉你已经读过的对话。
本插件写第一个视图,画第二个视图。
1. 改写 = 表层替换(surface replacement)。 编辑时会追加一条新的 user/message / assistant/message 事件,带上 surfaceOp: { op: 'replace', startSeq, endSeq },于是表层折叠遮蔽原节点,原文继续留在日志里。这正是上下文压缩和工具结果裁剪已经在用的机制;而 Session.deriveMessages() 会在每个模型步骤开始时重新折叠日志,所以一次追加就永久生效。消息历史不存在请求期拦截点,也不需要。
2. 对话记录由被接管的渲染器绘制。 conversation.chat.node 是 keyed 槽位,因此本插件接管 user、steering、assistant-step、context 四个格子。用户气泡自己画;模型步骤则委托给宿主原有的 Markdown 渲染器,只换掉节点数据 —— 没改过的回复和原版一模一样,改过的回复依然保留完整的 Markdown、代码高亮和思考过程渲染;注入的上下文行(如系统提醒)也照样委托,只有本插件自己那条触发消息被隐藏。
3. 重新生成 = 一次跨节点替换 + 一次唤醒。 「保存并重新生成」提交的替换范围不是那一条消息,而是从它开始、一直到下一条用户消息之前的整段回复(只包含 assistant/message 和 tool/result,遇到别的一律停下,所以范围只会偏小、不会偏大)。于是模型视角里旧回答连同它的工具结果一起消失,工具调用与结果的配对不会被破坏。随后插件发一条 plugin 来源的触发消息唤醒会话,这条消息在界面上按 context 行的规则被隐藏,所以读者看到的只有「修改后的问题 + 新回答」。
4. 两端通过一条带鉴权的路由通信。 主进程在 connection 的 /api 面上挂一条精确 Fetch 路由,浏览器端用同源 fetch 调用,因此每次修改都经过和整个应用相同的 Host/Origin 围栏与浏览器鉴权。不需要生成 Remote 产物,不需要 zod contribution,不需要代码生成。
改写逻辑刻意保守,因为消息历史会真的被送去请求模型:
- 所有非文本块原样保留 —— 尤其是模型消息里的 tool-call 块,否则配对的 tool/result 会变成孤儿,下一次请求会被服务端拒绝;
- 模型消息的替换会丢弃 usage,因为 token 折叠读的是原始日志,否则历史步骤会被重复计费;
- 模型消息的替换会把 source.replayState.blocks 重新对齐到新的内容:适配器按下标校验这个数组(长度与每格的 type 都必须一致),不一致就整份丢弃。里面装的是思考签名、不是正文,所以不对齐的代价是那轮思考连续性被丢掉;
- 消息的 id、role、source 全部保留(日志加载路径要求如此);
- 上下文压缩事务开启期间拒绝编辑。
模型知道自己的话被改了吗
不知道,而且这是设计使然。模型没有独立记忆 —— 上下文就是它的记忆。(这一节只适用于你改自己的消息;模型回复根本改不了,见上。)你改掉自己的输入之后,提示词里只剩修改后的版本,没有任何标记说明这里被改过,所以它既不会也无法"察觉"。这正是冷修改想要的效果:修正后的版本成为唯一事实。
有三种情况会让它看起来像"不知道":
1. 回合内的时间差。 请求是在 agent/request 之前就构建好的,所以如果你在 agent 正跑某个步骤时编辑(正在流式输出、或在工具循环中),那一步的请求已经带着旧文本发出去了;修改从下一个步骤/回合才进入模型。
2. 后面的消息仍在断言旧内容。 改第 3 轮不会重写第 7 轮里那句"正如我之前所说"。模型看到互相矛盾的历史,可能跟从任何一边。
3. 「保存并重新生成」会把旧回答从模型视角删除。 它连"我原来怎么说的"都看不到了。
如果你明确希望模型知道"这里被改过",需要额外给它一条提示 —— 插件目前刻意不做,因为那会把一次修正变成一次对话事件。
安装
本插件是一个 bundle:package.json 声明 dsh.bundle.patch,由补丁插入一条 host row;浏览器端通过 exports["./client"] 自动挂载。
网页端 —— 侧边栏 → 插件 → 添加插件 → 填入本仓库地址或本地路径,勾选信任,安装。
Agent 会话里 —— plugin_manager → install_bundle,target 传包目录、git 地址或 npm 规格。
验证 —— 插件页面里 dsh-message-editor 显示为已启用;自己的消息下方出现铅笔按钮,模型回复的操作行里出现「重新生成本轮」按钮。
看到「主进程里的插件版本比界面旧,请重启 DeepSeek Harness 后再试」就是这一条。 浏览器端每次都从磁盘重新提供、可以热替换,而 host 端是缓存住的模块;两者版本不一致时,界面会去调用主进程还没有的接口。重启即可对齐,不会损坏数据。
安装或更新后需要重启一次
一个从未被加载过的 bundle 可以靠 HMR 直接激活;但替换一个已经安装过的包必须重启进程,因为 host 端是一个 JavaScript 模块,运行中的进程会一直持有它第一次加载的那一代代码。这是 Harness 的既有行为,不是本插件的怪癖:
Installing a new bundle can activate through HMR; replacing an installed package requires restart to load a fresh JavaScript module generation.
所以首次安装新版本之后请重启应用。全新环境下第一次安装会立即生效。
已知限制
- 只支持已载入的会话。 替换事件要通过 live Session.append 追加,因此需要会话处于活动状态。未载入的会话会返回一个明确的拒绝,而不是往日志里写一条 Harness 尚未校验的记录。先发一条消息恢复会话,再编辑。
- 模型消息的步骤范围。 user/message 替换任何时刻都合法,所以改用户消息会进入紧接着的那次请求;而 assistant/message 替换受 Harness 自己的关系规则限制,是「步骤内」事件。插件会在步骤打开时立即落盘,否则暂存到下一个模型步骤,并把消息标成「已修改 · 下一步生效」。在出厂配置下立即路径总是成功,暂存路径实际上是休眠的。
- 一次编辑一个字符串。 一条消息里的多个文本块在保存时会合并到第一个;思考、图片、文件、工具调用块保持原有顺序和内容。因此编辑可能让文本相对工具调用移动位置(这是有意为之),但无法重排非文本块。
- 附件目前只能删,不能加。 从历史消息里移除附件已经可用;给历史消息新增文件需要走上传管线,本版本刻意不做。
- 「重新生成」只对用户消息提供,且不提供撤销。 它会用一个新回答取代旧回答;旧回答仍完整保留在只追加的日志里,但界面和模型上下文都不再显示它。想保留旧回答时用「保存」做冷修改即可。
- 同一 Harness 只能装一份。 host 端挂的是固定路由路径,两份实例不能同时激活。
- 面向 @deepseek-ai/dsh 0.2.0-rc.2 构建。 本插件不声明任何 @deepseek-ai/dsh- peer dependency —— Harness 会用运行时精确版本校验它们,范围不对会直接拒绝安装。它只通过 ctx.sessions、ctx.agents 和 ctx.connection 与主进程通信,并且同时兼容两种 surfaceOp 写法(startSeq/endSeq 与更早的 start/end),因此在相近版本间应当可以继续工作。
开发
pnpm install
pnpm typecheck # 对浏览器端做 tsc 检查
pnpm test # host 端日志改写逻辑 + 完整 host 测试台
pnpm build # esbuild → lib/client.js
目录:
| 路径 | 说明 |
| index.js | host 入口,转发到 lib/host.js |
| lib/host.js | host 端:编辑路由、表层替换、暂存的模型消息落盘 |
| src/client/ | 浏览器端源码,构建成 lib/client.js |
| tests/ | host 逻辑单测与端到端 host 测试台 |
| docs/research/* | 本设计所依据的接缝调研 |
lib/ 是故意提交进仓库的:Harness 会原样提供浏览器端文件,从不构建它。
验证一次改动
pnpm test 用一个遵守真实追加契约(表层标记、替换范围、来源引用)的 Session 替身来覆盖日志改写逻辑。浏览器端通过实时槽位树验证 —— cordis_inspect_query → client Slots → 对 conversation.chat.node 调 listSubTree,应当看到本插件的条目赢下 user、steering、assistant-step 三个格子。
许可证
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
jyXR0042/dsh-message-editor
在对话里直接改写历史消息与附件,无需重新生成
相关插件 · 对话 / 记忆
上下文中枢oceanbase/powercontext
上下文跟着工作走 —— 跨会话、跨智能体、跨人。
★ 1,487已汉化DSH
73
智能体记忆库plastic-labs/honcho
Honcho 是记忆基础设施,用来构建有状态的智能体。这些智能体能理解不断变化的人、智能体、群组、项目和想法。
★ 7,894已汉化DSH
71.7
长程智能体控制面loopx-project/loopx
给 Agent 一个目标,让工作持续向前。
★ 6,358已汉化DSH
71.3
智能体上下文数据库volcengine/OpenViking
给 AI 智能体用的上下文数据库
★ 41,379已汉化DSH
71.3
长效机器人团队Fei2411/DS-Bot
DS Bot 是一个基于 DeepSeek Harness简称 dsh的 bot 插件,插件将 dsh 改造为 bot…
★ 5,084已汉化DSH
71.1
可携带记忆层EverMind-AI/EverOS
为什么选择 EverOS
★ 13,778已汉化DSH
71.1
这是你的仓库?认领条目