Qwen Code Weekly: @ Mention to Reference Past Session Context, Background Agents Stay Resident After Completion, /learn Turns Videos into Reusable Skills
Qwen Code shipped v0.21.0 and v0.21.1 this week — 2 stable releases with 290+ PRs merged.
Two gaps in session and Agent lifecycle are now closed. Previously, reusing context from earlier conversations meant resume or fork — both interrupt your current conversation. Now type @ and the completion list shows past sessions from this project; select one and a read-only summary is injected while your current conversation stays independent. On the background Agent side, completed Agents used to be destroyed — asking a follow-up meant rebuilding from scratch. Now completed Agent runtimes stay resident in the parent session; send_message continues the conversation, and even after exiting and returning, the roster recovers them.
The skill system took a step beyond manual. /learn previously handled text, documents, and web pages — tutorial videos required you to watch them yourself and hand-write the skill. Now drop in an MP4 and the Agent watches it and distills a reusable Skill automatically. Skill directories no longer need duplicates either — configure a path in settings, and Claude Code, Codex, and Qwen Code share the same skill library.
Observability and integrations are catching up. /stats finally has TTFT, generation duration, and TPS — comparing streaming performance across models no longer relies on gut feel. The GitHub Channel adapter is live: @mention the bot in an Issue or PR and an Agent replies in the thread. Web Shell saw 40+ PRs this week: Git branch selector, commit dialog, create-PR flow, Channel management page, file render preview, voice input — all at once.
✨ New Features
/learn Supports Video Input: Turn a Tutorial Video into a Reusable Skill
Previously /learn handled text, documents, directories, and web pages — but not video. Had a 15-minute screen recording you wanted to turn into an Agent-usable skill? You’d watch it yourself and hand-write a SKILL.md.
Now /learn supports local MP4, WebM, MOV, and M4V files plus HTTP(S) direct video links. The command first checks whether the current model supports video input, then hands the video to the Agent for distillation, outputting a learned-skill-* directory containing SKILL.md and a timestamped references/source.md provenance record. YouTube page URLs are detected and rejected with a prompt to download as a local video first. Non-video input retains existing behavior.
What you can do with this:
- Turn a colleague’s screen recording directly into a team-reusable skill
- Watch a tutorial video, then
/learn tutorial.mp4to extract the steps in one command - Provenance records are labeled “source-grounded, not execution-verified” — distinguishing “watched” from “validated”
See PR #7497
@ Mention Past Sessions: Reference Prior Context Without Resuming or Forking
Previously, reusing context from an earlier session meant resume or fork. Resume leaves your current conversation; fork creates a new branch — both are too heavy for “I just want to reference a previous conclusion.”
Now type @ in the input box and the completion dropdown shows results categorized by All, Files, Sessions, MCP, and Extensions — use left/right arrow keys to switch categories. Select a past session and Qwen Code injects a deterministically generated read-only summary: user and assistant visible text is preserved, tool results are compressed to single-line status, the whole thing fits within an 8k token budget prioritizing the most recent content. Your current conversation is completely unaffected — the old session is neither resumed nor forked.
What you can do with this:
- Reference conclusions from a previous debugging session in your current task without switching back and forth
- Pass feedback from the last code review as context to a new task
- Accumulate project knowledge across sessions without re-explaining background every time
See PR #7302

