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

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

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

Документация пользователя: Настройки — 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»)Да («Нажмите Ctrl+O, чтобы показать полный вывод инструмента»)

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

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

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

┌──────────────────────────────────┐ │ AppState (Zustand) │ │ verbose: boolean (default: false)│ │ screen: 'prompt' | 'transcript' │ └──────────┬───────────────────────┘ ┌─────┴──────┐ │ Ctrl+O │ переключает режим экрана, │ Handler │ а НЕ флаг отрисовки └─────┬──────┘ ┌─────▼──────────────┐ │ REPL.tsx │ │ screen='prompt' → компактный вид (по умолчанию) │ screen='transcript'→ подробный вид └────────────────────┘

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 Пользовательский поток

Начало сессии → компактный режим (по умолчанию) ├─ Выводы инструментов сведены в одну строку ├─ Большой вывод инструмента показывает подсказку «(ctrl+o to expand)» ├─ Пользователь нажимает Ctrl+O │ └─→ Экран переключается на transcript (подробный вид) │ └─ Пользователь видит весь вывод инструментов, мысли и т.д. ├─ Пользователь снова нажимает Ctrl+O │ └─→ Экран переключается обратно на prompt (компактный) └─ Сессия заканчивается → verbose сбрасывается в false

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

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

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

┌─────────────────────────────────────┐ │ CompactModeContext │ │ compactMode: boolean (default: false)│ │ setCompactMode: (v) => void │ └──────────┬──────────────────────────┘ ┌─────┴──────┐ │ Ctrl+O │ переключает compactMode │ Handler │ сохраняет в настройки └─────┬──────┘ ┌─────▼──────────────────┐ │ Каждый компонент │ │ читает compactMode │ │ и решает, как │ │ отрисовываться │ └────────────────────────┘ ┌─────▼──────────────────────────────┐ │ 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Отрисовывает живые pendingHistoryItems
МышлениеHistoryItemDisplay.tsx:123-133Скрывает gemini_thought в компактном режиме

3.3 Дизайнерские решения

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

3.4 Пользовательский поток

Начало сессии → подробный режим (по умолчанию) ├─ Весь вывод инструментов, мысли, детали видны ├─ Пользователь нажимает Ctrl+O (или переключает в Настройках) │ └─→ compactMode = true, сохранено │ ├─ Группы инструментов показывают однострочную сводку │ ├─ Содержимое мыслей/размышлений скрыто │ └─ Подтверждения, ошибки, оболочка всё ещё развёрнуты ├─ Пользователь снова нажимает Ctrl+O │ └─→ compactMode = false, сохранено │ └─ Все детали снова видны └─ Следующая сессия → тот же режим, что и в прошлый раз

4. Глубокое сравнение ключевых различий

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

АспектClaude Code (компактный по умолчанию)Qwen Code (подробный по умолчанию)
Первое впечатлениеЧисто, минималистично — профессиональное ощущениеБогато информацией — полная прозрачность
Кривая обученияПользователь должен выучить Ctrl+O, чтобы увидеть деталиПользователь сразу может видеть всё
Целевая аудиторияОпытные пользователи, доверяющие инструментуПользователи, желающие понимать происходящее
Информационная перегрузкаИзбегается по умолчаниюВозможна для новых пользователей
ОбнаружениеПодсказки «(ctrl+o to expand)» на инструментахРотация стартовых подсказок + ? ярлыки + /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 строк, показывать подсказку «развернуть» для этого инструмента в компактном режиме.
  • Область: улучшение в будущем, не текущий приоритет.

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
Нет замороженных снимковГотовоПереключатель всегда показывает живой вывод
Защита подтвержденийГотовоПринудительное разворачивание + защита WaitingForConfirmation
Защита оболочкиГотовоПринудительное разворачивание через !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.tsxКомпактный UI подтверждения
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Скрытие содержимого мыслей
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