Skip to Content
BlogUpdates07-23 Product Update

Qwen Code Weekly: Real-Time Steering to Correct Agent Direction Mid-Stream, Worktree Isolated Sessions for Conflict-Free Parallelism, Built-in web_search Returns

Qwen Team
2026-07-23

Qwen Code shipped v0.19.12, v0.20.0, and v0.20.1 this week — 3 stable releases with 220+ PRs merged.

Agent going off track? Just type to correct it. Press Enter while the model is streaming and your message steers the current turn at the next sampling boundary; press Ctrl+Q to defer it to the next turn. Messages typed during tool execution also take effect. No more waiting for the Agent to finish before correcting it.

Parallel tasks finally stop fighting each other. Web Shell now supports one-click Worktree isolated sessions — multiple tasks in the same repo each run in their own git worktree, so file edits, git add, and git checkout never interfere. A purple ⑂ badge runs through the git chip, session list, and workspace dropdown.

Web search is back. The built-in web_search tool is powered by the Bailian Responses API — just use your existing Bailian API key to search. The community kept asking for it after it was removed; this time it’s reimplemented with server-side search + page reading, and responses automatically include a Sources section with citation links. Off by default — you must explicitly enable it.

web_fetch rebuilt from scratch. Previously, fetching web pages would drop links, turn PDFs into garbled text, and truncate large pages so the answer got lost. Now HTML is converted to markdown before truncation, PDFs get inline text extraction, binary files are saved correctly, and there’s a 60-second timeout with a 10 MB cap for protection.

✨ New Features

Real-Time Steering: Type to Correct the Agent While It’s Still Streaming

Previously, if you typed something while the Agent was streaming, you had to wait for it to finish before your message could be sent as a new prompt. If the Agent was heading in the wrong direction, all you could do was watch it finish and then correct it.

Now Enter and Ctrl+Q have clearly defined roles:

  • Enter: Your message enters the steering queue and takes effect at the next model sampling boundary — still within the current turn. If the Agent is writing code and you type “rewrite in TypeScript”, it receives that guidance at the next sampling point.
  • Ctrl+Q: Your message is deferred until the current turn ends, becoming the opening of a new conversation turn.
  • During tool execution: Messages you type are consumed after the tool result returns, within the same turn.
  • Changed your mind? Press Up or Escape and the queued message returns to the input box.

@ attachments are preserved alongside the message — no synthetic prefix is added. If delivery fails or is cancelled, the message is never lost.

What you can do with this:

  • Agent writing code in the wrong direction? Type to correct it without waiting for it to finish
  • Add context while a tool is still running
  • Queue up your next question with Ctrl+Q — it sends automatically when the current turn ends

See PR #7090 

Worktree Isolated Sessions: Parallel Tasks Run Independently

Working on two tasks in the same repo simultaneously — one session edits a file and the other’s git status goes haywire. Previously you had to manually git worktree add + cd; now it’s one click in Web Shell.

Click “New Worktree Task” in the workspace branch pill dropdown, and the daemon automatically creates a git worktree at <repoRoot>/.qwen/worktrees/<slug>, switching the session’s working directory to the worktree. The entire UI uses a purple ⑂ badge for distinction: the git chip turns purple, the session list shows a ⑂ marker, and the workspace dropdown includes an explanation. This option doesn’t appear for non-git repos.

Worktree info is persisted to a sidecar file and survives daemon restarts. When restoring a session, worktree isolation is automatically rebuilt, and the status bar shows the worktree branch name instead of the main workspace branch.

What you can do with this:

  • Run two feature branches simultaneously without interference
  • Fix a bug while continuing a feature — no more stash juggling
  • Let the Agent make experimental changes in an isolated environment while keeping your main workspace clean

See PRs #7221 , #7262 , #7365 , #7367 

Built-in web_search: Web Search with Just Your Bailian Key

Previously Qwen Code had no built-in search — the docs told you to configure the Bailian WebSearch MCP. But in practice, that MCP couldn’t handle complex queries — a Medicare rate lookup with a definitive answer returned 0/5 relevant results across multiple MCP runs.

This week the built-in web_search tool is back. Powered by server-side search via the Bailian Responses API, it uses your already-configured Bailian API key — no extra MCP server, no extra provider, no extra key. The search agent opens result pages for more grounded answers, distinguishing between “pages actually read” and “candidate links not opened.” The model must append a Sources citation section at the end of its response.

