You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
OpenClawTray.FunctionalUI is an in-house MVU/reconciler with a hand-maintained set of primitives and element modifiers. Every new control need has to be added and maintained by hand, and non-trivial chat/UI features keep extending it:
The RichTextBlock chat-bubble work (branch karkarl-chat-bubble-richtextblock, commits 2fa7279 + 47b335d) added a RichTextBlock primitive and imperative block population purely to get selectable chat bubbles.
Both are maintenance we take on only because FunctionalUI is bespoke. Porting to Microsoft.UI.Reactor (or the agreed Reactor-style MVU library) would let us bypass hand-rolling and maintaining these primitives and lean on an upstream-maintained component surface.
Goal
Migrate the tray UI from OpenClawTray.FunctionalUI to Reactor, so:
New controls come from the upstream library instead of bespoke primitives + modifiers.
Existing screens (chat/canvas, Connection, onboarding, Command Center, Settings) keep current behavior and tests.
The selection-preservation and inert-markdown invariants from the chat work are preserved (or re-expressed) under Reactor.
Suggested phasing
Spike: stand up Reactor alongside FunctionalUI; port one leaf screen to validate patterns, testing, and reconcile/selection behavior.
Migrate screens incrementally behind the existing god-file-reduction guardrails (App.xaml.cs / ConnectionPage.xaml.cs) — one seam per PR with characterization tests.
Remove FunctionalUI once no consumers remain.
Constraints / guardrails
Follow AGENTS.md architecture guardrails: small, reviewable, one seam per PR; characterization tests before moving behavior.
Keep the chat inert-markdown security posture and the RichTextBlock selection-preservation cache invariant.
Preserve accessibility (UIA names/roles, live regions) and existing UI/MCP proof requirements.
Problem
OpenClawTray.FunctionalUIis an in-house MVU/reconciler with a hand-maintained set of primitives and element modifiers. Every new control need has to be added and maintained by hand, and non-trivial chat/UI features keep extending it:NativeElementescape hatch with a first-class FunctionalUIComboBoxprimitive (superseded fix(chat): keep session picker open during status renders #973) — i.e. we're still filling gaps in the primitive set.karkarl-chat-bubble-richtextblock, commits 2fa7279 + 47b335d) added aRichTextBlockprimitive and imperative block population purely to get selectable chat bubbles.Both are maintenance we take on only because FunctionalUI is bespoke. Porting to Microsoft.UI.Reactor (or the agreed Reactor-style MVU library) would let us bypass hand-rolling and maintaining these primitives and lean on an upstream-maintained component surface.
Goal
Migrate the tray UI from
OpenClawTray.FunctionalUIto Reactor, so:Suggested phasing
Constraints / guardrails
References
NativeElementescape hatch with FunctionalUIComboBoxprimitive (supersedes fix(chat): keep session picker open during status renders #973): fix(chat): replace NativeElement escape hatch with FunctionalUI ComboBox primitive (supersedes #973) #991karkarl-chat-bubble-richtextblock, commits 2fa7279 + 47b335d (RichTextBlock chat-bubble primitive + list coalescing) — PR pending from this branch; cross-link once opened.