Skip to content

fix: 收口 OpenClaw pairing、多会话节点与保存竞态回归#4

Merged
milome merged 17 commits into
masterfrom
dev
Apr 20, 2026
Merged

fix: 收口 OpenClaw pairing、多会话节点与保存竞态回归#4
milome merged 17 commits into
masterfrom
dev

Conversation

@milome

@milome milome commented Apr 17, 2026

Copy link
Copy Markdown
Owner

Why

这组提交不是单点修复,而是在收口同一条用户链路上的连续回归:

  • 首次配对流程里“连接成功”和“配对完成”被混淆,导致误跳成功页、误保存或错误提示。
  • loopback 场景暴露了当前真实不可完成的 pairing 路径,同时还引入了 token 被错误清空的回归。
  • Profile / Evolution 在多 session 场景下对节点的展示和切换不一致,用户能连上两条会话,却看不到或切不到对应节点/agents。
  • 配置页从 loopback 切换到已配对 LAN IP 时,保存链路在同 endpoint 二次连接下触发 session registry 竞态,导致 gateway not connected 和 sessions 消失。

本次 PR 的目标是把这些问题收口成一致、可解释、可验证的行为,而不是继续叠加局部补丁。

What Changed

1. Pairing / Setup / Config Flow

  • 拆分“已配对设备”和“开始首次配对”两条路径,明确区分:
    • 连接成功
    • 等待批准
    • 已拿到 device token
    • connected_without_pairing
  • 首次配对不再误走普通测试成功页。
  • 配置页与向导共享同一套 pairing follow-up 语义,减少页面间分叉。

2. Loopback Policy And Token Safety

  • loopback 下不再暴露当前不可完成的 pairing UI,只保留 token/password 本地连接路径。
  • 禁止 loopback 自动采纳 pairedReady,避免本地 token 连接在“进入应用 / 立即体验”链路里被错误清空。
  • 配置页同步这一策略,避免向导和配置页行为不一致。

3. Multi-Session Node Visibility

  • Profile 节点列表改为优先基于 realNodes 展示,而不是只从 active session 的 agents 反推。
  • 即使某条 session 当前没有加载 agent roster,也会在 Profile 中可见。
  • Evolution 页选择节点时会同步切换 active session,使 loopback / LAN 节点都能显示对应 agents。

4. Gateway Session Replacement Race

  • GatewayActiveConnection 增加实例级 instance_id
  • clear_session_for_id 改为按 session_id + instance_id 双重匹配。
  • 修复同 endpoint 二次连接时,旧 reader 误删新连接的问题,从根因上解决:
    • gateway not connected
    • “高级配置已保存,但是基础连接更新失败”
    • sessions section 消失

Commit Summary

  • 3b89dfa fix(config): 修复配对状态识别与首次配对引导
  • 8dcf88f fix(config): 完善首次配对保存闭环引导
  • bb88216 fix(config): 修复首次配对审批与保存流程
  • 5f2600f fix(setup): 修正首次配对误跳成功页
  • 66cf297 fix(setup): 收口本机 loopback 配对入口
  • e0ad712 fix(setup): 修复 loopback token 进入应用回归
  • 30f3f19 fix(profile): 修复多会话节点可见性
  • a3863e8 fix(config): 对齐 loopback token 回归修复
  • bcbdc37 fix(evolution): 修复节点切换未同步会话
  • 0e45cd6 fix(gateway): 修复同端点保存竞态

Validation

Frontend

  • npm run lint
  • npm run test -- src/app/components/setup/openClawPairingState.test.ts src/app/contexts/openClawConnectionPolicy.test.ts src/app/components/setup/openClawConfigSectionState.test.ts
  • npm run test -- src/app/components/views/evolutionTargetState.test.ts src/app/components/views/profileNodeState.test.ts
  • npm run test -- tests/i18nGovernance.test.ts

Rust / Gateway

  • cargo test gateway::state --manifest-path src-tauri/Cargo.toml -- --nocapture
  • cargo test gateway::connector --manifest-path src-tauri/Cargo.toml -- --nocapture