Off by default — two configuration items are required to enable it: tools.webSearch.enabled: true and a search model tools.webSearch.model. If configured but not paired correctly, the tool stays disabled and startup tells you exactly which condition isn’t met. Pure environment variable configuration is also supported (ENABLE_WEB_SEARCH, WEB_SEARCH_MODEL, etc.) for environments where you can’t write settings.json. Each search call requires confirmation (shows the query, with an “always allow” option).

What you can do with this:

  • Look up time-sensitive info: latest version changes for a library, API doc updates, security advisories
  • Investigate issues after the model’s knowledge cutoff: breaking changes in new versions, recent bug reports
  • Replace the workflow of leaving the terminal to search in a browser

See PR #7215 

Previously web_fetch had several real-world problems: large listing pages were truncated on raw HTML before conversion, cutting off the answer; all link URLs were lost, and the model confidently told you “the target doesn’t exist.” PDFs were decoded as text, producing tens of thousands of tokens of garbled output. Certain government sites returned 403 for anonymous User-Agents.

This week the entire pipeline was rebuilt from scratch:

  • HTML is converted to markdown before truncation — content deep in large pages is preserved, and all hyperlinks retain their URLs. Truncation has an explicit marker; scripts and styles don’t consume the content budget.
  • PDF inline text extraction — a single web_fetch call can answer questions about PDF content. Binary files are identified via magic bytes (not just Content-Type) and saved with the correct extension.
  • 60-second timeout + 10 MB cap — press Esc to cancel the transfer immediately (previously the UI could freeze). Repeated fetches of the same URL within 15 minutes are served from cache.
  • Cross-host redirects are no longer silently followed — you’re prompted to re-issue the request through the normal permission flow.
  • Permission model: First access to each host requires confirmation (GET exposes the full path and query, which is a data exfiltration channel). Once approved, it persists as a per-host rule. GitHub blob URLs are automatically normalized to raw addresses before permission evaluation.

What you can do with this:

  • Fetch a PDF link and get answers about its content directly
  • Fetch a long listing page and ask about entries deep in the page — links are no longer lost
  • Cross-host redirects prompt you to re-issue instead of silently following to an unfamiliar domain

See PR #7146 

Web Shell: A Big Week of Updates

Web Shell had a massive amount of changes this week — from git integration to session management to workspace experience. Here’s the roundup.

Git integration trifecta. The /log command opens a commit history browser — a graphical popup showing the commit list; click to expand for the full message and file change stats, one-click SHA copy, with paginated loading. The /diff popup also gained a History tab so you don’t need to switch commands. A git status chip appears in the composer toolbar, the sidebar shows workspace git status, and the Changes popup displays a visual working-tree diff. See PRs #7204 , #7054 

Skill management page and Goals page. Web Shell now has a dedicated skill management page — view and manage workspace skills without going back to the terminal. The Goals page visualizes /goal targets in Web Shell, and goals survive daemon restarts. See PRs #7018 , #6561 

Session management improvements. Cmd+B / Ctrl+B toggles the sidebar, split view layout persists across refreshes (per tab), restored session history supports paginated loading instead of pulling everything at once, and archived sessions support export. The Add Workspace popup now has directory autocomplete. See PRs #7135 , #7136 , #7064 , #6910 , #7125 

Workspace experience. Custom workspace display names — no more staring at paths in multi-workspace setups. Custom slash command actions, sidebar customization API (branding, navigation, session actions, footer). New topic drafts suggest opening a new session instead of continuing in an old one. See PRs #7179 , #7267 , #7379 , #7098 

📊 More New Features

Artifact defaults and write confirmation. Agent now has default configuration when creating artifacts, with a confirmation prompt before writing — fewer accidental file writes. See PR #7068 

Tool summary shows active file path. Compact tool summaries now display the file path being operated on — instantly see which file is being modified during multi-file operations. See PR #7043 

Sub-agent delegation defaults and guardrails. Improved default configuration and safety boundaries for sub-agent delegation — sub-agent behavior is more predictable. See PR #7048 

VSCode log routing. Logs output to a dedicated Qwen Code Companion output channel — troubleshooting in VSCode without digging through other panels. See PR #7121 

Daemon log rotation. Bounded log rotation — no more infinite growth; daemon logs won’t fill your disk. See PR #6969 

WebShell read-only history replay. Replay ChatRecord history in a read-only WebShell — easily share session records with colleagues. See PR #6999 

MCP tool name normalization. Normalizes MCP tool names for strict providers — fewer MCP tool call failures. See PR #6976 

Channel memory recall. Each message automatically recalls relevant memories, confirms natural memory changes, and safely saves multi-fact memories — the Agent remembers prior context in Channel conversations. See PRs #7157 , #7066 , #7092 

