Files
Genarrative/server-rs/crates/editor-adapter-api/src/lib.rs
T
kdletters 4a46f89c9b
Project CI / Repository checks (push) Successful in 2m45s
Project CI / Frontend tests (push) Successful in 3m27s
Project CI / Backend tests (push) Successful in 6m18s
Project CI / Native shell tests (push) Failing after 13m52s
接入 AGC 内置插件宿主并补齐 Cocos 编辑器能力 (#338)
客户端新增随包提供的插件宿主和 Cocos Creator 集成:识别并导入 Cocos 项目,通过内置桥接操作已打开的编辑器,无需安装项目 MCP 扩展。DirectProject 现在公开 36 个独立 cocos_* 工具,保留通用 JavaScript 执行入口。

- 通用插件 SDK、命令/能力/面板注册、编辑器适配器和跨进程内置插件开关。
- Cocos 场景、节点、组件、Prefab、UI、Layout/Widget、资源、保存、撤销、日志与预览调试;目录和实现由 JS/native 共用。
- 编辑事务回读、失败回滚、后续手动修改保护及不确定结果禁止重放;预览截图通过 MCP image 返回。
- DirectProject 跳过无关专业 Agent 历史,将项目打开和历史读取中的同步 I/O 移出窗口线程,消除 Cocos 执行与项目文件锁的错误耦合。

验证:
- 合并 master 后:类型/配置检查、编码检查、Rust 格式检查和提交钩子通过。
- 合并 master 后:Cocos 项目打开、插件面板和开发启动定向测试 10 通过、2 跳过;DirectProject MCP 测试 17 通过、1 项真实 Creator opt-in 忽略;插件宿主测试 9/9。
- 插件行为测试 17/17;native 测试 20/20,4 项 opt-in 测试默认忽略。
- 真实 Creator 3.8.8 的 36/36 操作 smoke,以及客户端 MCP tools/list、tools/call、UI/撤销和预览截图,在功能实现阶段已验证通过;本次 master 合并后未重复真实 GUI smoke。

验证边界:发行安装包和远端 CI 尚未验收。

Reviewed-on: #338
Co-authored-by: kdletters <kdletters@qq.com>
Co-committed-by: kdletters <kdletters@qq.com>
2026-09-13 14:48:55 +08:00

63 lines
2.5 KiB
Rust

//! 通用编辑器适配器契约。
//!
//! AGC 插件宿主只负责插件生命周期、RPC、权限和审计;具体编辑器如何发现进程、
//! 校验 PID / 项目 / 版本、建立连接并把通用请求翻译成编辑器消息,由插件包自带的
//! native 适配器实现。本 crate 只定义双方共享的最小契约,不包含任何编辑器专属
//! 进程名、注入逻辑或业务 API。
use std::path::Path;
use serde::{Deserialize, Serialize};
use serde_json::Value;
/// rpc 请求的通用入参:`processId` / `projectPath` / `code` / `timeoutMs` / `payloadPath`。
pub const ADAPTER_RPC_PARAMS_SCHEMA: &str = "agc.editor-adapter.params.v1";
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct EditorConnectionInfo {
pub adapter: String,
pub connected: bool,
pub pid: Option<u32>,
pub project_path: Option<String>,
pub version: Option<String>,
}
impl EditorConnectionInfo {
pub fn disconnected(adapter: &str) -> Self {
Self {
adapter: adapter.to_string(),
connected: false,
pid: None,
project_path: None,
version: None,
}
}
}
/// 宿主与插件 native 适配器之间的窄接口。
///
/// 宿主只把插件 manifest 声明的适配器名路由到这里;新增编辑器不会改变插件
/// 生命周期、SDK 或权限协议。
pub trait EditorAdapter: Send + Sync {
/// 适配器 id,必须与插件 manifest `extensions.world.genarrative.agc.adapter` 一致。
fn id(&self) -> &'static str;
/// 按项目路径探测当前编辑器实例,不注入、不修改项目文件。
fn detect(&self, project_path: &Path) -> Result<EditorConnectionInfo, String>;
/// 绑定目标 PID / 项目 / 版本并验证协议握手;适配器可安装受控进程桥,但不修改项目文件。
fn connect(
&mut self,
pid: u32,
project_path: &Path,
version: &str,
) -> Result<EditorConnectionInfo, String>;
/// 释放连接登记;不关闭编辑器、不回滚用户项目。
fn disconnect(&mut self);
/// 把通用 RPC 方法名翻译成适配器方法名,未知方法失败关闭。
fn translate_rpc(&self, method: &str, params: Value) -> Result<Value, String>;
/// 执行适配器方法:探测、预检、ping、status、execute、inject。
fn rpc(&self, _method: &str, _params: Value) -> Result<Value, String> {
Err("编辑器原生连接尚未建立".to_string())
}
}