Skip to content

feat: to #2767, support verbose and compact mode swither with ctrl-o#2770

Merged
tanzhenxin merged 4 commits intoQwenLM:mainfrom
chiga0:feat/add-verbose-mode-switcher
Apr 7, 2026
Merged

feat: to #2767, support verbose and compact mode swither with ctrl-o#2770
tanzhenxin merged 4 commits intoQwenLM:mainfrom
chiga0:feat/add-verbose-mode-switcher

Conversation

@chiga0
Copy link
Copy Markdown
Collaborator

@chiga0 chiga0 commented Mar 31, 2026

TLDR

Adds a compact/verbose mode toggle (Ctrl+O) to Qwen Code. In compact mode (default), tool result output and model thinking-chain are hidden, keeping the
terminal clean during long agentic runs. Pressing Ctrl+O switches to verbose mode, revealing full tool output and thoughts. The setting persists across
sessions via ~/.qwen/settings.json, and a verbose label appears in the footer when active.

Screenshots / Video Demo

demo gif

Compact mode (default) — tool calls show name + status only, no output noise:
✓ ReadFile src/index.ts
✓ Edit src/index.ts
✓ Bash npm run build

Verbose mode (Ctrl+O) — full tool output visible, verbose indicator in footer:
✓ ReadFile src/index.ts
1 import React from 'react';
...

✓ Bash npm run build
▎ build
▎ tsc --project tsconfig.json
▎ Done in 2.3s

Dive Deeper

Architecture: Rendering-layer filtering via React Context. No changes to the data model or streaming pipeline — VerboseModeContext distributes
verboseMode and frozenSnapshot state from AppContainer to:

  • HistoryItemDisplay — gates gemini_thought / gemini_thought_content renders behind verboseMode
  • ToolMessage — computes effectiveDisplayRenderer: passes through in verbose mode, returns { type: 'none' } in compact mode (interactive shell
    prompt is unaffected)
  • MainContent — uses frozenSnapshot to freeze the pending items viewport while streaming, preventing layout jitter when toggling mid-stream;
    auto-unfreezes when streaming completes
  • Footer — shows verbose label (localised) when verbose mode is active

Key design decisions:

  • Compact is the default (verboseMode: false) — matches the target UX of a clean terminal by default
  • pendingHistoryItems useMemo was moved earlier in AppContainer (before handleGlobalKeypress) to avoid stale closure / TDZ issues when referenced in
    the Ctrl+O handler
  • refreshStatic() is called on toggle to remount Ink's <Static> component, applying the mode change retroactively to already-rendered history
  • IdentityFile approach for SSH key (non-breaking, no changes to auth)

Localization: verbose key added to en, zh, de, ja, ru, pt locale files.

Reviewer Test Plan

  1. Build: npm run build — should pass with zero TypeScript errors
  2. Tests: npm test — all 238 test files should pass
  3. Default compact mode: Launch the CLI, run a tool-heavy prompt (e.g. list all files in src). Tool result output should be hidden; only tool name +
    status icon shown.
  4. Toggle to verbose: Press Ctrl+O. The verbose label should appear in the footer. Re-run a prompt — full tool output should now be visible.
  5. Toggle back: Press Ctrl+O again. verbose label disappears, tool output hidden.
  6. Persistence: Toggle verbose on, exit the CLI, relaunch — should still be in verbose mode. Check ~/.qwen/settings.json for "ui": { "verboseMode": true }.
  7. Mid-stream toggle: Start a long-running prompt, press Ctrl+O while streaming. Viewport should freeze until the stream completes, then
    auto-unfreeze.
  8. Thinking chain: Use a model with reasoning/thinking enabled. In compact mode, <think> blocks should be hidden. In verbose mode, they should
    appear.
  9. Shell tool: Verify that interactive shell (Ctrl+F focus) still works normally in compact mode — the shell input prompt must not be gated by
    verbose mode.

Testing Matrix

🍏 🪟 🐧
npm run
npx
Docker
Podman - -
Seatbelt - -

Validated on macOS (Apple Silicon) via npm run.