Channel group name observation. Automatically picks up group names from inbound messages — in multi-group scenarios the Agent knows which group it’s in. See PR #7155 

Formatted paths in tool descriptions. Tools like grep/glob now display formatted file paths in their descriptions — results are clearer and more readable. See PR #7050 

/cd tab completion enhancement. Pressing tab after typing a directory name now includes the typed directory — more accurate completions. See PR #7320 

👏 Experience Improvements

VP mode mouse selection is back. Previously mouse events in VP mode were consumed by the CLI — you couldn’t select and copy. Now drag to select, double-click to select a word, triple-click to select a line; releasing automatically copies to clipboard. See PR #6937 

Plan mode security hardening. Exiting Plan mode now requires your explicit approval — no more silent exits. Shell commands in Plan mode are classified by safety: read-only commands execute normally, state-modifying commands are blocked outright, and ambiguous commands require per-command approval without exiting Plan mode. The exit confirmation shows the full plan content. See PRs #6967 , #7172 , #7060 

Output language auto-follow. When set to auto, output language follows the user’s input language — no more manual switching. See PR #6953 

Ctrl+C accidental exit prevention. Exiting the TUI now requires pressing Ctrl+C twice within 1 second — a single press no longer quits. See PR #7129 

Sub-agent concurrency control. Supports per-model sub-agent concurrency limits — different models can have different concurrency caps. Fork sub-agents gained a fork_turns parameter to inherit only the most recent turns instead of the full history. See PRs #6984 , #7346 

Model adaptations. kimi-k3 token limits (1M context, 128K output), qwen3.8-max-preview added to the Token Plan model list, Singapore Token Plan region support. See PRs #7144 , #7199 , #7280 

Other improvements. Per-turn tool call cap is now adaptive, headless mode supports context-inheriting sub-agents, active loops can use goal control, streaming output shows a mode indicator, npm updates run safely in the background. See PRs #7052 , #7378 , #7202 , #7219 , #7322 

🔧 Important Fixes

FixPRWhat it means for you
TUI auto-redraws after system sleep/wake#7265 UI no longer garbled after waking
Cancelled operations during permission prompts no longer lost#7295 Cancelled operations don’t vanish
Cancelled prompts after streaming restore to input box#7149 No need to retype cancelled prompts
Streaming code blocks stay intact when split across commits#7020 Code blocks no longer truncated
Sticky task panel hidden when Agent is idle#7062 Cleaner interface
Update check failure downgraded to warning#7409 Offline startup no longer errors out
Correct reasoning token estimation when completion_tokens_details is missing#7239 More accurate token usage stats
qwen3.8 side query works on Bailian#7303 Bailian users’ side queries no longer fail
web_fetch post-processing has boundary limits#7305 Already-fetched content preserved on failure
Existing work content preserved in system prompt#7087 System prompt no longer loses existing content
Empty tool-result auto-retry#7039 Model returning empty results no longer stalls
Relaxed OpenAI wire additionalProperties restriction#7344 Broader model compatibility
Subagents created after startup no longer rejected by stale cache#7112 Subagent creation no longer occasionally fails
Malformed duplicate thinking tag auto-retry#7100 Model thinking format anomalies no longer crash
Plan mode entry boundary hardening#7248 Plan mode can’t be entered accidentally
Artifact paths resolve correctly in Worktree sessions#7429 Artifacts no longer written to wrong location in Worktree
MCP discovery timeout kills child process#6926 No more leaked processes
MCP opt-in model payload filtering#7413 Reduced unnecessary payload transfer
Desktop MCP permission request lifecycle hardening#7013 Pending prompts no longer hang or leak
VSCode ACP process retains Electron Node mode#7106 VSCode extension no longer fails due to Node version
Root symlinks in memory paths resolve correctly#6842 Symlink paths no longer error
enableManagedAutoMemory setting takes effect correctly#6941 Auto-memory toggle no longer broken
Web Shell restored images and sidebar shortcut deduplication#7169 No more duplicate items
Web Shell approval and question popups support keyboard#7074 Keyboard-operable popups
Web Shell restored prompt text no longer stacks#7134 No more duplicate copies
Worktree sessions open correctly while running#7424 Worktree sessions no longer fail to open
Web Shell daemon token persisted per tab#7374 No re-authentication after refresh
Channel background agent replies delivered correctly#7336 Background replies no longer lost
Channel pairing and allow-list isolated per workspace#7065 Multiple workspaces no longer interfere
DingTalk transient emotion failure auto-retry#7329 Emoji reactions no longer occasionally fail
DingTalk @mention regex anchored to text start#7401 @mention no longer false-matches
DingTalk media download size limit 50 MB#7361 Aligned with Feishu; large files no longer fail

