TUI ↔ Web feature parity¶
Comparison of the Rust terminal client (clients/tui/) against the Quasar/Vue web app
(apps/web/), plus a prioritised roadmap to close the gaps. Snapshot: 2026-06-15.
Update 2026-06-15 (commit b1c1bc2): P1 partially shipped — TUI now has a security-mode picker (F7 /
/security) and the/main,/rename,/summarize,/proofreadcommands./editwas dropped (awkward in a TUI); the context/budget chip is deferred (needs model-context-window plumbing the TUI doesn't track yet).
Legend: ✅ present · ⚠️ partial · ❌ missing
Chat core¶
| Feature | Web | TUI |
|---|---|---|
| Send + streaming (text / thinking / tool calls / usage) | ✅ | ✅ |
| Load history, switch / create / rename chats | ✅ | ✅ |
| Pinned main chat (auto-open) | ✅ | ✅ (Ctrl+M / F6) |
| Mid-run follow-up queue | ✅ | ✅ |
| Cancel run | ✅ | ✅ (Ctrl+X) |
| Regenerate last turn | ✅ | ✅ (/retry) |
/btw side question (ephemeral) |
✅ | ✅ |
| Edit a user message | ✅ | ❌ |
| Rewind / fork (branch from a message) | ✅ | ❌ |
| Attachments (max 6) | ✅ | ✅ |
| Input history (↑/↓) | ⚠️ | ✅ |
Model & run controls¶
| Feature | Web | TUI |
|---|---|---|
| Model picker (grouped / searchable) | ✅ | ✅ (F2) |
| Reasoning effort (off/low/med/high) | ✅ | ✅ (/think) |
| Built-in tools on/off | ✅ | ✅ (Ctrl+T) |
| Security mode (autonomous/approve_each/judge) | ✅ | ✅ (F7 / /security) |
| Collaboration mode (plan/execute/pair) | ✅ | ❌ |
| Data classification (confidential) | ✅ | ❌ |
| Memory-access policy (scoped) | ✅ | ❌ |
| Per-run integrations / tool selection | ✅ | ❌ (built-ins only, global) |
Slash commands¶
- Web:
/new /rename /btw /goal /main /summarize /proofread+ coding (/terminal /review /explain /fix /tests /init) - TUI:
/new /btw /retry /model /think /tools /attach /agents /inbox /logout /help - Custom commands (from
GET /commands): ✅ both - Missing in TUI:
/goal, coding prompts (/main /rename /summarize /proofreadnow present)
Coding mode¶
| Feature | Web | TUI |
|---|---|---|
| Shell in workspace | ✅ (terminal panel) | ✅ (!cmd via PTY WS) |
| Monaco editor + file tree | ✅ | ❌ |
| Workspace snapshot / revert | ✅ | ❌ |
| Diff rendering for file tools | ✅ (cards) | ✅ (unified diff in stream) |
Agents & HITL¶
| Feature | Web | TUI |
|---|---|---|
| Sub-agent panel (live status / usage) | ✅ | ✅ (F5) |
| Sub-agent transcript | ✅ | ✅ |
| Tool approval (allow / remember / reject) | ✅ | ✅ |
ask_user / agent-question cards (multi, custom) |
✅ | ✅ |
| Background-resume auto-attach | ✅ | ✅ |
Inbox¶
| Feature | Web | TUI |
|---|---|---|
| List + detail + reply + suggest | ✅ | ✅ (F3) |
| Status filter, resolve / dismiss | ✅ | ✅ |
| Star / snooze / bulk / reply-all / forward | ✅ | ❌ |
| Live refresh | ✅ | ✅ |
Other pages (web) — all ❌ in TUI¶
Notes, Files, Knowledge/Entities, Contacts, Calendar, Agenda/Commitments, Logbook, Scenes, Skills, Tasks, Dashboards, Workflows. TUI surfaces only Chat + Sessions + Inbox + Agents.
Cross-cutting¶
| Feature | Web | TUI |
|---|---|---|
| Auth: Keycloak OIDC | ✅ (Auth-Code+PKCE) | ✅ (device grant) |
| Realtime: SSE stream + control WS | ✅ | ✅ |
Adopt accent colour (ui.accent) |
✅ (source) | ✅ (reads it) |
| Settings UI (profile/appearance/behavior/devices/MCP tokens/usage/budget) | ✅ | ❌ (CLI flags / config only) |
| Voice (STT / TTS) | ✅ | ❌ |
| Context / budget gauges | ✅ | ❌ |
| Org switching | ✅ | ❌ (decoded, not surfaced) |
Summary¶
The TUI has a solid chat foundation at genuine parity: streaming, model/reasoning,
follow-ups, /btw, sub-agents, HITL (approvals + question cards), inbox basics, coding
shell with diffs; shares auth/realtime/accent. The gaps are run-governance, voice, the coding
editor, message lifecycle (edit/rewind/fork), inbox extras, the standalone pages, /goal, and
a settings UI.
Roadmap (prioritised)¶
Ordered by value-to-effort for a terminal user. Each item notes the backend it already has (most are pure TUI work — the API exists).
P1 — cheap, high-impact (run controls + lifecycle)¶
Security mode picker— DONE (b1c1bc2): F7 //security, passed assecurity_mode, shown as a 🔒 composer chip.Edit a user message— DROPPED: awkward in a TUI (no in-place message editing UX);/retrycovers regeneration.Missing global slash commands— DONE (b1c1bc2):/main [msg],/rename <t>,/summarize,/proofread.- Context / budget chip — DEFERRED: needs the model context window + cumulative history
tokens, which the TUI doesn't track (the
chat_runWS frame carries no context tokens). Plumbcontext_tokens/threshold_tokensonto the run/WS event first, then add the chip.
P2 — moderate (governance + tools)¶
- Per-run integrations / tool selection — let the user toggle integrations/devices for a
run (
integration_entries/devicesin the run body). Needs a picker popup like the model one. - Memory-access + collaboration + classification pickers — same pattern as security mode; group them under one "run settings" popup to avoid F-key sprawl.
/goalautonomous-goal mode — start a goal loop in a session chat (chat.startGoalequivalent endpoint); render goal turns. Higher value for unattended terminal use.
P3 — larger surfaces¶
- Inbox extras — star/snooze/bulk/reply-all/forward (endpoints exist from the upstream inbox work). Incremental key bindings on the existing inbox view.
- Notes page — list/create/edit notes (
/notesAPI). Small, self-contained, useful in a terminal. - Settings view — at least appearance (accent/language) + MCP token mint, read/write via
/me/preferencesand/me/api-tokens.
P4 — heavy / maybe out of scope for a TUI¶
- Coding editor — a Monaco-equivalent in a terminal is a big lift;
!cmd+ diffs may be enough. Consider a read-only file viewer +$EDITORhandoff instead of a full editor. - Voice (STT/TTS) — needs audio capture/playback; low priority for a terminal client.
- Workspace snapshot/revert, Dashboards, Knowledge/Contacts/Calendar/Workflows — port only if a concrete terminal use-case emerges.
Suggested first slice: P1 (1–4) — small, all backend-ready, and they remove the most friction for a terminal-first user.