Skip to content

[Feature Request] Add verbose/compact mode toggle (Ctrl+O) to reduce tool output noise #2767

@chiga0

Description

@chiga0

What would you like to be added?

Proposed Solution

Add a compact/verbose mode with a Ctrl+O keyboard shortcut to toggle between the two modes:

Compact Mode (default)

  • Tool names and status indicators remain visible (✓ Success, ✗ Error, ⟳ Executing)
  • Tool result output is hidden
  • Thinking-chain content (gemini_thought / gemini_thought_content) is hidden
  • Final assistant responses are always shown
  • Footer shows no indicator (clean state)

Verbose Mode

  • Everything shown as today: full tool output, thinking chains, diffs, agent traces
  • Footer shows a verbose label as a visual indicator that the mode is active

Behavior Details

Behavior Description
Toggle key Ctrl+O
Default state Compact (noise-reduced)
Persistence Setting saved to ~/.qwen/settings.json as ui.verboseMode
Retroactive switch History re-renders immediately on toggle (via refreshStatic)
Mid-stream toggle Viewport freezes at current state to prevent jitter; auto-unfreezes when stream ends
Settings key ui.verboseMode: boolean (default: false)

Motivation

  • Reduces cognitive load: Users can focus on the assistant's answer rather than intermediate tool chatter
  • Consistent with industry standard: Claude Code already offers this pattern; users switching between tools expect parity
  • Power users get the best of both: Verbose mode is one keypress away when debugging or auditing tool behavior
  • No data loss: Toggling only affects rendering — all data is preserved in the underlying history

Expected UX

[Compact mode — default]
✓ ReadFile src/main.ts
✓ SearchFiles "TODO"
✓ WriteFile src/fix.ts

Here's what I did: I found and fixed the bug in ...

[After Ctrl+O — verbose mode]
✓ ReadFile src/main.ts
  export function main() {
    // ... full file content visible ...
  }
✓ SearchFiles "TODO"
  src/main.ts:42: // TODO: fix this
✓ WriteFile src/fix.ts
  + const fixed = ...

Here's what I did: I found and fixed the bug in ...

Footer indicator when verbose is active:

? for shortcuts                           verbose | 42% context

Implementation Notes

The feature can be implemented purely at the rendering layer with no changes to the core streaming or data model:

  1. A VerboseModeContext (React Context) distributes verboseMode: boolean and frozenSnapshot to consumer components
  2. HistoryItemDisplay gates gemini_thought / gemini_thought_content on verboseMode
  3. ToolMessage suppresses result display when verboseMode is false
  4. MainContent uses a frozen snapshot of pendingHistoryItems during streaming to prevent viewport jitter
  5. AppContainer owns state, handles Ctrl+O, and persists to settings

This approach is minimal, non-breaking, and testable in isolation.

References

Why is this needed?

Background

When Qwen Code processes a complex task, it executes multiple tool calls — file reads, searches, shell commands — each producing output that is printed to the terminal. For long-running agentic tasks, this creates a wall of intermediate output that buries the final answer and makes the conversation hard to
scan.
Claude Code addresses this with a compact/verbose mode toggle (Ctrl+O): in compact mode,
tool result output and thinking-chain content are hidden, showing only tool names, statuses, and final assistant responses. Verbose mode reveals the full
output. The mode persists across sessions and is togglable at any time — including mid-stream — without losing context.

Problem

Currently, Qwen Code always renders the full output of every tool call, including:

  • Complete file contents returned by read tools
  • Full stdout/stderr of shell commands
  • Step-by-step thinking chain entries (<think> blocks)
  • Large diff outputs and agent execution traces

For a task involving 20+ tool calls, the terminal becomes cluttered and the actual answer is difficult to find. There is no way to reduce this noise
without losing the information entirely.

Additional context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions