Qwen Code Weekly: Auto Model Fallback, Nested Sub-agents, WeCom Channel Integration
Qwen Code shipped v0.19.6 through v0.19.8 this week — 3 stable releases with 150+ PRs merged, covering four major areas:
Model overload no longer kills your session. Previously, a 429/503/529 would break the conversation entirely — you had to manually switch models and resend. Now the fallback chain automatically switches to the next model in line once the primary model’s retry budget is exhausted. Combined with /model --project to bind different models to different projects, no manual switching needed.
Sub-agents can now spawn sub-agents. Previously, sub-agents were leaf nodes — they received a task and had to finish it themselves with no way to delegate further. Now with a default nesting depth of 5 levels, sub-agents can break subtasks down to the next layer. Both TUI and Web Shell show a tree structure so you can see exactly who spawned whom.
Web Shell session management is now a real system. Archive/delete/named groups/color labels/scheduled task management page/split-screen session overview — the session sidebar used to only let you switch between sessions, now you can organize, categorize, monitor, and operate in parallel. 7 PRs turned sessions from a flat list into a manageable resource.
WeCom and permission controls filled in. WeCom smart bot channel integration — just Bot ID + Secret, no need for enterprise admin privileges or callback setup. PreToolUse hook’s “ask” now actually shows a confirmation dialog; previously this option silently denied. Permission rules also support Tool(param:value) syntax for parameter-level granularity.
New Features
Auto Model Fallback + Project-level Model Config
When a model hits 429/503/529, your conversation gets stuck. This release adds an opt-in fallback chain — once the primary model exhausts its retry budget on the same model, it automatically switches to the next model in the fallback list. Only capacity and rate-limiting issues trigger the fallback path. Authentication, quota, configuration, and client errors fail immediately because those aren’t “model overload” — they’re “your config is broken.”
The fallback advances before any visible output reaches the user. If a fallback model has already streamed partial content and then dies, remaining fallbacks won’t be tried — you see a truncated response. But the next user turn starts fresh from the primary model, so you won’t get stuck on a fallback.
With /model --project, you can bind different models to different projects. --project writes to the project’s .qwen/settings.json, --global writes to the user’s ~/.qwen/settings.json. Without a flag, current behavior is preserved. Scope flags also apply to --fast, --voice, and --vision.
What you can do with this:
- Configure a fallback model list so overloaded models switch automatically — no manual model changes
- Auth/quota errors won’t be masked by fallback — problems surface sooner
/model --projectlets different projects use different models, config travels with the project/model --globalsets a global default that new projects inherit

Nested Sub-agent Spawning + Tree View
Sub-agents can now spawn their own sub-agents. Default depth limit is 5 levels, configurable via model.maxSubagentDepth. Set it to 1 to restore the old behavior where sub-agents cannot spawn children.
Two layers of protection: during schema preparation, the deepest sub-agents don’t see the agent tool (they have no idea it exists); at runtime, spawn requests beyond the depth limit are rejected.
Both TUI and Web Shell display the nested tree structure. Sub-agents appear below their parent with a ↳ marker and indentation. When a parent exits, its children are promoted to root nodes with a “from <parent>” annotation. The detail view shows “Level N · from <parent type>”. Blocking labels and stop confirmations are now chain-aware — the confirmation prompt only appears if a cancellation would cause the turn to end.
This capability is on by default — after upgrading, all existing environments gain nesting. Fork subprocesses, teammates, and workflow agents remain excluded. Arena sessions can now nest. Background agents restore their original depth and startup cap on resume.
What you can do with this:
- Let sub-agents handle complex tasks by spawning their own children for subtasks
- See the full agent tree in both TUI and Web Shell
- Adjust nesting depth via
model.maxSubagentDepth