Background Agent Persistence and Cross-Session Recovery: No Rebuild After Completion, Follow Up and Keep Going
Previously, background Agents destroyed their runtime on completion. Want to ask a follow-up? You’d rebuild chat, tools, registry, and provider cache from the JSONL transcript — slow, and all in-process state was lost. Worse, exit the process and restore the parent session, and completed Agents became Task not found.
Two PRs this week solved this together. First, completed background Agent runtimes now stay resident in the parent session — send_message to the same task_id reuses the live chat, prepared tools, provider cache, and launch-time model instead of rebuilding from transcript. Second, when you exit and restore the parent session, interrupted Agents return as paused and completed ones as completed, with task IDs unchanged. The new list_agents tool shows all addressable background Agents in the current session.
What you can do with this:
- Background Agent finishes a code review, you ask “expand on suggestion #3” — no rebuild needed
- Exit the terminal, come back the next day,
list_agentsshows yesterday’s Agents still there — pick up where you left off - During iterative refinement the Agent keeps its launch-time model, unaffected by parent session model switches
Custom Skill Directories: One Skill Set Shared Across Multiple Agents
Previously skills could only live in ~/.qwen/skills/. If you use both Claude Code and Qwen Code, the same skill set had to be duplicated — and forgetting to sync changes was the norm.
Now add a skills.directories array in settings.json specifying additional skill scan paths. Paths support ~ expansion and recursively scan for SKILL.md files. The default directory takes priority — same-name skills resolve to the default.
What you can do with this:
- Put one skill set in
~/.agent/skills— Claude Code, Codex, and Qwen Code all use it - Team shared skill library in
/shared/team-skills— everyone syncs automatically - Organize skills by project instead of cramming everything into one directory
See PR #7395

/stats Generation Performance Metrics: TTFT and TPS at a Glance
Previously /stats showed session duration, total requests, tool calls, and file changes. Want to compare streaming response speed between two models? No TTFT, no TPS — just gut feel.
Now /stats and the Session tab have a new Generation Metrics section: model name for the most recent request, TTFT (time to first token), generation duration, output token count and TPS, plus session-level timed request count, average TTFT, and weighted Session TPS. Generation duration is calculated as api_duration - ttft; TPS denominator spans first visible token to generation complete. Internal auxiliary prompts are excluded; daily/monthly usage records are unchanged.
What you can do with this:
- Switch models, run
/stats, and immediately see the TTFT and TPS difference - Compare streaming performance between local backends and cloud APIs
- Session-level weighted TPS reflects real throughput across the entire conversation
See PR #7677

GitHub Channel Adapter: @Mention the Bot in Issues and PRs to Trigger an Agent
Previously Qwen Code’s Channel supported Feishu, WeChat, QQ, and Telegram — but not GitHub. Want to @mention the bot in an Issue to look at a problem? Couldn’t.
Now the GitHub Channel adapter is live. Configure a classic PAT, start the Channel, and it polls the GitHub notifications API. @Mention the bot in an Issue or PR comment and the Agent reads the comment and replies in the same thread. @Mentioning in a new Issue body also triggers it (first contact). Deduplication is based on cursor comment windows rather than GitHub’s async markNotificationsAsRead; bot self-comments are filtered to prevent loops. GitHub Enterprise (via baseUrl config) and proxies are supported.
What you can do with this:
- @Mention the bot in an Issue: “help me look at this error” — the Agent replies directly in the comments
- @Mention the bot during PR review to add context — no need to switch to the terminal
- Polling interval is configurable (default 60s) — tune response speed as needed
See PR #7632

