feat: v0.7.0 四阶段全量迭代 — 修复面收口 · 安全纵深 · 架构还债 · 能力演进
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:
@@ -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)=====
|
||||
//
|
||||
// 既有模式是"幂等探测式迁移":每次启动都跑全套探测 SQL(table_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}`);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user