feat: add plugin runtime and cross-device task orchestration

This commit is contained in:
chenmingxuan committed 2026-10-14 20:21:44 +08:00
1 parent 3ee4a5f7a8
commit 6663233ab8
82 files changed
+4147 -124

No files matched your search

+1 -1
View File
@@ -19,7 +19,7 @@
| 工具 | 功能 |
| --- | --- |
| `mobile_diagnose` | 环境、凭据、设备诊断和自带修复 |
| `mobile_workspace` | 设备列表与统一队列状态 |
| `mobile_workspace` | 设备列表、统一队列、插件配置和资源保护状态 |
| `mobile_config` | 读取或明确保存非敏感模型、功能、报告默认设置 |
| `mobile_run_task` | 单任务执行;`model=flash/pro` 表示执行模式 |
| `mobile_manage_task` | 单任务状态、安全暂停、排队恢复、指导提交/领取记录和停止 |
+30 -13
View File
@@ -1,6 +1,6 @@
# ARTEMIS 2.0.0:插件与跨端测试
状态:已确认产品设计,进入开发准备;本文件中的功能尚未全部实现。
状态:核心插件链路、首发 Windows 插件适配已实现;Flash/Pro 纯电脑任务和基础浏览器表单实测通过,跨端与长期稳定性验收仍在进行,不是正式发行。
开发分支:`codex/v2.0.0-plugins`,从 1.5.2 主线建立。版本号为 2.0.0,发布前不创建正式版本标签。1.5.x 的 BUG 修复继续在主线进行,后续正常合并进开发分支。
@@ -70,32 +70,49 @@ Flash 的扩展调用需要完整处理 MCP 错误及多种输出;Pro 的发
- [x] 独立开发分支,版本统一为 2.0.0。
- [x] 保存确认过的设计和市场仓库地址。
- [ ] 形成可运行的插件功能;版本标记不代表功能已经完成。
- [x] 形成可运行的插件功能;版本标记不代表功能已经完成。
### 1. 通用插件基础
- [ ] 明确清单和市场索引契约,并实现版本兼容与参数校验。
- [ ] 支持本地 stdio / 远程 MCP 连接、自定义接入、会话生命周期及有界取消。
- [ ] 支持 Skill 按需加载、命名配置、凭据引用和授权范围检查。
- [ ] Flash / Pro 共用工具分派,完整保存错误与图像等结果。
- [x] 明确清单和市场索引契约,并实现版本兼容与参数校验。
- [x] 支持本地 stdio / 远程 MCP 连接、自定义接入、会话生命周期及有界取消。
- [x] 支持 Skill 按需加载、命名配置、凭据引用和授权范围检查。
- [x] Flash / Pro 共用工具分派,完整保存错误与图像等结果。
### 2. 插件页面和市场
- [ ] 市场查询、安装进度、配置、启停、诊断、更新和卸载。
- [ ] 下载完整性检查、失败恢复、任务版本固定与升级互斥。
- [x] 市场查询、安装进度、配置、启停、诊断、更新和卸载。
- [x] 下载完整性检查、失败恢复、任务版本固定与升级互斥。
- [ ] 仅发布实际验证过的插件版本与验证记录。
### 3. 跨端执行
- [ ] 适配首发电脑控制插件,支持纯电脑和混合任务。
- [ ] 多资源互斥、暂停恢复、指导、超时及共享环境变更处理。
- [x] 适配首发电脑控制插件,支持纯电脑和混合任务入口。
- [x] 多资源互斥、暂停恢复、指导、超时及共享环境变更处理。
- [ ] 跨端证据、验收、人工复验和各类导出保持一致。
- [ ] 同步 HTTP、工作区 MCP 和自动化 Skill。
- [x] 同步 HTTP、工作区 MCP 和自动化 Skill。
### 4. 验收
- [ ] 确定性测试覆盖连接失败、结果不确定、超时、取消、升级及资源互斥。
- [x] 确定性测试覆盖连接失败、结果不确定、超时、取消、升级及资源互斥。
- [ ] Windows 实测窗口遮挡、多窗口、DPI、输入、观察和浏览器控制台操作。
- [ ] 实际跑通电脑修改参数、手机验证、按要求恢复及完整证据导出。
- [x] 实际跑通电脑修改参数、手机验证、按要求恢复及完整证据导出。
- [ ] 验证 Flash / Pro、纯电脑任务、批量执行、暂停恢复和人工指导。
- [ ] 执行仓库质量检查、前端交互检查,并完成真实安装包验证后发布。
### 本轮验证记录(2026-10-14)
- 确定性测试覆盖 stdio、Streamable HTTP、任务固定版本、取消/超时资源保护、图片来源与共享证据清理;网页测试与构建通过。
- 首发包增加窗口自身截图与子控件消息路由,修复实际发现的遮挡画面污染和按钮收不到点击问题。两个临时窗口验证了遮挡下截图来源与实际点击效果。
- 隔离 Chrome 窗口通过 MCP 修改本地表单参数、提交一次并读回确认。
- 使用已配置的 `gpt-6-luna / high` 跑同一个中文输入与结果确认任务:Flash 57 秒、Pro 112 秒,真实控件值和最终通过结果一致。只代表这两个基础样本。
- 真实 Pro 记录成功生成 Word、Excel 与含插件来源命名的截图列表。修复了接口清洗导致来源字段丢失的问题。
- 队列回归复现并修复两处资源遗漏:活动任务元数据丢失插件资源,以及取消后遗留版本占用。运行任务仍等进程退出才释放占用,避免提前允许升级。
- 真实 stdio MCP 的确定性用例验证暂停关闭连接、释放共享资源,恢复等待另一任务完成,再新建连接重新观察;该验证不代替真实模型的批次和指导组合验收。
- 真实 Flash 跨端任务使用选定的 Android 17 模拟器和隔离 Chrome:电脑修改参数、手机刷新验证、电脑恢复、手机再次验证,最终用例通过,耗时约 119 秒;后台仅收到改值与恢复两次提交。Word/Excel 导出包含 11 步、8 条插件操作、23 项截图引用,手机和插件图片分别保留。
- 同一跨端场景实际验证暂停后设备与桌面锁释放、恢复等待另一资源占用者退出;指导已被执行端领取并记录在下一步,未重复提交已完成的修改。该次操作完成但终检发现手机文字层级陈旧,保留为未验证,未把后续修复结果覆盖旧记录。
- 联调修复 Flash 跨端切换时将电脑图像带入手机观察的问题。插件图片保留在带来源的工具结果和步骤记录内,切回手机时重新获取手机截图与元素。
- 插件截图在首次入库时同时保存本次观察文字,回归确认后续动作不会将新文字补写到前一步图片上。
- 联调还复现 Android 辅助服务缓存旧网页文字。辅助 APK 1.2.1 在 Android 13+ 每次观察前清理节点缓存,修复后同一模型任务终检通过;另有不调用模型的动态网页回归,同时验证文字与像素从初始值更新并恢复。Android 12 及更早版本不使用此 API,仍需单独验收。
- 最终默认 Python 测试 2451 通过、2 跳过、8 未选中;Ruff 格式/静态检查、质量基线、核心 Pyright 均通过。前端 187 项测试与生产构建通过,真实 Android 动态网页回归通过。历史检索测试改用同步存储以消除测试自身的线程等待竞争,断言保持不变。
- 复杂浏览器控制台、多 DPI、多显示器、长程运行、真实批次组合及混合 Pro 模式还需要验收。插件市场不提前发布未完成验收的安装包。
+94
View File
@@ -0,0 +1,94 @@
# 插件与跨端任务(2.0.0 开发版)
ARTEMIS 可通过插件连接 stdio 或 Streamable HTTP MCP 服务,并按需加载插件内的 Skill。Flash、Pro、网页任务和批次复用同一套插件执行层。版本仍在开发验证中,市场只收录完成实际验证的安装包。
## 安装和配置
打开网页导航中的「插件」。可以从市场安装,或在「高级接入」导入包含 `plugin.json` 的目录/ZIP,也可以填写自定义 MCP 清单。安装不执行安装钩子,新装或升级后默认未启用。
点击「配置」建立命名连接,例如 `lab-router`。填写字段、工具白名单、允许的参数值和共享资源,勾选授权后保存,再启用插件。密码留空保留已保存的值;页面和 MCP 查询只返回已配置的密钥名称。不要把密钥写进清单、提示词或任务 JSON。
每个插件可设置一套默认连接。自动选择只使用符合任务目标、已启用且默认连接已授权的插件。任务中也可以明确选择插件与连接;空列表表示不使用插件。
正在排队、暂停和执行中的任务会固定插件版本,并阻止修改配置、启停、升级或卸载。操作结束后再修改。卸载会移除插件安装文件与连接配置,历史证据仍保留。
## 执行任务
任务输入区和批次导入区有执行目标选项:
| 目标 | 含义 |
| --- | --- |
| `android` | 手机任务,默认不使用桌面插件 |
| `computer` | 纯电脑任务,无需 Android;必须选择提供观察能力的插件 |
| `mixed` | 手机和扩展插件组合任务 |
单任务 `runtime_overrides`、批次每项 `task_config` 都支持:
```json
{
"execution_target": "computer",
"plugins": [{"id": "open-computer-use", "profile": "default"}],
"timeout_seconds": 1800
}
```
这只是配置引用示例,先安装并启用对应插件。不要从名字推断本机已安装它。`mobile_workspace` 返回实际插件状态和连接配置,纯电脑任务可传入 `include_devices=false` 跳过 ADB 查询;`mobile_run_task` 及 `mobile_batch` 使用现有队列。
CLI:`uv run artemis run "观察目标窗口并验证结果" --target computer --profile flash`。`--plugins-json` 可指定上面的插件引用数组。电脑和混合任务不会在队列服务失败后自动重复提交到另一执行器;`--standalone` 是显式选择本地 SDK 执行。
SDK:先 `await agent.init(execution_target="computer")`,然后 `agent.new_task(goal).with_plugins([...]).build()`。插件引用使用 `artemis.plugins.models.PluginSelection`。`for_target()` 可设置构造器目标,必须与 `Agent.init` 相符。
## 共享资源与中断
同一目标应使用同一个资源名,例如 `desktop:local` 或 `router:lab`。资源名不区分大小写。不同插件操作同一路由器时也要使用相同资源名。无资源声明的 MCP 插件按插件与配置名称保守互斥。
暂停会先取消调用并关闭插件连接,再释放任务资源;恢复排队后重新观察。插件取消/超时的写操作可能已经生效,不能盲目重放。如果远程服务未确认动作停止,页面会显示资源保护及原因,用户核对后点击「已核对,解除保护」。这只解除 ARTEMIS 的保护,不会替用户终止远程操作。
工具返回成功表示调用完成,业务是否通过仍需实际证据。图片、工具文本、插件版本和动作结果进入任务记录;已有报告、截图下载和人工复验入口继续使用。Word 的「扩展插件操作」与 Excel 的「插件操作」保留来源及实际结果,资料包截图名称含插件 ID。同一截图被多个任务引用时,删除最后一个任务后才清理。插件画面与手机截图属于不同来源,不能相互替代。电脑持续录屏不属于首版能力。
## 插件清单
```json
{
"schema_version": 1,
"id": "lab-control",
"name": "实验室控制",
"version": "1.0.0",
"artemis_version": ">=2.0.0,<3.0.0",
"platforms": ["win32"],
"architectures": ["amd64"],
"targets": ["mixed"],
"server": {
"transport": "stdio",
"command": "${plugin_dir}/bin/server.exe",
"args": [],
"env": {"TOKEN": "${secret.token}"}
},
"skill": "SKILL.md",
"config": {"token": {"label": "连接密钥", "secret": true, "required": true}},
"resources": ["router:lab"]
}
```
HTTP 服务使用 `{"transport":"streamable_http","url":"https://example.com/mcp","headers":{"Authorization":"Bearer ${secret.token}"}}`。配置引用支持 `${config.字段}`、`${secret.字段}` 和 `${plugin_dir}`;参数直接以 argv 启动,不经 shell。纯 Skill 可省略 `server`。Skill 的引用文件必须在包内,按需读取支持不超过 256 KiB 的 Markdown、文本和 JSON。
提供电脑画面观察的插件声明 `observation`,其中 `tool` 和 `arguments` 为初始观察调用,`refresh_tools` 为模型选择目标后可复用的只读观察工具名。例如初始列窗口,选择窗口后每步刷新该窗口。观察允许只返回文字;无图时不能伪造截图或推测像素坐标。
清单提供的工具和参数范围检查不是操作系统沙箱;第三方进程以当前用户权限运行。市场包使用 HTTPS、SHA-256、平台/版本检查及安全解压,包内应保留许可证和来源记录。
市场索引为 `{"schema_version":1,"plugins":[...]}`,每项包含 `manifest`、`archive_url`、`sha256`、`verification`。同一版本不可覆盖,先验证新包再使用新版本号。
## 环境参数
| 环境变量 | 默认值 |
| --- | --- |
| `ARTEMIS_PLUGIN_MARKETPLACE_URL` | Artemis-Plugins 仓库的 catalog.json |
| `ARTEMIS_PLUGIN_START_TIMEOUT_SECONDS` | 30 秒 |
| `ARTEMIS_PLUGIN_TOOL_TIMEOUT_SECONDS` | 60 秒 |
| `ARTEMIS_PLUGIN_SHUTDOWN_TIMEOUT_SECONDS` | 15 秒 |
| `ARTEMIS_PLUGIN_DOWNLOAD_TIMEOUT_SECONDS` | 300 秒 |
| `ARTEMIS_PLUGIN_DOWNLOAD_MAX_BYTES` | 128 MiB |
| `ARTEMIS_PLUGIN_EXTRACT_MAX_BYTES` | 512 MiB |
| `ARTEMIS_PLUGIN_RESULT_MAX_BYTES` | 16 MiB |
修改环境参数后重启开发版服务。任务总时限仍由现有执行保护控制,插件不会自行无限重试。