Plugin 运行时
wesgine 的 JSON-RPC 子进程 Plugin 系统:声明、加载、通信与生命周期管理。
概述
Plugin 是通过 JSON-RPC 协议与 Cell 通信的独立子进程。每个 Plugin 在自己的进程空间运行,通过标准化协议向 Cell 暴露工具。
CellSpec 声明
CellSpec{
Plugins: []PluginDir{
{Path: "/opt/plugins/my-plugin"},
},
}
每个 PluginDir 是一个容器目录,子目录包含 manifest.yaml + 可执行文件。
manifest.yaml 结构
name: my-plugin
version: 1.0.0
command: ./bin/server
args: ["--port", "0"]
tools:
- name: my_tool
description: "执行某操作"
parameters:
type: object
properties:
input:
type: string
生命周期
Cell.Start
↓
Manager 扫描 PluginDir
↓
启动子进程(JSON-RPC)
↓
桥接 Tools → Cell ToolRegistry
↓
Cell.Stop → Shutdown 全部子进程
Boot 行为
Manager 在 Cell boot 时扫描 Plugin 目录、启动子进程、桥接工具到 Cell ToolRegistry。
Drain 行为
Cell stop 时 Shutdown 全部 Plugin 子进程。
配额限制
| 配额 | 说明 |
|---|---|
MaxPlugins | 最大 Plugin 数 |
超出限制时 boot 期截断(不是运行时拒绝)。
注意:MaxPlugins 不在 INV-QUOTA-05 的五个外设 cap 之列——它在 boot 期截断而非写点拒绝,没有运行时写门。
签名验证
PluginPolicy 支持 ed25519 签名验证:
- 未签名 Plugin → 根据策略允许或拒绝
- 签名 Plugin → 验证签名后加载
- 签名不匹配 → 拒绝加载
JSON-RPC 协议
Plugin 与 Cell 通过 stdio JSON-RPC 通信:
Cell (父进程) ←→ stdin/stdout ←→ Plugin (子进程)
调用流程
- Agent 调用 Plugin 暴露的工具
- Cell 通过 JSON-RPC 转发到 Plugin 子进程
- Plugin 执行并返回结果
- Cell 将结果返回给 Agent
与 MCP 的区别
| Plugin | MCP | |
|---|---|---|
| 通信 | JSON-RPC(stdio) | JSON-RPC(stdio / SSE) |
| 声明 | CellSpec.Plugins | CellSpec.MCPs 或运行时 cell.MCPs().Upsert |
| 运行时增删 | 不支持 | 支持(Upsert / Delete) |
| 配额 | MaxPlugins(boot 截断) | MaxMCPServers(写点拒绝) |
| 适用 | 嵌入式子进程 | 外部服务 / 动态工具 |
进程管理
Plugin 子进程通过 proc.Command(INV-EXEC-PROC-01)创建:
- 设置进程组(
Setpgid) - Cancel 时 SIGKILL 整个进程组
WaitDelay给 Wait() 封顶
相关文档
- MCP 集成 →
mcp-integration.md - Tool 系统 →
tool-system.md - CellSpec 概览 →
cellspec-overview.md - Exec 安全 →
exec-security.md