新增 AGC 通用插件宿主与 SDK
统一 Agent Plugin、Skill、MCP 的来源索引和启停状态 新增通用进程宿主、JSON-RPC、能力注册、权限审计与面板挂载 新增 AGC Plugin SDK 与标准 plugin.json 解析支持 保留 EditorAdapter 扩展点,不内置具体编辑器适配器 补充运行时设置界面、项目上下文同步和定向测试 同步更新插件方案、DirectProject、workspace 与项目记忆文档
This commit is contained in:
@@ -0,0 +1,106 @@
|
||||
# AGC 通用插件宿主与编辑器适配
|
||||
|
||||
更新时间:`2026-09-09`
|
||||
|
||||
## 目标与边界
|
||||
|
||||
AGC 插件系统由一个通用宿主和一个通用 SDK 组成。宿主统一负责插件扫描、manifest 校验、进程启停与热重载、行分隔 JSON-RPC、UI 面板挂载/卸载、Capability Registry、权限检查和审计;编辑器差异只进入 `editor_adapter`。
|
||||
|
||||
现役代码位置:
|
||||
|
||||
```text
|
||||
apps/ai-game-creator-shell/src-tauri/src/plugin_host.rs
|
||||
apps/ai-game-creator-shell/src-tauri/src/editor_adapter/mod.rs
|
||||
apps/ai-game-creator-shell/src-tauri/src/editor_adapter/mod.rs
|
||||
packages/agc-plugin-sdk/src/index.ts
|
||||
```
|
||||
|
||||
现有 DirectProject 的 Skill/MCP 导入仍保留。它们是 Codex 扩展注入链路,不等同于本宿主管理的可运行 AGC Plugin。
|
||||
|
||||
## 插件目录和 manifest
|
||||
|
||||
插件来源统一存放在客户端 AppData 的 `extensions/sources/` 下,由既有扩展索引登记;每个来源目录最多包含一个 Plugin。宿主优先接受 OpenAI Agent Plugins 标准的根目录 `plugin.json`,同时兼容 `.codex-plugin/plugin.json`。标准 Plugin 可以只包含 `skills/` 与 `mcp.json`,不要求本地可执行入口;带 `extensions.world.genarrative.agc.entry` 的 AGC Runtime Plugin 才由通用宿主启停。入口必须是插件目录内的普通文件,不能是符号链接、绝对路径或带 `..` 的路径。
|
||||
|
||||
OpenAI 的标准模型是“Plugin 作为可安装包,组合 Skills、可选 MCP Server 和可选 UI”。因此 AGC 的统一扩展目录会把一个 Plugin 及其 `skills/`、`mcp.json` 子项放进同一 catalog;Skill 继续交给 Codex 原生 Skill loader,MCP 继续交给现有 MCP transport,Runtime Plugin 才使用本页的子进程 JSON-RPC。这样三种能力共享来源、启停状态和审计,不要求它们共享错误的执行方式。
|
||||
|
||||
带 AGC Runtime 入口的 manifest:
|
||||
|
||||
```json
|
||||
{
|
||||
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
||||
"name": "editor-tools",
|
||||
"version": "1.0.0",
|
||||
"extensions": {
|
||||
"com.openai": { "interface": { "displayName": "编辑器工具" } },
|
||||
"world.genarrative.agc": {
|
||||
"apiVersion": "v1",
|
||||
"entry": "./index.js",
|
||||
"adapter": "target-editor",
|
||||
"permissions": ["ui.register", "capability.register", "editor.rpc"],
|
||||
"panels": [{ "id": "scene", "title": "场景工具", "entry": "./panel.html", "placement": "sidebar" }]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
只打包 Skill/MCP 的标准 Plugin 可以使用 OpenAI 的 portable 形态:
|
||||
|
||||
```json
|
||||
{
|
||||
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
||||
"name": "editor-workflows",
|
||||
"version": "1.0.0",
|
||||
"description": "编辑器工作流",
|
||||
"extensions": { "com.openai": { "interface": { "displayName": "编辑器工作流" } } }
|
||||
}
|
||||
```
|
||||
|
||||
其中 `skills/<skill-name>/SKILL.md` 和根目录 `mcp.json` 由统一 catalog 发现;`.codex-plugin/plugin.json` 仅作为兼容回退。
|
||||
|
||||
当前允许的权限为 `events.subscribe`、`project.read`、`editor.rpc`、`ui.register` 和 `capability.register`。未知权限、重复面板 id、非法入口和不支持的 API/适配器会使插件进入 `invalid` 状态,不启动进程。
|
||||
|
||||
## 运行和 RPC
|
||||
|
||||
宿主以已安装插件目录为 cwd 启动入口;JavaScript 入口使用系统 `node` 执行,其它入口直接执行。环境先清空,再保留 PATH、Windows 系统目录和临时目录等必要变量,并注入插件身份和协议版本;不继承客户端凭据。Windows 复用进程模块的 Job Object,Unix 使用独立进程组,停止/卸载时回收自有进程。
|
||||
|
||||
stdin/stdout 使用一行一个 JSON-RPC 2.0 消息,单条消息限制 2 MiB,队列和并发请求有上限;独立消息循环持续处理注册请求、事件和响应。写入与响应共享 10 秒期限,写入阻塞只终止对应运行实例。宿主 API 权限用于约束 `host.*` 调用;Runtime Plugin 是用户主动启动的本地程序,这不是 OS 沙箱。
|
||||
|
||||
SDK 对插件暴露稳定的通用 API:
|
||||
|
||||
```ts
|
||||
host.registerCommand(command)
|
||||
host.registerPanel(panel)
|
||||
host.registerCapability(capability)
|
||||
host.events.subscribe(type, listener)
|
||||
host.project.read(path)
|
||||
host.rpc(method, params)
|
||||
```
|
||||
|
||||
注册函数返回卸载函数;命令与能力可附带 RPC handler,`createJsonRpcStdioTransport` 提供双向 stdio 传输。`PluginPanelRegistry` 提供订阅、列表和卸载,客户端通过受控读取命令加载自包含 HTML,并在独立弹窗的隔离 iframe 中展示。关闭面板或停止插件会卸载 iframe;面板不获得 Tauri API、同源存储或任意网络权限。
|
||||
|
||||
当前本地面板是 AGC 扩展能力,尚未实现 MCP Apps UI 消息桥。Agent Plugins 核心包格式、Skill 和 MCP transport 是当前兼容范围;OpenAI 注册应用映射、hooks、公开市场发布和完整 MCP Apps UI 不在本次宿主实现中。
|
||||
|
||||
## 编辑器适配器扩展点
|
||||
|
||||
`EditorAdapter` 只定义 `detect`、`connect`、`disconnect`、`translate_rpc` 和原生 `rpc`。宿主只保存适配器 registry,并把插件声明的适配器名称路由到对应实现;具体编辑器如何查找进程、校验 PID/项目/版本、建立连接和翻译编辑器消息,由后续适配器包独立实现。
|
||||
|
||||
本次不内置任何目标编辑器适配器,也不包含编辑器专属进程名、注入逻辑或 Tauri 命令。新增适配器不会改变 Plugin 生命周期、SDK 或权限协议。
|
||||
|
||||
## Tauri 命令
|
||||
|
||||
`list_agc_extensions` 返回统一的 Plugin/Skill/MCP catalog;`list_agc_plugins`、`refresh_agc_plugins`、`start_agc_plugin`、`stop_agc_plugin`、`reload_agc_plugin`、`call_agc_plugin` 和 `read_agc_plugin_panel` 提供 Runtime Plugin 管理入口;`set_agc_plugin_project_path` 设置当前项目的受控上下文。编辑器适配器通过宿主 registry 和 Plugin RPC 使用,不增加编辑器专属 Tauri 命令。
|
||||
|
||||
每次启停、RPC 成功/失败和权限拒绝都追加到 AppData `extensions/audit.jsonl`,日志只写插件 id、动作、结果和固定错误摘要,不写 API Key、Cookie、Token 或宿主绝对路径。
|
||||
|
||||
## 验收门禁
|
||||
|
||||
OpenAI 官方 Plugins 文档将 Skills、MCP Server 和可选 UI 定义为同一 Plugin 包的组成部分;AGC 以该组合模型为兼容目标:
|
||||
|
||||
- [Plugin architecture](https://developers.openai.com/plugins/concepts/plugins)
|
||||
- [Package your plugin](https://developers.openai.com/plugins/build/plugins)
|
||||
|
||||
- Rust:manifest 路径/权限校验、目录扫描、权限拒绝和通用适配器 registry 边界单测;`cargo check --locked --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml`。
|
||||
- 前端:`agc-plugin-sdk` TypeScript 编译、宿主服务类型检查,以及 `PluginPanelHost` 的挂载/卸载测试。
|
||||
- 通用仓库门禁:`npm run check:encoding`、`git diff --check`;发布前仍需单独执行 AGC package smoke 和安装包 smoke。
|
||||
|
||||
当前版本完成统一扩展 catalog、通用宿主、SDK、面板宿主和通用 EditorAdapter registry;目标编辑器适配器属于后续独立实现,不用未验证的连接状态替代真实编辑器验收。
|
||||
@@ -1,16 +1,16 @@
|
||||
# DirectProject 客户端 Skill 与 MCP 扩展导入方案
|
||||
|
||||
更新时间:`2026-08-31`
|
||||
更新时间:`2026-09-10`
|
||||
|
||||
## 1. 文档定位
|
||||
|
||||
本方案是 DirectProject 客户端第三方 Skill、MCP 和 Plugin 导入能力的当前实现依据。它描述客户端侧的导入、拆分、命名、启用和 DirectProject 启动注入边界,不改变 AGC 内置 Skill Pack、`agc_tools` MCP、项目文件工具和现有 Runtime 权威。
|
||||
本方案是 DirectProject 客户端第三方 Skill、MCP 和 OpenAI Agent Plugin 导入能力的当前实现依据。它描述统一扩展目录中的来源登记、拆分、命名、启用和 DirectProject 启动注入边界;可执行 AGC Runtime Plugin 的生命周期、JSON-RPC、UI 和 Capability 由通用 Plugin Host 承接,见 `AGC通用插件宿主与编辑器适配-2026-09-09.md`。
|
||||
|
||||
本方案只覆盖客户端安装和下一次 Codex 启动时接入。第三方扩展不是安装到全局运行时 Codex,也不要求用户把市面上的扩展重新打包为 AGC 自定义格式。
|
||||
|
||||
## 2. 一句话交付结果
|
||||
|
||||
客户端提供一个全局“扩展”入口,直接接受文件、目录、zip 和标准 Plugin;导入后把其中发现的每个 Skill 和每个 MCP Server 拆成独立扩展项,用户可以分别重命名、启用、禁用和删除;DirectProject 启动 Codex 时只注入已启用的独立项。
|
||||
客户端提供一个全局“扩展”入口,直接接受文件、目录、zip 和标准 Plugin;Plugin 自身登记为一个父级扩展项,内部发现的 Skill/MCP 同时登记为同一来源的子项。用户可管理 Plugin 开关和 Runtime 生命周期,也可分别管理 Skill/MCP;DirectProject 启动 Codex 时只注入有效启用的 Skill/MCP。
|
||||
|
||||
## 3. 已确定的产品边界
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
- 扩展内容保存在 AGC 客户端的扩展仓库。
|
||||
- 不把扩展永久安装到用户的全局 `CODEX_HOME`。
|
||||
- DirectProject 创建或复用 app-server 时,读取客户端当前已启用的扩展并生成本次运行的临时 Skill root 与 MCP 配置。
|
||||
- 导入、启用、禁用和重命名不热更新正在运行的 Codex;变更从下一次 DirectProject 启动生效。
|
||||
- Skill/MCP 的导入、启用、禁用和重命名不热更新正在运行的 Codex;变更从下一次 DirectProject 启动生效。Runtime Plugin 的启停/重载由通用宿主立即执行。
|
||||
- 扩展默认对客户端内所有 DirectProject 生效,不做项目级启用映射。
|
||||
|
||||
### 3.2 用户信任和最小处理
|
||||
@@ -45,16 +45,15 @@
|
||||
|
||||
- 单个 `.exe`、`.py`、`.js` 或其它可执行文件/脚本由用户手动指定为 MCP 入口;
|
||||
- 根据 README 或文件后缀猜测如何启动普通程序;
|
||||
- 完整 Codex Plugin Runtime;
|
||||
- Plugin hooks、apps、remote plugin 和依赖这些能力的运行时行为;
|
||||
- Codex 原生 hooks、apps、remote plugin 和其它不属于 AGC Host 的运行时行为;
|
||||
- 自定义扩展 manifest、审核清单或自定义安装包格式;
|
||||
- Skill/MCP 行为安全扫描、脚本沙箱和网络白名单;
|
||||
- 项目级扩展配置;
|
||||
- 热更新、后台扩展服务、在线市场、版本历史、回滚和自动升级。
|
||||
- Codex Skill/MCP 热更新、扩展自动后台启动、在线市场、版本历史、回滚和自动升级。
|
||||
|
||||
## 4. 导入与拆分模型
|
||||
|
||||
目录、zip 和 Plugin 是“导入来源”,不是管理对象。一个来源中识别出的每个 Skill 和每个 MCP Server 都独立成为客户端扩展项。
|
||||
目录和 zip 是导入来源;Plugin 是可管理对象。Plugin、Skill 和 MCP 子项共享 source_id,并进入统一扩展 catalog。
|
||||
|
||||
```text
|
||||
导入来源
|
||||
@@ -121,9 +120,9 @@ filesystem
|
||||
|
||||
### 4.3 Plugin 处理
|
||||
|
||||
存在 `.codex-plugin/plugin.json` 时,将目录或 zip 识别为标准 Plugin 导入来源。
|
||||
存在带 Agent Plugins schema 的根目录 `plugin.json` 时,将目录或 zip 识别为标准 Plugin 包;`.codex-plugin/plugin.json` 作为兼容输入。zip 可包含一层包目录。
|
||||
|
||||
本期只提取其中可识别的 Skill 和 MCP,并分别创建独立扩展项:
|
||||
包自身及其中可识别的 Skill/MCP 分别登记到同一扩展索引:
|
||||
|
||||
```text
|
||||
Plugin
|
||||
@@ -132,7 +131,7 @@ Plugin
|
||||
└── MCP C → 独立 MCP 项
|
||||
```
|
||||
|
||||
Plugin 自身不生成父级列表项,也不提供 Plugin 级开关。hooks、apps、remote plugin 以及依赖完整 Plugin Runtime 的内容忽略;如果没有任何可支持的 Skill/MCP,则来源保留为未知内容。
|
||||
Plugin 自身生成一个父级列表项并提供统一启用开关。hooks、apps、remote plugin 仍不由 DirectProject 注入;AGC Runtime Plugin 仅由通用 Plugin Host 管理。没有可支持组件且没有 AGC Runtime 入口时,来源保留为未知内容。
|
||||
|
||||
### 4.4 未知输入
|
||||
|
||||
@@ -223,7 +222,7 @@ ImportedSource
|
||||
ExtensionItem
|
||||
├── id
|
||||
├── source_id
|
||||
├── type: skill | mcp | unknown
|
||||
├── type: plugin | skill | mcp | unknown
|
||||
├── name
|
||||
├── original_name
|
||||
├── source_relative_path
|
||||
@@ -232,7 +231,7 @@ ExtensionItem
|
||||
└── last_error
|
||||
```
|
||||
|
||||
`source_id` 只用于来源溯源和清理,不形成可操作的父级扩展项,也不产生父子级联启用状态。
|
||||
`source_id` 用于来源溯源和清理;Plugin 父项与同来源 Skill/MCP 子项形成级联启用状态,父项禁用时子项不会注入 DirectProject。
|
||||
|
||||
对于目录或 zip:
|
||||
|
||||
@@ -263,9 +262,12 @@ ExtensionItem
|
||||
- 删除操作;
|
||||
- 必要时的一行启动错误。
|
||||
|
||||
一个目录、zip 或 Plugin 中的多个内容直接平铺显示,不显示父级包和父级开关:
|
||||
Plugin 父项和子项在同一列表显示,父项开关控制其运行组件:
|
||||
|
||||
```text
|
||||
my-plugin
|
||||
Plugin · 来自 my-plugin.zip 已启用
|
||||
|
||||
art-skill
|
||||
Skill · 来自 my-plugin.zip 已启用
|
||||
|
||||
@@ -421,7 +423,7 @@ remove_client_extension(id)
|
||||
- 名称统一使用原生标识;
|
||||
- 重复导入自动追加后缀;
|
||||
- 已识别内容默认启用;
|
||||
- Plugin 只作为导入容器;
|
||||
- Plugin 登记为父级扩展项,Skill/MCP 登记为子项;
|
||||
- 单个可执行文件/脚本不作为 MCP 入口;
|
||||
- 客户端全局生效。
|
||||
|
||||
@@ -476,7 +478,7 @@ remove_client_extension(id)
|
||||
|
||||
### 阶段 3:MCP 和 Plugin 部分闭环
|
||||
|
||||
当前实施状态:已完成。客户端会在 DirectProject 启动前读取所有已启用 MCP 独立项,把可转换的 STDIO/HTTP 原生字段合并进本次隔离 `CODEX_HOME/config.toml`,再由现有启动参数单独注入内置 `agc_tools`。第三方项固定为非 required,结构错误或启动失败只更新对应扩展项的 `last_error`;Codex app-server 的 `mcpServer/startupStatus/updated` 通知用于清除或记录单项启动状态。已启用 MCP 的名称、来源相对路径和内容指纹已纳入 app-server pool key。Plugin 样例已覆盖同一来源中的 Skill/MCP 独立提取,不开启 Plugin Runtime。
|
||||
当前实施状态:已完成。客户端会在 DirectProject 启动前读取统一 catalog 中有效启用的 MCP 子项,把可转换的 STDIO/HTTP 原生字段合并进本次隔离 `CODEX_HOME/config.toml`,再由现有启动参数单独注入内置 `agc_tools`。第三方项固定为非 required,结构错误或启动失败只更新对应扩展项的 `last_error`;Codex app-server 的 `mcpServer/startupStatus/updated` 通知用于清除或记录单项启动状态。已启用 MCP 的名称、来源相对路径和内容指纹已纳入 app-server pool key。Plugin Host 同时管理带 AGC Runtime 入口的父项。
|
||||
|
||||
完成:
|
||||
|
||||
@@ -492,7 +494,7 @@ remove_client_extension(id)
|
||||
- 一个 MCP 配置包含多个 Server 时,列表出现多个独立项;
|
||||
- 每个 MCP 可以单独启用、禁用和重命名;
|
||||
- 重名 Server 能生成稳定的唯一 key;
|
||||
- Plugin 不会开启 hooks、apps 或完整 Plugin Runtime;
|
||||
- Plugin 不会向 DirectProject 开启 Codex hooks/apps;带 AGC Runtime 入口的 Plugin 由独立通用 Host 启停;
|
||||
- 单个可执行文件/脚本仍不会自动作为 MCP 入口。
|
||||
|
||||
## 11. 最小验证范围
|
||||
|
||||
@@ -23,6 +23,7 @@ Genarrative 的 JavaScript 工程统一使用 npm workspaces。仓库只提交
|
||||
"apps/preview-deployer-web",
|
||||
"packages/image-canvas-core",
|
||||
"packages/image-canvas-react",
|
||||
"packages/agc-plugin-sdk",
|
||||
"packages/shared",
|
||||
"tools/spine-json-export-validator"
|
||||
]
|
||||
@@ -38,6 +39,7 @@ Genarrative 的 JavaScript 工程统一使用 npm workspaces。仓库只提交
|
||||
- `apps/preview-deployer-web`
|
||||
- `packages/image-canvas-core`
|
||||
- `packages/image-canvas-react`
|
||||
- `packages/agc-plugin-sdk`
|
||||
- `packages/shared`
|
||||
- `tools/spine-json-export-validator`
|
||||
|
||||
|
||||
Reference in New Issue
Block a user