Linked issues / bugs

Closes #2767

Copy link
Copy Markdown
Collaborator

@tanzhenxin tanzhenxin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

Hey @chiga0 — thanks for the effort on this, the compact/verbose toggle is an interesting idea!

However, we have some concerns that need to be addressed before this can move forward.

Default behavior change is too disruptive

The biggest issue: this PR changes the default display behavior. Currently, thinking blocks (gemini_thought, gemini_thought_content) are always visible. After this PR, they're hidden by default (verboseMode: false). This is a significant UX regression for existing users who rely on seeing the model's reasoning. We can't accept a change that silently alters the default experience like this.

If you'd like to continue with this feature, the default should be verboseMode: true (preserving current behavior), with compact mode as an opt-in.

Critical issues

  1. useCallback dependency regressionAppContainer.tsx

    • The dependency settings.merged.general?.debugKeystrokeLogging was replaced with settings (the full object). Since settings creates a new reference on every render, this defeats useCallback memoization entirely and causes handleGlobalKeypress to be recreated every render. Please keep the original granular dependency and access setValue separately.
  2. Compact mode hides actively-executing shell outputToolMessage.tsx

    • In compact mode, effectiveDisplayRenderer is unconditionally set to { type: 'none' }, which hides the live ansi output of running shell commands. Users would be typing into a shell blind — they can see the input prompt but not the command output. At minimum, ansi-type displays should be exempted when a tool is actively executing.

Suggestions

  1. Asymmetric frozen snapshot behavior — Frozen snapshot is only created when toggling TO verbose mode during streaming, not when toggling to compact. Switching to compact mid-stream causes tool outputs to disappear abruptly.

  2. Copyright header — New file VerboseModeContext.tsx says "Copyright 2025 Google LLC". New files should reflect the Qwen Code project.

  3. Missing translations — Non-English locales (except Chinese) use the untranslated English string "verbose".

Please address the default behavior change and the critical issues. Happy to re-review once updated!

- Change default verboseMode to true (preserving current UX behavior)
- Fix compact mode hiding active shell output (add forceShowResult + isUserInitiated)
- Fix asymmetric frozen snapshot (freeze on ANY toggle during streaming)
- Fix copyright header in VerboseModeContext.tsx (Google LLC → Qwen)
- Add proper translations for all 6 locales (de/ja/pt/ru/zh/en)
- Rewrite CompactToolGroupDisplay with bordered box, i18n hint, shell detection
- Fix Pending status color (theme.text.secondary instead of theme.status.success)
- Fix description casing: ctrl+o → Ctrl+O
- Add explanatory comment for useCallback settings dependency

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@chiga0
Copy link
Copy Markdown
Collaborator Author

chiga0 commented Apr 4, 2026

Hi @tanzhenxin — thanks for the thorough review! I've pushed a follow-up commit (6fd29b69) that addresses every point you raised. Here's a detailed breakdown:


Changes & Rationale

1. Default behavior preserved ✅ (Critical)

Before: verboseMode defaulted to false — thinking blocks and tool output hidden by default.
After: verboseMode defaults to true — existing behavior is fully preserved. Compact mode is now opt-in via Ctrl+O.

File Change
settingsSchema.ts default: falsedefault: true
VerboseModeContext.tsx Context default falsetrue
AppContainer.tsx Fallback ?? false?? true
settings.schema.json "default": false"default": true

2. useCallback dependency — addressed ✅ (Critical)

Before: settings (full object) in dependency array, concern about defeating memoization.
After: Kept settings in dependency array (ESLint react-hooks/exhaustive-deps requires it because the callback calls settings.setValue()), but added an explanatory comment:

// `settings` is a stable LoadedSettings instance (not recreated on render).
// ESLint requires it here because the callback calls settings.setValue().
// debugKeystrokeLogging is read at call time, so no stale closure risk.
settings,

settings is a LoadedSettings class instance passed via props — its reference is stable across renders, so it does not defeat useCallback memoization. Using only settings.merged.general?.debugKeystrokeLogging would trigger an ESLint error that blocks the pre-commit hook.

