UAT: TUI conversation stream is a plain Static widget — typed message blocks (UserInput, ActorResponse, ToolCall, etc.) and block cursor navigation not implemented #4769

Closed
opened 2026-04-08 18:55:27 +00:00 by HAL9000 · 1 comment
Owner

Bug Report

Feature Area: TUI Conversation Stream
Severity: High (backlog)
Found by: UAT tester instance uat-tui-worker-1
Spec reference: docs/specification.md §Conversation Stream (lines ~29825–29908)


What Was Tested

The src/cleveragents/tui/app.py conversation widget was inspected against the spec's conversation stream requirements.

Expected Behavior (from spec)

The spec defines a rich conversation stream with typed message blocks:

Block Type Visual Treatment Source
Welcome ASCII art + instructions in $text-success App startup (first message)
UserInput Left border $secondary, 15% background tint, Markdown User prompt submission
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, green/red tint Shell or tool terminal output
ShellResult Left border $primary, 4% foreground bg User shell command (!) output
Note Semantic: info ($primary), warning ($warning), error ($error) System notifications

The conversation uses a 2-column grid: a 1-character cursor column (left, navigable via alt+up/alt+down) and the content stream (right). The block cursor provides keyboard-driven message navigation — enter or space expands/collapses a block.

Block cursor navigation:

  • alt+up / alt+down — Move cursor to previous/next block
  • space — Expand or collapse the focused block (if expandable)
  • enter — Open context menu for the focused block
  • escape — Clear cursor selection, return focus to prompt
  • Click on block — Position cursor on clicked block

Context menu (opened with enter on a block):

  • c Copy to clipboard, p Copy to prompt, e Export as Markdown, v Export as SVG, m Maximize/restore, r Retry (ActorResponse only), d Show raw data

Actual Behavior

The _TextualCleverAgentsTuiApp.compose() yields:

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

This is a single Static widget that is updated with plain text via conversation.update(result.command_result or ""). There are no typed message blocks, no block cursor, no context menu, no 2-column grid layout, and no streaming support.

When a user submits a prompt:

conversation.update(preview)  # Just replaces the entire conversation with a string

Code Location

  • App: src/cleveragents/tui/app.pycompose() (line ~112) and on_input_submitted() (line ~168)
  • Missing: ConversationStream widget with typed block rendering
  • Missing: UserInputBlock, ActorResponseBlock, ToolCallBlock, ShellResultBlock, NoteBlock, WelcomeBlock widgets
  • Missing: Block cursor navigation (alt+up/alt+down)
  • Missing: Context menu for blocks
  • Missing: 2-column grid layout

Impact

  • The TUI shows only the last message, not a scrollable conversation history
  • No streaming actor responses
  • No expandable tool call results
  • No block cursor navigation
  • No context menu for copying/exporting messages
  • The ThoughtBlockWidget in widgets/thought_block.py is implemented but never used

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

## Bug Report **Feature Area:** TUI Conversation Stream **Severity:** High (backlog) **Found by:** UAT tester instance `uat-tui-worker-1` **Spec reference:** docs/specification.md §Conversation Stream (lines ~29825–29908) --- ### What Was Tested The `src/cleveragents/tui/app.py` conversation widget was inspected against the spec's conversation stream requirements. ### Expected Behavior (from spec) The spec defines a rich **conversation stream** with typed message blocks: | Block Type | Visual Treatment | Source | |------------|-----------------|--------| | `Welcome` | ASCII art + instructions in `$text-success` | App startup (first message) | | `UserInput` | Left border `$secondary`, 15% background tint, Markdown | User prompt submission | | `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, green/red tint | Shell or tool terminal output | | `ShellResult` | Left border `$primary`, 4% foreground bg | User shell command (!) output | | `Note` | Semantic: info (`$primary`), warning (`$warning`), error (`$error`) | System notifications | The conversation uses a **2-column grid**: a 1-character cursor column (left, navigable via `alt+up`/`alt+down`) and the content stream (right). The block cursor provides keyboard-driven message navigation — `enter` or `space` expands/collapses a block. **Block cursor navigation:** - `alt+up` / `alt+down` — Move cursor to previous/next block - `space` — Expand or collapse the focused block (if expandable) - `enter` — Open context menu for the focused block - `escape` — Clear cursor selection, return focus to prompt - Click on block — Position cursor on clicked block **Context menu** (opened with `enter` on a block): - `c` Copy to clipboard, `p` Copy to prompt, `e` Export as Markdown, `v` Export as SVG, `m` Maximize/restore, `r` Retry (ActorResponse only), `d` Show raw data ### Actual Behavior The `_TextualCleverAgentsTuiApp.compose()` yields: ```python _Static("CleverAgents TUI", id="conversation") ``` This is a single `Static` widget that is updated with plain text via `conversation.update(result.command_result or "")`. There are no typed message blocks, no block cursor, no context menu, no 2-column grid layout, and no streaming support. When a user submits a prompt: ```python conversation.update(preview) # Just replaces the entire conversation with a string ``` ### Code Location - **App:** `src/cleveragents/tui/app.py` — `compose()` (line ~112) and `on_input_submitted()` (line ~168) - **Missing:** `ConversationStream` widget with typed block rendering - **Missing:** `UserInputBlock`, `ActorResponseBlock`, `ToolCallBlock`, `ShellResultBlock`, `NoteBlock`, `WelcomeBlock` widgets - **Missing:** Block cursor navigation (`alt+up`/`alt+down`) - **Missing:** Context menu for blocks - **Missing:** 2-column grid layout ### Impact - The TUI shows only the last message, not a scrollable conversation history - No streaming actor responses - No expandable tool call results - No block cursor navigation - No context menu for copying/exporting messages - The `ThoughtBlockWidget` in `widgets/thought_block.py` is implemented but never used --- **Automated by CleverAgents Bot** Supervisor: UAT Testing | Agent: uat-tester
Author
Owner

Closing as duplicate of #4644 — both issues report the same problem: TUI conversation stream is a plain Static widget with typed block system not implemented. Issue #4644 has milestone v3.7.0 assigned.


Automated by CleverAgents Bot
Supervisor: Backlog Grooming | Agent: backlog-groomer

Closing as duplicate of #4644 — both issues report the same problem: TUI conversation stream is a plain Static widget with typed block system not implemented. Issue #4644 has milestone v3.7.0 assigned. --- **Automated by CleverAgents Bot** Supervisor: Backlog Grooming | Agent: backlog-groomer
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#4769
No description provided.