纯 Node.js(≥18.17)零运行时依赖,装完即用。好用=任务续跑、项目记忆、长会话不丢上下文;省钱=缓存命中计价(1/30)、Batch 半价、避峰调度、自动路由 pro⇄flash;省心=一键诊断、三平台 CI 全绿、零构建开箱即用。省钱是刻进内核的系统设计,不是营销话术。
MingDao 品牌主站 · 道法AI —— 传统文化数字化展示平台 ↗
# 一行安装(自动装 Node)
curl -fsSL -o /tmp/mingdao-install.sh https://gitee.com/MingDaoTCM/MingDao-harness/raw/main/install.sh && bash /tmp/mingdao-install.sh gitee
装完 mingdao init 配置 DeepSeek Key,输入 mingdao 开始对话;npm 用户升级 npm update -g mingdao-harness;Windows 用户解压后双击 install.bat。
内置 WebUI 的 Electron 桌面应用:托盘常驻、窗口记忆、权限收紧、自动更新。安装即用,mingdao init 首次配置后即可对话。四平台安装包全部官网直连下载(国内极速,不走 GitHub)。✓ v0.1.67+ 桌面版启动后自动提示更新(官网 feed 已刷新);更早版本请手动下载一次。
安装后从开始菜单启动;首次运行若出现 SmartScreen 提示,点「更多信息 → 仍要运行」(未签名构建)。
sha256 c1ff904c703b63f95bfc02a09db3c397ae60f30b653414794d296fbccaae8e8f
✓ v0.2.5 起 macOS 版已由 Apple Developer ID 签名并完成公证——下载后双击直接打开,Gatekeeper 正常放行,无需任何绕过操作。若你之前下载的旧版(未公证)仍被阻止:删除旧应用,到本页重新下载最新版本即可。
arm64 sha256 e96c655fab56fedfd2f4f3dfbc01ec25e9ac66f11ad8fd059853c0c3c59d31f5
x64 sha256 b0f27863342250f7f7387c4580e962a0e1d63a7687433ebc4364dbffa70dc3d9
deb:sudo apt install ./mingdao-0.6.21-amd64.deb;AppImage:chmod +x 后直接运行。
deb sha256 05fbbc7cda45c88e52608053b5184d5e8f6c8e6ed8f25d28ad96ffd006f14832
AppImage sha256 98c52ffa31792eae1f7c786bd9eee6de4644afb6a57f3244e5b2ee345f25fe8b
全部安装包由 CI 打 tag 时自动构建,官网同域直出、国内直连极速;桌面版自动更新走官网 feed(/updates/latest*.yml)。
📈 累计下载 — 份 · 今日 — 份
(历史版本累计 · 每 5 分钟更新 · 按「IP × 文件族 × 日」去重,已排除自动更新与爬虫,故为下限估计)
三步完成安装;Windows 解压后双击 install.bat(自动经 winget 装 Node)。
上方四选一:Gitee/GitCode/GitHub 一行安装(自动装 Node,无管理员权限自动装到 ~/.local/bin,仓库常驻、mingdao update 一键自更新);npm 全局(已有 Node ≥18.17 时最快,npm i -g mingdao-harness,升级 npm update -g)。
mingdao init 交互式配置 DeepSeek(API Key 独立存 600 权限凭证库,绝不进 config.json/仓库);模型列表以官方 /models 线上名单为准,新模型发布自动出现。
mingdao 进 TUI 对话;mingdao web 一键 WebUI(PWA 可装桌面,多任务并行);VS Code / JetBrains 插件开箱即用;mingdao schedule add 定时任务。
先用起来,再进阶。
mingdao web 一键启动:流式思考实况、工具卡片、权限确认弹窗、会话管理、全部设置面板。
mingdao 终端对话:/plan 先计划后执行、/compact 压缩、/memory 长期记忆、/cost 分账、Tab 补全。
VS Code 侧边栏与 JetBrains 工具窗深度集成,选中代码直接发问。
mingdao run 后台任务、schedule add 定时/链式依赖,支持 --offpeak 避峰执行。
架构干净、安全默认、测试真实存在——三平台 CI 全绿,1050+ 断言随版本回归。
SSE 解析、BPE tokenizer、MCP 客户端、HTTP 服务器、云同步全部只用 node: 内置模块,装完即用。
缓存命中计价 + 仪表盘、峰谷计价(周末全天低价)、Batch 半价、避峰调度、费用护栏。
14 内置常驻 + 22 可安装技能库;线上 registry 逐文件 sha256 防篡改,渐进披露只注入名称。
MCP 客户端(9 个生态预设一键接入)、Hooks 钩子、自定义 Provider 模块、自建企业内 registry。
跨设备会话同步、分享码协作、冲突三选一绝不丢数据;服务端零依赖单文件即可自建。
权限三档 + 工具级规则、bash 沙箱、WebUI 令牌 + Host 白名单、审计日志、凭证 600 隔离。
超预算自动压缩(80% 触发、压到 60%),早期段落压成摘要注入,前缀字节稳定保缓存命中。
增量索引全文检索(中文 bigram 分词);WebUI 会话级工作空间,多任务并行互不串目录。
这一版是 MingDao Harness 自 0.1.0 以来最大的一次定位升级:垂直产品 × 开放内核——保持 DeepSeek 省钱 Coding Agent 的垂直深度,同时把内核正式开放给开发者:不改一行源码,定制你自己的智能体。
一个声明式 JSON = 系统提示 + 工具白名单 + 权限 + 模型 + 参数。项目级 .mingdao/presets/、用户级 ~/.mingdao/presets/、内置三层遮蔽;字段严格校验,拼错直接报错。
registerTool({name, schema, run}) 程序化注册,或 config.tools 声明式 shell 命令包装(参数经环境变量传递,杜绝注入)。自定义工具与内置工具同链路:权限门控、审计、省钱 schema 瘦身、预设白名单全部生效。
import { createAgent, createProvider, registerTool } from 'mingdao-harness'——把 MingDao 嵌进你自己的程序。24 个 @stable 导出有契约测试锁定,minor 版本内向后兼容;docs/DEVELOPER.md 三分钟上手。
预设声明工具白名单后,名单外工具对模型不可见、被调用也会硬拦并回填拒绝——安全边界随预设走,定制不改安全默认。
只读审计 / 代码审查开箱即用上下文窗口感知预算(75% 舒适区)、分层超时(慢 prefill 不被误杀)、边缘强制压缩——本地小模型长任务不中断,数据不出门。
本地部署零门槛MIT 开源,GitHub / Gitee / GitCode 三平台镜像内容一致;CHANGELOG 全程公开,省钱基准可复现(docs/SAVINGS-BENCHMARK.md)。
开源透明,无黑箱v0.6.0 补齐「确定性③:行为确定性」——让私有化 / 受监管场景能自己回答:这个结论是怎么来的、花了多少钱、数据有没有出门。约束(①)与成本(②)已在 v0.5.0 交付。
一次回合一个账本,统一记录八类事件:回合开始 / 模型轮次 / 工具调用 / 工具结果 / 约束触发 / 权限决策 / 费用 / 回合结束。mingdao ledger show/export/verify——导出即已脱敏(密钥 + 私网 IP + 家目录),哈希链能发现改行与删行。
mingdao ledger replay 按当前权限/约束栈重判历史调用,输出四类差异:今天会被红线拦住 / 被权限拒绝 / 仍被拦 / 已放宽。now-blocked > 0 时退出码为 1,可直接当下游 CI 门禁——「新红线拦不拦得住历史上那批操作」从此可断言。
config.net.allow 声明允许的出网目标(精确主机 / *.子域 / IPv4 CIDR),mingdao net report 导出本机访问过的外部地址。出口只在一处收口,并逐跳判定重定向(默认跟随 3xx 时 undici 会绕过闸门并把 Authorization 一起带走)。
install.sh --offline 与 install.ps1 -Offline 两侧对齐,完全断网安装(不装 Node、不碰 npm);新增 vllm/ollama/oneapi 预设覆盖国产推理栈与内网网关;本机/内网端点免除「必须有 API Key」的硬校验,公网端点不放松。
零依赖开源框架,持续小步迭代。以下是近期版本的「新增 / 变化」速览,完整日志见仓库 CHANGELOG.md。
| 版本 | 新增 / 变化 |
|---|---|
| v0.6.21 10-19 · 界面重排三步走(每步先出 Electron 截图再进入下一步) |
v0.6.19 回滚之后,界面重排按「小步 + 截图验证」分三步重新上线: ① 顶栏补当前会话面包屑(§3.81):新增 #crumbWs › #crumbSession(工作空间 › 当前会话),复用 .badge、不新增骨架;会话/工作空间/新对话后刷新;工作空间 / 历史会话 / 会话管理 / 任务 / 新对话 / 主题 / 费用等既有入口全部保留;模型/预设/权限本就在 #sessSheet,本步补 #ssPresetSrc(当前值 + 来源 + 仅下一轮);ui-shot 新增 --open 与 sheet.png。② 右栏四标签页(§3.82): #runPanel 内 轨迹 / 子Agent / 任务 / 仪表盘 四个 role=tabpanel;#trajPanel/#subPanel/#tasksPanel/#dashPanel 节点原样搬迁、id 保留、handler 未重写;railTabDisplay()/setRailTab() 只切 display/.on/aria-selected,不重建节点;顶栏「任务」、费用徽标、左栏 🧭/🤖 改为「切标签 + 开右栏」。③ 视觉细节(§3.83):28 个承载信息的选择器 --faint → --dim(暗色 bg 4.92→8.54 / panel 3.76→6.53 / bg3 3.26→5.67,修后达 WCAG AA;token 未动);顶栏 .hdr-right 横向滚动 + 控件收窄,1000px 下 #sessions 从视口外 1055–1153 变为视口内 886–984;右栏标签统一 .seg;会话设置弹层宽 410→400、间距对齐。质量:typecheck 0;smoke 含新增 §153/§154/§155;e2e-local 17 / e2e-web 24 / e2e-schedule 11 / api-contracts 8;变异 batch43 10 + batch44 10 + batch45 14,总数 362 → 376,33 批 376 条全中;doc-lint 全通过;发布树 Electron 截图 1440×900 与 1000×900 各 5 张。 升级须知:顶栏新增面包屑,长会话名在 120px 内截断(完整名在 title);顶栏「任务」/费用徽标/左栏 🧭🤖 现在都会打开右栏并切到对应标签,关闭用右栏「收起」或 ✕;1000px 下顶栏右侧可横向滚动。已知边界(如实登记):设计稿里未做会话分组/副标题、轮次时间戳/权限 chip、折叠动画、toast、980px 图标化侧栏(现为 <880px 抽屉)、「更多 ▾」下拉;1000px 下「任务 / ✎ / 新对话」仍需横向滚动;--faint→--dim 只改承载信息的用法(装饰保留);动态运行文案仍中文(i18n.js 未接线)。 |
| 版本 | 新增 / 变化 |
|---|---|
| v0.6.20 10-19 · 紧急回滚界面重排,恢复 v0.6.18 可用 UI + 新增 Electron 截图工具 |
v0.6.19 的界面骨架在真机翻车,这一版把它整体回滚到已知可用的 v0.6.18: ① 界面回滚(§3.79): src/web/index.html / src/web/app.js 逐字节回到 v0.6.18(git diff 为空);三栏骨架、右栏四标签、设置三列、六类危险操作二次确认、dialog 无障碍、语言切换一并下线。② 保留: src/web/i18n.js(暂不引用,作重建资产)、/api/state.defaults(纯新增只读、向后兼容)、端口治理(listen(0))、本地内存恢复、变异全局锁等非 UI 改进。③ 测试清理:删除 smoke §153、 test/ui-p2.js、batch43-ui-shell 与只跑 ui-p2 的 batch42-ui-p2;变异 369 → 342(32 → 30 批)。④ 新增 scripts/ui-shot.mjs(§3.80):真实 Electron 截图(wide/mid/narrow、暗/亮、mobile),本版起 UI 改动必须先截图自查(docs/DEVELOPER.md §六)。质量:typecheck 0;smoke 156 组;e2e-local 17 / e2e-web 24 / e2e-schedule 11 / api-contracts 8;变异 30 批 342 条全中;doc-lint 全通过。 升级须知:从 v0.6.19 升级后界面回到 v0.6.18 的样子(这是本版目的);v0.6.18 安装包仍在 GitHub Release 与官网下载目录,可手动降级。已知边界:P2 交互随回滚下线,待重建后恢复;重建必须先用 Electron 截图验证再上线;本版未逐按钮点击验收。 |
| v0.6.19 10-18 · 界面骨架照设计稿重排 + UI P2 收口 + 测试端口全部动态化 |
布局按设计稿来,危险操作要确认,端口交给内核: ① 界面骨架照设计稿重排(§3.78):三栏 .app(264/1fr/300、48px 顶栏);顶栏只留 brand / 面包屑 / 草稿徽标 / ⌘K / 设置,模型/预设/权限移入会话设置弹层;侧栏工作空间 / 搜索 / 新对话 / 会话列表;底部 #runStrip 六项 + #composer + #statusBar;右栏 #runPanel 四标签页(轨迹 / 子Agent / 任务 / 仪表盘),原 5 个并列面板全部搬入且 id 与 handler 保留;设计稿布局/组件 CSS 约 760 行原样搬运(14 个颜色变量映射 + 9 个新增变量照抄);--faint → --dim 61 条规则(对比度 3.26/3.76 → 5.67/6.53);§153 从设计稿解析 59 个选择器逐条比对。② UI P2(§3.77):设置项三列(默认 / 当前 / 影响,默认值由 /api/state.defaults 只读透出);六类危险操作二次确认(删除工作空间/会话、清空记忆、恢复默认、切 auto、关沙箱;初始焦点在取消、回车不确认、Esc 取消);无障碍(role=dialog / aria-modal / 焦点陷阱 / Esc 回焦 / aria-live 节流 / 图标 aria-label);i18n(src/web/i18n.js,zh/en 109 键同键,缺失回退 zh)。③ 测试端口全部动态化(§3.76):8 个写死监听端口 / 20 处引用改 listen(0) + 运行时端口(含 §145 两次 listen(0) 且断言端口不同),e2e-web 的 40000+random 改为 freePort();doc-lint ⑨ 守卫拦 listen(4xxxx/5xxxx) 字面量。质量: smoke 新增 §153;新套件 test/ui-p2.js 6 项;变异 batch42 15 条 + batch43 12 条,总数 357 → 369,32 批 369 条全中;selfcheck 14/14。升级须知:DOM 重排但 id 保留;顶栏不再有模型/预设/权限选择器(在会话设置里);危险操作需二次确认(回车不确认);i18n 默认跟随浏览器语言;测试不再监听固定端口。已知边界(如实登记):设计稿细节差异见 §3.78 第三节(会话分组 / 轮次时间戳 / 内联工具卡 / 折叠动画 / toast / 980 图标化侧栏未做); --t3 有意改用 --dim(唯一数值偏离设计稿);状态条/轨迹动态运行文案仍中文;#cfgModal/快捷键表未加焦点陷阱;堆叠弹层 Esc 需后续 dialog stack;固定端口守卫只抓字面量;更新弹窗仍每次提示。 |
| v0.6.18 10-18 · 本地内存不足自动恢复 + 轨迹收纳 + 变异跨 worktree 互斥 |
本地引擎撑不住时,先压小再试一次;界面只留正文和一行轨迹: ① 本地内存不足自动恢复(§3.74): isMemoryPressureError() 单一判据(HTTP 507 / insufficient memory / memory_refusal / allocator wall / engine shed its caches and stays up / OOM 词边界,room/zoom 不误判;不含 400/401/429 与普通 5xx);仅本地端点(isLocalBaseUrl 或 customModels.<名>.local)命中后本回合 contextBudget × 0.6(下限 4096)、maxOutputTokens × 0.5、强制 localConcurrency: 1,只重试一次(MAX_MEMORY_RETRIES = 1);二次失败把压缩前后数值、输出上限、config.contextBudget 建议与 --ctx-size/q8 KV 一起抛出;界面/日志 ♻ 因本地引擎内存不足,已压缩上下文(32,768 → ~19,660)…并重试一次(串行化:并发上限 1),done.note 与 web-server.log 同源;预检读到引擎 n_ctx 且预算 > n_ctx×0.8 时发请求前 clamp 并提示;云端 507/400/401/429 不重试。② 轨迹/子 Agent 收纳(§3.73):对话流每轮只留一行 🧭 本轮 12 次工具调用 · 3 个子代理 · 1m42s ›,「轨迹」「子Agent」在 ≥1180 进右栏可折叠区、<1180 落到对话流末尾 #traceDock;子代理行 = 名称 · 轮次 · 工具次数 · 最后进展 · 状态,运行中随既有 progress.subagent 快照更新,不新增轮询;摘要与右栏同一函数/同一数据源(traceRoundForMsg→traceRoundView)。③ 变异跨 worktree 互斥(§3.75):锁改到 os.tmpdir()/mingdao-mutate.lock/,owner.json 记 pid/startedAt/cwd/argv/host;陈旧判据双条件(pid 不在 且 mtime > 15 分钟),"锁新 pid 死"与"owner 读不到"一律拒绝不接管,接管用 .takeover 令牌 + rename;selfcheck 14/14。④ 更新未验证来源签名提示精简(§3.72): warn-and-install 弹窗正文缩成两行(未验证 + 已按默认策略安装 / 环境变量 + 详情见日志与官网),标题与主句不变、判据一行未动,日志行反而更详细;smoke §135 补「≤220 字符 / 正文 ≤2 行 / 四类关键串 / 日志含完整说明」。质量:新套件 test/memory-recovery.js 5 项 接 run-all 与 CI(仅 Linux 腿);新变异批 batch40 11 条 + batch41 8 条,总数 323 → 342,30 批 342 条全中;selfcheck 14/14。升级须知:内存自动恢复只对本地端点、只重试一次、不改写历史上下文(只下调本回合预算);没读到 n_ctx 时不 clamp;变异互斥只是本机协议。已知边界(如实登记):子代理内部工具未逐条回传(SSE 只聚合快照);窄屏未做真实截图验证;变异互斥不是分布式锁(多机/多容器共享工作树仍会并发);强杀后 15 分钟内 run.mjs 不会接管新锁(需先跑 check);更新弹窗仍是每次提示一次(无「不再提示」配置)。 |
| v0.6.17 10-18 · UI P1 八项 + 模型显示别名 |
能点的东西要能点到,不能请求的名字就不要拿去请求: ① UI P1 八项(§3.70):工具调用时间线(一轮聚合成一张卡,N 步/总耗时/K 个失败,失败步红边 + 8% 红底 + ✖;点击展开完整参数与输出,长输出显示真实行数/字节数并默认折叠;默认前 3 步 + 所有失败步;开始/完成复用同一 DOM 节点不跳位);⌘K 命令面板(会话/工作空间/模型/预设/权限/命令/设置分组,↑↓/Home/End、Enter、Esc、焦点恢复、输入法组合期不响应;打开只刷新一次列表,不轮询;Web 端没有 /compact 就不列);快捷键表 ⌘/(只列真实实现的 7 项,不列 ⌘N/F5);右栏「本轮运行」(≥1180 展开、<1180 抽屉;模型 label + API id + 来源、预设、权限 + 来源与六项本轮数据,与状态条同源 runPanelView→runStripView,不另算);会话设置弹层(模型/预设/权限合并,显示生效值与来源,模型带 API id 副标题);空态三步引导 + 示例(只填入不发送);设置 10 分组 + 搜索(不匹配项 hidden、命中描边高亮并自动切组);明暗主题 + 窄屏断点(localStorage['mingdao-theme'],system 跟随 prefers-color-scheme;<1180 右栏收起、<900 侧栏/次要顶栏收起,layoutClassesFor(width) 单点判据)。② 模型显示别名(§3.69 + §3.71):官方宣传名 DeepSeek-V4.1-Flash 1017 不在 /v1/models 里、直接请求会被 400 拒绝,因此只做显示名——config.modelLabels(key 非空、value 去空白非空且 ≤80 字符、拦 __proto__/constructor/prototype,非法项忽略并 warn 不阻断启动);/api/models//api/state 返回 id/label/detail/labelSource;两处下拉 value=id、文本=label、title 含 API id,⌘K 模型项同显 label、搜索 label/id/name、执行仍切 id;请求体 model 始终是 API id(/api/chat 桩断言所有出网请求,含预检)。③ 测试:§145 时序断言改负载自适应( slowMs≥10000、进度行上限 ceil(slowMs/30000),去掉限频的变异仍失败,不是松断言);smoke 追加 §149/§150;test/model-names.js 8 组;新变异批 batch37 10 条 + batch38 14 条 + batch39 7 条,总数 292 → 323,28 批 323 条全中。升级须知: modelLabels 只影响显示,请求仍用 API id;API 当前仍只返回/接受 deepseek-flash/deepseek-v4-pro,「V4.1-Flash 1017」是宣传名;主题偏好写浏览器 localStorage(不写 config);「始终允许本会话」仍只是前端会话级。已知边界(如实登记):UI P2 未做(设置三列 / 危险项二次确认 / 无障碍 / i18n 收口);窄屏仅在 900 / 1180 两个断点验证,未在真实 Electron 窗口逐档截图;亮色是 token 映射、不是全量视觉收口;跨 worktree 变异互斥仍靠临时锁协议(人工 mkdir /tmp/mdh-mutate.lockdir,未做进 run.mjs);/compact 未做(Web 端无端点,命令面板/右栏按隐藏处理);诊断只给路径+复制。 |
| v0.6.16 10-18 · 模型名以 API 官方名为准 + UI P0 |
官方每升一次模型、代码就要改一次——这版把"名字"交给 API 实时返回:负责人反馈官方已推出 DeepSeek-V4.1-Flash 1017、API 拉到的也是它,而默认模型与界面提示仍指着旧名。① 模型名称与能力判定以 API 实时官方名为准(§3.67): MODEL_FAMILIES 用正则匹配 pro / flash / vision(大小写、空格/下划线/连字符、v4/v4.1/V5 版本号均无关),能力与峰谷定价挂在模式上;精确 id 只作别名(旧名 deepseek-v4-flash 仍可用)。默认值运行时解析:config.routing.*/config.model → 当前 /v1/models 按家族挑官方名(多版本取最高)→ 家族代表名兜底并显式提示兜底/离线;未知新版本可选中并标"能力未知"、不拒绝(如 DeepSeek-V4.2-Flash 1101);custom/未内置服务商不主动探测 GET /models(很多网关只实现 chat,空 body 会 JSON.parse 崩——同时也修掉 e2e-web 回归);4 处文案去版本号;新增 GET /api/models;新套件 test/model-names.js 7 组。② UI P0(§3.68):常驻运行状态条(阶段/首帧/吞吐/工具数/正文字符/上下文≈/费用,数据只取自既有 SSE progress 与 /api/state,不新增轮询;删掉 renderLiveBar/#liveBar 死代码,renderWorkStatus 收成唯一刷新出口);错误折叠卡(pre-line 保留原文、默认折叠可展开、处置建议独立成行、一键复制);内联权限确认(落在对话流里,不遮输入区/停止键,三键含"始终允许本会话",y/n/Esc 可用,120s 超时按拒绝、停止优先);/api/state 透出 permissionSource;§144 临时文件改 os.tmpdir() + finally 并 .gitignore 兜底。质量: test/smoke.js 新增 §148;新增变异批 batch35 9 条 + batch36 12 条,变异总数 271 → 292,25 批 292 条全中;model-names 7 组接入 run-all 与 CI。升级须知:默认模型可能与你 config.json 里写的不一样——显式 config.routing.planner/executor 或 config.model 永远优先;"始终允许本会话"只在前端会话级生效,不写 config、刷新即失效;custom 网关不再被自动探测模型列表,需要自动发现请显式配置。已知边界(如实登记):UI 的 P1/P2 未做(⌘K 命令面板、快捷键表、工具时间线、右栏运行面板、会话设置三件套、空态引导、设置搜索、明暗主题、窄屏重排);家族表用 verifiedThrough 标注已验证版本(4.1),更新的版本标"能力未知"并按家族规格估算;DEFAULT_* 仍是家族代表名兜底,离线兜底时模型名可能不是最新;状态条上下文占用是 ≈ 估算(done 后才精确)。 |
| v0.6.15 10-17 · 变异 fail-safe + 本地串行化 + 工具参数纯函数 |
三件事都来自真实事故与真机现场,不是推演:① 变异框架 fail-safe——变异在飞时曾被扫描误报成"残留";进程被强杀后补丁留在工作树、看起来像"有意改动",曾差点把"停止键失效"发进版本。现在补丁前先落 pending/<hash>.json(原始字节 + 补丁 + pid),开跑前自检可字节级自愈(含 CRLF);mutate.lock 互斥(活锁拒绝第二个 mutator、陈旧锁自动清理);SIGTERM/Break 还原在途补丁;强杀留下标记 → 下次 check 自愈。selfcheck.mjs 8/8(含真 SIGKILL 模拟)。② 本地端点并发与内存——v0.6.14 真机上本地引擎在长任务中途报 insufficient memory/allocator wall,同错在两个端点都出现,根因是父回合 + 子代理同时向同一引擎发大 prefill。现在进程级 acquireLocalSlot 串行化(默认 1 并发,0 关闭、上限 16;排队超时默认 30 分钟,超时报 LOCAL_QUEUE_TIMEOUT、不重试),覆盖父回合 / 子代理 / 预检,云端直放;首帧计时在取得名额后起、总时长含排队且可中断;engine shed its caches and stays up/allocator wall 独立分型——明确"引擎未崩溃、不要重启";并发时预告强警告。③ P1-1 第四刀 + 空值回填修复——parseToolArgs(raw) 抽成纯函数(8 条行为清单,agent.js 不再内联),顶层 undefined/null/函数/符号统一回填空串(此前会给模型字面量 "undefined"/"null"),嵌套 null 与字符串 "null" 保留。另并入:账本 run.start.permissionSource(来源 explicit/preset/config/cli/default,旧账本不变)与英文文档同步。质量: test/smoke.js §142/§143;变异 23 批 271 条全中(新增 batch31/32/33/34);selfcheck 8/8。升级须知:同一本地端点请求默认排队(并发子代理多时墙钟会变长,这是用等待换"不再被引擎拒绝";可设 localConcurrency 调整);看到"引擎活着丢缓存"不要重启引擎——减少并发/子代理/上下文才是修法。已知边界:前置门整体仍未抽(prepTool 顺序与短路原样);parseToolArgs 不宽容前后缀、无长度上限;本地端点不限制子代理数量(只限制同一 baseUrl 在途请求),不同 baseUrl 不汇总内存压力;引擎侧 --context-window/q8 量化不归 harness 管;SIGKILL 后到下次 check 之间补丁会短暂留在工作树。 |
| v0.6.14 10-09 · 预检误报修复 + 内置预设精简 |
一条 7 小时前的旧结论,把用户引去重启了引擎:负责人用 v0.6.13 继续跑本地模型长任务,日志里 07:03:02 进程启动时引擎还没起来,唯一一次真实探测得到 unreachable——这条结论进了进程内备忘,而且没有任何有效期;此后 07:08:13.912/.931(相距 19ms)与 10:13:58.877/.900(相距 23ms)两次 chat 预检 都写着「❌ 不可达:fetch failed(本地引擎没起来?先确认端口/进程)」,两次都没有「预检 <模型>」行 ⇒ 没重测,直接念旧结论。而引擎自 07:08:59 起就 ok-tools、同一回合首帧 8.7s 完全可用——:799 距 :413 已 7 小时 10 分,用户照这句话去重启了引擎。① 失败结论只保鲜 60 秒( PROBE_FAIL_TTL_MS):新增纯函数 probeVerdictFailed()/probeMemoUsable(),模块级缓存与进程内备忘两处统一按它判,成功结论仍缓存 10 分钟——这才是"7h10m 重放"的根治点(原来那层备忘只按"有没有"判,短路了 10 分钟 TTL)。② 失败原因分型、文案跟着判据走: refused(连接被拒)/ reset(被对端断开)/ timeout / http-unimplemented(404/405/501)/ http-auth / other,结论带 reason 字段。只有连接被拒 / 被断开才说"不可达";超时说「⏱ 探针超时:1.5s 内没有首帧(端口是通的,引擎在 prefill 或正在启动)」;404 说「❌ 探针被拒绝:HTTP 404(端点未实现该探针请求)」——不再出现裸 fetch failed,更不会再一律劝人重启引擎。③ 超时覆盖到首帧:探针是 stream:true,原来 fetch 在响应头到达时就 clearTimeout ⇒ 引擎"回了头、卡在 prefill"时探针根本没有超时(而它在回合发起前被 await)。现在单次尝试 1.5s 且计时只在读到首帧后才 clear,整个探针有 15s 总预算;参考 prefill 单独放宽到 20s(本机 35B 实测 6.6~7.8s/2000 tokens)。④ 退避重试 [300, 700]ms:引擎"正在启动"时给端口留出 bind 时间,不再 1ms 内连撞 3 次就判不可达。⑤ 新增复核日志行: chat 预检复核 <taskId> 预检曾判不可达(reason=…),但本回合实际可用(首帧 Xs)——预检判据需复核——判错了要留痕。⑥ 降级语义显式化:探针任何异常都被吞掉、只降级不阻断本回合,每句失败文案都写明这一点;只实现 chat 的端点一个多余请求都不发(/props 仍只在引擎自报模型名后才打)。内置预设精简(发行版不替用户决定任务类型):删除内置「只读代码审计」预设 readonly-audit,内置只剩 local-model,且定位收窄为只提供参数类默认值(contextBudget/maxOutputTokens/maxRounds)——不携带人格、不限制工具、不涉及权限;需要"只读"请自行组合权限档 readonly 与工具白名单 tools。老名 local-audit 保留为别名并提示更名。理由(负责人原话):代码审计只是他作为一项较大型较长任务对 MDH 做的测试;发行版面向普通大众,用户可能执行不同任务、不一定用本地模型、也不一定用来审计代码。质量: test/smoke.js 新增 §141(真桩服务 + 桩引擎:拒连 / 只实现 chat / 首帧慢 / 永不回帧 / 404 / 启动中 / 保鲜期 / 探针异常只降级 / 结构守卫);新增变异批 batch30 10 条,变异总数 210 → 219,19 批 219 条全中。升级须知:预检的失败结论只保鲜 60 秒——引擎晚起不再被几小时后的新回合重放(每个新回合都会重测,最坏多花约 6 秒;成功结论仍 10 分钟);「不可达」的含义变窄了,看到哪一句就按哪一句排查;内置预设只剩 local-model,原用 readonly-audit 的请改权限档 + 工具白名单。已知边界(如实登记):自定义 Provider(非 OpenAI 协议)配本机 baseUrl 时探针仍会打 /chat/completions 落 404 文案,未按 provider kind 跳过预检(主请求不受影响,但界面会多一条无意义 banner);失败保鲜 60s 是固定值、无自愈;预检仍在回合发起前 await(最坏 ~6s,未与首帧并行);不区分引擎启动阶段;真机三端点未复跑(本版为桩 + 真 web 服务器的端到端复现)。 |
| v0.6.13 10-09 · 本地模型可观测性四项修复 |
又是真机测试的结果,四个问题一个共同点:负责人用 v0.6.12 本机跑长任务,暴露出四个具体缺陷——内核拿到了数据,却不拿它做判断。上一版把"看得见"做出来了,这一版把"看得见的东西真的影响结论"补上。 ① 预告文案与预检数据自相矛盾:同一条横幅前半句写「prefill 可能需数分钟至数十分钟」,后半句又写「参考 prefill 2000 tokens 0.08s」——自己打自己,52 秒后实测首帧 53.7s(按同一份预检线性外推只有 0.6s,差 90 倍)。根因是本地分支为与端点无关的固定文案,预检实测只被当附注拼在后面、从不参与推导。现在改为由预检实测线性外推( prefillEstimateMs(),报「按预检 0.08s/2,000 tokens 外推,本轮 ≈0.6s」),并如实标注外推的局限(写明"线性外推、长上下文会低估"并附上那条 90 倍实测差值);只有拿不到预检数据时才退回原保守文案。告警线也随之据实调整:外推 ≥60s 才告警且写出依据,「本地端点 + ≥60k tokens」这条规模线降级为仅无实测时的兜底。② 配置超出引擎能力("换预设也没用"的根因):引擎报 insufficient memory … during prefill,而配置 contextWindow 写 131072、引擎自述 n_ctx 只有 32768(配置是能力的 4 倍)。此前预检只测"能不能跑"、从不问"引擎装得下多少";而预设只改 contextBudget、改不了引擎的 n_ctx。现在预检新增 GET /props 读引擎自述上下文,与配置并排给出三态结论(一致 / 超出即告警并说清"换预设、调 contextBudget 都改不了引擎上限"+ 两条真修法 / 读不到就如实说未读到,不猜、不据此否定端点);门槛是只有引擎自报了模型名才多打这一个请求——不认识 /props 的网关与测试桩一个字节都不多发。③ 子代理在干活,父回合却被判"无进展"而误掐:真机 30 分 45 秒 status=stalled,而同一回合的两条 task 结果写着"连续 1 分钟没有任何工具调用(模型请求 15 轮、工具调用 18 次)"——子代理一直在干活。两个原因同时成立:父回合在 await task 期间的进展判据不包含子代理进展(主因),且子代理继承的截止时刻是 spawn 那一刻的绝对快照(次因,导致误杀 + 文案谎报"1 分钟")。现在子代理每次真实进展都回调父回合续期;继承的截止时刻改为活的(max(spawn 快照, 父回合最后进展 + 阈值),只前移不倒退);父回合等子代理时多等 15s 宽限以保证子代理自己的看门狗先响并把原因回传;看门狗区分 own/inherited;不足 1 分钟按秒说(不再把 300ms 说成"连续 1 分钟")。④ stalled 在桌面壳上不可见:桌面壳日志只有一行「回合收尾:generating=false」,同刻内核写的是 status=stalled——两条日志对不上(桌面壳取的就是渲染进程 console,而前端 done 处理只打印 session 不打印 status)。现在 stalled 发告警 banner(与 done.note 同源)、done 事件带 stallCause、收尾文案说清"在等哪个工具/等了多久"并与 capped(跑满预算、可续跑)、aborted(你点的停止)显式区分,前端把结局写进控制台并在消息下方留说明。质量: test/smoke.js 新增 §140(预告外推/保守分支/慢端点告警/线性关系、/props 读数与三态结论、"未自报模型名时一个字节都不多发"、父回合不误杀有进展的子代理、快照到期但父回合仍活时不收口、两种收口原因、stalled 文案与 capped/aborted 区分、内核 banner / done.stallCause / 前端控制台);新增变异批 batch29 27 条,变异总数 183 → 210,18 批 210 条全中。升级须知:本地端点会多打一个 GET /props(仅当引擎自报了模型名,随预检缓存 10 分钟);「配置超出引擎能力」是警告不是自动修复——内核不改你的配置、不重启也不杀引擎;看门狗默认值与判据都没变(默认仍 60 分钟、仍关不掉),变的只有"子代理的真实进展现在算进展";父回合等子代理会多等 15s 才收口(相对默认 60 分钟是 0.4%)。已知边界(如实登记):线性外推仍然只是外推(真机 90 倍),内核只在文案里标注这条差值,不按上下文长度分段建模、不按引擎内存压力动态修正;/props 只读这一个端点、只认这几个字段名,也没读并发 slot 数——单条请求实际可用上下文可能因并行 slot 更小;15s 宽限是固定值(未按子代理数量自适应);子代理在单次模型请求内部长时间无增量时父回合仍看不到(那种形态仍由请求级首帧超时负责);CLI/REPL 的 stalled 仍只有一行 print,无额外 TUI 状态条(desktop/** 本版未改动);进度日志仍是 30s 一行。 |
| v0.6.12 10-08 · 本地模型看门狗 + 来源标注 + 预设拆分 |
起因是真机实测,不是推演:负责人用本地 MLocalModel3.6.2(llama.cpp,引擎常驻 32.6GB)跑全量代码审计,llama-server 连续跑了 4 小时 30 分,而 web-server.log 8 小时零行、界面上只有一个「生成中」、audit.jsonl 里 610 次工具调用绝大多数是逐字重复的失败调用。复核结论:没有一次"挂住的 await"——缺的是回合级判据与可观测性:既有三个超时(首帧 600s / 流式空闲 120s / 单请求总量 1800s)全是"单请求级",而一个回合最坏是 maxRounds × stepLimit = 72 次请求、子代理还可递归派生,"每十几分钟返回一次、什么都没做成"的回合可以合法地跑掉几小时。① 本地模型可观测性 + 无进展看门狗:新增回合级看门狗 config.noProgressTimeoutMs(默认 60 分钟 = 本地单请求总量上限的 2 倍,保证"一次慢 prefill"永远由更具体的请求级超时先说话)——判据是连续 N 分钟既无"成功且不重复的工具结果"、也无新的正文/推理增量,重复调用与失败调用不算进展(现场正是它们);命中即以 stalled 收尾并如实报告轮次/调用数,不再冒充 done;该值关不掉(0/负数/NaN/Infinity 一律回落默认);子代理继承父回合截止时刻,整棵树一起收口。配套四项可见性:发送前规模预告(估算 prompt tokens + 窗口占比 + 生效首帧上限 + 预检结论)、TTFT 首帧时延(界面 + chat 首帧 日志行)、运行中进度行(阶段/模型轮次/工具调用数/≈tok/s/正在等哪个工具,web-server.log 每 30 秒落一行——此前只在回合首尾各一行,这正是"8 小时零行"的机制)、「0 次工具调用」必须显式说出来;上游/引擎错误透出原文 + 可操作解读(模板/内存拒绝/三类超时/鉴权/429/5xx 各给一条"这是什么 + 该怎么办")。另加端点预检(仅本地端点,缓存 10 分钟):/v1/models 对照引擎实际加载的模型名、3 次极小请求判「稳定支持 / 不稳定 / 不支持」(被 max_tokens 截断的样本判不可判定,不当作不支持)、测一次参考 prefill 并与历史值比对(≥3 倍变慢提示"可能仍有旧请求占着,建议重启引擎");预检结果按实测喂给自适应超时,且用户显式配置永远优先。② 模型下拉来源标注:下游环境里 Dify chatflow 的应用名混进"模型"列表、看不出是不是官方模型。核实结论(已写进代码注释作单源说明):下拉是配置驱动的——自定义条目只来自 config.customModels,自定义端点的 /models 从不写进 model-cache.json,不存在跨环境运行时串数据;但此前只标 providerLabel='自定义',看不出来自哪个端点。现在每条自定义条目都带 source/sourceLabel/endpoint/note,下拉分组名本身就是来源(如「自定义端点 · dify.example.com/v1」),不再与官方模型混在一起。③ 预设按语义拆分:原内置 local-audit 一个名字扛了三件事(本地参数 + 审计人格 + 只读白名单),名实不符。按负责人定位("本地模型只是代替云模型 API,功能是一样的;预设是为了预设上下文窗口/最大输出,让本地模型正常工作,并不是专为代码审计")拆成 local-model(只放保守参数 contextBudget 65536/maxOutputTokens 4096/maxRounds 4,不加人格、不限制工具、不建议权限档)与 readonly-audit(审计人格 + 只读工具白名单 + recommendedPermission)。老名字保留为别名(仍可用,但 CLI 打一次更名提示 + WebUI banner——兼容但不静默),自己写的同名预设以磁盘为准。质量: test/smoke.js 新增 §139(8 组行为 + 结构断言,桩 provider 全部尊重 signal,否则测的是"不会挂的假桩");新增变异批 batch28 26 条,变异总数 157 → 183,17 批 183 条全中。升级须知(行为变更): --preset local-audit 现在解析到 local-model,不再有审计人格与只读工具白名单——此前用它做只读审计的调用点会失去只读约束(内核会提示更名,但提示不会替你恢复白名单),请改用 readonly-audit;两个预设不能叠加。已知边界:不做"自动重启引擎"、预检只覆盖本地端点、工具调用预检是启发式(同一端点两次实测结论相反)、recommendedPermission 本版只随 /api/presets 透出、前端尚无消费点、更新包签名默认仍是 warn-and-install(发布链路未接签名步骤)。 |
| v0.6.11 10-07 · 反向提权修复 + 来源签名 |
安全:① Pack 反向提权(审计 M-1,P0)——第三方 Pack 的工具此前拿到的就是内核 ctx,一行 ctx.permission.check = () => ({allow:true}) 就能让权限引擎对本进程失效:不是"能不能读文件",而是能不能关掉管它的那道门。现在第三方 Pack 的 ctx 做白名单裁剪 + 冻结(去掉 providers/io/permission/spawnTask),分档只能收紧,回归套件已接入 CI。② 账本来源签名(ledger --sign-key,ed25519):哈希链的全部输入都来自账本自身、算法公开——改一条 ok:false→true 再逐行重算链,不需要任何密钥旧 verify 就逐项通过,即它只能回答"没被随手改过"、回答不了"是谁写的"。现在签名落在封条上、公钥指纹写进链内;verify 分四态:有效→0 / 无签名(历史账本)→0(升级不把老账本判成坏账本)/ 签名无效→非 0 / 无法验签→非 0。③ 桌面版更新包来源签名校验:electron-updater 自带的 sha512 只说明"字节与同一份 feed 的清单一致",控制 feed 的一方两边一起换,不构成来源信任;现在客户端内置公钥(不从网络取),有签名验不过一律拒装,无签名默认放行但 UI 与日志都写明"未验证来源签名"(发布链路尚未接签名步骤),想强制只收签名包可设 MINGDAO_REQUIRE_UPDATE_SIGNATURE=1。④ IDE 插件令牌改存 SecretStorage/PasswordSafe,工作区级旧令牌一律忽略(堵掉"克隆一个仓库即注入端口/令牌"),并把 ok/unauthorized/unreachable 分三态——此前 401 被当成"连不上"。用户实测缺陷:⑤ WebUI 权限模式显式选择被预设静默压过(选了「自动」仍按只读跑、不报错没提示)→ 优先级固化为显式选择 > 预设建议 > config.json 并显示生效档位与来源;内置预设 local-audit 摘掉 permission(覆盖语义)改用 recommendedPermission(建议语义),只读效果本就由工具白名单保证,契约断言钉住。⑥ 「停止」在等待权限确认时形同虚设(服务端挂在一个 120 秒等待上)→ 解除挂起确认优先于超时,前端所有停止路径收敛到唯一出口,遮罩不再盖住停止按钮。⑦ 桌面版打包漏 preload.cjs(前端桥整个失效)与 update-verify.js 进 asar 补齐;设置面板「登记工作空间」接上目录选择器。质量:工具编排两端抽成 src/tools-flow.js(审计 P1-1 第三刀);M-8 结构守卫收口第一批(15 处:7 处跨行文本匹配改行为化 + 8 处加固为单源);变异验证 16 批 157 条全中(含新增的提权/权限模式/停止键/预设四条针对性批次)。 |
| v0.6.10 10-01 · 去掉"形似密钥"的字面量 |
零行为变化:下游先报了"PR #1 暴露了密钥"——查证结论是 app-<24 位 base62> 这类占位样例(按字母表顺序拼的,不是任何真实凭据),但在公开仓库里长得就像密钥:会被密钥扫描命中,也会让读代码的人以为仓库漏了真钥。于是按"已泄漏"处置:src/redact.js 的前缀表样例改为运行时拼装(下游 PR #10,已合并);测试夹具与归档文档里的同类字面量一次清完(新增 test/fixtures/fake-secrets.mjs 记录原因);PR #1 的正文/评论改写为占位形式、来源分支已删除。仓库设置层面:GitHub 端已开启 secret scanning + push protection——以后真有密钥被 push 会被直接拦下,而不是等下游来报。另外把 e2e-schedule 里写死的墙钟断言改为按本机实测的自适应预算并新增一条进程内确定性断言(Windows 腿此前会因此假红)。 |
| v0.6.9 10-01 · 脱敏补齐 + 文档债 |
① 脱敏器漏掉 Dify 的 app- 密钥(下游实测反馈):同一份日志里 sk- 被掩了、app- 原样漏出——半掩比不掩更危险,贴日志的人会以为已经脱敏;影响审计日志、WebUI 日志与诊断包。修法不止补一行:前缀表收敛成单一来源 SECRET_PREFIXES,每行必须带一个真实形态样例,由表驱动断言证明"这一行真的认得它声称认得的形态"(同类缺口 v0.6.3 已吃过一次);同厂商的 dataset- 一并补上,并刻意不做高熵兜底(误报会让人直接关掉脱敏)。② 文档债清偿(第三方 v0.6.7 文档审计逐条):重建 ARCHITECTURE.md(旧版只提 12/88 个模块、把已发布功能写成"路线图");@stable API 表改为从代码生成(旧表 32/70、完全没有 Pack API v1 与约束引擎);补英文 README.en.md(含安全模型表:机制 + 边界逐行)与英文 SECURITY.md;内部过程文档移入 docs/internal/ 不再随 npm 分发;--help 补齐 batch/cost/pack/mcp 等;新增 8 项文档守卫接入 CI(链接 / 命令表 / kind / 模型 id / 架构覆盖 / 变异总数 / API 表 / 只读工具)。③ CI 在 Windows 上变异验证整批假红的根因修掉(多行锚点按 LF 写、检出是 CRLF),并新增 .gitattributes 钉死 LF。变异验证 47 条全中。 |
| v0.6.8 09-30 · 外圈质量洼地 |
补丁版:修的是"外圈"的三类问题。① hooks 的送达判据(严重):此前用 'finish' 事件判定"载荷已交给内核",而它在 Windows 命名管道上不可靠(Node 24.14 下 40 次复现 0 次通过)→ 读 stdin 的合规 hook 在大文件写入时被误拦;改为可计量证据(写入回调交付的字节数,且必须判 err)。② 一个坏字节毁掉整段输出:严格 UTF-8 一抛错就把整个缓冲区按 GBK 重解,360KB 合法中文全变乱码;现在局部失败只影响局部。③ 三道能假绿的门禁:覆盖率脚本在 Windows 恒为 0%(0/0)、未加载文件被从分母剔除、strict 棘轮走 npx(编译器缺失被算成 0 错误)——全部改为"工具/数据不可用即失败",并把变异验证接入 CI。另有 IDE 插件的命令注入修复、桌面外壳导航钉端口,以及目录选择器(登记工作空间时弹系统原生对话框,默认停在你的家目录)。 |
| v0.6.7 09-30 · 三份审计报告收口 |
补丁版,只做正确性与安全:三份第三方 v0.6.6 报告(全量代码审计 / 第六轮复审 / 安全与质量审计)独立地把「同一规则多份实现 → 最弱的那份说了算」指为安全缺陷的唯一共性根因。① 出网收成一条管道:fetch 工具此前自己维护了一份更弱的 SSRF 实现(DNS 复检失败放行、校验与连接两次解析 → DNS rebinding、元数据只按主机名判),而它是只读免确认工具;现在判定与"把已校验 IP 钉给连接层"统一到单一来源,并修好出网闸门看不见 skill / registry / 模型发现三条自动出口的盲区,以及 fetch(Request, init) 被静默降级成空 GET、跨源跳转把 x-api-key 送给重定向目标。② 账本与计费:「未知」不再当成「0」:账本结局口径分裂(跑满步数时返回值 capHit:true 而账本记 done)、费用护栏把"文件读不出来"当今日 ¥0、网关不回 usage 时该回合在账上不存在、Batch 四条失败路径一条记录都不写——全部改为显式记「未知」并给出可见信号;downgrade 档也让在途费用参与决策。③ 安全面中危:脱敏器认带引号的键({"api_key": …} 此前明文进审计与诊断包)、凭证库损坏时写操作拒绝而不是清空其余凭据、deny 拆段补命令替换、bash 子进程 env 词表补 *_KEY、ReDoS 判定收成单一来源。变异验证 28/28(脚本已入库 test/mutate/)。 |
| v0.6.6 09-23 · Windows 测试门禁收口 |
补丁版,只做正确性:修的是三处"CI 五腿全绿、但在标准 Windows 账户上跑不起来"的门禁问题——也就是"门禁本身在真机上是空的"。① Windows 上 bench 从未运行:npm test 的汇总器在 Windows 上因 spawn('.cmd') 未开 shell 同步抛 EINVAL 而崩溃,导致 bench 五套 214 条断言(含"省钱只降不升"基准回归)从未执行;CI 没暴露是因为它的唯一入口只在 Linux 腿跑。② 软链用例把"没抛错"当成"建出了链接":标准账户建不出真软链(或某些文件系统静默降级成普通文件),用例实际测的是读写普通文件;现统一走能力探测(共 6 处),并新增平台无关的桩 fs 围栏单测,安全边界不再取决于"机器有没有开开发者模式"。③ 被接管后旧 daemon 最坏 60s 才退出(本版唯一的运行时变化):every/once 的等待改为 ≤3s 切片并逐片复查租约,最坏接管延迟 60s → ≈5s。变异验证 7/7。 |
| v0.6.5 09-22 · 三条越权链收口 |
补丁版,只做安全、不掺新功能:内容是独立审计(8 名审计员、58 项发现)里唯三的越权 / 任意执行链。① 写操作能逃出工作目录围栏——悬空符号链接(指向的目标还不存在)会让 write/edit 跟随链接把文件写到围栏之外(实测界外文件真被创建,而同一条路径的 read 反而被拒);现在解析失败即按 lstat 判定并递归解析链接目标,链接成环有界返回失败,而指向围栏内的悬空链接照常可用。② 未信任的 Pack 仍会被执行——pack info 直接 import pack.mjs,而信任门此前只加在挂载路径上,于是"clone 一个仓库 → 换个命令"就能执行任意第三方代码(完整 Node 权限);现在与挂载同口径:未信任即拒绝并给出 pack trust 指引。③ 改 API 地址=把已存储的 Key 交给谁——setBaseUrl 三个请求即可把完整 API Key 发到攻击者端点("接口只回脱敏 Key"拦不住);现在该服务商已有 Key 且目的地 origin 变化时必须重新提交 Key 确认,同类第二入口 updateCustom 一并收口。每处修复都配了回归断言与变异验证(把修复改回缺陷,断言当场失败)。 |
| v0.6.4 09-21 · 第三方审计九批收口 |
九批收口,形态都是「不报错,但防护/能力/数据实际是空的」:① 凭据——凭证库损坏后一次 key set 会静默清空其余凭据(现拒绝写并保留原文件);会话/记忆/任务等 10 处文件改 0600 且每次写自愈;云同步上传前脱敏,并补齐脱敏器漏掉的 PEM 私钥块、JWT、赋值式(AWS_SECRET_ACCESS_KEY=)。② fail-open——预设「未提权」分支丢掉 deny、hook 载荷没送到被当放行、必填项缺失哨兵只认中文,均已改 fail-closed / 多语种。③ 合规空转——约束事件缺 id(「是哪条红线拦的」恒为 null)、confirm 从不求值、CLI 回放的约束恒为空(当 CI 门禁时恒通过)。④ Web 攻击面——符号链接逃逸实测复现(围栏改按 realpath 判定)、元数据端点无条件拒绝、跨站盲打 403、Provider 名穿越 import 设防。⑤ 供应链——pack verify 默认不再执行被审代码(要执行须显式 --runtime)。⑥ 并发长驻——同步服务写锁未 await 导致整体退出、任务永久卡 running 或双跑、pid 复用下锁僵死。⑦ 计费——非幂等重试导致同一份回答计费两次、压缩触发线越界让自动压缩永久失效。 |
| v0.6.3 09-15 · 下游与桌面版卡点 |
三项「本来该能用却用不了」:① 域内任务拿不到工具——为省 token 的"只读档"要求命中写意图关键词,而域内词是开集(回访/排班/盘点…),「回访」因此整回合工具不可见;已反转判定(只有纯提问才只读档)+ 域内 Pack 旁路 + 自愈重试。② 桌面版 bash 输出乱码——逐块解码把汉字劈成半截,且 Windows 的 cmd.exe 输出是 GBK 代码页;已改为整段解码 + UTF-8/GBK 回退。③ vision 门控不认自定义 Provider(Dify 工作流已支持视觉)——且为开门控而写 customModels 会劫持 provider 解析、绕开自定义适配器;现在能力开关不再改变"请求发给谁"。 |
| v0.6.2 09-14 · 审计欠账清算 |
两处高危已实测复现并修复:① 安装技能时若线上索引里的名字是 ./..,安装目录会被解析成整个技能目录甚至整个 ~/.mingdao——配置、凭据、会话、账本一起清空,且界面显示成功;现在索引名先校验、安装目录改用技能自己声明的名字。② 执行账本「尾部被截断」旧版查不出来(删掉含 run.end 的尾部几行仍报完整);已加封条,ledger verify 对「完整性未知」退出码 1(行为变更)。另清算一类系统性问题:写入失败却报告成功——任务检查点、费用明细、工作空间、守护 pidfile、项目记忆、审计日志;其中 pidfile 静默失败会让定时任务被并发重复执行。 |
| v0.6.1 09-12 · 模型改名修复 |
厂家改名后模型选不了、也计不了费:DeepSeek 把 deepseek-v4-flash 改名为 deepseek-flash,而内核「设置界面用动态名单、切换接口只认静态表」两处不同步——应用自己列出来的模型选不了。已修:切换接口接纳动态发现的模型(拦任意字符串的护栏仍在),并把新名字补成一等公民(含价格,否则费用会显示「无法估算」);旧名保留以兼容老配置。 |
| v0.6.0 09-12 · 合规与确定性 |
确定性③ 行为确定性:执行账本(八类事件 + 哈希链 + 两级脱敏)、决策回放(可当下游 CI 门禁)、出网白名单与自证、内网/信创断网安装;并收口 v0.4.6 审计登记表的全部仓库内条目(含约束引擎 fail-open、Batch 中止不落服务端等静默失效类缺陷)。 |
| v0.5.0 09-11 · 垂域 Pack 契约 v1 |
确定性① 约束 + ② 成本:pack.json/pack.mjs 契约冻结(三级遮蔽、manifest 严格校验、极简 semver);约束引擎 6 种 kind × 3 个时机(只收紧不放松、fail-closed、零约束时全惰性);ctx.llm() 统一模型出口 + Pack 级预算与 cost --by pack 分账。 |
| v0.4.6 09-11 · Mac 迁移后全量审计 |
1×P0 / 19×P1 根因修复(WebUI 权限确认越权代答、任意环境变量外泄、SSRF 绕过 IPv4-mapped、git 工具 100% 失效、deny 规则 fail-open、限流绕过)。分发链:skills-lib/ 补入 npm 与桌面版(36 技能不再只剩 14)。口径自纠:省钱 64% → 51%(启发式计数 + 过期副本)。 |
| v0.4.5 09-07 · 费用护栏/本地507 |
费用护栏根因修复(estimateCost 无价返 null + costGuard 显式告警,P0-4)。MacBook 本地 507 根治(error 帧识别 + 507 透出 + 本地主机名判定)。任务锁/kill(文件锁可重入、非 Linux kill 降级、调度 pause 覆盖修复)。安全正确性收尾(git --no-index 过滤、技能符号链接、readBody close→499、SSE 有界排空、CLI --model、原子写)。 |
| v0.4.4 09-07 · 熄屏断连/审计 |
macOS 熄屏断连根治(生成期防睡眠/防熄屏 powerSaveBlocker)。审计可用性:task 工具入只读档(可派只读子代理)、今日费用逐轮累计。技术评估 6.x 修复(fs-browse 路径穿越、MCP 环境过滤、调度/工作空间加锁等)。 |
| v0.4.3 09-06 · 正确性收尾 |
network error 诊断闭环(渲染层全量异常日志 + 服务端断连日志 + 可恢复提示)。审计修复:WebUI 自启失效、云同步锁内原子写、技能安装异步化、SSRF 防护、费用 TTL、统计轮转加锁、autoTitle 误报、--format json 纯净、孤儿 tool_calls 清理 + 低成本 P3×5。项目简称 MDH 统一使用。 |
| v0.4.2 09-06 · 体验/本地模型 |
预设下拉体验:桌面版打包补内置预设目录(下拉恒空根因)、tooltip 秒现、选中即弹「这是什么 + 覆盖字段」、「无预设」显式退出、内置预设 permission auto→readonly。本地模型 507 缓解:只读子代理串行化、压缩触发提前 60%、507 错误附可操作提示。 |
| v0.4.1 09-06 · 安全版本 |
安全债清零:路径穿越防护、SSRF 302 复检、权限前缀白名单化、预设提权拦截、MCP 只读仅信任 trusted(P0×5)+ P1/P2 共 12 项正确性与质量修复。macOS 本地模型双根因:子代理无反馈(routing 池外跟随当前模型)+ 输出截断 text=0(兜底总结轻量化)。诊断新增「当前模型能力」报告;桌面版自定义模型「修改」可直接改上下文窗口/最大输出。 |
| v0.4.0 09-05 · 开放内核 |
Agent Preset(声明式智能体预设,三级遮蔽 + 白名单硬拦截)· 第三方工具(registerTool + config.tools)· 公共 API 冻结(24 个 @stable 导出契约锁定,见 API 文档)· 定位升级「垂直产品 × 开放内核」。 |
| v0.3.2 09-05 · 本地模型 |
本地模型自适应:上下文窗口感知预算(75% 舒适区)、分层超时(慢 prefill 不误杀)、边缘检测强制压缩、工具结果按窗口/16 截断——资源受限的本地部署长任务不再中断。 |
| v0.3.1 09-04 · 省钱仪表盘 |
真·省钱仪表盘(命中率环状图 + 14 天趋势 + 模型/工具 Top5)· 语义检索(项目记忆按任务取相关条目)· 只读调研工具(git/fetch)· 自动续跑(跑满步数注入进度摘要续下一轮)。 |
| v0.3.0 及更早 08-28 起 |
记忆与长跑(项目级记忆 .mingdao/memory.md + 任务续跑检查点 + mingdao diagnose)· 省钱体系成型(缓存命中计价、Batch 半价、避峰调度、自动路由、精确 tokenizer、费用护栏)· 结构治理(路由拆分、SPA 外置、类型安全归零)。 |
💰 省钱效果可复现、可回归:基准见仓库 docs/SAVINGS-BENCHMARK.md。
DeepSeek-V4 的缓存计价(命中 1/30 价)决定了 Harness 的核心竞争力 = 让每个请求的前缀字节稳定。MingDao Harness 围绕这一点做了系统设计。
hit/miss 拆分计费 + 命中率仪表盘,口径不一致时余量按未命中计(不漏计)。
0.15 元 vs 4.5 元 /Mmingdao batch 问题.txt 单轮批量任务走批处理通道,结果落盘并计入分账。
--offpeak 高峰(工作日 9:00–14:00)自动顺延 14:00 后;周末全天闲时(官方确认)。
pro 规划 / flash 执行,分类缓存 + 会话粘滞;系统提示跨模型字节恒定,路由翻转不破缓存前缀。
日常省 67%官方词表 BPE:GPT-2 字节映射 + Split 预分词 + 堆合并,与 HF tokenizers 逐值一致。
±2 倍误差 → 0costGuard 每日上限:warn 提醒 / block 暂停,按真实口径(含缓存折扣与半价)累计。
从任务到结果,全链路可观测、可追溯。
启发式零成本 + 分类器兜底(LRU 缓存/会话粘滞),生成类任务自动切大输出模型防截断。
流式思考实况、工具卡片逐个闪烁、只读工具与只读子代理并行执行;权限引擎 + 沙箱 + 敏感环境变量过滤。
每次调用落审计日志(sk- 脱敏);缓存命中率、费用、节省额实时入账,/cost 按模型分账。
交付物卡片(路径 + 使用说明)、自动生成会话标题、结束静默同步云端。
每个工作空间自动沉淀「决定/事实/教训」到 .mingdao/memory.md,换会话不重来、换项目不串。
跑到步数上限自动落检查点,--continue / WebUI 从断点续跑,已完成文件不重做。
mingdao diagnose 生成脱敏诊断包(日志/审计/配置/工作空间),贴给反馈即查。
本地零依赖直跑;服务器上 WebUI + 云同步服务端一条龙。
一次性/周期/链式依赖,单守护进程调度器,重启自愈。
SKILL.md 格式,三级来源(用户/项目/内置),线上 registry 一键安装。
DeepSeek-V4-Flash-Vision-Exp 内置,WebUI 上传图片/文本附件。
分享码协作、跨设备冲突图形化三选一、注册开关/邀请码。
三平台镜像内容一致,你在哪个平台浏览就用哪个(Gitee / GitCode 国内速度快)。
使用文档见仓库 README.md 与 docs/;WebUI 由 mingdao web 一键启动。
MingDao Harness 是开放内核:下游项目在自己的领域里做垂直产品,复用本体的省钱调度、权限门控、记忆与续跑能力。下游站点独立域名、独立部署,只承载领域内容;官网只承载 MDH 本体(内核、下载与更新 feed、文档、版本动态)。