@qwen-code/qwen-code 0.23.4 → 0.23.5-dev.codemode-responses.20260915.f024b37689

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/bundled/computer-use/SKILL.md +239 -22
  2. package/bundled/computer-use/references/windows-linux.md +3 -3
  3. package/bundled/qc-helper/docs/features/computer-use.md +2 -2
  4. package/bundled/qc-helper/docs/features/hooks.md +238 -75
  5. package/chunks/{MaxSizedBox-Q44AWRWI.js → MaxSizedBox-BFMIFJWT.js} +10 -10
  6. package/chunks/{StandaloneSessionPicker-UKII7M7U.js → StandaloneSessionPicker-4ZH7MOVG.js} +23 -23
  7. package/chunks/{acp-subagent-executor-7RUAOXE7.js → acp-subagent-executor-AHMVA4P3.js} +11 -11
  8. package/chunks/{acpAgent-5N3LHCO3.js → acpAgent-UMAJ3XR3.js} +43 -43
  9. package/chunks/{agent-LU5UJALC.js → agent-CXB2CCQN.js} +4 -4
  10. package/chunks/{agent-headless-LTLADUGR.js → agent-headless-7D5ZC736.js} +4 -4
  11. package/chunks/{bridge-P34XQP3D.js → bridge-A2WKX6IK.js} +11 -11
  12. package/chunks/{channel-settings-store-VE4ARRSR.js → channel-settings-store-AXJIN7HG.js} +15 -15
  13. package/chunks/{chunk-RJFUPP3F.js → chunk-3544ZEGZ.js} +2 -2
  14. package/chunks/{chunk-WLFILD4T.js → chunk-3CKAOJ4L.js} +2 -2
  15. package/chunks/{chunk-2P2IXKDR.js → chunk-4DTFTPTU.js} +1 -1
  16. package/chunks/{chunk-5JG3DAKS.js → chunk-4OQSG35W.js} +1 -1
  17. package/chunks/{chunk-E7HXORS7.js → chunk-54YUXX7X.js} +1 -1
  18. package/chunks/{chunk-2NRKLYID.js → chunk-5KJ54DY3.js} +12 -12
  19. package/chunks/{chunk-IUXWAKVS.js → chunk-5WLF44DS.js} +5 -5
  20. package/chunks/{chunk-RWKR4VNK.js → chunk-67ZDP7UX.js} +1 -1
  21. package/chunks/{chunk-WDB57HEI.js → chunk-6RQFMGN2.js} +3 -3
  22. package/chunks/{chunk-PNACDSCO.js → chunk-6XDB3FR4.js} +23 -23
  23. package/chunks/{chunk-BBMOAZ2E.js → chunk-6YUS5JCV.js} +3 -3
  24. package/chunks/{chunk-JZ3FFPES.js → chunk-A2UYI473.js} +5 -5
  25. package/chunks/{chunk-PCIYPEYV.js → chunk-C3YMBSLR.js} +3 -3
  26. package/chunks/{chunk-RKXAOP6F.js → chunk-DQ4LBRZN.js} +3 -3
  27. package/chunks/{chunk-UGEDTVL6.js → chunk-DWKFTUGI.js} +3 -3
  28. package/chunks/{chunk-PVKEYO5D.js → chunk-E7ZTAOJZ.js} +4 -4
  29. package/chunks/{chunk-P6XVYPWA.js → chunk-EQWKIA72.js} +22 -4
  30. package/chunks/{chunk-X7GOO6VM.js → chunk-EYLUKEYW.js} +1 -1
  31. package/chunks/{chunk-TRKIKBUW.js → chunk-FCLMJS6N.js} +1 -1
  32. package/chunks/{chunk-KLGCF6G7.js → chunk-FHSOZSBO.js} +2 -2
  33. package/chunks/{chunk-RHTNPDGD.js → chunk-FIP5QS2U.js} +1 -1
  34. package/chunks/{chunk-J4DRBDHX.js → chunk-FPPG5Y3W.js} +4 -4
  35. package/chunks/{chunk-62MWBTS7.js → chunk-FX6GJIPZ.js} +2 -2
  36. package/chunks/{chunk-TJDUJSVH.js → chunk-GFAK6DYU.js} +1 -1
  37. package/chunks/{chunk-H7L725Z6.js → chunk-GMCEFKNR.js} +8 -8
  38. package/chunks/{chunk-UUT7EFX3.js → chunk-GNKSR3FU.js} +1 -1
  39. package/chunks/{chunk-BDDE4YNP.js → chunk-HVSRWLOW.js} +3 -3
  40. package/chunks/{chunk-TW2RLZPC.js → chunk-HXMDDII6.js} +3 -3
  41. package/chunks/{chunk-E4XZSQXB.js → chunk-IANIY25T.js} +10 -10
  42. package/chunks/{chunk-3AYIKQTJ.js → chunk-IWOJ2FHG.js} +3 -3
  43. package/chunks/{chunk-7JGH6IMU.js → chunk-JIJ65YKA.js} +37 -5
  44. package/chunks/{chunk-UL4DXZMP.js → chunk-JLF2AQAL.js} +3 -3
  45. package/chunks/{chunk-MFPAVOYJ.js → chunk-JO67LVXW.js} +3 -3
  46. package/chunks/{chunk-4XP7WXC4.js → chunk-L5R4D5T4.js} +2 -2
  47. package/chunks/{chunk-7GKPKIUB.js → chunk-LBWIJ5T7.js} +1 -1
  48. package/chunks/{chunk-P225AM5U.js → chunk-LCAJ63TF.js} +1 -1
  49. package/chunks/{chunk-IR5CVY5G.js → chunk-LTINUI3O.js} +2 -2
  50. package/chunks/{chunk-SQCZDHBQ.js → chunk-MNRK6MIH.js} +3 -3
  51. package/chunks/{chunk-IGLX6UXJ.js → chunk-NJ4ZNDVP.js} +1 -1
  52. package/chunks/{chunk-LFNK4DGQ.js → chunk-PPE7VUMD.js} +1 -1
  53. package/chunks/{chunk-SYDMM6IX.js → chunk-Q4G2YPI4.js} +1 -1
  54. package/chunks/{chunk-ITOB3LRT.js → chunk-QI4WBHPF.js} +4 -4
  55. package/chunks/{chunk-L5BVU4JW.js → chunk-QJKR2P2K.js} +2 -2
  56. package/chunks/{chunk-6TFZIA2L.js → chunk-QLX4D55R.js} +1 -1
  57. package/chunks/{chunk-M6MID3FA.js → chunk-QS5Q5F42.js} +2 -2
  58. package/chunks/{chunk-FRISMWG3.js → chunk-QTUQV33C.js} +2 -2
  59. package/chunks/{chunk-WKQX4FND.js → chunk-R5OA3ONY.js} +3 -3
  60. package/chunks/{chunk-I6JRN375.js → chunk-RN6BU77T.js} +2 -2
  61. package/chunks/{chunk-PRWRNC64.js → chunk-S77FFY67.js} +1 -1
  62. package/chunks/{chunk-LMDMYMSS.js → chunk-SGXJQP5Q.js} +3 -3
  63. package/chunks/{chunk-65ANUQSV.js → chunk-SKYOAH4Z.js} +2 -2
  64. package/chunks/{chunk-VQ3SUPLA.js → chunk-SNT634Q6.js} +4 -4
  65. package/chunks/{chunk-7W2Y3PZD.js → chunk-TPEV2QHG.js} +4 -4
  66. package/chunks/{chunk-QM2MRAG4.js → chunk-TYBRGFYL.js} +40 -27
  67. package/chunks/{chunk-OXDQETZA.js → chunk-UCKM6KCJ.js} +1 -1
  68. package/chunks/{chunk-L56E7YUM.js → chunk-UQXURNLM.js} +1 -1
  69. package/chunks/{chunk-7ML2ZLQF.js → chunk-UY4OCBX4.js} +1 -1
  70. package/chunks/{chunk-K2DCZ6SZ.js → chunk-VI5UVPOB.js} +10 -10
  71. package/chunks/{chunk-ZXUKZHMV.js → chunk-W23HOFDK.js} +1 -1
  72. package/chunks/{chunk-VELFTVEO.js → chunk-WATHOB6X.js} +3 -3
  73. package/chunks/{chunk-DCRVSIK6.js → chunk-WBP64MZR.js} +79 -35
  74. package/chunks/{chunk-WMEX6CFP.js → chunk-XK4UQSIR.js} +1 -1
  75. package/chunks/{chunk-EOQXU3ZE.js → chunk-XKRYQOHS.js} +2 -2
  76. package/chunks/{chunk-F2IRY2TD.js → chunk-Y3ZXDBUL.js} +1 -1
  77. package/chunks/{chunk-ELHAQ5H4.js → chunk-YVWS4SLL.js} +2 -2
  78. package/chunks/{chunk-WNQRJXKP.js → chunk-Z6Q7I37O.js} +1 -1
  79. package/chunks/{chunk-O75ZXPOX.js → chunk-ZC75SULX.js} +1 -1
  80. package/chunks/{chunk-JLZ5YCMV.js → chunk-ZOQ6HC7U.js} +2 -2
  81. package/chunks/{chunk-DGTH4BSO.js → chunk-ZUKC5J6Q.js} +10 -10
  82. package/chunks/{codex-subagent-executor-WCRCJMQK.js → codex-subagent-executor-LANZAZPH.js} +11 -11
  83. package/chunks/{config-utils-73C3RGYN.js → config-utils-CRK2LQPA.js} +10 -10
  84. package/chunks/{contextCommand-4ZDPQJHD.js → contextCommand-GY5X3LIY.js} +11 -11
  85. package/chunks/{core-runtime-ZDUA5DYE.js → core-runtime-IJIV2LHP.js} +10 -10
  86. package/chunks/{create-sub-session-JK3SSJKO.js → create-sub-session-MNIVRHGB.js} +11 -11
  87. package/chunks/{daemon-git-worktree-guard-QU2CCJIE.js → daemon-git-worktree-guard-W6Z2BGDH.js} +10 -10
  88. package/chunks/{daemon-status-provider-2PO7NLDQ.js → daemon-status-provider-TJF3APU3.js} +15 -15
  89. package/chunks/{daemon-trust-policy-IMDTIUWB.js → daemon-trust-policy-6INCISDU.js} +15 -15
  90. package/chunks/{daemon-trust-policy-monitor-6IVBNUAD.js → daemon-trust-policy-monitor-JRTAQG54.js} +15 -15
  91. package/chunks/{deferred-core-runtime-3AZUE7F3.js → deferred-core-runtime-2JRTPTNM.js} +10 -10
  92. package/chunks/{edit-HXMBABZU.js → edit-JDIXXCYB.js} +4 -4
  93. package/chunks/{enterPlanMode-KAMW2I2C.js → enterPlanMode-YTNTBZBN.js} +4 -4
  94. package/chunks/{environment-HYMXOTVB.js → environment-UAI5L52V.js} +12 -12
  95. package/chunks/{errors-NQRH7NAM.js → errors-J4UCDCW5.js} +12 -12
  96. package/chunks/{exitPlanMode-SMEBS5EF.js → exitPlanMode-YMWJ2EO7.js} +4 -4
  97. package/chunks/{fast-path-CUWUTJUR.js → fast-path-MBAN7TK3.js} +2 -2
  98. package/chunks/{glob-VOM5DVZ3.js → glob-YEM24E3Z.js} +4 -4
  99. package/chunks/{goal-tools-YBYJ5KPM.js → goal-tools-LJIVH5T6.js} +4 -4
  100. package/chunks/{handleAutoUpdate-4CEHNJ2F.js → handleAutoUpdate-DYCSYDYL.js} +12 -12
  101. package/chunks/{i18n-G7ODGUGN.js → i18n-PTAV7SN3.js} +10 -10
  102. package/chunks/{initializer-GZ73HSOA.js → initializer-MPXTKQA4.js} +15 -15
  103. package/chunks/{installationInfo-PV472I52.js → installationInfo-U5EFA3OL.js} +10 -10
  104. package/chunks/{list-D4A7LFOF.js → list-YOE25QUI.js} +18 -18
  105. package/chunks/{llm-PJU4VT3K.js → llm-ZZ2WNQMC.js} +42 -42
  106. package/chunks/{llm-content-generator-ITOMDK65.js → llm-content-generator-CG2HRJZC.js} +2 -2
  107. package/chunks/{loadedSettingsAdapter-NNU4BY5Q.js → loadedSettingsAdapter-NPGWGURF.js} +15 -15
  108. package/chunks/{loggingContentGenerator-SMI2AJYY.js → loggingContentGenerator-TUL6SJVL.js} +5 -5
  109. package/chunks/{managed-npm-update-AN5RDI5D.js → managed-npm-update-YUDSCJP3.js} +10 -10
  110. package/chunks/{mcp-RIIEZ7NJ.js → mcp-EX3GDQVO.js} +15 -15
  111. package/chunks/{model-configuration-E5M35A3M.js → model-configuration-6DEKTXJI.js} +15 -15
  112. package/chunks/{modelConfigUtils-43SY2EDS.js → modelConfigUtils-4NA2MHEE.js} +11 -11
  113. package/chunks/{monitor-5WYDOXLI.js → monitor-PPUGNAWR.js} +4 -4
  114. package/chunks/{nonInteractiveCli-D3YFYXNB.js → nonInteractiveCli-6TW2XYP5.js} +37 -37
  115. package/chunks/{notebook-edit-GQNFJTIR.js → notebook-edit-4MUXHZHT.js} +4 -4
  116. package/chunks/{openaiContentGenerator-VJAKFZ32.js → openaiContentGenerator-5J73W5XZ.js} +3 -3
  117. package/chunks/{pidfile-I5SWEJDX.js → pidfile-M7WELKBB.js} +10 -10
  118. package/chunks/{processUtils-NSYM3SKR.js → processUtils-SPRINFNY.js} +2 -2
  119. package/chunks/{prompt-terminal-ledger-KWBANHUE.js → prompt-terminal-ledger-25BRD7FX.js} +11 -11
  120. package/chunks/{qwenContentGenerator-LR6HNFBU.js → qwenContentGenerator-H5AAKXPC.js} +5 -5
  121. package/chunks/{read-file-LOSUPKDX.js → read-file-ILGEFPB3.js} +2 -2
  122. package/chunks/{resumeHistoryUtils-6IFK3MQO.js → resumeHistoryUtils-RB52QOCH.js} +11 -11
  123. package/chunks/{ripGrep-MBSYRHNP.js → ripGrep-O6QAFHQK.js} +3 -3
  124. package/chunks/{run-qwen-serve-WYEEYIHV.js → run-qwen-serve-5NO3TKUL.js} +38 -38
  125. package/chunks/{runtime-FVTTOB4E.js → runtime-G2YUYMSZ.js} +16 -16
  126. package/chunks/{scheduled-tasks-RN6DUY7E.js → scheduled-tasks-HDHV3URA.js} +14 -14
  127. package/chunks/{scheduler-T7DDWINW.js → scheduler-6MDJX2ZK.js} +12 -12
  128. package/chunks/{serve-LVMPJBTV.js → serve-Z2EJQYKB.js} +15 -15
  129. package/chunks/{server-U7K7EJEP.js → server-JTNBK3LH.js} +38 -38
  130. package/chunks/{session-BQNC5QUN.js → session-5YK2BXH4.js} +38 -38
  131. package/chunks/{session-attachments-root-LQDHWZST.js → session-attachments-root-QO3VFJS6.js} +10 -10
  132. package/chunks/{session-pr-refresh-J7DQYX2I.js → session-pr-refresh-OTK3HCJZ.js} +13 -13
  133. package/chunks/{settings-WAWJIZHR.js → settings-2VKLACYV.js} +14 -14
  134. package/chunks/{shell-WFJEYGQI.js → shell-64NAVGMS.js} +4 -4
  135. package/chunks/{skill-RHQWSDOK.js → skill-R3ALMLLM.js} +2 -2
  136. package/chunks/{skill-settings-ALFUQQD6.js → skill-settings-HZ34TUMP.js} +14 -14
  137. package/chunks/{spawnChannel-D35CB5JB.js → spawnChannel-XGFWHEIK.js} +10 -10
  138. package/chunks/{standalone-update-NMMY6CAO.js → standalone-update-R32Y3XRR.js} +11 -11
  139. package/chunks/{start-opentui-ui-F6BN46GE.js → start-opentui-ui-YGJOUE2H.js} +50 -49
  140. package/chunks/{startInteractiveUI-E6U7L5AD.js → startInteractiveUI-5ZEVKSFF.js} +57 -56
  141. package/chunks/{team-create-DKAJ3OUY.js → team-create-GCVUXJLE.js} +4 -4
  142. package/chunks/{team-plan-approval-ZUG32DAK.js → team-plan-approval-NOL62FJD.js} +4 -4
  143. package/chunks/{terminal-image-renderer-U3Z5PMGO.js → terminal-image-renderer-WG5TLPGC.js} +10 -10
  144. package/chunks/{theme-manager-GA65ZFKB.js → theme-manager-HDS4YFPW.js} +10 -10
  145. package/chunks/{tool-search-XCEN7VXX.js → tool-search-HMT5GYUR.js} +2 -2
  146. package/chunks/{total-session-admission-FZSHBR32.js → total-session-admission-Y5RCHEXO.js} +11 -11
  147. package/chunks/{tree-sitter-4D7QS7F6.js → tree-sitter-LSORDVZ3.js} +1 -1
  148. package/chunks/{tree-sitter-bash-VEJGF5XF.js → tree-sitter-bash-UARELQ6C.js} +1 -1
  149. package/chunks/{trustedFolders-SXPNZESV.js → trustedFolders-3Y2WCXMR.js} +11 -11
  150. package/chunks/{update-relaunch-QOUTZZ7Q.js → update-relaunch-MTJ32SLF.js} +5 -5
  151. package/chunks/{updateCheck-DYRX7M34.js → updateCheck-YFX3VY6O.js} +10 -10
  152. package/chunks/{useAutoAcceptIndicator-QOG7LUT3.js → useAutoAcceptIndicator-FCHNQPMD.js} +16 -16
  153. package/chunks/{validateNonInterActiveAuth-FJPAEMDD.js → validateNonInterActiveAuth-HUFQKCGG.js} +35 -35
  154. package/chunks/{version-5IC46F2Z.js → version-S5TGWCA3.js} +1 -1
  155. package/chunks/{web-fetch-WSW4QZBA.js → web-fetch-23M7BYHB.js} +2 -2
  156. package/chunks/{web-search-5QFKXWUV.js → web-search-F5PNIQUA.js} +9 -3
  157. package/chunks/{workflow-ZF4DLK4V.js → workflow-BLJLID2C.js} +5 -5
  158. package/chunks/{workspace-providers-status-4E4XWBFS.js → workspace-providers-status-UH7KLZDT.js} +17 -17
  159. package/chunks/{workspace-registration-store-M3QEP27F.js → workspace-registration-store-3SA3V7BA.js} +1 -1
  160. package/chunks/{workspace-registry-H2ENI5G2.js → workspace-registry-C6C6EKQ5.js} +11 -11
  161. package/chunks/{workspace-runtime-coordinator-CRRNB7PC.js → workspace-runtime-coordinator-RAI6XDJB.js} +11 -11
  162. package/chunks/{workspace-service-GJ2GOHKU.js → workspace-service-H7UTJYJU.js} +16 -16
  163. package/chunks/{workspace-skills-status-CRWHV35X.js → workspace-skills-status-FPVC7XXK.js} +15 -15
  164. package/chunks/{workspace-trust-reconciler-GG2JA7KI.js → workspace-trust-reconciler-JS7A6UIF.js} +16 -16
  165. package/chunks/{write-file-LZ4EMF36.js → write-file-GQGG7NBQ.js} +5 -5
  166. package/chunks/{zoom-image-J5IMS3WD.js → zoom-image-EC43KL4H.js} +2 -2
  167. package/cli.js +12 -12
  168. package/export-transcript-document.js +1 -1
  169. package/package.json +3 -3
  170. package/web-shell/assets/{abnfDiagram-VCTEODGH-S_JCiANq.js → abnfDiagram-VCTEODGH-BtpzKw3A.js} +1 -1
  171. package/web-shell/assets/{arc-DP-839Xn.js → arc-CQiVKZJP.js} +1 -1
  172. package/web-shell/assets/{architectureDiagram-5GKGNRK7-C8rCd2KK.js → architectureDiagram-5GKGNRK7-ekIPBb2d.js} +1 -1
  173. package/web-shell/assets/{blockDiagram-NRAW4CY4-DQR82jwr.js → blockDiagram-NRAW4CY4-BrRWkWri.js} +1 -1
  174. package/web-shell/assets/{c4Diagram-UCG6FXSJ-D21PNMRP.js → c4Diagram-UCG6FXSJ-qYS8CYZ3.js} +1 -1
  175. package/web-shell/assets/channel-DSQQnOZj.js +1 -0
  176. package/web-shell/assets/{chunk-2Q5K7J3B-KdDInGLi.js → chunk-2Q5K7J3B-ZasyyEZm.js} +1 -1
  177. package/web-shell/assets/{chunk-5VM5RSS4-ltb7zRmH.js → chunk-5VM5RSS4-C_IzCGeA.js} +1 -1
  178. package/web-shell/assets/{chunk-F27PBJKO-DcpQA0Ng.js → chunk-F27PBJKO-C25NZOyD.js} +1 -1
  179. package/web-shell/assets/{chunk-G27WJ6UU-C8NDZxcy.js → chunk-G27WJ6UU-XPOHNSGX.js} +1 -1
  180. package/web-shell/assets/{chunk-JWPE2WC7-hXhhHTs1.js → chunk-JWPE2WC7-BQBh0Xni.js} +1 -1
  181. package/web-shell/assets/{chunk-LCL6LL3I-CLaOR-Hl.js → chunk-LCL6LL3I-CoShjpX7.js} +1 -1
  182. package/web-shell/assets/{chunk-POPQ4Y6H-Y5_qlB1N.js → chunk-POPQ4Y6H-BwRmCDSz.js} +1 -1
  183. package/web-shell/assets/{chunk-SVP7TREG-BWX2Voh7.js → chunk-SVP7TREG-DSzE5-Mw.js} +1 -1
  184. package/web-shell/assets/{chunk-XXDRQBXY-1wmj_kXI.js → chunk-XXDRQBXY-BQSQv30h.js} +1 -1
  185. package/web-shell/assets/classDiagram-DTDB5LWJ-V94ta08R.js +1 -0
  186. package/web-shell/assets/classDiagram-v2-JRS7N3AN-V94ta08R.js +1 -0
  187. package/web-shell/assets/{cose-bilkent-JH36ORCC-DpLc-cdd.js → cose-bilkent-JH36ORCC-XVUVTHVo.js} +1 -1
  188. package/web-shell/assets/{cynefin-OW5HDTMX-DhxGiPZW.js → cynefin-OW5HDTMX-CrsKx4lQ.js} +1 -1
  189. package/web-shell/assets/{cynefinDiagram-5FMLGOSQ-Dl3jfBry.js → cynefinDiagram-5FMLGOSQ-BPeZEuHw.js} +1 -1
  190. package/web-shell/assets/{dagre-3AP2YEHR-C8FA8vJk.js → dagre-3AP2YEHR-D31cQ2Qs.js} +1 -1
  191. package/web-shell/assets/{diagram-S7CK7UJ4-D-quIUtW.js → diagram-S7CK7UJ4-zyiG097Q.js} +1 -1
  192. package/web-shell/assets/{diagram-UQ7AKVKN-Bjo09Uts.js → diagram-UQ7AKVKN-Br3vtfsy.js} +1 -1
  193. package/web-shell/assets/{diagram-VSXAHHWV-IoI3ttq4.js → diagram-VSXAHHWV-Bxkhjx4u.js} +1 -1
  194. package/web-shell/assets/{diagram-VX7I27RA-BKyOZ5SO.js → diagram-VX7I27RA-BQH8QiDk.js} +1 -1
  195. package/web-shell/assets/{diagram-Z3DM3KII-Cu_OHEhw.js → diagram-Z3DM3KII-B_aQ1cw0.js} +1 -1
  196. package/web-shell/assets/{ebnfDiagram-PWID7BFC-UVB-bbPg.js → ebnfDiagram-PWID7BFC-B9N7BRQE.js} +1 -1
  197. package/web-shell/assets/{erDiagram-SSCWMZ5O-l8drddto.js → erDiagram-SSCWMZ5O-Cx6Hb1Re.js} +1 -1
  198. package/web-shell/assets/{flowDiagram-A5DVABFB-DU1I_VAI.js → flowDiagram-A5DVABFB-DTuLP7GU.js} +1 -1
  199. package/web-shell/assets/{ganttDiagram-EL5Y4UJY-BLRH05uB.js → ganttDiagram-EL5Y4UJY-DYS3d-sL.js} +1 -1
  200. package/web-shell/assets/{gitGraphDiagram-WWUBYQGX-Czg_BkRE.js → gitGraphDiagram-WWUBYQGX-Cp0EGx04.js} +1 -1
  201. package/web-shell/assets/{index-CmMV8Jla.js → index-45-LkPDB.js} +1 -1
  202. package/web-shell/assets/{index-DyMtNYuu.js → index-H8um-iEl.js} +3 -3
  203. package/web-shell/assets/{infoDiagram-RXCK75RN-BpBvjkro.js → infoDiagram-RXCK75RN-9--kukiT.js} +1 -1
  204. package/web-shell/assets/{ishikawaDiagram-5VMMS53U-phy1l3jm.js → ishikawaDiagram-5VMMS53U-CGBdsDLD.js} +1 -1
  205. package/web-shell/assets/{journeyDiagram-EYS64GPL-oY-9LgVS.js → journeyDiagram-EYS64GPL-DeXhcscd.js} +1 -1
  206. package/web-shell/assets/{kanban-definition-3QL26DDD-slZoy-sc.js → kanban-definition-3QL26DDD-CFdvsU3b.js} +1 -1
  207. package/web-shell/assets/{layout-0hnn_P9l.js → layout-DAnwQ3KB.js} +1 -1
  208. package/web-shell/assets/{linear-7Wqe8DRy.js → linear-CTo7v7Nh.js} +1 -1
  209. package/web-shell/assets/{mermaid.core-BaK8n0bq.js → mermaid.core-jggSxF1i.js} +6 -6
  210. package/web-shell/assets/{mindmap-definition-FBJOCRG2-BedUdy_E.js → mindmap-definition-FBJOCRG2-DzIepvlJ.js} +1 -1
  211. package/web-shell/assets/{pegDiagram-XKGWAZYB-DQLRdmxq.js → pegDiagram-XKGWAZYB-BFGS9GJv.js} +1 -1
  212. package/web-shell/assets/{pieDiagram-E7YTZNPT-UC20w9-5.js → pieDiagram-E7YTZNPT-B2UUcNIT.js} +1 -1
  213. package/web-shell/assets/{quadrantDiagram-AXDQQJYC-CQx2Hmk3.js → quadrantDiagram-AXDQQJYC-BgM6htrX.js} +1 -1
  214. package/web-shell/assets/{railroadDiagram-O6MQD6OU-2UEJe_y-.js → railroadDiagram-O6MQD6OU-Dk9cS7N-.js} +1 -1
  215. package/web-shell/assets/{requirementDiagram-EFPCY7ZU-DOAJggB4.js → requirementDiagram-EFPCY7ZU-C9oRg7xi.js} +1 -1
  216. package/web-shell/assets/{sankeyDiagram-P5KCCOFB-DnQ_qJo7.js → sankeyDiagram-P5KCCOFB-B-_c7GzI.js} +1 -1
  217. package/web-shell/assets/{sequenceDiagram-WJ2MYXX4-DZrZUoCo.js → sequenceDiagram-WJ2MYXX4-R0M-347u.js} +1 -1
  218. package/web-shell/assets/{sizeCapture-X5ZJPWSS-B5G4GDQB.js → sizeCapture-X5ZJPWSS-Df0f8UAW.js} +1 -1
  219. package/web-shell/assets/{stateDiagram-HBIQ2CUA-Bn1cT0qF.js → stateDiagram-HBIQ2CUA-CsUEfAA-.js} +1 -1
  220. package/web-shell/assets/stateDiagram-v2-4QOOHH4V-CnSuTPJ2.js +1 -0
  221. package/web-shell/assets/{swimlanes-XN3QIQJK-Bzhcdn87.js → swimlanes-XN3QIQJK-9OGHVSrx.js} +1 -1
  222. package/web-shell/assets/swimlanesDiagram-VK2B7HYN-Bb7TcWQw.js +8 -0
  223. package/web-shell/assets/{timeline-definition-24CTP7MA-BqZ_3D10.js → timeline-definition-24CTP7MA-DAfGqS2B.js} +1 -1
  224. package/web-shell/assets/{vennDiagram-4TSXK5OY-z9kw1kmm.js → vennDiagram-4TSXK5OY-CKATpwHi.js} +1 -1
  225. package/web-shell/assets/{wardleyDiagram-VM6X3IG4-Cydp1zJW.js → wardleyDiagram-VM6X3IG4-CQHdhTrm.js} +1 -1
  226. package/web-shell/assets/{xychartDiagram-S5SC5T6Z-j4X1lQKo.js → xychartDiagram-S5SC5T6Z-5k9NLqlY.js} +1 -1
  227. package/web-shell/index.html +1 -1
  228. package/web-shell/assets/channel-BgGrpX_z.js +0 -1
  229. package/web-shell/assets/classDiagram-DTDB5LWJ-jUH7ADYs.js +0 -1
  230. package/web-shell/assets/classDiagram-v2-JRS7N3AN-jUH7ADYs.js +0 -1
  231. package/web-shell/assets/stateDiagram-v2-4QOOHH4V-BF3xtNvJ.js +0 -1
  232. package/web-shell/assets/swimlanesDiagram-VK2B7HYN-B753mA3E.js +0 -8