Web Shell Session Management: Archive, Groups, Scheduled Tasks, Split Screen
7 PRs transformed the Web Shell session sidebar from a flat list into a panel you can organize, categorize, monitor, and operate in parallel.
Archive and delete. Each session row now has quick actions and a ”…” overflow menu (rename/archive/delete). Archived sessions collapse into a foldable “Archived” section and can be restored or permanently deleted. Active sessions cannot be archived or deleted; archived sessions can’t be opened (409 session_archived); deletion is hard delete with a confirmation prompt. Under the hood this uses the daemon’s archiveState and /sessions/archive, /sessions/unarchive endpoints.
Named groups and color labels. Create, rename, and delete groups; drag sessions into them; apply color labels and pin/archive states. Group data flows from the daemon layer through to the UI — daemon-side project-level sidecar files store group metadata, REST/ACP routes provide CRUD operations, exposed based on client capability gates.
Session overview and split screen. On larger screens, a session overview panel appears in the sidebar showing all sessions as live cards sorted by priority: approvals needed first, then running, then idle. Each card shows the current model and client count. Multi-select enables split-screen viewing — either within the current tab or in a new browser tab (?split=a,b URL parameter). N independent chat panels side by side, each with its own session context; keyboard focus only affects the clicked panel.
What you can do with this:
- Archive and organize long-running sessions by project, with color labels
- Visually create and manage scheduled tasks without writing cron expressions
- Each scheduled task has its own session with accessible run history and transcripts
- Split-screen on large displays to monitor multiple sessions in real time
See PRs #6293 , #6350 , #6305 , #6348 , #6389 , #6453 , #6400
WeCom Channel Integration
Integrated WeCom smart bot via @wecom/aibot-node-sdk. Configuration only requires Bot ID and Secret — no Corp ID, Agent ID, callback Token, EncodingAESKey, or public callback URL needed.
Receives messages over a WebSocket long connection, supporting text, voice transcription, mixed text+image, images, files, videos, and quoted content. Assistant replies are sent in WeCom markdown format. Outbound only supports local image markers (within the channel’s temp directory); file/video/voice markers are ignored.
Configuration:
{
"type": "wecom",
"botId": "your-bot-id",
"secret": "your-secret",
"cwd": "/path/to/project"
}Start command: qwen channel start my-wecom
What you can do with this:
- Connect WeCom with just Bot ID + Secret — no enterprise admin privileges needed
- Receive text, voice, images, files, videos, and quoted messages
- Have Qwen Code reply in markdown format in WeCom group chats
See PR #6436

Native Confirmation Dialog for PreToolUse Hook
Previously, PreToolUse hook returning permissionDecision: "ask" was equivalent to “deny” — no confirmation dialog ever appeared. Hook developers assumed users would see a choice, but the request was silently denied.
Now “ask” triggers a native TUI confirmation dialog. Options are “Yes, allow once” and “No, suggest changes” — there’s no “always allow” because the hook re-evaluates on every invocation. Approval re-executes the tool; denial cancels it.
In non-interactive CLI and background agent contexts, “ask” falls back to deny — it won’t hang waiting for input. Reuses the existing awaiting_approval mechanism without introducing a separate path. “denied” and “stop” behavior is unchanged; PermissionRequest hooks are unaffected.
What you can do with this:
- Use “ask” in PreToolUse hooks to let users decide whether to execute a tool
- No risk of hanging in non-interactive contexts
- Hook re-evaluates every invocation — no permanent pass-through
See PR #5629

