feat: v0.3.17 修复多项问题(sandbox/全局配置层/继承选项/配置刷新/附件提示/content_filter 错误处理)
- fix: sandbox: true → false(ESM preload 不兼容 sandbox 导致 window.metona 不可用,选择文件夹按钮无反应) - feat: 全局配置层(GlobalConfigService)— LLM/Agent 等配置跨工作空间共享,切换工作空间后不再丢失 - 读取时工作空间 DB 空值或默认值回退到全局 JSON - 写入时双写(DB + 全局 JSON) - 首次启动迁移旧配置到全局层 - fix: 工作空间继承选项显示条件放宽 + push 前校验避免覆盖目标已有文件(SOUL.md/agent.db) - fix: config:changed IPC 广播 + 前端监听,修改 Agent 配置后详情栏 maxIterations 实时刷新 - feat: 上传图片/文件时在 System Prompt 注入附件提示,避免 AI 在工作空间查找用户上传的文件 - feat: content_filter 错误识别(ContentFilterError)+ 友好提示,替代原始 JSON 错误体透传 - fix: JSDoc 注释中 llm.* / agent.* / onboarding.completed 中的 */ 被解析为注释结束符
This commit is contained in:
@@ -22,6 +22,7 @@ import log from 'electron-log';
|
||||
import { DatabaseService } from './services/database.service';
|
||||
import { SessionService } from './services/session.service';
|
||||
import { ConfigService } from './services/config.service';
|
||||
import { GlobalConfigService } from './services/global-config.service';
|
||||
import { WorkspaceService } from './services/workspace.service';
|
||||
import { AuditService } from './services/audit.service';
|
||||
import { SessionRecorder } from './services/session-recorder.service';
|
||||
@@ -131,8 +132,33 @@ async function initialize(): Promise<void> {
|
||||
databaseService.initialize();
|
||||
const db = databaseService.getDB();
|
||||
|
||||
// v0.3.17: 初始化全局配置层(跨工作空间共享 LLM/Agent/onboarding 等机器级配置)
|
||||
// 必须在 ConfigService 创建前初始化,以便注入
|
||||
const globalConfigService = new GlobalConfigService();
|
||||
globalConfigService.initialize();
|
||||
|
||||
const sessionService = new SessionService(() => db);
|
||||
const configService = new ConfigService(() => db);
|
||||
// 注入全局配置层:读取时回退到全局 JSON,写入时双写
|
||||
configService.setGlobalConfig(globalConfigService);
|
||||
|
||||
// v0.3.17 迁移: 首次启用全局配置层时,把工作空间 DB 中的全局配置同步到全局 JSON
|
||||
// 幂等设计:migrateFromWorkspaceDB 仅写入全局层不存在的 key,重复执行无副作用
|
||||
// 解决场景:老用户从 v0.3.16 升级,LLM 配置在工作空间 DB 里,需要迁移到全局层
|
||||
// 注意: 此处直接查 DB 而不通过 configService.getAll(),因为后者会合并全局层,导致迁移逻辑循环
|
||||
const configRows = db.prepare('SELECT key, value FROM app_config').all() as Array<{ key: string; value: string }>;
|
||||
const workspaceConfig: Record<string, unknown> = {};
|
||||
for (const row of configRows) {
|
||||
try {
|
||||
workspaceConfig[row.key] = JSON.parse(row.value);
|
||||
} catch {
|
||||
workspaceConfig[row.key] = row.value;
|
||||
}
|
||||
}
|
||||
const migratedCount = globalConfigService.migrateFromWorkspaceDB(workspaceConfig);
|
||||
if (migratedCount > 0) {
|
||||
log.info(`[MIGRATION] Migrated ${migratedCount} global config keys from workspace DB to global layer`);
|
||||
}
|
||||
|
||||
// ===== 日志服务 =====
|
||||
const auditService = new AuditService(() => db);
|
||||
|
||||
Reference in New Issue
Block a user