3. Active shell output no longer hidden ✅ (Critical)

Before: In compact mode, effectiveDisplayRenderer was unconditionally set to { type: 'none' }, hiding all output including live shell sessions.
After: Added forceShowResult prop + isUserInitiated flag. User-initiated shell commands (via ! prefix) always show full output, even in compact mode.

File Change
types.ts Added isUserInitiated?: boolean to HistoryItemToolGroup
shellCommandProcessor.ts Sets isUserInitiated: true on user shell tool groups
ToolMessage.tsx Added forceShowResult prop; effectiveDisplayRenderer = verboseMode || forceShowResult ? displayRenderer : { type: 'none' }
ToolGroupMessage.tsx Added isUserInitiated prop; showCompact now includes && !isUserInitiated; passes forceShowResult={isUserInitiated} to ToolMessage
HistoryItemDisplay.tsx Passes isUserInitiated={itemForDisplay.isUserInitiated} to ToolGroupMessage

4. Symmetric frozen snapshot ✅ (Suggestion)

Before: Frozen snapshot only created when toggling to verbose during streaming. Switching to compact mid-stream caused tool outputs to disappear abruptly.
After: Snapshot is captured on any toggle direction during streaming:

-if (newValue && streamingState !== StreamingState.Idle) {
+// Symmetric freeze: capture snapshot on ANY toggle during streaming
+if (streamingState !== StreamingState.Idle) {

5. Copyright header fixed ✅ (Suggestion)

Before: VerboseModeContext.tsx and CompactToolGroupDisplay.tsx had Copyright 2025 Google LLC.
After: Both files now use Copyright 2025 Qwen.

6. Translations completed ✅ (Suggestion)

Before: Non-English locales used untranslated English "verbose".
After: All 6 locales now have proper native translations, plus 4 new i18n keys added:

Locale verbose New keys added
en verbose 4 (mode switch messages, description, compact hint)
zh 详细 4 (已切换到详细模式, 已切换到精简模式, etc.)
ja 詳細 4 (詳細モードオン, コンパクトモードオン, etc.)
de ausführlich 4 (Ausführlicher Modus aktiv, etc.)
ru подробный 4 (Подробный режим включён, etc.)
pt detalhado 4 (Modo detalhado ativado, etc.)

7. CompactToolGroupDisplay rewritten

Also improved the compact display component:

  • Bordered box style (matches the full tool group's borderStyle="round")
  • Shell command detection with SHELL_COMMAND_NAME / SHELL_NAME constants
  • First-line-only description truncation (prevents multi-line shell scripts from expanding the compact view)
  • i18n hint line replacing hardcoded string: t('Press Ctrl+O to show full tool output')
  • Fixed Pending status color: theme.text.secondary instead of misleading theme.status.success
  • Description casing: ctrl+oCtrl+O

Test Results

  • Build: npm run build — zero TypeScript errors
  • Tests: 238 test files passed, 3723 tests passed, 7 skipped, 0 failures
  • Snapshots: 2 snapshots updated (Footer verbose label)

Please let me know if anything else needs attention!

Copy link
Copy Markdown
Collaborator

@wenshao wenshao left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new compact mode introduces a critical UX/Security issue: when a tool enters the Confirming state (e.g., asking for permission to edit a file or run a command), the tool group expands, but the actual diff/command output inside <ToolMessage> remains hidden because verboseMode is false. This forces the user to blindly approve changes unless they explicitly press Ctrl+O. Similarly, when a tool fails (Error state), the error details are hidden.

I suggest force-expanding the group on errors, and force-showing the result on both Confirming and Error statuses.

For example, update showCompact to include !hasErrorTool and update <ToolMessage /> forceShowResult prop:

<ToolMessage
  // ...
  forceShowResult={
    isUserInitiated ||
    tool.status === ToolCallStatus.Confirming ||
    tool.status === ToolCallStatus.Error
  }
/>

— gemini-3.1-pro-preview

Copy link
Copy Markdown
Collaborator

@wenshao wenshao left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(This duplicate comment was removed.)

Copy link
Copy Markdown
Collaborator

@wenshao wenshao left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR #2770 Code Review

审查结论:Comment(评论) — 无严重问题,实现质量良好。

概述

该 PR 为 Qwen Code CLI 添加了紧凑/详细模式切换功能(Ctrl+O),通过新的 VerboseModeContext 控制工具输出和思维链的显示。架构设计合理,React Context + frozenSnapshot 的方案干净利落。

审查统计

4 个并行审查维度共报告 11 个发现,去重合并后 7 个独立发现,经独立验证后 4 个确认、3 个驳回。无 Critical 级别问题。

确认的建议(4 条)

  1. 状态图标映射重复CompactToolGroupDisplay.renderStatusIconToolStatusIndicator 存在代码重复,且已产生行为偏差(Pending 颜色不同、缺少 aria-label)
  2. Context value 未 memoizeVerboseModeProvider 使用内联对象导致 5 个消费者在 AppContainer 任意状态变化时不必要重渲染
  3. refreshStatic() 全量重渲染 — 长会话中切换模式可能造成 UI 卡顿,建议仅在有 thought 条目时触发
  4. 未使用的 i18n 字符串 — 6 个语言文件中定义了切换提示语但未被代码引用

驳回的发现(3 条)

  • toolAwaitingApproval 在 compact 路径是死代码 → React Hooks 必须无条件调用,属必要模式
  • VerboseModeProvider 裸 Provider 模式不一致 → ShellFocusContext 也使用同样模式,纯值注入的 Context 无需包装组件
  • Compact 缺少 error borderColor → 验证后发现 compact 和 expanded 视图的 borderColor 逻辑完全一致,属误报

Reviewed by glm-5.1

Copy link
Copy Markdown
Collaborator

@wenshao wenshao left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

Two issues found — one bug, one consistency concern. Architecture and overall approach look solid.

Review by Copilot CLI + Opus 4.6

@wenshao
Copy link
Copy Markdown
Collaborator

wenshao commented Apr 5, 2026

Great approach — compact mode completely eliminates flicker by not rendering tool output at all. However, verbose mode still has no height cap, so switching to verbose with large outputs (e.g. npm install, git log) will still cause terminal flicker.

How upstream Gemini CLI solved this (after the fork point)

Since Qwen Code's last upstream sync (v0.8.2, Oct 2025), Gemini CLI added a 4-layer anti-flicker system in March 2026:

  1. Hard line capsACTIVE_SHELL_MAX_LINES = 15, COMPLETED_SHELL_MAX_LINES = 15, SUBAGENT_MAX_LINES = 15 (constants.ts)

  2. Pre-render data slicingSlicingMaxSizedBox slices data to maxLines before passing to React/Ink, so Ink never layouts the full content

  3. Character limitMAXIMUM_RESULT_DISPLAY_CHARACTERS = 20,000 (vs Qwen Code's current 1,000,000)

  4. calculateShellMaxLines()toolLayoutUtils.ts dynamically computes height based on shell status (executing/completed), focus state, and user expansion — always capped at Math.min(terminalHeight, 15)

Suggestion: combine both approaches

Your compact/verbose toggle solves "whether to show output"; Gemini's height limiting solves "how much to show". The ideal state is both:

  • Compact mode (default): no output, no flicker ✓ (this PR)
  • Verbose mode: output capped at 15 lines with SlicingMaxSizedBox pre-render slicing, user can Ctrl+S to expand

Key files to backport from upstream:

  • packages/cli/src/ui/components/shared/SlicingMaxSizedBox.tsx
  • packages/cli/src/ui/utils/toolLayoutUtils.ts
  • packages/cli/src/ui/constants.ts (the *_MAX_LINES constants)

Relevant PRs in upstream Gemini CLI:

  • #21416fix(ui): fix flickering on small terminal heights
  • #20378feat(core): improve subagent result display
  • #20974feat(cli): implement compact tool output

Detailed analysis: tool-output-height-limiting-deep-dive.md

chiga0 and others added 2 commits April 6, 2026 15:07
…toggle

- Fix default value: compact mode (verboseMode=false) is now the default,
  matching PR description and intended UX
- Extract shared ToolStatusIndicator component to eliminate duplicate
  status icon rendering between ToolMessage and CompactToolGroupDisplay
- Memoize VerboseModeProvider context value to prevent unnecessary
  re-renders of all consumer components
- Clear frozenSnapshot on WaitingForConfirmation state to ensure tool
  confirmation UI remains interactive during mid-stream toggle
- Replace magic string 'Shell' with SHELL_NAME constant in ToolMessage
- Remove unused i18n translation keys (verbose/compact mode messages)
- Update snapshots for Footer and ToolGroupMessage tests

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…atus

Per maintainer review (tanzhenxin): default verboseMode reverted to true
to preserve existing behavior — compact mode is opt-in via Ctrl+O.

Also addresses wenshao's security concern: in compact mode, tool groups
now force-expand on Error status (in addition to existing Confirming
handling), and ToolMessage force-shows result for both Confirming and
Error statuses so users always see diffs before approval and error
details for debugging.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@chiga0
Copy link
Copy Markdown
Collaborator Author

chiga0 commented Apr 6, 2026

@tanzhenxin Thanks for the review! Addressed in 1d639c9:

  1. Default reverted to verboseMode: true — existing behavior fully preserved. Compact mode is now opt-in via Ctrl+O, as you requested.

  2. useCallback dependencysettings is a stable LoadedSettings class instance (not recreated on render), so it does not defeat memoization. Keeping the granular settings.merged.general?.debugKeystrokeLogging would trigger ESLint react-hooks/exhaustive-deps violations that block pre-commit. Added an explanatory comment.

  3. Active shell output — already addressed in 6fd29b6 with forceShowResult prop + isUserInitiated flag.

  4. Symmetric frozen snapshot — already addressed in 6fd29b6.

  5. Copyright headers — already fixed in 6fd29b6.

  6. Translations — already completed in 6fd29b6.

Additionally in 1d639c9, per @wenshao's suggestion: compact mode now force-expands on Error status and force-shows result on both Confirming and Error, so users always see diffs before approval and error details for debugging.

@chiga0
Copy link
Copy Markdown
Collaborator Author

chiga0 commented Apr 6, 2026

@wenshao Thanks for the detailed reviews!

Re: Confirming/Error force-expand — Fixed in 1d639c9. Compact mode now:

  • Force-expands the tool group on both Confirming and Error statuses
  • forceShowResult is set for Confirming and Error tool statuses, so users always see diffs before approval and error details for debugging

Re: verbose mode height limiting / SlicingMaxSizedBox backport — Great analysis! Agree that combining compact/verbose toggle with height caps would be ideal. This is a larger effort that should be tracked separately. Filed as a follow-up item.

@@ -0,0 +1,108 @@
/**
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] CompactToolGroupDisplay has no test coverage. ToolGroupMessage.test.tsx doesn't wrap with VerboseModeProvider, so the compact-mode branch (showCompact) is never exercised.

The component contains non-trivial logic: getOverallStatus priority resolution, getActiveTool selection, description truncation, and conditional border colors — all unguarded by tests.

Suggested fix: Add VerboseModeProvider to the test's renderWithProviders helper (defaulting to { verboseMode: true, frozenSnapshot: null }), then add test cases:

  1. Render with verboseMode: false + Success tool → verify compact display renders
  2. Render with verboseMode: false + Confirming tool → verify expanded view (not compact)
  3. Unit test getOverallStatus priority ordering

Reviewed by glm-5.1 via Qwen Code /review

Comment on lines 17 to 18
import { useConfig } from '../contexts/ConfigContext.js';
import { useVimMode } from '../contexts/VimModeContext.js';
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] Footer.test.tsx doesn't wrap <Footer /> in VerboseModeProvider. Footer now calls useVerboseMode() to conditionally render the "verbose" label, but tests rely on the default context value (verboseMode: true). No test verifies the label disappears when in compact mode.

Suggested fix:

import { VerboseModeProvider } from '../contexts/VerboseModeContext.js';
// In renderWithWidth, wrap Footer:
<VerboseModeProvider value={{ verboseMode: true, frozenSnapshot: null }}>
  {/* ... existing providers ... */}
  <Footer />
</VerboseModeProvider>

// Add test:
it('does not show verbose label when verboseMode is false', () => {
  // render with verboseMode: false, assert 'verbose' not in output
});

Reviewed by glm-5.1 via Qwen Code /review

Copy link
Copy Markdown
Collaborator

@wenshao wenshao left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review Summary

PR #2770: feat: verbose/compact mode toggle (Ctrl+O)

24 files changed (+438/-112). The implementation is clean and well-structured:

  • React Context (VerboseModeProvider) distributes state correctly with memoized value
  • Frozen snapshot mechanism handles mid-stream toggles (only during Responding state)
  • Force-show logic preserves visibility for shell, confirming, and error tools
  • Shared ToolStatusIndicator component avoids duplication
  • All previously reported issues (stale closure, memoization, default value, etc.) have been addressed

Deterministic checks: Lint clean, tsc clean on changed files, all 3723 tests pass.

2 suggestions (no blockers):

  1. Missing test coverage for CompactToolGroupDisplay — component has non-trivial logic but zero tests
  2. Footer.test.tsx missing VerboseModeProvider wrapper — no test for compact-mode footer

Reviewed by glm-5.1 via Qwen Code /review

Copy link
Copy Markdown
Collaborator

@tanzhenxin tanzhenxin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review

Nice work on this — clean architecture with React Context, and good responsiveness to feedback across multiple rounds.

One edge case to flag: toggling Ctrl+O while an interactive shell is active freezes the pending area with activeShellPtyId=undefined and embeddedShellFocused=false (MainContent.tsx lines 53-56). This causes the shell prompt to disappear until streaming ends. Consider either disabling Ctrl+O while a PTY shell is focused, or preserving the shell focus state in the frozen snapshot.

Verdict

COMMENT — Mergeable. The shell focus issue is a niche edge case that can be addressed in a follow-up.

@tanzhenxin tanzhenxin merged commit b632541 into QwenLM:main Apr 7, 2026
26 of 27 checks passed
@chiga0 chiga0 deleted the feat/add-verbose-mode-switcher branch April 7, 2026 11:21
chiga0 pushed a commit that referenced this pull request Apr 10, 2026
… improvements

- Add Ctrl+O to keyboard shortcuts list (?) and /help command
- Sync compact mode toggle from Settings dialog with CompactModeContext
- Protect tool approval prompts from being hidden in compact mode
  (MainContent forces live rendering during WaitingForConfirmation)
- Remove snapshot freezing on toggle — treat as persistent preference,
  not temporary peek (differs from Claude Code's session-scoped model)
- Add compact mode tip to startup Tips rotation for non-intrusive discovery
- Remove compact mode indicator from footer to reduce UI clutter
- Add competitive analysis design doc (EN + ZH) comparing with Claude Code
- Update user docs (settings.md) and i18n translations (en/zh/ru/pt)

Relates to #3047, #2767, #2770

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
chiga0 pushed a commit that referenced this pull request Apr 10, 2026
… improvements

- Add Ctrl+O to keyboard shortcuts list (?) and /help command
- Sync compact mode toggle from Settings dialog with CompactModeContext
- Protect tool approval prompts from being hidden in compact mode
  (MainContent forces live rendering during WaitingForConfirmation)
- Remove snapshot freezing on toggle — treat as persistent preference,
  not temporary peek (differs from Claude Code's session-scoped model)
- Add compact mode tip to startup Tips rotation for non-intrusive discovery
- Remove compact mode indicator from footer to reduce UI clutter
- Add competitive analysis design doc (EN + ZH) comparing with Claude Code
- Update user docs (settings.md) and i18n translations (en/zh/ru/pt)

Relates to #3047, #2767, #2770

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

DDAR DataWorks Data Agent Ready

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

3 participants