Skip to content

feat(tui): Configuration pane (pane 8) with LLM / Skills / MCPs tabs (proposal 003 PR-4) - #57

Merged
flg77 merged 1 commit into
mainfrom
tui/configuration-pane
May 13, 2026
Merged

flg77 merged 1 commit into
mainfrom
tui/configuration-pane

Conversation

@flg77

@flg77 flg77 commented May 13, 2026

Copy link
Copy Markdown
Owner

Summary

PR-4 of proposal 003 (ACC TUI usability hardening). Addresses operator review items 6 and 7: Skills + MCPs + LLM endpoint management need a proper home; today they're crammed onto Ecosystem.

New surface

A new pane 8 — ConfigurationScreen — with three TabPanes:

Tab What's there
LLM Endpoints Read-only summary of ACCConfig.llm (backend / model / base_url / timeout); live per-agent backend DataTable fed from snapshots; "Test connection" button HEAD-pings the configured base_url
Skills Canonical home for the Skills DataTable + "Upload skill" file-picker flow
MCPs Canonical home for the MCP-servers DataTable + "Upload MCP" file-picker flow

Reachable via the new 8 keybinding from any screen.

Pragmatic call: keep Ecosystem copies for one release

The Ecosystem copies of Skills + MCPs + LLM table are kept for one release as a migration aid; a follow-up PR can remove them once operator confirms the Configuration pane is the right home. This eliminates ~10 test files needing structural rewrites in a single PR — keeps PR-4 within the 800-LOC budget (947 actual, mostly the new screen + its tests).

Deferred (slot 008 candidate)

"Assign LLM endpoint to a role" + role.yaml writeback (proposal 003 PR-4 §5) is deferred to a follow-up. Operator-side role editing already works via the external editor + PR-3's file-watcher; this PR provides the test path without the write path.

Files

