Skip to Content
ДизайнCompact ModeДизайн компактного режима: конкурентный анализ и оптимизация

Дизайн компактного режима: конкурентный анализ и оптимизация

Переключение компактного/подробного режима по Ctrl+O — конкурентный анализ с Claude Code, обзор текущей реализации и рекомендации по оптимизации.

Документация для пользователей: Settings — ui.compactMode.

1. Основные выводы

Qwen Code и Claude Code предоставляют сочетание клавиш Ctrl+O для переключения между компактным и подробным режимами вывода инструментов, однако философия дизайна, состояние по умолчанию и модель взаимодействия принципиально различаются. В этом документе представлен детальный сравнительный анализ на уровне исходного кода, выявлены пробелы в UX и предложены оптимизации для Qwen Code.

ПараметрClaude CodeQwen Code
Режим по умолчаниюКомпактный (verbose=false)Подробный (compactMode=false)
Семантика переключенияВременный просмотр деталейПостоянное переключение предпочтений
Сохранение состоянияТолько в рамках сессии, сброс при перезапускеСохраняется в settings.json
Область действияГлобальное переключение экрана (prompt ↔ transcript)Переключение рендеринга на уровне компонентов
Замороженный снимокОтсутствует (нет концепции)Отсутствует (удалено)
Подсказка расширения для инструментаДа (“ctrl+o to expand”)Да (“Press Ctrl+O to show full tool output”)

2. Анализ реализации в Claude Code

2.1 Архитектура

Claude Code использует подход на уровне экранов, а не переключение рендеринга на уровне компонентов:

┌──────────────────────────────────┐ │ AppState (Zustand) │ │ verbose: boolean (default: false)│ │ screen: 'prompt' | 'transcript' │ └──────────┬───────────────────────┘ ┌─────┴──────┐ │ Ctrl+O │ toggles screen mode │ Handler │ NOT a rendering flag └─────┬──────┘ ┌─────▼──────────────┐ │ REPL.tsx │ │ screen='prompt' → compact view (default) │ screen='transcript'→ detailed view └────────────────────────┘

2.2 Ключевые файлы исходного кода

КомпонентФайлКлючевая логика
Обработчик переключенияsrc/hooks/useGlobalKeybindings.tsx:90-132Переключает screen между 'prompt' и 'transcript'
Привязка клавишsrc/keybindings/defaultBindings.ts:44app:toggleTranscript
Определение состоянияsrc/state/AppStateStore.ts:472verbose: false (только в сессии)
Подсказка расширенияsrc/components/CtrlOToExpand.tsx:29-46Текст “(ctrl+o to expand)” для каждого инструмента
Фильтр сообщенийsrc/components/Messages.tsx:93-151filterForBriefTool() для компактного вида
Разрешенияsrc/components/permissions/PermissionRequest.tsxРендерится в слое оверлея, никогда не скрывается

2.3 Принятые проектные решения

  1. Компактный режим по умолчанию. Пользователи сразу видят чистый интерфейс; детализация включается по запросу.
  2. Ограничен сессией. verbose сбрасывается в false при каждой новой сессии — Claude Code предполагает, что пользователи в основном предпочитают компактный вид и нуждаются в деталях лишь временно.
  3. Переключение на уровне экрана. Ctrl+O не меняет способ рендеринга компонентов; он переключает весь дисплей между экраном “prompt” (компактный) и экраном “transcript” (подробный).
  4. Без заморозки снимков. Концепция заморозки снимков отсутствует. При переключении дисплей сразу обновляется текущим состоянием.
  5. Диалоги разрешений вынесены отдельно. Подтверждения инструментов рендерятся в выделенном слое оверлея, который никогда не затрагивается переключением verbose/compact.
  6. Подсказка для каждого инструмента. Компонент CtrlOToExpand показывает контекстную подсказку на отдельных инструментах при большом выводе, подавляется в субагентах.

