feat(dashboard): render active agents pane below proposals #39

Merged
didericis merged 1 commits from chunk-2-render-agents-pane into main 2026-05-26 01:34:29 -04:00
Owner

Summary

PRD 0019 chunk 2. The TUI's main render now draws two panes — proposals on top (existing), active agents on the bottom (new). Header counts both totals. The agents pane refreshes on the same 1s tick so agents starting / stopping reflect without operator action.

Each agent row shows:

  • slug
  • agent name (from metadata.json; ? when missing)
  • started-time as HH:MM:SS of the metadata.json timestamp
  • bracketed list of sidecars currently up

The agent service is filtered out of the displayed list — it's always present for an active bottle, so it'd be noise; the sidecars are the differentiator. A bottle whose only running service is agent (sidecars still warming up) renders as (starting).

Selection model

Deferred to chunk 3. The cursor stays in the proposals pane; j/k/arrow nav and the proposal action keys (a/m/r/Enter) are unchanged.

Status

  • 442 unit tests pass (6 new for _format_agent_row covering filter + truncation + missing-metadata fallbacks)
  • Manual probe with a fake compose project confirms the row renders end-to-end
## Summary PRD 0019 chunk 2. The TUI's main render now draws two panes — proposals on top (existing), active agents on the bottom (new). Header counts both totals. The agents pane refreshes on the same 1s tick so agents starting / stopping reflect without operator action. Each agent row shows: - slug - agent name (from metadata.json; `?` when missing) - started-time as HH:MM:SS of the metadata.json timestamp - bracketed list of sidecars currently up The `agent` service is filtered out of the displayed list — it's always present for an active bottle, so it'd be noise; the sidecars are the differentiator. A bottle whose only running service is `agent` (sidecars still warming up) renders as `(starting)`. ## Selection model Deferred to chunk 3. The cursor stays in the proposals pane; `j/k`/arrow nav and the proposal action keys (`a`/`m`/`r`/`Enter`) are unchanged. ## Status - 442 unit tests pass (6 new for `_format_agent_row` covering filter + truncation + missing-metadata fallbacks) - Manual probe with a fake compose project confirms the row renders end-to-end
didericis added 1 commit 2026-05-26 01:24:13 -04:00
feat(dashboard): render active agents pane below proposals
test / unit (pull_request) Successful in 17s
test / integration (pull_request) Successful in 1m4s
cfd8f269ba
PRD 0019 chunk 2. The TUI's main render now draws two panes:
proposals on top (existing), active agents on the bottom (new).
Header counts both totals. The agents pane refreshes on the
same 1s tick — agents starting/stopping reflect without
operator action.

Each agent row shows slug, agent name, started-time (HH:MM:SS
of the metadata.json timestamp), and the bracketed list of
sidecars currently up. The `agent` service is filtered out of
the displayed list — it's always present so it'd be noise; the
sidecars are the differentiator. A bottle whose only running
service is `agent` (sidecars still warming up) renders as
`(starting)`.

No selection model yet — that's chunk 3. The cursor stays in
the proposals pane; `j/k`/arrow nav and the proposal action
keys are unchanged.
didericis merged commit 897172fcc2 into main 2026-05-26 01:34:29 -04:00
didericis deleted branch chunk-2-render-agents-pane 2026-05-26 01:34:47 -04:00
Sign in to join this conversation.