Conversation
* 优化 ScriptEditor * Update ScriptEditor.tsx * Update ScriptEditor.tsx * ✨ 调整隐藏编辑框侧边栏位置 #1185 (#1254) * ✨ 调整隐藏编辑框侧边栏位置 #1185 * 图标展示反了 * 调整 `confirm_leave_page` / `script_modified_leave_confirm` 提示避免按「新增脚本」时弹出提示 * Update ScriptEditor.tsx * css 布局修正 * 统一 .focus 为 delayedEditorFocus * 🐛 修复 ScriptEditor review 问题 - 将模块级 cid 变量改为 useRef,避免多实例共享 timer - hotKeys.current.length = 0 改为 hotKeys.current = [],避免原地修改影响旧引用 - handleDeleteEditor 在 setEditors 回调内重新计算 index,修复竞态问题 - 移除冗余的 scriptList.find 查找 - 修复「袑始化」笔误为「初始化」 - 移除重复的 position: absolute 声明 --------- Co-authored-by: wangyizhi <yz@ggnb.top>
rspack build 阶段未转换 manifest.json 中的版本号,导致 "1.4.0-beta" 等非法版本使扩展无法加载,E2E 测试全部失败。 复用 pack.js 中的转换逻辑,在 CopyRspackPlugin transform 中将版本号转为纯数字格式(如 1.4.0.1100)。
将 rspack.config.ts 和 scripts/pack.js 中重复的版本转换逻辑 提取到 scripts/version.js 中复用。
- 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 测试被误执行的问题
支持 cron 定时触发 Agent 任务: - internal 模式:SW 自主执行 LLM 调用,结果存入对话历史 - event 模式:通过 EmitEvent 链路通知脚本,脚本自行处理执行 - 脚本 API:CAT.agent.task.create/list/get/update/remove/runNow/addListener - UI 管理页面:卡片列表、创建编辑、运行历史 - chrome.alarms 每分钟 tick 调度,runningTasks 防并发
点击前使用 elementFromPoint 检查目标坐标处的实际元素, 如果被 modal/header 等遮挡则抛出包含遮挡元素描述的错误。
- AgentService 添加 handleDomApi 代理方法,转发到 domService - gm_api.ts 补充 GMAgentDomApi import 触发装饰器注册 - compat-grant.js 添加 CAT.agent.dom 和 CAT.agent.task 到 grant 白名单 - 补充 GM API 注册完整性测试和 handleDomApi 单元测试
Skills、CATTools、示例脚本已迁移到 github.com/scriptscat/skills
在 SKILL.md frontmatter 中通过 config 块声明配置字段(text/number/select/switch), 用户在 Skills 管理 UI 填写值(支持 secret 遮蔽),CATTool 执行时以 CAT_CONFIG 全局 对象注入沙箱,使脚本可安全访问 API Key 等敏感配置。 主要改动: - 用 yaml 包重写 frontmatter 解析器,支持嵌套 config 块 - 新增 SkillConfigField 类型,扩展 SkillMetadata/Record/Summary - CATToolExecutor → offscreen → sandbox 全链路透传 configValues - SkillRepo 新增 config_values.json 读写 - Agent Service 注册 getSkillConfigValues/saveSkillConfig handler - UI: SkillConfigModal 配置表单 + SkillInstallView 配置预览 - scriptcat.d.ts 声明 CAT_CONFIG 全局变量
- scriptcat.d.ts: 全量同步实际实现,所有 GM_*/CAT_*/CAT.agent API 添加英文 JSDoc - scriptcat.zh-CN.d.ts: 新增全量中文版类型声明(含 GM_*/CAT_*/CAT.agent 所有 API) - CAT_CONFIG 类型改为 Readonly<Record<string, unknown>> 与 Object.freeze 实现一致
- 新增 JsonValue 通用类型用于 CATTool 动态返回值 - cat_agent_tools.ts: install→CATToolRecord, remove→boolean, list→CATToolSummary[], call→JsonValue - cat_agent_dom.ts: 所有 DOM 操作方法使用具体返回类型(TabInfo[], ActionResult 等) - cat_agent_skills.ts: list→SkillSummary[], get→SkillRecord|null, install→SkillRecord, remove→boolean - agent.ts: handleToolsApi/handleSkillsApi/callCATTool 返回类型同步更新 - cattool_executor.ts: execute 返回 JsonValue
- stopMonitor 返回类型 Promise<void> → Promise<MonitorResult>,新增 MonitorResult 接口 - tools.list() 返回类型 CATToolRecord[] → CATToolSummary[](不含 code) - SkillSummary 新增 hasConfig 字段 - SkillRecord 新增 config 字段及 SkillConfigField 接口 - 同步更新中文版 scriptcat.zh-CN.d.ts
- agent-fixtures: 复用 Phase 1 的 extensionId 避免 service worker 已终止时 waitForEvent 永久挂起,主动导航触发 service worker 启动 - options.spec: 用 .menu-tools 精确定位"工具"菜单项,避免匹配 CATool 子菜单 - playwright.config: 本地也启用 1 次重试,容错 Chrome headless 偶发启动问题
默认仍为 30 秒,支持在 ==CATTool== 头中声明 @timeout(秒)覆盖默认值, 适用于网络爬取、大文件处理等耗时工具场景。
- 消除 react-hooks/exhaustive-deps 警告,添加 eslint-disable 注释 - JSX 中字符串字面量用花括号包裹,修复 jsx-no-literals 规则 - E2E fixtures 优化 Phase 2 service worker 竞态处理
- 亮色模式使用 var(--color-text-1) 深色文字,暗色模式使用白色 - 用户消息改用 getTextContent 纯文本渲染 - 版本号升级至 1.5.0-alpha
ephemeral 路径不再硬编码 cache: false,改为透传调用方的 cache 参数。 ConversationCreateOptions 新增 cache 字段,CAT API 全链路支持。
|
如果是更强的画面交互操作对话会更好 例如 |
完全可以做到,只需要写一个用户脚本,让AI先分析网站,然后猜出选项,用户点击即可 我还在努力开发中,文档还在编写 不知道你有没有看YouTube视频 |
* 把 fetchIconByDomain 改成 scriptcat.org * scriptcat.org -> ext.scriptcat.org * ✨ 支持配置化 Favicon 服务提供者 #1268 新增图标服务设置项,支持 ScriptCat / 本地获取 / Google 三种 provider, 默认使用 ScriptCat API。切换 provider 时自动清除 favicon 缓存。 同时增加了对接口返回异常状态码(>=300)的处理。 * 🐛 修复图标服务设置项布局,标题与选择框放在同一行 * 🐛 修复 local 模式下 favicon 获取逻辑,还原本地抓取实现 * 调整图标服务位置 * ✅ 为 #1268 favicon 服务增加单元测试 * 🐛 修复 favicon 服务切换相关问题 - fetchIconByService 添加 default 分支回退到 local - 切换服务时清除内存中的 blob URL 缓存 - 使用 deletes() 批量删除替代逐条删除 - setFaviconService 添加 return - 修复 pre-push 正则匹配 release/ 分支 * 🎨 修复 favicons 相关文件的 prettier 格式问题 --------- Co-authored-by: 王一之 <yz@ggnb.top>
* 新增批次检查脚本的 timeout, 避免一个脚本更新时间太长导致所有脚本检查失败 * 🐛 修复批量更新超时机制的 4 个问题 - fetchScriptBody 添加 AbortSignal 支持 - 繁体转简体:確保次序 → 确保顺序 - 用 setTimeout+clearTimeout 替代 sleep,超时后正确清理 - 超时时通过 AbortController 中止进行中的请求 - Map 预初始化确保返回顺序一致 --------- Co-authored-by: 王一之 <yz@ggnb.top>
* additional test for responseType=document * 🐛 修复 脚本设置-授权管理 控制无效的问题 (#1267) * 🐛 修复 脚本设置-授权管理 控制无效的问题 * 将校验逻辑放到confirm * 修复GM cookie权限判断 * 删除directDeny * buildCacheKey * 整理代码 * Update src/app/service/service_worker/permission_verify.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * 🔒 使用 DOMPurify 清理公告通知 HTML 内容 (#1274) * 🔒 使用 DOMPurify 清理公告通知的 HTML 内容 #1273 使用 DOMPurify 对服务端下发的公告 HTML 进行白名单过滤,防止潜在的 UI 注入风险。只允许基础标签和安全的 CSS 属性(颜色、字体相关)。 * code update --------- Co-authored-by: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> * 🐛 修复 include *?* 表达式处理问题 #1271 (#1272) * 🐛 修复 include *?* 表达式处理问题 #1271 * Added error handling to avoid crash * update globSplit * update globSplit * update globSplit --------- Co-authored-by: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> * fix #1274 (#1275) * fix #1274 * Update index.ts * Array.includes -> Set.has * 🐛 修复与隐身窗口检查权限冲突导致反复重启的问题 * 📄 docs: update Chrome Web Store URLs to new domain (#1279) Google migrated the Chrome Web Store from `chrome.google.com/webstore` to `chromewebstore.google.com`. This updates all CWS URLs across README files to use the new domain. The old URLs currently redirect, but will eventually stop working. * ✅ 添加 Playwright E2E 测试及 GM API 功能测试 (#1283) * ✅ 添加 Playwright E2E 测试 - 新增 22 个 E2E 测试覆盖 Options、Popup、Install、Editor、Settings 页面 - 配置 Playwright 使用 --headless=new 模式加载扩展 - 在 CI workflow 中添加 E2E 测试 job * ✅ 添加 GM API E2E 测试 新增 gm-api.spec.ts 测试三类 GM API: - GM_ 同步 API (gm_api_test.js): 29 项测试 - GM.* 异步 API (gm_api_async_test.js): 29 项测试 - Content 注入测试 (inject_content_test.js): 11 项测试 实现要点: - 两阶段浏览器启动:Phase 1 启用 userScriptsAccess,Phase 2 重启运行测试 - 自动审批权限确认弹窗(cookie 等需要用户授权的 API) - 通过剪贴板注入脚本代码到 Monaco 编辑器 - 替换 jsdelivr CDN 为 unpkg 提升资源加载速度 - 去除 @require/@resource 的 SRI hash 避免校验失败 更新 utils.ts 中 installScriptByCode 增加保存失败的 fallback 检测 * 🐛 修复 GM API E2E 测试 CI 兼容性 - Phase 1 添加 --headless=new 参数,修复 CI 无 X server 环境 - 添加 eslint-disable 注释消除 Playwright use() 的误报 - prettier 格式化修正 * 🐛 修复 E2E 测试 CI 兼容性问题 - vitest.config.ts: 排除 e2e/ 目录避免 Vitest 误跑 Playwright 测试 - eslint.config.mjs: 为 e2e/ 目录关闭 react-hooks/rules-of-hooks 规则 - e2e/options.spec.ts: 菜单正则加 /i 标志修复英文环境大小写匹配 - prettier 格式化修正 * 🚑 修复其他扩展注入 chrome.runtime 导致环境误判的问题 #1280 (#1281) * 🐛 修复其他扩展注入 chrome.runtime 导致环境误判的问题 #1280 移除 isContent 运行时检测,改为通过 CustomEventMessage.envTag 在构建入口确定环境, 避免其他扩展(如大学搜题酱)向页面注入 chrome.runtime 对象导致 inject 环境被误判为 content 环境。 * Update src/app/service/content/gm_api/gm_api.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * update * 删除不必要的isconnect * 将 typecheck 集成到 lint/lint-fix 脚本中 * 修复引用 * 删除test-results --------- Co-authored-by: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * ⚙️ 优化 CI 流水线和测试配置 - 缓存 Playwright 浏览器避免重复下载 - 测试失败时上传截图/视频/报告等调试产物 - Playwright CI 环境启用 HTML+list 双 reporter、失败截图和视频 - 各工具链配置屏蔽 .claude 目录 * ✅ 修复 e2e 测试 service worker 超时并优化等待策略 - 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: wangyizhi <yz@ggnb.top> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Michael Lip <51033404+theluckystrike@users.noreply.github.com>
* 优化 MessageConnect 的记忆管理及Cleanup机制 * handler -> cleanup * 次序可推前 * 抛出错误是合理的,不应该屏蔽错误 * Update packages/message/mock_message.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
YouTube视频 不是我所说的效果 应该是Agent看到画面跟代码 例如「加一个按钮切换颜色主题」 不然的话,其他 Cowork什么的 Antigravity 什么的,都能做到吧 |
有道理,不过这个也可以做到,现在我觉得只差想象力了 |
|
我觉得放AI Agent到脚本猫,最重点是,能让用户写UserScript |


概述
为 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 页面
技术亮点
数据规模