mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-25 03:45:46 -06:00
33b10fe4aa
* fix(macos): honor user accent precedence in config snapshot and live-update chat window The Control UI user accent (ui.prefs.accent) landed in #128432/#128577 with precedence user accent -> operator ui.seamColor -> theme default, and the gateway's talk.config payload already applies it. The macOS app had two gaps: - ChannelsStore.applyUIConfig read raw ui.seamColor from the config.get snapshot and clobbered the user accent set from talk.config depending on arrival order. It now resolves ui.prefs.accent ?? ui.seamColor via a testable helper mirroring the gateway precedence. - The native chat window read AppStateStore.seamColorHex once at window construction, so accent changes never live-updated. MacChatSurface now reads the @Observable store in body, deleting the one-shot userAccent plumbing. Docs: configuration-reference.md documents the precedence for native-app chrome. Regression test fails pre-fix (snapshot returned the operator seam color instead of the user accent). * fix(macos): refresh config from gateway config.changed events Addresses the review finding that no macOS consumer turned the gateway's hash-only config.changed broadcast into refreshed shared state, so a Control UI accent change never reached an open native chat window while the app ran. ChannelsStore now subscribes to gateway pushes and re-fetches config.get on config.changed, reconnect snapshots, and sequence gaps. The refresh applies non-force so an in-progress local settings draft wins (the gateway rejects stale-hash writes anyway). The in-flight reload queue gains a closed pending level (none/refresh/force) so a refresh arriving during a load is coalesced instead of dropped, and a requeued refresh cannot clobber a dirty draft the way the old boolean force-pending did.