Skip to content

TUI Control Room (Layer 2) — filter, live feed, 3-panel layout#10

Merged
lewisnsmith merged 6 commits intomainfrom
claude/tui-control-room-dispatch-drd8c
Apr 20, 2026
Merged

TUI Control Room (Layer 2) — filter, live feed, 3-panel layout#10
lewisnsmith merged 6 commits intomainfrom
claude/tui-control-room-dispatch-drd8c

Conversation

@lewisnsmith
Copy link
Copy Markdown
Owner

Summary

Dispatching the TUI Control Room work (Layer 2) across sonnet-4.6 subagents.

This PR will accumulate three logical commits as the agents return:

  • PR 1 — Filter & navigation (/ filter bar, AND-semantics across tool_name/agent_id/execution_outcome, tree drill-in/escape, empty-result placeholder) — in flight, parallel worktree
  • PR 2 — Annotations + live feed (g/b/n keybinds, 1s poll loop, tail pane, pause/resume around modals) — in flight, parallel worktree
  • PR 3 — 3-panel layout (extract src/tui/layout.ts, persistent Tree/Detail/Tail, overlay modals, Tab focus cycling) — pending sequential dispatch after PR1+PR2 merge

Already landed on this branch:

  • chore: drop unused tui exports before control-room refactor — de-exports 4 TUI symbols per repo cleanup-first rule.
  • docs: add tui control room spec (2026-04-16) — formalizes the Layer 2 spec, per-PR acceptance criteria, and [P2]/[S2] resolutions.
  • chore: ignore .claude/worktrees runtime directory — keeps parallel-agent worktrees out of commits.

Dispatch shape

  • Phase A (done, parallel): cleanup + spec authoring + independent dependency audit.
  • Phase B (in flight): PR1 and PR2 in parallel worktrees, then manual additive reconciliation (keybindings block + state var declarations), then PR3 sequentially.

Each subagent is gated on npm run check green before returning.

Test plan

  • PR1 tests (filter by tool_name, agent_id, execution_outcome, combined AND, empty-result, Esc clears)
  • PR2 tests (g/b verdict + badge, n modal, poll-tick append, poll paused during modal regression, annotation-failure non-fatal)
  • PR2 CEO [S2] verification — flight log export <session> | grep verdict surfaces the new row
  • PR3 tests (layout snapshot, overlay focus restore, Tab cycling); resize tested manually
  • npm run check green on final commit
  • Manual end-to-end smoke (3-panel view, filter, verdict, overlay modal, resize)

https://claude.ai/code/session_01EXcoDfR7Hvoobx8aNBdE67

@lewisnsmith
Copy link
Copy Markdown
Owner Author

@copilot resolve the merge conflicts in this pull request

claude added 5 commits April 19, 2026 23:12
De-export sessionNodeKey, turnNodeKey, resolveSessionIdForItem, and
loadSessionEntries. All four are only used inside their own files;
exporting them misleads readers about the module's public surface.
Lands ahead of the control-room refactor per repo cleanup-first rule.

https://claude.ai/code/session_01EXcoDfR7Hvoobx8aNBdE67
Formalizes Layer 2 of the TUI roadmap: filter bar, live-feed
annotations, and the 3-panel layout. Documents the sequential
PR constraint, per-PR acceptance criteria and test matrix, and
resolutions to the [P2] tail-scope and [S2] export-flow questions.

https://claude.ai/code/session_01EXcoDfR7Hvoobx8aNBdE67
Parallel subagents create transient git worktrees under
.claude/worktrees/ that should never land in a commit.

https://claude.ai/code/session_01EXcoDfR7Hvoobx8aNBdE67
Filter bar (PR1):
- `/` opens inline filter bar at bottom of tree pane
- AND-filter semantics across tool_name, agent_id, execution_outcome
- Filter state held on TuiApp; refresh() re-applies on each tick
- Empty-result placeholder when filter produces zero rows
- `setActiveFilter()` on TuiApp for programmatic filter (tests)
- `parseFilterInput()` exported for direct unit testing

Annotation keybinds + live feed (PR2):
- `g`/`b` write verdict:good/verdict:bad via runAnnotate; badge on refresh
- `a` key still opens full annotation modal (unchanged)
- 1s setInterval poll in createTuiApp starts after initial load
- pausePolling()/resumePolling() bracket all modal operations (regression-safe)
- clearInterval in destroy() prevents leaked timers on exit
- Annotation write failure is non-fatal: surfaces as status line

Also: exclude .claude/worktrees/** from vitest to prevent stale test files
from worktree experiments from polluting the test suite.

https://claude.ai/code/session_01EXcoDfR7Hvoobx8aNBdE67
Introduces src/tui/layout.ts with a persistent Tree (30%) | Detail (45%)
| Tail (25%) layout. The tail pane is always visible. Summary, view, and
query are now modal overlays (s/v/Q) dismissed with Esc rather than mode
switches. Tab cycles focus tree→detail→tail→tree. Removes the 2-pane
layout and the t-toggle; adds test/tui-layout.test.ts covering layout
snapshot, Tab cycling, and overlay open/close.

https://claude.ai/code/session_01EXcoDfR7Hvoobx8aNBdE67
Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 19, 2026

@copilot resolve the merge conflicts in this pull request

Resolved and pushed in commit 2da4ebb.

I merged origin/main into this branch, resolved the directory-rename conflicts by keeping the TUI control-room files in packages/flight-proxy/*, and verified with:

  • targeted TUI tests (27/27 passing)
  • npm run check --workspace flight-proxy (279/279 passing)

No new UI behavior changed in this merge-conflict-only commit, so there is no additional UI screenshot beyond the existing PR UI changes.

@lewisnsmith lewisnsmith force-pushed the claude/tui-control-room-dispatch-drd8c branch from 2da4ebb to 3870c3c Compare April 20, 2026 03:51
import.meta.dirname was added in Node 21.2.0 and is not available on
Node 20.x. Replace with the standard dirname(fileURLToPath(import.meta.url))
pattern so CI passes on both 20.x and 22.x matrix entries.

https://claude.ai/code/session_01EXcoDfR7Hvoobx8aNBdE67
@lewisnsmith lewisnsmith merged commit 33bb62b into main Apr 20, 2026
2 checks 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.

3 participants