Skip to content

fix(auth): use config-mutation for channel reload - #101

Merged
NewFuture merged 1 commit into
mainfrom
newfuture-channel-reload-config-mutation
Sep 6, 2026
Merged

NewFuture merged 1 commit into
mainfrom
newfuture-channel-reload-config-mutation

Conversation

@NewFuture

Copy link
Copy Markdown
Owner

变更说明

triggerWeixinChannelReload 从运行时配置的读取、重建和整份写回,迁移到公共 openclaw/plugin-sdk/config-mutation API。

  • 显式指定 base: "source"afterWrite: { mode: "auto" },只修改 channels.openclaw-weixin.channelConfigUpdatedAt
  • 保留当前源配置中的频道设置、账号覆盖、其他频道及根配置,避免将旧运行时值当作写入意图。
  • 保留四处登录调用的非阻塞行为,以及失败时的脱敏告警和已保存凭据。
  • 扩展现有真实宿主 smoke,接入当前宿主的 strict CI jobs,并更新双语 Unreleased 记录。

参考 Tencent/openclaw-weixin#251 的局部配置 API 迁移,不引入其中其他 SDK 迁移或版本门槛调整。

验收标准

Closes #97

使用公共 mutation 子路径和明确的自动重载策略;只更新时间戳,保留当前 source 的其他内容,不插入空账号占位。失败时不回退到旧整份写入,不输出原始错误文本,也不回滚凭据或账号索引。CLI/Gateway 的正常登录和已绑定别名登记分支保持原有返回时机。精确宿主的导出、调用形状、注册和磁盘保留行为均有独立于 mock 的证据。

非目标与替代方案

本 PR 是兼容性/持久化边界修复。不修改二维码登录协议、账号身份、别名映射、凭据格式、状态路径、入站调度或消息 hooks;不复制配置锁,不添加重试队列、ambient SDK 声明或旧写入回退;不提升包、插件或最低宿主版本。

考虑过让登录调用方等待写入尝试完成,但这会改变登录延迟和生命周期顺序,也不能保证 Gateway 已完成重载。因此只在 helper 内部等待 mutation,以处理写入失败;调用方继续非阻塞。auto 表达宿主后续处理意图,不是重载完成确认。

关联任务与风险

关联任务:#97,已标记 agent:readyrisk:privileged

最高风险:登录后的配置持久化和宿主重载边界。真实登录、并发配置编辑及目标 Gateway 的整机行为仍待人工确认,因此本 PR 为 draft。

风险与不变量

插件/频道 ID openclaw-weixin、账号隔离、索引、别名、状态路径、登录返回时机、轮询/abort 和消息调度均不改变。凭据先由现有流程保存,后续配置写入失败不撤销它们。配置读取、串行化、冲突处理和落盘由宿主 API 拥有;沿用 redactError 保留安全错误元数据。

最低宿主仍为 2026.6.1,锁文件宿主仍为 2026.8.2,插件版本仍为 3.1.6;没有 manifest、锁文件或版本变动,也没有提交生成产物。

自动化测试用例

聚焦命令:

npm run test:unit -- src\auth\account-store.test.ts src\channel.test.ts scripts\check-host-compatibility.test.mjs

82 个用例通过。旧 helper 在新增用例中有 7 项失败,其中原始故障表现为写回旧根配置和旧频道值、重新引入已删除字段,而不只是 mock 调用次数不匹配。

用例 覆盖边界 预期结果 命令与结果
原始故障:新 source 与旧 runtime 不同 源选择和持久化候选 保留新根配置、频道设置、账号覆盖和其他频道 聚焦命令通过;旧实现失败
反例:旧字段、未更新的时间戳或错误兄弟频道值 smoke 保留断言 拒绝仅更新时间戳但仍破坏配置的结果 聚焦命令通过
缺少 channels;缺少 Weixin section 两个初始化分支 只创建必要容器,无空 accounts 占位 聚焦命令通过
连续成功调用 时间戳更新 每次使用对应的 ISO 时间戳 聚焦命令通过
安全错误码、任意错误文本 mutation 错误出口 脱敏告警,无成功日志、无旧 API 回退 聚焦命令通过
隔离存储已保存凭据后 mutation 失败 凭据、索引、别名和账号隔离 已保存状态和另一账号不变 聚焦命令通过
CLI 正常登录;CLI 已绑定别名登记 两个生产调用点 保存状态后请求 reload,返回不等待 reload 聚焦命令通过
Gateway 正常登录;Gateway 已绑定别名登记 两个生产调用点 保存状态后请求 reload,返回不等待 reload 聚焦命令通过
两种入口的无变更绑定、凭据/别名保存失败、未完成登录 否定分支和错误出口 不请求 reload,保留原有错误/返回行为 聚焦命令通过
实际 SDK 与编译后的 accounts 模块 无 mock 的导出、调用和磁盘边界 固定旧 runtime 后仍保留新磁盘 source,确认自动 follow-up 形状 下述精确宿主 smoke 全部通过

兼容性验证

本地环境:Windows x64、Node.js 24.19.0,本 PR 提交 d89cbb2 的代码。最后正常组合:Unknown / 未确认;旧实现的问题依赖 source/runtime 差异,不声称每次旧写入都会丢失配置。

