# @baipengyan0101/dsh-harnessmm [简体中文](README.md) | [English](README.en.md) 把 [HarnessMM](https://arxiv.org/abs/2610.32813)(*Recursive Self-Improvement for Harness Token Efficiency*)的 **EDG / GDR / CCS** 机制实现为 DeepSeek Harness 的**原生插件**,并提供**会话视图**(session view)只读观测面板 (会话视图顶部页签 + 右侧栏两个入口)。GitHub:。 npm 包:。 - **宿主侧**(`index.js`):在 DSH 的模型/工具边界上工作——向系统提示注入可执行决策图(EDG)作者指令, 包装慢模型(slow model)的 `llm/stream` 流式输出,并在工具派发前用最近一次回执做守卫复用(GDR)。 满足条件时通过原生工具接口执行认证回调替换(CCS),并给 bash/pwsh 前台结果追加签名回执; 注册只读工具 `harnessmm_status`。 - **客户端侧**(`client.js`):注册「决策复用」面板的两个入口(会话视图顶部页签与右侧栏页签), 读取宿主注册的 `harnessmm` 会话投影,把会话日志中**可推导**的决策图、守卫判定、替换记录与实测 token 展示出来(只读,不做客户端→宿主 RPC)。 - **零运行时依赖**:宿主产物是 Node ESM,客户端产物是浏览器侧 CJS 包装(由 DSH 的 ModuleLoader 加载,React 由宿主提供);二者都不依赖 zod 或 `@deepseek-ai/*` 包——宿主侧自带的 parse 兼容层 替代 zod。上游 Apache-2.0 的 `sar_v2.mjs` / `cot_jev.mjs` 原样 vendored 在 `src/host/vendor/`。 ## 安装 ### 从 npm 安装(推荐) npm 包:****(当前 0.3.0,随 `npm publish` 发布)。 DSH 插件页支持直接从 npm 安装: 1. 打开 DSH Web GUI → 左侧 **插件** 页; 2. 点 **添加插件**,粘贴包名 `@baipengyan0101/dsh-harnessmm`; 3. 点安装;完成后刷新页面(或等客户端 HMR 推送)。 也可以先用 CLI 装包,再在插件页把 bundle 开关打开(`dsh plugin` 只转发包管理器,不写 bundles 列表): ```bash dsh plugin --profile desktop add @baipengyan0101/dsh-harnessmm # 然后打开 DSH Web → 插件 → 已安装 → HarnessMM 决策复用,把开关切到启用 ``` 这条 npm 安装路径已在临时目录用 `pnpm add @baipengyan0101/dsh-harnessmm` 实测(0.3.0,含 `index.js` / `client.js` / `cordis.patch.yml` / `locale/` 等运行时文件,详见 `docs/verification.md`)。 ### 从 GitHub 安装 公开仓库:**** ![插件详情页:HarnessMM 决策复用 v0.2.1,组件运行中](docs/plugin-manager-detail.jpg) DSH 的插件页支持直接从 Git 地址安装:插件管理器用 pnpm 装包,并把声明了 `dsh.bundle` 的包追加进 `dsh.profile.bundles`;profile 重组时 HMR 会挂载它,**无需重启 App**。 1. 打开 DSH Web GUI → 左侧 **插件** 页; 2. 点 **添加插件**,粘贴仓库地址 `https://github.com/baipengyan/dsh-harnessmm`; 3. 点安装,完成后再刷新页面(或等客户端 HMR 推送)。 装好后应能看到:会话视图顶部切页行出现 **决策复用**(紧跟「轨迹」)、右侧栏出现 **决策复用** 页签、 系统提示包含 EDG 作者指令、工具列表出现 `harnessmm_status`,并且可认证的 bash/pwsh 前台结果尾部会多出一行签名回执。 也可以先用 CLI 装包,再在插件页打开 bundle 开关(`dsh plugin` 只转发包管理器,不写 bundles 列表): ```bash dsh plugin --profile desktop add https://github.com/baipengyan/dsh-harnessmm # 然后打开 DSH Web → 插件 → 已安装 → HarnessMM 决策复用,把开关切到启用 ``` 要求:Node ≥ 22.19、DSH `0.2.1-rc.*`(`engines.dsh = ">=0.2.1-rc.2 <0.2.2"`)。仓库已提交构建产物 `index.js` / `client.js`,从 Git 安装时无需本地构建。这条 git 安装路径已在临时目录用 `pnpm add https://github.com/baipengyan/dsh-harnessmm` 实测通过(装出 0.3.0,含 `index.js` / `client.js` / `cordis.patch.yml` / `locale/` 等运行时文件,详见 `docs/verification.md`)。 卸载:在插件页把该插件的开关切到停用(这会把它从 `dsh.profile.bundles` 中移除),或手动删掉 `dsh.profile.bundles` 里的 `@baipengyan0101/dsh-harnessmm`(依赖可保留)。 ## 本地开发安装 改源码开发时用 link 方式挂载(幂等,会备份 profile 的 `package.json`): ```bash cd harnessmm pnpm install node scripts/build.mjs node scripts/install.mjs # 安装 / 修复(link + bundles 条目 + 符号链接) node scripts/install.mjs --dry-run # 只看将改哪些行 node scripts/install.mjs --uninstall ``` 脚本从 `package.json` 读取包名,因此改名后会自动迁移:旧的 `@local/dsh-harnessmm` 依赖、bundles 条目与 `node_modules/@local/` 软链会被删除并替换为当前包名。 `scripts/install.mjs` 会做三件事: 1. 在 `~/.dsh/profiles/desktop/package.json` 中登记 `"@baipengyan0101/dsh-harnessmm": "link:<本目录>"`; 2. 把 `@baipengyan0101/dsh-harnessmm` 追加进 `dsh.profile.bundles`; 3. 在 profile 的 `node_modules/@baipengyan0101/dsh-harnessmm` 建立指向本目录的符号链接。 DSH 的 HMR 会在 profile 重组时挂载新 bundle,**不需要重启 App**;刷新 GUI 页面即可看到效果。 如需停用引擎,可在 profile 的 `cordis.patch.yml` 里为 `harnessmm` 加一条覆盖项并把 `config.enabled` 设为 `false`,或设置环境变量 `DSH_HARNESSMM_ENABLED=0`。 ## 使用 ### 顶部会话视图页签「决策复用」 会话视图顶部与内置「对话」「轨迹」并列出现「决策复用」页签(slot `conversation.view`,order 20, 紧跟 Trajectory)。点击后面板占满主视图:头部固定、正文内部滚动、不被输入框覆盖。 ![决策复用面板:顶部会话视图页签 + 右侧栏两个入口](docs/panel-usage.jpg) ### 右侧栏「决策复用」 打开会话右侧栏 → 「决策复用」(`guide` 顺序 42)。两个入口渲染同一个面板、读取同一份投影数据。 面板包含: | 区块 | 内容 | | --- | --- | | 头部 | 启用状态(宿主启用 / 宿主关闭)、当前阶段(`idle/slow/fast`,启发式)、provider/model/effort 路由、策略 chips | | Token | 读取 sibling 投影 `tokenUsage` / `contextPressure` 的**实测**输入/输出/缓存 token 与上下文压力 | | 统计 | turns / toolCalls / slowCalls / substitutions / certificates / guardsPassed / guardsFailed / banks / nodes / planErrors | | 决策图 | 分层的 EDG:节点 label、tool、参数预览、guard、successors;节点状态目前只会出现 `stored`(已存储)与 `substituted`(已替换);点击节点看参数、guard、回执证据与证书 | | 决策时间线 | 每次工具调用的 `substitution`(认证替换)或 `slow`(原始 reasoning callback),附守卫判定 pass/fail/unknown | | 计划原文 | `` JSON(能解析时格式化显示,否则显示原文)与解析错误提示 | | 证书 | 由会话日志推断的替换记录(`cert_`);面板注明“证书只表示回调被替换(CCS 已发生),不代表调用成功” | | RSI / 备注 | 宿主持久化目录里的静态 RSI 快照(v1 通常不可用,字段为 `null`),以及派生说明 | | 空态 | 解释 EDG/GDR/CCS 机制与该面板如何获得数据 | 面板支持局部交互:折叠分区、按 `all/substitution/slow` 过滤决策、缩放与选中节点、复制参数 / callId / 计划 JSON。**没有** “节省 token / 成功率”之类逆事实指标;替换记录不代表成功。 ### 工具 `harnessmm_status` 只读,向 agent 汇报引擎观测计数、当前路由、等待回执的替换 callId、策略与数据目录;不发起模型调用, 也不报告“节省”或“认证成功”。v1 的返回值里 `rsi.available` 恒为 `false`。 ## 配置 `cordis.patch.yml` 默认插入 `harnessmm` 行并可被 profile patch 覆盖: ```yaml - insert: - id: harnessmm name: '@baipengyan0101/dsh-harnessmm' config: enabled: true autoImprove: false # v1 不启用 Python RSI 训练 autoImproveAfterTurns: 20 autoImproveCooldownMs: 86400000 iterations: 2 maximumCandidates: 16 # 1..16(引擎取值范围) maximumFastSteps: 8 # 1..16(引擎取值范围) maximumPublicBytes: 65536 # 1024..65536(引擎取值范围;上游 v6 公开状态上限为 65536) audit: true # 审计 sidecar($DSH_HOME/storages/harnessmm/audit/*.jsonl) ``` `enabled=false` 或环境变量 `DSH_HARNESSMM_ENABLED=0` 可整体停用引擎行为(投影仍会注册,便于观察)。 RSI 快照从 `$DSH_HOME/storages/harnessmm/stats.json`(或 `improvement.json`)读取,缺失即 `null`。 引擎交给 vendored 图控制器的是**裁剪后的消息投影**,不是原始 `options.messages`:user 文本每段 ≤600 字符、最多最近 32 个 user 回合(计划之后的新 user 消息始终保留,用于让控制器放弃复用)、去掉 DSH 的 `source`/`id` 溯源字段。原因是上游 v6 的公开状态上限为 65536 字节(超限即 `jev/full-cot` 退回慢模型);slow 模型与原生会话日志保持原文不变。 ## 诚实性边界(重要) - 视图只折叠**已提交的会话日志事件**,不读宿主内存;宿主侧的审计 sidecar(替换证书、 admission/回退原因、控制器内部事件)**不会**写入会话日志。 - 因此面板里的“证书”是**由 `chisel__