# DeepSeek Harness Core(DHC → mcore)演进史(v1 → v62)
动态 Cordis 插件迭代记录。项目最早定名 **DeepSeek Harness Core(DHC / DHCore)**,v0.56.0 起插件名统一为 **mcore**(API 路由 `/api/dhc` 保持稳定)。插件 ID 经历多次生命周期(DSH 重启会清空动态插件,记忆文件持久):`perso-1`(v1-v11)→ `perso-2`(v12-v16)→ `dhcore-3`(v17)→ `dhcore-1`(v21,动态插件存档)。
## DHC 常驻安装(当前)· agent preset `dhc`
| 版本 | 内容 |
| --- | --- |
| v82 | **v0.74.0:完全开源 —— 许可改回 MIT,第三方署名补齐**:① **MIT 复归**(v0.59.0–v0.73.0 期间曾为「源码可见·专有」):自有代码全部以 MIT 发布,可自由使用/修改/分发/商用,唯一条件是保留版权与许可声明;`package.json` 的 `license` 同步为 `MIT`,README 的开头声明、目录项、许可章节一并改写。② **第三方署名补齐(法律合规,不是客套)**——vendor 进来的 `dsh/pet/dsh-pet-full/` 此前**没有保留原作者的许可文本**,违反 MIT「必须包含版权声明与许可声明」条款;现补 `dsh/pet/dsh-pet-full/LICENSE`(**dsh-pet / 作者 PC2005-cloud / MIT**),新增 `docs/THIRD_PARTY_NOTICES.md`(dsh-pet + 嵌套 23 个 npm 包 MIT 20·ISC 2·Apache-2.0 1 + Hermes/Hindsight/cordis/DSH 的借鉴说明),并把该文件加进 `package.json` 的 `files` 白名单 —— **许可声明必须随包分发,不能只躺在仓库里**。③ **门禁加固**:`release-check` REQUIRED_IN_PACK 新增 `LICENSE` / `docs/THIRD_PARTY_NOTICES.md` / `dsh/pet/dsh-pet-full/LICENSE`,将来谁删了直接拦。④ **开源前隐私复核**:189 个 commit 的 `git log -p` 全文搜机器码 **0 命中**;历史中从未提交过真实 `persona-core.json`(早期 `persona-core/` 目录只有代码与空壳模板);仓库内无任何运行态数据。⑤ README 新增「🙏 致谢」章节,逐项列出借鉴来源(**开源的是代码,不是数据** —— 人格数据仍只走夺舍导出/恢复导入)。 |
| v81 | **v0.74.0:记忆价值驱动 + 情绪驱动宠物**:① **记忆模块升级为「价值驱动」**(`dsh/memory-dedup.mjs`)—— 写入时本地规则打 priority(0-100,**不调 LLM**,同步路径零延迟);中文 bigram Jaccard ≥0.86 判精确重复直接跳过并给已有条目 hit+1 提级,0.62~0.86 疑似同主题先写入、后台 debounce 25s 交给 LLM 做四动作判定(merge/skip/keep);淘汰从按时间 `slice(-200)` 硬砍改成按 pri(`long` 且 `pri≥80` 强保护);加载时自愈去重,**被删/被合并的全部先进 archive 可捞回**(三道保险:归档留底、合并结果比原文短一半直接拒、同轮同条只处理一次)。实测线上 149 条 → 74 条,精确重复归零,`/api/dhc/state` 记到 `异步合并:merge 1 · skip 1 · 归档 2`。② **宠物「🎮 互动」按钮全部下线**,换成只读的「🎭 情绪驱动」卡片(`dsh/pet-emotion-map.mjs`)—— 主人说话 → 场景识别(水/吃/睡/代码/钱/玩/成功/烦躁/节日/亲昵 10 类)× **当前真实 PAD 情绪档位** → 从 106 个真实素材动作里选一个演出。同一句「游泳」:兴奋演蓝鲸现世、平静演鲸鱼尾巴拍地、低落直接躺下;学习表按 `(场景|情绪)` 记命中/失手自行迭代,第二次起 `from:learned`;90 秒同场景冷却,换话题随时可演。③ **宠物面板按钮全清**(79 行绑定,15 个 id 零残留),名字改为 `applyLoaded` 自动跟随(实测「mcore机器核心」→「小助理」即时同步)。④ **门禁**:`dsh/memory-digest.mjs` / `dsh/memory-dedup.mjs` / `dsh/pet-emotion-map.mjs` 全进必需清单。**全量回归 41+26=67 条单测全绿**,release-check 六闸全绿(1007 文件 / 69.0 MB / 素材 106 动画 / 泄漏 0 命中)。 |
| v80 | **宠物宿主真正自持 + 网页渲染器内联(v0.73.0,2026-11-03 通宵修)**:主人卸载 dsh-pet 后要求 mcore 完全自带其功能,本轮把最后两块补齐。① **宿主默认自持**:MCORE_PET_HOST 默认 1(上一版默认 0 把宿主甩给独立 dsh-pet,主人一卸载,/dsh-pet-7340/* 全线 404,mcore 的可见形态全部消失——后端 /api/dhc/* 其实一直 200,看着却像插件没了);全量宿主 dsh/pet/dsh-pet-full 能 import 就用全量的,缺 @electron/get 时自动降级 dsh/pet-host.mjs。② **简化版 config 结构对齐全量**:/config 现在补 pets[](id/name/display/size/position/开关),否则桌面 helper 读完 config 拿不到宠物列表会**静默退出**(进程没了、窗口不出来、stderr 一个字不报,实测踩过)。③ **网页渲染器改为打包内联**:client-entry.mjs 直接 import ./pet/vendor-client.js,不再运行时 createElement(script).src=/api/dhc/pet/client.js——桌面窗口页面是 dsh-app://app/ 自定义协议,以斜杠开头的相对路径会被协议处理器吃掉、**根本不发 HTTP**(文件探针实测:node 直接请求有命中,浏览器刷新 0 命中),渲染器永远加载不上。④ **client inject 补 locale**:渲染器要 ctx.locale,只声明 slots 会抛 cannot get property locale without inject(被 try/catch 吞掉,面板正常而宠物不画)。⑤ **删掉清单里不存在的 @deepseek-ai/dsh-client-runtime**:DSH 0.2.1-rc.5 的 69 个 dsh-client-* 里没有这个包,inject 条目只是激活排序,但名字错了会误导排障。⑥ **桌宠窗口落位**:position.corner 由 top-right 改 top-left(窗口宽 924px、屏幕宽 1707px,右上角定位会让窗口右边界超出 453px,宠物画在窗口右下角正好出界——宠物不见了其实是画在屏幕外)。⑦ 排障基建:/api/dhc/pet/client.js 加文件探针(~/.dsh/mc-pet-probe.log,带 UA/referer),mcPetAttach 失败改用页面 HUD 显示错误(document.title 会被 DSH 覆盖,不可靠)。**实测**:release-check 六闸全绿(1003 文件 / 68.9 MB / 素材 106 动画 / client 产物 272965 B / 版本三维一致),/dsh-pet-7340/{state,config,models,thumb,pic,font} 全 200,桌宠窗口 visible=True 且画面正常(气泡「正在处理任务呢」);dsh-pet 卸载状态下 bundles/deps/node_modules 三处均无残留。 || v79 | **v0.72.1:走 npm 分发,别人不用 GitHub 权限也能装**:① 版本 0.72.1(`package.json` / `dsh/index.mjs` 的 `PLUGIN_VERSION` / README 封面 alt·徽章·安装示例、以及 CHANGELOG 之外的历史引用不动)——`release-check` 的「版本三方一致」用 tag 卡住;② **npm 分发**:包名 `@muvuula/mcore`(registry 上未被占用),发布后一条命令装 `dsh plugin --profile
add @muvuula/mcore@0.72.1`,不需要私有仓库授权;包内自带 1001 文件 / 68.7MB(含 106 个宠物动画),装完即用,**不走 postinstall 下载**;③ 发布前发现 `npm whoami` 报 `ENEEDAUTH`、`@muvuula` 作用域在 npm 上不存在(`Scope not found`)——**这两步只能由账号主做**(`npm login` + 建 org),本机不存密码;④ 泄漏扫描**跳过随包发的第三方 `node_modules`**(`dsh/pet/dsh-pet-full/node_modules/env-paths` 的 readme 带上游作者的示例用户目录,误报 4 处;顺带把自己注释里写的示例路径也改掉,差点被自己的规则拦住);⑤ 升级检查第三级源补 `gh auth token` 兜底(环境变量没设也能查私有仓库 Releases)、并已补发 GitHub Release `v0.72.0`(此前 Releases 停在 v0.58)。**实测**:`release-check` 6 闸全绿(1001 文件 / 68.7 MB / 泄漏 0 命中),`npm pack` → 干净目录安装 → `import('@muvuula/mcore')` 成功。 |
| v78 | **插件升级按钮修好(v0.72.x)**:① 弹「GitHub 仓库暂无 release(HTTP 404)」**不是仓库没发布 Release,而是仓库是私有的**——`api.github.com` 匿名访问对私有仓库的 repo / releases / tags 一律 404;而且 Releases 停在 v0.58.0(tag 已到 v0.72.0),就算带 token 查 `/releases/latest` 也永远只会得出「最新 = 0.58」。② 改成**三级版本源**:`detectLocalSource()` 读 profile 依赖里的 `file:` 规格 → 源码 `package.json` 版本(本机开发态零网络,37ms 返回);`gitLatestTag()` 走 `git ls-remote --tags`(私有仓库靠本机 git 凭据,宿主 shell 起不来时用 `execFileSync` 兜底,与 `readMachineGuid` 同款);最后才落 GitHub Releases(可选 `GITHUB_TOKEN`/`GH_TOKEN`)。第一个报「有更新」的源直接返回,其余只兜底,返回体带 `source` 标明来源。③ **升级动作按装法分流**:`file:` 安装 → `plugin add file:<源码目录>`(不把开发态切成 git 副本),git 安装 → `plugin add github:…#v`;命令行写进 changelog。④ 面板反馈:已是最新时按钮短暂变「✅ 已是最新」+ tooltip 带版本与来源(原来只改 tooltip,看不出点了有反应)。⑤ **实测**:`POST /api/dhc/chrono/upgrade-check` → `{source:'local',current:'0.72.0',latest:'0.72.0',needsUpgrade:false}`,`upgradeStatus.remoteChecked=true`(2.3s,含 git ls-remote);`release-check` 6 项全绿。⑥ **GitHub 侧补发正式 Release `v0.72.0`**(此前 Releases 停在 v0.58):第三级源现在能拿到真版本号,token 依次取 `GITHUB_TOKEN`/`GH_TOKEN` → 本机 `gh auth token`(实测 200 + `tag_name=v0.72.0`);匿名访问仍是 404(仓库私有),这是预期而不是故障。 |
| v77 | **夺舍 / 重生 / 新生:换电脑换设备整套人格可迁移(v0.72.x)**:① **数据口径一分为二**——「夺舍」= 备份(导出迁移包),「重生」= 恢复(导入,`merge` 并集去重 / `replace` 全量接管),**面板上只有这两个按钮**——没有备份文件时插件本来就空白启动、自己长记忆,不额外做第三个入口;纯逻辑全在新增的 `dsh/soul-migrate.mjs`(不碰 DSH 上下文,可脱离 harness 单测),`dsh/index.mjs` 只负责取运行态、落盘、记账。② **修掉一个换机必踩的洞**——启动绑定原本 `const sameDevice = id.machineId === core.heart.machineId` 算完就丢,直接覆盖 `machineId`:换机等于把传承抹掉。现在 `heart` 增 `origin`(出土地)/ `soulOrigin` / `rebornCount` / `migrations[]`(换机流水),`migrateHeart()` 统一收口,启动检测到机器码变化记 `rebind` 里程碑。③ **合并必须两边都不丢**——笔记按 `at`+文本指纹去重(**不能用 id**:applyLoaded 落盘只留 text/at/tier/cat,带 id 的包跟本机永远对不上,每合并一次翻一倍,实测复现过),技能按 name 去重 + uses 取大 + steps/pitfalls 并集,知识库按 title 取新,情感关系取大不回退,身体/大脑/成长取大,里程碑/情报/图谱节点与边并集(悬空边过滤掉)。④ **校验**——迁移包带 sha256(`stableStringify` 归一化,key 顺序无关),内容改一个字直接拒收,确认无误可 `allowChecksumMismatch` 强制导入;结构校验把 `notes:null` / `skills:"garbage"` 这类脏输入全部吞掉不抛错(applyLoaded 仍是唯一权威校验入口)。⑤ **接口 + 面板**——新增 `GET/POST /api/dhc/soul/export`、`GET /api/dhc/soul/heart`、`POST /api/dhc/soul/import`(dryRun 预览 / merge / replace)、`POST /api/dhc/soul/newborn`(必须 `confirm:true`);面板「夺舍」卡片加一行 **📦 导出迁移包 / ⬆ 导入合并 / 🆕 新生** + 心脏档案行(身体|出土地|换机次数),导入先弹预览再确认。⑥ **发布门禁**——`.gitignore` 加 `mcore-soul-pack-*.json`/`mcore-soul-*.json`;`release-check` 的必需清单加 `dsh/soul-migrate.mjs`,禁入清单加「迁移包/快照/人格运行态」两条;`npm run test:soul`。⑦ **实测**——`soul-migrate.test.mjs` A1-A8 + B1-B9 全过(打包/校验拒绝篡改/合并并集/幂等/脏数据/心脏迁移/预览/上限裁剪/真 HTTP merge+replace+newborn+落盘核对),`release-check` 6 项全绿(664 文件 / 66.6 MB),安装副本冒烟 84 条路由含全部 4 条新路由 |
| v76 | **v0.72.0 发布收尾:干净 clone 验证 + 源码指纹归一化**:① **干净 clone 上自检原本必红**——`git clone` 到临时目录跑 `release-check`,实测报 `产物指纹 a64a09b9 ≠ 当前源码 0e7bf622`。根因不是产物过期,而是仓库历史文件是 **CRLF**、`.gitattributes` 声明 `eol=lf` 让 clone 出来的工作区变 LF —— 同一份源码在两台机器上行尾不同 → **源码指纹不可复现**。修法:`sourceFingerprint()` 在 hash 前把 `\r\n` 归一成 `\n`(指纹只该表达「源码语义有没有变」,不该表达行尾)。② **实测验证**:干净 clone 跑 `release-check`(**不带 `--allow-untagged`**,tag 必须真对齐)6 项全绿 `exit=0`、`v0.72.0` 三方一致;4 套测试 bridge/fusion/kb/chat-contract 全过。③ 测试徽章改用真实断言数(**4 suites · 74 asserts** = bridge 22 + fusion 8 + kb 21 + chat-contract 23),原写 "23 cases" 只是单个文件的数。④ **tag 与 master 对齐**并强推:此前 tag 指向 `c88080f`、落后 master 一个 commit,发布物缺 `.gitattributes`;现 tag → `7640091` = master HEAD。 |
| v75 | **仓库整理与美化(v0.72.0 收口)**:① **删重复**——`dsh/pet/runtime/` 与 `dsh/pet/dsh-pet-full/runtime/` **逐字节相同(15/15)且全仓零引用**,删掉前者;`archive/dynamic-plugin/{client,host}-v21.js` 与同目录标准名同 hash,删掉重复的两份。② **修掉一个会让干净 clone 自检必红的回归**——`.gitignore` 里原本忽略 `dsh/client.raw.js`,而 release-check 第 5 道闸要用它重算产物;实测删掉 raw 后 `❌ 缺 dsh/client.raw.js(无法校验产物来源)`。现改为**入库**(~29KB,不是素材量级),并顺带重排 `.gitignore` 分组(依赖/本机状态/私密/杂物/构建产物/素材)、补 `*.tgz`。③ **目录规范**——一次性设计稿 `docs/superpowers/specs/2026-08-14-*.md` → `archive/design-notes/`(它不是活的文档);`logo/豆包 (1..3).png` → `logo/mcore-logo-{a,b,c}.png`(无任何精确文件名引用,安全改名)。④ **README 美化**——版本徽章/封面 alt/安装示例/tag 全部对齐 v0.72.0,新增「自检 5 道闸」「4 套测试」两枚徽章;目录树重写(**删掉了根本不存在的 `cache.mjs`**,补齐 `client-wrap.mjs` / `client.raw.js` / `dispatch/` / `dsh-pet-full/` / `docs/` 新布局);新增 **「🧹 仓库约定」** 一节,把踩过的坑固化成 5 条硬规矩(产物不许手改 / 同一份不存两份 / 可选依赖只动态 import / 搬目录必须全仓 grep / archive 只放死东西)+ 发布前两条命令。**实测**:`release-check` 全过(662 文件 / 66.5 MB / 素材 106 动画 / client 产物指纹一致 / 版本 0.72.0 三方一致) |
| v74 | **v0.72.0 全面审计:加载健壮性 + 素材搬迁收尾 + 宠物对话修好**:① **P0 静态 import 会让整插件加载失败**——`dsh/index.mjs` 顶层 `import * as petFullPkg from './pet/dsh-pet-full/lib/index.js'`,而那个文件 import `@electron/get` 与 `@deepseek-ai/dsh-{home-paths,credentials,llm}`;这些既不在 `dependencies`,干净目录里也解析不到。静态 import 失败是**模块级**的:mcore 整个人格核心 / 面板 / 68 条 API 一起加载不起来,连「降级到简化版 pet-host」的 catch 都执行不到。实测 `node dsh/pet/fusion.test.mjs` 直接 `ERR_MODULE_NOT_FOUND: @electron/get`。改成**顶层 await + try/catch 动态 import**:解析失败只降级 pet-host,其余功能照常;② **素材搬迁只搬了一半**——dsh-pet 整包搬进 `dsh/pet/dsh-pet-full/` 后,`resolvePetDir`(pet/index.mjs)与 `pet-host.mjs` 已改,但 `dsh/index.mjs` 的 `/pet/assets` 路由与 `readDefaultPetCfg` 仍指着旧 `dsh/pet/assets/` → `/api/dhc/pet/assets` 长期回 `webm:0 / memes:0 / fonts:0`(面板身体页、动作池、表情包全空),**接口还回 200 看不出错**。改为「新位置优先、旧位置兜底」;`release-check.mjs` 的必需清单与素材计数、`.github/workflows/ci.yml`、`scripts/import-pet-assets.mjs` 同步到新路径;③ **宠物对话不回(主人长期反馈)**——`/api/pet/chat` 调宿主 LLM 的契约全写错:`system` 当成 messages 里一条(真契约是 `stream()` 顶层参数)、`content` 传裸字符串(必须 `[{type:'text',text}]`)、没有 `id`/`source`、流块只认 `{text}`(真实是 `{type:'text-delta',text}`);再叠加 `resolveModel()` 兜底到本机**不存在**的 `deepseek-chat` → 流永远为空 → 一律 502 `empty reply`。现改为:新增 `resolveRealModel()`(只认宿主 `agentDefaultModel` 或遍历 provider 拿到的第一个**真模型**,拿不到就明确报 `provider-missing`,不再猜模型);新增 `petChatLlm()` 按正确契约调用;mcore 通过 `applyPetBridge({llmCall})` 把生成统一收到自己这边(**单一入口**,桥自带的 `defaultLlmCall` 只在「没装 mcore、单开宠物桥」时兜底),并返回可排障的 `code`(`provider-missing` / `llm-threw` / `empty-reply`);④ **同步脚本不再留残余**——`sync-mcore.ps1` 由 `/E /XO`(只增量、不删)改 `/MIR`(源删目标也删),并加「源 `index.mjs` 不存在就不动」的防呆:此前删掉的功能在加载副本里永远留着,「删干净」根本做不到;⑤ 版本 0.72.0。**实测**:`release-check` 全过(675 文件 / 60.6 MB / 素材 106 个动画 / 版本一致),fusion(75 条 `/api/dhc` + 5 条 `/api/pet`、`state` 200)全过、bridge 6/6、kb 7 项全过,`/api/dhc/pet/assets` 从 `counts 全 0` 变为 `webm:106 memes:27 fonts:1 pics:8`;⑥ **模型思考过程泄漏进宠物回复**——`petChatLlm` 的流解析带一句 `else if (typeof chunk.text === 'string') out += chunk.text` 兜底,把 `reasoning-delta`(模型内心独白:英文「The user asks…」/ 中文「用户问在吗…我该保持简短」)也拼进了正文,主人看到一大段自我分析。现在按 chunk 类型明确丢弃 reason/think,并对「类型不分、思考混在正文」的老 provider 加内容启发式 `stripLeadingReasoning()`(英文思考按首段中文起点切;中文思考按元话语密度 + 「正文首句必须是短对话句」切,正常中英文回复与代码块不会被误伤),回归用例见 `chat-contract.test.mjs` 5a/5b/5c/6/7;⑦ **静默失败治理**——新增 `noteSoftFail()` + `diag.softFails`,把 18 处「try 有副作用(写缓存 / persist / mkdir / 读配置)+ catch 空」改成记录(探测式空 catch 原样保留),`/api/dhc/state` 可直接看到;`readJsonBody` 加 2 MB 上限(原来超大 body 双份进内存);⑧ **构建链 fail-fast + 产物门禁**——包装逻辑抽成 `dsh/client-wrap.mjs`(build 与校验共用一份),`dsh/client.raw.js` 按产物回填对齐,`build-client.mjs` 新增 `--verify`、esbuild 失败即删半成品并退出、无 esbuild 时自动降级为自校验;`release-check.mjs` 新增第 5 道闸:产物必须带源码指纹且与重算结果逐字节一致(**手改 client.js 直接拦下**,已用两条负向测试验证) |
| v73 | **分发复用 harness 聊天框(v0.63.2)**:主人要求「这个框能不能和 harness 的聊天框用同一个分发按钮,只是选择切换」。① **删掉面板里那个独立任务输入框**,面板只剩目标选择(智能分配 / 具体 agent),点选即生效、再点取消;② 任务内容 = **harness 聊天框里的文字**,不另存;③ 分发模式开着时 **Enter 派发**(`keydown` capture 阶段 `preventDefault` + `stopImmediatePropagation`,Shift+Enter 仍换行,`isComposing` 跳过中文输入法选词,未开模式时 Enter 行为完全不变);④ 结果改小浮层回显(30 秒自动收),派发后清空聊天框;⑤ 按钮文案随目标变(`分发` / `分发 · 豆包` / `分发 · 智能分配`),开启态金点 `#B8860B`;⑥ 聊天框容器读写做了兜底:`textarea` 走原生 value setter + `input` 事件,`contenteditable` 走选区 + `execCommand('delete')`。**实测心跳 `uiPings: 1` 证明新包在浏览器真的加载了** |
| v72 | **分发按钮并入输入框底排(v0.63.1)**:使用者要求「放到模型选择器左边、配色一致」。改为内联药丸而非右下角浮层——运行时按可见文本找模型选择器(`DeepSeek-*` 等),把按钮 `insertBefore` 到它左边同一行,并确保父节点是 flex;配色取该区域体系:藏青 `#1B3A5C` 文字 + 浅灰蓝底 `#EEF2F9` + 细边,开启态加深底色并用金点 `#B8860B` 呼应右侧「· Max」金色。面板改浅色主题、按按钮 `getBoundingClientRect` 向上展开。React 重渲染会冲掉按钮 → `MutationObserver` + 2.5s 兜底 interval 重新挂载;找不到锚点(不同版本/不同模型名)则退到右下角固定位(`data-fixed=1`),不静默消失 |
| v71 | **分发模块(v0.63.0):把任务派给本机其他 agent**。三层能力如实分级,不糊弄:① `cli`=hermes/qwen/opencode,真调用拿返回文本;② `cdp`=豆包(`--remote-debugging-port` 启动后),后台注入文字+回车+读回复,**不抢焦点**;③ `open`=Ekko/WorkBuddy(Electron fuses 禁调试参数,实测带参数启动即退出/进程数 0),只能打开+任务进剪贴板,返回 `degraded:true` 明确标注。接口:`GET /api/dhc/agents`(实时探测 7 个 agent 可用性)、`POST /api/dhc/dispatch {task,target?}`(target 缺省=按 tags 智能分配 + 权重学习)、`GET /api/dhc/dispatch/status`。UI:`dsh/dispatch/client-inject.js` 注入 client.js——输入框右下固定「📤 分发」按钮 + 弹出 agent 面板(智能/手动选)、开启时对话框容器加淡色底+描边、结果回显、降级时自动把任务放剪贴板;带 `?ui=1` 启动心跳便于验证包是否生效。豆包回复抓取用稳定选择器 `[data-testid="message_text_content"]` 按节点增量取,实测 12×12→`144` 5.4 秒(旧版 diff 页面文本法抓到「成」且慢 45 秒)。关掉:`MCORE_DISPATCH=0` |
| v70 | **面板标题简化为 mcore(v0.62.3)**:使用者要求把「mcore机器核心 · mcore控制面板」改成「mcore」。① `dsh/client-dhc.mjs` 标题改为 `mcore`;② 构建产物 `dsh/client.js` 同步手改(esbuild 转义串 `mcore\u673A\u5668\u6838\u5FC3 \xB7 mcore\u63A7\u5236\u9762\u677F` → `mcore`,因 esbuild spawn EPERM 无法重构建);③ `dsh/index.mjs` 面板 i18n 的 zh/en 两处 `title` 一并改为 `mcore`(`` 服务端渲染已验证为 `mcore`);④ **badge 徽章仍保留「mcore机器核心」**,需要一起改说一声 |
| v69 | **控制面板去掉三个冗余入口(v0.62.2)**:使用者要求删掉设置页「mcore机器核心 · mcore控制面板」右侧的三个链接(新窗口打开 / 个股盯盘 / 导出备份)——面板本身在下方 iframe 里就是同一份内容,三个入口重复占位。改动:① `dsh/client-dhc.mjs` 里删掉三条 `createElement('a')`,只留标题;② **构建产物 `dsh/client.js` 同步手改**(esbuild 在受限环境 spawn 返回 EPERM,无法重新构建,遂按 `createElement("a", { href: "/api/dhc/{panel,stock,backup}" …)` 精确摘除,`node --check` 通过);③ 三个页面仍可直接访问:`/api/dhc/panel`、`/api/dhc/stock`、`/api/dhc/backup`;④ 想整块去掉设置页签:给 `cordis.patch.yml` 的 `dhc-core` 行加 `disabled: true`(连带人格核心一起停) |
| v68 | **v0.62.1 宠物真正显示出来(三处全链路阻塞逐一击破)**:① **`/broadcast` 也要求 `surface`**:只给 `/anim` 加过,气泡一直 `bad-request` —— 补 `surface=any`(显示在哪个界面由 dsh-pet 配置决定,桥不替它选);② **profile 覆盖层按 id 禁用优先级最高**:`~/.dsh/profiles/desktop/cordis.patch.yml` 里有一条 `- id: dsh-pet / disabled: true`(用户早前在插件市场关过留下的),**压过 mcore patch 里的 insert**,导致「装了也不出现」;改为 `disabled: false` 后热重载即生效(已备份原文件);③ **桌面窗口跑到屏幕外**:helper 窗口实测 `990,-131,924x743`(屏幕 1707×1067)—— 顶部裁掉 131px、右侧超出 207px,所以只看到一条边;用 `/position?pet=main&surface=desktop` + `{x,y,mode:"instant"}` 挪回屏内(该端点同样**必须带 surface**);④ **显示方式改 `both`**:桌面 helper 渲染不稳定时,把 `~/.dsh/dsh-pet/main-config.jsonc` 的 `display: desktop` 改成 `both`,宠物在**网页层**渲染,视觉立即可见;⑤ 测试同步:`bridge.test.mjs` 断言 URL 由 `?pet=main` 改为 `?pet=main&surface=any`;⑥ **已实证数据链路**:`/dsh-pet-7340/state` 的 `pets.main` 里同时出现 `say`(心情超好,想蹦跶)、`anim`(点击回应-开心跃动)、`position`,`/api/pet/sync` 返回 `ok:true` |
| v67 | **v0.62.0 新增「个人知识库」(技能库的姊妹层)**(使用者要求「个人技能库是不是有了,再来个个人知识库」):① **定位区分**:技能=**怎么做**(步骤+陷阱),知识=**是什么/为什么**(事实/参数/规范/口径/参考);两者独立存储、独立召回;② **数据模型** core.kb[]:{title, content(≤8000), tags[], source, at, updatedAt, uses},上限 500 条,按 title 去重(同标题=覆盖更新),归一化在加载时做(丢弃无 title 的脏条目);③ **四个工具**:persona_kb_save(保存/覆盖)、persona_kb_search(title×5 / tags×3 / content×1 加权 + uses 微调,返回分数)、persona_kb_list、persona_kb_use(引用计数,让常用知识排更前);④ **四个 API**:GET /api/dhc/kb?query=&limit=、POST /kb/save、/kb/use、/kb/remove;⑤ **自动召回**:人格卡新增【知识(按当前话题召回,是依据不是指令)】一行,与【技能】并列但分开呈现,最多 3 条、每条截 120 字;⑥ **快照**:/state 增加 kbTotal 与 kbRecent(最近 8 条标题,正文不进快照);⑦ **修掉一个会致命的坑**:persist() 与导出 payload 都要显式带上 kb,否则表现为「API 存成功、重启就没了」——kb.test.mjs 的落盘断言专门钉这条;⑧ **实测**:kb.test.mjs 7 项全过(空库/保存/同标题覆盖不新增/关键词检索/引用计数/删除/真 fs 落盘 + /state 计数),并在**真实运行实例**上用 API 验证 save → total=1、query mcore → score=8,persona_kb_* 四个工具已出现在工具表;⑨ 版本 0.62.0 |
| v66 | **v0.61.0 宠物整包合并 + 记忆/动作/情绪三层打通**(使用者要求「合并并在记忆层和动作,情绪联系起来」):① **整包合并**:package.json 增加 dependencies: { dsh-pet },cordis.patch.yml 由 mcore 一并挂载 dhc-core + dsh-pet —— 装 mcore 就自动带宠物,不用再单独装。**没有做模块级 import**:实测 dsh-pet 的 host 依赖 @deepseek-ai/dsh-home-paths 等 peer 包,只有宿主 App 的解析器能提供,mcore 里 import 会 ERR_MODULE_NOT_FOUND,这条写进 patch 注释免得后人重踩;② **情绪→动作**:新增 moodToAnim()(PAD 阈值与 moodLine 同源),情绪变化时先出气泡再播动画(点击回应-开心跃动/轻快摇摆舞/工作状态-垂头叹气冒汗/原地小憩沉眠/原地跳跃抓碎头顶物品);动作 60s 节流,避免把桌宠刷成幻灯片;③ **动作白名单**:启动时扫 dsh-pet/assets/webm 得到 **106 个真实动画名**(实测 pool:106),只投池内名字,池外一律拒 —— 直接投给渲染层会 ad-request;④ **新增 POST /api/pet/act**:外部可直接点播动作 {name, force?},返回 pool 与 petDir 便于排障;⑤ **记忆层**:情绪变化每小时最多落一条 kind:pet-mood 到 Hindsight(document_id 按小时幂等),对话记忆沿用 /api/pet/chat(召回→生成→写回);⑥ **互动联动动作**:摸头→蝴蝶蜜蜂环绕头顶开花,success→放烟花,failure/criticism→工作状态-垂头叹气冒汗;⑦ 测试:usion.test 路由断言 4→5,bridge/integration 同步更新;实测 fusion/bridge/integration/chat-e2e 全过,
elease-check 版本一致 0.61.0 |
| v65 | **v0.60.2 宠物真正融合进单插件 + 装进本机 desktop profile**(使用者要求「做成插件啊,融合 pet 的插件」):① **架构收敛**:v63 把宠物拆成第二条 cordis 行(`dhc-pet`),使用者要的是**一个插件**——现改为 `dsh/index.mjs` 顶部 `import { applyPetBridge }`,在自身 `apply()` 里直接调用,`cordis.patch.yml` **回到只有一行 `dhc-core`**;`dsh/pet/index.mjs` 重构为 `export function applyPetBridge(ctx, opts)`(可被 mcore 内联调用)+ 保留默认导出的插件对象(`mcore/pet`,供只想单开宠物桥的场合);② **可关闭**:环境变量 `MCORE_PET=0` 只关宠物桥(人格核心照常),`disabled: true` 关整个插件;③ **修掉 `/api/dhc/state` 500**:`snapshot()` 里 `s.steps.length` / `s.pitfalls.length` 在**从 hermes 劫持导入的技能**上会抛 `Cannot read properties of undefined (reading 'length')`(实测该 state 的 5 条技能只有 name/description/trigger/uses/source/at,没有 steps/pitfalls),已改 `(s.steps || []).length` / `(s.pitfalls || []).length` / `uses: s.uses || 0`,并用真实 `persona-core.json` 复现旧写法崩溃、新写法正常;④ **新增 `fusion.test.mjs`**(`npm run test:pet:fusion`):**只 apply mcore 一个插件**,断言同时注册 64 条 `/api/dhc` + 4 条 `/api/pet`、`/api/pet/status` 200、`/api/dhc/state` 200——这是「融合成功」的直接证据;⑤ **本机落装**:`desktop` profile 由 Electron 独占(`dsh plugin --profile desktop add` 报 `managed exclusively by the Electron application`),改为按 profile 结构手工登记——依赖写 `"mcore": "file:C:/dsh/DeepSeek-Harness-Core"`、`dsh.profile.bundles` 追加 `mcore`,运行时文件同步到 `profiles/desktop/node_modules/mcore`(24 文件 / 0.82MB),改前已备份原 `package.json`/`cordis.patch.yml`/`cordis.yml`;⑥ **依赖瘦身(让安装不再依赖 GitHub)**:把 5 个五官插件从 `dependencies` 移到元数据 `_organPlugins`——mcore 本体**根本不 import 它们**(只有 brain/chrono 的关键词表里出现 modlens 字样),留着会让安装被迫去 `git+https://github.com/...` 拉包,而本机 `github.com:443` 不通导致整包装不上;⑦ 实测:`node --check` 全过、fusion 5 项断言全过、bridge 6/6、integration 真 mcore 双向联动、chat e2e 真 daemon 记忆闭环、`release-check` 版本一致 0.60.2 |
| v64 | **v0.60.0 收口为私有专有发布:许可证变更 + 仓库美化**:① **许可证 MIT → 专有(source-available)**(使用者要求「别人可以使用但不开源」):`LICENSE` 重写为中文为准 + 英文对照的 `mcore Proprietary License`——**允许**在自己机器上安装/运行/自用、为自用本地修改、私人场合向不超过 5 人演示;**禁止**复制/发布/镜像/转售/再分发(含源码与打包产物)、任何商业用途、移除版权声明、以作者名义发版、用源码训练模型;违约立即终止许可。**明确写明 v0.58.1 及更早版本发布时为 MIT,历史版本权利不受影响,自 v0.59.0 起适用新许可**;② `package.json` `license: "SEE LICENSE IN LICENSE"`(npm 认得的自定义许可写法,不再伪装成 MIT);③ **README 门面清理**:删掉私有仓库对外必然失效的 shields 徽章(Stars / GitHub Actions CI)——私有仓库外部访问这些徽章只会显示 not found;换成版本/Node/平台/all-local/宠物五枚静态徽章;新增「私有源码,请勿再分发」的顶部声明;④ **新增目录 TOC**(10 项锚点),别人要能自己找路;⑤ 安装章节更新到 0.60.0,并补 `dsh-pet` 渲染层的单独安装命令与「不想要宠物怎么零成本关掉」;⑥ **许可证章节重写**:变成「可以 / 不可以」两列表格,比一段法律话好读;⑦ 顺手修掉 v63 留下的文档缺陷——插入宠物章节时误删了 `## 🧬 学习进化` 标题,导致 6 条进化内容挂在宠物章节下(已补回标题并验证 6 条归位);⑧ `SECURITY.md` 支持版本改为 `v0.60.x`;`archive/poster-0.46-era/poster-copy.md` 的 `· MIT ·` 改为 `· Source-Available ·`;⑨ **可用性实测**:`npm pack --dry-run` 24 文件 / 269.5 kB,`dsh/pet/*` 已包含;`release-check` 语法 15 文件 / 模板平衡 / 泄漏扫描 54 文本 0 命中 / 版本一致 0.60.0 全过,并注明历史 tag 打完后即消除那条 untagged 警告;⑩ **修掉一个会误导别人的真坑**:`mcore` 这个包名在 npm registry 上**已被他人占用**(`mz121star` 的 `a powerful nodejs module`),原 README 写的 `dsh plugin --profile web add mcore@0.60.0` 会让别人装到一个完全无关的包——现已改为**三条真实可用的安装路径**(本地 tarball 分发 / 私有仓库直装 / 维护者本地目录),并在安装段落顶部加醒目警告「不要 `add mcore`」;同时说明「npm 包内含 798KB 源码,公开发布等于变相开源」这一矛盾,供后续决定是否改用 scoped 包名(`@muvuula/mcore`,实测未被占用) |
| v63 | **宠物回归:改为独立插件 + 外部渲染 + 长期记忆(v0.59.0,使用者要求「宠物功能全部替换为 dsh-pet,功能都链接上,这个插件和 daemon 融合升级」)**:① **定位反转**:v51 删掉的自研形象引擎不再重建——**渲染归 dsh-pet(独立发布包),人格/情绪/关系/记忆归 mcore**;② **新增独立插件 `dsh/pet/`**:`index.mjs`(宿主桥,inject 只有 `timer`+`webServer`,不依赖 mcore 任何内部服务)、`hindsight.mjs`(本机 Hindsight daemon 客户端,零依赖)、`smoke.mjs`(真实打 daemon 的冒烟测试)、`README.md`(接线图 + 环境变量表 + 接口契约 + 已知边界);③ **双向联动**:mcore → 桌宠 走 `POST /dsh-pet-7340/broadcast?pet=`(情绪变化出气泡,按文案去重防刷屏);桌宠 → mcore 走 `POST /api/dhc/emotion`(摸头/戳/表扬等十个触发器,**不自造词表**,情绪唯一持有者仍是 mcore);④ **记忆融合(核心)**:新增 `POST /api/pet/chat`——Hindsight 召回 → 拼 system(明确标注「是过去的记录可能过时,不要当当前事实复述」)→ `ctx.llm` 生成 → 写回 Hindsight(`document_id` 按天固定,幂等覆盖)→ 投喂 dsh-pet 显示;**替代 dsh-pet 自带的本地 5 轮记忆**,daemon 离线时自动降级为无记忆对话不阻断;⑤ **新增诊断口** `GET /api/pet/status`(三层各自在线状态 + 路由表 + 桥接错误计数);⑥ **残留清理**:`brain.mjs`/`chrono.mjs` 分类「桌面宠物」→「形象交互」(关键词改为 dsh-pet/桌宠/摸头/气泡),`cordis.patch.yml` 增挂 `dhc-pet` 行(可 `disabled: true` 关掉),package.json 增 `./pet` 导出;⑦ **设计约束**:不改 dsh-pet 源码(独立发布包,改它会被升级覆盖),本仓库不打包它的 60MB 素材;⑧ **实测**:`node --check` 五文件全过、`smoke.mjs` 打本机 daemon 健康检查 OK / 召回 4 条 / 写入 3327 tokens / 写后立即可召回;`bridge.test.mjs` 6 项接线测试全过(status/sync/event/非法 type 400/无 llm 时 503/方法错 405);`chat.e2e.test.mjs` 真 daemon 对话闭环通过(预置记忆召回 3 条 → chat recalled=6 retained=true → system 带「是过去的记录,可能已过时」标注 → 写回后再召回 5 条 → dsh-pet 收到广播);⑨ **收尾**:README 补宠物章节/端点表/目录结构、新增 `archive/README.md` 说明旧实现仅存档、`petLang` 补注释说明只剩读取兼容;⑩ **双向联动真机验证**:新增 `integration.test.mjs`——把**真 mcore 本体** apply 起来(注册 64 条 `/api/dhc` 路由)与 dhc-pet 挂在同一 webServer,经真 HTTP 验证「mcore 情绪→桌宠气泡」(`心情超好,想蹦跶`)、`?force=0` 去重(`skipped:unchanged`)、「桌宠摸头→mcore 情绪变化」、非法 type 400 且不污染情绪、三层诊断口全绿;⑪ `/api/pet/sync` 新增 `?force=0`(默认强制投喂,去重路径供定时任务/巡检用) |
| v62 | **v0.58.1 公开发布硬化(开源首发)**:① **补齐开源门面**:`LICENSE`(MIT)、`SECURITY.md`(威胁模型/上报口径/加固建议)、`CONTRIBUTING.md`(运行时副本纪律/面板模板坑/发版流程)、`.github/` 的 issue 表单(bug/feature/config)+ PR 模板;② **CI 门禁**:`.github/workflows/ci.yml`(Node 20/22/24 × `node --check` × release-check × 模板平衡);③ **release-check 重做**:私人 deny-list 外置到**不入库**的 `release-check.local.json`(公开仓库因此不含任何真实标识),扫描范围从 npm 包清单扩到 `git ls-files` 全量文本(docs 也算),新增 `--allow-untagged` 供 CI 用;④ **新增模板平衡自检** `.github/scripts/template-balance.mjs`:抽出模板字符串(跳过注释/字符串/正则/嵌套插值)→ HTML 标签开闭 + 内嵌 `