fix: 全面修复审计问题并优化系统提示词
**崩溃/挂死修复 (5):** - 统一 TrayManager.isQuitting 变量,修复 Cmd+Q 无法退出 - useAgentStream 闭包过期快照 → 每次 getState() - Agnes chatStream 添加 AbortSignal.timeout - SSE JSON.parse 添加 try-catch 保护 - Orchestrator setTools 污染 → save/restore 模式 **功能修复 (14):** - 上下文压缩实现 (每5轮 COMPRESSING 状态) - 修复 requestId 硬编码空串 - ConfigService.set() 保留已有 category - MemoryManager 新增 working 类型搜索 - PromptInjectionDefender 补全 sanitize() - Ollama: 补全 dynamicReminders + reasoningContent - openai-format: 所有 assistant 消息保留 reasoningContent - SSE: finish_reason 时提前 flush tool_calls - DeepSeek thinking effort 映射注释 - Ollama done_reason load→stop - RateLimitHook >= 边界修复 - WorkspaceService isValid 首次启动修复 - sessions:archive IPC handler - 托盘/窗口图标路径生产环境修复 **系统提示词优化:** - SOUL.md 存在时不显示兜底身份,原文放最前 - 兜底身份改为中文 (MetonaAI 自身描述) - 用户文本在前,附件内容在后 **文件上传:** - 非图片文件不再 base64 编码,保留 JSON 结构 - 用户文本优先于文件内容 **UI 修复:** - 首页 Logo 路径修复 (public/ + 相对路径) - TokenUsage contextWindow 动态计算 (Provider 感知) - 切换 Provider 同步 contextWindow - 托盘图标始终显示 Logo (状态由右键菜单展示)
This commit is contained in:
@@ -67,6 +67,13 @@ export class TrayManager {
|
||||
log.info('System tray initialized');
|
||||
}
|
||||
|
||||
/**
|
||||
* 标记应用正在退出(窗口关闭时不阻止)
|
||||
*/
|
||||
static markQuitting(): void {
|
||||
TrayManager.isQuitting = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新托盘状态
|
||||
*/
|
||||
@@ -121,36 +128,41 @@ export class TrayManager {
|
||||
|
||||
/**
|
||||
* 获取托盘图标路径
|
||||
*
|
||||
* 优先级:process.resourcesPath(打包后)> resourcesPath 参数(开发模式) > __dirname fallback
|
||||
*/
|
||||
private getTrayIconPath(): string | null {
|
||||
// 优先使用 ico(Windows),其次 png(macOS/Linux)
|
||||
const candidates = [
|
||||
join(this.resourcesPath, 'logo.ico'),
|
||||
join(this.resourcesPath, 'logo.png'),
|
||||
join(this.resourcesPath, 'icon.ico'),
|
||||
join(this.resourcesPath, 'icon.png'),
|
||||
const searchDirs: string[] = [
|
||||
join(process.resourcesPath || '', 'app.asar.unpacked', 'assets'),
|
||||
join(process.resourcesPath || '', 'assets'),
|
||||
this.resourcesPath,
|
||||
join(__dirname, '../../assets'),
|
||||
];
|
||||
|
||||
for (const candidate of candidates) {
|
||||
if (existsSync(candidate)) return candidate;
|
||||
const candidates = ['logo.ico', 'logo.png', 'icon.ico', 'icon.png'];
|
||||
|
||||
for (const dir of searchDirs) {
|
||||
for (const name of candidates) {
|
||||
const fullPath = join(dir, name);
|
||||
if (existsSync(fullPath)) return fullPath;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新托盘图标(根据状态)
|
||||
* 更新托盘图标
|
||||
*
|
||||
* 始终使用原始 logo 图标(状态已在右键菜单中显示,图标保持品牌识别)。
|
||||
*/
|
||||
private updateTrayIcon(status: TrayStatus): void {
|
||||
private updateTrayIcon(_status: TrayStatus): void {
|
||||
if (!this.tray) return;
|
||||
|
||||
// 基础图标
|
||||
const iconPath = this.getTrayIconPath();
|
||||
if (!iconPath) return;
|
||||
const basePath = this.getTrayIconPath();
|
||||
if (!basePath) return;
|
||||
|
||||
// 对于 thinking/executing 状态,可以使用 overlay 图标
|
||||
// 当前实现使用基础图标,后续可扩展
|
||||
const image = nativeImage.createFromPath(iconPath);
|
||||
const image = nativeImage.createFromPath(basePath);
|
||||
this.tray.setImage(image.resize({ width: 16, height: 16 }));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user