<!-- qwen-release-notes:v1 -->
## 亮点
_详见下方的完整变更列表。_
## 破坏性变更
暂无已知的破坏性变更。
## 完整变更列表
### 新功能
- feat(web-shell):在 Composer 工具栏中添加带有添加/切换下拉菜单的工作区选择按钮 ([#7390](https://github.com/QwenLM/qwen-code/pull/7390)) by @water-in-stone
- feat(web-shell):在详情面板中显示子代理会话 ([#7380](https://github.com/QwenLM/qwen-code/pull/7380)) by @ytahdn
- feat(web-shell):添加渲染后的文件预览 ([#7467](https://github.com/QwenLM/qwen-code/pull/7467)) by @ytahdn
- feat(core):添加记忆召回投递遥测 ([#7393](https://github.com/QwenLM/qwen-code/pull/7393)) by @ZijianZhang989
- feat(core):保持已完成的后台代理常驻 ([#7426](https://github.com/QwenLM/qwen-code/pull/7426)) by @DragonnZhang
- feat(serve):支持强制 MCP 重连 ([#7488](https://github.com/QwenLM/qwen-code/pull/7488)) by @BZ-D
- feat(prompts):允许通过 QWEN_SYSTEM_IDENTITY_MD 覆盖核心身份 ([#7478](https://github.com/QwenLM/qwen-code/pull/7478)) by @zjgzx1988
- feat(autofix):若 PR 连续 N 次推送失败则停止 ([#7482](https://github.com/QwenLM/qwen-code/pull/7482)) by @wenshao
- feat(core):恢复后台代理名单 ([#7459](https://github.com/QwenLM/qwen-code/pull/7459)) by @DragonnZhang
- feat(cli):通过设置支持自定义技能目录 ([#7395](https://github.com/QwenLM/qwen-code/pull/7395)) by @qwen-code-dev-bot
- feat(cli):复制 VP 选区时保留语义文本 ([#7286](https://github.com/QwenLM/qwen-code/pull/7286)) by @chiga0
- feat(web-shell):添加选择性 Shadow DOM 隔离 ([#7551](https://github.com/QwenLM/qwen-code/pull/7551)) by @ytahdn
- feat(web-shell):添加用于自定义会话头部的 renderChatHeader 插槽 ([#7553](https://github.com/QwenLM/qwen-code/pull/7553)) by @yuanyuanAli
- feat(serve):添加工作区级生成 ([#7552](https://github.com/QwenLM/qwen-code/pull/7552)) by @ytahdn
- feat(serve):持久化工作区频道配置 ([#7514](https://github.com/QwenLM/qwen-code/pull/7514)) by @qqqys
- feat(core):传播受信任的守护进程调用上下文 ([#7279](https://github.com/QwenLM/qwen-code/pull/7279)) by @callmeYe
- feat(cli):当 PR 描述为中文时,双语发布审阅内容 ([#7564](https://github.com/QwenLM/qwen-code/pull/7564)) by @wenshao
- feat(autofix):自动重试一次因基础设施问题失败的检查 ([#7562](https://github.com/QwenLM/qwen-code/pull/7562)) by @wenshao
- feat(core):使 GenAI 遥测与 ARMS 对齐 ([#7536](https://github.com/QwenLM/qwen-code/pull/7536)) by @doudouOUC
- feat(web-shell):添加工作区代理管理 ([#7572](https://github.com/QwenLM/qwen-code/pull/7572)) by @ytahdn
- feat(autofix):当门禁拒绝落后于 main 的修复时,更新过时的基础分支 ([#7595](https://github.com/QwenLM/qwen-code/pull/7595)) by @wenshao
- feat(sdk-java):添加守护进程传输 ([#7463](https://github.com/QwenLM/qwen-code/pull/7463)) by @doudouOUC
- feat(autofix):自动更新仅因过时且已修复的基础分支而变红的 PR ([#7554](https://github.com/QwenLM/qwen-code/pull/7554)) by @wenshao
- feat(autofix):自动恢复停留在过时基础分支上的 PR ([#7602](https://github.com/QwenLM/qwen-code/pull/7602)) by @wenshao
- feat(core):添加 Goal v3 状态协议 ([#7517](https://github.com/QwenLM/qwen-code/pull/7517)) by @qqqys
- feat(daemon):添加显式频道投递 ([#7388](https://github.com/QwenLM/qwen-code/pull/7388)) by @BenGuanRan
- feat(serve):将频道生命周期限定在工作区运行时范围内 ([#7577](https://github.com/QwenLM/qwen-code/pull/7577)) by @qqqys
- feat(cli):添加使用统计信息的环境覆盖 ([#7579](https://github.com/QwenLM/qwen-code/pull/7579)) by @tanzhenxin
- feat(core):将 OAuth 登录 URL 作为单个 OSC 8 超链接输出 ([#7255](https://github.com/QwenLM/qwen-code/pull/7255)) by @chinesepowered
- feat(web-shell):为新会话创建添加 Git 模式选择器 ([#7471](https://github.com/QwenLM/qwen-code/pull/7471)) by @wenshao
- feat(cli):在 /learn 命令中支持原生视频输入 ([#7497](https://github.com/QwenLM/qwen-code/pull/7497)) by @LaZzyMan
- feat(core):使 GenAI 请求遥测与 ARMS 对齐 ([#7635](https://github.com/QwenLM/qwen-code/pull/7635)) by @doudouOUC
- feat(cli):通过 @ 引用之前的会话并添加补全标签页 ([#7302](https://github.com/QwenLM/qwen-code/pull/7302)) by @LaZzyMan
- feat(review):运行时任务名称跟随会话输出语言 ([#7653](https://github.com/QwenLM/qwen-code/pull/7653)) by @wenshao
- feat(channels):在守护进程工作器中运行循环 ([#7641](https://github.com/QwenLM/qwen-code/pull/7641)) by @qqqys
- feat(core):添加可配置的图片生成模型 ([#7607](https://github.com/QwenLM/qwen-code/pull/7607)) by @qqqys
- feat(core):添加有界的 Goal 证据验证 ([#7639](https://github.com/QwenLM/qwen-code/pull/7639)) by @qqqys
### 错误修复
- fix(autofix): 在头部状态判定前保持红色检查可见 ([#7438](https://github.com/QwenLM/qwen-code/pull/7438)) by @wenshao
- fix: 当 AgentTool 设置 isolation:worktree 时,将空的 working_dir 规范化为 unset ([#7403](https://github.com/QwenLM/qwen-code/pull/7403)) by @mvanhorn
- fix(core): 通告已完成任务的恢复 ([#7454](https://github.com/QwenLM/qwen-code/pull/7454)) by @DragonnZhang
- fix(cli): 缩小更新检查错误分类范围 ([#7431](https://github.com/QwenLM/qwen-code/pull/7431)) by @yiliang114
- fix(web-shell): 隔离组件样式与宿主 CSS ([#7466](https://github.com/QwenLM/qwen-code/pull/7466)) by @ytahdn
- fix(web-shell): 优化嵌入式 Shell 交互体验 ([#7477](https://github.com/QwenLM/qwen-code/pull/7477)) by @ytahdn
- fix(release): 将 mobile-mcp 排除在核心版本升级之外 ([#7474](https://github.com/QwenLM/qwen-code/pull/7474)) by @yiliang114
- fix(ci): 将实际模型名称注入到分类签名中 ([#7475](https://github.com/QwenLM/qwen-code/pull/7475)) by @yiliang114
- fix(core): 使步进日字段与 Vixie cron 语义对齐 ([#7464](https://github.com/QwenLM/qwen-code/pull/7464)) by @destire-mio
- fix(acp-bridge): 关闭来自 PR #7400 自审的 prompt-terminal 后续跟进 ([#7453](https://github.com/QwenLM/qwen-code/pull/7453)) by @doudouOUC
- fix(core): 从 Agent 派生的子进程环境中移除 Qwen 内部守护进程密钥 ([#7256](https://github.com/QwenLM/qwen-code/pull/7256)) by @chinesepowered
- fix(cli): 在 Shift+Enter 时插入换行符,并停止流式思考块闪烁 ([#7397](https://github.com/QwenLM/qwen-code/pull/7397)) by @chiga0
- fix(web-shell): 打开单例子 Agent 详情 ([#7495](https://github.com/QwenLM/qwen-code/pull/7495)) by @ytahdn
- fix(web-shell): 避免冗余的 Git 状态请求 ([#7496](https://github.com/QwenLM/qwen-code/pull/7496)) by @ytahdn
- fix(agent): 忽略空的 working_dir 占位符 ([#7343](https://github.com/QwenLM/qwen-code/pull/7343)) by @Truraly
- fix(cli): 让出单槽位后台 Agent 的执行权 ([#7258](https://github.com/QwenLM/qwen-code/pull/7258)) by @hogeheer499-commits
- fix(core): 为 qwen3.8-max 和 kimi-k3 模型添加图像模态支持 ([#7491](https://github.com/QwenLM/qwen-code/pull/7491)) by @yiliang114
- fix(dingtalk): 保留非机器人提及的上下文 ([#7473](https://github.com/QwenLM/qwen-code/pull/7473)) by @qwen-code-dev-bot
- fix(core): 强化会话删除期间的用量回收机制 ([#7425](https://github.com/QwenLM/qwen-code/pull/7425)) by @zjunothing
- fix(core): 使分离子 Agent 可被发现 ([#7460](https://github.com/QwenLM/qwen-code/pull/7460)) by @DragonnZhang
- fix(ci): autofix 路由在非触发标签事件上检查现有标签 ([#7481](https://github.com/QwenLM/qwen-code/pull/7481)) by @yiliang114
- fix(vscode): 使用文件选择器的图像路径进行视觉输入 ([#7493](https://github.com/QwenLM/qwen-code/pull/7493)) by @yiliang114
- fix(cli): 打开实际的 serve 回退端口 ([#7501](https://github.com/QwenLM/qwen-code/pull/7501)) by @yiliang114
- fix(ci): 防止单个失败场景导致整个可视化预览失败 ([#7511](https://github.com/QwenLM/qwen-code/pull/7511)) by @wenshao
- fix(cli): 以作者的单位而非代码块 ID 报告审查覆盖缺口 ([#7550](https://github.com/QwenLM/qwen-code/pull/7550)) by @wenshao
- fix(autofix): 重试跳过的 Prepare 步骤,而非让 PR 终端卡住 ([#7490](https://github.com/QwenLM/qwen-code/pull/7490)) by @wenshao
- fix(cli): 在发布的审查正文中排除角色代号和简短路径 ([#7560](https://github.com/QwenLM/qwen-code/pull/7560)) by @wenshao
- fix(autofix): 重试 Agent 超时情况,而非跳过其反馈继续推进 ([#7563](https://github.com/QwenLM/qwen-code/pull/7563)) by @wenshao
- fix(web-shell): 在制品打开请求中暴露 managedId ([#7570](https://github.com/QwenLM/qwen-code/pull/7570)) by @ytahdn
- fix(sdk-python): 在 validate_session_id 中要求规范格式 ([#7532](https://github.com/QwenLM/qwen-code/pull/7532)) by @chinesepowered
- fix(web-shell): 同步后台 Agent 状态 ([#7561](https://github.com/QwenLM/qwen-code/pull/7561)) by @ytahdn
- fix(feishu): 在媒体下载清理阶段等待流取消完成 ([#7465](https://github.com/QwenLM/qwen-code/pull/7465)) by @chinesepowered
- fix(autofix): 使审查地址报告评论完全支持双语 ([#7569](https://github.com/QwenLM/qwen-code/pull/7569)) by @wenshao
- fix(serve): 通过 epoch 令牌检测守护进程重启期间的过期 SSE 游标;保留回合归属并在回放中暴露压缩失败 ([#7458](https://github.com/QwenLM/qwen-code/pull/7458)) by @doudouOUC
- fix(serve): 避免 TOCTOU 竞态条件导致实时会话从列表响应中丢失 ([#7556](https://github.com/QwenLM/qwen-code/pull/7556)) by @yiliang114 with @Copilot
- fix(cli): 防止 task_stop 后触发监控通知 ([#7573](https://github.com/QwenLM/qwen-code/pull/7573)) by @yiliang114
- fix(cli): 使用 npm view 进行更新检查,替代 update-notifier (#7515) ([#7528](https://github.com/QwenLM/qwen-code/pull/7528)) by @dtometzki
- fix(core): 避免生成空的转录历史记录页 ([#7582](https://github.com/QwenLM/qwen-code/pull/7582)) by @ytahdn
- fix(cli): 暴露未处理的拒绝和渲染错误,而非静默吞没 ([#7406](https://github.com/QwenLM/qwen-code/pull/7406)) by @chiga0
- fix(web-shell): 隔离斜杠命令插件页面 ([#7581](https://github.com/QwenLM/qwen-code/pull/7581)) by @ytahdn
- fix(sdk-python): 将 max_tool_calls 和 max_subagent_depth 验证为整数 ([#7548](https://github.com/QwenLM/qwen-code/pull/7548)) by @chinesepowered
- fix(cli): 修正排队消息的显示样式和排序 ([#7381](https://github.com/QwenLM/qwen-code/pull/7381)) by @chiga0
- fix(core): 持久化仅工具调用的子 Agent 轮次用量 ([#7557](https://github.com/QwenLM/qwen-code/pull/7557)) by @DragonnZhang
- fix(core): 当提供商需要思考时重试请求 ([#7534](https://github.com/QwenLM/qwen-code/pull/7534)) by @yiliang114
- fix(core): 在 FileReadCache 中记录自动记忆索引读取 ([#7468](https://github.com/QwenLM/qwen-code/pull/7468)) by @han-dreamer
- fix(web-shell): 基于 ID 初始化工作区选择器 ([#7518](https://github.com/QwenLM/qwen-code/pull/7518)) by @patrick-andstar
- fix(core): 拒绝嵌套的后台请求 ([#7593](https://github.com/QwenLM/qwen-code/pull/7593)) by @patrick-andstar
- fix(web-shell): 防止 React 测量详情引发内存溢出 (OOM) ([#7596](https://github.com/QwenLM/qwen-code/pull/7596)) by @ytahdn
- fix(core): jsonl write([]) 应生成空文件,而非残留换行符 ([#7533](https://github.com/QwenLM/qwen-code/pull/7533)) by @chinesepowered
- fix(core): 从 hook 和工具发现子环境变量中剥离守护进程密钥 ([#7527](https://github.com/QwenLM/qwen-code/pull/7527)) by @chinesepowered
- fix(core): 保留已禁用的推理力度配置 ([#7541](https://github.com/QwenLM/qwen-code/pull/7541)) by @WladmirJunior
- fix(web-shell): 在触控设备上渲染纯文本 textarea 编辑器 ([#7587](https://github.com/QwenLM/qwen-code/pull/7587)) by @ComplexSimply
- fix(core): 在 splitCommands 中将单引号内的反斜杠视为字面量 ([#7526](https://github.com/QwenLM/qwen-code/pull/7526)) by @chinesepowered
- fix(cli): 停止将 version-manager 的 npm 垫片误认为 npm-cli.js ([#7545](https://github.com/QwenLM/qwen-code/pull/7545)) by @nerdalytics
- fix(core,cli): 将队友主导回合与代理上下文隔离 ([#7576](https://github.com/QwenLM/qwen-code/pull/7576)) by @yiliang114
- fix(sdk-java): 允许终端续传启动下一个提示 ([#7615](https://github.com/QwenLM/qwen-code/pull/7615)) by @wenshao
- fix(channels): 将 Telegram 回复路由至论坛主题 ([#7612](https://github.com/QwenLM/qwen-code/pull/7612)) by @hogeheer499-commits
- fix(acp): 对其他认证方式隐藏已停用的 OAuth 模型 ([#7522](https://github.com/QwenLM/qwen-code/pull/7522)) by @hogeheer499-commits
- fix(channels): 保存频道记忆时停止丢弃多任务消息 ([#7608](https://github.com/QwenLM/qwen-code/pull/7608)) by @zjunothing
- fix(channels): 忽略空闲状态下的 ACP 取消错误 ([#7598](https://github.com/QwenLM/qwen-code/pull/7598)) by @patrick-andstar
- fix(cli): 优化大段粘贴性能并添加进度指示器 ([#6506](https://github.com/QwenLM/qwen-code/pull/6506)) by @LaZzyMan
- fix(mcp): 为 Streamable HTTP 传输使用专用的 undici fetch ([#7195](https://github.com/QwenLM/qwen-code/pull/7195)) by @zjunothing
- fix(daemon): 处理 epoch cursor 审查的后续跟进事项 ([#7619](https://github.com/QwenLM/qwen-code/pull/7619)) by @doudouOUC
- fix(sdk-java): 增强守护进程传输的可靠性 ([#7603](https://github.com/QwenLM/qwen-code/pull/7603)) by @doudouOUC
- fix(acp-bridge): 会话事件管道的资源加固 (DAEMON-009/010/011) ([#7622](https://github.com/QwenLM/qwen-code/pull/7622)) by @doudouOUC
- fix(cli): 清理孤立的管理型 npm 更新工件 ([#7539](https://github.com/QwenLM/qwen-code/pull/7539)) by @patrick-andstar
- fix(web-shell): 遵循锁定工作区会话的操作限制 ([#7629](https://github.com/QwenLM/qwen-code/pull/7629)) by @dreamWB
- fix(core): 在空 OpenAI 流帧后保留使用情况统计 ([#7650](https://github.com/QwenLM/qwen-code/pull/7650)) by @doudouOUC
- fix(triage): 使无人值守 PR 审查静态化——通过 API 读取 CI 状态,绝不执行 PR 代码 ([#7646](https://github.com/QwenLM/qwen-code/pull/7646)) by @wenshao
- fix(triage): 切实限制 CI 审查代理的工具权限 ([#7647](https://github.com/QwenLM/qwen-code/pull/7647)) by @wenshao
- fix(cli): 将所有 TUI 图标列对齐为统一的 2 列宽度 ([#7633](https://github.com/QwenLM/qwen-code/pull/7633)) by @chiga0
- fix(web-shell): 悬停时显示完整会话名称 ([#7662](https://github.com/QwenLM/qwen-code/pull/7662)) by @wenshao
- fix(web-shell): 选择分支/worktree 时保持 git 模式弹出层打开 ([#7668](https://github.com/QwenLM/qwen-code/pull/7668)) by @wenshao
### 性能
- perf(startup): 通过包内动态导入延迟加载 undici ([#7455](https://github.com/QwenLM/qwen-code/pull/7455)) by @doudouOUC
- perf(web-shell): 优化长会话渲染性能 ([#7408](https://github.com/QwenLM/qwen-code/pull/7408)) by @ytahdn
- perf(startup): 首次使用时延迟加载 Google GenAI SDK ([#7512](https://github.com/QwenLM/qwen-code/pull/7512)) by @doudouOUC
- perf(cli): 延迟 ACP 遥测初始化 ([#7558](https://github.com/QwenLM/qwen-code/pull/7558)) by @doudouOUC
- perf(cli): 将编译缓存传播至 ACP 子进程 ([#7594](https://github.com/QwenLM/qwen-code/pull/7594)) by @doudouOUC
### 文档
- docs(core): 将 JSDoc @param 名称与实际函数签名对齐 ([#7492](https://github.com/QwenLM/qwen-code/pull/7492)) by @ovochouovo
- docs(autofix): 要求提供证据的预提交验证,而非仅标记“已验证” ([#7486](https://github.com/QwenLM/qwen-code/pull/7486)) by @wenshao
- docs: 更新子代理生命周期指南 ([#7624](https://github.com/QwenLM/qwen-code/pull/7624)) by @wenshao
- docs(autofix): 在处理审查反馈时贯彻“简洁优先”原则 ([#7643](https://github.com/QwenLM/qwen-code/pull/7643)) by @wenshao
- docs(autofix): 让代理上报维护者的决定,而非自行裁决 ([#7636](https://github.com/QwenLM/qwen-code/pull/7636)) by @wenshao
- docs(triage): 根据变更规模调整 PR 验证策略,增加实际运行深度 ([#7648](https://github.com/QwenLM/qwen-code/pull/7648)) by @wenshao
### 内部变更
- test(telemetry): 覆盖守护进程指标初始化顺序测试,并补充 metricReader 不对称性说明 ([#7456](https://github.com/QwenLM/qwen-code/pull/7456)) by @doudouOUC
- test(core): 覆盖无工件时的 Shell 截断测试 ([#7470](https://github.com/QwenLM/qwen-code/pull/7470)) by @doudouOUC
- test(core): 为 agent.ts 实际调用的注册表方法添加桩代码 ([#7538](https://github.com/QwenLM/qwen-code/pull/7538)) by @chinesepowered
- test(autofix): 将 infra-signature 列表统一至工作流作为单一数据源 ([#7565](https://github.com/QwenLM/qwen-code/pull/7565)) by @wenshao
- test: 修复 tool-control E2E 测试中 write_file 内容断言的不稳定问题 ([#7613](https://github.com/QwenLM/qwen-code/pull/7613)) by @yiliang114 with @Copilot
- test(sdk-java): 在慢速测试中扩大 SSE 空闲看门狗的超时容差 ([#7617](https://github.com/QwenLM/qwen-code/pull/7617)) by @wenshao
- test(core): 在冲突删除测试中固定存档副本使用的挽救逻辑 ([#7604](https://github.com/QwenLM/qwen-code/pull/7604)) by @zjunothing
- test(triage): 为 triage 工作流添加回归防护,并将 git 清理操作改为白名单机制 ([#7660](https://github.com/QwenLM/qwen-code/pull/7660)) by @wenshao
## 新贡献者
- @ovochouovo 在 [#7492](https://github.com/QwenLM/qwen-code/pull/7492) 中首次贡献
- @Truraly 在 [#7343](https://github.com/QwenLM/qwen-code/pull/7343) 中首次贡献
- @zjgzx1988 在 [#7478](https://github.com/QwenLM/qwen-code/pull/7478) 中首次贡献
- @hogeheer499-commits 在 [#7258](https://github.com/QwenLM/qwen-code/pull/7258) 中首次贡献
- @dtometzki 在 [#7528](https://github.com/QwenLM/qwen-code/pull/7528) 中首次贡献
- @patrick-andstar 在 [#7518](https://github.com/QwenLM/qwen-code/pull/7518) 中首次贡献
- @WladmirJunior 在 [#7541](https://github.com/QwenLM/qwen-code/pull/7541) 中首次贡献
- @nerdalytics 在 [#7545](https://github.com/QwenLM/qwen-code/pull/7545) 中首次贡献
**完整更新日志**: https://github.com/QwenLM/qwen-code/compare/v0.20.1...v0.21.0
<!-- qwen-release-notes:v1 -->
## Highlights
_See the complete change list below._
## Breaking Changes
No known breaking changes.
## Complete Change List
### Features
- feat(web-shell): add workspace selector button with add/switch dropdown in composer toolbar ([#7390](https://github.com/QwenLM/qwen-code/pull/7390)) by @water-in-stone
- feat(web-shell): show subagent sessions in detail panel ([#7380](https://github.com/QwenLM/qwen-code/pull/7380)) by @ytahdn
- feat(web-shell): add rendered file previews ([#7467](https://github.com/QwenLM/qwen-code/pull/7467)) by @ytahdn
- feat(core): add memory recall delivery telemetry ([#7393](https://github.com/QwenLM/qwen-code/pull/7393)) by @ZijianZhang989
- feat(core): keep completed background agents resident ([#7426](https://github.com/QwenLM/qwen-code/pull/7426)) by @DragonnZhang
- feat(serve): support forced MCP reconnects ([#7488](https://github.com/QwenLM/qwen-code/pull/7488)) by @BZ-D
- feat(prompts): allow overriding core identity via QWEN_SYSTEM_IDENTITY_MD ([#7478](https://github.com/QwenLM/qwen-code/pull/7478)) by @zjgzx1988
- feat(autofix): stop a PR that fails to push for N rounds in a row ([#7482](https://github.com/QwenLM/qwen-code/pull/7482)) by @wenshao
- feat(core): restore background agent roster ([#7459](https://github.com/QwenLM/qwen-code/pull/7459)) by @DragonnZhang
- feat(cli): support custom skill directories via settings ([#7395](https://github.com/QwenLM/qwen-code/pull/7395)) by @qwen-code-dev-bot
- feat(cli): preserve semantic text when copying VP selections ([#7286](https://github.com/QwenLM/qwen-code/pull/7286)) by @chiga0
- feat(web-shell): add selective Shadow DOM isolation ([#7551](https://github.com/QwenLM/qwen-code/pull/7551)) by @ytahdn
- feat(web-shell): add renderChatHeader slot for custom session header ([#7553](https://github.com/QwenLM/qwen-code/pull/7553)) by @yuanyuanAli
- feat(serve): add workspace-level generation ([#7552](https://github.com/QwenLM/qwen-code/pull/7552)) by @ytahdn
- feat(serve): persist workspace channel configuration ([#7514](https://github.com/QwenLM/qwen-code/pull/7514)) by @qqqys
- feat(core): propagate trusted daemon invocation context ([#7279](https://github.com/QwenLM/qwen-code/pull/7279)) by @callmeYe
- feat(cli): post the review body bilingually when the PR description is Chinese ([#7564](https://github.com/QwenLM/qwen-code/pull/7564)) by @wenshao
- feat(autofix): auto-rerun a check that died on infrastructure, once ([#7562](https://github.com/QwenLM/qwen-code/pull/7562)) by @wenshao
- feat(core): Align GenAI telemetry with ARMS ([#7536](https://github.com/QwenLM/qwen-code/pull/7536)) by @doudouOUC
- feat(web-shell): add workspace agent management ([#7572](https://github.com/QwenLM/qwen-code/pull/7572)) by @ytahdn
- feat(autofix): update a stale base when the gate rejects a behind-main fix ([#7595](https://github.com/QwenLM/qwen-code/pull/7595)) by @wenshao
- feat(sdk-java): Add daemon transport ([#7463](https://github.com/QwenLM/qwen-code/pull/7463)) by @doudouOUC
- feat(autofix): auto-update a PR red only from a stale, since-fixed base ([#7554](https://github.com/QwenLM/qwen-code/pull/7554)) by @wenshao
- feat(autofix): auto-recover a PR parked on a stale base ([#7602](https://github.com/QwenLM/qwen-code/pull/7602)) by @wenshao
- feat(core): add Goal v3 state protocol ([#7517](https://github.com/QwenLM/qwen-code/pull/7517)) by @qqqys
- feat(daemon): add explicit channel delivery ([#7388](https://github.com/QwenLM/qwen-code/pull/7388)) by @BenGuanRan
- feat(serve): scope channel lifecycle to workspace runtimes ([#7577](https://github.com/QwenLM/qwen-code/pull/7577)) by @qqqys
- feat(cli): add usage statistics environment override ([#7579](https://github.com/QwenLM/qwen-code/pull/7579)) by @tanzhenxin
- feat(core): emit OAuth login URL as a single OSC 8 hyperlink ([#7255](https://github.com/QwenLM/qwen-code/pull/7255)) by @chinesepowered
- feat(web-shell): add git mode selector for new session creation ([#7471](https://github.com/QwenLM/qwen-code/pull/7471)) by @wenshao
- feat(cli): support native video input in /learn ([#7497](https://github.com/QwenLM/qwen-code/pull/7497)) by @LaZzyMan
- feat(core): Align GenAI request telemetry with ARMS ([#7635](https://github.com/QwenLM/qwen-code/pull/7635)) by @doudouOUC
- feat(cli): reference prior sessions via @ and add completion tabs ([#7302](https://github.com/QwenLM/qwen-code/pull/7302)) by @LaZzyMan
- feat(review): follow the session output language for runtime task names ([#7653](https://github.com/QwenLM/qwen-code/pull/7653)) by @wenshao
- feat(channels): run loops in daemon workers ([#7641](https://github.com/QwenLM/qwen-code/pull/7641)) by @qqqys
- feat(core): add configurable image generation models ([#7607](https://github.com/QwenLM/qwen-code/pull/7607)) by @qqqys
- feat(core): add bounded Goal evidence verification ([#7639](https://github.com/QwenLM/qwen-code/pull/7639)) by @qqqys
### Bug Fixes
- fix(autofix): keep a still-red check visible until its head is judged ([#7438](https://github.com/QwenLM/qwen-code/pull/7438)) by @wenshao
- fix: normalize empty working_dir to unset when isolation:worktree is set on AgentTool ([#7403](https://github.com/QwenLM/qwen-code/pull/7403)) by @mvanhorn
- fix(core): Advertise completed task revival ([#7454](https://github.com/QwenLM/qwen-code/pull/7454)) by @DragonnZhang
- fix(cli): narrow update-check error classification ([#7431](https://github.com/QwenLM/qwen-code/pull/7431)) by @yiliang114
- fix(web-shell): isolate component styles from host CSS ([#7466](https://github.com/QwenLM/qwen-code/pull/7466)) by @ytahdn
- fix(web-shell): polish embedded shell interactions ([#7477](https://github.com/QwenLM/qwen-code/pull/7477)) by @ytahdn
- fix(release): exclude mobile-mcp from core version bump ([#7474](https://github.com/QwenLM/qwen-code/pull/7474)) by @yiliang114
- fix(ci): inject actual model name into triage signature ([#7475](https://github.com/QwenLM/qwen-code/pull/7475)) by @yiliang114
- fix(core): align stepped day fields with Vixie cron semantics ([#7464](https://github.com/QwenLM/qwen-code/pull/7464)) by @destire-mio
- fix(acp-bridge): close prompt-terminal follow-ups from the PR #7400 self-review ([#7453](https://github.com/QwenLM/qwen-code/pull/7453)) by @doudouOUC
- fix(core): strip Qwen-internal daemon secrets from agent-spawned child env ([#7256](https://github.com/QwenLM/qwen-code/pull/7256)) by @chinesepowered
- fix(cli): insert newline on Shift+Enter and stop streaming thinking-block flicker ([#7397](https://github.com/QwenLM/qwen-code/pull/7397)) by @chiga0
- fix(web-shell): open singleton subagent details ([#7495](https://github.com/QwenLM/qwen-code/pull/7495)) by @ytahdn
- fix(web-shell): avoid redundant Git status requests ([#7496](https://github.com/QwenLM/qwen-code/pull/7496)) by @ytahdn
- fix(agent): ignore empty working_dir placeholders ([#7343](https://github.com/QwenLM/qwen-code/pull/7343)) by @Truraly
- fix(cli): yield to single-slot background agents ([#7258](https://github.com/QwenLM/qwen-code/pull/7258)) by @hogeheer499-commits
- fix(core): add image modality support for qwen3.8-max and kimi-k3 models ([#7491](https://github.com/QwenLM/qwen-code/pull/7491)) by @yiliang114
- fix(dingtalk): preserve non-bot mention context ([#7473](https://github.com/QwenLM/qwen-code/pull/7473)) by @qwen-code-dev-bot
- fix(core): harden the usage salvage around session deletion ([#7425](https://github.com/QwenLM/qwen-code/pull/7425)) by @zjunothing
- fix(core): make fork subagents discoverable ([#7460](https://github.com/QwenLM/qwen-code/pull/7460)) by @DragonnZhang
- fix(ci): autofix route checks existing labels on non-trigger label events ([#7481](https://github.com/QwenLM/qwen-code/pull/7481)) by @yiliang114
- fix(vscode): use file picker image paths for vision input ([#7493](https://github.com/QwenLM/qwen-code/pull/7493)) by @yiliang114
- fix(cli): open the actual serve fallback port ([#7501](https://github.com/QwenLM/qwen-code/pull/7501)) by @yiliang114
- fix(ci): don't let one failing scenario sink the whole visual preview ([#7511](https://github.com/QwenLM/qwen-code/pull/7511)) by @wenshao
- fix(cli): say review coverage gaps in the author's units, not chunk ids ([#7550](https://github.com/QwenLM/qwen-code/pull/7550)) by @wenshao
- fix(autofix): retry a skipped-Prepare instead of stranding the PR terminal ([#7490](https://github.com/QwenLM/qwen-code/pull/7490)) by @wenshao
- fix(cli): keep role codenames and brief paths out of the posted review body ([#7560](https://github.com/QwenLM/qwen-code/pull/7560)) by @wenshao
- fix(autofix): retry an agent timeout instead of advancing past its feedback ([#7563](https://github.com/QwenLM/qwen-code/pull/7563)) by @wenshao
- fix(web-shell): expose managedId in artifact open requests ([#7570](https://github.com/QwenLM/qwen-code/pull/7570)) by @ytahdn
- fix(sdk-python): require canonical form in validate_session_id ([#7532](https://github.com/QwenLM/qwen-code/pull/7532)) by @chinesepowered
- fix(web-shell): sync background agent status ([#7561](https://github.com/QwenLM/qwen-code/pull/7561)) by @ytahdn
- fix(feishu): await stream cancels in media download teardown ([#7465](https://github.com/QwenLM/qwen-code/pull/7465)) by @chinesepowered
- fix(autofix): make the review-address report comment fully bilingual ([#7569](https://github.com/QwenLM/qwen-code/pull/7569)) by @wenshao
- fix(serve): detect stale SSE cursors across daemon restarts via epoch token; preserve turn attribution and surface compaction failures in replay ([#7458](https://github.com/QwenLM/qwen-code/pull/7458)) by @doudouOUC
- fix(serve): avoid TOCTOU race dropping live sessions from list response ([#7556](https://github.com/QwenLM/qwen-code/pull/7556)) by @yiliang114 with @Copilot
- fix(cli): prevent monitor notifications after task_stop ([#7573](https://github.com/QwenLM/qwen-code/pull/7573)) by @yiliang114
- Fix(cli): use npm view for update check instead of update-notifier (#7515) ([#7528](https://github.com/QwenLM/qwen-code/pull/7528)) by @dtometzki
- fix(core): avoid empty transcript history pages ([#7582](https://github.com/QwenLM/qwen-code/pull/7582)) by @ytahdn
- fix(cli): surface unhandled rejections and render errors instead of swallowing them ([#7406](https://github.com/QwenLM/qwen-code/pull/7406)) by @chiga0
- fix(web-shell): isolate slash command plugin pages ([#7581](https://github.com/QwenLM/qwen-code/pull/7581)) by @ytahdn
- fix(sdk-python): validate max_tool_calls and max_subagent_depth as integers ([#7548](https://github.com/QwenLM/qwen-code/pull/7548)) by @chinesepowered
- fix(cli): correct queued message display style and ordering ([#7381](https://github.com/QwenLM/qwen-code/pull/7381)) by @chiga0
- fix(core): persist usage for tool-only subagent rounds ([#7557](https://github.com/QwenLM/qwen-code/pull/7557)) by @DragonnZhang
- fix(core): retry requests when providers require thinking ([#7534](https://github.com/QwenLM/qwen-code/pull/7534)) by @yiliang114
- fix(core): record auto-memory index reads in FileReadCache ([#7468](https://github.com/QwenLM/qwen-code/pull/7468)) by @han-dreamer
- fix(web-shell): initialize workspace selector from ID ([#7518](https://github.com/QwenLM/qwen-code/pull/7518)) by @patrick-andstar
- fix(core): reject nested background requests ([#7593](https://github.com/QwenLM/qwen-code/pull/7593)) by @patrick-andstar
- fix(web-shell): prevent React measure detail OOM ([#7596](https://github.com/QwenLM/qwen-code/pull/7596)) by @ytahdn
- fix(core): jsonl write([]) should leave an empty file, not a stray newline ([#7533](https://github.com/QwenLM/qwen-code/pull/7533)) by @chinesepowered
- fix(core): strip daemon secrets from hook and tool-discovery child env ([#7527](https://github.com/QwenLM/qwen-code/pull/7527)) by @chinesepowered
- fix(core): preserve disabled reasoning effort ([#7541](https://github.com/QwenLM/qwen-code/pull/7541)) by @WladmirJunior
- fix(web-shell): render a plain textarea composer on touch devices ([#7587](https://github.com/QwenLM/qwen-code/pull/7587)) by @ComplexSimply
- fix(core): treat backslash as literal inside single quotes in splitCommands ([#7526](https://github.com/QwenLM/qwen-code/pull/7526)) by @chinesepowered
- fix(cli): stop treating version-manager npm shims as npm-cli.js ([#7545](https://github.com/QwenLM/qwen-code/pull/7545)) by @nerdalytics
- fix(core,cli): isolate teammate leader turns from agent context ([#7576](https://github.com/QwenLM/qwen-code/pull/7576)) by @yiliang114
- fix(sdk-java): let a terminal continuation start the next prompt ([#7615](https://github.com/QwenLM/qwen-code/pull/7615)) by @wenshao
- fix(channels): route Telegram replies to forum topics ([#7612](https://github.com/QwenLM/qwen-code/pull/7612)) by @hogeheer499-commits
- fix(acp): hide discontinued OAuth model for other auth types ([#7522](https://github.com/QwenLM/qwen-code/pull/7522)) by @hogeheer499-commits
- fix(channels): stop dropping multi-task messages when a channel memory is saved ([#7608](https://github.com/QwenLM/qwen-code/pull/7608)) by @zjunothing
- fix(channels): ignore idle ACP cancellation errors ([#7598](https://github.com/QwenLM/qwen-code/pull/7598)) by @patrick-andstar
- fix(cli): optimize large paste performance and add progress indicator ([#6506](https://github.com/QwenLM/qwen-code/pull/6506)) by @LaZzyMan
- fix(mcp): use a dedicated undici fetch for Streamable HTTP transports ([#7195](https://github.com/QwenLM/qwen-code/pull/7195)) by @zjunothing
- fix(daemon): address epoch cursor review follow-ups ([#7619](https://github.com/QwenLM/qwen-code/pull/7619)) by @doudouOUC
- fix(sdk-java): Harden daemon transport reliability ([#7603](https://github.com/QwenLM/qwen-code/pull/7603)) by @doudouOUC
- fix(acp-bridge): resource hardening for the session event pipeline (DAEMON-009/010/011) ([#7622](https://github.com/QwenLM/qwen-code/pull/7622)) by @doudouOUC
- fix(cli): clean orphaned managed npm update artifacts ([#7539](https://github.com/QwenLM/qwen-code/pull/7539)) by @patrick-andstar
- fix(web-shell): honor locked workspace session actions ([#7629](https://github.com/QwenLM/qwen-code/pull/7629)) by @dreamWB
- fix(core): Preserve usage after empty OpenAI stream frames ([#7650](https://github.com/QwenLM/qwen-code/pull/7650)) by @doudouOUC
- fix(triage): make unattended PR review static — read CI via API, never run PR code ([#7646](https://github.com/QwenLM/qwen-code/pull/7646)) by @wenshao
- fix(triage): actually restrict the CI review agent's tools ([#7647](https://github.com/QwenLM/qwen-code/pull/7647)) by @wenshao
- fix(cli): align all TUI icon columns to a uniform 2-col width ([#7633](https://github.com/QwenLM/qwen-code/pull/7633)) by @chiga0
- fix(web-shell): show full session names on hover ([#7662](https://github.com/QwenLM/qwen-code/pull/7662)) by @wenshao
- fix(web-shell): keep git mode popover open when picking branch/worktree ([#7668](https://github.com/QwenLM/qwen-code/pull/7668)) by @wenshao
### Performance
- perf(startup): Load undici lazily behind package-local dynamic imports ([#7455](https://github.com/QwenLM/qwen-code/pull/7455)) by @doudouOUC
- perf(web-shell): optimize long session rendering ([#7408](https://github.com/QwenLM/qwen-code/pull/7408)) by @ytahdn
- perf(startup): lazy-load Google GenAI SDK on first use ([#7512](https://github.com/QwenLM/qwen-code/pull/7512)) by @doudouOUC
- perf(cli): Defer ACP telemetry initialization ([#7558](https://github.com/QwenLM/qwen-code/pull/7558)) by @doudouOUC
- perf(cli): Propagate compile cache to ACP children ([#7594](https://github.com/QwenLM/qwen-code/pull/7594)) by @doudouOUC
### Documentation
- docs(core): align JSDoc @param names with actual function signatures ([#7492](https://github.com/QwenLM/qwen-code/pull/7492)) by @ovochouovo
- docs(autofix): require evidenced pre-commit verification, not a bare "verified" ([#7486](https://github.com/QwenLM/qwen-code/pull/7486)) by @wenshao
- docs: refresh subagent lifecycle guidance ([#7624](https://github.com/QwenLM/qwen-code/pull/7624)) by @wenshao
- docs(autofix): apply Simplicity First when addressing review feedback ([#7643](https://github.com/QwenLM/qwen-code/pull/7643)) by @wenshao
- docs(autofix): let the agent escalate a maintainer's decision, not decide it ([#7636](https://github.com/QwenLM/qwen-code/pull/7636)) by @wenshao
- docs(triage): scale PR verification to the change, add real-run depth ([#7648](https://github.com/QwenLM/qwen-code/pull/7648)) by @wenshao
### Internal Changes
- test(telemetry): Cover daemon metrics init ordering and document metricReader asymmetry ([#7456](https://github.com/QwenLM/qwen-code/pull/7456)) by @doudouOUC
- test(core): Cover Shell truncation without an artifact ([#7470](https://github.com/QwenLM/qwen-code/pull/7470)) by @doudouOUC
- test(core): stub the registry methods agent.ts actually calls ([#7538](https://github.com/QwenLM/qwen-code/pull/7538)) by @chinesepowered
- test(autofix): single-source the infra-signature list from the workflow ([#7565](https://github.com/QwenLM/qwen-code/pull/7565)) by @wenshao
- test: deflake write_file content assertion in tool-control E2E test ([#7613](https://github.com/QwenLM/qwen-code/pull/7613)) by @yiliang114 with @Copilot
- test(sdk-java): widen the SSE idle-watchdog margins in the slow-line test ([#7617](https://github.com/QwenLM/qwen-code/pull/7617)) by @wenshao
- test(core): pin the archived-copy usage salvage in the conflict deletion test ([#7604](https://github.com/QwenLM/qwen-code/pull/7604)) by @zjunothing
- test(triage): regression-guard the triage workflow, and make the git cleanup an allowlist ([#7660](https://github.com/QwenLM/qwen-code/pull/7660)) by @wenshao
## New Contributors
- @ovochouovo made their first contribution in [#7492](https://github.com/QwenLM/qwen-code/pull/7492)
- @Truraly made their first contribution in [#7343](https://github.com/QwenLM/qwen-code/pull/7343)
- @zjgzx1988 made their first contribution in [#7478](https://github.com/QwenLM/qwen-code/pull/7478)
- @hogeheer499-commits made their first contribution in [#7258](https://github.com/QwenLM/qwen-code/pull/7258)
- @dtometzki made their first contribution in [#7528](https://github.com/QwenLM/qwen-code/pull/7528)
- @patrick-andstar made their first contribution in [#7518](https://github.com/QwenLM/qwen-code/pull/7518)
- @WladmirJunior made their first contribution in [#7541](https://github.com/QwenLM/qwen-code/pull/7541)
- @nerdalytics made their first contribution in [#7545](https://github.com/QwenLM/qwen-code/pull/7545)
**Full Changelog**: https://github.com/QwenLM/qwen-code/compare/v0.20.1...v0.21.0