<!-- qwen-release-notes:v1 -->
## 亮点
_详见下方的完整变更列表。_
## 破坏性变更
- fix(core)!: 让 bash 在命令钩子中展开项目目录变量 ([#11864](https://github.com/QwenLM/qwen-code/pull/11864)) by @qqqys
## 完整变更列表
### 新功能
- feat(core): 限制每次会话的 web_search 调用次数 ([#11852](https://github.com/QwenLM/qwen-code/pull/11852)) by @qqqys
- feat: 在守护进程和 Web Shell 间跟踪后台结果执行状态 ([#11636](https://github.com/QwenLM/qwen-code/pull/11636)) by @ytahdn
- feat(cli): 在 OpenTUI 中提供完整的 /hooks 对话框 ([#11903](https://github.com/QwenLM/qwen-code/pull/11903)) by @qqqys
- feat(core): 触发钩子进度事件 ([#11906](https://github.com/QwenLM/qwen-code/pull/11906)) by @qqqys
- feat(extensions): 随扩展程序提供动态工作流 ([#11805](https://github.com/QwenLM/qwen-code/pull/11805)) by @qqqys
- feat(channels): 添加支持钉钉的共享输出模式 ([#11822](https://github.com/QwenLM/qwen-code/pull/11822)) by @qqqys
- feat(web-shell): 在标签页之间滑动显示当前活动状态指示器 ([#11844](https://github.com/QwenLM/qwen-code/pull/11844)) by @callmeYe
- feat(daemon): 本地枚举已安装的扩展技能 ([#11281](https://github.com/QwenLM/qwen-code/pull/11281)) by @callmeYe
- feat(web-shell): 在全局轮次导航中跟随阅读位置 ([#11801](https://github.com/QwenLM/qwen-code/pull/11801)) by @callmeYe
- feat(workflows): 通过 +Nk 指令共享每次轮次的 token 预算 ([#11917](https://github.com/QwenLM/qwen-code/pull/11917)) by @qqqys
- feat(serve): 添加基于预算的 ACP 子进程准入机制 ([#11911](https://github.com/QwenLM/qwen-code/pull/11911)) by @doudouOUC
- feat(cli): 为 Linux 添加 bwrap 内核沙箱后端 ([#11614](https://github.com/QwenLM/qwen-code/pull/11614)) by @doudouOUC
- feat(core): 支持外部推理配置及默认设置 ([#11856](https://github.com/QwenLM/qwen-code/pull/11856)) by @callmeYe
- feat(settings): 默认开启跨会话消息传递 ([#11840](https://github.com/QwenLM/qwen-code/pull/11840)) by @qqqys
- feat(core): 按名称运行已保存的工作流,并将工作流权限绑定到脚本内容 ([#11943](https://github.com/QwenLM/qwen-code/pull/11943)) by @qqqys
- feat(workflow): 在运行和恢复时保留源引用 ([#11931](https://github.com/QwenLM/qwen-code/pull/11931)) by @qqqys
- feat(workflow): 关联智能体调度与嵌套工作流调用 ([#11932](https://github.com/QwenLM/qwen-code/pull/11932)) by @qqqys
- feat(workflows): 提供尺寸指引、结构预览及大规模运行警告 ([#11939](https://github.com/QwenLM/qwen-code/pull/11939)) by @qqqys
- feat(workflows): 允许模型调用声明了 whenToUse 的扩展工作流 ([#11957](https://github.com/QwenLM/qwen-code/pull/11957)) by @qqqys
- feat(daemon): 为 prompt 和 replay API 支持摘要投影 ([#11920](https://github.com/QwenLM/qwen-code/pull/11920)) by @ytahdn
- feat(web-shell): 添加脚注预览及每次轮次的来源 ([#11480](https://github.com/QwenLM/qwen-code/pull/11480)) by @callmeYe
- feat(telemetry): 触发 Goal 生命周期事件及指标 ([#11927](https://github.com/QwenLM/qwen-code/pull/11927)) by @qqqys
- feat(cli): 当打开 /hooks 时重新加载钩子注册表 ([#11904](https://github.com/QwenLM/qwen-code/pull/11904)) by @qqqys
- feat(serve): 当准入满载时回收空闲的 ACP 子进程 ([#11940](https://github.com/QwenLM/qwen-code/pull/11940)) by @doudouOUC
- feat(web-shell): 连接到选定的远程守护进程 ([#11548](https://github.com/QwenLM/qwen-code/pull/11548)) by @yiliang114
- feat(web-shell): 从展开的工具详情中预览文件 ([#11982](https://github.com/QwenLM/qwen-code/pull/11982)) by @ytahdn
- feat(serve): 使用参数、sourceRef 和调用者提供的脚本启动工作流运行 ([#11979](https://github.com/QwenLM/qwen-code/pull/11979)) by @qqqys
- feat(web-shell): 自定义上下文详情并折叠快照 ([#11996](https://github.com/QwenLM/qwen-code/pull/11996)) by @ytahdn
- feat(goal): 对前台子智能体和验证器 token 使用进行计费 ([#11998](https://github.com/QwenLM/qwen-code/pull/11998)) by @qqqys
- feat(dingtalk): 在私信中携带发送者身份 ([#12017](https://github.com/QwenLM/qwen-code/pull/12017)) by @BenGuanRan
- feat(goal): 显示轮次和活跃时间预算 ([#11999](https://github.com/QwenLM/qwen-code/pull/11999)) by @qqqys
- feat(omni): 将多模态媒体管线集成到主分支 ([#12019](https://github.com/QwenLM/qwen-code/pull/12019)) by @LaZzyMan
### 错误修复
- fix(cua):保留 Linux 观测数据与 REPL 诊断信息 ([#11829](https://github.com/QwenLM/qwen-code/pull/11829)) by @DragonnZhang
- fix(cua):使 Linux 输入传递自适应 ([#11876](https://github.com/QwenLM/qwen-code/pull/11876)) by @LaZzyMan
- fix(core):保留管道列表条目边缘的转义空白字符 ([#11860](https://github.com/QwenLM/qwen-code/pull/11860)) by @qqqys
- fix(serve):从目录中解析技能身份以用于切换守卫 ([#11831](https://github.com/QwenLM/qwen-code/pull/11831)) by @harjothkhara
- fix(standalone):打包 @lydell/node-pty 预编译文件以启用 Web 终端 ([#11881](https://github.com/QwenLM/qwen-code/pull/11881)) by @yiliang114
- fix(cua):限定 Linux 观测范围并准备 SDK 0.20.9 ([#11910](https://github.com/QwenLM/qwen-code/pull/11910)) by @LaZzyMan
- fix(cli):将 ACP 权限队列作用域限定至会话级别 ([#11802](https://github.com/QwenLM/qwen-code/pull/11802)) by @chiga0
- fix(ci):将自动修复运行器标签与排队审查分离 ([#11912](https://github.com/QwenLM/qwen-code/pull/11912)) by @yiliang114
- fix(cli):恢复共享 Skill 状态与运行器 CI 检查 ([#11933](https://github.com/QwenLM/qwen-code/pull/11933)) by @qqqys
- fix(vscode):弃用旧版 ACP 输入桥接 ([#11928](https://github.com/QwenLM/qwen-code/pull/11928)) by @yiliang114
- fix(web-shell):在会话侧边栏显示 Qwen Live 任务 ([#11830](https://github.com/QwenLM/qwen-code/pull/11830)) by @qqqys
- fix(ci):隔离运行器计划任务的 fixture 模块作用域 ([#11938](https://github.com/QwenLM/qwen-code/pull/11938)) by @doudouOUC
- fix(core):将 PTY 加载原因作为调用参数传递,而非保存在模块状态中 ([#11923](https://github.com/QwenLM/qwen-code/pull/11923)) by @yiliang114
- fix(core):在修剪钩子匹配器时保留转义的尾部空白字符 ([#11871](https://github.com/QwenLM/qwen-code/pull/11871)) by @yiliang114
- fix(core):在 Responses 协议线上展开 ${session_id} 并添加 User-Agent 头 ([#11947](https://github.com/QwenLM/qwen-code/pull/11947)) by @yiliang114
- fix(core):在 MiniMax chat-completions 协议线上保留工具参数 ([#11842](https://github.com/QwenLM/qwen-code/pull/11842)) by @yiliang114
- fix(web-shell):修复读取过程中审批面板尺寸跳动的问题 ([#11930](https://github.com/QwenLM/qwen-code/pull/11930)) by @ytahdn
- fix(release):基于磁盘容量下限限制池路由验证任务的执行 ([#11972](https://github.com/QwenLM/qwen-code/pull/11972)) by @qwen-code-dev-bot
- fix(web-shell):保留工具描述路径中的分隔符 ([#11977](https://github.com/QwenLM/qwen-code/pull/11977)) by @ytahdn
- fix(core):将 Goal 轮次结尾持久化至模型历史之外 ([#11924](https://github.com/QwenLM/qwen-code/pull/11924)) by @qqqys
- fix(web-shell):将轮次输出的摘要保持在下方并进行去重 ([#11986](https://github.com/QwenLM/qwen-code/pull/11986)) by @ytahdn
- fix(ci):修复 e2e-test-linux 中 docker lock 缓存的所有权问题 (#11990) ([#11992](https://github.com/QwenLM/qwen-code/pull/11992)) by @qwen-code-dev-bot
- fix(cli):在无头轮次之前注册模型可调用命令 ([#11994](https://github.com/QwenLM/qwen-code/pull/11994)) by @qqqys
- fix(vscode):使远程窗口的 webview 能够访问工作区守护进程 ([#11983](https://github.com/QwenLM/qwen-code/pull/11983)) by @yiliang114
- fix(cli):使 ink useBoxMetrics 循环保护机制与机器速度解耦 ([#11835](https://github.com/QwenLM/qwen-code/pull/11835)) by @yiliang114
- fix(ci):跳过已完成的桌面端发布流程 ([#12013](https://github.com/QwenLM/qwen-code/pull/12013)) by @yiliang114
- fix(web-shell):在独立 Web Shell 中正确应用 ui.theme 与 general.language 设置 ([#11961](https://github.com/QwenLM/qwen-code/pull/11961)) by @yiliang114
### 文档
- docs(hooks):完善事件目录并修正过时声明 ([#11863](https://github.com/QwenLM/qwen-code/pull/11863)) by @qqqys
- docs(goal):实现移除后,废弃 Stop-hook 时期的相关文档描述 ([#11922](https://github.com/QwenLM/qwen-code/pull/11922)) by @qqqys
- docs(serve):明确守护进程事件恢复契约 ([#12015](https://github.com/QwenLM/qwen-code/pull/12015)) by @wenshao
- docs(users):将新用户引导指向 Token Plan 而非 Coding Plan ([#11980](https://github.com/QwenLM/qwen-code/pull/11980)) by @wenshao
- docs(daemon):完善集成路径指南 ([#12005](https://github.com/QwenLM/qwen-code/pull/12005)) by @yiliang114
### 内部变更
- test:记录 Windows inode 门控隐藏的内容,并取消跳过其中一项 ([#11853](https://github.com/QwenLM/qwen-code/pull/11853)) by @yiliang114
- chore(pnpm):修正 range-key 原理说明并覆盖版本联合情况 ([#11845](https://github.com/QwenLM/qwen-code/pull/11845)) by @yiliang114
- test(cli):在审查清理套件中 mock realpathSync,以确保 Windows 下 cwd 见证生效 ([#11893](https://github.com/QwenLM/qwen-code/pull/11893)) by @yiliang114
- refactor(goal):删除第一代 Stop-hook Goal 实现 ([#11900](https://github.com/QwenLM/qwen-code/pull/11900)) by @qqqys
- refactor(vscode):移除未使用的 token 限制镜像 ([#11946](https://github.com/QwenLM/qwen-code/pull/11946)) by @yiliang114
- ci(desktop):在 CLI 发布时同步发布桌面端应用 ([#11575](https://github.com/QwenLM/qwen-code/pull/11575)) by @yiliang114
- test(cli):修复 Windows 环境下的 bwrap 沙箱套件 (#11968) ([#11970](https://github.com/QwenLM/qwen-code/pull/11970)) by @qwen-code-dev-bot
- refactor(serve):分离 ACP 控制平面与通道测试夹具 ([#11916](https://github.com/QwenLM/qwen-code/pull/11916)) by @wenshao
- test(serve):强化 REST 文档契约检查 ([#12009](https://github.com/QwenLM/qwen-code/pull/12009)) by @yiliang114
**完整更新日志**: https://github.com/QwenLM/qwen-code/compare/v0.23.4...v0.24.0
<!-- qwen-release-notes:v1 -->
## Highlights
_See the complete change list below._
## Breaking Changes
- fix(core)!: let bash expand project directory variables in command hooks ([#11864](https://github.com/QwenLM/qwen-code/pull/11864)) by @qqqys
## Complete Change List
### Features
- feat(core): cap web_search calls per session ([#11852](https://github.com/QwenLM/qwen-code/pull/11852)) by @qqqys
- feat: track background result execution across daemon and web shell ([#11636](https://github.com/QwenLM/qwen-code/pull/11636)) by @ytahdn
- feat(cli): full /hooks dialog in OpenTUI ([#11903](https://github.com/QwenLM/qwen-code/pull/11903)) by @qqqys
- feat(core): emit hook progress events ([#11906](https://github.com/QwenLM/qwen-code/pull/11906)) by @qqqys
- feat(extensions): ship dynamic workflows from extensions ([#11805](https://github.com/QwenLM/qwen-code/pull/11805)) by @qqqys
- feat(channels): add shared output modes with DingTalk support ([#11822](https://github.com/QwenLM/qwen-code/pull/11822)) by @qqqys
- feat(web-shell): slide the active pill between tabs ([#11844](https://github.com/QwenLM/qwen-code/pull/11844)) by @callmeYe
- feat(daemon): enumerate installed extension skills locally ([#11281](https://github.com/QwenLM/qwen-code/pull/11281)) by @callmeYe
- feat(web-shell): follow the reading position in the global turn navigation ([#11801](https://github.com/QwenLM/qwen-code/pull/11801)) by @callmeYe
- feat(workflows): share a per-turn token budget from a +Nk directive ([#11917](https://github.com/QwenLM/qwen-code/pull/11917)) by @qqqys
- feat(serve): add budget-based ACP child admission ([#11911](https://github.com/QwenLM/qwen-code/pull/11911)) by @doudouOUC
- feat(cli): add bwrap kernel sandbox backend for Linux ([#11614](https://github.com/QwenLM/qwen-code/pull/11614)) by @doudouOUC
- feat(core): support external reasoning profiles and defaults ([#11856](https://github.com/QwenLM/qwen-code/pull/11856)) by @callmeYe
- feat(settings): turn cross-session messaging on by default ([#11840](https://github.com/QwenLM/qwen-code/pull/11840)) by @qqqys
- feat(core): run saved workflows by name and pin workflow grants to script content ([#11943](https://github.com/QwenLM/qwen-code/pull/11943)) by @qqqys
- feat(workflow): preserve source references across runs and resumes ([#11931](https://github.com/QwenLM/qwen-code/pull/11931)) by @qqqys
- feat(workflow): correlate agent dispatches and nested workflow calls ([#11932](https://github.com/QwenLM/qwen-code/pull/11932)) by @qqqys
- feat(workflows): size guideline, structure preview and large-run warning ([#11939](https://github.com/QwenLM/qwen-code/pull/11939)) by @qqqys
- feat(workflows): let the model invoke extension workflows that declare whenToUse ([#11957](https://github.com/QwenLM/qwen-code/pull/11957)) by @qqqys
- feat(daemon): support summary projection for prompt and replay APIs ([#11920](https://github.com/QwenLM/qwen-code/pull/11920)) by @ytahdn
- feat(web-shell): add footnote previews and per-turn sources ([#11480](https://github.com/QwenLM/qwen-code/pull/11480)) by @callmeYe
- feat(telemetry): emit a Goal lifecycle event and metrics ([#11927](https://github.com/QwenLM/qwen-code/pull/11927)) by @qqqys
- feat(cli): reload hook registry when /hooks opens ([#11904](https://github.com/QwenLM/qwen-code/pull/11904)) by @qqqys
- feat(serve): reclaim idle ACP children when admission is full ([#11940](https://github.com/QwenLM/qwen-code/pull/11940)) by @doudouOUC
- feat(web-shell): connect to a selected remote daemon ([#11548](https://github.com/QwenLM/qwen-code/pull/11548)) by @yiliang114
- feat(web-shell): preview files from expanded tool details ([#11982](https://github.com/QwenLM/qwen-code/pull/11982)) by @ytahdn
- feat(serve): start workflow runs with args, sourceRef and a caller-supplied script ([#11979](https://github.com/QwenLM/qwen-code/pull/11979)) by @qqqys
- feat(web-shell): customize context details and collapse snapshots ([#11996](https://github.com/QwenLM/qwen-code/pull/11996)) by @ytahdn
- feat(goal): bill foreground subagents and verifier token usage ([#11998](https://github.com/QwenLM/qwen-code/pull/11998)) by @qqqys
- feat(dingtalk): carry sender identity in direct messages ([#12017](https://github.com/QwenLM/qwen-code/pull/12017)) by @BenGuanRan
- feat(goal): show turn and active-time budgets ([#11999](https://github.com/QwenLM/qwen-code/pull/11999)) by @qqqys
- feat(omni): integrate multimodal media pipeline into main ([#12019](https://github.com/QwenLM/qwen-code/pull/12019)) by @LaZzyMan
### Bug Fixes
- fix(cua): preserve Linux observations and REPL diagnostics ([#11829](https://github.com/QwenLM/qwen-code/pull/11829)) by @DragonnZhang
- fix(cua): make Linux input delivery adaptive ([#11876](https://github.com/QwenLM/qwen-code/pull/11876)) by @LaZzyMan
- fix(core): keep escaped whitespace at pipe-list entry edges ([#11860](https://github.com/QwenLM/qwen-code/pull/11860)) by @qqqys
- fix(serve): resolve skill identity from the catalog for toggle guards ([#11831](https://github.com/QwenLM/qwen-code/pull/11831)) by @harjothkhara
- fix(standalone): bundle @lydell/node-pty prebuilds so the web terminal works ([#11881](https://github.com/QwenLM/qwen-code/pull/11881)) by @yiliang114
- fix(cua): bound Linux observations and prepare SDK 0.20.9 ([#11910](https://github.com/QwenLM/qwen-code/pull/11910)) by @LaZzyMan
- fix(cli): scope the ACP permission queue to the session ([#11802](https://github.com/QwenLM/qwen-code/pull/11802)) by @chiga0
- fix(ci): separate autofix runner labels from queued reviews ([#11912](https://github.com/QwenLM/qwen-code/pull/11912)) by @yiliang114
- fix(cli): restore shared Skill status and runner CI checks ([#11933](https://github.com/QwenLM/qwen-code/pull/11933)) by @qqqys
- fix(vscode): retire legacy ACP input bridges ([#11928](https://github.com/QwenLM/qwen-code/pull/11928)) by @yiliang114
- fix(web-shell): show Qwen Live tasks in session sidebar ([#11830](https://github.com/QwenLM/qwen-code/pull/11830)) by @qqqys
- fix(ci): isolate runner schedule fixture module scope ([#11938](https://github.com/QwenLM/qwen-code/pull/11938)) by @doudouOUC
- fix(core): carry the PTY load reason on the call, not in module state ([#11923](https://github.com/QwenLM/qwen-code/pull/11923)) by @yiliang114
- fix(core): keep escaped trailing whitespace when trimming hook matchers ([#11871](https://github.com/QwenLM/qwen-code/pull/11871)) by @yiliang114
- fix(core): expand ${session_id} and stamp User-Agent on the Responses wire ([#11947](https://github.com/QwenLM/qwen-code/pull/11947)) by @yiliang114
- fix(core): keep tool parameters on the MiniMax chat-completions wire ([#11842](https://github.com/QwenLM/qwen-code/pull/11842)) by @yiliang114
- fix(web-shell): stop the approval sheet resizing while reading ([#11930](https://github.com/QwenLM/qwen-code/pull/11930)) by @ytahdn
- fix(release): gate pool-routed validation jobs on a disk floor ([#11972](https://github.com/QwenLM/qwen-code/pull/11972)) by @qwen-code-dev-bot
- fix(web-shell): preserve separators in tool description paths ([#11977](https://github.com/QwenLM/qwen-code/pull/11977)) by @ytahdn
- fix(core): persist Goal turn endings outside model history ([#11924](https://github.com/QwenLM/qwen-code/pull/11924)) by @qqqys
- fix(web-shell): keep the recap below a turn's outputs and dedupe it ([#11986](https://github.com/QwenLM/qwen-code/pull/11986)) by @ytahdn
- fix(ci): heal the docker lock cache ownership in e2e-test-linux (#11990) ([#11992](https://github.com/QwenLM/qwen-code/pull/11992)) by @qwen-code-dev-bot
- fix(cli): register model-invocable commands before headless turns ([#11994](https://github.com/QwenLM/qwen-code/pull/11994)) by @qqqys
- fix(vscode): reach the workspace daemon from a remote window's webview ([#11983](https://github.com/QwenLM/qwen-code/pull/11983)) by @yiliang114
- fix(cli): make the ink useBoxMetrics loop guard independent of machine speed ([#11835](https://github.com/QwenLM/qwen-code/pull/11835)) by @yiliang114
- fix(ci): skip completed desktop releases ([#12013](https://github.com/QwenLM/qwen-code/pull/12013)) by @yiliang114
- fix(web-shell): honor ui.theme and general.language in the standalone Web Shell ([#11961](https://github.com/QwenLM/qwen-code/pull/11961)) by @yiliang114
### Documentation
- docs(hooks): complete the event catalog and correct stale claims ([#11863](https://github.com/QwenLM/qwen-code/pull/11863)) by @qqqys
- docs(goal): retire the Stop-hook era prose after the implementation was removed ([#11922](https://github.com/QwenLM/qwen-code/pull/11922)) by @qqqys
- docs(serve): clarify daemon event recovery contracts ([#12015](https://github.com/QwenLM/qwen-code/pull/12015)) by @wenshao
- docs(users): point onboarding at Token Plan instead of Coding Plan ([#11980](https://github.com/QwenLM/qwen-code/pull/11980)) by @wenshao
- docs(daemon): complete integration path guide ([#12005](https://github.com/QwenLM/qwen-code/pull/12005)) by @yiliang114
### Internal Changes
- test: record what the Windows inode gates are hiding, and un-skip one ([#11853](https://github.com/QwenLM/qwen-code/pull/11853)) by @yiliang114
- chore(pnpm): correct the range-key rationale and cover the version union ([#11845](https://github.com/QwenLM/qwen-code/pull/11845)) by @yiliang114
- test(cli): mock realpathSync in the review cleanup suite so the cwd witness holds on Windows ([#11893](https://github.com/QwenLM/qwen-code/pull/11893)) by @yiliang114
- refactor(goal): delete the first-generation Stop-hook Goal implementation ([#11900](https://github.com/QwenLM/qwen-code/pull/11900)) by @qqqys
- refactor(vscode): remove unused token limit mirror ([#11946](https://github.com/QwenLM/qwen-code/pull/11946)) by @yiliang114
- ci(desktop): publish the desktop app when the CLI releases ([#11575](https://github.com/QwenLM/qwen-code/pull/11575)) by @yiliang114
- test(cli): unbreak the bwrap sandbox suites on the Windows lane (#11968) ([#11970](https://github.com/QwenLM/qwen-code/pull/11970)) by @qwen-code-dev-bot
- refactor(serve): separate ACP control plane and channel harness ([#11916](https://github.com/QwenLM/qwen-code/pull/11916)) by @wenshao
- test(serve): harden REST docs contract checks ([#12009](https://github.com/QwenLM/qwen-code/pull/12009)) by @yiliang114
**Full Changelog**: https://github.com/QwenLM/qwen-code/compare/v0.23.4...v0.24.0