Skip to content

EasyBot v0.0.34

Choose a tag to compare

@github-actions github-actions released this 13 Aug 05:43
· 97 commits to main since this release

Added

  • 插件市场(P6) — 通过 GitHub Releases 分发第三方适配器插件,easybot plugin
    子命令 + REST API + 管理后台完整管理:

    • 安装流水线 — easybot plugin install [publisher/]name:按宿主 6-target
      triple 匹配产物 → ABI 预检(sdk_version)→ requires.easybot semver range
      校验 → 信任确认 → 下载 → SHA256 比对 + ed25519 验签 → 原子落位(含合成
      plugin.yaml + plugin.sig.json)。--file <dir> 离线安装走同流水线跳过下载。
    • 多注册表(Taps) — plugins.registries 列表合并多源 catalog,插件名支持
      publisher/name 限定,5min 缓存。官方目录默认源为
      EasyIndie/EasyBot-Plugins(catalog.json)。
    • 信任管理(VS Code 1.97 语义) — 信任按发布者粒度存 plugins/.trust;
      --yes 不自动信任,显式 plugin trust <publisher> --public-key <k> 才加入。
    • 更新语义 — plugin update 显式触发、默认 pin 当前版本,--latest/--channel
      才跨版本(防更新攻击)。
    • 启停语义 — disable 立即 stop+unregister;enable 下次启动生效(v1 不做热
      dlopen);孤儿会话/消息由现有 TTL 保留策略兜底。
    • CLI — easybot plugin new/list/search/info/install/uninstall/enable/disable/ update/trust/inspect。
    • REST API — GET /plugins(含加载失败清单)、GET /plugins/catalog、
      POST /plugins/install、DELETE /plugins/{name}、
      POST /plugins/{name}/enable|disable(PluginsRead/PluginsManage 权限)。
    • 管理后台 — 🧩 Plugins tab:已装表(含失败行与原因)、市场目录(发布者徽标 +
      搜索)、安装/卸载/启停、首次第三方信任确认。
  • 生产模式插件签名门禁(行为变更) — --production / EASYBOT_ENV=production
    启动时扫描 plugins/ 目录,未签名插件且未设 plugins.allowUntrusted: true 则拒绝
    启动。此前手放的未签名插件在生产模式可加载;现在需走市场安装(带签名)或显式
    allowUntrusted。dev 环境不受影响(lenient:有签名验、无签名 warn)。

  • 开发者工作流(DX) —

    • 脚手架 — easybot plugin new <name> 生成独立可构建的插件工程(SDK git tag
      依赖,无需 clone 主仓),含 src/lib.rs 骨架、plugin.yaml、单元测试、
      PluginTestHost 集成测试、plugin-publish.yml 发布模板。
    • 测试宿主 — SDK testing feature 提供 PluginTestHost 内存宿主,离线跑通
      attach → init → connect → send → 事件流,配 recv_event/inbound_text 等构造器。
    • 发布者 CI 模板 — .github/workflows/plugin-publish.yml(自包含,仅公开 action
      • 40 位 SHA 固定):6-target 交叉编译 + gitleaks 扫描 + easybot-plugin-sign
        ed25519 签名 + 组装 easybot-plugin.json + Release。
    • 示例 — plugins/example-hello-adapter/ 入门 echo 适配器(workspace 成员,
      CI 持续编译验证脚手架产出形状)。
    • 文档 — docs/02 plugin-dev.md 重拆为 docs/plugin-quickstart.md(15 分钟教程)、
      docs/plugin-guide.md(完整参考)、docs/plugin-methodology.md(方法论);新建
      docs/SECURITY.md(信任模型)与 docs/docker-compose.plugin-dev.yml(Docker 联调)。
  • easybot-plugin-sign 独立工具 — gen-keypair / sign(ed25519),仅发布者
    CI 使用,主程序不持私钥。sign --sig-json <path> 额外写出离线分发用的
    plugin.sig.json(install --file 读取此格式验签),--name 显式指定插件名
    (kebab-case 插件必须——库名推导是下划线 crate 名)。

Changed

  • plugin.yaml 支持 enabled 字段 — Option<bool>,缺省启用,向后兼容。
  • PluginLoader 支持 PluginLoadPolicy — lenient(dev 默认)/ strict(prod),
    新增 DisabledPlugin / SignatureVerificationFailed 错误变体,加载时对 plugin.sig.json
    重新验签。
  • AdapterRegistry::unregister — 卸载/禁用插件时移除平台工厂。
  • 配置 — GatewayConfig 新增 plugins: 段(directory / autoLoad /
    verifySignatures / allowUntrusted / trustedPublishers / registries),
    easybot --init 展开默认值。
  • 配置字段接线 — plugins.directory(插件目录,相对/绝对路径)、
    plugins.autoLoad(启动自动加载)、plugins.verifySignatures(关闭签名校验)
    现全部生效;目录由 resolve_plugins_dir 统一解析,生产门禁 / 加载 / CLI 一致。
  • 生产模式加载策略 — 生产启动时 PluginManager 使用 strict 加载策略(强制签名
    • 发布者信任,信任 = 配置 trustedPublishers ∪ 用户 .trust);plugins.allowUntrusted: true 时退化为"有签名验、无签名放行"。dev 恒 lenient 不受影响。

Fixed

  • 信任语义落地(对齐文档) — plugin install --yes / API trust: true 现与文档
    一致,不再自动把发布者写入 .trust(此前实现会写入)——一次性确认仅放行本次
    安装;plugin update 在发布者更换签名密钥(密钥轮换/泄露)时返回 needs_trust,
    需显式 plugin trust 重新信任。
  • 安装下载加固(安全) — artifact.url 仅允许 https + GitHub 主机(防 SSRF /
    host 混淆);artifact.library 与 plugin.yaml 的 library 仅允许裸文件名
    (防路径穿越,下载前拒绝);--file 离线安装同步校验 requires.easybot 兼容范围。
  • 生产启动扫描跳过禁用插件 — enabled:false 的插件不加载、无需验签,不再被
    生产门禁误拒。
  • install --file 缺省库名按宿主 triple 推导 — 此前传字面量 "host"(既不含
    windows 也不含 apple),macOS/Windows 上离线安装落位为 .so 扩展名错误、
    加载期重验签失效;现按 current_target_triple() 推导。
  • 缺省库名按下划线 crate 名推导 — cargo cdylib 产物是下划线 crate 名
    (kebab-case 包名 → 下划线,如 libhello_adapter.dylib),推导(manifest.library_path
    / default_library_name)与发布 CI 的 library 字段原先用连字符名,导致 kebab-case
    插件手动安装 / --file 安装后加载找不到库;三者统一为下划线约定。