Fix: - Plan Mode 自动追踪 — 工具执行成功后自动匹配步骤标记完成,不再依赖模型调用 plan_track - 待办全部完成时注入正面确认信号,防止模型遗忘已完成的写入操作 - plan_track 提示词简化 — 移除冗余催促文本,进度自动更新 - 搜索自动抓取硬上限 MAX_AUTO_FETCH=8 + 相关性过滤 - 工作空间路径安全豁免 — 修复 AppData 黑名单自相矛盾 - 浏览器回退 LRU 缓存 — 同 URL 10min 内不重复渲染 - Plan Mode 任务描述固化到系统提示词 — 压缩后不丢失 - ephemeral 清理高负载时跳过 — Plan 进度在压缩时仍可见 - SearXNG 抓取条数输入框 min=1 max=8
130 lines
3.4 KiB
TypeScript
130 lines
3.4 KiB
TypeScript
/**
|
|
* Metona Ollama Desktop - 原生菜单
|
|
*/
|
|
|
|
import { Menu, dialog, shell, app } from 'electron';
|
|
import { mainWindow, setQuitting, getIconPath } from './main.js';
|
|
|
|
export function createMenu(): void {
|
|
const template: Electron.MenuItemConstructorOptions[] = [
|
|
{
|
|
label: '文件',
|
|
submenu: [
|
|
{
|
|
label: '新建会话',
|
|
accelerator: 'Ctrl+N',
|
|
click: () => mainWindow?.webContents.send('menu-action', 'new-chat')
|
|
},
|
|
{ type: 'separator' },
|
|
{
|
|
label: '导入会话',
|
|
click: () => mainWindow?.webContents.send('menu-action', 'import')
|
|
},
|
|
{
|
|
label: '导出会话',
|
|
accelerator: 'Ctrl+Shift+E',
|
|
click: () => mainWindow?.webContents.send('menu-action', 'export')
|
|
},
|
|
{ type: 'separator' },
|
|
{
|
|
label: '退出',
|
|
accelerator: 'Ctrl+Q',
|
|
click: () => {
|
|
setQuitting();
|
|
app.quit();
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
label: '编辑',
|
|
submenu: [
|
|
{ role: 'undo', label: '撤销' },
|
|
{ role: 'redo', label: '重做' },
|
|
{ type: 'separator' },
|
|
{ role: 'cut', label: '剪切' },
|
|
{ role: 'copy', label: '复制' },
|
|
{ role: 'paste', label: '粘贴' },
|
|
{ role: 'selectAll', label: '全选' }
|
|
]
|
|
},
|
|
{
|
|
label: '视图',
|
|
submenu: [
|
|
{ role: 'reload', label: '刷新' },
|
|
{ role: 'forceReload', label: '强制刷新' },
|
|
{ type: 'separator' },
|
|
{ role: 'zoomIn', label: '放大' },
|
|
{ role: 'zoomOut', label: '缩小' },
|
|
{ role: 'resetZoom', label: '重置缩放' },
|
|
{ type: 'separator' },
|
|
{ role: 'togglefullscreen', label: '全屏' }
|
|
]
|
|
},
|
|
{
|
|
label: '窗口',
|
|
submenu: [
|
|
{ role: 'minimize', label: '最小化' },
|
|
{
|
|
label: '最大化/还原',
|
|
click: () => {
|
|
if (mainWindow?.isMaximized()) mainWindow.unmaximize();
|
|
else mainWindow?.maximize();
|
|
}
|
|
},
|
|
{ type: 'separator' },
|
|
{
|
|
label: '置顶',
|
|
type: 'checkbox',
|
|
checked: false,
|
|
click: (menuItem: Electron.MenuItem) => {
|
|
mainWindow?.setAlwaysOnTop(menuItem.checked);
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
label: '帮助',
|
|
submenu: [
|
|
{
|
|
label: '使用帮助',
|
|
click: () => mainWindow?.webContents.send('menu-action', 'help')
|
|
},
|
|
{ type: 'separator' },
|
|
{
|
|
label: '关于 Ollama',
|
|
click: () => shell.openExternal('https://ollama.com')
|
|
},
|
|
{
|
|
label: '关于 Metona',
|
|
click: () => {
|
|
dialog.showMessageBox(mainWindow!, {
|
|
type: 'info',
|
|
title: '关于 Metona Ollama',
|
|
message: 'Metona Ollama Desktop v0.12.5',
|
|
detail: 'TypeScript + Electron Ollama AI 聊天客户端\n\nhttps://gitee.com/thzxx/metona-ollama',
|
|
icon: getIconPath()
|
|
});
|
|
}
|
|
}
|
|
]
|
|
}
|
|
];
|
|
|
|
if (!app.isPackaged) {
|
|
template.push({
|
|
label: 'Dev',
|
|
submenu: [
|
|
{
|
|
label: '切换开发者工具',
|
|
accelerator: 'F12',
|
|
click: () => mainWindow?.webContents.toggleDevTools()
|
|
}
|
|
]
|
|
});
|
|
}
|
|
|
|
const menu = Menu.buildFromTemplate(template);
|
|
Menu.setApplicationMenu(menu);
|
|
}
|