宿主角色 精确 OpenClaw 版本 安装后导出及声明检查 安装后 typecheck/build 独立进程真实 smoke
最低支持宿主 2026.6.1 通过 通过 通过
保留的旧稳定版本 2026.7.1 通过 通过 通过
锁文件/当前宿主 2026.8.2 通过 通过 通过,最终常规 gate 后再次运行
本次解析得到的 beta 2026.9.1 通过 通过 通过

每个非锁文件目标按以下命令形状安装精确版本,再执行 typecheck/build,而不是先 build 再替换宿主:

npm install --no-save --package-lock=false --ignore-scripts --no-audit --no-fund openclaw@<exact-version>
npm run typecheck
npm run build

真实 smoke 使用 scripts\check-host-compatibility.mjscheckHostCompatibility(rootDirectory) 入口,由临时隔离 wrapper 在新的 Node 进程中调用。wrapper 在 SDK import 前设置独立 state、home、config、OAuth 和临时 cwd,并在结束后清理;未使用 Vitest mock 或注入的假 I/O。它确认规范插件/频道 ID 和单次注册,调用编译后的生产 helper,实际读写隔离配置。仓库 CI 入口为 node scripts\check-host-compatibility.mjs,新增 mutation 子进程自行隔离。

各宿主完成后以 npm ci 恢复 2026.8.2,再执行完整常规 gate;manifest 与锁文件未变。保留现有 CI 的 Node.js 22/24/26 和旧宿主覆盖,当前宿主 strict jobs 新增同一 smoke。

状态格式迁移:不适用,本 PR 不改变格式或迁移路径;既有迁移用例保留。

整机实测结果

  • 状态:等待人工实测(Pending human validation)。
  • 测试人员:待人工填写。
  • 操作系统与架构:待人工填写。
  • Node.js:待人工填写。
  • OpenClaw:待人工填写。
  • 插件版本或 commit:待人工记录本 PR 的受测 commit。
  • 安装方式:待人工填写。
场景 预期结果 实际结果
隔离非生产账号登录/重新登录 保存凭据并更新时间戳,目标 Gateway 按宿主策略处理 reload 等待人工实测
登录前后有不相关配置编辑 保留较新的不相关配置,不写回旧 runtime 值 等待人工实测
凭据保存后配置写入失败 输出脱敏告警,凭据继续保留 等待人工实测

脱敏关键日志

无。尚未开展人工整机实测;自动化过程中未访问真实微信后端或运行中的 Gateway。

其他验证命令

命令 结果
npm run check 通过:版本/样式、生产与测试类型检查、48 个文件中的 771 个测试、覆盖率门槛及 build
npm run pack:check 通过,96 个包文件
npm test --prefix docs\site 通过,46 个测试
npm run build --prefix docs\site 通过
git diff --check 通过

检查清单

  • 已在本地或 CI 中通过 npm run check
  • 已运行并列出完整的受影响测试矩阵。
  • 行为变更包含原始故障回归测试和能够区分真实修复的反例。
  • 兼容性修复保留了旧版本和当前版本测试,或已说明不适用。
  • 运行时行为改动包含人工整机实测结果;不影响运行时行为的改动已说明不适用。
  • 必要时已更新文档及中英文变更日志。
  • Issue、PR、测试和脱敏日志均未包含凭据、账号标识、二维码或私聊内容等敏感信息。
  • 已关联包含可验证验收标准的 issue,或说明为何不需要。
  • 我已审阅并对全部提交内容负责,包括 AI 辅助生成的内容。

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@NewFuture NewFuture added the risk:privileged Touches authentication, state, workflows, release, security, or package metadata label Sep 6, 2026
@NewFuture
NewFuture marked this pull request as ready for review September 6, 2026 09:46
Copilot AI balanced review requested due to automatic review settings September 6, 2026 09:46

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

Authentication persistence and host reload behavior still require the documented human whole-system validation.

Pull request overview

Migrates login-triggered reloads to the host’s focused config-mutation API, preventing stale runtime snapshots from overwriting source configuration.

Changes:

  • Mutates only the channel reload timestamp with automatic follow-up.
  • Adds login-path, persistence, compatibility, and CI coverage.
  • Documents the fix bilingually.
File summaries
File Description
src/auth/accounts.ts Uses source-based config mutation.
src/auth/account-store.test.ts Tests preservation and failure behavior.
src/channel.test.ts Tests all login reload paths.
scripts/check-host-compatibility.mjs Adds unmocked host mutation smoke test.
scripts/check-host-compatibility.test.mjs Tests preservation assertions.
.github/workflows/ci.yml Runs smoke tests in strict jobs.
CHANGELOG.md Adds Chinese release note.
CHANGELOG_EN.md Adds English release note.
Review details
  • Files reviewed: 8/8 changed files
  • Comments generated: 0
  • Review effort level: Balanced

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@NewFuture
NewFuture merged commit d94c675 into main Sep 6, 2026
18 checks passed
@NewFuture
NewFuture deleted the newfuture-channel-reload-config-mutation branch September 6, 2026 10:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:privileged Touches authentication, state, workflows, release, security, or package metadata

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Task]: Migrate channel reload writes to config-mutation

2 participants