feat: v0.7.0 四阶段全量迭代 — 修复面收口 · 安全纵深 · 架构还债 · 能力演进
CI / 类型检查 + Lint + 单元测试 (push) Failing after 5m45s
CI / 全量测试 (Electron ABI) (push) Failing after 5m22s
CI / 产物编译验证 (push) Successful in 10m3s

P1 修复面收口: v0.6.3 截断自愈推全量(Anthropic/Ollama/非流式/引擎兜底); SSE 上游错误帧检测进重试通道;
clearMessages 摘要游标根治; truncateResult 内联图片白名单统一; 前端四 bug(确认弹窗锁死/MemoryViewer/
Virtuoso Footer/abort 尾部过滤) + reasoning 缓冲跨迭代污染; 托盘通知过滤与新建会话死链接线

P2 安全纵深: MCP 审批闭环(ConfirmationHook×PolicyEngine 联动+重名拒注册); SSRF 收敛 ssrf-guard 共享模块
(web_fetch 双通道校验+重定向终态复检); Electron 加固(preload CJS 化→sandbox:true/CSP/权限白名单/will-navigate);
run_command cmd.exe 白名单通道元字符守门; diff_viewer 10MB 预检; Anthropic thinking 预算下限; Agnes 思考显式关闭

P3 架构还债: OpenAICompatibleAdapter 中间基类收敛四家样板; 错误分类单轨化(删 mapError/getFetchSignal,
超时显式 ETIMEDOUT); PRAGMA user_version 迁移版本化; 死代码清理专项(cn.ts/SHORTCUTS/ContextMenu 分支/
getWindowState/modifiedArgs/sandbox 空壳); i18next 引入; a11y 第一轮; SearXNG 页批量草稿模型统一

P4 能力演进: Ollama pull 可取消/capabilities 探测/num_ctx 实测缓存; UpdateService feed 比对式自动更新
(app:updateCheck IPC + StatusBar 入口); MiMo providerOptions(web_search 服务端工具/strict JSON);
web_fetch extract_mode=markdown(turndown); network.proxyUrl 全局代理(Chromium sessions+undici dispatcher)

测试: 264 → 507 用例(Electron ABI 全绿零跳过), 覆盖引擎压缩管线/重试竞速/MEMORY.md 闸门/file_editor 五操作/
filesystem 七工具实体夹具/git 真实仓库/SSE 错误帧/全线截断自愈/Provider 请求形态矩阵/SSRF 表测/钩子分级矩阵/
OutputValidator 全量/SLO 指标/MCP 安全纯函数/task_manager 链路/渲染层纯域/i18n 桥契约
This commit is contained in:
2026-08-27 17:06:58 +08:00
parent b6e2a8bd25
commit 3940716dc2
78 changed files with 6369 additions and 1341 deletions
+40
View File
@@ -99,6 +99,14 @@ export class DatabaseService {
private db: Database.Database | null = null;
private dbPath: string;
/**
* v0.6.4 P3-3: 当前 schema 版本号(PRAGMA user_version 目标值)。
* 每次在 runMigrations 中新增一个迁移时 +1。首次升级到版本化机制后,
* 版本号相同的库将跳过整个探测式迁移批次。
*/
static readonly SCHEMA_VERSION = 1;
constructor(workspacePath?: string) {
const baseDir = workspacePath ?? join(app.getPath('userData'), 'MetonaWorkspaces', 'default');
const metonaDir = join(baseDir, '.metona');
@@ -364,6 +372,34 @@ export class DatabaseService {
private runMigrations(): void {
const db = this.db!;
// ===== v0.6.4 P3-3: schema 版本化(PRAGMA user_version=====
//
// 既有模式是"幂等探测式迁移":每次启动都跑全套探测 SQLtable_info、
// foreign_key_list、sqlite_master 匹配等)。在当前体量下可用,但存在两个
// 越来越脆的问题:(1) 启动耗时随迁移数量线性增长;(2) 探测语句之间存在
// 隐式次序耦合(如迁移 5 的无条件 FTS rebuild 依赖虚拟表已建)。
//
// 版本化策略(保留兼容,不破坏任何存量库):
// - SCHEMA_VERSION 每新增一个迁移 +1
// - 存量库首次启动 user_version=0 < SCHEMA_VERSION → 完整跑一遍幂等批次
// (各迁移本身安全),成功后盖章版本号;
// - 已盖章的库 → 直接跳过整个探测批次的执行;
// - 回滚到旧版应用不会降级数据(旧代码不读 user_version,仍走幂等路径)。
const currentVersion =
typeof db.pragma('user_version', { simple: true }) === 'number'
? (db.pragma('user_version', { simple: true }) as number)
: 0;
if (currentVersion >= DatabaseService.SCHEMA_VERSION) {
log.info(
`[DB] Schema up to date (user_version=${currentVersion}, target=${DatabaseService.SCHEMA_VERSION}) — skipping migration probe batch`,
);
return;
}
log.info(
`[DB] Running schema migrations (user_version ${currentVersion}${DatabaseService.SCHEMA_VERSION})`,
);
// L-6 修复: 提取 tryAddColumn 辅助方法,消除 4 处重复的 try/catch 模式
// L-8 修复: 使用 toErrorMessage 替代重复的 error instanceof Error 三元表达式
const tryAddColumn = (table: string, column: string, type: string) => {
@@ -590,6 +626,10 @@ export class DatabaseService {
});
runAllMigrations();
// v0.6.4 P3-3: 迁移成功后盖章 user_version —— 后续启动走快速路径,
// 不再每次执行全套 PRAGMA 探测 SQL。
db.pragma(`user_version = ${DatabaseService.SCHEMA_VERSION}`);
}
/**