Repository navigation
EasyBot v0.0.42
Added
-
QQ 公/私域机器人 intent 自动降级探测 — QQ 公/私域机器人的频道消息
intent(GUILD_MESSAGES/PUBLIC_GUILD_MESSAGES)互斥且官方无运行时探测端点。
适配器默认订阅群/C2C + 私域频道消息的保守集;当 Identify 以 close 4013/4014
(invalid / disallowed intents)被拒时,自动翻转频道 intent 位并重连重试一次
(Identify 成功收到READY后不再切换)。显式配置config.extra.intents时
保持既有语义,不自动切换。 -
Telegram 相册 / 多图出站(
send_media_group) — 新增
SendMediaGroupParams与PlatformAdapter::send_media_group(默认实现返回
CapabilityNotSupported),POST /api/v1/messages/send增加可选media_group
字段(优先级高于media)。Telegram 适配器将 2–10 条媒体经sendMediaGroup
一次发出:纯 URL 走 JSON body,含 base64 走 multipart +attach://;单条自动
退化为普通send_media,贴纸与超过 10 条明确拒绝。Discord / 飞书 / QQ / 微信
未实现该能力,经 trait 默认实现返回CapabilityNotSupported。 -
管理后台前端测试与类型工具链 — 在
crates/easybot-api/templates/新增 dev-only
工具链(package.json+ vitest + jsdom + eslint,不进运行时产物):tests/utils.test.js
29 项断言覆盖parsePrometheus/fmtDuration/statusBadgeClass/msgTypeLabel/
escapeHtml等纯函数;新增.github/workflows/frontend.yml(npm ci/test/lint,Action 固定 SHA,
通过仓库 pinning 门禁);新增js/types.d.ts手写类型契约(对照 OpenAPI)。 -
进程外插件 PoC(Linux 静态宿主插件路线验证) — 在
tests/integration内新增自包含的
进程外插件示例(ipc-mock-plugin插件进程 +IpcPluginAdapter宿主代理 + 端到端测试),
并验证 musl 静态(static-pie)宿主可拉起进程外插件完成完整生命周期(握手/连接/双向
事件/发送),全程不依赖 dlopen。结论与迁移建议见docs/other/plugin-out-of-process-poc.md。
Changed
- 核心大模块拆分(可维护性,对外 API 不变) —
auth/api_key.rs(3169 行)拆为
auth/api_key/{mod,keys,audit,billing,grants,tests}.rs;adapter/manager.rs、
storage/sqlite.rs、plugin/manager.rs的#[cfg(test)]测试模块抽出为
*/tests.rs子模块,adapter/manager.rs的重连分类与退避逻辑抽出为
adapter/manager/reconnect.rs。 - 依赖升级(兼容范围内) —
cargo update批量升级间接依赖;utoipa5→6、
utoipa-swagger-ui9→10(OpenAPI 快照随之更新,属 schema 表达变化,无语义变更);
serde_yaml(上游已归档弃用)改用维护 forkserde_norway0.9,以package别名
保持全部serde_yaml::调用不变。 - 微信适配器测试补齐 —
tests/send_mock.rs由 12 项扩充至 33 项,覆盖媒体类型映射
(image/video/audio/document/sticker/animation)、CDN 上传错误路径、getuploadurl业务
错误、缺失x-encrypted-param、非法 base64、能力声明与全部“不支持”操作。 - 覆盖率门禁 — 新增仓库根
codecov.yml:project(target: auto+threshold: 1%)
与 patch(target: 75%)阈值;coverage.yml移除continue-on-error并设
fail_ci_if_error: true。在分支保护中把codecov/project、codecov/patch设为
required 后即可阻止不达标的合并。 - 管理后台前端模块化(对外行为不变) —
templates/js/admin.js(2752 行单文件)
拆为 11 个文件(00-utils/10-core/21-overview…29-apikey-dialogs/30-tail,
全部 ≤683 行),由build.rs按文件名排序内联,拼接顺序保持原相对顺序;设计 token
收敛到单一templates/css/tokens.css(admin/home/docs 三页共用);Tab 支持 hash 深链
(#/logs等,支持刷新/收藏/前进后退)。 - 管理后台前端无障碍与文档搜索 — Tab 栏 emoji 改为内联 SVG 图标(
currentColor,
随主题/激活态变色)+ 完整 ARIA tabs 语义(aria-controls/aria-labelledby+
roving tabindex);文档页搜索由“仅过滤侧边栏标题”升级为标题+正文全文匹配
(隐藏不匹配章节,并显示“匹配 N / 总数”)。 - 个人微信适配器改为默认关闭(行为变更) — 微信无凭据要求(扫码登录),此前会被
无条件自动启用,导致每次启动都尝试连接微信 API 并后台重试;现改为 opt-in:
仅当配置显式adapters.wechat.enabled: true时才启动。其余四个适配器(凭据检测)与
插件适配器的自动启用逻辑不变。实现为注册表新增「无凭据时是否自动启用」策略位
(AdapterRegistry::register_with_policy),默认true保持向后兼容。
Breaking Changes
- 插件架构改为「进程外」——cdylib /
dlopen路径已移除 — 官方 Linux 发行版是
musl 全静态二进制(无INTERP/动态加载器),dlopen在任何情况下都不可能成功,
因此进程内插件在发行版上完全无法加载(与插件自身如何编译无关)。现改为:插件编译为
独立可执行文件,宿主将其作为子进程启动,双方通过 stdin/stdout 逐行 JSON
(新 crateeasybot-plugin-protocol)通信。- 迁移:
declare_plugin!→run_plugin!(放src/main.rs);产物 cdylib → bin;
plugin.yaml的library→command(library仍作为别名兼容)。
详见docs/other/plugin-cdylib-to-process-migration.md。 - 收益:崩溃隔离(插件退出 →
HealthStatus::Down→ 宿主重连/spawn)、静态宿主可用、
无 FFI 跨堆分配器问题(旧「FFI 分配器契约」随架构废止)。 - 注意:v1 仅提供崩溃隔离,不是安全沙箱(无 seccomp/降权);
生产隔离仍依赖容器化,见docs/18 plugin-security.md。 - 移除
libloading依赖、SDKffi.rs/declare_plugin!、PluginAdapterProxy与
测试用tests/plugins/mock-adapter(cdylib)。 - 加载器只保留一套:
PluginLoader(loader.rs)直接实现进程外扫描/验签/工厂,
删除了重复且不做签名校验的ProcessPluginLoader;旧式清单(仅library)现返回
PluginError::LegacyCdylibPlugin(错误信息含迁移指引),安装落位名与
PluginManifest::command_path()缺省推导统一为{name}(Windows{name}.exe)。 - 顺带修复
plugins/example-slack-plugin参考样例:它自 cdylib 时代起就无法编译
(API 漂移 + 未在 workspace 内),现已迁移为进程外插件、加入workspace.exclude
并验证可构建、可完成协议握手。
- 迁移:
Removed
- 移除未使用的
rand_core直接依赖 — easybot-core 的 CSPRNG 统一经
getrandom::rand_core(0.10 系)重导出使用,原先直接声明的rand_core 0.9未被引用;
移除后消除一处版本重复(剩余 0.9 来自 tungstenite 传递依赖,属上游)。
Fixed
- 修复
gateway.local.yaml为空(仅注释)时静默重置全部配置 —config::merge_configs
在local非 Mapping 时执行*base = local;只含注释的gateway.local.yaml解析为
Value::Null,于是整个基础配置被替换为 Null,再反序列化时所有字段回落 serde 默认值
(例如在gateway.yaml里把server.port改成 8081 会被静默重置回 8080,
server.adminPassword/storage.path等一并失效)。现 Null local 视为“无覆盖”直接返回,
并补充回归测试test_merge_configs_null_local_is_noop。 - 发布流程两处陷阱修复(不影响发布产物) —
scripts/release-preflight.sh的cargo run -p easybot-bin(不带特性)会把
target/debug/easybot重建成无插件版,导致随后cargo test --workspace的
cli::test_production_*/cli::test_plugin_cli_*误报失败;现让预检以
--features "default,plugin-system"构建并运行,使测试直接复用正确的插件版二进制。.github/workflows/release.yml的容器标签改由已校验的发布版本推导(type=raw),
不再依赖github.ref_type:此前用workflow_dispatch在分支 ref 上重跑发布时
docker/metadata-action的type=semver产生 0 个标签,docker作业以
tag is needed when pushing to registry失败。
- 管理后台前端修复 — 补定义
--bg-subtle、修正未定义的var(--primary)(调试面板
日志颜色);api()增加非 JSON/空响应防御并附带err.status;指标可视化中
method/path/platform 插值统一escapeHtml;PUT /config的 409 语义化(提示
“需审阅后重启”而非“保存失败”);会话删除/改名、Key 吊销/删除、插件卸载与目标授权
删除等 6 处原生confirm()/prompt()替换为可样式化的自研 modal(含焦点管理与 Enter/ESC)。