qwen-code/packages/vscode-ide-companion
Shaojin Wen d71f2fab70
feat(cli): cap inline shell output with configurable line limit (#3508)
* feat(cli): cap inline shell output with configurable line limit

Long-running shell commands (npm install, find /, build logs) currently
fill the viewport with the full visible PTY buffer (up to availableHeight,
~24 lines on a typical terminal). The output dominates the screen and
pushes prior context off the top.

This caps inline ANSI shell output to a small window (default 5 lines,
matching Claude Code's ShellProgressMessage). The hidden line count is
already surfaced via the existing `+N lines` indicator in
`ShellStatsBar`, so users still know how much was elided.

The cap applies only when nothing in the existing escape-hatch set is
true:
  - `forceShowResult` (errors, !-prefix user-initiated commands,
    tools awaiting confirmation, agents pending confirmation)
  - `isThisShellFocused` (ctrl+f focus on a running embedded PTY shell)
  - `ui.shellOutputMaxLines = 0` (user opt-out)

Also adds a new `ui.shellOutputMaxLines` setting (default 5) so users
can adjust or disable the cap. The SettingsDialog renders it
automatically via the existing `type: 'number'` schema path.

Notes on scope:
  - Only the `'ansi'` display branch is capped. `'string'`, `'diff'`,
    `'todo'`, `'plan'`, `'task'` renderers are untouched.
  - `AnsiOutputDisplay` is only produced by shell tools (`shell.ts`,
    `shellCommandProcessor.ts`), so other tool outputs are unaffected.
  - The `+N lines` count is bounded by the headless xterm buffer height
    (~30 rows) — a pre-existing limitation of the buffer-based stats,
    not introduced here.

Tests:
  - 4 new ToolMessage tests cover cap default, forceShowResult bypass,
    settings disable (cap=0), and custom cap value.
  - The existing `MockAnsiOutputText` / `MockShellStatsBar` mocks were
    extended to print `availableTerminalHeight` / `displayHeight` so
    the cap behavior is asserted at the prop level.

* fix(cli): apply shell output cap to completed string display too

Initial PR caught only the streaming ANSI branch. AI shell tools emit
the final completed result through `shell.ts:returnDisplayMessage =
result.output`, which is a plain string. That string went through
`StringResultRenderer` with the unmodified `availableHeight`, so the
cap was effectively bypassed for the steady-state display the user
actually sees most of the time.

Verified manually in tmux: a `seq 1 30` invocation by the AI now
collapses to "first 26 lines hidden ... 27 28 29 30" instead of
listing all 30 rows. `!`-prefix `seq 1 30` still expands fully via
the existing `isUserInitiated → forceShowResult` bypass.

Changes:
  - Detect shell tool by name (matches existing `SHELL_COMMAND_NAME` /
    `SHELL_NAME` checks already used in this file)
  - Rename `ansiAvailableHeight` → `shellCapHeight` since it now
    governs the string branch as well
  - Pass `shellCapHeight` to `StringResultRenderer`; the value
    falls back to `availableHeight` for non-shell tools so other
    tools' string output is unaffected
  - Two new tests: shell completed string is capped; non-shell
    string is not
  - Two existing tests updated to use `name="Shell"` so they actually
    exercise the cap path (would previously have passed by accident
    since the original code didn't check tool name)

Also picks up the auto-regenerated VSCode IDE companion settings
schema entry for `ui.shellOutputMaxLines`.

* fix(cli): symmetrize ANSI/string row counts and clamp shell cap input

Addresses two non-blocking review observations on #3508.

Off-by-one between paths:
  MaxSizedBox reserves one row for its overflow banner when content
  exceeds maxHeight (visibleContentHeight = max - 1). The ANSI path
  pre-slices to N in AnsiOutputText so MaxSizedBox sees exactly N
  rows and renders all N — plus the separate ShellStatsBar line.
  The string path passes the raw cap and lets MaxSizedBox handle
  overflow, so it shows N-1 content rows + the banner.

  Result with cap=5: ANSI showed 5+stats, string showed 4+banner.
  Pass shellCapHeight + 1 to StringResultRenderer when capping so
  both paths render N visible content rows. Verified in tmux: the
  completed Shell tool box now reports `... first 25 lines hidden ...`
  followed by lines 26-30 (was 26 + lines 27-30).

Setting validation:
  Schema accepts any number; the dialog only rejects NaN. Negatives
  silently disabled the cap (only 0 is documented as off) and
  fractional values produced fractional slice counts. Added
  Math.max(0, Math.floor(value || 0)) at the use site so:
   - negatives → 0 → cap disabled (matches the documented opt-out)
   - fractions → floor → whole-row cap
   - non-numeric (raw settings.json edits) → 0 → cap disabled
  Schema-level minimum/integer constraints aren't supported by the
  current settings infrastructure (no other number setting uses
  them either), so the guard lives at the use site.

Tests:
  - Updated string-cap test to assert lines 26-30 visible (catches
    the +1 fix; was lines 27-30 before)
  - New parameterized test covers -1, 1.5, and a non-numeric value
2026-04-22 14:37:13 +08:00
..
.vscode pre-release commit 2025-07-22 23:26:01 +08:00
assets feat(vscode-ide-companion/layout): add sidebar view and simplify chat positioning 2026-03-07 00:30:40 +08:00
schemas feat(cli): cap inline shell output with configurable line limit (#3508) 2026-04-22 14:37:13 +08:00
scripts Merge branch 'main' of https://github.com/QwenLM/qwen-code into feat/unified-ui-for-vscode-extension 2026-01-28 18:52:37 +08:00
src feat(session): add rename, delete, and auto-title generation for session (#3093) 2026-04-22 11:48:01 +08:00
.vscodeignore feat: add JSON Schema validation for VS Code settings 2026-02-13 17:32:18 +08:00
development.md Sync upstream Gemini-CLI v0.8.2 (#838) 2025-10-23 09:27:04 +08:00
esbuild.js feat(vscode): replace OAuth with Coding Plan / API Key provider setup (#3398) 2026-04-21 22:20:58 +08:00
eslint.config.mjs fix(vscode-ide-companion): 修复 Tailwind 可重用组件类和 ESLint 配置, 调整 ChatHeader 按钮样式 2025-11-29 18:13:50 +08:00
LICENSE Upload VSIX of companion VS Code extension (#4241) 2025-07-15 18:44:03 +00:00
NOTICES.txt refactor(acp): migrate to @agentclientprotocol/sdk and clean up handlers 2026-03-06 21:57:41 +08:00
package.json feat(vscode): replace OAuth with Coding Plan / API Key provider setup (#3398) 2026-04-21 22:20:58 +08:00
postcss.config.js refactor(vscode): 重构消息排序和展示逻辑 2025-11-28 22:35:31 +08:00
README.md fix: update TOS link in VS Code extension README 2026-03-19 17:36:32 +08:00
tailwind.config.js feat(webui): add webview container and isolate styles for VSCode integration 2026-01-17 10:53:32 +08:00
tsconfig.json fix: upgrade @lydell/node-pty to 1.2.0-beta.10 to fix PTY FD leak 2026-04-01 07:55:56 +08:00
vitest.config.ts refactor(vscode-ide-companion): Refactoring the project structure and updating dependencies 2025-11-29 13:16:58 +08:00

Qwen Code Companion

Version VS Code Installs Open VSX Downloads Rating

Seamlessly integrate Qwen Code into Visual Studio Code with native IDE features and an intuitive chat interface. This extension bundles everything you need — no additional installation required.

Demo

Features

  • Native IDE experience: Dedicated Qwen Code Chat panel accessed via the Qwen icon in the editor title bar
  • Native diffing: Review, edit, and accept changes in VS Code's diff view
  • Auto-accept edits mode: Automatically apply Qwen's changes as they're made
  • File management: @-mention files or attach files and images using the system file picker
  • Conversation history & multiple sessions: Access past conversations and run multiple sessions simultaneously
  • Open file & selection context: Share active files, cursor position, and selections for more precise help

Requirements

  • Visual Studio Code 1.85.0 or newer (also works with Cursor, Windsurf, and other VS Code-based editors)

Quick Start

  1. Install from the VS Code Marketplace or Open VSX Registry

  2. Open the Chat panel using one of these methods:

    • Click the Qwen icon in the top-right corner of the editor
    • Run Qwen Code: Open from the Command Palette (Cmd+Shift+P / Ctrl+Shift+P)
  3. Start chatting — Ask Qwen to help with coding tasks, explain code, fix bugs, or write new features

Commands

Command Description
Qwen Code: Open Open the Qwen Code Chat panel
Qwen Code: Run Launch a classic terminal session with the bundled CLI
Qwen Code: Accept Current Diff Accept the currently displayed diff
Qwen Code: Close Diff Editor Close/reject the current diff

Feedback & Issues

Contributing

We welcome contributions! See our Contributing Guide for details on:

  • Setting up the development environment
  • Building and debugging the extension locally
  • Submitting pull requests

Terms of Service and Privacy Notice

By installing this extension, you agree to the Terms of Service.

License

Apache-2.0