Skip to content

💥 脚本猫 AI Agent#1286

Open
CodFrm wants to merge 124 commits intorelease/v1.5from
develop/agent
Open

💥 脚本猫 AI Agent#1286
CodFrm wants to merge 124 commits intorelease/v1.5from
develop/agent

Conversation

@CodFrm
Copy link
Member

@CodFrm CodFrm commented Mar 15, 2026

概述

为 ScriptCat 新增完整的 AI Agent 平台,用户可以通过自然语言对话控制浏览器,自动完成网页操作、定时任务、工具调用等复杂工作流。

构建产物可以从 https://github.com/scriptscat/scriptcat/actions/workflows/build.yaml feature/agent 获取

Youtube 演示

https://www.youtube.com/watch?v=6OT7qeY3Uuk

如果你对此感兴趣,可以加入 Discord 进行交流

核心功能

🤖 AI 对话与多模型支持

  • 内置聊天界面,支持流式输出、Markdown 渲染、思考过程展示
  • 适配 OpenAI 和 Anthropic (Claude) 两大主流 LLM Provider
  • 支持 SSE 流式解析,实时展示 Agent 推理过程

🌐 浏览器 DOM 操作

  • Agent 可通过自然语言指令操作网页:点击、填写表单、滚动、等待元素、截图等
  • 双引擎实现:基于内容脚本的 DOM 操作 + 基于 CDP(Chrome DevTools Protocol)的底层控制
  • 网页截图能力,Agent 可"看到"页面内容辅助决策

🧩 Skill 技能系统

  • 模块化能力扩展机制:一个 Skill = 行为提示词 + 可选工具脚本 + 可选参考文档
  • 支持一键安装 / 管理 / 卸载
  • Agent 根据对话内容自动匹配并加载对应 Skill

🔧 CATTool 自定义工具

  • 用户可编写自定义工具脚本(CATTool),Agent 在对话中自动发现和调用
  • 标准化元数据格式,支持参数类型声明和 GM API 权限申请
  • 工具注册中心统一管理,命名空间隔离避免冲突

🔌 MCP 协议支持

  • 实现 MCP(Model Context Protocol)客户端
  • 可连接外部 MCP 服务器,扩展 Agent 的工具调用能力
  • MCP 服务器管理界面,支持增删和状态监控

⏰ 定时任务调度

  • 通过自然语言创建 Cron 定时任务
  • 支持任务的创建、查询、更新、删除
  • 任务到期自动触发 Agent 执行

📂 OPFS 文件系统

  • 基于浏览器 OPFS(Origin Private File System)的文件管理
  • Agent 可读写文件,支持跨会话数据持久化
  • 内置文件浏览器 UI

💬 GM API 扩展(脚本侧 Agent API)

  • 新增 CAT.agent.* 系列 API,用户脚本可与 Agent 深度交互:
    • CAT.agent.dom — 脚本内调用 DOM 操作
    • CAT.agent.conversation — 管理对话上下文
    • CAT.agent.tools — 动态注册/调用工具
    • CAT.agent.task — 任务生命周期管理

UI 页面

页面 功能
AgentChat 聊天主界面(消息列表、输入框、工具调用展示、思考过程折叠)
AgentProvider 模型配置(API Key、模型选择、参数调节)
AgentSkills Skill 安装与管理
AgentCATool CATTool 管理
AgentMcp MCP 服务器管理
AgentTasks 定时任务管理
AgentOPFS 文件浏览器

技术亮点

  • 架构清晰:Agent 编排器 → Provider 适配 → Tool 注册 → 执行器,各层职责明确
  • 测试完善:单元测试覆盖核心模块(工具注册、CATTool 执行、MCP 客户端、SSE 解析等),新增 E2E 测试覆盖对话流程、工具调用、Skill 安装、错误处理
  • 类型安全:完整的 TypeScript 类型定义(scriptcat.d.ts +1193 行),同步维护中文版类型注释
  • 国际化:8 种语言的翻译同步更新

数据规模

  • 212 个文件变更,+30,880 行,-2,158 行
  • 80+ 个 commit

cyfung1031 and others added 30 commits March 11, 2026 19:02
* 优化 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 测试被误执行的问题
CodFrm and others added 9 commits March 17, 2026 11:36
将 AgentProvider、AgentChat、AgentTasks、AgentMcp 四个 UI 页面从直接
实例化 Repo/Client 改为通过 AgentClient 消息通道调用 SW,与脚本列表的
ScriptClient 模式保持一致。
- ChatInput: 支持粘贴/拖放/文件选择器添加图片,预览缩略图
- ChatArea: 发送前将附件保存到 OPFS
- MessageItem: 用户消息渲染图片附件
- OpenAI Provider: 解析 GPT-4o 图片生成响应(数组格式 delta.content)
- agent.ts: callLLM 收集生成图片并保存到 OPFS,callLLMWithToolLoop 持久化 ContentBlock[]
* 🐛 修复未绑定网盘时仍显示解绑按钮的问题