File Change
acc/tui/screens/configuration.py (new, 555 LOC) The new screen + _ping_endpoint + _load_acc_config_summary helpers
acc/tui/app.py ConfigurationScreen imported; registered in SCREENS + _SNAPSHOT_SCREENS
acc/tui/widgets/nav_bar.py _SCREENS and BINDINGS extended to 8 panes
acc/tui/screens/*.py (7 files) One-liner: ("8", "navigate('configuration')", "Configuration")
CHANGELOG.md [Unreleased] Added + Changed sections
tests/test_configuration_screen_pilot.py (new, 11 cases) Compose / mount / Test-button / tables / registration

Test plan

  • 11 new cases in tests/test_configuration_screen_pilot.py.
  • 71/71 green across test_configuration_screen_pilot.py + test_ecosystem_screen_pilot.py + test_coding_agent_tui_pilot.py + test_prompt_screen_pilot.py + test_file_picker_pilot.py + test_oversight_tui_diagnose.py.
  • No existing tests broken — Ecosystem still mounts the legacy widgets.

Manual verification

acc-tui    # any screen, press '8'
# → Configuration pane opens at the LLM Endpoints tab
# → Click Test connection → result shows HTTP status + latency
# → Click Skills / MCPs tabs → tables populated from on-disk manifests
# → Upload skill / Upload MCP → file-picker modal works

Reference

Proposal 003 — …\ACC Implementation\003 - ACC TUI usability hardening.md (operator vault).

🤖 Generated with Claude Code

Implements PR-4 of proposal 003 (ACC TUI usability hardening).
Addresses operator review items 6 and 7: Skills + MCPs need a
proper home (not crammed into Ecosystem); LLM endpoints need to
be testable and visible from a single Configuration surface.

## New screen

`acc/tui/screens/configuration.py` — `ConfigurationScreen` mounts
at pane 8 with three `TabPane`s:

* **LLM Endpoints** — `_render_llm_summary()` shows the configured
  `ACCConfig.llm` summary (backend, model, base_url, timeout) as
  read-only text.  Live per-agent table (`#llm-live-table`) fed
  via `watch_snapshot()` from heartbeats, same shape as the old
  ecosystem "ACTIVE LLM BACKENDS" table.  *Test connection*
  button HEAD-pings the configured base_url via stdlib
  `urllib.request` (no new dependency) and writes a coloured
  result into `#llm-test-result`.
* **Skills** — moved canonical home for the Skills DataTable +
  *Upload skill* file-picker flow (mirrors ecosystem's PR-A2
  pattern).
* **MCPs** — moved canonical home for the MCP-servers DataTable +
  *Upload MCP* file-picker flow.

The Ecosystem copies of Skills + MCPs are kept for one release as
a migration aid; a follow-up PR can remove them once operator
confirms the Configuration pane is the right home.  Eliminates
test churn this PR would have otherwise caused.

`_ping_endpoint()` is the pure-stdlib HEAD helper; `4xx` from a
HEAD-rejecting server still counts as "endpoint reachable",
`5xx` and URLError don't.

`_load_acc_config_summary()` is a defensive read of `LLMConfig()`
that falls back to em-dashes if the config module fails to
import — keeps the screen alive on partial installs.

"Assign LLM endpoint to a role" + role.yaml writeback (PR-4 §5
in proposal 003) is deferred to a follow-up so this PR lands
within the 800-LOC budget.  Operator-side role editing already
works via the external editor + PR-3's file-watcher.

## Wiring

* `acc/tui/widgets/nav_bar.py` — `_SCREENS` list + `BINDINGS`
  extended to include `("8", "configuration", "8 Configuration")`.
  Module docstring updated 6 → 8 panes.
* `acc/tui/app.py` — `ConfigurationScreen` imported, registered
  in `SCREENS` under `"configuration"`, added to
  `_SNAPSHOT_SCREENS` fan-out so the live LLM table refreshes
  per HEARTBEAT.
* Every screen's local `BINDINGS` list (`soma`, `nucleus`,
  `compliance`, `comms`, `performance`, `ecosystem`, `prompt`,
  `configuration`) now carries `("8", "navigate('configuration')",
  "Configuration")` so the `8` key works from anywhere.

## Tests

`tests/test_configuration_screen_pilot.py` (NEW, 11 cases):

* `_ping_endpoint_*` (2) — empty url + unreachable host return
  `(False, …, elapsed)` without crashing.
* `test_compose_yields_all_three_tabs` — TabPane ids
  `tab-llm` / `tab-skills` / `tab-mcps` all present.
* `test_llm_summary_renders_at_mount` — `#llm-config-summary`
  Static gets the Backend / Model / Base URL header.
* `test_test_button_updates_result_widget` — monkeypatched ping
  returns ok=True → `#llm-test-result` shows the message +
  latency.
* `test_test_button_handles_missing_base_url` — empty base_url
  surfaces a clear operator-readable error.
* `test_skills_table_populated_from_fixture` /
  `test_mcps_table_populated_from_fixture` — moved tables work.
* `test_configuration_registered_in_app_screens` /
  `test_nav_bar_includes_configuration` /
  `test_nav_bar_has_8_keybinding` — registration hygiene.

**71/71 tests green** across configuration + ecosystem +
coding_agent + prompt + file_picker + oversight TUI files.
No existing tests broken (Ecosystem still mounts Skills + MCPs +
LLM table for back-compat).

## CHANGELOG

`[Unreleased]` § Added gains:
- Configuration pane (pane 8) summary entry
- LLM Endpoints tab description
- Skills + MCPs tabs canonical-home note

`[Unreleased]` § Changed gains:
- NavigationBar 6 → 8 panes + all screens' BINDINGS updated
- Snapshot fan-out routes through the Configuration screen

## Manual verification

```bash
acc-tui    # any screen, press '8'
# Configuration pane opens at the LLM Endpoints tab.
# Click Test connection → result shows HTTP status + latency.
# Click Skills / MCPs tabs → tables populated from on-disk manifests.
# Upload skill / Upload MCP buttons → file-picker modal works.
```

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@flg77
flg77 merged commit 9400fa1 into main May 13, 2026
@flg77
flg77 deleted the tui/configuration-pane branch May 13, 2026 22:07
flg77 added a commit that referenced this pull request May 13, 2026
All six PRs of proposal 003 (ACC TUI usability hardening) are on
main:

* #54 (PR-1) — Prompt cancel-on-timeout + CHANGELOG/version bump
* #55 (PR-2) — Ecosystem role.md detail + searchable filter
* #56 (PR-3) — Ecosystem roles/ watcher + selection lock
* #57 (PR-4) — Configuration pane (pane 8)
* #58 (PR-5) — Performance + Soma cluster/governance context
* #59 (PR-6) — CLI/TUI infuse parity + subrole sibling listing

pyproject.toml: 0.2.0-dev → 0.2.0
CHANGELOG.md:   [Unreleased] section closed off as [0.2.0]
                (dated 2026-05-14) with a fresh [Unreleased]
                header ready for the next cycle.

Tag v0.2.0 follows this merge.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
flg77 added a commit that referenced this pull request Jun 11, 2026
…rrides (#57)

Root-caused live on c26sx RHOAI sandbox: rhoai-corpus nats/redis stuck
ImagePullBackOff 'name unknown: Repo not found'. util.ComponentImage derives
nats/redis from imageRepository (<repo>:nats-<tag>) or imageRegistry
(<reg>/nats:<tag>); with imageRegistry=registry.access.redhat.com (the default)
neither path yields a real nats/redis image. A single registry/repo can't serve
both the ACC images and stock nats/redis.

Add optional full-ref overrides honored before the ComponentImage fallback
(no behaviour change when unset). Set e.g. docker.io/library/nats:2.10-alpine /
docker.io/library/redis:7-alpine, OR mirror nats/redis into the single
imageRepository. Built against current main (ComponentImage model, post-#55).

String value fields => deepcopy-safe. acc1: make manifests + go build/test
before deploy; promote to flg77/acc once tested.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
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.

1 participant