• v0.8.3 9329df68af

    v0.8.3 工作空间切换链路根治 · 思考强度扩档 — 切换报错TDZ/继承丢数/回显滞后三修复
    CI / 类型检查 + Lint + 单元测试 (push) Failing after 9m37s
    CI / 全量测试 (Electron ABI) (push) Failing after 6m1s
    CI / 产物编译验证 (push) Successful in 10m54s
    Stable

    thzxx released this 2026-09-08 21:16:18 +08:00 | 0 commits to master since this release

    MetonaAI Desktop v0.8.3 —「工作空间切换链路根治 · 思考强度扩档」

    版本基线:v0.8.2(4cd6e99)→ v0.8.3(9329df6)
    本版为用户实测反馈驱动的缺陷根治版本:围绕「切换工作空间」完整链路的三个断点全部闭环
    (保存报错 / 数据丢失 / 回显滞后),并顺势修复一条自 v0.6.4 引入以来从未真正生效的安全防线;
    同时按用户需求扩展思考强度档位(新增 xhigh / true)。


    🔄 P0 工作空间切换链路根治(三项修复)

    1. 确认切换保存报错根治(TDZ 连锁反应)

    • 现象:设置 → 工作空间 → 确认切换,报「切换工作空间失败:Cannot access 'main' before initialization」且路径回滚;重启后仍停留在旧工作空间。生产环境(安装版)必现,开发模式不可复现。
    • 根因链(两层缺陷串联):
      1. v0.6.4 安全加固的「防线二」CSP 注入调用 session.defaultSession.webRequest.onHeadersReceived() 遗留在模块顶层 —— Electron 规定 session 必须在 app ready 后访问,生产环境每次启动抛 Session can only be received when app is ready主进程模块求值中途夭折。v0.8.1 仅将「防线一」(权限白名单)移入 whenReady,防线二漏改;开发模式因 ELECTRON_RENDERER_URL 条件跳过该代码块而从未暴露(FATAL 日志为证)。
      2. ipc/shared.ts 保存 workspace.path 时经动态 import('../main') 取函数,与入口模块形成循环依赖;打包产物中模块命名空间在求值末尾才初始化,求值一旦中断即永远处于暂时性死区 —— 该 import 必然抛 TDZ 错误 → config:set 失败 → 前端回滚 + 报错。
    • 修复:两条安全防线统一收敛为 registerSecurityHardening(),挂载于 whenReady() 链且先于 initialize() 执行(CSP 拦截在主窗口首个 mainFrame 请求前就位);单防线失败仅记日志、不阻断启动链。
    • 副作用修正:权限白名单与 CSP 自 v0.6.4 引入以来从未注册成功(每次启动都在注册处崩溃),本版起首次真正生效

    2. 继承数据库静默丢数根治(数据安全)

    • 现象:切换时勾选「继承数据库」,重启后新空间的历史会话/消息/记忆/Trace 全部为空,日志出现 user_version 0 → 6 全量重建(空库特征);伴随 unhandledRejection: The database connection is not open FATAL。
    • 根因workspace:inheritFiles 中 better-sqlite3 的 backup() 返回 Promise 未 await —— 备份尚未完成即 close() 源库,备份被中途掐断:目标 agent.db 仅剩 4096 字节空壳单页;「Inherited」成功日志先于实际完成打印,备份失败的 rejection 无人接住。是否丢数据取决于源库大小与机器时序,属竞态型静默数据丢失
    • 修复await srcDb.backup(dstFile) 完成后再关闭源库;失败仍回退 copyFileSync(WAL checkpoint 一致性快照语义保留)。

    3. 切换后设置页回显滞后修复

    • 现象:切换工作空间并重启后,设置页工作空间输入框显示的仍是旧路径(勾选继承数据库时)或空(未继承时)。
    • 根因:切换流程先复制旧空间 DB(内含旧 workspace.path)到新空间,随后 config:set 将新路径写入旧空间的 DB —— 新空间 DB 携带的路径滞后一位;未继承 DB 的全新空间则根本没有该键。
    • 修复:启动时以 workspace-config.json(决定本次加载哪个空间的权威源)回写对齐当前空间 DB —— 自愈一切来源的漂移(继承复制滞后 / 全新空间缺键 / 引导向导写入),保证 config:get('workspace.path') 与实际加载的工作空间永远一致。存量用户升级后首次启动自动纠正,无需手动处理。

    工程面配套

    • 工作空间路径持久化(read/writeWorkspacePathToFile)自 main.ts 抽离为 electron/utils/workspace-path.ts 独立模块,main ↔ ipc/shared 循环依赖彻底消除 —— 即使未来入口模块再出问题,切换保存链路不再被连坐;文件路径使用时实时计算(兼容 E2E 的 METONA_USER_DATA_DIR 重定向,不受 ESM import 提升影响)。
    • writeWorkspacePathToFile 写失败改为向上抛出:恢复 v0.3.10「写失败必须告知用户」契约(原实现内部吞错,错误上报路径为死代码);启动期回写调用点加容错,不中断初始化。

    🧠 思考强度新增 xhigh / true 档(四档 → 六档)

    • 背景:Qwen3 等新一代模型的 Ollama 思考模板原生档位为 xhigh (default) / medium / low,旧版四档(low / medium / high / max)只发 high 会触发模板 500 Unexpected reasoning effort high;另有模型仅接受布尔 think 参数。
    • 新档位语义与各 Provider 映射agent.thinkingEffort:low / medium / high / xhigh / max / true):
    档位 Ollama OpenAI DeepSeek Anthropic Agnes / MiMo
    xhigh 原样下发 'xhigh' 就近降为 high 就近降为 high 24576 token 预算(介于 high 与 max) 布尔 true
    true 下发布尔 true(交由模型思考模板取自身默认档) 归一 high 归一 high 16384(同 high) 布尔 true
    • 设置面板「思考强度」下拉新增「极高(xhigh)」与「模型默认(true)」两个选项,中英文案齐备。
    • 档位类型收敛单一来源:新增 MetonaThinkingEffort(IR 层 metona-request.ts 定义,引擎 / 配置注入 / UI 共用),替换散落 4 处的内联 union,消除漂移风险。
    • 适配器请求形状测试矩阵新增 6 个用例(Ollama xhigh/true 透传、OpenAI / DeepSeek / Anthropic 新档映射)。

    📥 发行物

    • MetonaAI Desktop Setup 0.8.3.exe —— Windows x64 NSIS 安装包(已签名)
    • latest.yml / .blockmap —— 自动增量更新元数据

    质量验证

    • 类型检查(node + web)、ESLint、2217 用例全量回归(96 文件,较 v0.8.2 新增 6 个档位矩阵用例)全绿;
    • 生产模式产物(electron .,无 ELECTRON_RENDERER_URL)+ 隔离 userData 真实 GUI E2E 全流程:启动零 FATAL(修复前每次必现)→ 校验切换 → 确认保存 → 重启 → 新空间加载(Schema up to date,31 行配置数据完整继承,目标库 192KB 而非空壳 4KB)→ 设置页正确回显新路径 → 全程日志零错误。
    Downloads