mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-16 23:52:40 -06:00
3f006ba0fc
* fix(ui): complete pairing setup lifecycle Redeemed and expired mobile setup codes stayed on screen as usable QR codes, so a successful pairing had no visible outcome and expired bearer material still looked live. The Gateway now mints an opaque, non-authorizing setupId beside each setup credential, returns its authoritative expiresAtMs, records the terminal outcome of the exact redemption, and broadcasts device.pair.setup.completed. Because that broadcast is dropped for buffered operator sockets, the completion is persisted first and can be reconciled through the new device.pair.setupStatus method: the Control UI asks for the recorded outcome before it may present a credential as expired, so a pairing that succeeds is never shown as a failure. The Control UI models one closed lifecycle (selection, loading, waiting, success, expired, error) correlated only by the active setupId, and Pairing help now carries the external-link affordance. * fix(ui): preserve unknown pairing outcomes * test(ui): target pairing terminal headings * test(ui): align pairing completion fixture * fix(gateway-protocol): decode setup-code results from older gateways Older protocol-v4 gateways omit the new setupId and expiresAtMs lifecycle fields, so requiring them in the generated native model broke decoding an existing device.pair.setupCode response. Keep both optional at the wire boundary, require lifecycle metadata before the Control UI enters its waiting state so a missing outcome stays visible, and cover the legacy payload with Swift and schema regressions. * fix(ui): surface rejected pairing dialog loads The lazy pairing chunk could reject while its overlay was already open, leaving the shell rendering nothing at all. Record the rejection on the shell and render a recoverable modal with a reason and a retry so the open action always ends in a visible outcome. * fix(state): preserve pairing setup schema compatibility * test(gateway): cover pairing setup release train * fix(gateway): commit pairing setup completion atomically * refactor(state): distinguish setup transaction helpers * refactor(state): remove obsolete bootstrap restore path * fix(gateway): preserve setup handoff type safety * fix(gateway): keep pairing completion terminal after consume * fix(gateway): validate Watch binding during setup commit * fix(gateway): revalidate setup credential expiry at commit * chore: refresh Plugin SDK API contracts after rebase * fix(pairing): prune expired setup completions * chore: retrigger CI * fix(protocol): deduplicate setup expiry field * fix(protocol): refresh pairing setup clients * fix(gateway): make pairing setup completion durable * fix(ui): retire expired pairing credentials immediately * fix(ui): keep pairing dialog visible while loading * fix(macos): align setup result initializer order * fix(gateway): restore generic bootstrap retries * chore(ui): record pairing startup budget * chore(ui): refresh pairing startup budget * style(gateway): format maintenance imports * test(gateway): cover session-sharing mock * fix(state): defer setup correlation schema --------- Co-authored-by: Patrick Erichsen <patrick.a.erichsen@gmail.com>