UAT: TUI conversation stream is a plain Static widget — typed block system not implemented #4644

Open
opened 2026-04-08 17:41:23 +00:00 by HAL9000 · 0 comments
Owner

Bug Report

Feature Area: TUI plan monitoring and live updates (v3.7.0 TUI)
Severity: Medium — conversation stream lacks all spec-required block types
Found by: UAT tester instance uat-tester-worker-tui-plan-monitoring


What Was Tested

Code-level analysis of src/cleveragents/tui/app.py and src/cleveragents/tui/widgets/ against the specification section "Conversation Stream" (spec lines 29825–29842) and "Conversation Block Details" (spec lines 29910–29925).


Expected Behavior (from spec)

The spec (lines 29825–29842) defines a typed conversation stream with the following block types:

Block Type Visual Treatment Source
Welcome ASCII art + instructions in $text-success App startup
UserInput Left border $secondary, 15% background tint, Markdown User prompt
ActorResponse Streaming Markdown with syntax-highlighted code fences session.message events
ActorThought $primary-muted 20% bg, max 10 lines (expandable), italic Actor reasoning
ToolCall Expandable: icon + status pill header, collapsible content tool.invoked / tool.completed
PlanProgress Grid layout with status icons per step Plan phase changes
DiffView Unified or side-by-side diff, syntax highlighting Tool results with diffs
TerminalEmbed Bordered terminal, $primary 50% border Shell or tool terminal output
ShellResult Left border $primary, 4% foreground bg User shell command (!) output
Note Semantic: info/warning/error System notifications

The conversation uses a 2-column grid: cursor column (left) + content stream (right). Block cursor navigation via alt+up/alt+down. enter opens context menu. space expands/collapses blocks.


Actual Behavior (from code analysis)

src/cleveragents/tui/app.py line 112:

yield _Static("CleverAgents TUI", id="conversation")

And in on_input_submitted() (lines 186–209):

conversation = self.query_one("#conversation", _Static)
# ...
conversation.update(result.command_result or "")
# or
conversation.update(f"$ {shell.command}\n{output}")
# or
conversation.update(preview)
  • Single _Static widget replaces the entire conversation on each input — no block history
  • No block types — no UserInput, ActorResponse, ToolCall, PlanProgress, etc.
  • No 2-column grid layout
  • No block cursor navigation (alt+up/alt+down not bound)
  • No context menu (enter on blocks)
  • No streaming — conversation updates synchronously, not via streaming events
  • No PlanProgress blocks — plan phase changes are never shown
  • No TerminalEmbed — shell output is shown as plain text in the static widget
  • The ThoughtBlockWidget exists in widgets/thought_block.py but is never used in app.py

Code Locations

  • src/cleveragents/tui/app.py lines 112, 186–209
  • src/cleveragents/tui/widgets/thought_block.py — exists but unused
  • src/cleveragents/tui/widgets/ — no UserInputBlock, ActorResponseBlock, ToolCallBlock, PlanProgressBlock, DiffViewBlock, TerminalEmbedBlock, ShellResultBlock, NoteBlock

Impact

The conversation stream cannot:

  • Show plan progress updates inline
  • Stream actor responses in real time
  • Display tool call status (pending/completed/failed)
  • Show expandable thought blocks
  • Maintain conversation history (each input replaces the previous content)
  • Provide block cursor navigation

Automated by CleverAgents Bot
Supervisor: UAT Testing | Agent: uat-tester

## Bug Report **Feature Area:** TUI plan monitoring and live updates (v3.7.0 TUI) **Severity:** Medium — conversation stream lacks all spec-required block types **Found by:** UAT tester instance `uat-tester-worker-tui-plan-monitoring` --- ### What Was Tested Code-level analysis of `src/cleveragents/tui/app.py` and `src/cleveragents/tui/widgets/` against the specification section **"Conversation Stream"** (spec lines 29825–29842) and **"Conversation Block Details"** (spec lines 29910–29925). --- ### Expected Behavior (from spec) The spec (lines 29825–29842) defines a typed conversation stream with the following block types: | Block Type | Visual Treatment | Source | |------------|-----------------|--------| | `Welcome` | ASCII art + instructions in `$text-success` | App startup | | `UserInput` | Left border `$secondary`, 15% background tint, Markdown | User prompt | | `ActorResponse` | Streaming Markdown with syntax-highlighted code fences | `session.message` events | | `ActorThought` | `$primary-muted` 20% bg, max 10 lines (expandable), italic | Actor reasoning | | `ToolCall` | Expandable: icon + status pill header, collapsible content | `tool.invoked` / `tool.completed` | | `PlanProgress` | Grid layout with status icons per step | Plan phase changes | | `DiffView` | Unified or side-by-side diff, syntax highlighting | Tool results with diffs | | `TerminalEmbed` | Bordered terminal, `$primary 50%` border | Shell or tool terminal output | | `ShellResult` | Left border `$primary`, 4% foreground bg | User shell command (!) output | | `Note` | Semantic: info/warning/error | System notifications | The conversation uses a 2-column grid: cursor column (left) + content stream (right). Block cursor navigation via `alt+up`/`alt+down`. `enter` opens context menu. `space` expands/collapses blocks. --- ### Actual Behavior (from code analysis) `src/cleveragents/tui/app.py` line 112: ```python yield _Static("CleverAgents TUI", id="conversation") ``` And in `on_input_submitted()` (lines 186–209): ```python conversation = self.query_one("#conversation", _Static) # ... conversation.update(result.command_result or "") # or conversation.update(f"$ {shell.command}\n{output}") # or conversation.update(preview) ``` - **Single `_Static` widget** replaces the entire conversation on each input — no block history - **No block types** — no `UserInput`, `ActorResponse`, `ToolCall`, `PlanProgress`, etc. - **No 2-column grid** layout - **No block cursor** navigation (`alt+up`/`alt+down` not bound) - **No context menu** (`enter` on blocks) - **No streaming** — conversation updates synchronously, not via streaming events - **No `PlanProgress` blocks** — plan phase changes are never shown - **No `TerminalEmbed`** — shell output is shown as plain text in the static widget - The `ThoughtBlockWidget` exists in `widgets/thought_block.py` but is **never used** in `app.py` --- ### Code Locations - `src/cleveragents/tui/app.py` lines 112, 186–209 - `src/cleveragents/tui/widgets/thought_block.py` — exists but unused - `src/cleveragents/tui/widgets/` — no `UserInputBlock`, `ActorResponseBlock`, `ToolCallBlock`, `PlanProgressBlock`, `DiffViewBlock`, `TerminalEmbedBlock`, `ShellResultBlock`, `NoteBlock` --- ### Impact The conversation stream cannot: - Show plan progress updates inline - Stream actor responses in real time - Display tool call status (pending/completed/failed) - Show expandable thought blocks - Maintain conversation history (each input replaces the previous content) - Provide block cursor navigation --- **Automated by CleverAgents Bot** Supervisor: UAT Testing | Agent: uat-tester
HAL9000 added this to the v3.7.0 milestone 2026-04-08 17:53:57 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
cleveragents/cleveragents-core#4644
No description provided.