Reviewer Guide

建议按下面顺序看,评审成本最低:

  1. src-tauri/src/gateway/state.rs + src-tauri/src/gateway/connector.rs
    先确认同 endpoint 保存竞态修复是否合理。
  2. src/app/components/setup/* + src/app/contexts/openClawConnectionPolicy.ts
    看 pairing / loopback 行为是否一致。
  3. src/app/components/views/ProfileView.tsx + src/app/components/views/EvolutionView.tsx
    看多 session 节点展示和切换是否对齐。
  4. src/app/components/**/*State*.test.ts + tests/i18nGovernance.test.ts
    看状态 helper 与治理测试是否覆盖关键行为。

Checklist

Reviewer Focus

  • gateway 侧确认:同一 session_id 被新连接替换后,旧 reader 不会再清掉新连接。
  • setup/config 侧确认:pairing 状态机没有继续把“连接成功”误当成“配对完成”。
  • loopback policy 侧确认:loopback 只保留 token/password 路径,不再暴露当前不可完成的 pairing UI。
  • multi-session UI 侧确认:Profile 与 Evolution 都以真实 session 节点为准,而不是只跟着 active session 的 agents 走。

QA Scenarios

  • 首次配对:未拿到 device token 时,向导停留在当前步骤并给出下一步提示,不会误跳成功页。
  • loopback 本地连接:token 流程测试成功后,进入应用 / 立即体验时不会再报 Gateway Token is required
  • loopback -> 已配对 LAN:配置页测试通过后,点击保存不会再报 gateway not connected
  • sessions section:保存 LAN 配置后仍然存在,并保留多条 session。
  • Profile 节点选择:loopback + LAN 同时存在时,两条节点都可见,即使其中一条暂时没有 agent roster。
  • Evolution 节点选择:切到非 active 节点时,会同步切 active session,并显示该节点的 agents。

Regression Guardrails

  • 单 session 场景没有被多 session 相关修复打坏。
  • loopback 与 LAN 仍然保持两个 endpoint 节点,不会被错误聚合成一个 machine 节点。
  • 前端 lint / 定向 tests / Rust gateway 定向 tests 都已查看并为绿色。
  • 真实双 session 手工 smoke test 仍建议 reviewer 或 QA 再补跑一遍。

Notes

  • 本次仍然保持 loopback 与 LAN IP 为两个 endpoint 节点,不做 machine-level 聚合。
  • loopback pairing UI 收口是基于当前真实互操作行为做的产品决策,不等于修改 OpenClaw host 协议行为。
  • 更详细的归档模板已保存到 docs/PR/PR_dev_2026-04-17_16-06-33.md

milome added 10 commits April 17, 2026 03:52
新增状态驱动的已配对网关识别与列表,并补齐 paired_device 的 bootstrap 配对流程与错误提示。
让首次配对直接触发测试,并在拿到 device token 后立即刷新状态与提示保存。
拆分已配对设备与首次配对流程,补充审批提示、device token 状态和可保存闭环。
区分连接成功与完成配对;未拿到 device token 时停留在配对步骤并补充引导。
loopback 地址下隐藏已配对设备与首次配对路径,保留 token/password 连接并提示改用局域网 IP 配对。
禁止 loopback 自动采纳 pairedReady,避免测试成功后清空 token 并在进入应用时触发 token required。
Profile 节点列表改为基于 realNodes 展示,未加载 agent 的会话节点也可见并可切换为 active。
配置页同步禁止 loopback 自动采纳 pairedReady,避免本地 token 连接被错误清空。
进化页选择其他节点时同步切换 active session,确保 loopback 节点也能显示对应 agents。
为会话实例增加身份校验,避免旧 reader 在同 session_id 重连后误删新连接,并保留 sessions 视图。
@milome milome changed the title fix: 收口 pairing 与多会话节点回归 fix: 收口 OpenClaw pairing、多会话节点与保存竞态回归 Apr 17, 2026
@milome milome merged commit 560542c into master Apr 20, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant