feat: v5.0 全面进化 — 浏览器控制 + 训练数据导出 + Cron 定时任务

新增功能:

1. 🌐 浏览器控制(8 个工具)
   - 主进程 browser.ts: 基于隐藏 BrowserWindow 的浏览器引擎
   - browser_open: 加载 URL,返回标题和最终 URL
   - browser_screenshot: 页面截图(base64 PNG)
   - browser_evaluate: 执行任意 JS,支持 DOM 操作
   - browser_extract: 提取页面文本 + 链接(最多 50 条)
   - browser_click: CSS 选择器点击
   - browser_type: 输入框文本输入
   - browser_scroll: 上下滚动/顶部/底部
   - browser_close: 关闭浏览器释放资源
   - 应用退出时自动清理 (before-quit)
   - 工具总数:34 个

2. 📚 训练数据导出
   - training-export.ts: 从 traces + messages 提取 SFT 格式训练数据
   - 输出 JSONL 格式(instruction/input/output/tools/observations/metadata)
   - 设置面板一键导出,Electron 原生文件对话框选择保存位置

3.  Cron 定时任务
   - cron-manager.ts: one-shot(指定时间)+ recurring(周期性)
   - 任务配置持久化到 settings
   - 设置面板添加/删除/启用/禁用
   - 任务触发时自动填入聊天输入框 + toast 通知
   - 应用启动时自动恢复所有已启用任务

新增文件:browser.ts, cron-manager.ts, training-export.ts
修改文件:ipc.ts, main.ts, settings-modal.ts, index.html, main.ts(渲染), tool-registry.ts
This commit is contained in:
thzxx
2026-04-18 09:29:29 +08:00
parent 374d86086e
commit 889d34b484
9 changed files with 730 additions and 3 deletions
+10
View File
@@ -47,6 +47,7 @@ import {
handleGit,
handleCompress
} from './tool-handlers.js';
import { browserOpen, browserScreenshot, browserEvaluate, browserExtract, browserClick, browserType, browserScroll, browserClose } from './browser.js';
import { getAllowedDirs, getBlockedDirs, setAllowedDirs } from './tool-security.js';
import { startProcess, killProcess, getWorkspaceDir, setWorkspaceDir, listWorkspaceDir } from './workspace.js';
@@ -175,6 +176,15 @@ export async function setupIPC(): Promise<void> {
case 'read_multiple_files':result = await handleReadMultipleFiles(args as { paths: string[]; max_chars_per_file?: number }); break;
case 'git': result = await handleGit(args as any); break;
case 'compress': result = await handleCompress(args as { action: string; path: string; destination?: string; format?: string }); break;
// v5.0 Browser 控制
case 'browser_open': result = await browserOpen(args.url as string); break;
case 'browser_screenshot': result = await browserScreenshot(); break;
case 'browser_evaluate': result = await browserEvaluate(args.js as string); break;
case 'browser_extract': result = await browserExtract(); break;
case 'browser_click': result = await browserClick(args.selector as string); break;
case 'browser_type': result = await browserType(args.selector as string, args.text as string); break;
case 'browser_scroll': result = await browserScroll((args.direction as string) || 'down'); break;
case 'browser_close': browserClose(); result = { success: true }; break;
default: return { success: false, error: `未知工具: ${toolName}` };
}
// 结果日志