Open
Conversation
- gm-api.spec.ts: Phase 2 重启 context 后等待 service worker 注册完成 再交给 fixtures,避免 extensionId fixture 用 10s 全局超时等待失败 - gm-api.spec.ts: 用事件驱动 Promise 替换 500ms 轮询循环, console 结果一出现立即继续 - utils.ts: installScriptByCode 用 DOM 事件等待替代固定延迟: click 后等光标出现,粘贴后等 .view-lines 内容变化 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
新增 AI Agent 聊天模块,包括聊天界面、服务层、数据存储和多语言支持
将 Agent API 请求路由到 runtime/gmApi 通道,通过 @PermissionVerify.API 装饰器实现权限验证,脚本首次调用时弹窗确认,防止未授权消耗 API Token。
- 新增 OPFS 文件浏览器页面,支持目录浏览、文件预览和删除操作 - 默认进入 agents/ 目录,支持面包屑导航到根目录 - 支持在 conversation.create 时注册工具,简化多轮对话的工具传递 - 添加 8 种语言的 i18n 翻译
- 修复 callLLM 提前转发 done 事件导致客户端过早 resolve 的问题 - 修复 WindowMessage.connect 未使用 "*" targetOrigin 导致沙箱消息被丢弃 - 修复 tool calling 循环中 assistant 消息缺少 tool_calls 字段 - 支持 OpenAI 和 Anthropic 格式的 tool_calls 消息构建 - UI 合并 tool 结果到 assistant 的 ToolCallBlock 展示,过滤 tool/system 消息 - 提取 buildInstance 函数解决装饰器 this 绑定问题,使用 uuidv4 生成 ID
- ChatMessage 类型新增 usage/durationMs/firstTokenMs 字段 - Service Worker 测量 LLM 调用总耗时并通过 done 事件返回 - UI 层捕获首 token 延迟和 token 用量,持久化到消息中 - 新增 MessageToolbar 组件:左侧操作按钮(复制/重新回答/删除),右侧元数据信息(token用量/耗时/TTFT/工具调用数) - 流式期间显示实时计时动画,完成后切换为最终数据 - 删除操作支持二次确认 - 新增 deleteMessages 批量删除辅助函数 - 添加 i18n 多语言支持(8个locale)
- 新增 CATTool 元数据解析、存储、注册和执行完整链路 - 新增 CAT.agent.tools GM API(install/remove/list/call) - 修复 CATTool 沙箱执行时 args 未定义的问题:使用 compileScriptCodeByResource 包裹代码以启用 with 上下文绑定 - 优化 Agent Chat UI 组件样式
将 App.tsx (~1130行) 按职责拆分为: - utils.ts: 纯工具函数和常量 - hooks.tsx: useInstallData() 自定义 hook - components/CATToolInstallView.tsx: CATTool 安装视图 - components/ScriptInstallView.tsx: UserScript/Subscribe 安装视图 - App.tsx: 精简为路由分发 (~57行)
新增 example/agents/tools/ 目录: - hello_world.js: 最简 CATTool 示例 - text_processor.js: 多参数和 enum 类型 - json_formatter.js: JSON 处理和错误处理 - weather_query.js: GM_xmlhttpRequest 网络请求 - use_cattool.js: 通过脚本 API 安装和调用 CATTool - README.md: 格式说明和测试方法
- 修复历史消息未携带 toolCalls 字段导致多轮 tool calling 上下文丢失 - 添加 OpenAI 流式 API 错误响应处理 - 添加 /new 命令和 clearMessages 接口用于清空对话上下文 - UI 发送消息时正确传递 toolCallId 和 toolCalls
- 删除独立的 handleChat,UI 和 Sandbox 统一走 conversationChat 通道 - 持久化责任从 UI 移交到 SW,简化前端逻辑 - 字段命名统一:createdAt/updatedAt → createtime/updatetime - 支持 UI 动态切换 modelId - 大幅补充 Agent 相关测试(流式解析、tool calling 循环、CATTool 边界等)
- 对话实例支持 / 命令拦截机制,内置 /new 命令清空对话 - 脚本可通过 commands 选项注册自定义命令并覆盖内置命令 - 修复会话列表删除确认弹框因鼠标移开导致隐藏的问题 - 会话 ID 同步到 URL 参数,刷新页面保持当前会话选中 - 新增命令机制 8 个单元测试
- CATTool 安装改为打开安装页面确认,支持脚本来源追踪和更新提示 - CATToolRepo 索引/数据分离(tools.json 索引 + data/<id>.json 完整记录) - CATTool UUID 由 SW 统一生成,通过全局映射支持 GM API 权限验证 - AgentModelConfig 从 SystemConfig 迁移到独立的 AgentModelRepo - AgentModelRepo.getDefaultModelId 使用 chrome.storage.local 直接存取 - cancelCATToolInstall 统一为 try/finally 模式 - openCATToolInstallPage 增加 tab.id 空值检查
实现 Agent 框架的 DOM 操作 API,支持两种模式: - 默认模式:通过 chrome.scripting.executeScript 操作 - trusted 模式:通过 chrome.debugger CDP 实现真实用户输入 新增 8 个 Agent 工具:dom_list_tabs, dom_navigate, dom_read_page, dom_screenshot, dom_click, dom_fill, dom_scroll, dom_wait_for readPage 支持 summary/detail 分层读取,控制上下文大小; 操作后自动返回 ActionResult(跳转/新 tab/dialog 检测); debugger 权限放在 optional_permissions 动态申请。
- 新增 Skill 类型定义(SkillSummary, SkillRecord, SkillApiRequest 等) - SKILL.md 解析器(YAML frontmatter + markdown body) - SkillRepo OPFS 存储(registry + scripts + references) - AgentService 集成:loadSkills, installSkill, resolveSkills - 2 个 meta-tool:execute_skill_tool, read_reference - GM API: CAT.agent.skills(list/get/install/remove) - UI: ChatInput 增加 Skills 选择器
- agent-fixtures.ts: Mock LLM 基础设施(context.route 拦截 + OpenAI SSE 响应) - agent-conversation.spec.ts: 基础对话、Tool Calling、多轮上下文保持 - agent-cattool.spec.ts: CATTool 安装/调用/删除、CATTool + 对话联动
resolveSkills 不再将完整 SKILL.md 正文和 CATTool schema 一次性注入 system message, 改为三层渐进加载:1) 摘要列表 2) load_skill 按需获取 prompt 3) execute_skill_tool/read_reference 按需执行。 execute_skill_tool 新增 skill_name 参数确定工具作用域,CATTool 脚本改为执行时按需加载。 新增 14 个 Skill 系统单元测试。
ephemeral 模式下会话不持久化到 OPFS、不加载内置工具和 Skills, 工具完全由脚本提供,消息历史由脚本端内存管理。 SW 端无状态处理,仅解析 model 配置调用 LLM。
…rompts 实现完整的 MCP (Model Context Protocol) 客户端: - MCPClient: JSON-RPC 2.0 over HTTP POST,Session ID 管理,认证头 - MCPService: 连接池管理,懒连接,MCP 工具自动注册到 ToolRegistry - MCPServerRepo: chrome.storage 持久化服务器配置 - GM API: CAT.agent.mcp(SW + Content 双侧),权限验证 - UI: AgentMcp 页面 — 服务器 CRUD、启用/禁用、测试连接 - 单元测试覆盖 MCPClient、MCPToolExecutor、MCPService
agent_model:__default__ 存储的是默认模型 ID(字符串),被 find() 当作 AgentModelConfig 返回,导致 UI 访问 model.apiKey.length 时报 TypeError。
- 解析 SSE delta 中的 reasoning_content 字段,发出 thinking_delta 事件(兼容 deepseek/o-series) - 将 usage 检查移到 choices 处理之后,修复最后一个 chunk 同时包含 tool_call 增量和 usage 时丢失数据的问题 - Service Worker callLLM() 收集 thinking 内容并持久化到 assistant 消息 - 修复 vitest.config.ts 中重复 exclude 导致 e2e 测试被误执行的问题
- 注册 installSkill/removeSkill 消息处理到 AgentService.init() - AgentClient 新增 installSkill/removeSkill 方法 - 新建 AgentSkills.tsx:Skill 列表卡片、详情编辑弹窗、URL/粘贴安装弹窗 - 替换 /agent/skills 路由为实际管理页面 - 8 个语言文件新增 19 个 agent_skills_* 翻译 key - 新增 9 个单元测试覆盖安装/卸载/消息注册核心流程
新增 parseSkillZip 解析 ZIP 包(SKILL.md + tools/*.js + references/*), UI 增加 ZIP 上传 Tab,支持嵌套目录结构,含完整单元测试和端到端集成测试。
chrome.permissions.request() 在 MV3 Service Worker 中无法调用(需要用户手势), 改为打开 confirm.html 确认页面,用户点击授权按钮后通过 runtime.sendMessage 通知 SW。
将三层 meta-tool 设计(load_skill → execute_skill_tool → CATTool)简化为两层:
- load_skill 调用时动态注册该 skill 的 CATTool 为独立工具({skill}__{tool} 格式)
- callLLMWithToolLoop 每轮重新获取工具定义以发现新注册的工具
- 对话结束后清理动态注册的工具和 meta-tools
- 新增 prefixToolDefinition 辅助函数
- 新增 ServerDetailDrawer:展示 Tools/Resources/Prompts 三大能力 - 卡片操作栏增加"详情"按钮,通过 MCPClient 直接查询服务器能力 - 测试连接按钮增加 loading 状态 - 编辑 Modal 底部增加测试连接按钮,填完表单可直接测试 - 补充 8 个 locale 文件的 i18n key
Offscreen 转发 GM API 请求到 ServiceWorker 时,原先走 ExtensionMessage (chrome.runtime, JSON 序列化),导致 Blob 等结构化数据丢失。 改为通过 postMessage 通道(结构化克隆)双向传输,所有 GM API 自动受益。
所有 Offscreen→SW 通信统一走 ServiceWorkerClientMessage(postMessage), 不再需要 ExtensionMessage(chrome.runtime)。
扩展 offscreen 页面的 controller 通常为 null,改用 navigator.serviceWorker.ready 获取 registration.active 作为 SW 引用。
…b' into feature/agent # Conflicts: # src/app/service/offscreen/index.ts
- handleOPFSApi 根据 sender 判断通道类型:postMessage 直传 Blob,chrome.runtime 走 blobUrl 中转 - content script middleware 拦截 write Blob 转 blobUrl - offscreen 新增 fetchBlob handler - cat_agent_opfs 客户端兼容两种通道返回 - opfs_read Agent 工具一律返回 blobUrl,避免文件内容进入 LLM 上下文 - 移除 bloburl format,GM API read 只保留 text/blob - saveAttachments 支持无 data 的附件引用(已保存的 imageBlock) - tool_registry 添加错误日志输出
- executeScript: 动态代码固定 MAIN world(ISOLATED 下 new Function 被 MV3 CSP 拦截) - click/fill/scroll/waitFor/readPage: 静态函数改为 ISOLATED world(纯 DOM 操作无需 eval) - execute_script tool: 移除 world 参数,不再暴露给用户 - ExecuteScriptOptions: 移除 world 字段 - scriptcat.d.ts / scriptcat.zh-CN.d.ts: 同步更新类型定义
- 附件存储从 conversations/attachments 迁移到 workspace/uploads,LLM 可通过 OPFS 路径访问 - Provider 非图片附件改用 OPFS 路径引用,减少 context 占用 - LLM API 调用增加重试机制(最多 5 次,递增延迟),UI 显示倒计时 - 系统提示词优化:强化 loop detection、ask early 策略、工具调用预算 - get_tab_content/web_fetch 必须提供 prompt 参数,引导高效使用 - ToolRegistry 错误信息包含可用工具列表,帮助 LLM 自我纠正 - 编辑消息支持附件增删和粘贴,停止生成时正确标记 tool call 状态 - 修复 SenderRuntime null safety、stopGeneration 竞态、base64 编码性能 - 新增 CAT.agent.model.getSummary API、后台模式 tooltip i18n
优化内置工具列表说明、子代理使用指引、OPFS 工作区文档, 明确 execute_script 的 MAIN world 限制和 blob URL 访问规则
- task_tools: 新增 get_task(获取完整详情)和 delete_task(删除任务) - 工具 description 精简为能力描述,行为指导移入系统提示词 - 系统提示词 Task Management 重构为 When/When NOT/Workflow/Tips 结构 - ask_user description 精简,推荐选项规范移入系统提示词 - 新增 6 个 task_tools 测试用例
- 新增 sub_agent_types 模块,支持子代理类型定义与提示词生成 - 重构 compact 提示词,改用结构化 8 段摘要格式提升上下文延续质量 - 优化系统提示词分层架构,支持动态工具描述注入 - 改进子代理 UI 展示(折叠/展开、状态指示、工具调用详情) - 增强 agent 服务端子代理管理与消息流转
- 新增 tool_call_guard:检测重复/循环工具调用并注入系统警告 - ChatInput 新增斜杠命令弹出菜单(/ 触发,键盘导航) - 子代理执行详情(消息历史、用量)持久化到 ToolCall 并在 UI 展示 - SubAgentBlock / MessageItem UI 改进
会话列表新增下载按钮,点击可将会话导出为 .md 文件, 支持用户/助手/系统消息、thinking 块、工具调用、子代理详情等。
- agent_dom.test: readPage/executeScript world 参数期望与实现对齐 - execute_script.test: 删除不支持的 world 参数测试用例 - opfs_tools.test: 添加 setCreateBlobUrlFn 初始化,content→blobUrl - service_worker/agent.test: handleOPFSApi 添加 sender 参数, handleModelApi 添加 supportsVision/supportsImageOutput, callLLM 流式测试用 fake timers,offscreen mock 改为委托 sender - agent/agent.test: callLLMWithToolLoop 错误测试改为 mock callLLM - gm-api.spec: unwrap 测试 test→testWithUserScripts - agent-error-handling.spec: 删除 401 超时 e2e 测试(单元测试已覆盖)
- opfs_read 自动检测文本/二进制:文本文件直接返回内容(支持 offset/limit 分页),二进制返回 blob URL - web_search 区分"无结果"和"提取失败",返回 warning 引导 agent 切换引擎 - tab_tools 对无效正则参数抛出明确错误
- 解决 package.json/manifest.json/pnpm-lock.yaml 版本号冲突(保留 1.5.0-alpha) - 补充 MainLayout 测试缺失的 agentClient mock,修复测试超时问题 - 合并 release/v1.4 的变更:navigation_handle、crontab once 示例、pre-commit 改进等
- navigation_handle.test.ts: 改用 resetAttachedForTest() 重置单例, 不再用 vi.resetModules() 清空全局模块缓存(导致 react-dom/chrome mock 重新加载出错) - MainLayout.test.tsx: 移除多余的 waitFor 避免 500ms 超时
Agent 子菜单项增多后,"设置"可能在小窗口中被挤出可视区域
/setting|设置/ 正则会先匹配到 Agent 子菜单中的 agent_settings(折叠不可见), 改用 .menu-setting class 选择器精确定位
- agent_dom_cdp.test.ts: 保存/恢复 chrome 全局(之前覆盖了完整的 chrome mock, 导致后续测试访问 chrome.tabs.onRemoved 时为 undefined) - opfs_tools.test.ts: stub navigator 时保留 ...globalThis.navigator (之前只有 storage,丢失了 userAgent,导致 react-dom 初始化时 navigator.userAgent.indexOf() 崩溃)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
概述
为 ScriptCat 新增完整的 AI Agent 平台,用户可以通过自然语言对话控制浏览器,自动完成网页操作、定时任务、工具调用等复杂工作流。
构建产物可以从 https://github.com/scriptscat/scriptcat/actions/workflows/build.yaml feature/agent 获取
Youtube 演示
https://www.youtube.com/watch?v=6OT7qeY3Uuk
如果你对此感兴趣,可以加入 Discord 进行交流
核心功能
🤖 AI 对话与多模型支持
🌐 浏览器 DOM 操作
🧩 Skill 技能系统
🔧 CATTool 自定义工具
🔌 MCP 协议支持
⏰ 定时任务调度
📂 OPFS 文件系统
💬 GM API 扩展(脚本侧 Agent API)
CAT.agent.*系列 API,用户脚本可与 Agent 深度交互:CAT.agent.dom— 脚本内调用 DOM 操作CAT.agent.conversation— 管理对话上下文CAT.agent.tools— 动态注册/调用工具CAT.agent.task— 任务生命周期管理UI 页面
技术亮点
数据规模