Skip to main content

zerolaunch_plugin_protocol/
manifest.rs

1use serde::{Deserialize, Serialize};
2
3/// 顶层插件 manifest,从 `manifest.toml` 反序列化,也可序列化为 JSON 返回给前端。
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct Manifest {
6    /// 插件元信息(ID、名称、版本、作者等)
7    #[serde(rename = "plugin")]
8    pub plugin: PluginSection,
9    /// 运行时配置(启动命令、超时、自动重启策略)
10    #[serde(default, rename = "runtime")]
11    pub runtime: RuntimeSection,
12    /// 组件声明(插件对外提供哪些能力)
13    #[serde(default, rename = "components")]
14    pub components: ComponentsSection,
15    /// 前端 UI 入口(第三方插件可选的 Vue 面板)
16    #[serde(default, rename = "ui")]
17    pub ui: Option<UiSection>,
18    /// 插件图标文件路径
19    #[serde(default, rename = "icon")]
20    pub icon: Option<IconSection>,
21}
22
23/// 插件元信息段。
24#[derive(Debug, Clone, Serialize, Deserialize)]
25pub struct PluginSection {
26    /// 插件唯一标识,反向域名格式,如 `com.example.my-plugin`
27    #[serde(rename = "id")]
28    pub id: String,
29    /// 显示名称
30    #[serde(rename = "name")]
31    pub name: String,
32    /// 语义版本号
33    #[serde(rename = "version")]
34    pub version: String,
35    /// 简短描述
36    #[serde(rename = "description")]
37    pub description: String,
38    /// 作者名
39    #[serde(rename = "author")]
40    pub author: String,
41    /// 项目主页 URL(可选)
42    #[serde(default, rename = "homepage")]
43    pub homepage: Option<String>,
44    /// 开源许可证标识(可选),如 `MIT`、`GPL-3.0`
45    #[serde(default, rename = "license")]
46    pub license: Option<String>,
47    /// 宿主最低兼容版本,如 `"1.2.0"`
48    #[serde(rename = "minHostVersion")]
49    pub min_host_version: String,
50}
51
52/// 运行时配置段。
53#[derive(Debug, Clone, Default, Serialize, Deserialize)]
54pub struct RuntimeSection {
55    /// 可执行文件路径(相对于插件目录),如 `./bin/my-plugin`
56    #[serde(rename = "command")]
57    pub command: String,
58    /// 启动参数列表
59    #[serde(default, rename = "args")]
60    pub args: Vec<String>,
61    /// 启动超时秒数,默认 10 秒
62    #[serde(default = "default_startup_timeout", rename = "startupTimeout")]
63    pub startup_timeout: u64,
64    /// 崩溃后是否自动重启,默认 true
65    #[serde(default = "default_true", rename = "autoRestart")]
66    pub auto_restart: bool,
67    /// 最大重启次数,超过后不再自动拉起,默认 3
68    #[serde(default = "default_max_restart", rename = "maxRestart")]
69    pub max_restart: u32,
70}
71
72/// 组件声明段。
73/// 插件在此声明对外提供哪些能力。
74#[derive(Debug, Clone, Default, Serialize, Deserialize)]
75pub struct ComponentsSection {
76    /// 能力列表,可选值见 `REQUIRED_PROVIDES_VALUES`。
77    /// 插件可以声明多个能力(如同时提供 `data_source` 和 `action_executor`),
78    /// 每个能力在构建期对应一个 `RemoteConfigurableAdapter`。
79    #[serde(default = "default_provides", rename = "provides")]
80    pub provides: Vec<String>,
81}
82
83/// 前端 UI 入口段(可选)。
84/// 第三方插件可以注册自定义 Vue 面板,嵌入宿主设置页。
85#[derive(Debug, Clone, Serialize, Deserialize)]
86pub struct UiSection {
87    /// 插件信息面板入口组件路径
88    #[serde(rename = "panelEntry")]
89    pub panel_entry: Option<String>,
90    /// 插件配置面板入口组件路径
91    #[serde(rename = "settingsEntry")]
92    pub settings_entry: Option<String>,
93    /// 搜索结果项自定义渲染组件路径
94    #[serde(rename = "resultItemEntry")]
95    pub result_item_entry: Option<String>,
96}
97
98/// 图标配置段(可选)。
99#[derive(Debug, Clone, Serialize, Deserialize)]
100pub struct IconSection {
101    /// 图标文件路径(相对于插件目录),建议使用 PNG 或 SVG
102    #[serde(rename = "path")]
103    pub path: String,
104}
105
106fn default_startup_timeout() -> u64 {
107    10
108}
109fn default_true() -> bool {
110    true
111}
112fn default_max_restart() -> u32 {
113    3
114}
115fn default_provides() -> Vec<String> {
116    vec![]
117}
118
119/// 必须存在的 manifest 字段。
120pub const REQUIRED_PROVIDES_VALUES: &[&str] = &[
121    "plugin",
122    "data_source",
123    "action_executor",
124    "search_engine",
125    "score_booster",
126    "keyword_optimizer",
127    "keyword_injector",
128];
129
130/// 反向域名格式插件 ID 的正则表达式。
131pub const PLUGIN_ID_RE: &str = r"\A[a-z][a-z0-9]*(\.[a-z][a-z0-9_-]*)+\z";