closes #1289

* ♻️ 将 token 检查逻辑内聚到 auth.ts,降低 UI 组件耦合

* ♻️ 简化 FileSystemParams 中 token 检查逻辑,移除多余的 useCallback
- 新增 model_utils 模块:按模型名/URL 自动检测 provider、视觉输入和图片输出能力
- 新增 ProviderIcon 组件:为各 provider 显示对应 SVG 图标
- 模型服务页卡片恢复一排两个布局,修复分组导致每组独占一行的问题
- Anthropic provider 默认 max_tokens 设为 16384 并同步更新测试
- 模型选择器按 provider 分组显示,编辑时恢复已缓存的可用模型列表
- MCP 服务器编辑格式化修正
收紧 supportsImageOutputByModelId 判断条件,排除 gemini-1.5-pro、
gemini-3-flash-preview、gemini-2.0-flash-lite 等不支持图片生成的模型
自动检测可能对未知模型或第三方兼容 API 不准确,新增 supportsVision / supportsImageOutput 字段允许用户在模型编辑中手动覆盖自动检测结果。同时补充 Gemini 3+ image 模型的自动检测规则。
MCPService 改为依赖注入(clientFactory + repo),测试不再依赖 vi.mock;
tool_registry 测试移除不可靠的 uuid mock,改为检查 id 非空。
- 新增 enableTools 开关,允许禁用工具调用(图片生成模型场景)
- 提取 LLM 回复中 markdown 内联 base64 图片为附件
- MarkdownRenderer 支持 data:image URL、图片点击预览、memo 优化
- ChatInput 增加工具启用/禁用切换按钮
@cyfung1031
Copy link
Collaborator

@CodFrm 你参考一下这个吧

https://github.com/vercel-labs/agent-browser

@CodFrm
Copy link
Member Author

CodFrm commented Mar 17, 2026

@CodFrm 你参考一下这个吧

https://github.com/vercel-labs/agent-browser

有了解过,我觉得不算是同类型的产品

我的想法并不只是操作浏览器,而是脚本+AI;脚本提供能力,AI提供智慧;有很多的流程并没有完全的打通(或者不好打通),例如编写一篇文章,需要到处去寻找素材,排版,那么就可以用脚本提供能力,AI去指导如何寻找,如何排版

1a5be7d4826cb4b0fee79a02649351a2(8)

d8d0f37c51e7f0fb8a690ad4c3789575

CodFrm added 19 commits March 17, 2026 22:21
将独立的 CATTool/Tools 概念合并进 Skill 系统:
- 重命名 CATTool 类型为 SkillScript(CATToolRecord → SkillScriptRecord 等)
- 用 execute_skill_script meta-tool 替代动态注册 skillname__toolname 模式
- 删除 CAT.agent.tools GM API,统一到 CAT.agent.skills
- 新增 CAT.agent.skills.call() 用于脚本内直接调用 skill script
- 删除 CATTool 独立安装流程、UI 页面和相关存储
- 更新 system prompt 描述 execute_skill_script 使用方式
- agent_chat.test.ts: 改用 Object.defineProperty 只 mock navigator.storage,
  避免 spread 操作丢失 getter 属性(userAgent)导致 react-dom 初始化崩溃
- agent-fixtures.ts: 重构为单 context 方案,去掉关闭→重启浏览器的两阶段流程,
  避免 CI 上 Linux headless Chrome profile 持久化不可靠导致扩展加载失败
- ==CATTool== / ==/CATTool== 头格式改为 ==SkillScript== / ==/SkillScript==
- UUID 前缀从 cattool- 改为 skillscript-
- .cattool.js 文件扩展名改为 .skill.js
- ScriptInfo.cattool 字段改为 skillScript
- 变量/函数名中所有 cattool/CATTool 引用统一为 skillScript
- 提取两阶段启动逻辑到 fixtures.ts (testWithUserScripts)
- 提取共享工具函数到 utils.ts (patchScriptCode, autoApprovePermissions, runTestScript, runInlineTestScript)
- agent-fixtures 在 Phase 1 写入 mock model 配置,修复 Repo enableCache() 导致的 "No model configured" 问题
- 简化 gm-api.spec.ts,复用共享 fixture 和工具函数
新增 8 个开箱即用的内置工具,为 Agent 提供基础能力层:

