Closed
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 测试被误执行的问题
核心功能:通过 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/百度搜索测试用例
- 修复 Bing 搜索 URL 移除无效的 count 参数 - 修复 getSummaryModelId 未设置时报错问题 - 修复新会话应使用默认模型而非当前会话模型 - Agent 设置页面添加搜索引擎提示信息和保存成功反馈 - 补全 scriptcat.d.ts 类型定义(Attachment、ScreenshotResult 等) - 修复 NotificationDetails.text 字段类型错误
- 附件 ID 统一追加文件扩展名,便于类型识别 - 新增 CAT.agent.opfs.readAttachment API 读取内部附件存储 - usage 增加 cacheCreationInputTokens/cacheReadInputTokens 追踪 - OPFS 浏览器支持图片预览、文件下载、图标区分 - AskUserBlock 交互卡片 UI 重构(渐变条、pill 选项、内联输入) - ConversationInstance 收集模型生成的图片/文件 content blocks - 模型配置自动检测 supportsVision/supportsImageOutput
UI 断开后会话继续执行,重新连接后通过 sync 快照恢复进度。 - 新增 RunningConversation 注册表与 broadcastEvent/updateStreamingState 机制 - handleConversationChat 支持 background 参数,断开只移除 listener 不 abort - 新增 attachToConversation 处理器,重连时发送 sync 快照 - UI hooks 新增 attachToConversation、useRunningConversations - ChatArea 自动 attach 运行中会话,ChatInput 增加后台模式开关 - 会话列表显示运行中指示器 - Script API (cat_agent) 支持 background 参数和 attach() 方法 - 26 个单元测试覆盖核心逻辑
- 任务工具精简为 3 个(create/update/list),新增持久化存储和 UI 实时推送 - 新增 TaskListBlock 组件展示任务进度 - 修复 chrome.runtime sendResponse 不支持 Blob 的问题,改用 blobUrl + CAT_fetchBlob 模式 - 简化 readAttachment API,统一返回 Blob 对象 - 新增 read blob 格式支持 - 更新系统提示词与类型定义
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 块、工具调用、子代理详情等。
Collaborator
|
不搞了?? |
Member
Author
我去。。。因为release/v1.5删了,自动close掉了 |
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 页面
技术亮点
数据规模