@@ -70,7 +70,7 @@ Command hooks execute commands via child processes. Input JSON is passed through
70
70
  "hooks": [
71
71
  {
72
72
  "type": "command",
73
- "command": "$QWEN_PROJECT_DIR/.qwen/hooks/security-check.sh",
73
+ "command": "\"$QWEN_PROJECT_DIR/.qwen/hooks/security-check.sh\"",
74
74
  "name": "security-check",
75
75
  "timeout": 10
76
76
  }
@@ -81,6 +81,10 @@ Command hooks execute commands via child processes. Input JSON is passed through
81
81
  }
82
82
  ```
83
83
 
84
+ `QWEN_PROJECT_DIR`, `CLAUDE_PROJECT_DIR` and `GEMINI_PROJECT_DIR` are set to the project directory in the environment of every command hook. Bash hooks read them from the environment, so double-quote them like any other shell variable, as in `"$QWEN_PROJECT_DIR/.qwen/hooks/security-check.sh"`. For cmd hooks, and for a bare `$QWEN_PROJECT_DIR` in PowerShell hooks, the variable is replaced with the quoted project directory before the command runs; `$env:QWEN_PROJECT_DIR` also works in PowerShell.
85
+
86
+ Migration: bash hooks used to have these variables replaced in the command text before the shell ran, and that replacement has been removed. A bash hook that leaves the variable unquoted in a project path containing spaces, or writes it inside single quotes such as `'$QWEN_PROJECT_DIR/hook.sh'`, must now double-quote it: `"$QWEN_PROJECT_DIR/hook.sh"`.
87
+
84
88
  ### HTTP Hooks
85
89
 
86
90
  HTTP hooks send hook input as POST requests to specified URLs. They support URL whitelists, DNS-level SSRF protection, environment variable interpolation, and other security features.
@@ -339,49 +343,58 @@ When `ok` is `false`, Qwen Code will continue working and use the `reason` as co
339
343
 
340
344
  Hooks fire at specific points during a Qwen Code session. Different events support different matchers to filter trigger conditions.
341
345
 
342
- | Event | Triggered When | Matcher Target |
343
- | :------------------- | :----------------------------------------------- | :------------------------------------------------------------- |
344
- | `PreToolUse` | Before tool execution | Tool id (`write_file`, `read_file`, `run_shell_command`, etc.) |
345
- | `PostToolUse` | After successful tool execution | Tool id |
346
- | `PostToolUseFailure` | After tool execution fails | Tool id |
347
- | `UserPromptSubmit` | Before supported model invocations | None |
348
- | `SessionStart` | When session starts or resumes | Source (`startup`, `resume`, `clear`, `compact`) |
349
- | `SessionEnd` | When session ends | Reason (`clear`, `logout`, `prompt_input_exit`, etc.) |
350
- | `SessionDelete` | After an explicitly selected session is deleted | None |
351
- | `MessageDisplay` | Repeatedly, as the reply streams | None (always fires) |
352
- | `Stop` | When Claude prepares to conclude response | None (always fires) |
353
- | `SubagentStart` | When subagent starts | Agent type (`Bash`, `Explorer`, `Plan`, etc.) |
354
- | `SubagentStop` | When subagent stops | Agent type |
355
- | `PreCompact` | Before conversation compaction | Trigger (`manual`, `auto`) |
356
- | `Notification` | When notifications are sent | Type (`permission_prompt`, `idle_prompt`, `auth_success`) |
357
- | `PermissionRequest` | When permission dialog is shown | Tool id |
358
- | `PermissionDenied` | When AUTO-mode classification denies a tool call | Tool id |
359
- | `TodoCreated` | When a new todo item is created | None (always fires) |
360
- | `TodoCompleted` | When a todo item is marked as completed | None (always fires) |
346
+ | Event | Triggered When | Matcher Target |
347
+ | :-------------------- | :--------------------------------------------------------------------- | :--------------------------------------------------------------- |
348
+ | `PreToolUse` | Before tool execution | Tool id (`write_file`, `read_file`, `run_shell_command`, etc.) |
349
+ | `PostToolUse` | After successful tool execution | Tool id |
350
+ | `PostToolUseFailure` | After tool execution fails | Tool id |
351
+ | `PostToolBatch` | Once after every tool call in a batch has resolved | None (always fires) |
352
+ | `UserPromptSubmit` | Before supported model invocations | None |
353
+ | `UserPromptExpansion` | After a slash command expands into a prompt, before the prompt is sent | Command name, without the leading `/` |
354
+ | `SessionStart` | When session starts or resumes | Source (`startup`, `resume`, `clear`, `compact`) |
355
+ | `SessionEnd` | When session ends | Reason (`clear`, `logout`, `prompt_input_exit`, etc.) |
356
+ | `SessionDelete` | After an explicitly selected session is deleted | None |
357
+ | `MessageDisplay` | Repeatedly, as the reply streams | None (always fires) |
358
+ | `Stop` | Before the turn ends | None (always fires) |
359
+ | `StopFailure` | When an API error or loop detection ends the turn, instead of `Stop` | Error type (`rate_limit`, `server_error`, `loop_detected`, etc.) |
360
+ | `SubagentStart` | When subagent starts | Agent type (`Bash`, `Explorer`, `Plan`, etc.) |
361
+ | `SubagentStop` | When subagent stops | Agent type |
362
+ | `PreCompact` | Before conversation compaction | Trigger (`manual`, `auto`) |
363
+ | `PostCompact` | After conversation compaction succeeds | Trigger (`manual`, `auto`) |
364
+ | `Notification` | When notifications are sent | Type (`permission_prompt`, `idle_prompt`, `auth_success`) |
365
+ | `PermissionRequest` | When permission dialog is shown | Tool id |
366
+ | `PermissionDenied` | When AUTO-mode classification denies a tool call | Tool id |
367
+ | `TodoCreated` | When a new todo item is created | None (always fires) |
368
+ | `TodoCompleted` | When a todo item is marked as completed | None (always fires) |
369
+ | `InstructionsLoaded` | When a context file such as `QWEN.md`, or a file it imports, is loaded | File path of the loaded file |
361
370
 
362
371
  ### Matcher Patterns
363
372
 
364
373
  `matcher` is a regular expression used to filter trigger conditions.
365
374
 
366
- | Event Type | Events | Matcher Support | Matcher Target |
367
- | :------------------ | :----------------------------------------------------------------------------------------- | :-------------- | :------------------------------------------------------------ |
368
- | Tool Events | `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest`, `PermissionDenied` | ✅ Regex | Tool id: `write_file`, `read_file`, `run_shell_command`, etc. |
369
- | Subagent Events | `SubagentStart`, `SubagentStop` | Regex | Agent type: `Bash`, `Explorer`, etc. |
370
- | Session Events | `SessionStart` | ✅ Regex | Source: `startup`, `resume`, `clear`, `compact` |
371
- | Session Events | `SessionEnd` | ✅ Regex | Reason: `clear`, `logout`, `prompt_input_exit`, etc. |
372
- | Session Events | `SessionDelete` | No | N/A |
373
- | Notification Events | `Notification` | Regex | Type: `permission_prompt`, `idle_prompt`, `auth_success` |
374
- | Compact Events | `PreCompact` | ✅ Regex | Trigger: `manual`, `auto` |
375
- | Todo Events | `TodoCreated`, `TodoCompleted` | No | N/A |
376
- | Prompt Events | `UserPromptSubmit` | ❌ No | N/A |
377
- | Stop Events | `Stop` | ❌ No | N/A |
378
- | Message Display | `MessageDisplay` | No | N/A |
375
+ | Event Type | Events | Matcher Support | Matcher Target |
376
+ | :------------------ | :----------------------------------------------------------------------------------------- | :-------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- |
377
+ | Tool Events | `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest`, `PermissionDenied` | ✅ Regex | Tool id: `write_file`, `read_file`, `run_shell_command`, etc. |
378
+ | Tool Events | `PostToolBatch` | No | N/A |
379
+ | Subagent Events | `SubagentStart`, `SubagentStop` | ✅ Regex | Agent type: `Bash`, `Explorer`, etc. |
380
+ | Session Events | `SessionStart` | ✅ Regex | Source: `startup`, `resume`, `clear`, `compact` |
381
+ | Session Events | `SessionEnd` | Regex | Reason: `clear`, `logout`, `prompt_input_exit`, etc. |
382
+ | Session Events | `SessionDelete` | No | N/A |
383
+ | Notification Events | `Notification` | ✅ Regex | Type: `permission_prompt`, `idle_prompt`, `auth_success` |
384
+ | Compact Events | `PreCompact`, `PostCompact` | Regex | Trigger: `manual`, `auto` |
385
+ | Todo Events | `TodoCreated`, `TodoCompleted` | ❌ No | N/A |
386
+ | Prompt Events | `UserPromptSubmit` | ❌ No | N/A |
387
+ | Prompt Events | `UserPromptExpansion` | Regex | Command name without the leading `/`, for example `init` |
388
+ | Stop Events | `Stop` | ❌ No | N/A |
389
+ | Stop Events | `StopFailure` | ✅ Regex | Error type: `rate_limit`, `authentication_failed`, `billing_error`, `invalid_request`, `server_error`, `max_output_tokens`, `loop_detected`, `unknown` |
390
+ | Message Display | `MessageDisplay` | ❌ No | N/A |
391
+ | Instruction Events | `InstructionsLoaded` | ✅ Regex | File path of the loaded file |
379
392
 
380
393
  **Matcher Syntax:**
381
394
 
382
395
  - Empty string `""`, `"*"` or `".*"` matches all events of that type
383
396
  - A matcher is first compared exactly. In a `|`-separated list such as `permission_prompt | idle_prompt`, the matcher matches when any entry, ignoring spaces around it, is `*`, `.*`, or exactly the value, unless the whole matcher starts with `^` or `(`, in which case it is only a regular expression. Only a `|` outside `[...]` and groups, and not escaped with a backslash, separates entries: the pipes in `notes\|todo\.md`, `foo[ |]bar` and `a(b | c)` are part of the regular expression, and the spaces around them are kept. List entries are never read as regular expressions on their own
384
- - Otherwise the matcher is an unanchored regular expression (e.g., `^run_shell_command$`, `read_.*`, `(write_file|edit)`). For a list that does not start with `^` or `(`, the expression is built from the trimmed, non-empty entries, so a stray `|` as in `read_(file|edit)|` is ignored and never makes the matcher match everything, and a matcher of only `|` matches nothing. A matcher that starts with `^` or `(` is compiled exactly as written, so a trailing `|` there, as in `^write_file|`, does make it match everything. Because the expression is unanchored, `read` also matches `read_file` and `edit` also matches `notebook_edit`. Add `^` and `$` to match a whole value, and anchor exclusions as well: `^(?!write_file).*$` excludes `write_file`, while unanchored `(?!write_file).*` still matches it
397
+ - Otherwise the matcher is an unanchored regular expression (e.g., `^run_shell_command$`, `read_.*`, `(write_file|edit)`). For a list that does not start with `^` or `(`, the expression is built from the trimmed, non-empty entries (an escaped space at an entry's edge, as in `\.env\ |\.pem`, is kept), so a stray `|` as in `read_(file|edit)|` is ignored and never makes the matcher match everything, and a matcher of only `|` matches nothing. A matcher that starts with `^` or `(` is compiled exactly as written, so a trailing `|` there, as in `^write_file|`, does make it match everything. Because the expression is unanchored, `read` also matches `read_file` and `edit` also matches `notebook_edit`. Add `^` and `$` to match a whole value, and anchor exclusions as well: `^(?!write_file).*$` excludes `write_file`, while unanchored `(?!write_file).*` still matches it
385
398
  - The same rules apply to every event that supports a matcher, and to hooks registered by skills
386
399
  - Tool hooks receive the runtime tool id in `tool_name` (for example, `write_file`). Built-in display names such as `WriteFile` and `ReadFile` are also accepted as matcher aliases for compatibility, and so are the tool names permission rules accept, including Claude Code's `Bash`, `Read` and `Write`, so a matcher copied from a Claude Code config such as `"Bash"` or `"Write|Edit"` works unchanged. New configs should still prefer runtime ids. Aliases are only compared exactly, so anchor runtime ids (`^write_file$`), not display names. Each alias names exactly one tool: unlike a permission rule, a `Read` matcher does not also cover `grep_search` or `glob`, and a `Bash` matcher does not cover `monitor`.
387
400
 
@@ -459,11 +472,13 @@ Qwen does not control whether a hook process, endpoint, callback, or model provi
459
472
  "timestamp": "string",
460
473
  "permission_mode": "default | plan | auto_edit | auto | yolo",
461
474
  "agent_id": "string (only when the event fires inside a subagent)",
462
- "prompt_id": "string (when the event belongs to a model turn)"
475
+ "prompt_id": "string (when the event belongs to a model turn)",
476
+ "source_type": "string (only when the session has a declared source)",
477
+ "source_id": "string (only when the session source has an id)"
463
478
  }
464
479
  ```
465
480
 
466
- Event-specific fields are added based on the hook type. `permission_mode` is the session's approval mode unless the event reports the mode that applied to it, as tool and subagent events do. `agent_id` is present only when the event fires inside a subagent; `agent_type` is reported on `SessionStart`, `SubagentStart` and `SubagentStop`.
481
+ Event-specific fields are added based on the hook type. `permission_mode` is the session's approval mode unless the event reports the mode that applied to it, as tool and subagent events do. `agent_id` is present only when the event fires inside a subagent; `agent_type` is reported on `SessionStart`, `SubagentStart` and `SubagentStop`. `source_type` and `source_id` appear only in ACP sessions whose client declared a session source when creating the session.
467
482
 
468
483
  Hook input is a forward-extensible JSON contract: new optional fields can be added to existing events. Consumers should ignore unknown fields. A strict decoder that rejects unknown properties must be updated to explicitly allow each new optional field before upgrading Qwen Code. For security-sensitive hooks, a decoder failure can change fail-open or fail-closed behavior, so administrators must validate the upgraded payload against the deployed hook before rollout.
469
484
 
@@ -479,6 +494,8 @@ Hook output is returned via `stdout` (command) or HTTP response body (http) as J
479
494
  | `2` | **Blocking error**. Ignores `stdout`, passes `stderr` as error feedback to the model. |
480
495
  | Other | Non-blocking error. `stderr` only shown in debug mode, execution continues. |
481
496
 
497
+ Adding plain text to the model context applies only to a command hook's `stdout`. An HTTP hook's response body is read as JSON only when its `Content-Type` is `application/json`; any other non-empty body becomes a `systemMessage` on every event. An HTTP hook that adds context must return JSON with `hookSpecificOutput.additionalContext`.
498
+
482
499
  **Output Structure:**
483
500
 
484
501
  Hook output supports three categories of fields:
@@ -509,7 +526,7 @@ Hook output supports three categories of fields:
509
526
 
510
527
  ```json
511
528
  {
512
- "permission_mode": "default | plan | auto_edit | yolo",
529
+ "permission_mode": "default | plan | auto_edit | auto | yolo",
513
530
  "tool_name": "name of the tool being executed",
514
531
  "tool_input": "object containing the tool's input parameters",
515
532
  "tool_use_id": "unique identifier for this tool use instance (internal format, e.g., toolu_xxx)",
@@ -555,7 +572,7 @@ For `"ask"`, the TUI displays `permissionDecisionReason` as literal text rather
555
572
 
556
573
  ```json
557
574
  {
558
- "permission_mode": "default | plan | auto_edit | yolo",
575
+ "permission_mode": "default | plan | auto_edit | auto | yolo",
559
576
  "tool_name": "name of the tool that was executed",
560
577
  "tool_input": "object containing the tool's input parameters",
561
578
  "tool_response": "object containing the tool's response",
@@ -591,7 +608,7 @@ For `"ask"`, the TUI displays `permissionDecisionReason` as literal text rather
591
608
 
592
609
  ```json
593
610
  {
594
- "permission_mode": "default | plan | auto_edit | yolo",
611
+ "permission_mode": "default | plan | auto_edit | auto | yolo",
595
612
  "tool_use_id": "unique identifier for the tool use (internal format, e.g., toolu_xxx)",
596
613
  "tool_call_id": "original API call ID from the LLM provider (e.g., call_xxx for OpenAI/Qwen) (optional)",
597
614
  "tool_name": "name of the tool that failed",
@@ -617,6 +634,51 @@ For `"ask"`, the TUI displays `permissionDecisionReason` as literal text rather
617
634
  }
618
635
  ```
619
636
 
637
+ #### PostToolBatch
638
+
639
+ **Purpose**: Runs once after all tool calls in a batch have resolved, before their results are returned to the model. Use it to review the batch as a whole, add context to it, or stop it.
640
+
641
+ **Matcher**: None. `PostToolBatch` always fires, and a `matcher` on it is ignored.
642
+
643
+ **Event-specific fields**:
644
+
645
+ ```json
646
+ {
647
+ "permission_mode": "default | plan | auto_edit | auto | yolo",
648
+ "tool_calls": [
649
+ {
650
+ "tool_name": "runtime tool id, for example run_shell_command",
651
+ "tool_input": "object containing the tool's input parameters",
652
+ "tool_use_id": "the call id from the model's request",
653
+ "tool_call_id": "the same call id (optional)",
654
+ "status": "success | error | cancelled",
655
+ "tool_response": "object with response_parts, result_display, error, error_type, execution_status, content_length and, when present, vision_bridge_notice (optional)"
656
+ }
657
+ ]
658
+ }
659
+ ```
660
+
661
+ **Output Options**:
662
+
663
+ - `hookSpecificOutput.additionalContext`: appended to the result of the last call in the batch, after a blank line. `<` and `>` are escaped.
664
+ - `decision`: `"block"` or `"deny"` stops the batch, and so does `continue: false` or exit code 2. The last call's result is replaced by an error that carries `stopReason`, or `reason` when there is no `stopReason`. The other results are kept, and `additionalContext` is still appended.
665
+ - `stopReason` / `reason`: the text of that error.
666
+
667
+ If the hooks fail, or do not finish within 15 seconds, the batch continues with its results unchanged.
668
+
669
+ **Example Output**:
670
+
671
+ ```json
672
+ {
673
+ "decision": "block",
674
+ "reason": "This batch edited files outside the allowed directory",
675
+ "hookSpecificOutput": {
676
+ "hookEventName": "PostToolBatch",
677
+ "additionalContext": "Ask the user before retrying these edits."
678
+ }
679
+ }
680
+ ```
681
+
620
682
  #### UserPromptSubmit
621
683
 
622
684
  **Purpose**: Executed before supported model invocations to validate, block, or enrich their input. On the core/headless path, the event currently covers `UserQuery`, `ToolResult`, and `Hook` sends, while `Retry`, `Steer`, `Cron`, `Notification`, and `Teammate` sends are skipped. It can therefore occur on continuation paths, and `prompt` must not be assumed to be raw user input. The ACP session path has its own invocation policy: retries and newly dispatched background tasks can still invoke legacy hooks; continue, restored-question, and runtime-goal turns do not.
@@ -719,6 +781,43 @@ When sent to the model, injected `additionalContext` is appended as its own mess
719
781
  }
720
782
  ```
721
783
 
784
+ #### UserPromptExpansion
785
+
786
+ **Purpose**: Runs when a slash command expands into a prompt for the model, after the expansion and before the prompt is sent. This covers commands that submit a prompt, such as custom commands, skills, MCP prompts and built-in commands like `/init`. Commands that only act locally do not fire it. It fires in the interactive UI, headless runs and ACP sessions, and when the model runs a model-invocable command.
787
+
788
+ **Matcher**: Matches against `command_name`. For example, `"matcher": "^init$"` fires only for `/init`.
789
+
790
+ **Event-specific fields**:
791
+
792
+ ```json
793
+ {
794
+ "command_name": "slash command name without the leading /",
795
+ "command_args": "argument text after the command name",
796
+ "prompt": "the expanded prompt, with non-text parts rendered as text"
797
+ }
798
+ ```
799
+
800
+ When a headless or ACP message invokes several skills at once, `command_name` is their names joined by spaces and `command_args` is the remaining text.
801
+
802
+ **Output Options**:
803
+
804
+ - `decision`: `"block"` or `"deny"` stops the expanded prompt from being sent, and so does `continue: false` or exit code 2. The user sees `UserPromptExpansion blocked: <reason>`; for a model-invoked command, that message is returned as the error.
805
+ - `reason` / `stopReason`: the text shown in that message.
806
+ - `hookSpecificOutput.additionalContext`: appended to the expanded prompt after a blank line. `&`, `<` and `>` are escaped, and the result is cut to 10,000 characters.
807
+
808
+ A command hook that exits 0 with plain-text `stdout` has that text treated as `additionalContext` (see [Exit Code Behavior](#hook-output-structure)).
809
+
810
+ **Example Output**:
811
+
812
+ ```json
813
+ {
814
+ "hookSpecificOutput": {
815
+ "hookEventName": "UserPromptExpansion",
816
+ "additionalContext": "Follow the repository's CONTRIBUTING.md when generating QWEN.md."
817
+ }
818
+ }
819
+ ```
820
+
722
821
  #### SessionStart
723
822
 
724
823
  **Purpose**: Executed when a new session starts to perform initialization tasks.
@@ -727,7 +826,7 @@ When sent to the model, injected `additionalContext` is appended as its own mess
727
826
 
728
827
  ```json
729
828
  {
730
- "permission_mode": "default | plan | auto_edit | yolo",
829
+ "permission_mode": "default | plan | auto_edit | auto | yolo",
731
830
  "source": "startup | resume | clear | compact",
732
831
  "model": "the model being used",
733
832
  "agent_type": "the type of agent if applicable (optional)"
@@ -818,7 +917,9 @@ The hook uses the deleting runtime's normal session fields (`session_id`, `trans
818
917
  "last_assistant_message": "the last message from the assistant",
819
918
  "context_usage": "ratio of context window used (may exceed 1 when tokens exceed window; optional)",
820
919
  "context_limit": "context window size in tokens (optional)",
821
- "input_tokens": "prompt token count (may include output tokens depending on provider; optional)"
920
+ "input_tokens": "prompt token count (may include output tokens depending on provider; optional)",
921
+ "background_tasks": "array of background tasks, each with id, status, agent_type, started_at and optional description",
922
+ "crons": "array of scheduled jobs, each with id, schedule, prompt, recurring, enabled and optional next_run and last_run"
822
923
  }
823
924
  ```
824
925
 
@@ -845,23 +946,25 @@ The `context_usage`, `context_limit`, and `input_tokens` fields allow hook scrip
845
946
 
846
947
  #### StopFailure
847
948
 
848
- **Purpose**: Executed when the turn ends due to an API error or loop detection (instead of Stop). This is a **fire-and-forget** event - hook output and exit codes are ignored.
949
+ **Purpose**: Runs instead of `Stop` when an API error or loop detection ends the turn. API errors fire it in the interactive UI and in ACP sessions, but not in headless (`-p`) runs. Loop detection fires it in the interactive UI and in headless runs, but not in ACP sessions. This is a **fire-and-forget** event: Qwen does not wait for the hooks, and their output and exit codes are ignored.
849
950
 
850
951
  **Event-specific fields**:
851
952
 
852
953
  ```json
853
954
  {
854
955
  "error": "rate_limit | authentication_failed | billing_error | invalid_request | server_error | max_output_tokens | loop_detected | unknown",
855
- "error_details": "detailed error message (optional)",
856
- "last_assistant_message": "the last message from the assistant before the error (optional)"
956
+ "error_details": "the error message, or the loop type for loop_detected (optional)",
957
+ "last_assistant_message": "optional; the interactive UI currently sets it to the formatted error text"
857
958
  }
858
959
  ```
859
960
 
961
+ For API errors, `error` is derived from the HTTP status and the error message: status 429 or "rate limit" gives `rate_limit`; 401 or "unauthorized" gives `authentication_failed`; 402, 403, "billing" or "quota" gives `billing_error`; 400 or "invalid" gives `invalid_request`; any other status of 500 or above gives `server_error`; "max_tokens" or "token limit" gives `max_output_tokens`; anything else is `unknown`. The checks run in that order.
962
+
860
963
  **Matcher**: Matches against the `error` field. For example, `"matcher": "rate_limit"` will only trigger for rate limit errors.
861
964
 
862
965
  **Output Options**:
863
966
 
864
- - **None** - StopFailure is fire-and-forget. All hook output and exit codes are ignored.
967
+ - **None** - StopFailure is fire-and-forget. All hook output, errors and exit codes are discarded.
865
968
 
866
969
  **Exit Code Handling**:
867
970
 
@@ -907,7 +1010,7 @@ A command hook is left to finish if Qwen exits after dispatch; its stdout and st
907
1010
 
908
1011
  ```json
909
1012
  {
910
- "permission_mode": "default | plan | auto_edit | yolo",
1013
+ "permission_mode": "default | plan | auto_edit | auto | yolo",
911
1014
  "agent_id": "identifier for the subagent",
912
1015
  "agent_type": "type of agent (Bash, Explorer, Plan, Custom, etc.)"
913
1016
  }
@@ -936,12 +1039,14 @@ A command hook is left to finish if Qwen exits after dispatch; its stdout and st
936
1039
 
937
1040
  ```json
938
1041
  {
939
- "permission_mode": "default | plan | auto_edit | yolo",
1042
+ "permission_mode": "default | plan | auto_edit | auto | yolo",
940
1043
  "stop_hook_active": "false on the first stop check; true when the subagent is continuing because a SubagentStop hook blocked its previous stop",
941
1044
  "agent_id": "identifier for the subagent",
942
1045
  "agent_type": "type of agent",
943
1046
  "agent_transcript_path": "path to the subagent's transcript",
944
- "last_assistant_message": "the last message from the subagent"
1047
+ "last_assistant_message": "the last message from the subagent",
1048
+ "background_tasks": "array of background tasks, same shape as in Stop",
1049
+ "crons": "array of scheduled jobs, same shape as in Stop"
945
1050
  }
946
1051
  ```
947
1052
 
@@ -989,32 +1094,22 @@ A command hook is left to finish if Qwen exits after dispatch; its stdout and st
989
1094
 
990
1095
  #### PostCompact
991
1096
 
992
- **Purpose**: Executed after conversation compaction completes to archive summaries or track usage.
1097
+ **Purpose**: Runs after a conversation compaction succeeds, to archive the summary or track usage. It does not fire when compaction fails. Qwen waits for the hooks to finish before continuing.
993
1098
 
994
1099
  **Event-specific fields**:
995
1100
 
996
1101
  ```json
997
1102
  {
998
1103
  "trigger": "manual | auto",
999
- "compact_summary": "the summary generated by the compaction process"
1104
+ "compact_summary": "the summary that replaced the compacted history, without its <analysis> block"
1000
1105
  }
1001
1106
  ```
1002
1107
 
1003
- **Matcher**: Matches against the `trigger` field. For example, `"matcher": "manual"` will only trigger for manual compaction via `/compact` command.
1108
+ **Matcher**: Matches against the `trigger` field: `manual` when compaction was requested, for example with `/compress`, and `auto` when Qwen compacts on its own. For example, `"matcher": "manual"` fires only for requested compactions.
1004
1109
 
1005
1110
  **Output Options**:
1006
1111
 
1007
- - `hookSpecificOutput.additionalContext`: additional context (for logging only)
1008
- - Standard hook output fields (for logging only)
1009
-
1010
- **Note**: PostCompact is **not** in the official decision mode supported events list. The `decision` field and other control fields do not produce any control effects - they are only used for logging purposes.
1011
-
1012
- **Exit Code Handling**:
1013
-
1014
- | Exit Code | Behavior |
1015
- | --------- | --------------------------------------------------------- |
1016
- | 0 | Success - stdout shown to user in verbose mode |
1017
- | Other | Non-blocking error - stderr shown to user in verbose mode |
1112
+ - **None** - PostCompact output is ignored. `decision`, `continue`, `additionalContext` and exit codes have no effect.
1018
1113
 
1019
1114
  **Example Configuration**:
1020
1115
 
@@ -1083,7 +1178,7 @@ A command hook is left to finish if Qwen exits after dispatch; its stdout and st
1083
1178
 
1084
1179
  ```json
1085
1180
  {
1086
- "permission_mode": "default | plan | auto_edit | yolo",
1181
+ "permission_mode": "default | plan | auto_edit | auto | yolo",
1087
1182
  "tool_name": "name of the tool requesting permission",
1088
1183
  "tool_input": "object containing the tool's input parameters",
1089
1184
  "permission_suggestions": "array of suggested permissions (optional)"
@@ -1113,6 +1208,30 @@ A command hook is left to finish if Qwen exits after dispatch; its stdout and st
1113
1208
  }
1114
1209
  ```
1115
1210
 
1211
+ #### PermissionDenied
1212
+
1213
+ **Purpose**: Runs when the AUTO-mode classifier blocks a tool call, including when repeated blocks make Qwen fall back to asking the user. It reports the denial and cannot approve or change the call. Qwen waits for the hooks before continuing; a hook failure is logged and does not change the outcome.
1214
+
1215
+ **Matcher**: Matches against the tool id, like the other tool events.
1216
+
1217
+ **Event-specific fields**:
1218
+
1219
+ ```json
1220
+ {
1221
+ "tool_name": "runtime tool id of the denied call",
1222
+ "tool_input": "object containing the tool's input parameters",
1223
+ "tool_use_id": "the call id",
1224
+ "tool_call_id": "the same call id (optional)",
1225
+ "reason": "classifier_blocked | classifier_unavailable"
1226
+ }
1227
+ ```
1228
+
1229
+ `reason` is currently always `classifier_blocked`. `classifier_unavailable` is defined, but a call denied because the classifier returned no verdict does not fire this event.
1230
+
1231
+ **Output Options**:
1232
+
1233
+ - **None** - PermissionDenied output and exit codes are ignored.
1234
+
1116
1235
  #### TodoCreated
1117
1236
 
1118
1237
  **Purpose**: Executed when a new todo item is created via the `todo_write` tool. Allows validation, logging, or blocking of todo creation.
@@ -1311,6 +1430,34 @@ exit 0
1311
1430
  - **Workflow Control**: Block completion until prerequisites are met
1312
1431
  - **Integration**: Sync todos with external task management systems (Jira, Trello, etc.)
1313
1432
 
1433
+ #### InstructionsLoaded
1434
+
1435
+ **Purpose**: Runs for each context file Qwen loads into the system prompt, such as `QWEN.md`, and for each file those files import. Use it to audit which instruction files a session uses. It is informational: it cannot stop or change loading.
1436
+
1437
+ It fires when the session starts, when context files are reloaded during the session, and for every file pulled in through an import, after the file has been read. Qwen waits for the hooks before it continues loading; a hook failure is logged and does not stop loading.
1438
+
1439
+ **Matcher**: Matches against `file_path`. For example, `"matcher": "QWEN\\.local\\.md$"` fires only for local context files.
1440
+
1441
+ **Event-specific fields**:
1442
+
1443
+ ```json
1444
+ {
1445
+ "file_path": "path of the loaded file",
1446
+ "memory_type": "user | project | local | extension",
1447
+ "load_reason": "session_start | include | refresh",
1448
+ "trigger_file_path": "for include: the context file whose loading pulled this file in (optional)",
1449
+ "parent_file_path": "for include: the file that contains the import (optional)"
1450
+ }
1451
+ ```
1452
+
1453
+ `load_reason` is `session_start` for the initial load, `refresh` when context files are reloaded, and `include` for a file reached through an import.
1454
+
1455
+ `memory_type` is `extension` for an extension's context files and files in its directory, `user` for files in the global `.qwen` directory or directly in your home directory, `local` for `.qwen/QWEN.local.md` at the project root, and `project` for any other file. An imported file has the same `memory_type` as the context file that imported it.
1456
+
1457
+ **Output Options**:
1458
+
1459
+ - **None** - InstructionsLoaded output and exit codes are ignored.
1460
+
1314
1461
  ## Hook Configuration
1315
1462
 
1316
1463
  Hooks are configured in Qwen Code settings, typically in `.qwen/settings.json` or user configuration files:
@@ -1360,14 +1507,14 @@ Hooks are configured in Qwen Code settings, typically in `.qwen/settings.json` o
1360
1507
 
1361
1508
  Only `command` type supports asynchronous execution. Setting `"async": true` runs the hook in the background without blocking the main flow.
1362
1509
 
1363
- Async hooks are scoped to the Qwen process because their captured output is delivered through the in-memory async hook registry. On POSIX, Qwen reclaims a still-running async hook process tree when it exits, except for event types whose sections explicitly guarantee fire-and-forget completion after exit. Windows cannot reconstruct a descendant tree after its root exits, so full parent-exit reclamation there requires a Job Object or descendant tracking.
1510
+ Async hooks are scoped to the Qwen process. On POSIX, Qwen reclaims a still-running async hook process tree when it exits, except for event types whose sections explicitly guarantee fire-and-forget completion after exit. Windows cannot reconstruct a descendant tree after its root exits, so full parent-exit reclamation there requires a Job Object or descendant tracking.
1364
1511
 
1365
1512
  **Features:**
1366
1513
 
1367
- - Cannot return decision control (operation has already occurred)
1368
- - Results are injected in the next conversation turn via `systemMessage` or `additionalContext`, except for output-ignored fire-and-forget event types documented above
1369
- - Suitable for auditing, logging, background testing, etc.
1370
- - Occupies one of 10 concurrent async hook slots until it finishes or reaches its `timeout` (60 seconds by default)
1514
+ - Cannot return decision control (the event continues as soon as the hook starts)
1515
+ - Output is not delivered yet: `systemMessage`, `additionalContext` and plain `stdout` from an async hook are neither shown to the user nor added to the model context. The debug log records only that the hook started, completed or failed. Delivering this output is planned.
1516
+ - Suitable for side effects such as auditing, logging and background tests that write their results somewhere you can read them
1517
+ - Occupies one of 10 concurrent async hook slots until it finishes or reaches its `timeout` (60 seconds by default). While all 10 slots are in use, a new async hook is skipped
1371
1518
 
1372
1519
  **Example:**
1373
1520
 
@@ -1380,7 +1527,7 @@ Async hooks are scoped to the Qwen process because their captured output is deli
1380
1527
  "hooks": [
1381
1528
  {
1382
1529
  "type": "command",
1383
- "command": "$QWEN_PROJECT_DIR/.qwen/hooks/run-tests-async.sh",
1530
+ "command": "\"$QWEN_PROJECT_DIR/.qwen/hooks/run-tests-async.sh\"",
1384
1531
  "async": true,
1385
1532
  "timeout": 300
1386
1533
  }
@@ -1396,11 +1543,12 @@ Async hooks are scoped to the Qwen process because their captured output is deli
1396
1543
  INPUT=$(cat)
1397
1544
  FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
1398
1545
  if [[ "$FILE_PATH" != *.ts && "$FILE_PATH" != *.js ]]; then exit 0; fi
1399
- RESULT=$(npm test 2>&1)
1400
- if [ $? -eq 0 ]; then
1401
- echo "{\"systemMessage\": \"Tests passed after editing $FILE_PATH\"}"
1546
+ # Async hook output is not shown yet, so write the result to a file.
1547
+ LOG=/tmp/qwen-async-tests.log
1548
+ if npm test >"$LOG" 2>&1; then
1549
+ echo "Tests passed after editing $FILE_PATH" >>"$LOG"
1402
1550
  else
1403
- echo "{\"systemMessage\": \"Tests failed: $RESULT\"}"
1551
+ echo "Tests failed after editing $FILE_PATH" >>"$LOG"
1404
1552
  fi
1405
1553
  ```
1406
1554
 
@@ -1565,9 +1713,24 @@ sys.exit(0)
1565
1713
 
1566
1714
  ## Troubleshooting
1567
1715
 
1568
- - Check application logs for hook execution details
1716
+ ### A hook does not fire
1717
+
1718
+ 1. **Event name.** The key must be one of the events in [Hook Events](#hook-events), spelled exactly, including case. An unknown event name is skipped with the warning `Invalid hook event name`.
1719
+ 2. **Matcher.** Tool events match the runtime tool id, such as `run_shell_command` or `write_file`, or an accepted alias such as Claude Code's `Bash` or `Write` (see [Matcher Patterns](#matcher-patterns)). On events without matcher support, `matcher` is ignored.
1720
+ 3. **Folder trust.** Hooks in a project's `.qwen/settings.json` load only when the folder is trusted. User hooks load regardless of folder trust.
1721
+ 4. **Hooks disabled.** `"disableAllHooks": true`, `--safe-mode` (or `QWEN_CODE_SAFE_MODE`) and `--bare` (or `QWEN_CODE_SIMPLE`) turn off all hooks, including user hooks.
1722
+ 5. **Debug log.** Start Qwen Code with `--debug`, or set `QWEN_DEBUG_LOG_FILE=1`, then read the session log at `~/.qwen/debug/latest` (under `$QWEN_RUNTIME_DIR` when that is set). Each line is tagged with a namespace:
1723
+ - `[HOOK_REGISTRY]`: `Hook registry initialized with N hook entries`, and hook definitions discarded as invalid
1724
+ - `[TRUSTED_HOOKS]`: `Hook <name> started for event <event>` and the matching `ended` line for each run, async hook status, and hook system messages
1725
+ - `[HOOK_MATCHER]`: matchers that are not valid regular expressions
1726
+ - `[HOOK_TIMEOUT]`: command hook `timeout` values read as milliseconds or ignored
1727
+ - `[HTTP_HOOK_RUNNER]`, `[URL_VALIDATOR]`, `[PROMPT_HOOK_RUNNER]`, `[FUNCTION_HOOK_RUNNER]`, `[SKILL_HOOKS]`, `[SESSION_HOOKS_MANAGER]`, `[ASYNC_HOOK_REGISTRY]` and `[HOOK_AGGREGATOR]`: details from the individual runners and registries
1728
+
1729
+ Prompt-hook inputs can be written to the session debug log, so apply appropriate access and retention controls.
1730
+
1731
+ ### Other checks
1732
+
1569
1733
  - Verify hook script permissions and executability
1570
1734
  - Ensure proper JSON formatting in hook outputs
1571
1735
  - Use specific matcher patterns to avoid unintended hook execution
1572
- - Use `--debug` mode to see detailed hook matching and execution information. Prompt-hook inputs can be written to the session debug log, so apply appropriate access and retention controls.
1573
1736
  - Temporarily disable all hooks: add `"disableAllHooks": true` in settings
@@ -14,25 +14,25 @@ import "./chunk-47ECGEJC.js";
14
14
  import "./chunk-2MIN6GRR.js";
15
15
  import "./chunk-QHTIBUWB.js";
16
16
  import "./chunk-RKUWKYED.js";
17
- import "./chunk-I6JRN375.js";
17
+ import "./chunk-RN6BU77T.js";
18
18
  import "./chunk-GELRJXE2.js";
19
19
  import "./chunk-32CM56LO.js";
20
20
  import "./chunk-6WXVEDT2.js";
21
21
  import "./chunk-LJZSMWOH.js";
22
- import "./chunk-7JGH6IMU.js";
23
- import "./chunk-KLGCF6G7.js";
22
+ import "./chunk-JIJ65YKA.js";
23
+ import "./chunk-FHSOZSBO.js";
24
24
  import "./chunk-EKMJR7M3.js";
25
25
  import "./chunk-EDB556X7.js";
26
26
  import "./chunk-QR4Q425T.js";
27
- import "./chunk-UUT7EFX3.js";
27
+ import "./chunk-GNKSR3FU.js";
28
28
  import "./chunk-DJXSOEFB.js";
29
29
  import "./chunk-5VQR2DD7.js";
30
30
  import "./chunk-BUQN5LTI.js";
31
31
  import "./chunk-ZPJWUGCS.js";
32
32
  import "./chunk-YM6KUQ2S.js";
33
- import "./chunk-LMDMYMSS.js";
34
- import "./chunk-TJDUJSVH.js";
35
- import "./chunk-DCRVSIK6.js";
33
+ import "./chunk-SGXJQP5Q.js";
34
+ import "./chunk-GFAK6DYU.js";
35
+ import "./chunk-WBP64MZR.js";
36
36
  import "./chunk-GOFAQQZA.js";
37
37
  import "./chunk-HEOH7JZY.js";
38
38
  import "./chunk-TWPJO254.js";
@@ -41,7 +41,7 @@ import "./chunk-65I7S4Z3.js";
41
41
  import "./chunk-7CLLH5TI.js";
42
42
  import "./chunk-WK6DEH3Q.js";
43
43
  import "./chunk-6PVPNMXU.js";
44
- import "./chunk-5JG3DAKS.js";
44
+ import "./chunk-4OQSG35W.js";
45
45
  import "./chunk-ME4JBHSB.js";
46
46
  import "./chunk-GNV2SFO7.js";
47
47
  import "./chunk-5EZRLTLQ.js";
@@ -90,7 +90,7 @@ import "./chunk-C75BXMPM.js";
90
90
  import "./chunk-KFFCDLKV.js";
91
91
  import "./chunk-KP2FHIFR.js";
92
92
  import "./chunk-L6DIANLD.js";
93
- import "./chunk-TRKIKBUW.js";
93
+ import "./chunk-FCLMJS6N.js";
94
94
  import "./chunk-5ETULJLP.js";
95
95
  import "./chunk-7MIBD3LG.js";
96
96
  import "./chunk-VGC4I5JJ.js";
@@ -102,7 +102,7 @@ import "./chunk-WZAD4ZNJ.js";
102
102
  import "./chunk-ARDHE6MM.js";
103
103
  import "./chunk-FPGTNKCP.js";
104
104
  import "./chunk-TIGXX4PA.js";
105
- import "./chunk-7W2Y3PZD.js";
105
+ import "./chunk-TPEV2QHG.js";
106
106
  import "./chunk-XFFRI3WM.js";
107
107
  import "./chunk-ERU3SDXT.js";
108
108
  import "./chunk-EWJTAP3Y.js";