修复: - main.ts 退出释放模型显存改用 getSetting(serverUrl),不再硬编码 127.0.0.1:11434(避免非默认地址时释放请求打到错误端口) - 备份导出/导入并入 localStorage 持久化状态(会话摘要、度量历史、轨迹降级缓存、主题),版本升级到 v2,实现完整备份 - 工具数量改为 getEnabledToolDefinitions().length 动态计算,删除写死"32 个"的硬编码 - 记忆日志区分操作来源:memory:write 透传 reason,标注"新增记忆/替换/删除/清空/TTL 衰减清理/访问统计写回(无新条目)",避免"写了但看不到新记忆"的困惑 可维护性: - 上下文压力逻辑收敛到统一 calculateContextStats,删除 getContextPressureLevel / getTrendAwareCompressThreshold 的重复实现 - 消除 validateToolArgs 同名碰撞(agent-engine 本地版改名 validateToolArgsQuick) - 子代理工具集改用 getEnabledToolDefinitions() 基线,跟随全局启用开关与 Plan 模式 - 抽取 html-utils.ts 纯函数模块(实体解码/HTML→文本/HTML→Markdown/拦截页检测/相关性评分),tool-handlers-system 净减约 190 行重复代码 - 统一静态导入(savePlanTracker/setPlanModeActive/collectDiagnostics/addWrittenFile) - console.* 使用处补充豁免说明(启动/退出/刷盘阶段无渲染进程可推送日志) - run_command 工具描述改为反映可配置执行模式 测试: - 新增 7 个测试文件 + 扩展 2 个,共 273 个测试(原 34 → 273) - 覆盖 agent-engine / agent-safety / context-manager / tool-registry / result-formatter / tool-parsing / memory-service / crypto / build-context / html-utils / utils / tool-handlers-fs - 全部通过 npm run typecheck && npm test && npm run build
This commit is contained in:
+7
-3
@@ -20,6 +20,7 @@ const ERROR_LOG = path.join(app.getPath('userData'), 'startup-error.log');
|
||||
function logStartupError(phase: string, err: unknown): void {
|
||||
const msg = `[${new Date().toISOString()}] ${phase}: ${err instanceof Error ? err.stack || err.message : String(err)}\n`;
|
||||
try { fs.appendFileSync(ERROR_LOG, msg); } catch { /* ignore */ }
|
||||
// 豁免:进程启动阶段的未捕获错误发生在渲染进程与日志面板就绪之前,只能落到 stderr
|
||||
console.error(msg);
|
||||
}
|
||||
|
||||
@@ -246,15 +247,17 @@ app.on('before-quit', async () => {
|
||||
// 通知渲染进程释放显存
|
||||
mainWindow?.webContents.send('app-quit');
|
||||
// 主进程直接调用 Ollama API 释放显存(更可靠,不依赖渲染进程)
|
||||
// 地址从设置读取(与启动时 CORS 清单逻辑保持一致),避免使用非默认地址时释放请求打到错误端口
|
||||
try {
|
||||
const OLlama_URL = 'http://127.0.0.1:11434';
|
||||
const psResp = await fetch(`${OLlama_URL}/api/ps`);
|
||||
const serverUrl = getSetting<string>('serverUrl', 'http://127.0.0.1:11434');
|
||||
const ollamaUrl = (serverUrl || 'http://127.0.0.1:11434').replace(/\/+$/, '');
|
||||
const psResp = await fetch(`${ollamaUrl}/api/ps`);
|
||||
if (psResp.ok) {
|
||||
const psData = await psResp.json() as { models?: Array<{ name: string }> };
|
||||
const models = psData.models || [];
|
||||
for (const m of models) {
|
||||
try {
|
||||
await fetch(`${OLlama_URL}/api/generate`, {
|
||||
await fetch(`${ollamaUrl}/api/generate`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ model: m.name, keep_alive: 0 }),
|
||||
@@ -262,6 +265,7 @@ app.on('before-quit', async () => {
|
||||
} catch { /* 忽略单个模型释放失败 */ }
|
||||
}
|
||||
if (models.length > 0) {
|
||||
// 豁免:before-quit 阶段渲染进程已进入关闭流程,释放显存结果仅记录到主进程 stderr
|
||||
console.log(`[before-quit] 已释放 ${models.length} 个模型显存`);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user