Skip to main content

zerolaunch_plugin_protocol/
messages.rs

1use serde::{Deserialize, Serialize};
2use zerolaunch_plugin_api::config::ComponentType;
3use zerolaunch_plugin_api::{
4    CandidateCacheSnapshot, CandidateId, ExecutionContext, PluginContext, Query, ScoredCandidate,
5    SearchCandidate, TargetType,
6};
7
8// ─── plugin/initialize ───────────────────────────────────────────
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
11pub struct InitializeParams {
12    #[serde(rename = "hostVersion")]
13    pub host_version: String,
14    #[serde(rename = "protocolVersion")]
15    pub protocol_version: String,
16    #[serde(rename = "dataDir")]
17    pub data_dir: String,
18    #[serde(rename = "logDir")]
19    pub log_dir: String,
20    #[serde(rename = "pluginId")]
21    pub plugin_id: String,
22    #[serde(rename = "locale")]
23    pub locale: String,
24}
25
26#[derive(Debug, Clone, Serialize, Deserialize)]
27pub struct InitializeResult {
28    #[serde(rename = "pluginVersion")]
29    pub plugin_version: String,
30    #[serde(rename = "protocolVersion")]
31    pub protocol_version: String,
32}
33
34// ─── plugin/get_components ───────────────────────────────────────
35
36#[derive(Debug, Clone, Serialize, Deserialize)]
37pub struct ComponentDescriptor {
38    #[serde(rename = "componentId")]
39    pub component_id: String,
40    #[serde(rename = "componentName")]
41    pub component_name: String,
42    #[serde(rename = "componentDescription", default)]
43    pub component_description: String,
44    #[serde(rename = "componentType")]
45    pub component_type: ComponentType,
46    #[serde(rename = "kind")]
47    pub kind: ComponentKind,
48    #[serde(rename = "priority", default = "default_component_priority")]
49    pub priority: u32,
50}
51
52/// 默认组件优先级,与 `Configurable::priority()` 的默认值(50)一致。
53fn default_component_priority() -> u32 {
54    50
55}
56
57/// 与内置插件完全对等:Plugin / DataSource / ActionExecutor / SearchEngine /
58/// ScoreBooster / KeywordOptimizer / KeywordInjector 均可由第三方插件提供,
59/// 宿主按 kind 注册进对应管道(触发词路由 / 候选采集 / 执行器 / 搜索管道 / 候选管道)。
60#[derive(Debug, Clone, Serialize, Deserialize)]
61#[serde(tag = "type")]
62pub enum ComponentKind {
63    #[serde(rename = "plugin")]
64    Plugin {
65        #[serde(rename = "triggerKeywords")]
66        trigger_keywords: Vec<String>,
67    },
68    #[serde(rename = "data_source")]
69    DataSource,
70    #[serde(rename = "action_executor")]
71    ActionExecutor {
72        #[serde(rename = "targetTypes")]
73        target_types: Vec<TargetType>,
74    },
75    /// 搜索引擎 —— 参与搜索管道(与内置引擎互斥,仅允许一个启用)。
76    #[serde(rename = "search_engine")]
77    SearchEngine,
78    /// 分数增强器 —— 在引擎打分后追加分数修正(多个可同时启用)。
79    #[serde(rename = "score_booster")]
80    ScoreBooster,
81    /// 关键词优化器 —— 在候选管道中扩展搜索关键词。
82    /// uses_context / priority 为设置可变属性,经 keyword_optimizer_info RPC 拉取。
83    #[serde(rename = "keyword_optimizer")]
84    KeywordOptimizer,
85    /// 关键词注入器 —— 基于候选项完整上下文注入额外关键词。
86    #[serde(rename = "keyword_injector")]
87    KeywordInjector,
88}
89
90// ─── plugin/get_settings_schema ──────────────────────────────────
91
92#[derive(Debug, Clone, Serialize, Deserialize)]
93pub struct GetSettingsSchemaParams {
94    #[serde(rename = "componentId")]
95    pub component_id: String,
96}
97
98// ─── plugin/get_settings ─────────────────────────────────────────
99
100#[derive(Debug, Clone, Serialize, Deserialize)]
101pub struct GetSettingsParams {
102    #[serde(rename = "componentId")]
103    pub component_id: String,
104}
105
106// ─── plugin/apply_settings ───────────────────────────────────────
107
108#[derive(Debug, Clone, Serialize, Deserialize)]
109pub struct ApplySettingsParams {
110    #[serde(rename = "componentId")]
111    pub component_id: String,
112    #[serde(rename = "settings")]
113    pub settings: serde_json::Value,
114}
115
116// ─── plugin/validate_settings ────────────────────────────────────
117
118#[derive(Debug, Clone, Serialize, Deserialize)]
119pub struct ValidateSettingsParams {
120    #[serde(rename = "componentId")]
121    pub component_id: String,
122    #[serde(rename = "settings")]
123    pub settings: serde_json::Value,
124}
125
126#[derive(Debug, Clone, Serialize, Deserialize)]
127pub struct ValidateSettingsResult {
128    #[serde(default)]
129    pub error: Option<String>,
130}
131
132// ─── plugin/config_actions ───────────────────────────────────────
133//
134// 响应为裸数组 `Vec<ConfigActionDef>`(宿主 discover 流程以数组反序列化,
135// 与 get_settings_schema 的裸数组约定一致)。
136
137#[derive(Debug, Clone, Serialize, Deserialize)]
138pub struct ConfigActionsParams {
139    #[serde(rename = "componentId")]
140    pub component_id: String,
141}
142
143// ─── plugin/execute_config_action ────────────────────────────────
144
145#[derive(Debug, Clone, Serialize, Deserialize)]
146pub struct ExecuteConfigActionParams {
147    #[serde(rename = "componentId")]
148    pub component_id: String,
149    #[serde(rename = "action")]
150    pub action: String,
151    #[serde(rename = "params")]
152    pub params: serde_json::Value,
153}
154
155// ─── plugin/query ────────────────────────────────────────────────
156
157#[derive(Debug, Clone, Serialize, Deserialize)]
158pub struct QueryParams {
159    #[serde(rename = "pluginId")]
160    pub plugin_id: String,
161    #[serde(rename = "ctx")]
162    pub ctx: PluginContext,
163    #[serde(rename = "query")]
164    pub query: Query,
165}
166
167// ─── plugin/execute_action ───────────────────────────────────────
168
169#[derive(Debug, Clone, Serialize, Deserialize)]
170pub struct ExecuteActionParams {
171    #[serde(rename = "pluginId")]
172    pub plugin_id: String,
173    #[serde(rename = "ctx")]
174    pub ctx: PluginContext,
175    #[serde(rename = "actionId")]
176    pub action_id: String,
177    #[serde(rename = "payload")]
178    pub payload: serde_json::Value,
179}
180
181// ─── plugin/fetch_candidates ─────────────────────────────────────
182
183#[derive(Debug, Clone, Serialize, Deserialize)]
184pub struct FetchCandidatesParams {
185    #[serde(rename = "componentId")]
186    pub component_id: String,
187}
188
189/// Serializable candidate payload returned by remote DataSource plugins.
190/// The host reconstructs CachedCandidateData from these on receipt.
191#[derive(Debug, Clone, Serialize, Deserialize)]
192pub struct FetchCandidatesResult {
193    #[serde(rename = "candidates")]
194    pub candidates: Vec<SearchCandidate>,
195}
196
197// ─── plugin/supported_target_types ───────────────────────────────
198
199#[derive(Debug, Clone, Serialize, Deserialize)]
200pub struct SupportedTargetTypesParams {
201    #[serde(rename = "componentId")]
202    pub component_id: String,
203}
204
205// ─── plugin/supported_actions ────────────────────────────────────
206
207#[derive(Debug, Clone, Serialize, Deserialize)]
208pub struct SupportedActionsParams {
209    #[serde(rename = "componentId")]
210    pub component_id: String,
211    #[serde(rename = "targetType")]
212    pub target_type: TargetType,
213}
214
215// ─── plugin/executor_execute ─────────────────────────────────────
216
217#[derive(Debug, Clone, Serialize, Deserialize)]
218pub struct ExecutorExecuteParams {
219    #[serde(rename = "componentId")]
220    pub component_id: String,
221    /// 完整执行上下文原样透传(与进程内 ActionExecutor 拿到的 ExecutionContext 一致:
222    /// target / display_name / user_args / parameter_snapshot / locale)。
223    #[serde(rename = "executionCtx")]
224    pub execution_ctx: ExecutionContext,
225    #[serde(rename = "actionId")]
226    pub action_id: String,
227}
228
229#[derive(Debug, Clone, Serialize, Deserialize)]
230pub struct ExecutorExecuteResult {
231    #[serde(default)]
232    pub error: Option<String>,
233}
234
235// ─── plugin/calculate_scores ─────────────────────────────────────
236//
237// SearchEngine 组件:对缓存候选计算分数(含全量候选与查询词,宿主按
238// ScoredCandidate 列表重建结果)。
239
240/// plugin/calculate_scores 请求参数。
241#[derive(Debug, Clone, Serialize, Deserialize)]
242pub struct CalculateScoresParams {
243    /// 目标组件 id(SearchEngine 组件)。
244    #[serde(rename = "componentId")]
245    pub component_id: String,
246    /// 全量候选快照(宿主 CachedCandidateData::to_data 导出,id 保真)。
247    #[serde(rename = "candidates")]
248    pub candidates: CandidateCacheSnapshot,
249    /// 用户查询词。
250    #[serde(rename = "query")]
251    pub query: String,
252}
253
254// ─── plugin/booster_boost ────────────────────────────────────────
255//
256// ScoreBooster 组件:对已计算分数做增强,返回增强后的分数列表(索引与传入一致)。
257
258/// plugin/booster_boost 请求参数。
259#[derive(Debug, Clone, Serialize, Deserialize)]
260pub struct BoosterBoostParams {
261    /// 目标组件 id(ScoreBooster 组件)。
262    #[serde(rename = "componentId")]
263    pub component_id: String,
264    /// 全量候选快照(宿主 CachedCandidateData::to_data 导出,id 保真)。
265    #[serde(rename = "candidates")]
266    pub candidates: CandidateCacheSnapshot,
267    /// 引擎计算出的当前分数列表。
268    #[serde(rename = "scored")]
269    pub scored: Vec<ScoredCandidate>,
270    /// 用户查询词。
271    #[serde(rename = "query")]
272    pub query: String,
273}
274
275// ─── plugin/booster_record ───────────────────────────────────────
276//
277// ScoreBooster 组件:记录用户确认(选中候选 → 学习用户习惯)。
278
279/// plugin/booster_record 请求参数。
280#[derive(Debug, Clone, Serialize, Deserialize)]
281pub struct BoosterRecordParams {
282    /// 目标组件 id(ScoreBooster 组件)。
283    #[serde(rename = "componentId")]
284    pub component_id: String,
285    /// 被选中候选项的 id(宿主侧缓存内的原始 id)。
286    #[serde(rename = "candidateId")]
287    pub candidate_id: CandidateId,
288    /// 全量候选快照(宿主 CachedCandidateData::to_data 导出,id 保真)。
289    #[serde(rename = "candidates")]
290    pub candidates: CandidateCacheSnapshot,
291    /// 用户查询词。
292    #[serde(rename = "query")]
293    pub query: String,
294}
295
296// ─── plugin/keyword_optimizer_info ───────────────────────────────
297//
298// KeywordOptimizer 组件的动态属性(priority / uses_context 为设置可变字段,
299// 宿主在发现与设置变更时经本方法拉取并缓存)。
300//
301// 响应为裸 `KeywordOptimizerInfo`。
302
303/// KeywordOptimizer 组件的优化属性(经 keyword_optimizer_info RPC 拉取)。
304#[derive(Debug, Clone, Serialize, Deserialize)]
305pub struct KeywordOptimizerInfo {
306    /// 是否对所有已累积的关键词进行优化(true),还是只对原始名称优化。
307    #[serde(rename = "usesContext")]
308    pub uses_context: bool,
309    /// 链式执行优先级,小者先执行。
310    #[serde(rename = "priority")]
311    pub priority: u32,
312}
313
314/// plugin/keyword_optimizer_info 请求参数。
315#[derive(Debug, Clone, Serialize, Deserialize)]
316pub struct KeywordOptimizerInfoParams {
317    /// 目标组件 id(KeywordOptimizer 组件)。
318    #[serde(rename = "componentId")]
319    pub component_id: String,
320}
321
322// ─── plugin/keyword_optimize ─────────────────────────────────────
323//
324// KeywordOptimizer 组件:优化单个关键词(宿主按链序逐级调用)。
325//
326// 响应为裸 `Vec<String>`(优化生成的新关键词)。
327
328/// plugin/keyword_optimize 请求参数。
329#[derive(Debug, Clone, Serialize, Deserialize)]
330pub struct KeywordOptimizeParams {
331    /// 目标组件 id(KeywordOptimizer 组件)。
332    #[serde(rename = "componentId")]
333    pub component_id: String,
334    /// 待优化的关键词。
335    #[serde(rename = "keyword")]
336    pub keyword: String,
337}
338
339// KeywordInjector 组件:对单个候选注入关键词(与内置逐候选语义一致)。
340//
341// 响应为裸 `Vec<String>`。
342
343/// plugin/keyword_inject 请求参数。
344#[derive(Debug, Clone, Serialize, Deserialize)]
345pub struct KeywordInjectParams {
346    /// 目标组件 id(KeywordInjector 组件)。
347    #[serde(rename = "componentId")]
348    pub component_id: String,
349    /// 待注入的候选项(完整上下文:target、keywords 等)。
350    #[serde(rename = "candidate")]
351    pub candidate: SearchCandidate,
352}
353
354// ─── plugin/init ─────────────────────────────────────────────────
355//
356// 插件初始化钩子:宿主在组件注册完成后调用,通知插件进程完成初始化。
357// 与 plugin/initialize(进程级握手)不同层:init 携带真实查询上下文
358// (trace_id / locale),对应内置插件启动期的 Plugin::init。
359
360/// plugin/init 请求参数。
361#[derive(Debug, Clone, Serialize, Deserialize)]
362pub struct InitParams {
363    /// 目标插件 id(宿主覆盖为 manifest 插件 id)。
364    #[serde(rename = "pluginId")]
365    pub plugin_id: String,
366    /// 宿主构造的初始化上下文(真实 trace_id 与当前语言)。
367    #[serde(rename = "ctx")]
368    pub ctx: PluginContext,
369}
370
371// ─── plugin/interaction_policy ───────────────────────────────────
372//
373// 响应为裸 `PanelInteraction`(与 get_settings_schema 的裸数组约定一致)。
374// 策略为插件级语义:宿主仅对 Plugin 种类组件调用;SDK 恒返回主插件策略。
375
376/// plugin/interaction_policy 请求参数。
377#[derive(Debug, Clone, Serialize, Deserialize)]
378pub struct InteractionPolicyParams {
379    /// 目标组件 id(仅 Plugin 种类组件会收到该请求)。
380    #[serde(rename = "componentId")]
381    pub component_id: String,
382}
383
384// ─── plugin/get_default_enabled ──────────────────────────────────
385//
386// 响应为裸 `bool`。
387
388/// plugin/get_default_enabled 请求参数。
389#[derive(Debug, Clone, Serialize, Deserialize)]
390pub struct GetDefaultEnabledParams {
391    /// 目标组件 id。
392    #[serde(rename = "componentId")]
393    pub component_id: String,
394}
395
396// ─── host/log ────────────────────────────────────────────────────
397
398#[derive(Debug, Clone, Serialize, Deserialize)]
399pub struct LogParams {
400    #[serde(rename = "level")]
401    pub level: String,
402    #[serde(rename = "message")]
403    pub message: String,
404}
405
406// ─── host/notify ─────────────────────────────────────────────────
407
408#[derive(Debug, Clone, Serialize, Deserialize)]
409pub struct NotifyParams {
410    #[serde(rename = "title")]
411    pub title: String,
412    #[serde(rename = "message")]
413    pub message: String,
414}
415
416// ─── host/shell.open ─────────────────────────────────────────────
417
418#[derive(Debug, Clone, Serialize, Deserialize)]
419pub struct ShellOpenParams {
420    #[serde(rename = "target")]
421    pub target: String,
422}
423
424// ─── host/shell.open_folder ─────────────────────────────────────
425
426#[derive(Debug, Clone, Serialize, Deserialize)]
427pub struct ShellOpenFolderParams {
428    #[serde(rename = "path")]
429    pub path: String,
430}
431
432// ─── host/shell.execute_elevation ────────────────────────────────
433
434#[derive(Debug, Clone, Serialize, Deserialize)]
435pub struct ShellExecuteElevationParams {
436    #[serde(rename = "path")]
437    pub path: String,
438}
439
440// ─── host/shell.execute_command ──────────────────────────────────
441
442#[derive(Debug, Clone, Serialize, Deserialize)]
443pub struct ShellExecuteCommandParams {
444    #[serde(rename = "cmd")]
445    pub cmd: String,
446}
447
448// ─── host/window.activate_by_process ─────────────────────────────
449
450#[derive(Debug, Clone, Serialize, Deserialize)]
451pub struct WindowActivateParams {
452    #[serde(rename = "pid")]
453    pub pid: u32,
454}
455
456// ─── host/icon.get ───────────────────────────────────────────────
457// 返回值:图标字节的 base64 字符串。字节格式为 WebP(编码失败回退可能为
458// PNG),消费方按字节头嗅探 MIME(RIFF....WEBP → image/webp,否则 image/png)。
459
460#[derive(Debug, Clone, Serialize, Deserialize)]
461pub struct IconGetParams {
462    #[serde(rename = "request")]
463    pub request: serde_json::Value,
464    #[serde(rename = "level")]
465    pub level: String,
466}
467
468// ─── host/path.resolve ───────────────────────────────────────────
469
470#[derive(Debug, Clone, Serialize, Deserialize)]
471pub struct PathResolveParams {
472    #[serde(rename = "kind")]
473    pub kind: String,
474}
475
476// ─── host/resource.upload ────────────────────────────────────────
477
478#[derive(Debug, Clone, Serialize, Deserialize)]
479pub struct ResourceUploadParams {
480    #[serde(rename = "resourceId")]
481    pub resource_id: String,
482    #[serde(rename = "filePath")]
483    pub file_path: String,
484    #[serde(rename = "maxSize")]
485    #[serde(default)]
486    pub max_size: Option<usize>,
487}
488
489// ─── host/resource.put ────────────────────────────────────────────
490
491#[derive(Debug, Clone, Serialize, Deserialize)]
492pub struct ResourcePutParams {
493    #[serde(rename = "resourceId")]
494    pub resource_id: String,
495    #[serde(rename = "bytesB64")]
496    pub bytes_b64: String,
497}
498
499// ─── host/resource.get ───────────────────────────────────────────
500
501#[derive(Debug, Clone, Serialize, Deserialize)]
502pub struct ResourceGetParams {
503    #[serde(rename = "resourceId")]
504    pub resource_id: String,
505}
506
507// ─── host/resource.delete ────────────────────────────────────────
508
509#[derive(Debug, Clone, Serialize, Deserialize)]
510pub struct ResourceDeleteParams {
511    #[serde(rename = "resourceId")]
512    pub resource_id: String,
513}
514
515// ─── host/resource.list ──────────────────────────────────────────
516
517#[derive(Debug, Clone, Serialize, Deserialize)]
518pub struct ResourceListParams {}
519
520// ─── host/parameter.resolve ──────────────────────────────────────
521
522#[derive(Debug, Clone, Serialize, Deserialize)]
523pub struct ParameterResolveParams {
524    #[serde(rename = "userArgs")]
525    pub user_args: Vec<String>,
526    /// 参数模板字符串(如 "https://google.com/search?q={query}")。
527    /// 命名注意:此字段是模板,不是插件 ID。字段曾名为 pluginId 但造成混淆,已更正。
528    #[serde(rename = "template")]
529    pub template: String,
530}