2.4 Пользовательский сценарий

Session start → compact mode (default) ├─ Tool outputs are summarized in a single line ├─ Large tool output shows "(ctrl+o to expand)" hint ├─ User presses Ctrl+O │ └─→ Screen switches to transcript (detailed view) │ └─ User sees all tool output, thinking, etc. ├─ User presses Ctrl+O again │ └─→ Screen switches back to prompt (compact) └─ Session ends → verbose resets to false

3. Анализ реализации в Qwen Code

3.1 Архитектура

Qwen Code использует флаг рендеринга на уровне компонентов, который каждый UI-компонент считывает из контекста:

┌─────────────────────────────────────┐ │ CompactModeContext │ │ compactMode: boolean (default: false)│ │ setCompactMode: (v) => void │ └──────────┬──────────────────────────┘ ┌─────┴──────┐ │ Ctrl+O │ toggles compactMode │ Handler │ persists to settings └─────┬──────┘ ┌─────▼──────────────────┐ │ Each component reads │ │ compactMode and │ │ decides how to render │ └────────────────────────┘ ┌─────▼──────────────────────────────┐ │ ToolGroupMessage │ │ showCompact = compactMode │ │ && !hasConfirmingTool │ │ && !hasErrorTool │ │ && !isEmbeddedShellFocused │ │ && !isUserInitiated │ └────────────────────────────────────┘

3.2 Ключевые файлы исходного кода

КомпонентФайлКлючевая логика
Обработчик переключенияAppContainer.tsx:1684-1690Переключает compactMode, сохраняет в настройки
КонтекстCompactModeContext.tsxcompactMode, setCompactMode
Группа инструментовToolGroupMessage.tsx:105-110showCompact с 4 условиями принудительного раскрытия
Сообщение инструментаToolMessage.tsx:346-350Скрывает displayRenderer в компактном режиме
Компактный выводCompactToolGroupDisplay.tsx:49-108Однострочное резюме со статусом и подсказкой
ПодтверждениеToolConfirmationMessage.tsx:113-147Упрощенное компактное подтверждение с 3 вариантами
СоветыTips.tsx:14-29Ротация стартовых советов включает подсказку о компактном режиме
Синхронизация настроекSettingsDialog.tsx:189-193Синхронизация с CompactModeContext + refreshStatic
MainContentMainContent.tsx:60-76Рендерит live pendingHistoryItems
ThinkingHistoryItemDisplay.tsx:123-133Скрывает gemini_thought в компактном режиме

3.3 Принятые проектные решения

  1. Подробный режим по умолчанию. Пользователи сразу видят весь вывод инструментов и ход мыслей.
  2. Постоянное предпочтение. compactMode сохраняется в settings.json и переживает перезапуск сессий.
  3. Рендеринг на уровне компонентов. Каждый компонент считывает compactMode из контекста и самостоятельно настраивает свой рендеринг.
  4. Защита принудительного раскрытия. Четыре условия переопределяют компактный режим, гарантируя видимость критически важных элементов UI (подтверждения, ошибки, shell, действия пользователя).
  5. Без заморозки снимков. Переключение всегда показывает вывод в реальном времени — замороженные снимки отсутствуют.
  6. Синхронизация с диалогом настроек. Переключение компактного режима из настроек мгновенно обновляет состояние React через setCompactMode.
  7. Ненавязчивое обнаружение. Компактный режим представляется через ротацию стартовых советов (Tips), а не через постоянный индикатор в футере, что позволяет избежать загромождения UI.

3.4 Пользовательский сценарий

Session start → verbose mode (default) ├─ All tool outputs, thinking, details visible ├─ User presses Ctrl+O (or toggles in Settings) │ └─→ compactMode = true, persisted │ ├─ Tool groups show single-line summary │ ├─ Thinking/thought content hidden │ └─ Confirmations, errors, shell still expanded ├─ User presses Ctrl+O again │ └─→ compactMode = false, persisted │ └─ All details visible again └─ Next session → same mode as last session

