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
Cross-project TUI architecture decisions that affect Grove's boardroom UI. Canonical issue with full rationale: windoliver/koi#1484. This issue tracks Grove-specific implementation.
Grove's TUI is the most mature of the three (~40 views, full app shell, multi-panel boardroom). Migration is larger but the payoff is highest — streaming contribution feeds, agent terminals, and frontier updates all benefit from SolidJS reactivity.
Wave 0 (document current behavior before changing it)
These are mostly independent — run 1a-1c in parallel, 1d anytime. Theme tokens (1a) must land before SolidJS migration. Product direction (1b, 1c) must settle before converting views — no point converting a view that's about to be redesigned.
All independent of each other — run in parallel. This is where the SolidJS migration pays off: plugin slots (#189), useTimeline animations (#192), and reactive event streaming all require Solid.
Grove's TUI has ~40 views built on React 19 + @opentui/react ^0.1.87. SolidJS fine-grained reactivity eliminates reconciliation overhead — critical for the contribution feed, agent terminal output, and frontier updates.
Grove-specific migration notes:
Zustand stores map to SolidJS stores (both proxy-based, similar API)
@opentui-ui/dialog and @opentui-ui/toast both ship /react and /solid entry points
useKeyboard, useRenderer, useTerminalDimensions have identical APIs in both reconcilers
xterm terminal views need the Solid lifecycle equivalent (onMount/onCleanup vs useEffect)
Grove mixes TUI rendering with HTTP polling, contribution processing, and tmux/acpx management in one thread. Target: rendering in main thread, Grove server + agent coordination in worker.
Grove-specific RPC:
start(preset, goal) — launch session
subscribe() → SSE stream of contributions, claims, agent events
submitWork(contribution) — agent publishes work
claim(taskId) — claim a task
shutdown() — cleanup agents + Nexus
3. SSE event streaming (replaces polling)
Directly addresses #188. Grove server emits SSE for:
New contributions
Claim state changes
Agent status transitions
Frontier recomputation
Goal/topology changes
TUI consumes via 16ms batched event handler.
4. Shared component library
Grove independently built components that overlap with Koi and Nexus:
command-palette.tsx → shared CommandPalette
status-bar.tsx → shared StatusBar
table.tsx → shared or native OpenTUI
theme.ts → shared ThemeProvider with semantic tokens
Grove adds domain-specific views on top: DAG, frontier, claims, agent terminals, artifact preview, etc.
5. OpenTUI version bump
Currently ^0.1.87 — pin to 0.1.96 (match Koi). Gains: streaming markdown, improved diff rendering, plugin slot system, performance fixes.
Summary
Cross-project TUI architecture decisions that affect Grove's boardroom UI. Canonical issue with full rationale: windoliver/koi#1484. This issue tracks Grove-specific implementation.
Sibling issues: windoliver/koi#1484, nexi-lab/nexus#3632
Execution Order
Grove's TUI is the most mature of the three (~40 views, full app shell, multi-panel boardroom). Migration is larger but the payoff is highest — streaming contribution feeds, agent terminals, and frontier updates all benefit from SolidJS reactivity.
16 issues in 5 waves.
Wave 0 — Prerequisites (fix what's broken)
Wave 0 unblocks everything. Stabilize before transforming.
Wave 1 — Foundation (theme + welcome + product direction)
These are mostly independent — run 1a-1c in parallel, 1d anytime. Theme tokens (1a) must land before SolidJS migration. Product direction (1b, 1c) must settle before converting views — no point converting a view that's about to be redesigned.
Wave 2 — Architecture migration (the big one)
@opentui/react→@opentui/solid)0.1.96(match Koi)SolidJS conversion order (Grove-specific — by dependency, not alphabetical):
Phase 2a-i: Infrastructure (~2 days)
theme.ts→ SolidJS context providerhooks/use-keyboard.ts,hooks/use-navigation.ts→ Solid primitivesdata/use-polled-data.ts→ SolidcreateResource+ SSE (TUI: reduce polling feel with event-driven live updates across core surfaces #188)providers/→ Solid context providersPhase 2a-ii: App shell (~1 day)
5.
tui-app.tsx→ Solid entry6.
app.tsx(boardroom) → Solid7.
screens/screen-manager.tsx→ SolidPhase 2a-iii: Guided flow screens (~2 days)
8.
screens/preset-select.tsx9.
screens/goal-input.tsx10.
screens/agent-detect.tsx,spawn-progress.tsx11.
screens/running-view.tsx12.
screens/complete-view.tsxPhase 2a-iv: Boardroom panels (~3 days)
13.
panels/panel-manager.tsx,panel-registry.ts14.
components/(status bar, input bar, tab bar, command palette, help, tooltips, progress)15.
views/— convert in dependency order: simple views first (welcome, dashboard), then complex (dag, frontier, detail, terminal, artifact-preview, trace)Phase 2a-v: Remove React (~0.5 day)
16. Remove
react,@opentui/react,@types/react17. Switch
@opentui-ui/dialogand@opentui-ui/toastto/solidentry pointsWave 3 — Features enabled by new architecture
<code>,<diff>,<scrollbox>,<markdown>useTimeline)@opentui/solid)@koi/tui-baseAll independent of each other — run in parallel. This is where the SolidJS migration pays off: plugin slots (#189),
useTimelineanimations (#192), and reactive event streaming all require Solid.Wave 4 — Advanced UX
<scrollbox>,<code>)Visual dependency graph
Effort estimates
Total: ~23-31 days of focused work. Grove is the largest migration because it has the most views, but Waves 3 and 4 are heavily parallelizable.
Recommended cross-project sequence
Koi should go first (smallest, no app shell — build right from day one), then the pattern is proven for Grove and Nexus:
What changes for Grove
1. Migrate from
@opentui/reactto@opentui/solidGrove's TUI has ~40 views built on React 19 +
@opentui/react ^0.1.87. SolidJS fine-grained reactivity eliminates reconciliation overhead — critical for the contribution feed, agent terminal output, and frontier updates.Grove-specific migration notes:
@opentui-ui/dialogand@opentui-ui/toastboth ship/reactand/solidentry pointsuseKeyboard,useRenderer,useTerminalDimensionshave identical APIs in both reconcilersxtermterminal views need the Solid lifecycle equivalent (onMount/onCleanupvsuseEffect)@opentui/solidplugin slot system enables TUI: add plugin/extensibility surface for custom panels and actions #189 (extensibility)2. Worker thread isolation
Grove mixes TUI rendering with HTTP polling, contribution processing, and tmux/acpx management in one thread. Target: rendering in main thread, Grove server + agent coordination in worker.
Grove-specific RPC:
start(preset, goal)— launch sessionsubscribe()→ SSE stream of contributions, claims, agent eventssubmitWork(contribution)— agent publishes workclaim(taskId)— claim a taskshutdown()— cleanup agents + Nexus3. SSE event streaming (replaces polling)
Directly addresses #188. Grove server emits SSE for:
TUI consumes via 16ms batched event handler.
4. Shared component library
Grove independently built components that overlap with Koi and Nexus:
command-palette.tsx→ sharedCommandPalettestatus-bar.tsx→ sharedStatusBartable.tsx→ shared or native OpenTUItheme.ts→ sharedThemeProviderwith semantic tokensGrove adds domain-specific views on top: DAG, frontier, claims, agent terminals, artifact preview, etc.
5. OpenTUI version bump
Currently
^0.1.87— pin to0.1.96(match Koi). Gains: streaming markdown, improved diff rendering, plugin slot system, performance fixes.Existing Grove issues this extends
Acceptance criteria
@opentui/solid+solid-jsadded, React removed, all views converted0.1.96, SSE replaces polling (TUI: reduce polling feel with event-driven live updates across core surfaces #188)