Web Shell Comprehensive Update: Git Operations, Channel Management, File Preview, Voice Input — All at Once
Web Shell had 40+ PRs merged this week — from Git workflow to Channel management to input experience, nearly every corner was touched.
Git operations are now a closed loop. Previously Web Shell could only view branches — no switching, no committing, no creating PRs. Now there’s a Git mode selector when creating sessions (#7471 ), in-session branch switching, a commit dialog, and direct PR creation (#7731 ). Worktree sessions can also open Changes and History dialogs (#7695 ). The sidebar gained a read-only GitHub PR panel (#7683 ) — check PR status without switching to a browser.
Channel management has a page. Previously configuring Channels meant manually editing settings.json. Now Web Shell has a full Channel management page (#7793 ) with configuration flow (#7893 ) and pairing request management (#7909 ).
File preview and Agent management. The file list supports render preview (#7467 ) — no need to click through to raw content. Sub-Agent sessions are visible in the detail panel (#7380 ), and background Agent status syncs in real time (#7561 ). A workspace selector (#7390 ) and native folder picker (#7849 ) make multi-project switching smoother.
Input experience. Voice input is scoped to the current composer workspace (#7754 ), supports push-to-talk mode (#7839 ), and mobile stability is fixed (#7806 ). Touch devices fall back to a plain textarea composer (#7587 ). Pasted content no longer gets lost (#7824 ). The terminal supports 256-color and truecolor SGR sequence parsing (#7620 ).
Other improvements. Sidebar can now stretch to half the window width (#7778 ), session names show full text on hover (#7662 ), Monitor tasks have a detail panel (#7817 ), and long session rendering performance is optimized (#7408 ). Shadow DOM isolation prevents host CSS from polluting component styles (#7551 ). Typing “BTW” suggests opening a side question (#7935 ).
📊 More New Features
Image zoom tool. Large images are downscaled before being sent to the model, often blurring small text and chart labels. Now models with image input support can use the zoom_image tool to crop a specified region from the original full-resolution file and return a magnified JPEG view. Supports PNG, JPEG, WebP with automatic EXIF orientation handling. See PR #7809
Subagent model tiers. Different tasks need different cost models, but callers shouldn’t touch specific model IDs. Now you can map semantic tiers like small and high to model selectors in settings — the Agent tool schema only exposes tier names. Forks and named teammates don’t accept this parameter. See PR #7702
Configurable image generation model. Image generation is no longer bound to the default model — specify it in configuration. See PR #7607
External corpus retrieval tool. New context_search MCP tool retrieves context on demand from external knowledge bases or RAG services. Read-only, no automatic recall, no writes — provider and corpus are admin-configured and fixed. Includes Mem0 and generic HTTP adapters. See PR #7586
System identity override. Override the core identity prompt via the QWEN_SYSTEM_IDENTITY_MD environment variable. See PR #7478
MCP force reconnect. qwen serve supports force-reconnecting MCP servers without restarting the entire process. See PR #7488
Workspace trust hot reload. After modifying workspace trust configuration, running daemons apply the new policy immediately — no restart needed. See PR #7268
Skill default-disabled state. Skills can be set to disabled by default but allow explicit enablement (soft default); hard disable cannot be overridden. See PR #7357
Session-scoped runtime MCP. ACP sessions support session-level runtime MCP configuration. See PR #7847
DingTalk image sending. DingTalk Channel supports sending image messages. See PR #7698
Telegram forum topic routing. Telegram Channel replies now route correctly to forum topics. See PR #7612
Review bilingual comments. When a PR description is in Chinese, /review posts review comments automatically in both Chinese and English. See PR #7564
OAuth login link optimization. OAuth login URLs now output as OSC 8 hyperlinks — click directly in the terminal to navigate. See PR #7255
VP selection copy preserves semantic text. When selecting and copying text in VP mode, semantic text is preserved rather than rendered formatting. See PR #7286
👏 Experience Improvements
Shift+Enter finally inserts a newline. In terminals like Ghostty where the Kitty protocol isn’t enabled, Shift+Enter was misidentified as Escape, triggering the conversation rollback prompt. CSI-u parsing is now fixed — Shift/Ctrl/Alt+Enter inserts newlines correctly in both VP and non-VP modes. Streaming Thinking block height no longer jitters either — the window only grows, never shrinks, no longer drifting with terminal height. See PR #7397
Large pastes no longer freeze. Previously pasting 260K characters triggered 260K per-character keypress events, blocking for ~1.7 seconds. Now bracketed paste markers are intercepted at the stdin layer and processed as a whole block — down to ~8ms. The footer shows a progress bar during paste (Pasting… ████████░░░░░░░░ 42% (128 KB)) with Ctrl+C to interrupt. See PR #6506
Configurable streaming retry delay. New retryInitialDelayMs and retryMaxDelayMs settings let you tune SSE streaming retry delays for specific provider quota windows. See PRs #7674 , #7666
TUI icon column alignment. All TUI icon columns are unified to 2-character width — no more ragged alignment. See PR #7633
Queued message display fix. Queued message display style and ordering corrected — no more misalignment. See PR #7381
/copy command fix. /copy with bare index and /copy <message> <index> code block selection both work correctly now. See PRs #7789 , #7883
Update check switched to npm view. Version update checking moved from update-notifier to npm view — more reliable. See PR #7528
IME cursor alignment. Input method cursor no longer misaligns after footer updates. See PR #7711
🔧 Important Fixes
| Fix | PR | What it means for you |
|---|---|---|
| Worktree isolation empty working_dir normalization | #7403 | Empty working_dir no longer causes errors when Agent tool sets isolation: worktree |
| qwen3.8-max and kimi-k3 image modality support | #7491 | These two models now handle image input correctly |
| Background Agent single-slot yield | #7258 | Background Agents correctly yield to foreground in single-slot mode |
| DashScope thinking required tool avoidance | #7661 | DashScope models no longer error on required tools in thinking mode |
| Fork subagent discoverability | #7460 | Forked sub-Agents can now be correctly discovered and addressed |
| Tool result image bridging for text-only models | #7484 | Text-only models no longer crash when receiving images in tool results |
| 429 quota exhaustion fast fail | #7842 | Permanent quota exhaustion 429s no longer silently retry — they error immediately |
| Transient network error auto-retry | #7898 | Transient network errors during API calls auto-retry, reducing manual reruns |
| Gitignore pattern handling | #7763 , #7764 , #7765 | Leading spaces, trailing slashes, and backslash-escaped gitignore rules are now parsed correctly |
| splitCommands quote handling | #7526 , #7870 | Backslashes inside single quotes and quotes inside command substitutions no longer misparse |
| sed pattern safety rejection | #7775 , #7790 | Bracket expressions starting with ] and combined flags where -i isn’t last are safely rejected |
| Grep leading dash | #7863 | Search patterns starting with - are no longer mistaken for options |
| Cron step day-field semantics | #7464 | Step day fields now match Vixie cron semantics |
| Usage protection on session deletion | #7425 | Usage data no longer lost when deleting sessions |
| Nested background request rejection | #7593 | Nested background Agent requests are correctly rejected |
| Reasoning effort disabled persistence | #7541 | Disabled reasoning effort settings no longer get unexpectedly reset |
| System rg fallback | #7203 | Automatically falls back to system rg when built-in ripgrep can’t run |
| Plan exit notification | #7682 , #7744 | Model receives notification when user manually exits plan mode |
| Extension Agent immutability | #7245 | Extension-provided Agents no longer overwritten by unexpected updates |
| Inline math recognition | #7701 , #7741 | Single-character math expressions, escaped dollar signs, and math content in code spans are now correctly recognized |
👥 Contributors
| Contributor | Contributions | PR Links |
|---|---|---|
| @wenshao | autofix enhancements (stale base recovery, infra retry, bilingual reports), review enhancements (mutation test, lens borrowing, script-lint gate), Web Shell Git operations (branch selector, commit dialog, PR panel), triage hardening | #7482 , #7564 , #7731 , #7683 |
| @chinesepowered | Daemon security (secret cleanup, env isolation), core tool safety (sed/grep/gitignore/splitCommands fixes), SDK validation hardening, OpenAPI conversion fix | #7256 , #7527 , #7763 , #7863 |
| @ytahdn | Web Shell core development (file preview, Shadow DOM isolation, sub-Agent panel, long session performance, Channel management, voice input, mobile adaptation) | #7467 , #7551 , #7380 , #7408 |
| @doudouOUC | Telemetry ARMS alignment, startup performance (undici/GenAI SDK lazy loading, ACP deferred init), serve reliability (epoch cursor, SSE hardening), SDK-Java daemon transport | #7536 , #7455 , #7458 , #7463 |
| @yiliang114 | CI/release fixes, model image modality support, serve race fix, update check improvement, subagent model tiers, release script hardening | #7491 , #7556 , #7702 , #7528 |
| @qqqys | Goal v3 full suite (state protocol, evidence verification, runtime orchestration, worker tools, persistence replay), Channel infrastructure (workspace config, lifecycle, management API, daemon loop), image generation model config | #7517 , #7664 , #7637 , #7607 |
| @chiga0 | Shift+Enter newline fix, Thinking block flicker fix, VP copy semantic text, queued message display, TUI icon alignment, ink patch fix, network error retry | #7397 , #7286 , #7381 , #7898 |
| @DragonnZhang | Background Agent persistence, roster recovery, fork subagent discoverability, usage persistence, system prompt layered construction, Anthropic cache breakpoint | #7426 , #7459 , #7460 , #7912 |
| @qwen-code-dev-bot | Custom skill directories, DingTalk mention fix, plan mode fix, CI container fix, git branch polling | #7395 , #7473 , #7682 , #7830 |
| @ComplexSimply | Touch textarea composer, background shell state sidecar, output stream flush wait, insight local time | #7587 , #7669 , #7833 , #7670 |
| @zjunothing | Usage salvage hardening, Channel multi-task message fix, plan exit notification, plugin extension ID fix, plan file read | #7425 , #7608 , #7676 , #7678 |
| @patrick-andstar | Workspace selector init, nested background request rejection, ACP idle cancel fix, npm update cleanup | #7518 , #7593 , #7598 , #7539 |
| @LaZzyMan | /learn video input, @ past session reference, large paste performance, tool result image bridging | #7497 , #7302 , #6506 , #7484 |
| @hogeheer499-commits | Background Agent single-slot yield, Telegram forum topic routing, DashScope thinking fix, SSE retry delay | #7258 , #7612 , #7661 , #7666 |
| @destire-mio | Cron step day semantics fix, /stats generation performance metrics, extension Agent protection | #7464 , #7677 , #7245 |
| @OrbitZore | GitHub Channel adapter, senderId fix | #7632 , #7727 |
| @CubeLander | Inline math recognition fix, escaped dollar sign handling | #7701 , #7741 |
| @dreamWB | Locked workspace session operation fix, composer footer renderer | #7629 , #7856 |
| @mvanhorn | Worktree working_dir normalization, xterm diagnostic log silencing | #7403 , #7663 |
| @water-in-stone | Workspace selector button, IME cursor alignment | #7390 , #7711 |
| @jay666mnj | SSE retry delay config, transcript pagination regression test | #7674 , #7657 |
| @callmeYe | Daemon invocation context propagation, voice push-to-talk mode | #7279 , #7839 |
| @he-yufeng | Tool-call routing fix, release script retry hardening | #6981 , #7535 |
| @BZ-D | MCP force reconnect | #7488 |
| @ZijianZhang989 | Memory recall telemetry | #7393 |
| @yuanyuanAli | Web Shell renderChatHeader slot | #7553 |
| @tanzhenxin | Usage stats environment variable override | #7579 |
| @han-dreamer | Auto-memory index read logging | #7468 |
| @BenGuanRan | Channel explicit delivery | #7388 |
| 🆕 @ovochouovo | 🎉 First contribution: JSDoc param name alignment, multi-tool compact summary shows tool descriptions | #7492 , #7589 |
| 🆕 @Truraly | 🎉 First contribution: Empty working_dir placeholder ignore | #7343 |
| 🆕 @zjgzx1988 | 🎉 First contribution: QWEN_SYSTEM_IDENTITY_MD system identity override | #7478 |
| 🆕 @dtometzki | 🎉 First contribution: Update check switched to npm view | #7528 |
| 🆕 @WladmirJunior | 🎉 First contribution: Reasoning effort disabled persistence | #7541 |
| 🆕 @nerdalytics | 🎉 First contribution: npm shim false positive fix | #7545 |
| 🆕 @harjothkhara | 🎉 First contribution: System rg fallback | #7203 |
| 🆕 @PratikWayase | 🎉 First contribution: Terminal history pagination error persistence | #7709 |
| 🆕 @Sparkle6979 | 🎉 First contribution: Duplicate skill slash command completion | #7720 |
| 🆕 @VitaliBabkin | 🎉 First contribution: Safe-mode preserves caller MCP servers | #7827 |
| 🆕 @VectorPeak | 🎉 First contribution: heatmapDays parameter strict parsing | #7218 |
| 🆕 @Eric-GoodBoy-Tech | 🎉 First contribution: QQ Bot session recovery fix | #7722 |
| 🆕 @carffuca | 🎉 First contribution: BTW side question suggestion | #7935 |
| 🆕 @samuelhsin | 🎉 First contribution: Skill default-disabled state | #7357 |
| 🆕 @ZevGit | 🎉 First contribution: Virtualized terminal history enabled by default | #5738 |
| 🆕 @gauravyad86 | 🎉 First contribution: MCP OAuth callback hardening | #7510 |
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 !