Files
Genarrative/server-rs/crates/editor-adapter-api/src/lib.rs
T
kdletters 54d0fb75ea 接入 Godot 编辑器插件与受控执行链路
新增 GDExtension 自动引导、GDScript 执行和实例隔离缓存
接入 AGC 插件开关、Runner、Agent 工具与权限审计
完善执行回执确认、不确定状态阻断及卸载恢复
补齐 Windows 分发资源、定向测试与实机验收文档
2026-09-20 16:35:04 +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())
}
}