👥 Contributors

ContributorContributionsPR Links
@wenshao Worktree isolated sessions, Git commit history browser, git status chip + diff, Worktree session restore, multiple Web Shell improvements#7221 , #7204 , #7054 , #7262 
@doudouOUC Plan mode exit approval, Plan mode Shell safety routing, Daemon log rotation, session branch check, multi-workspace hardening#6967 , #7172 , #6969 , #7185 
@yiliang114 Multimodal whole-turn routing, npm background update, reasoning token estimation, qwen3.8 support, model routing fixes#7045 , #7322 , #7239 , #7303 
@zjunothing VP mode mouse selection, Cmd+B sidebar toggle, directory autocomplete, Plan full display, multiple Web Shell fixes#6937 , #7135 , #7125 , #7060 
@chinesepowered SDK SSE cleanup, multiple typo fixes, i18n corrections, DingTalk media limit#7257 , #7057 , #7131 , #7361 
@tanzhenxin Built-in web_search, web_fetch full rebuild, kimi-k3 token limits, ask-user-question fix#7215 , #7146 , #7144 , #7063 
@qwen-code-dev-bot Sub-agent concurrency limits, Channel memory recall, goal control, mode indicator, multiple CI fixes#6984 , #7157 , #7202 , #7219 
@ytahdn Skill management page, custom slash commands, sidebar customization API, Web Shell fixes#7018 , #7267 , #7379 , #7294 
@qqqys Channel memory confirmation, multi-fact memory saving, background agent reply delivery, DingTalk fixes#7066 , #7092 , #7336 , #7401 
@chiga0 Artifact defaults and write confirmation, VP mode control optimization, ink patch fix#7068 , #6931 , #7407 
@LaZzyMan Real-time steering, Auto Mode classifier fallback prompt, MCP payload filtering, mobile-mcp fix#7090 , #7331 , #7413 , #7321 
@DragonnZhang Sub-agent delegation guardrails, fork_turns, headless sub-agent, system prompt fix#7048 , #7346 , #7378 , #7087 
@han-dreamer Output language auto-follow, Singapore Token Plan region, managedAutoMemory fix#6953 , #7280 , #6941 
@callmeYe Extension tag localization, voice settings fix, skill description preservation, tag icon fix#7337 , #7345 , #7032 , #7024 
@samuelhsin Workspace display names, session-info aggregation endpoint#7179 , #7077 
@BenGuanRan Channel workspace contacts, group name observation#7109 , #7155 
@mvanhorn Desktop MCP permission hardening, stdout resize listener fix, connection error cause exposure#7013 , #7186 , #7010 
@morluto MCP discovery timeout child process kill, permission path normalization#6926 , #6923 
@barry166 Cancelled prompt restore, deferred stream-json startup warning#7149 , #7174 
@xurik Channel daemon sourceId tagging, session source labels#7078 , #6991 
@ZijianZhang989 CLI docs correction, Feishu markdown limit, batch fixes#7326 , #7324 , #7373 
@pomelo-nwu CODEOWNERS core modules, simplified to package-level rules#7304 , #7376 
@jordimas Catalan translation update#7253 
@cxruan WebShell read-only history replay, dangling tool history tagging#6999 , #7340 
@carffuca New topic draft suggestion, toolbar label clipping fix#7098 , #7196 
@dreamWB Context tag restore fix#7312 
@BZ-D Scheduled task reference interaction fix#7313 
@ran411285752 MCP tool name normalization#6976 
@yuanyuanAli Sidebar customization API#7379 
🆕 @azurecgx 🎉 First contribution: TUI MaxSizedBox line count and show-more diff fix#6957 
🆕 @makwingchi 🎉 First contribution: Daemon prompt ID propagation to turn events#7082 
🆕 @ARE404 🎉 First contribution: Sub-agent model metadata persistence#7104 
🆕 @ghisguth 🎉 First contribution: Gemma 4 native tool-calling schema adaptation#7177 
🆕 @ComplexSimply 🎉 First contribution: Update check failure downgraded to warning, timeout raised to 5s#7409 

Upgrade: Run npm i @qwen-code/qwen-code@latest -g to upgrade to the latest version.

If you have questions or feedback, feel free to open an issue on GitHub Issues !

Last updated on