4a46f89c9b
客户端新增随包提供的插件宿主和 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>
63 lines
2.5 KiB
Rust
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())
|
|
}
|
|
}
|