5.6 KiB
Conclusion: Telegram-like messaging layout for tai's chat scene
Metadata
| Field | Value |
|---|---|
| Institute | Molodetz Institute — Research & Retrieval Division |
| Subject | tui-framework-design |
| Document type | Conclusion |
| Tier | N/A |
| Date decided | 2026-10-11 |
| Decided by | retoor, advised by tai (agent, Muse Spark) |
| Status | Active |
| Confidence | Medium |
Question / problem statement
How should tai's Telegram-like chat scene (conversation sidebar, message transcript, input box, status line) be laid out, navigated, and rendered on top of the retained-DOM framework — which geometry, which keybindings, which scroll and send contracts — given that the working tree has no chat-transcript widget, no status-bar widget, no send-on-Enter mode, and no responsive breakpoints (established by the same-session internal inventory of tai.py)?
Conclusion
Build the chat scene as a left chat list at 30% width (min 24, max 36 columns) beside a right transcript plus input, with the input 3 rows collapsed growing to 5–8 rows with content and a 1-line status bar at the bottom carrying transient status plus per-focus hints on one side and connection/user/chat identity on the other. Ship a manual sidebar toggle first (F2/Ctrl+B or Tab cycle), adding automatic hide below 80 columns only as an enhancement. Navigate modally (Normal/Input) with Tab/Shift+Tab pane cycling, i/Enter/Esc, j/k plus arrows, g/G, PgUp/PgDn, / search, ? hints, q quit. Render left-aligned wrapped rows with sender grouping and per-message sending/failed state (never right-aligned bubbles); render markdown only for assistant content at viewport width minus frame minus gutter; stream by re-setting viewport content with pin-to-bottom only when already at the bottom; show tool calls as collapsible bordered block rows. Input is multiline with Enter to send, Shift+Enter (or Alt+Enter) for newline, per-chat draft retention, send history, and a ~2000-character cap with optimistic echo.
Supporting sources
../telecli-tui-chat-layout.md— base numbers: 30/70 split, 3-row input, 1-line status overlay, modal Normal/Input keys.../send-rs-tui-draw-main.md— confirms the 30/70 + 1-line-status skeleton; focused-pane accent border.../send-rs-tui-focus-state.md— explicit focus state with per-chat draft retention on focus moves.../send-rs-config-keymap.md— default keymap (Tab cycle,i/Enter/Esc, Shift+Enter newline) and 5-line input cap.../send-rs-tui-status-bar.md— status content policy: per-focus hints with transient-override messages.../send-rs-chat-widget.md— pre-wrapped rows plus scrollbar, dynamic input height, and the decisive bubble rejection.../za-tui-app-styles.md— cross-framework corroboration of 30/70 + 3–8-row input + 1-row status.../za-tui-main-screen.md— manual sidebar toggle (F2/Ctrl+B) with auto-hide deliberately omitted; F6 focus cycle.../za-tui-status-bar.md— identity half of status content: connection dot + user + active conversation.../za-tui-input-bar.md— input contract: Enter send, Shift+Enter newline, 2000-char cap, 100-entry history.../za-tui-chat-view.md— transcript contract: sender grouping, per-message status, conditional pin-to-bottom, scroll-top history load.../bubbletea-chat-example.md— viewport height math (window minus input) and send-then-bottom behavior.../bubbletea-glamour-example.md— markdown width-minus-chrome rule (viewport minus frame minus 3-column gutter).../ai-nexus-ratatui-best-practices.md— provisional sub-80-column breakpoint number (guidance-doc sourced, flagged as such).
Alternatives considered and rejected
- Right-aligned outgoing bubbles: rejected — send-rs implemented them and reverted them as ugly; all shipped clients use left-aligned rows.
- Automatic sidebar auto-hide from day one: rejected as v1 — za-tui deliberately omitted it (breaks tests) and ships manual toggle; auto-hide below 80 columns follows as an enhancement.
- Sidebar-free full-width layout (bubbletea chat example): rejected — tai needs a conversation/agent list beside the transcript.
- Fixed-cell sidebar width (
Length(30)): rejected — appears only in the guidance doc while every inspected client usesPercentage(30); percentage with min/max clamps wins. - Always-stacked layout: rejected — all three messaging clients ship side-by-side as the default, stacking only as the narrow fallback.
Risks / open questions
- The 80-column breakpoint comes from a guidance doc, not a shipped client — no inspected real client implements automatic narrow-terminal breakpoints. Validate the number against real terminals before treating it as settled.
- No streaming/token rendering or tool-call blocks were observed in any messaging client; the re-set-plus-pin-to-bottom carrier and collapsible-block rows are inferred patterns, with Glamour covering static markdown only.
- tai still needs a markdown-to-styled-run renderer (the REPL's
render_markdownemits ANSI strings unusable by the compositor), a send-on-Enter input mode, and a wide-character width table — all established gaps from the same-session inventory. - Agent turns are blocking and must run in threads posting back via timers; the streaming contract assumes that bridge works.
Action taken
Nothing built yet: the chat scene is specified by this conclusion and its sources, but no chat-transcript widget, status-bar widget, or scene builder exists in the working tree. This conclusion records what to build, not what shipped.
Changelog
| Date | Change |
|---|---|
| 2026-10-11 | Initial conclusion recorded. |