插件类型双轴命名:kind(builtin/external)× transport(socket/stdio)¶
插件的 manifest 原本把插件类型编码成一个 transport 枚举
(in-process-go, jsonrpc-ws, jsonrpc-stdio),把四件互不相干的事混在了一起:来源
(一方 vs 三方)、位置(进程内 vs 独立进程)、实现语言,以及线协议。我们参考 VSCode
扩展和 Zotero 插件,把它拆成两个正交轴:
kind—builtin(一方,编译进 qatlasd,以 Go 进程内运行)或external(三方,作为独立进程通过 JSON-RPC 与 host 通信)。transport— 只对external有意义:socket(插件拨入 host 的 WebSocket 端点, 并用连接密钥认证)或stdio(host 从spawn.command启动插件可执行文件,并通过 其 stdin/stdout 跑 JSON-RPC,即 LSP/DAP 模型)。builtin不需要 transport(调用就是进程内函数调用)。
从旧枚举迁移:in-process-go → kind=builtin;jsonrpc-ws → kind=external, transport=socket;jsonrpc-stdio → kind=external, transport=stdio。JSON-RPC 是唯一的 RPC
方言,因此不再出现在任何名称里。
备选方案¶
保留单个
transport枚举。 否决:一个字段会混淆来源/位置/语言/线协议, 名称也泄露线协议(jsonrpc-ws),而不是表达概念(一个拨入的 external 插件)。
影响¶
manifest.go(Manifeststruct +Validate)和每个plugins/<id>/plugin.json都改成 双轴形态。builtin/socket要求spawn == null;stdio要求spawn.command。四个一方插件(graph, rag, wiki, lean)都是
kind=builtin。external的 socket/stdio transport(现有的plugin/rpc.go+hostapi)保留给真正的三方插件——不删除。