4. Углубленный анализ ключевых различий

4.1 Философия режима по умолчанию

АспектClaude Code (компактный по умолчанию)Qwen Code (подробный по умолчанию)
Первое впечатлениеЧистый, минималистичный — профессиональный видИнформативный — полная прозрачность
Кривая обученияПользователь должен изучить Ctrl+O для просмотра деталейПользователь сразу видит всё
Целевая аудиторияОпытные пользователи, доверяющие инструментуПользователи, желающие понимать происходящее
Информационная перегрузкаИзбегается по умолчаниюВозможна для новых пользователей
ОбнаруживаемостьПодсказки “(ctrl+o to expand)” для каждого инструментаРотация стартовых советов + ? shortcuts + /help

Анализ: Компактный режим по умолчанию в Claude Code работает, потому что его аудитория — в основном опытные разработчики, доверяющие инструменту и не нуждающиеся в просмотре каждого вызова. Подробный режим по умолчанию в Qwen Code уместен на текущем этапе развития продукта, где важно строить доверие пользователей через прозрачность.

4.2 Модель сохранения состояния

АспектClaude CodeQwen Code
Сохраняется?Нет — только в сессииДа — в settings.json
ОбоснованиеПодробный просмотр — временная потребностьРежим — пользовательское предпочтение
Поведение при перезапускеВсегда запускается в компактном режимеЗапускается в последнем использованном режиме

Анализ: Claude Code рассматривает просмотр деталей как мгновенную потребность — вы посмотрели и вернулись назад. Qwen Code рассматривает это как стабильное предпочтение — одни пользователи всегда хотят детали, другие всегда хотят компактный вид. Оба подхода валидны; подход Qwen Code более гибок.

4.3 Защита подтверждений

АспектClaude CodeQwen Code
МеханизмСлой оверлея/модального окна (структурно отделен)Условия принудительного раскрытия в showCompact
ПокрытиеПолное — подтверждения никогда не могут быть скрытыПолное — 4 условия покрывают все интерактивные состояния
UI компактного подтвержденияН/Д (оверлей всегда полный)Упрощенный RadioButtonSelect с 3 вариантами

Анализ: Архитектурное разделение в Claude Code (слой оверлея) более надежно. Подход Qwen Code с принудительным раскрытием эффективен, но требует явного добавления каждого нового интерактивного состояния в список условий.

4.4 Подход к рендерингу

АспектClaude CodeQwen Code
Область переключенияНа уровне экрана (prompt ↔ transcript)На уровне компонентов (каждый компонент решает сам)
ГранулярностьВсё или ничегоТонкая настройка для каждого компонента
ГибкостьНизкая — глобальный переключательВысокая — компоненты могут переопределять
СогласованностьГарантированаЗависит от реализации каждого компонента

Анализ: Подход Qwen Code на уровне компонентов более гибок (например, принудительное раскрытие для конкретных условий), но требует большей дисциплины для поддержания согласованности. Подход Claude Code на уровне экрана проще и гарантирует единообразное поведение.

5. Рекомендации по оптимизации

5.1 [P0] Оставить подробный режим по умолчанию — изменения не требуются

Подробный режим по умолчанию в Qwen Code — верное решение для текущего этапа. Новым пользователям необходима прозрачность для формирования доверия. По мере взросления продукта стоит рассмотреть перевод компактного режима в состояние по умолчанию (как в Claude Code).

5.2 [P1] Раскрытие для отдельных инструментов при большом выводе

Claude Code показывает “(ctrl+o to expand)” на отдельных инструментах с большим выводом. В Qwen Code сейчас доступен только глобальный переключатель. Рекомендуется рассмотреть:

  • Если вывод одного инструмента превышает N строк, показывать подсказку “expand” для этого инструмента в компактном режиме.
  • Область применения: будущее улучшение, не текущий приоритет.

