mirror of
https://mirror.skon.top/github.com/sliverp/qqbot
synced 2026-04-20 21:00:16 +08:00
* feat: support raw msg ref * fix: mention msg content * fix: qqmedia tag * feat: parse msgrefid * feat: 流式消息能力增强、斜杠指令扩展与媒体标签处理优化 ## 流式消息 (streaming) - 支持流式消息引用:回复时携带引用消息 ID,通过 message_reference 字段传递 - 重构回复边界(reply boundary)机制:检测到模型返回新回复(文本前缀不匹配)时, 不再终结当前会话并创建新 controller,改为在已有内容后拼接 "\n\n" 分隔符, 在同一流式会话中继续发送,移除 onReplyBoundary 回调及 gateway 中的重建逻辑 - 移除遇到未闭合媒体标签时提前终结流式会话的逻辑,改为继续正常流式发送安全文本 部分(performFlush 内置的 stripIncompleteMediaTag 已能保证安全),等待下次 onPartialReply 带来更多文本后标签自然闭合 - 移除 sendStreamChunk / doStartStreaming 中冗余的 resp.code 错误检查 - streaming 阶段状态转换新增 idle 回退(首分片发送失败时可回退到 idle) - sendC2CStreamMessage 返回类型从 StreamMessageResponse 统一为 MessageResponse; 仅终结分片(DONE)触发 sendAndNotify 引用回调,中间分片直接调用 apiRequest - 移除 types.ts 中不再使用的 StreamMessage / PendingReply 等冗余类型定义 - 补充 streaming-controller 测试用例:覆盖回复边界检测、多段拼接连续发送、 sentIndex 连续性等场景 ## 斜杠指令 (slash-commands) - 新增 /bot-streaming on|off 指令,支持用户在私聊中查看和切换流式消息开关, 修改后即时生效并持久化到 openclaw.json 配置文件 - 指令仅在 c2c(私聊)场景下可用,群聊场景下返回提示信息 ## API 模块 (api) - 引入 ApiLogger 接口与 setApiLogger 注入机制,将 api 模块内散落的 console.log/error 调用统一替换为可注入的 log 实例,便于日志分级和集中管理 - gateway 启动时自动调用 setApiLogger 注入框架 log 实例 - startBackgroundTokenRefresh 中将参数名 log 改为 refreshLog, 避免与模块级 log 变量冲突 ## 网关 (gateway) - 简化 StreamingController 创建流程:移除 createStreamingController 工厂函数 及 onReplyBoundary 回调注册,直接内联创建 controller - dispatch 失败时统一输出错误日志,包含是否收到过响应的信息 ## 媒体标签处理 (media-send) - 修复 splitMessageByMediaTags 中正则贪婪匹配导致的字符异常问题, 改为非贪婪匹配避免跨标签吞并内容 - 新增代码块感知逻辑(isInsideCodeBlock):在匹配媒体标签前先识别并排除 围栏代码块(```)区域,避免代码块中的标签被误当作媒体资源处理 - hasMediaTags / findFirstClosedMediaTag / splitByMediaTags 均集成代码块过滤 - findFirstClosedMediaTag 不再对 textBefore 做 trim 和多余换行合并处理 - 新增 code-block-media-tag 测试文件,覆盖代码块内标签忽略、混合内容拆分、 嵌套代码块、未闭合代码块等边界场景 * ci: 添加插件测试环境流水线流程 * fix: 文件超2G错误信息优化 * fix: 优化文件上传兜底文案 * fix(api): 流式消息不存储引用,移除 DONE 分片的 sendAndNotify 回调 * feat: update ref struct * fix(ref); 移除引用中暂时无用的赋值。 * feat: 支持自然语言更新版本 * feat(qqbot-upgrade): 声音qqbot-upgrade skill * feat: 增加/bot-streaming不支持时的默认回复 * refactor: 重构升级脚本降级架构 v4 + 安全扫描绕过 + 内置插件禁用 ## 降级架构重构 - 两级降级:Level 1 原生命令 → Level 2 npm pack + openclaw install 本地目录 - Level 1 去掉无效的多源重试(ClawHub 限流时换 npm 源无意义) - Level 2 多源重试(npm pack 直接走 npm registry,真正绕过 ClawHub) ## 安全扫描绕过(openclaw ≥2026.3.30) - ≥3.30 跳过 update 路径(update 不支持 --dangerously-force-unsafe-install) - Level 2 传解压后的目录路径而非 tarball(绕过 installPluginFromArchive 漏传 flag 的 bug) - 版本检测:仅 ≥3.30 时加 --dangerously-force-unsafe-install ## 内置插件冲突处理 - 默认禁用内置冲突插件(openclaw ≥2026.3.31 内置了 qqbot) - 安装前清理历史遗留 ID(qqbot/openclaw-qq)的 entries/installs/allow - 安装后验证内置插件确实已禁用 ## 其它优化 - update 超时从 1000s 缩短至 180s(失败更快降级) - install 前清除配置中的插件记录(避免 already exists) - 精简告警信息:超时提示静默化,重试中间失败去掉 ⚠️ - 步骤标签对齐 [1/4]~[4/4] * feat: inject OpenClaw version into User-Agent via runtime - Add PluginRuntime.version field to openclaw-plugin-sdk.d.ts - Replace static PLUGIN_USER_AGENT const with getPluginUserAgent() function so the OpenClaw version can be updated after runtime injection - Add setOpenClawVersion() to api.ts for runtime to call - Call setOpenClawVersion(runtime.version) in setQQBotRuntime() - Update all PLUGIN_USER_AGENT usages to getPluginUserAgent() - Fall back to OPENCLAW_VERSION / OPENCLAW_SERVICE_VERSION env vars before runtime is available * fix: remove env-based OpenClaw version fallback Reading version from process.env is a security risk as env vars can be tampered. Use runtime.version exclusively; fall back to "unknown" until runtime is injected. * fix(upgrade): 切换 gateway.reload.mode=hot 防止安装期间配置写入触发 cgroup kill 问题根因: - openclaw gateway restart 使用 systemctl --user restart - systemd 默认 KillMode=control-group,重启时清理整个 cgroup - 安装流程多次写 openclaw.json,hybrid 模式下触发 restart,脚本被杀 修复: - snapshot_config 提前到所有写操作前(含 disable_builtin_plugins) - 安装窗口开始时切换 gateway.reload.mode=hot(热更新不重启) - 新增 restore_reload_mode():有原值 config set 恢复,无原值 config unset 删除 - cleanup_on_exit 和 [4/4] 前均调用恢复,正常/异常退出均兜底 * fix: 修复windows下路径编码异常导致文件发送错误的问题 * feat: add preferOver to disable built-in qqbot plugin * feat: 插件升级skill优化 * feat: 更新skill的仓库名 * feat: update 1.7.0 changelog * Merge branch 'feat/1.7.0-revertskill' into 'main' (merge request !44) feat: revert qqbot-upgrade skill --------- Co-authored-by: cxyhhhhh <chenxuyang.win@qq.com>