🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

消息编辑与分支 yunyv/dsh-message-edit

DeepSeek Harness
yunyv75 天前有提交已提供中文文档扫描:未发现敏感能力

编辑历史消息并生成新分支,随时切回旧版本

26/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/15 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add yunyv/dsh-message-edit
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · skill
装得上吗
实装验证未通过(dependency_conflict),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 75 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(dependency_conflict · 2026/10/15) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🟢 扫描:未发现敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。

发起外部网络请求
查看扫描证据(共 4 处,展示前 4 条)
  • 发起网络请求
    client.js:592
    const response = await fetch(`${MESSAGE_EDIT_PATH}?sessionId=${encodeURIComponent(this.sessionId)}`, {
  • 发起网络请求
    client.js:626
    const response = await fetch(MESSAGE_EDIT_PATH, {
  • 发起网络请求
    src/client/controller.ts:402
    const response = await fetch(`${MESSAGE_EDIT_PATH}?sessionId=${encodeURIComponent(this.sessionId)}`, {
  • 发起网络请求
    src/client/controller.ts:438
    const response = await fetch(MESSAGE_EDIT_PATH, {
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-agent-presets@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-llm@deepseek-ai/dsh-session@deepseek-ai/dsh-session-query@deepseek-ai/dsh-workspace@deepseek-ai/dsh-client-connection
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

基于分支的消息编辑、重roll、重试与版本导航,适配 DeepSeek Harness,兼容 DSH 0.1.0-rc.6 / rc.7+

README

由 DeepSeek 最新模型翻译生成
DSH Message Edit 为 DeepSeek Harness 补充基于事件溯源的「消息编辑与重生成」能力。插件不改写历史事件,也不修改 DSH 引擎内部;每次编辑、重生成或重试都会从目标回合之前创建一个新会话版本,原会话始终保留并可随时切回。 兼容性 - 兼容 DSH 0.1.0-rc.6、0.1.0-rc.7 及更新版本。 - 版本事件(message-edit/version)在事件信封上携带 ignorable: true 标记:较新 DSH 构建遇到未知事件类型时跳过而非拒绝整个日志,确保会话历史在版本升级后仍可正常加载。 功能 - 编辑消息:可编辑已落定的用户文本、assistant.reasoning 思考块与 assistant.response 回复文本。 - 重生成:从最后一条已落定助手回复所属回合之前分支,使用原用户输入重新生成。 - 重试任意回合:在 Timeline 中选择任意历史回合重新执行。 - 级联策略: - truncate(默认):只重新执行目标输入,删除该点之后的旧后续。 - preserve:保留后续用户输入,并在新分支中依次重新执行;助手输出与工具链全部重新生成。 - 版本切换:会话标题栏的 ← 撤销当前原子效果,→ 重施加最新直接子效果;Timeline 展示完整已知分支树、操作时间、编辑前后内容与当前版本。
展开完整文档(README 剩余 1 节)
DSH Message Edit

为 DeepSeek Harness 补充基于事件溯源的「消息编辑与重生成」能力。插件不改写历史事件,也不修改 DSH 引擎内部;每次编辑、重生成或重试都会从目标回合之前创建一个新会话版本,原会话始终保留并可随时切回。

兼容性

- 兼容 DSH 0.1.0-rc.6、0.1.0-rc.7 及更新版本。
- 版本事件(message-edit/version)在事件信封上携带 ignorable: true 标记:较新 DSH 构建遇到未知事件类型时跳过而非拒绝整个日志,确保会话历史在版本升级后仍可正常加载。

功能

- 编辑消息:可编辑已落定的用户文本、assistant.reasoning 思考块与 assistant.response 回复文本。
- 重生成:从最后一条已落定助手回复所属回合之前分支,使用原用户输入重新生成。
- 重试任意回合:在 Timeline 中选择任意历史回合重新执行。
- 级联策略:
- truncate(默认):只重新执行目标输入,删除该点之后的旧后续。
- preserve:保留后续用户输入,并在新分支中依次重新执行;助手输出与工具链全部重新生成。
- 版本切换:会话标题栏的 ← 撤销当前原子效果,→ 重施加最新直接子效果;Timeline 展示完整已知分支树、操作时间、编辑前后内容与当前版本。
- Timeline 标签页:注册到 conversation.view,order: 15,位于 Trajectory(10)与 Prompt Studio(20)之间。

安装

npm
dsh plugin --profile web add @yunyv/dsh-message-edit

或 GitHub
dsh plugin --profile web add github:yunyv/dsh-message-edit

或本地开发(link 模式)
dsh plugin --profile web add -w link:/path/to/dsh-message-edit

dsh plugin 是 pnpm 转发器:add 后会自动识别 dsh.bundle 声明并把插件收编进 profile 的 dsh.profile.bundles,重启 dsh 即生效。

设计

时间可组合性

插件把完整回合作为效果原子。目标回合的 turn/start、模型请求、工具调用、工具结果与 turn/end 不会被局部复制后拼接;新版本从该回合之前的闭合边界分支:

1. 用户消息编辑、Reroll 与 Retry:回退整个目标回合,再把目标用户输入作为新回合交给 Agent。
2. 助手块编辑:回退整个目标回合,以原用户输入和编辑后的助手内容构造一个新的完整闭合回合;原工具链不进入新版本。选择 preserve 时,后续用户输入再依次交给 Agent,产生新的完整工具链。
3. 每个版本都追加一个不可拆分的 message-edit/version 效果对:effect 记录正向效果,inverse 记录恢复目标。父版本链自动导出组合逆;恢复不是删除事件,而是沿逆链切换到仍然存在的版本。
4. 消息历史变换彼此不交换,因此撤销遵循 LIFO:一次只撤销当前原子效果并保留更早效果;各后继分支始终保留,可从父版本重新施加。

分支与 Agent 接线

1. 在来源 Agent 的 runMaintenance() 内,从已闭合边界取得不可变 seed;第一回合之前使用空 seed。
2. 用本地等价的纯事件构造器把版本效果对与可选手工助手回合加入 seed,再调用 ctx.agents.create({ seed, meta })。Session 在 Agent 构造前一次性验证完整 seed;任何一步失败都会由 AgentFactory 的结构性逆撤销,外部观察者看不到半成品 Session,Agent 的回合计数也直接从完整历史初始化。
3. 发布后调用 ctx.sessions.flush(),在 HTTP 操作成功前建立耐久性屏障。
4. Workspace 挂接与 child Agent 生命周期分别返回原子逆;操作失败时按相反顺序组合恢复。随后通过 child.agent.followup() 排入需要重新执行的用户输入。

此路径不接触 ReactLoopAgent、AgentLoop 私有方法或 apiproxy 的收窄 fork RPC;分支 seed 仍由同一 Session 公共事件契约验证。

空间可组合性

- Host 只依赖公开的 sessions、agents、sessionPersistence、sessionQuery、workspaceRegistry 与 webServer 服务。
- Browser 只通过 slots、conversation、connection 与 runtime sessions 服务组合。
- Timeline 与标题栏共享一个按 sessionId 建立的值级 Snapshot source;控制器反应式订阅当前 Session 的闭合回合值与 Session 列表中的谱系值,Session 身份替换时重新绑定,不缓存旧 Session 对象。
- 新版本导航等待 runtime Session 列表发布对应 ID 后再执行 ctx.sessions.open(),依赖可用性变化直接驱动导航。

数据模型

每个插件版本在自己的非继承后缀中包含一个 message-edit/version 事件:

interface MessageEditVersionEvent {
schemaVersion: 2
effect: {
id: string
operation: 'edit' | 'reroll' | 'retry'
cascade: 'truncate' | 'preserve'
targetTurn: number
targetEventSeq: number
targetBlockIndex?: number
blockKind?: 'user' | 'assistant.reasoning' | 'assistant.response'
before?: string
after?: string
}
inverse: {
kind: 'restore-version'
sessionId: string
}
}

会话头的 parentSession 构成版本树,且必须与事件中的 inverse.sessionId 一致;seedLength 区分当前版本自己的元数据与从祖先继承的同名事件。Timeline 通过 ctx.sessionQuery.traceSession() 和 readSession() 生成完整值级投影,并由原子逆链导出 undoStack 与直接 redoSessionIds。旧版平面事件仍可读取,并在投影时规范化为同一效果对。

UI

- conversation.view
- id: message-edit-timeline
- order: 15
- label: Timeline
- conversation.session.header.actions
- id: message-edit-controls
- 直接父效果撤销、直接子效果重施加、效果链计数、最后回复重生成
- conversation.chat.assistant-actions
- id: message-edit-assistant-actions
- 助手消息行内的编辑 / 重试按钮,走官方 per-message action slot(messageId 派发);用户消息无对应 slot,仍由 DOM 注入补齐

组件使用 CSS Modules 与 --dsw- 语义 token,不引入 UI 库。所有产品文案为中文,代码注释为英文。

HTTP 接口

- GET /message-edit?sessionId=<id>:读取可编辑消息、可重试回合与完整版本树。
- POST /message-edit:执行 edit、reroll 或 retry,返回已发布的新 Session ID。

构建

npm install
npm run build

源码位于 src/(Host 在 src/index.ts,Browser 在 src/client/),构建脚本为 scripts/build.mjs,基于 esbuild + lightningcss:

- Host:src/index.ts → index.mjs(ESM,@deepseek-ai/ 外部化)
- Browser:src/client/index.ts → client.js + client.js.map(window.__ModuleLoader__.load 闭包工厂,CSS Modules 由 lightningcss 编译为哈希类名映射 + 幂等 注入)

npm run typecheck(tsc --noEmit)校验类型;npm run build 同时产出两个半区。

范围边界

- 不原地改写 Session 事件;历史是 append-only、deep-frozen。
- 不联动恢复或修改工作区文件、命令外部效果与既有产物。
- 不修改 DSH 引擎、apiproxy 或官方 UI 包。

License

MIT
预览分享卡片长什么样 ↓yunyv/dsh-message-edit
分享 · DeepSeek Harness Hub
yunyv/dsh-message-edit

编辑历史消息并生成新分支,随时切回旧版本

回到顶部