5.3 [P2] Рассмотреть переопределение в рамках сессии

Некоторым пользователям может быть удобен компактный режим по умолчанию, но иногда требуется подробный вид для конкретной сессии. Рекомендуется поддержать оба варианта:

  • settings.json → постоянное значение по умолчанию (текущее поведение)
  • Ctrl+O во время сессии → временное переопределение только для текущей сессии (поведение Claude Code)
  • При перезапуске сессии → возврат к значению из settings.json

Это даст пользователям лучшее из обоих миров. Реализация потребует разделения состояния “настройки по умолчанию” и “переопределение сессии”.

5.4 [P2] Структурное разделение для подтверждений

В настоящее время защита подтверждений опирается на условия showCompact в ToolGroupMessage. Рекомендуется рассмотреть более надежный подход:

  • Рендерить подтверждения в отдельном слое (по аналогии с оверлеем в Claude Code).
  • Это сделает архитектурно невозможным влияние компактного режима на подтверждения.
  • Более низкий приоритет, поскольку текущий подход с принудительным раскрытием работает корректно.

6. Текущий статус реализации

После внесения изменений в ветку feat/compact-mode-optimization:

ФункцияСтатусПримечания
Подсказка в стартовых советахГотовоПодсказка о компактном режиме в ротации Tips (ненавязчиво)
Ctrl+O в сочетаниях клавиш (?)ГотовоДобавлено в компонент KeyboardShortcuts
Ctrl+O в /helpГотовоДобавлено в компонент Help
Синхронизация диалога настроекГотовоСинхронизация compactMode с CompactModeContext
Без заморозки снимковГотовоПереключение всегда показывает вывод в реальном времени
Защита подтвержденийГотовоПринудительное раскрытие + guard WaitingForConfirmation
Защита shellГотовоПринудительное раскрытие !isEmbeddedShellFocused
Защита ошибокГотовоПринудительное раскрытие !hasErrorTool
Обновление документацииГотовоsettings.md, keyboard-shortcuts.md

7. Справочник файлов

Qwen Code

ФайлНазначение
packages/cli/src/ui/AppContainer.tsxОбработчик переключения, инициализация состояния, провайдер контекста
packages/cli/src/ui/contexts/CompactModeContext.tsxОпределение контекста
packages/cli/src/ui/components/messages/ToolGroupMessage.tsxЛогика принудительного раскрытия
packages/cli/src/ui/components/messages/ToolMessage.tsxСкрытие вывода для отдельных инструментов
packages/cli/src/ui/components/messages/CompactToolGroupDisplay.tsxРендеринг компактного вида
packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsxUI компактного подтверждения
packages/cli/src/ui/components/MainContent.tsxРендеринг ожидающих элементов истории
packages/cli/src/ui/components/Tips.tsxСтартовый совет с подсказкой о компактном режиме
packages/cli/src/ui/components/Help.tsxЗапись сочетания клавиш /help
packages/cli/src/ui/components/KeyboardShortcuts.tsxЗапись сочетания клавиш ?
packages/cli/src/ui/components/SettingsDialog.tsxСинхронизация настроек
packages/cli/src/ui/components/HistoryItemDisplay.tsxСкрытие содержимого мыслей (thinking)
packages/cli/src/config/settingsSchema.tsОпределение настройки
packages/cli/src/config/keyBindings.tsПривязка Ctrl+O

Claude Code (для справки)

ФайлНазначение
src/hooks/useGlobalKeybindings.tsxОбработчик переключения
src/state/AppStateStore.tsОпределение состояния (verbose: false)
src/components/CtrlOToExpand.tsxПодсказка расширения для инструмента
src/components/Messages.tsxФильтр кратких сообщений
src/screens/REPL.tsxПереключение режима на уровне экрана
src/components/permissions/PermissionRequest.tsxПодтверждение на основе оверлея
Last updated on