插件开发与安装体验改进
常见插件应该围绕业务编写代码。解析、资源绑定、会话寻址、清理和诊断仍由框架负责;便捷接口委托现有 Runtime、Feature、Host、Permission 与统一消息链路。
本计划分阶段验收,未完成项不代表现有 API 已支持。新增公开接口还需要通过真实调用方与类型测试确定,不以示意代码作为正式契约。
进度与交付记录见 Issue #702。
安装闭环之后的消息诊断、用途配置、生效范围和任务管理,继续按用户体验优化路线推进(Issue #829)。
第一阶段:确定问题修复
| 场景 | 改进 | 验收 |
|---|---|---|
| 编写第一插件 | 教程与 README 使用当前命名目录、稳定版本范围和实例配置;子插件声明 Feature,宿主通过 peer 提供同一份共享 provider | 从中英文教程提取示例,通过真实 Runtime 发现并派发 ping-pong;缺失 peer、两个物理副本明确拒绝,插件独立作为应用时明确安装 provider 与适配器 |
| RSS 订阅 | 按公开消息字段提取会话与发送者,查询包含端点 | 同一平台的两个 Bot 在同一群内互不查询或删除对方订阅;无消息来源明确拒绝 |
| 后台业务发送 | 发送失败或未确认投递不再转成空 ID | 失败、拦截、不支持与投递未知均可识别;状态提示仍由自身处理容错 |
| Console 本地配置 | 按 Runtime 包解析读取 Schema | 根插件、本地包、npm 包、多实例和嵌套 owner 正确定位;缺失与非法 Schema 不混淆 |
本阶段不实现 RSS 自动重试、历史错误目标迁移或投递 outbox。测试不能将合成端点通过解释为真实平台验收。
第二阶段:高频创作接口
- 命令:目录定义静态层级;参数、选项、默认值、约束与帮助集中声明,并推导执行参数类型。错误反馈区别未匹配、校验失败与权限拒绝,不对普通聊天滥报错。
- 上下文:IM 门面按入站/出站提供默认类型。无消息的 Host 调用继续明确表达缺少消息与交互,不能靠断言伪造。
- 投递目标:从公开消息模型建立可持久化目标;发送时由当前 Runtime 解析。端点、父频道和线程完整保留,失效时明确拒绝,不改投其他 Bot。
- 状态:按 owner、用户、会话保存小对象,支持 TTL、事务或原子更新;缺持久服务时明确说明,不静默伪装为持久保存。
- 配置:统一生成 JSON Schema、TS 类型、默认值与表单元信息;密钥用环境引用,变更生效方式可见。补全内置 Host 与插件的引用、组合、动态字段和元组表单投影;当前内置 Host 保留既有投影,复杂配置仍用源码编辑,不能把表单校验宣称为完整 JSON Schema 校验。
- 准入:场景、角色、用户限制委托现有权限机制;冷却与并发控制采用共同机制;审批仍是独立执行关口。
每个接口至少用两类真实插件验收,防止只给单一业务包装函数。验证多人并发、两个插件实例、配置失败和热重载,不增加全局最新值单例。
第二阶段交付记录
本轮基于第一阶段 PR #703,落地 Issue #702 的七项创作接口;参数声明与参数校验/帮助共用一个契约,在表中合并为一行:
| 接口 | 验证调用方与边界 |
|---|---|
| 参数、选项、校验和帮助 | qrcode、code-runner 通过同一 CommandIndex 解析;错误输入不会被默认值吞掉,普通聊天保持未匹配 |
| IM 中间件类型 | repeater(入站 Message);严格类型夹具验证 Message、出站 Envelope、平台 client 与无消息 Host 上下文 |
| 可保存的投递目标 | reminder、preferences 两个正式 definePlugin Runtime 夹具,保留端点、父频道和线程;Core 回归验证 JSX、自定义组件和发起插件归属 |
| 轻量状态 | 同两类插件,验证 owner、用户、会话、两实例、数据库 CAS、TTL、局部 HMR、在途操作与重启;独立 PostgreSQL 17 / MySQL 8.4 连接池实测 |
| 配置声明 | repeater、short-url 使用同一 Schema 导出类型、默认值、校验及表单元信息;配置失败保持旧代,首次登录期间也提供表单 |
| 统一准入 | CommandIndex 和 checkPermissions 委托 PermissionHost;场景、角色、用户和平台权限有回归,Tool 审批继续独立 |
轻量状态目前支持 SQLite、MySQL、PostgreSQL;其他方言明确拒绝。isolated 插件仍须发布 schema.json,其入口代码不会为读取配置在 Host 中执行。完全自定义配置 resolver 负责提供自身的 schema(node) 元信息。
这里的 reminder / preferences 是使用真实发现、Host 与 HMR 的验收插件,尚不代表第三阶段的生产提醒产品。原计划中的共同冷却与并发准入机制仍待单独实现;本轮没有迁移 RSS 历史目标、增加 outbox 或宣称完成真实 IM 平台验收。
第三阶段:实用插件与安装闭环
优先完成提醒/订阅、关键词回复、群欢迎与管理、查询/状态卡片。一次性提醒与周期任务明确时区、取消、重启恢复、错过执行与重叠策略;业务发送不盲目重试未知投递。
CLI 和 Console 使用同一安装与配置服务:安装 → 依赖检查 → 最小配置 → 适用范围 → 应用/重启 → 当前 generation 就绪 → 功能验证。用户能区别已安装、已声明、缺配置、待重启、已启用和降级;验证需要针对实际插件功能,不能以启动成功代替后台任务验证。
渲染预览显示图片/原生内容/文本与降级原因;长期交互使用独立动作记录,不能保留旧 generation 的闭包。公开测试夹具通过真实发现、解析、权限与消息链路驱动合成端点,实机验收单独记录。
独立 Console 前端 消费同一 Host 服务:安装与配置、当前代及平台就绪、显式功能验证和按端点投影的预览分别展示。复杂 Schema 整体退回源码编辑,不以部分表单覆盖未展示字段。
第三阶段交付边界
本阶段保留 schedules/<name>/index.ts,并补齐 execute(ctx)。每次执行的 owner、generation、config 与资源解析由 Runtime 提供;plugin.ts 注入同一定义。持久化的是业务状态和投递目标,不保存上下文、Client 或回调。示例见 Schedule Feature。
| 调用方 | 当前验收范围 |
|---|---|
| 持久提醒 | 一次性与周期提醒、本人原会话取消、SQLite 重启恢复、两实例及 HMR;未知投递停止自动重试,本地数据库探针不证明平台投递成功;Agent 技能 reminder(create/list/cancel) |
| 日历 | CalDAV / Google / Microsoft 日历查询与创建;Agent 技能 calendar-scheduling(list_events / find_free_time / create_event) |
| 群运营 | 关键词持久化、群欢迎、管理与查询卡片;配置、端点、会话及实例隔离;消息统计采用定时批量写入,近期缓冲不是持久 outbox |
| 公开测试夹具 | 真正的发现、命令解析、权限与消息链路;合成端点记录最终交付载荷,测试应用仍会执行插件代码,不能作为副作用沙箱 |
| CLI / Console Host | 同一安装服务输出安装、声明、配置、应用及当前 generation 证据;业务验证必须先披露 effects,并绑定 generation、项目修订及检查修订 |
| 出站与预览 | 预览按所选端点策略投影,显示图片、原生内容、文本和降级原因;真实发送后的诊断反映最终载荷,预览不发送消息、不激活按钮且不运行出站中间件 |
第三阶段收尾验收
独立 Console 已实现安装计划的精确版本与修订确认、依赖检查、最小配置、显式应用、当前代状态、平台就绪及批准后的功能检查。安装回执不明先只读核对;业务检查结果未知时不能靠刷新插件状态判定副作用未发生。默认值、嵌套对象/数组、环境引用与源码草稿均保留原有配置修订,冲突时不覆盖他人修改。引用、组合、动态字典与元组等暂不支持的 Schema 明确整体转入源码编辑。
本地真实调用记录:通过 Console 安装 npm 的二维码插件,核对实例声明和最小配置,应用后读取当前代已发布与就绪证据;执行持久提醒的本地数据库检查,明确标记其不证明平台投递。安装过程中发现的依赖变更提前重启已修复。此次联调用候选 Host 与真实 npm 插件包混合,框架 peer 显式指向候选依赖,因此不等同于新建项目从 npm 一次安装成功的证明。
维护者授权的 ICQQ 私聊已实际完成命令收发、编号按钮回调和延迟提醒,并由接收者确认按钮回复与提醒收到;状态卡片取得平台图片消息 ID。提醒配置经 Console 保存后只发布新代,进程 PID 与 ICQQ 连接保持不变。目标预览显示图片投影及代号,未新增实际发送记录。其他平台、群欢迎/管理及一小时到期仍以真实 Runtime 合成端点与计时回归为证据,没有执行未授权的群管理或把这些测试写成实机验收。
连接创建只读取所属 owner 生命周期的配置与资源;跨 Feature 查询属于当前 operation 的上下文,不能捕获在保留的 Adapter/MCP 客户端里。配置失败保留旧代,成功发布先切换完整快照与准入状态再放行缓冲事件。
以上是本地实现与验收。远端 CI、审查、合并、部署和 npm 发布分别记录,不能互相替代;第二阶段遗留的共同冷却/并发机制继续独立跟踪。