Auto-generated Skills Preview Review
When agents auto-generate skills, previously you could only see the filename and had to accept before reading the contents. Now the review dialog shows an inline preview of the full content — including frontmatter.
Model-generated content is sanitized: ANSI/VT control sequences become harmless escapes, CRLF becomes regular newlines. Read limit is 64 KiB, display limit is 12 lines (with word-wrap calculation), overflow is marked with “lines hidden” / “truncated”.
Press o to open the skill file in your configured editor without skipping the current skill review. Preview auto-refreshes after saving — works well with GUI editors (default behavior on macOS) so you can edit and review side by side.
The “Turn off auto-generated skills” option appears last in the list, takes effect immediately (no restart needed), and persists at the workspace level. The current batch is shelved (not deleted) and returns when you re-enable via /memory.
What you can do with this:
- See full skill contents before confirming — no need to accept first and then dig through files
- Press
oto edit skill content directly in your editor; preview refreshes on save - One-click to disable auto-generated skills; current batch is preserved and recoverable via /memory
See PR #6393
| Before (global qwen 0.19.6) — name + description only | After — single-skill review with inline preview and turn-off option |
|---|---|
| After — last batch item, bulk options hidden | After — “Turn off auto-generated skills” selected |
|---|---|
More New Features
| Feature | PR | What it means for you |
|---|---|---|
| Daemon status dashboard: view runtime status, time-series metrics, and Token usage in the sidebar | #6272 , #6307 , #6388 | Health and trends at a glance — no CLI needed |
| maxSubAgents: limit parallel sub-agent count | #6354 | Control resource consumption, prevent runaway sub-agents |
| Tool(param:value) permissions: parameter-level tool access control | #6106 | Precisely block specific model/skill sub-agent spawning |
Stacked slash-skill invocations: /skill1 /skill2 execute in sequence | #6361 | Chain multiple skills without manual steps |
| tools.visible config: selectively expose deferred tools | #6372 | Only see the tools you need at startup |
| Configurable scheduled task expiry: cron/loop task expiration time | #6173 | Long-running scheduled tasks won’t expire unexpectedly |
| Hook state injection: Stop/SubagentStop hooks receive background task info | #6531 | Hooks can be aware of scheduled tasks and cron state |
| Permission mode badge: current permission shown at bottom in DEFAULT mode | #6498 | Confirm your security mode at a glance |
| Compact echarts data blocks: chart support in Web Shell | #6232 | Data visualization right in the terminal |
| MCP mentions + iconified @ references: Web Shell | #6279 | More intuitive @ references |
| Markdown table controls: column reorder/resize/freeze | #6444 | Better experience browsing large tables |
| LSP hot reload: language server hot reload support | #5953 | Config changes without restarting LSP |
| Channel memory intents: natural language channel memory | #6376 | More natural memory in channel contexts |
| /review quality gates: issue precision and root cause attribution | #6395 | More reliable review results |
| glob performance optimization: prune ignored directories during traversal | #6123 | Faster file search in large projects |
| Slash command discovery: taller menu, grouped counts, fuzzy search | #6267 | Find commands faster |
| Per-worktree auto-memory: independent memory per worktree | #6462 | Memories don’t bleed across branches |
| Agent working_dir: pin sub-agents to a worktree | #6456 | Sub-agents work in a specified directory |
| Extension hot reload: auto-reload on plugin changes | #6347 | No restart needed when editing plugins |
| dmPolicy: disable direct messages | #6521 | Channel bots only respond in group chats |
| Serve environment isolation: env isolation + total count control in serve mode | #6416 | Multi-project serve without interference |
| Multi-workspace session routing: serve supports multiple workspaces | #6511 | One serve instance, multiple projects |
| Per-tool-call timeout: individual tool call timeout | #6136 | A hung tool won’t drag down the entire session |
| Built-in dataviz skill: data visualization skill | #6198 | Out-of-the-box chart generation |
Important Fixes
| Fix | PR | What it means for you |
|---|---|---|
| Auth 401 fix: 401 no longer hangs after auth expiry | #6284 | Expired tokens no longer block sessions |
| OpenAI non-SSE detection: correctly identify non-streaming responses | #6466 | OpenAI-compatible endpoints no longer misdetected |
| Streaming scroll lock: no more scroll hijacking during streaming output | #6170 , #6421 | Scroll freely through history during long output |
| Windows pager fix: pager no longer crashes on Windows | #6390 | Stable Windows experience |
| qqbot security fix: channel security hardening | #6200 | QQ channel bot is more secure |
| Context window default 200k: corrected default value | #6387 | More accurate context window config |
| ACP settings race fix: settings read/write race condition | #6292 | Concurrent settings no longer error out |
| /clear unblock: /clear no longer gets stuck | #6499 | Clear command back to normal |
Contributors
| Contributor | Contributions | PR Links |
|---|---|---|
| @wenshao | Daemon status dashboard, time-series metrics, Token usage analysis, session archive/delete, session groups + color labels, scheduled task management page, scheduled task independent sessions, unified task sessions, session overview + split screen, slash command discovery, Agent working_dir, serve port auto-retry | #6272 , #6307 , #6388 , #6293 , #6350 , #6348 , #6389 , #6453 , #6400 , #6267 , #6456 , #6513 |
| @ytahdn | Session recovery, disable skill settings, custom @mention panel, session callbacks, virtual scrolling, tool details, stream interruption error handling, todo refresh, tool call summaries, external split-screen control | #6220 , #6223 , #6242 , #6333 , #6342 , #6352 , #6357 , #6362 , #6399 , #6422 , #6424 , #6425 , #6450 , #6523 |
| @yiliang114 | Model fallback chain, maxSubAgents, auth 401 fix | #6273 , #6354 , #6284 |
| @tanzhenxin | Nested sub-agent spawning, Web Shell tree view, auto-generated skills preview review, context window default fix | #6189 , #6239 , #6393 , #6387 |
| @doudouOUC | Daemon session organization backend, serve environment isolation, multi-workspace session routing | #6305 , #6416 , #6511 |
| @qqqys | WeCom channel integration, channel memory intents, channel loop tools, built-in dataviz skill | #6436 , #6376 , #6287 , #6198 |
| @DennisYu07 | Tool(param:value) permissions, stacked slash-skill invocations, permission mode badge, hook state injection | #6106 , #6361 , #6498 , #6531 |
| @LaZzyMan | Native confirmation dialog for PreToolUse hook | #5629 |
| @DragonnZhang | /review quality gates | #6395 |
| @Alex-ai-future | Project-level model config /model —project | #6060 |
| @VectorPeak | OpenAI non-SSE detection fix | #6466 |
| @han-dreamer | Windows pager fix | #6390 |
| @MikeWang0316tw | Streaming scroll lock fix | #6170 , #6421 |
| @water-in-stone | LSP hot reload | #5953 |
| @ZijianZhang989 | Extension hot reload | #6347 |
| @BZ-D | MCP mentions + iconified @ references | #6279 |
| @jifeng | Markdown table controls (column reorder/resize/freeze) | #6444 |
| @zhangxy-zju | Compact echarts data blocks | #6232 |
| @Eric-GoodBoy-Tech | qqbot security fix | #6200 |
| @TianYuan1024 | Configurable scheduled task expiry | #6173 |
| @callmeYe | 🎉 First contribution: session memory forgetting/dreaming, scheduled task timeline UI, user-managed memory | #6227 , #6386 , #6432 |
| @kagura-agent | 🎉 First contribution: prompt-cache tools prefix retention, foreground concurrency cap, skill scan caching | #6225 , #6300 , #6155 |
| @Aleks-0 | 🎉 First contribution: tools.visible config, UTF-8 cmd.exe, KV-cache | #6372 , #6216 , #6420 |
| @Nas01010101 | 🎉 First contribution: request timeout, @-attached files | #6288 , #6295 , #6324 |
| @zjunothing | 🎉 First contribution: per-worktree auto-memory, /clear unblock, status line jitter fix | #6462 , #6499 , #6533 |
| @minmax | 🎉 First contribution: glob performance optimization, per-tool-call timeout | #6123 , #6136 |
| @pomelo-nwu | 🎉 First contribution: PR gate hardening, review suggestion routing | #5723 , #5786 |
| @chiga0 | 🎉 First contribution: session artifact API, daemon side-channel docs | #5895 , #4511 |
| @gauravyad86 | 🎉 First contribution: bootstrap fast path, transform_data isolation | #6188 , #6285 |
| @mvanhorn | 🎉 First contribution: macOS seatbelt config path, streaming idle timeout defaults | #6172 , #6107 |
| @AmariahAK | 🎉 First contribution: vision model selection | #6209 , #6236 |
| @barry166 | 🎉 First contribution: VSCode authentication, audio prebuild | #6274 , #6275 |
| @chenghuichen | 🎉 First contribution: dmPolicy to disable direct messages | #6521 |
| @beantownbytes | 🎉 First contribution: disable qwen thinking for non-DashScope environments | #6271 |
| @heyparth1 | 🎉 First contribution: context window calculation fix | #6266 |
| @tomsen-ai | 🎉 First contribution: parameterless tool invocation | #6250 |
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 !