- web_fetch: 抓取网页/JSON,Offscreen DOM 解析提取正文
- web_search: DuckDuckGo HTML 搜索 + Google Custom Search API
- ask_user: 向用户提问并等待回复,5 分钟超时
- agent: 启动子代理执行独立子任务,排除 ask_user/agent 防止嵌套
- create_task/get_task/update_task/list_tasks: 会话内任务跟踪

基础设施:
- Offscreen HTML 提取器(DOM 解析去骨架 + 搜索结果解析)
- 搜索引擎配置 repo(chrome.storage)
- ChatStreamEvent 新增 ask_user/sub_agent_event 类型
- System prompt 添加内置工具说明
- AskUserBlock UI 组件(提问展示 + 输入回复)
- 新增 opfs_write/opfs_read/opfs_list/opfs_delete 四个 Agent 内置工具
- 所有操作限制在 agents/workspace/ 下,sanitizePath 禁止路径穿越
- 新增 CAT.agent.opfs 用户脚本 API(Content + SW 双层),写操作需持久化授权
- 新增 CATAgentOPFS 类型声明及 ESLint grant 兼容
- 新增 27 个单元测试覆盖工具核心、API 注入、Service 路由三层
- 新增模型上下文窗口映射表(model_context.ts),支持主流模型家族前缀匹配
- 新增 compact 摘要 prompt(compact_prompt.ts),参考 Claude Code 的 analysis + summary 结构
- AgentModelConfig 新增 contextWindow 字段,UI 表单支持配置
- handleConversationChat 新增 compact 分支,支持 /compact [指令] 手动压缩
- callLLMWithToolLoop 中当 inputTokens/contextWindow >= 80% 时自动触发 compact
- ChatStreamEvent 新增 compact_done 事件类型
- 新增 27 个单元测试覆盖映射表、摘要提取、手动/自动 compact 逻辑
- 新建 execute_script 工具,支持 page(DOM 操作)和 sandbox(隔离计算)两种执行环境
- AgentDomService.executeScript 支持 world 参数(MAIN/ISOLATED),返回 { result, tabId }
- ExecuteScriptOptions 类型增加 world 字段
- 在 AgentService 中注册为临时内置工具
- 30s 超时保护,带自动清理避免 unhandled rejection
核心功能:通过 chrome.scripting.executeScript 注入脚本读取客户端渲染后的完整 DOM,
经 Offscreen extractHtmlWithSelectors 转为带 CSS selector 标注的 markdown,
支持 selector 精确提取和 LLM prompt 摘要。
# Conflicts:
#	src/app/service/service_worker/agent.ts
- screenshot 支持 selector 参数,通过 CDP clip 实现指定元素区域截图
- screenshot 支持 saveTo 参数,将截图二进制直接保存到 OPFS workspace
- screenshot 返回类型升级为 ScreenshotResult(dataUrl + path + size)
- opfs_read 支持 format: "bloburl",通过 Offscreen 创建 blob URL
- 提取 opfs_helpers.ts 公共模块,供 opfs_tools 和 agent_dom 复用
- GM API(CAT.agent.dom.screenshot / CAT.agent.opfs.read)同步更新
- writeWorkspaceFile 支持 Uint8Array、Blob、data URL 字符串三种输入
- data URL 自动检测并解码为原始二进制存储
- OPFSApiRequest write content 类型扩展为 string | Blob
- GM API CAT.agent.opfs.write 参数同步更新
- web_fetch 工具新增 prompt 参数,支持通过 LLM 对抓取内容进行摘要/提取
- 模型配置页面增加复制按钮,方便基于已有配置快速创建新模型
- tool 定义增加 options 和 multiple 参数
- ChatStreamEvent ask_user 事件传递选项字段
- UI 支持 Radio 单选(点击即提交)和 Checkbox 多选(确认提交)
- 所有模式下保留文本输入框供自定义回答
- 新增 2 个单元测试覆盖选项传递
- 扩展 SearchEngineConfig 支持 bing/baidu,默认引擎改为 Bing
- web_search 新增 searchBing/searchBaidu,html_extractor 新增对应解析方法
- 新增摘要模型配置(getSummaryModelId/setSummaryModelId),summarizeContent 优先使用摘要模型
- 新建 AgentSettings 页面:摘要模型选择 + 搜索引擎配置
- 侧边栏/路由注册、8 个 locale 文件新增 i18n keys
- 新增 Bing/百度搜索测试用例
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants