@qwen-code/qwen-code 0.23.3 → 0.23.4-nightly.20260914.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.
- package/bundled/computer-use/SKILL.md +219 -154
- package/bundled/computer-use/references/macos.md +208 -0
- package/bundled/computer-use/references/windows-linux.md +247 -0
- package/bundled/goal-draft/SKILL.md +10 -10
- package/bundled/qc-helper/docs/configuration/settings.md +81 -71
- package/bundled/qc-helper/docs/extension/getting-started-extensions.md +2 -0
- package/bundled/qc-helper/docs/extension/introduction.md +9 -3
- package/bundled/qc-helper/docs/features/_meta.ts +1 -0
- package/bundled/qc-helper/docs/features/agent-board.md +89 -0
- package/bundled/qc-helper/docs/features/channels/dingtalk.md +3 -21
- package/bundled/qc-helper/docs/features/channels/dws.md +5 -1
- package/bundled/qc-helper/docs/features/channels/overview.md +5 -6
- package/bundled/qc-helper/docs/features/code-review.md +18 -4
- package/bundled/qc-helper/docs/features/commands.md +9 -0
- package/bundled/qc-helper/docs/features/computer-use.md +26 -8
- package/bundled/qc-helper/docs/features/cross-session-protocol.md +23 -5
- package/bundled/qc-helper/docs/features/followup-suggestions.md +17 -5
- package/bundled/qc-helper/docs/features/goals.md +22 -18
- package/bundled/qc-helper/docs/features/hooks.md +280 -106
- package/bundled/qc-helper/docs/features/skills.md +33 -3
- package/bundled/qc-helper/docs/features/status-line.md +2 -0
- package/bundled/qc-helper/docs/features/sub-agents.md +27 -0
- package/bundled/qc-helper/docs/qwen-serve.md +7 -3
- package/bundled/review/SKILL.md +20 -10
- package/bundled/review/references/persistence.md +2 -0
- package/bundled/workflow-authoring/SKILL.md +442 -0
- package/bundled/workflow-creator/SKILL.md +1 -1
- package/chunks/{MaxSizedBox-D4LW7RZZ.js → MaxSizedBox-RT5FZP45.js} +59 -55
- package/chunks/{StandaloneSessionPicker-ALTTRWUP.js → StandaloneSessionPicker-RFPH4XLD.js} +83 -79
- package/chunks/{acp-startup-profiler-KEU6VAYR.js → acp-startup-profiler-RUQNTNU5.js} +2 -2
- package/chunks/acp-subagent-executor-3OYJJTVX.js +141 -0
- package/chunks/{acpAgent-BBSW7XZG.js → acpAgent-DWJA7565.js} +1026 -355
- package/chunks/{agent-SQ6OY3QD.js → agent-JLSKPDD6.js} +43 -39
- package/chunks/{agent-headless-RI2THRQ7.js → agent-headless-5DRZSKW6.js} +43 -39
- package/chunks/{anthropicContentGenerator-JSKMKS6V.js → anthropicContentGenerator-H5YPXIDE.js} +37 -15
- package/chunks/{artifact-tool-PMYZCYNH.js → artifact-tool-MFGORTWZ.js} +59 -109
- package/chunks/{askUserQuestion-4M4YYIB4.js → askUserQuestion-WS4GUT7C.js} +3 -3
- package/chunks/{bridge-DAFMI72L.js → bridge-53QBYO6W.js} +63 -58
- package/chunks/{build-63BIOYWK.js → build-5KWQBWEQ.js} +1 -1
- package/chunks/{ca-KC2AISNS.js → ca-GZ4FDJU2.js} +3 -3
- package/chunks/{channel-management-service-OWDXVL7R.js → channel-management-service-AFVIT4VH.js} +8 -8
- package/chunks/{channel-settings-store-4I6JONT7.js → channel-settings-store-QJJZURJO.js} +68 -64
- package/chunks/{channel-worker-group-F2ZZMLNS.js → channel-worker-group-JR6JOELM.js} +8 -8
- package/chunks/{channel-worker-manager-2SZLJJSJ.js → channel-worker-manager-AVKJEZFL.js} +8 -8
- package/chunks/{channel-worker-supervisor-ZFNWMG6D.js → channel-worker-supervisor-OOYY7BAQ.js} +5 -5
- package/chunks/{chunk-AC6KDLH3.js → chunk-23NA3NCR.js} +1 -1
- package/chunks/{chunk-6JACAGYH.js → chunk-2S2WIGCM.js} +1 -1
- package/chunks/{chunk-IUVIBDKU.js → chunk-2YMRRI2C.js} +9 -10
- package/chunks/{chunk-NOAG7N22.js → chunk-3CEFQSKN.js} +2 -2
- package/chunks/{chunk-F53KKZUD.js → chunk-3LMDSCLU.js} +158 -10
- package/chunks/{chunk-WG7BL3FY.js → chunk-473RJLIH.js} +1 -1
- package/chunks/{chunk-W5ZQMAEM.js → chunk-4Y2I3CI3.js} +1 -1
- package/chunks/{chunk-HGEUHUEV.js → chunk-54B2LTKP.js} +1 -1
- package/chunks/{chunk-IRH27ZC2.js → chunk-5EZRLTLQ.js} +4 -4
- package/chunks/{chunk-DLH7YIX6.js → chunk-5FK4MSHB.js} +3 -3
- package/chunks/{chunk-CUEXOHQH.js → chunk-5ODRE7E5.js} +9 -15
- package/chunks/{chunk-ZU47FBOC.js → chunk-5VPMGZ2V.js} +144 -12
- package/chunks/{chunk-532WHF4F.js → chunk-5VQR2DD7.js} +2 -2
- package/chunks/{chunk-YBUMTY7B.js → chunk-66N6C4EH.js} +1 -1
- package/chunks/{chunk-NHCZJQE4.js → chunk-6CHDV2MQ.js} +6 -6
- package/chunks/{chunk-Y2MYW47X.js → chunk-6WXVEDT2.js} +9 -2
- package/chunks/{chunk-SBRX4BDI.js → chunk-74NZLSCZ.js} +2 -2
- package/chunks/{chunk-7APZIRH3.js → chunk-755ZTFXV.js} +5 -5
- package/chunks/{chunk-ZHKTKHMO.js → chunk-7MIBD3LG.js} +1 -1
- package/chunks/{chunk-NJQTG2G3.js → chunk-7Q3B23XG.js} +11 -11
- package/chunks/{chunk-76RGWKLS.js → chunk-ABNX6E6K.js} +1 -1
- package/chunks/chunk-ACHCT36C.js +28 -0
- package/chunks/{chunk-NE624IVP.js → chunk-ADQUK6WA.js} +1 -1
- package/chunks/{chunk-PLLIWEM3.js → chunk-AEWCOE64.js} +2 -2
- package/chunks/{chunk-KOKPXIAN.js → chunk-AKVL46TX.js} +3 -3
- package/chunks/{chunk-RWVD5RRY.js → chunk-AKX4Y4PS.js} +3 -3
- package/chunks/{chunk-3FPYT6QC.js → chunk-ARDHE6MM.js} +23 -0
- package/chunks/{chunk-EVTNACMT.js → chunk-ASOI6Z7M.js} +12 -12
- package/chunks/{chunk-LILGKQ4B.js → chunk-AXZMWAJV.js} +156 -26
- package/chunks/{chunk-XBZTAGB7.js → chunk-AYS36QDK.js} +1 -1
- package/chunks/{chunk-MLQNSPRZ.js → chunk-BBGX7NTA.js} +15 -5
- package/chunks/{chunk-Q5BD56BW.js → chunk-BPLCAEJZ.js} +7 -7
- package/chunks/{chunk-TPKQIA7G.js → chunk-BSIOCNDK.js} +1 -1
- package/chunks/{chunk-U7O65WKL.js → chunk-BW2SMO6L.js} +1 -1
- package/chunks/{chunk-MSNHNAQZ.js → chunk-BYOV6CG6.js} +3 -3
- package/chunks/{chunk-WBCPROWX.js → chunk-C4HBZQNH.js} +1 -1
- package/chunks/{chunk-NOO4QFXM.js → chunk-C75BXMPM.js} +1 -3
- package/chunks/chunk-CFMZLE3L.js +75 -0
- package/chunks/{chunk-SODMFNAR.js → chunk-CMM34UXX.js} +5 -5
- package/chunks/{chunk-AXTFYDXT.js → chunk-CXXAZ2LZ.js} +1 -1
- package/chunks/{chunk-OLTN767L.js → chunk-DGK4IQXU.js} +2 -2
- package/chunks/{chunk-J3TJH52D.js → chunk-DOTF2PF2.js} +1 -1
- package/chunks/{chunk-HBU7EKY4.js → chunk-DQLYJFK2.js} +45 -15
- package/chunks/{chunk-BWQLXU37.js → chunk-DTMRHTFW.js} +381 -86
- package/chunks/{chunk-2ALXPGB4.js → chunk-E6IR653O.js} +1 -1
- package/chunks/{chunk-ZKYR7QS4.js → chunk-EDB556X7.js} +2 -2
- package/chunks/{chunk-NUQVB25K.js → chunk-EKMJR7M3.js} +2 -2
- package/chunks/{chunk-7QYWGTHB.js → chunk-EPVEPTI3.js} +44 -151
- package/chunks/{acp-subagent-executor-LEUN3N7N.js → chunk-EQAAQVLD.js} +11 -110
- package/chunks/{chunk-53GWJOLP.js → chunk-F7WDCD2N.js} +3 -1
- package/chunks/{chunk-S6Q6Q4P2.js → chunk-FBDHP23D.js} +1 -1
- package/chunks/{chunk-3KQBQ6FM.js → chunk-FEMYSX4G.js} +190 -28
- package/chunks/{chunk-3I7W2POO.js → chunk-FGROOEKM.js} +5 -40
- package/chunks/{chunk-LDVNJZGH.js → chunk-FIRCQJG2.js} +17 -8
- package/chunks/{chunk-HNLMYDQE.js → chunk-FMLBBXHB.js} +13 -9
- package/chunks/{chunk-ALMR3E6Q.js → chunk-GDWE23OR.js} +3 -3
- package/chunks/{chunk-X7UJKOHZ.js → chunk-GG27UVAT.js} +4 -6
- package/chunks/{chunk-DT75RKNH.js → chunk-GKLJIDLK.js} +3 -3
- package/chunks/{chunk-IAEXTMED.js → chunk-GNV2SFO7.js} +173 -7
- package/chunks/{chunk-CXTPVBFA.js → chunk-GSS4SZNG.js} +100 -17
- package/chunks/{chunk-BWAMMKIS.js → chunk-GYKAXTMQ.js} +135 -6
- package/chunks/{chunk-IL5M5NYD.js → chunk-HCKYDMYV.js} +11 -9
- package/chunks/{chunk-6HUXPLB5.js → chunk-HEOH7JZY.js} +5 -5
- package/chunks/{chunk-DTNV6UZY.js → chunk-HFJSQ4GL.js} +10 -24
- package/chunks/{chunk-SSGAAWLY.js → chunk-HNTIWVRC.js} +95 -73
- package/chunks/{chunk-E7LB57MB.js → chunk-HUD3U4GY.js} +6 -6
- package/chunks/{chunk-MHAADZOZ.js → chunk-HVCRYFA4.js} +3 -3
- package/chunks/{chunk-VZUCTJ2P.js → chunk-I6YJZGHS.js} +10 -10
- package/chunks/{chunk-RZHU3K6M.js → chunk-IAS753HG.js} +2 -20
- package/chunks/{chunk-EDMXGXAK.js → chunk-IBRQG2MP.js} +10 -13
- package/chunks/chunk-INGBUYL6.js +230 -0
- package/chunks/{chunk-7ICHPMBQ.js → chunk-IVUKJRSD.js} +4 -4
- package/chunks/{chunk-NRXWJXJ4.js → chunk-IYSXQ5I4.js} +15 -15
- package/chunks/{chunk-XGYHNWL3.js → chunk-J7LBAKDH.js} +3 -3
- package/chunks/{chunk-3BTSSIJO.js → chunk-JDKY7O5J.js} +99 -14
- package/chunks/chunk-JPXPY5L4.js +1416 -0
- package/chunks/{chunk-LG5Y4OWO.js → chunk-JRHKM3YQ.js} +2 -2
- package/chunks/{chunk-RLLRJJDR.js → chunk-JYTUSZOK.js} +2 -2
- package/chunks/{chunk-W5FIP7FC.js → chunk-K2JLUF22.js} +5 -5
- package/chunks/{chunk-POC3YMHG.js → chunk-K7YI4MSY.js} +4 -4
- package/chunks/{chunk-UKZ45TJL.js → chunk-KDXTBWQB.js} +420 -219
- package/chunks/{chunk-N7VWZDWW.js → chunk-KJFGH23C.js} +4506 -3840
- package/chunks/{chunk-K2OJUPOE.js → chunk-KP2FHIFR.js} +12 -0
- package/chunks/{chunk-GCDXVPFK.js → chunk-KYBIIQOQ.js} +31 -7
- package/chunks/{chunk-IV7GDNKC.js → chunk-KZCK5JUN.js} +4 -4
- package/chunks/{chunk-MF6E7FSA.js → chunk-L63PZHD7.js} +8 -201
- package/chunks/{chunk-ZW2EUO2A.js → chunk-L6DIANLD.js} +1 -1
- package/chunks/chunk-LAKMZLJ5.js +191 -0
- package/chunks/{chunk-DYFOSJHU.js → chunk-LCYVZFMV.js} +2769 -1153
- package/chunks/{chunk-3UXUOFO6.js → chunk-LLJIZIRQ.js} +9 -10
- package/chunks/chunk-LMJSPC55.js +260 -0
- package/chunks/{chunk-YQHLFCPU.js → chunk-LOAW7JYR.js} +32 -24
- package/chunks/{chunk-X6K77VHC.js → chunk-LWWRJRCD.js} +1 -1
- package/chunks/{chunk-UXEO7E3V.js → chunk-LYD3T3H7.js} +1 -0
- package/chunks/{chunk-E4UEO3XM.js → chunk-ME4JBHSB.js} +324 -2
- package/chunks/{chunk-BV6Q5HMY.js → chunk-MJHLKWGJ.js} +8 -7
- package/chunks/{chunk-NFYEQRLG.js → chunk-MQRLLBMQ.js} +1 -1
- package/chunks/{chunk-3XLK2QMY.js → chunk-MVLLTUOB.js} +59 -16
- package/chunks/{chunk-O4KNCAX4.js → chunk-NCPFOLM2.js} +11 -0
- package/chunks/{chunk-2SZH22YO.js → chunk-NJ2OFVUX.js} +115 -97
- package/chunks/{chunk-GOXQL4YH.js → chunk-NLRWN5PN.js} +2 -2
- package/chunks/{chunk-6MBXY6WM.js → chunk-NRQI3PGS.js} +1 -1
- package/chunks/{chunk-JYKWOREU.js → chunk-NSY7YQMU.js} +13 -3
- package/chunks/{chunk-NMRCXKQ5.js → chunk-NUIF54XD.js} +3 -3
- package/chunks/{chunk-3CZ2BQV6.js → chunk-NXUZFW3G.js} +49 -19
- package/chunks/chunk-OAWFG54S.js +32 -0
- package/chunks/{chunk-DAWWT2ID.js → chunk-OBHKFWAE.js} +1374 -2164
- package/chunks/{chunk-HBQ2NXOU.js → chunk-OKSSFN7F.js} +2 -2
- package/chunks/{chunk-NHJKAR6E.js → chunk-ON7M7VUD.js} +972 -18
- package/chunks/{chunk-5GLDOLNQ.js → chunk-OWUAZXXN.js} +4 -3
- package/chunks/{chunk-2UWQX4FP.js → chunk-OZEV3R3S.js} +1 -1
- package/chunks/{chunk-FCQJLMA2.js → chunk-Q3TFRP5G.js} +178 -8
- package/chunks/{chunk-ZKZHSB5W.js → chunk-QR4Q425T.js} +9 -9
- package/chunks/{chunk-J6MB5ZHZ.js → chunk-QZW6WRB7.js} +2 -1
- package/chunks/{chunk-TP6FYVQT.js → chunk-RSWBT7AZ.js} +33 -1
- package/chunks/chunk-S7UQ3V2H.js +87 -0
- package/chunks/{chunk-N6VQ37ZZ.js → chunk-SFL6U7U7.js} +1 -1
- package/chunks/{chunk-MOS5OAOG.js → chunk-SROLVJFY.js} +6 -6
- package/chunks/{chunk-HUXPEUFL.js → chunk-SYROIHU7.js} +1 -1
- package/chunks/{chunk-PSPAM24S.js → chunk-TBSCTWKF.js} +6 -0
- package/chunks/chunk-TDS25ULF.js +154 -0
- package/chunks/chunk-U6H3XTFA.js +95 -0
- package/chunks/{chunk-Z3GF56ME.js → chunk-UDEWJKNB.js} +3 -3
- package/chunks/{chunk-7BXXIQG4.js → chunk-ULPXHGLV.js} +36 -72
- package/chunks/{chunk-5KI7ZDTB.js → chunk-UN6YL6VF.js} +24 -12
- package/chunks/{chunk-JXNIF2O5.js → chunk-V545KI73.js} +1 -1
- package/chunks/chunk-VGY2RGXL.js +100 -0
- package/chunks/{chunk-TBEXLLAO.js → chunk-VRQZESKP.js} +1 -1
- package/chunks/{chunk-FN3JNDRU.js → chunk-VVI7MK3V.js} +3 -3
- package/chunks/{chunk-NMCDMLHL.js → chunk-VYIE36BF.js} +50 -35
- package/chunks/{chunk-EUURTIV6.js → chunk-WBSJ6VPZ.js} +10 -2
- package/chunks/{chunk-NLNQNBZ2.js → chunk-WD6YQI5M.js} +1 -1
- package/chunks/chunk-WDH4TVD3.js +2812 -0
- package/chunks/chunk-WFNEY5G7.js +347 -0
- package/chunks/{chunk-XKBFYTCD.js → chunk-WK6DEH3Q.js} +46 -0
- package/chunks/{chunk-36HCNKDS.js → chunk-WKVZES7O.js} +65 -14
- package/chunks/{chunk-R4Q2PEFV.js → chunk-WVQHS26P.js} +1 -1
- package/chunks/{chunk-GSILBZLN.js → chunk-XCQJUYLQ.js} +2 -2
- package/chunks/{chunk-KFZYGSJN.js → chunk-XMWEUO26.js} +3 -3
- package/chunks/{chunk-2PJRI3EH.js → chunk-XPEZVAK2.js} +218 -43
- package/chunks/{chunk-OX7IZ2G5.js → chunk-XPULQNNS.js} +4 -4
- package/chunks/{chunk-VX63RJXE.js → chunk-XX5HQLCZ.js} +7 -0
- package/chunks/{chunk-2Z3T52OC.js → chunk-Y5TM7SBV.js} +7 -2
- package/chunks/{chunk-SYLECP23.js → chunk-Y7W2X4WN.js} +4 -4
- package/chunks/{chunk-2ZN3O5FT.js → chunk-YAC6S4ZF.js} +6 -6
- package/chunks/{chunk-V2P3DOQR.js → chunk-YDFOHRS5.js} +1 -1
- package/chunks/{chunk-HGAELO7B.js → chunk-YFX2M3ZI.js} +2 -2
- package/chunks/{chunk-QMUYLYT5.js → chunk-YGFJ6BRT.js} +1 -1
- package/chunks/{chunk-LK2WUCDQ.js → chunk-YM6KUQ2S.js} +1 -1
- package/chunks/{chunk-BZM5U74J.js → chunk-YQSC7BRZ.js} +724 -468
- package/chunks/chunk-Z72PLR74.js +36 -0
- package/chunks/{chunk-6W4HBUA2.js → chunk-ZGZN54IU.js} +1 -1
- package/chunks/{chunk-BHTYRHJF.js → chunk-ZJ7JQUGY.js} +4 -1
- package/chunks/{chunk-4ALNJDHL.js → chunk-ZKIAGIGH.js} +87 -4
- package/chunks/{chunk-F42YYSCK.js → chunk-ZLU6NBSL.js} +8 -8
- package/chunks/{chunk-VG3Q2NC4.js → chunk-ZNI3YJHS.js} +32 -12
- package/chunks/{chunk-Q2LVVIKF.js → chunk-ZZUXUBEB.js} +29 -12
- package/chunks/codex-subagent-executor-QEDKWUAR.js +586 -0
- package/chunks/{config-utils-L6KLDYIV.js → config-utils-HCV2DX7W.js} +60 -56
- package/chunks/{contextCommand-UYEH7NIU.js → contextCommand-U5WK3XNI.js} +58 -54
- package/chunks/{core-runtime-NVHT3Z3V.js → core-runtime-RODZHBF7.js} +58 -55
- package/chunks/{create-sub-session-YWASE5VH.js → create-sub-session-L6UGUL4T.js} +169 -89
- package/chunks/{create-sub-session-TIGCFGCS.js → create-sub-session-MSGNIM37.js} +5 -2
- package/chunks/{cron-create-AKWX67FO.js → cron-create-U2JJ5CCF.js} +3 -3
- package/chunks/{cron-delete-XPB6IYZJ.js → cron-delete-7DM4LJWD.js} +2 -2
- package/chunks/{cron-list-XBKO4WU5.js → cron-list-VCUSZK2Y.js} +2 -2
- package/chunks/{daemon-G5TYKZD6.js → daemon-NJB4PWZ7.js} +3 -1
- package/chunks/{daemon-git-worktree-guard-FOW4RQSK.js → daemon-git-worktree-guard-Y5T7KIBG.js} +58 -54
- package/chunks/{daemon-status-provider-O5KQZYMP.js → daemon-status-provider-AQBGUOGB.js} +68 -63
- package/chunks/{daemon-trust-policy-3ATXEON7.js → daemon-trust-policy-EB2NNNDT.js} +64 -60
- package/chunks/{daemon-trust-policy-monitor-7MCNDNEC.js → daemon-trust-policy-monitor-AFI3E2Z5.js} +64 -60
- package/chunks/{de-UU2YTO37.js → de-VGY3VNBU.js} +3 -3
- package/chunks/{deferred-core-runtime-JK5IXL5K.js → deferred-core-runtime-H7ZSF3PZ.js} +56 -52
- package/chunks/{discovery-XP4RMDUM.js → discovery-5KUEPR65.js} +2 -2
- package/chunks/{display-image-NAH3AZ63.js → display-image-QTHALY6N.js} +3 -3
- package/chunks/{dist-KLZ7XGEQ.js → dist-2QYIVNS6.js} +1 -4
- package/chunks/{dist-AHJYPSJL.js → dist-GUB7QRYA.js} +2 -5
- package/chunks/{dist-ZXTZTE54.js → dist-MPUZZOG5.js} +4 -17
- package/chunks/{dist-F2DVGTL3.js → dist-NIOJXMGY.js} +111 -101
- package/chunks/{dist-KJGRVIGJ.js → dist-PA7WPFVE.js} +5 -36
- package/chunks/{dist-AIKC5E5P.js → dist-SE4J6Z4O.js} +43 -669
- package/chunks/{dist-H6G3K26N.js → dist-T6DDPDLQ.js} +14 -34
- package/chunks/{dist-GWNQVPZT.js → dist-TFGETXFN.js} +10 -33
- package/chunks/{dist-ZA52JXAS.js → dist-VDLSBCLM.js} +1 -5
- package/chunks/{edit-SY35KYIE.js → edit-AFPKKMKD.js} +46 -42
- package/chunks/{en-CAJHTIQT.js → en-E5ZO5TZW.js} +5 -3
- package/chunks/{enter-worktree-54L5QJ3N.js → enter-worktree-CAARFWBI.js} +6 -5
- package/chunks/{enterPlanMode-HXX6KQJR.js → enterPlanMode-3Z3I6I4K.js} +43 -39
- package/chunks/{environment-DKXHG4HB.js → environment-G4NM4JE4.js} +59 -55
- package/chunks/{errors-ADY7LQJJ.js → errors-XVV3RAEG.js} +58 -54
- package/chunks/exec-RPKEY6HP.js +505 -0
- package/chunks/{exit-worktree-EORJDKDS.js → exit-worktree-JXGGUOBP.js} +6 -5
- package/chunks/{exitPlanMode-HSK2CQI6.js → exitPlanMode-JGUYOZCP.js} +43 -39
- package/chunks/{fast-path-U636VWN2.js → fast-path-SXPNVZAS.js} +10 -10
- package/chunks/{fast-path-settings-V7MI7EZJ.js → fast-path-settings-XDYX7X5Z.js} +2 -2
- package/chunks/{fr-HKNWVXRJ.js → fr-UAZJJH5N.js} +3 -3
- package/chunks/{glob-GUGGTH5L.js → glob-BPOP43P6.js} +43 -39
- package/chunks/{goal-tools-PXYRSQGX.js → goal-tools-FQXDPBCD.js} +49 -41
- package/chunks/{grep-3PKFKLCA.js → grep-H2I33VAO.js} +8 -3
- package/chunks/{handleAutoUpdate-5KHS4HIN.js → handleAutoUpdate-23TEWABL.js} +61 -57
- package/chunks/{i18n-KSGKMUPT.js → i18n-2LI3LH4L.js} +57 -53
- package/chunks/{image-gen-OCCR2WWU.js → image-gen-5G2TQ3DY.js} +6 -5
- package/chunks/{initializer-YYT5XEZF.js → initializer-IHSQVGZD.js} +64 -60
- package/chunks/{installationInfo-UNSBPYW2.js → installationInfo-KTZGFBDG.js} +57 -53
- package/chunks/{ja-GJS5RZGU.js → ja-2RITCMAJ.js} +3 -3
- package/chunks/list-K2XO7FLR.js +133 -0
- package/chunks/{list-agents-QLDXS5OD.js → list-agents-EWDCEPIW.js} +3 -3
- package/chunks/{llm-XGGLBGPH.js → llm-FFYRSEJZ.js} +161 -125
- package/chunks/{llm-content-generator-ZHQQT5W7.js → llm-content-generator-EXJEU5MJ.js} +14 -7
- package/chunks/{loadedSettingsAdapter-3DXLASK7.js → loadedSettingsAdapter-BSWBMUIT.js} +64 -60
- package/chunks/{loggingContentGenerator-V72OCCJO.js → loggingContentGenerator-RE3L7S24.js} +47 -43
- package/chunks/{loop-wakeup-HHMYIC7Z.js → loop-wakeup-VG6CGBQA.js} +4 -4
- package/chunks/{ls-N7ABR6HI.js → ls-6ZB3BEIR.js} +1 -1
- package/chunks/{lsp-LTOFWG5P.js → lsp-M54FQARP.js} +5 -1
- package/chunks/{managed-npm-update-HV5LPZH2.js → managed-npm-update-D56DKMKV.js} +57 -53
- package/chunks/mcp-BS46APKT.js +127 -0
- package/chunks/model-configuration-L5WZ7NBY.js +140 -0
- package/chunks/modelConfigUtils-WAM6HBUX.js +119 -0
- package/chunks/{monitor-TLBNM4MV.js → monitor-CYXNE7UB.js} +43 -39
- package/chunks/{nonInteractiveCli-LSJSQ2W4.js → nonInteractiveCli-ZPBORWHM.js} +112 -107
- package/chunks/{notebook-edit-OSPOLZP6.js → notebook-edit-CSYGREO5.js} +45 -41
- package/chunks/{openaiContentGenerator-BE4S5TRD.js → openaiContentGenerator-KDGLKJVS.js} +24 -19
- package/chunks/{openaiResponsesContentGenerator-RTCAJ5V5.js → openaiResponsesContentGenerator-AWRYZLJU.js} +110 -19
- package/chunks/{pidfile-H32FEPWA.js → pidfile-QGUW5UJ7.js} +56 -52
- package/chunks/{processUtils-SSLIPDEA.js → processUtils-Q6GS3E2T.js} +2 -2
- package/chunks/{prompt-terminal-ledger-I5SLL6UF.js → prompt-terminal-ledger-BLCAZPSQ.js} +57 -53
- package/chunks/{pt-FXMYXEUV.js → pt-5ZF7ZQUV.js} +3 -3
- package/chunks/{qwenContentGenerator-TMQC623Z.js → qwenContentGenerator-LSRUVWCL.js} +47 -43
- package/chunks/{qwenOAuth2-3ZRQHHTC.js → qwenOAuth2-WIEUEFEY.js} +5 -4
- package/chunks/{read-file-T2QAIZE2.js → read-file-56DVLPQR.js} +9 -8
- package/chunks/{read-mcp-resource-B37WANAQ.js → read-mcp-resource-LPSWXVOD.js} +1 -1
- package/chunks/{record-artifact-OAXWXZ5D.js → record-artifact-PXMNP7GZ.js} +3 -3
- package/chunks/{record-source-D7R7X3GT.js → record-source-2GSY5JD5.js} +6 -6
- package/chunks/{report-findings-AR3VC6EQ.js → report-findings-W6GR7SYZ.js} +4 -4
- package/chunks/{request-shutdown-IKNWTX5M.js → request-shutdown-53SNYGVR.js} +5 -5
- package/chunks/{resumeHistoryUtils-QLKDH5GY.js → resumeHistoryUtils-ZM5PHHNI.js} +63 -59
- package/chunks/{ripGrep-YGWL7KCV.js → ripGrep-INOTDWED.js} +13 -11
- package/chunks/{ru-RMHURE5U.js → ru-7BNZFQKG.js} +3 -3
- package/chunks/{run-qwen-serve-26KZDECC.js → run-qwen-serve-NZY4OHHH.js} +314 -127
- package/chunks/{runtime-BMEIVDDG.js → runtime-6CSFTXGK.js} +69 -65
- package/chunks/{scheduled-tasks-NCFPP6VQ.js → scheduled-tasks-T5DMXMRI.js} +66 -60
- package/chunks/{scheduler-47TVMUVN.js → scheduler-STH4FWGX.js} +58 -54
- package/chunks/{sdk-exporters-http-VWTF4W6K.js → sdk-exporters-http-3R2TRQHE.js} +2 -1
- package/chunks/{sdk-impl-G6FVTBQZ.js → sdk-impl-4WF3VZ2F.js} +3 -3
- package/chunks/{send-message-TWOGWCBG.js → send-message-UMJKN27Q.js} +7 -7
- package/chunks/{serve-KL3G6LQQ.js → serve-K4VRD7S3.js} +66 -62
- package/chunks/{server-LBPYXZ5G.js → server-SAF6RZWD.js} +783 -350
- package/chunks/{session-YG6742LO.js → session-2IZX2R3S.js} +117 -112
- package/chunks/{session-attachments-root-OUBQDYC4.js → session-attachments-root-WFCEIOC7.js} +56 -52
- package/chunks/{session-pr-refresh-EKGMYNAW.js → session-pr-refresh-H7LDUL7K.js} +66 -60
- package/chunks/{settings-DDNHJX2L.js → settings-55B6W4ML.js} +67 -63
- package/chunks/{shell-KUCXWITU.js → shell-C6HWMJCS.js} +43 -39
- package/chunks/{skill-JQLKPNWZ.js → skill-IYKRY5HC.js} +128 -23
- package/chunks/{skill-settings-XERQCUXZ.js → skill-settings-YWKLCBV2.js} +72 -60
- package/chunks/{spawnChannel-GQ45QFGB.js → spawnChannel-YXUNPB3M.js} +60 -55
- package/chunks/{standalone-update-PRF3ILGZ.js → standalone-update-H6YIWY5F.js} +58 -54
- package/chunks/{start-opentui-ui-JDSOZE3N.js → start-opentui-ui-U2NNOY65.js} +2700 -2166
- package/chunks/{startInteractiveUI-RRW3JVHN.js → startInteractiveUI-ZF5EJN6N.js} +1621 -1783
- package/chunks/{syntheticOutput-F6F27JMK.js → syntheticOutput-EX5L5GYI.js} +2 -2
- package/chunks/{task-create-Y623TBHB.js → task-create-75HVPEAH.js} +7 -7
- package/chunks/{task-list-FCPEEGWL.js → task-list-ZLJSMRFA.js} +2 -2
- package/chunks/{task-stop-QTKZXLPH.js → task-stop-MD7P6QGK.js} +1 -1
- package/chunks/{task-update-YLSXF25N.js → task-update-RI7QNVDP.js} +20 -13
- package/chunks/{team-create-5DRLOLOE.js → team-create-XWCSBY3R.js} +43 -39
- package/chunks/{team-delete-S7TLHZCF.js → team-delete-RIDINW6I.js} +1 -1
- package/chunks/{team-plan-approval-MWSGAL5T.js → team-plan-approval-B2SOZ46Z.js} +43 -39
- package/chunks/{terminal-image-renderer-H7PD4FQW.js → terminal-image-renderer-HKBBPT64.js} +58 -54
- package/chunks/{theme-manager-7AV73D6R.js → theme-manager-LHBAB3RV.js} +56 -52
- package/chunks/{todoWrite-5QI2H2FW.js → todoWrite-XSTG2VT5.js} +6 -3
- package/chunks/{tool-search-UGYTBLUV.js → tool-search-D7UTGG7X.js} +17 -12
- package/chunks/{total-session-admission-JIHSTJ5S.js → total-session-admission-VN63755O.js} +63 -58
- package/chunks/{trustedFolders-5VCBXFOP.js → trustedFolders-GD56NJEV.js} +57 -53
- package/chunks/{update-relaunch-4LF3APCV.js → update-relaunch-BMQKKDR6.js} +5 -5
- package/chunks/{updateCheck-4T3WUE5F.js → updateCheck-BZFE6Z5I.js} +60 -56
- package/chunks/{useAutoAcceptIndicator-UMGB64Z6.js → useAutoAcceptIndicator-RD4YNRGG.js} +68 -64
- package/chunks/{validateNonInterActiveAuth-GFJ72U2C.js → validateNonInterActiveAuth-RWWD7TVJ.js} +109 -104
- package/chunks/{version-EAAZN4T2.js → version-DGWI3JF2.js} +1 -1
- package/chunks/{web-fetch-VRU3A2NI.js → web-fetch-2KXAHKDU.js} +15 -13
- package/chunks/web-search-LUI2YS33.js +45 -0
- package/chunks/{web-shell-static-CCN4JZEE.js → web-shell-static-T7UGLVE4.js} +2 -7
- package/chunks/{workflow-UHPFALVZ.js → workflow-WG7WNWMP.js} +179 -79
- package/chunks/workspace-providers-status-VJYJMUDI.js +133 -0
- package/chunks/{workspace-registration-store-A7RGKW62.js → workspace-registration-store-B3XUNFOG.js} +2 -2
- package/chunks/{workspace-registry-C2NGE6SD.js → workspace-registry-56R5RBVU.js} +63 -58
- package/chunks/{workspace-runtime-coordinator-QKMZ24YF.js → workspace-runtime-coordinator-EKDPCK4L.js} +66 -59
- package/chunks/{workspace-service-RQTTAGGC.js → workspace-service-UYGLM6XX.js} +70 -65
- package/chunks/workspace-skills-status-5HMTP63B.js +130 -0
- package/chunks/{workspace-trust-reconciler-KFWATZUU.js → workspace-trust-reconciler-AST2535P.js} +73 -68
- package/chunks/{write-file-DPVB2SBQ.js → write-file-F4R5RBBH.js} +45 -41
- package/chunks/{zh-TW-2K2WRFPY.js → zh-TW-7PRVUGLW.js} +5 -3
- package/chunks/{zh-S5V3Z5CR.js → zh-V2EYTYJP.js} +5 -3
- package/chunks/{zoom-image-S7AWLAPC.js → zoom-image-6HKQ5MFU.js} +11 -10
- package/cli.js +18 -17
- package/codeModeHost.js +4425 -0
- package/export-transcript-document.css +1 -1
- package/export-transcript-document.js +151 -151
- package/locales/ca.js +5 -6
- package/locales/de.js +5 -6
- package/locales/en.js +7 -6
- package/locales/fr.js +6 -6
- package/locales/ja.js +5 -6
- package/locales/pt.js +5 -6
- package/locales/ru.js +6 -6
- package/locales/zh-TW.js +7 -6
- package/locales/zh.js +7 -6
- package/package.json +4 -3
- package/web-shell/assets/{abnfDiagram-VCTEODGH-nU24rpIE.js → abnfDiagram-VCTEODGH-BtpzKw3A.js} +1 -1
- package/web-shell/assets/{arc-D1hTu8QI.js → arc-CQiVKZJP.js} +1 -1
- package/web-shell/assets/architectureDiagram-5GKGNRK7-ekIPBb2d.js +36 -0
- package/web-shell/assets/blockDiagram-NRAW4CY4-BrRWkWri.js +129 -0
- package/web-shell/assets/{c4Diagram-UCG6FXSJ-kEFoC1ei.js → c4Diagram-UCG6FXSJ-qYS8CYZ3.js} +4 -4
- package/web-shell/assets/channel-DSQQnOZj.js +1 -0
- package/web-shell/assets/{chunk-2Q5K7J3B-DbT9wS7j.js → chunk-2Q5K7J3B-ZasyyEZm.js} +1 -1
- package/web-shell/assets/{chunk-5VM5RSS4-CNbULt6O.js → chunk-5VM5RSS4-C_IzCGeA.js} +1 -1
- package/web-shell/assets/{chunk-F27PBJKO-CbQRy4Tb.js → chunk-F27PBJKO-C25NZOyD.js} +1 -1
- package/web-shell/assets/chunk-G27WJ6UU-XPOHNSGX.js +231 -0
- package/web-shell/assets/chunk-JWPE2WC7-BQBh0Xni.js +1 -0
- package/web-shell/assets/chunk-LCL6LL3I-CoShjpX7.js +206 -0
- package/web-shell/assets/chunk-POPQ4Y6H-BwRmCDSz.js +1 -0
- package/web-shell/assets/{chunk-SVP7TREG-DyBb2Axj.js → chunk-SVP7TREG-DSzE5-Mw.js} +4 -4
- package/web-shell/assets/{chunk-XXDRQBXY-BIA0eb5B.js → chunk-XXDRQBXY-BQSQv30h.js} +1 -1
- package/web-shell/assets/classDiagram-DTDB5LWJ-V94ta08R.js +1 -0
- package/web-shell/assets/classDiagram-v2-JRS7N3AN-V94ta08R.js +1 -0
- package/web-shell/assets/cose-bilkent-JH36ORCC-XVUVTHVo.js +1 -0
- package/web-shell/assets/cynefin-OW5HDTMX-CrsKx4lQ.js +178 -0
- package/web-shell/assets/{cynefinDiagram-5FMLGOSQ-LENf_IUy.js → cynefinDiagram-5FMLGOSQ-BPeZEuHw.js} +1 -1
- package/web-shell/assets/{cytoscape.esm-CUqq0XTU.js → cytoscape.esm-DJK6lGiH.js} +3 -3
- package/web-shell/assets/dagre-3AP2YEHR-D31cQ2Qs.js +4 -0
- package/web-shell/assets/diagram-S7CK7UJ4-zyiG097Q.js +30 -0
- package/web-shell/assets/diagram-UQ7AKVKN-Br3vtfsy.js +41 -0
- package/web-shell/assets/diagram-VSXAHHWV-Bxkhjx4u.js +3 -0
- package/web-shell/assets/diagram-VX7I27RA-BQH8QiDk.js +24 -0
- package/web-shell/assets/diagram-Z3DM3KII-B_aQ1cw0.js +24 -0
- package/web-shell/assets/{ebnfDiagram-PWID7BFC-BGpiquRm.js → ebnfDiagram-PWID7BFC-B9N7BRQE.js} +1 -1
- package/web-shell/assets/{erDiagram-SSCWMZ5O-D0besu_U.js → erDiagram-SSCWMZ5O-Cx6Hb1Re.js} +13 -13
- package/web-shell/assets/flowDiagram-A5DVABFB-DTuLP7GU.js +168 -0
- package/web-shell/assets/{ganttDiagram-EL5Y4UJY-CNlsAeNr.js → ganttDiagram-EL5Y4UJY-DYS3d-sL.js} +1 -1
- package/web-shell/assets/gitGraphDiagram-WWUBYQGX-Cp0EGx04.js +106 -0
- package/web-shell/assets/index-45-LkPDB.js +3 -0
- package/web-shell/assets/{index-CGT341lL.js → index-DohPy72Z.js} +1 -1
- package/web-shell/assets/index-H8um-iEl.js +2207 -0
- package/web-shell/assets/index-n6N-2a3v.css +36 -0
- package/web-shell/assets/{infoDiagram-RXCK75RN-Bpai64Ll.js → infoDiagram-RXCK75RN-9--kukiT.js} +1 -1
- package/web-shell/assets/ishikawaDiagram-5VMMS53U-CGBdsDLD.js +70 -0
- package/web-shell/assets/{journeyDiagram-EYS64GPL-iz_DKgFX.js → journeyDiagram-EYS64GPL-DeXhcscd.js} +1 -1
- package/web-shell/assets/kanban-definition-3QL26DDD-CFdvsU3b.js +89 -0
- package/web-shell/assets/{layout-qEvKgnvU.js → layout-DAnwQ3KB.js} +1 -1
- package/web-shell/assets/{linear-C6lklGdq.js → linear-CTo7v7Nh.js} +1 -1
- package/web-shell/assets/mermaid.core-jggSxF1i.js +312 -0
- package/web-shell/assets/mindmap-definition-FBJOCRG2-DzIepvlJ.js +96 -0
- package/web-shell/assets/{pegDiagram-XKGWAZYB-BhD0q0i6.js → pegDiagram-XKGWAZYB-BFGS9GJv.js} +1 -1
- package/web-shell/assets/pieDiagram-E7YTZNPT-B2UUcNIT.js +39 -0
- package/web-shell/assets/quadrantDiagram-AXDQQJYC-BgM6htrX.js +7 -0
- package/web-shell/assets/qwen-code-notification-BRVagufF.png +0 -0
- package/web-shell/assets/{railroadDiagram-O6MQD6OU-E1g2KIFK.js → railroadDiagram-O6MQD6OU-Dk9cS7N-.js} +1 -1
- package/web-shell/assets/{requirementDiagram-EFPCY7ZU-CuerYJOe.js → requirementDiagram-EFPCY7ZU-C9oRg7xi.js} +13 -13
- package/web-shell/assets/{sankeyDiagram-P5KCCOFB-CqWyCZGA.js → sankeyDiagram-P5KCCOFB-B-_c7GzI.js} +7 -7
- package/web-shell/assets/{sequenceDiagram-WJ2MYXX4-B-YWb8x4.js → sequenceDiagram-WJ2MYXX4-R0M-347u.js} +16 -16
- package/web-shell/assets/sizeCapture-X5ZJPWSS-Df0f8UAW.js +1 -0
- package/web-shell/assets/{stateDiagram-HBIQ2CUA-C8LDpNHS.js → stateDiagram-HBIQ2CUA-CsUEfAA-.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-4QOOHH4V-CnSuTPJ2.js +1 -0
- package/web-shell/assets/swimlanes-XN3QIQJK-9OGHVSrx.js +1 -0
- package/web-shell/assets/swimlanesDiagram-VK2B7HYN-Bb7TcWQw.js +8 -0
- package/web-shell/assets/timeline-definition-24CTP7MA-DAfGqS2B.js +120 -0
- package/web-shell/assets/vennDiagram-4TSXK5OY-CKATpwHi.js +34 -0
- package/web-shell/assets/wardleyDiagram-VM6X3IG4-CQHdhTrm.js +78 -0
- package/web-shell/assets/{xychartDiagram-S5SC5T6Z-ruD2Wjhg.js → xychartDiagram-S5SC5T6Z-5k9NLqlY.js} +1 -1
- package/web-shell/index.html +2 -2
- package/chunks/chunk-7Q2AXRDJ.js +0 -114
- package/chunks/chunk-AEY27Z35.js +0 -1411
- package/chunks/chunk-CFKIH3D3.js +0 -50
- package/chunks/chunk-HWVUSYSN.js +0 -126
- package/chunks/chunk-QHMLYMMS.js +0 -32
- package/chunks/chunk-SAH4BD2J.js +0 -92
- package/chunks/chunk-TWUKBNWM.js +0 -86
- package/chunks/chunk-ZTTC7T4X.js +0 -126
- package/chunks/list-YL6LDQKQ.js +0 -129
- package/chunks/mcp-IYVSIW6O.js +0 -123
- package/chunks/web-search-NEGYQNDJ.js +0 -912
- package/chunks/workspace-providers-status-AEYISSU2.js +0 -127
- package/chunks/workspace-skills-status-5HWZU3HX.js +0 -126
- package/web-shell/assets/architectureDiagram-5GKGNRK7-B_fgkKe7.js +0 -36
- package/web-shell/assets/blockDiagram-NRAW4CY4-C3pddUNg.js +0 -129
- package/web-shell/assets/channel-Blod4z1X.js +0 -1
- package/web-shell/assets/chunk-G27WJ6UU-CVbXTxYk.js +0 -231
- package/web-shell/assets/chunk-JWPE2WC7-D89c_BXy.js +0 -1
- package/web-shell/assets/chunk-LCL6LL3I-B7-I_9KB.js +0 -206
- package/web-shell/assets/chunk-POPQ4Y6H-DcLQFzS4.js +0 -1
- package/web-shell/assets/classDiagram-DTDB5LWJ-D6hFDMqb.js +0 -1
- package/web-shell/assets/classDiagram-v2-JRS7N3AN-D6hFDMqb.js +0 -1
- package/web-shell/assets/cose-bilkent-JH36ORCC-Db2FYN85.js +0 -1
- package/web-shell/assets/cynefin-OW5HDTMX-i4GwmBVy.js +0 -178
- package/web-shell/assets/dagre-3AP2YEHR-CF9XVrD9.js +0 -4
- package/web-shell/assets/diagram-S7CK7UJ4-DD5PJfSm.js +0 -30
- package/web-shell/assets/diagram-UQ7AKVKN-CjD_sBMj.js +0 -41
- package/web-shell/assets/diagram-VSXAHHWV-U5WwMqyA.js +0 -3
- package/web-shell/assets/diagram-VX7I27RA-BujpHJJf.js +0 -24
- package/web-shell/assets/diagram-Z3DM3KII-3ZLtKEXo.js +0 -24
- package/web-shell/assets/flowDiagram-A5DVABFB-9DwDuIyr.js +0 -168
- package/web-shell/assets/gitGraphDiagram-WWUBYQGX-C_pPFiTR.js +0 -106
- package/web-shell/assets/index-BYWs4JWq.js +0 -3
- package/web-shell/assets/index-D3YS6KuJ.js +0 -2173
- package/web-shell/assets/index-eBxK3rs2.css +0 -36
- package/web-shell/assets/ishikawaDiagram-5VMMS53U-ktpJFq4r.js +0 -70
- package/web-shell/assets/kanban-definition-3QL26DDD-m_gG00Yt.js +0 -89
- package/web-shell/assets/mermaid.core-DSCYB_2P.js +0 -312
- package/web-shell/assets/mindmap-definition-FBJOCRG2-DRQbT8w-.js +0 -96
- package/web-shell/assets/pieDiagram-E7YTZNPT-BvIGQCSd.js +0 -39
- package/web-shell/assets/quadrantDiagram-AXDQQJYC-BDQtfpU-.js +0 -7
- package/web-shell/assets/sizeCapture-X5ZJPWSS-BB7YY4Tl.js +0 -1
- package/web-shell/assets/stateDiagram-v2-4QOOHH4V-C4CbdvGa.js +0 -1
- package/web-shell/assets/swimlanes-XN3QIQJK-D94vOoxZ.js +0 -1
- package/web-shell/assets/swimlanesDiagram-VK2B7HYN--QNSIOC8.js +0 -8
- package/web-shell/assets/timeline-definition-24CTP7MA-C9C8uEYm.js +0 -120
- package/web-shell/assets/vennDiagram-4TSXK5OY-CYzMHbVW.js +0 -34
- package/web-shell/assets/wardleyDiagram-VM6X3IG4-G9nhtLES.js +0 -78
- package/chunks/{open-with-auth-6MVIHMXB.js → open-with-auth-XFCCJOO6.js} +3 -3
|
@@ -51,12 +51,14 @@ Command hooks execute commands via child processes. Input JSON is passed through
|
|
|
51
51
|
| `command` | `string` | Yes | Command to execute |
|
|
52
52
|
| `name` | `string` | No | Hook name (for logging) |
|
|
53
53
|
| `description` | `string` | No | Hook description |
|
|
54
|
-
| `timeout` | `number` | No | Timeout in
|
|
54
|
+
| `timeout` | `number` | No | Timeout in seconds, default 60 |
|
|
55
55
|
| `async` | `boolean` | No | Whether to run asynchronously in background |
|
|
56
56
|
| `env` | `Record<string, string>` | No | Environment variables |
|
|
57
57
|
| `shell` | `"bash" \| "powershell"` | No | Shell to use |
|
|
58
58
|
| `statusMessage` | `string` | No | Status message displayed during execution |
|
|
59
59
|
|
|
60
|
+
`timeout` is in seconds for command, HTTP and prompt hooks; SDK-registered function hooks keep milliseconds. Command hook timeouts used to be written in milliseconds, so for command hooks a value of `1000` or more is still read as milliseconds and existing settings keep working. To migrate, look for command hooks whose `timeout` is `1000` or more and rewrite the value in seconds, for example `10000` as `10`. To give a command hook a timeout of 1000 seconds or more, keep writing it in milliseconds, for example `1800000` for 30 minutes. A command hook `timeout` that is not a positive number, such as `"30s"`, is ignored and the 60 second default applies. With debug logging enabled (`QWEN_DEBUG_LOG_FILE=1`), each command hook with a millisecond or ignored `timeout` is named once per session in that session's debug log.
|
|
61
|
+
|
|
60
62
|
**Example:**
|
|
61
63
|
|
|
62
64
|
```json
|
|
@@ -68,9 +70,9 @@ Command hooks execute commands via child processes. Input JSON is passed through
|
|
|
68
70
|
"hooks": [
|
|
69
71
|
{
|
|
70
72
|
"type": "command",
|
|
71
|
-
"command": "$QWEN_PROJECT_DIR/.qwen/hooks/security-check.sh",
|
|
73
|
+
"command": "\"$QWEN_PROJECT_DIR/.qwen/hooks/security-check.sh\"",
|
|
72
74
|
"name": "security-check",
|
|
73
|
-
"timeout":
|
|
75
|
+
"timeout": 10
|
|
74
76
|
}
|
|
75
77
|
]
|
|
76
78
|
}
|
|
@@ -79,6 +81,10 @@ Command hooks execute commands via child processes. Input JSON is passed through
|
|
|
79
81
|
}
|
|
80
82
|
```
|
|
81
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
|
+
|
|
82
88
|
### HTTP Hooks
|
|
83
89
|
|
|
84
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.
|
|
@@ -337,49 +343,60 @@ When `ok` is `false`, Qwen Code will continue working and use the `reason` as co
|
|
|
337
343
|
|
|
338
344
|
Hooks fire at specific points during a Qwen Code session. Different events support different matchers to filter trigger conditions.
|
|
339
345
|
|
|
340
|
-
| Event
|
|
341
|
-
|
|
|
342
|
-
| `PreToolUse`
|
|
343
|
-
| `PostToolUse`
|
|
344
|
-
| `PostToolUseFailure`
|
|
345
|
-
| `
|
|
346
|
-
| `
|
|
347
|
-
| `
|
|
348
|
-
| `
|
|
349
|
-
| `
|
|
350
|
-
| `
|
|
351
|
-
| `
|
|
352
|
-
| `
|
|
353
|
-
| `
|
|
354
|
-
| `
|
|
355
|
-
| `
|
|
356
|
-
| `
|
|
357
|
-
| `
|
|
358
|
-
| `
|
|
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 |
|
|
359
370
|
|
|
360
371
|
### Matcher Patterns
|
|
361
372
|
|
|
362
373
|
`matcher` is a regular expression used to filter trigger conditions.
|
|
363
374
|
|
|
364
|
-
| Event Type | Events | Matcher Support | Matcher Target
|
|
365
|
-
| :------------------ | :----------------------------------------------------------------------------------------- | :-------------- |
|
|
366
|
-
| Tool Events | `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest`, `PermissionDenied` | ✅ Regex | Tool id: `write_file`, `read_file`, `run_shell_command`, etc.
|
|
367
|
-
|
|
|
368
|
-
|
|
|
369
|
-
| Session Events | `
|
|
370
|
-
| Session Events | `
|
|
371
|
-
|
|
|
372
|
-
|
|
|
373
|
-
|
|
|
374
|
-
|
|
|
375
|
-
|
|
|
376
|
-
|
|
|
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 |
|
|
377
392
|
|
|
378
393
|
**Matcher Syntax:**
|
|
379
394
|
|
|
380
|
-
- Empty string `""` or `"
|
|
381
|
-
-
|
|
382
|
-
-
|
|
395
|
+
- Empty string `""`, `"*"` or `".*"` matches all events of that type
|
|
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
|
|
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
|
|
398
|
+
- The same rules apply to every event that supports a matcher, and to hooks registered by skills
|
|
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`.
|
|
383
400
|
|
|
384
401
|
**Examples:**
|
|
385
402
|
|
|
@@ -452,11 +469,16 @@ Qwen does not control whether a hook process, endpoint, callback, or model provi
|
|
|
452
469
|
"transcript_path": "string",
|
|
453
470
|
"cwd": "string",
|
|
454
471
|
"hook_event_name": "string",
|
|
455
|
-
"timestamp": "string"
|
|
472
|
+
"timestamp": "string",
|
|
473
|
+
"permission_mode": "default | plan | auto_edit | auto | yolo",
|
|
474
|
+
"agent_id": "string (only when the event fires inside a subagent)",
|
|
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)"
|
|
456
478
|
}
|
|
457
479
|
```
|
|
458
480
|
|
|
459
|
-
Event-specific fields are added based on the hook type.
|
|
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.
|
|
460
482
|
|
|
461
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.
|
|
462
484
|
|
|
@@ -466,11 +488,13 @@ Hook output is returned via `stdout` (command) or HTTP response body (http) as J
|
|
|
466
488
|
|
|
467
489
|
**Exit Code Behavior (Command Hooks):**
|
|
468
490
|
|
|
469
|
-
| Exit Code | Behavior
|
|
470
|
-
| :-------- |
|
|
471
|
-
| `0` | Success.
|
|
472
|
-
| `2` | **Blocking error**. Ignores `stdout`, passes `stderr` as error feedback to the model.
|
|
473
|
-
| Other | Non-blocking error. `stderr` only shown in debug mode, execution continues.
|
|
491
|
+
| Exit Code | Behavior |
|
|
492
|
+
| :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
493
|
+
| `0` | Success. A JSON object in `stdout` controls behavior. Any other `stdout`, including bare JSON values such as `42`, is plain text: it is added to the model context on `SessionStart`, `UserPromptSubmit` and `UserPromptExpansion`, and kept as a system message on other events. Output that looks like a JSON object but does not parse is never added to the model context. |
|
|
494
|
+
| `2` | **Blocking error**. Ignores `stdout`, passes `stderr` as error feedback to the model. |
|
|
495
|
+
| Other | Non-blocking error. `stderr` only shown in debug mode, execution continues. |
|
|
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`.
|
|
474
498
|
|
|
475
499
|
**Output Structure:**
|
|
476
500
|
|
|
@@ -502,7 +526,7 @@ Hook output supports three categories of fields:
|
|
|
502
526
|
|
|
503
527
|
```json
|
|
504
528
|
{
|
|
505
|
-
"permission_mode": "default | plan | auto_edit | yolo",
|
|
529
|
+
"permission_mode": "default | plan | auto_edit | auto | yolo",
|
|
506
530
|
"tool_name": "name of the tool being executed",
|
|
507
531
|
"tool_input": "object containing the tool's input parameters",
|
|
508
532
|
"tool_use_id": "unique identifier for this tool use instance (internal format, e.g., toolu_xxx)",
|
|
@@ -548,12 +572,13 @@ For `"ask"`, the TUI displays `permissionDecisionReason` as literal text rather
|
|
|
548
572
|
|
|
549
573
|
```json
|
|
550
574
|
{
|
|
551
|
-
"permission_mode": "default | plan | auto_edit | yolo",
|
|
575
|
+
"permission_mode": "default | plan | auto_edit | auto | yolo",
|
|
552
576
|
"tool_name": "name of the tool that was executed",
|
|
553
577
|
"tool_input": "object containing the tool's input parameters",
|
|
554
578
|
"tool_response": "object containing the tool's response",
|
|
555
579
|
"tool_use_id": "unique identifier for this tool use instance (internal format, e.g., toolu_xxx)",
|
|
556
|
-
"tool_call_id": "original API call ID from the LLM provider (e.g., call_xxx for OpenAI/Qwen) (optional)"
|
|
580
|
+
"tool_call_id": "original API call ID from the LLM provider (e.g., call_xxx for OpenAI/Qwen) (optional)",
|
|
581
|
+
"duration_ms": "tool execution time in milliseconds, excluding approval (optional)"
|
|
557
582
|
}
|
|
558
583
|
```
|
|
559
584
|
|
|
@@ -583,13 +608,14 @@ For `"ask"`, the TUI displays `permissionDecisionReason` as literal text rather
|
|
|
583
608
|
|
|
584
609
|
```json
|
|
585
610
|
{
|
|
586
|
-
"permission_mode": "default | plan | auto_edit | yolo",
|
|
611
|
+
"permission_mode": "default | plan | auto_edit | auto | yolo",
|
|
587
612
|
"tool_use_id": "unique identifier for the tool use (internal format, e.g., toolu_xxx)",
|
|
588
613
|
"tool_call_id": "original API call ID from the LLM provider (e.g., call_xxx for OpenAI/Qwen) (optional)",
|
|
589
614
|
"tool_name": "name of the tool that failed",
|
|
590
615
|
"tool_input": "object containing the tool's input parameters",
|
|
591
616
|
"error": "error message describing the failure",
|
|
592
|
-
"is_interrupt": "boolean indicating if failure was due to user interruption (optional)"
|
|
617
|
+
"is_interrupt": "boolean indicating if failure was due to user interruption (optional)",
|
|
618
|
+
"duration_ms": "tool execution time in milliseconds when execution had started (optional)"
|
|
593
619
|
}
|
|
594
620
|
```
|
|
595
621
|
|
|
@@ -608,26 +634,75 @@ For `"ask"`, the TUI displays `permissionDecisionReason` as literal text rather
|
|
|
608
634
|
}
|
|
609
635
|
```
|
|
610
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
|
+
|
|
611
682
|
#### UserPromptSubmit
|
|
612
683
|
|
|
613
|
-
**Purpose**: Executed before supported model invocations to validate, block, or enrich the
|
|
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.
|
|
614
685
|
|
|
615
686
|
**Event-specific fields**:
|
|
616
687
|
|
|
617
688
|
```json
|
|
618
689
|
{
|
|
619
|
-
"prompt": "
|
|
620
|
-
"submitted_prompt": "optional user text captured at a supported
|
|
690
|
+
"prompt": "legacy prompt for this invocation; semantics depend on the execution path",
|
|
691
|
+
"submitted_prompt": "optional user text captured at a supported submission boundary"
|
|
621
692
|
}
|
|
622
693
|
```
|
|
623
694
|
|
|
624
|
-
`submitted_prompt` is optional. It is present
|
|
695
|
+
`submitted_prompt` is optional. It is present on supported interactive TUI submissions and first-turn headless `UserQuery` sends. On the ACP session path used by ACP clients, `serve`, and daemon hosts, a fresh turn must carry an explicit submission declaration. Missing, non-string, empty, or whitespace-only declarations omit the field; the value is never reconstructed from `prompt` or a display label. Retries, continuations, and channel-classified turns omit it. The channel exclusion includes both automated events and human messages relayed through channel adapters.
|
|
625
696
|
|
|
626
|
-
|
|
697
|
+
Web Shell provides the original composer text at its submission boundary. Realtime voice handoffs do not declare provenance because their request text comes from model-generated tool arguments. Other ACP/daemon SDK clients can opt in per request with `_meta: { "qwen.submittedPrompt": "original submitted text" }`, captured before resource or model-only expansion. Existing clients without this declaration continue running legacy hooks but do not trigger provenance-gated Auto Recall. Do not add the declaration globally to an SDK transport: scheduled tasks, Live task runs, sub-session spawns, model-authored cross-session messages, and promoted mid-turn messages must not acquire it automatically. The private `qwen.daemon.submittedPrompt` key is reserved for the daemon-to-child hop and is stripped from external callers. These declarations are caller-supplied provenance, not proof of human authorship or authorization.
|
|
698
|
+
|
|
699
|
+
On the ACP path, the initial legacy `prompt` is the request's text blocks joined with a space before resource, attachment, slash-command, or model-only expansion. It does not expose the complete expanded model input. `submitted_prompt` can equal that text, but comes only from the explicit declaration and preserves its original whitespace. On the core/headless path, legacy `prompt` represents the current model-bound text for the hook invocation. Neither field is a complete DLP inspection surface.
|
|
700
|
+
|
|
701
|
+
The following composer rules apply to the interactive TUI, not to ACP clients. Deferred input can retain the field when its provenance remains complete. A combined batch retains provenance only when every constituent item has it; edited, partially known, or otherwise ambiguous input omits the field. Prompt, command, and shell-history navigation or selected search matches, cross-restart stash restores, and conversation rewind restores also omit it because those paths can surface model-bound text without its original provenance. Consumers that require user-submitted text should treat absence as unavailable rather than falling back to `prompt`.
|
|
627
702
|
|
|
628
703
|
After restored or provenance-unavailable model-bound input is cleared or submitted, the composer also clears its undo and redo history. This prevents undo from restoring expanded text after its marker or sidecar has been consumed.
|
|
629
704
|
|
|
630
|
-
Large-paste placeholders remain compact in `submitted_prompt`; the expanded pasted content appears only in `prompt`.
|
|
705
|
+
Large-paste placeholders remain compact in `submitted_prompt`; the expanded pasted content appears only in `prompt`. On that TUI path, consumers should treat the field as a text projection rather than a byte-for-byte record of clipboard input. ACP clients have no equivalent built-in Vim, paste-placeholder, history, or rewind provenance tracking; they own whether restored or edited text retains a valid submission declaration.
|
|
631
706
|
|
|
632
707
|
Any non-empty input present while Vim mode is enabled omits `submitted_prompt`, including after Vim is disabled, because Vim registers do not carry provenance in this version. This conservative rule also covers drafts entered before enabling Vim. Clearing the composer starts a new eligible input.
|
|
633
708
|
|
|
@@ -665,10 +740,7 @@ This two-field payload is written only for this kind of user-prompt record.
|
|
|
665
740
|
`hookContext` intentionally duplicates the tagged part so offline and
|
|
666
741
|
third-party consumers can identify its provenance without parsing model text.
|
|
667
742
|
`displayText` is the pre-hook display projection and never includes the hook
|
|
668
|
-
context.
|
|
669
|
-
projection carried by `submitted_prompt`; ACP, headless, `serve`, SDK, remote
|
|
670
|
-
input, and other paths without that provenance record the expanded pre-hook
|
|
671
|
-
prompt instead.
|
|
743
|
+
context. On the core/headless path it is the submitted projection when available, otherwise the expanded pre-hook prompt. ACP records the trusted display projection or raw request text before expansion when a projection or attachment references require a payload; otherwise it records the user message without `systemPayload` or `displayText`.
|
|
672
744
|
|
|
673
745
|
Transcript display consumers treat `displayText` as this user-prompt projection
|
|
674
746
|
when `systemPayload.hookContext` is a string. For compatibility with released
|
|
@@ -709,6 +781,43 @@ When sent to the model, injected `additionalContext` is appended as its own mess
|
|
|
709
781
|
}
|
|
710
782
|
```
|
|
711
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
|
+
|
|
712
821
|
#### SessionStart
|
|
713
822
|
|
|
714
823
|
**Purpose**: Executed when a new session starts to perform initialization tasks.
|
|
@@ -717,7 +826,7 @@ When sent to the model, injected `additionalContext` is appended as its own mess
|
|
|
717
826
|
|
|
718
827
|
```json
|
|
719
828
|
{
|
|
720
|
-
"permission_mode": "default | plan | auto_edit | yolo",
|
|
829
|
+
"permission_mode": "default | plan | auto_edit | auto | yolo",
|
|
721
830
|
"source": "startup | resume | clear | compact",
|
|
722
831
|
"model": "the model being used",
|
|
723
832
|
"agent_type": "the type of agent if applicable (optional)"
|
|
@@ -804,11 +913,13 @@ The hook uses the deleting runtime's normal session fields (`session_id`, `trans
|
|
|
804
913
|
|
|
805
914
|
```json
|
|
806
915
|
{
|
|
807
|
-
"stop_hook_active": "
|
|
916
|
+
"stop_hook_active": "true when this turn is continuing because a stop hook blocked the previous stop check (still true after tool calls made during that continuation); false on the first check and again once the stop is allowed, the blocking cap is reached, the user steers or sends new input, or a new turn, retry or goal turn starts",
|
|
808
917
|
"last_assistant_message": "the last message from the assistant",
|
|
809
918
|
"context_usage": "ratio of context window used (may exceed 1 when tokens exceed window; optional)",
|
|
810
919
|
"context_limit": "context window size in tokens (optional)",
|
|
811
|
-
"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"
|
|
812
923
|
}
|
|
813
924
|
```
|
|
814
925
|
|
|
@@ -835,23 +946,25 @@ The `context_usage`, `context_limit`, and `input_tokens` fields allow hook scrip
|
|
|
835
946
|
|
|
836
947
|
#### StopFailure
|
|
837
948
|
|
|
838
|
-
**Purpose**:
|
|
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.
|
|
839
950
|
|
|
840
951
|
**Event-specific fields**:
|
|
841
952
|
|
|
842
953
|
```json
|
|
843
954
|
{
|
|
844
955
|
"error": "rate_limit | authentication_failed | billing_error | invalid_request | server_error | max_output_tokens | loop_detected | unknown",
|
|
845
|
-
"error_details": "
|
|
846
|
-
"last_assistant_message": "the
|
|
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"
|
|
847
958
|
}
|
|
848
959
|
```
|
|
849
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
|
+
|
|
850
963
|
**Matcher**: Matches against the `error` field. For example, `"matcher": "rate_limit"` will only trigger for rate limit errors.
|
|
851
964
|
|
|
852
965
|
**Output Options**:
|
|
853
966
|
|
|
854
|
-
- **None** - StopFailure is fire-and-forget. All hook output and exit codes are
|
|
967
|
+
- **None** - StopFailure is fire-and-forget. All hook output, errors and exit codes are discarded.
|
|
855
968
|
|
|
856
969
|
**Exit Code Handling**:
|
|
857
970
|
|
|
@@ -897,7 +1010,7 @@ A command hook is left to finish if Qwen exits after dispatch; its stdout and st
|
|
|
897
1010
|
|
|
898
1011
|
```json
|
|
899
1012
|
{
|
|
900
|
-
"permission_mode": "default | plan | auto_edit | yolo",
|
|
1013
|
+
"permission_mode": "default | plan | auto_edit | auto | yolo",
|
|
901
1014
|
"agent_id": "identifier for the subagent",
|
|
902
1015
|
"agent_type": "type of agent (Bash, Explorer, Plan, Custom, etc.)"
|
|
903
1016
|
}
|
|
@@ -926,12 +1039,14 @@ A command hook is left to finish if Qwen exits after dispatch; its stdout and st
|
|
|
926
1039
|
|
|
927
1040
|
```json
|
|
928
1041
|
{
|
|
929
|
-
"permission_mode": "default | plan | auto_edit | yolo",
|
|
930
|
-
"stop_hook_active": "
|
|
1042
|
+
"permission_mode": "default | plan | auto_edit | auto | yolo",
|
|
1043
|
+
"stop_hook_active": "false on the first stop check; true when the subagent is continuing because a SubagentStop hook blocked its previous stop",
|
|
931
1044
|
"agent_id": "identifier for the subagent",
|
|
932
1045
|
"agent_type": "type of agent",
|
|
933
1046
|
"agent_transcript_path": "path to the subagent's transcript",
|
|
934
|
-
"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"
|
|
935
1050
|
}
|
|
936
1051
|
```
|
|
937
1052
|
|
|
@@ -979,32 +1094,22 @@ A command hook is left to finish if Qwen exits after dispatch; its stdout and st
|
|
|
979
1094
|
|
|
980
1095
|
#### PostCompact
|
|
981
1096
|
|
|
982
|
-
**Purpose**:
|
|
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.
|
|
983
1098
|
|
|
984
1099
|
**Event-specific fields**:
|
|
985
1100
|
|
|
986
1101
|
```json
|
|
987
1102
|
{
|
|
988
1103
|
"trigger": "manual | auto",
|
|
989
|
-
"compact_summary": "the summary
|
|
1104
|
+
"compact_summary": "the summary that replaced the compacted history, without its <analysis> block"
|
|
990
1105
|
}
|
|
991
1106
|
```
|
|
992
1107
|
|
|
993
|
-
**Matcher**: Matches against the `trigger` field. For example, `"matcher": "manual"`
|
|
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.
|
|
994
1109
|
|
|
995
1110
|
**Output Options**:
|
|
996
1111
|
|
|
997
|
-
- `
|
|
998
|
-
- Standard hook output fields (for logging only)
|
|
999
|
-
|
|
1000
|
-
**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.
|
|
1001
|
-
|
|
1002
|
-
**Exit Code Handling**:
|
|
1003
|
-
|
|
1004
|
-
| Exit Code | Behavior |
|
|
1005
|
-
| --------- | --------------------------------------------------------- |
|
|
1006
|
-
| 0 | Success - stdout shown to user in verbose mode |
|
|
1007
|
-
| 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.
|
|
1008
1113
|
|
|
1009
1114
|
**Example Configuration**:
|
|
1010
1115
|
|
|
@@ -1073,7 +1178,7 @@ A command hook is left to finish if Qwen exits after dispatch; its stdout and st
|
|
|
1073
1178
|
|
|
1074
1179
|
```json
|
|
1075
1180
|
{
|
|
1076
|
-
"permission_mode": "default | plan | auto_edit | yolo",
|
|
1181
|
+
"permission_mode": "default | plan | auto_edit | auto | yolo",
|
|
1077
1182
|
"tool_name": "name of the tool requesting permission",
|
|
1078
1183
|
"tool_input": "object containing the tool's input parameters",
|
|
1079
1184
|
"permission_suggestions": "array of suggested permissions (optional)"
|
|
@@ -1103,6 +1208,30 @@ A command hook is left to finish if Qwen exits after dispatch; its stdout and st
|
|
|
1103
1208
|
}
|
|
1104
1209
|
```
|
|
1105
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
|
+
|
|
1106
1235
|
#### TodoCreated
|
|
1107
1236
|
|
|
1108
1237
|
**Purpose**: Executed when a new todo item is created via the `todo_write` tool. Allows validation, logging, or blocking of todo creation.
|
|
@@ -1191,7 +1320,7 @@ exit 0
|
|
|
1191
1320
|
"type": "command",
|
|
1192
1321
|
"command": "$HOME/.qwen/hooks/todo-validator.sh",
|
|
1193
1322
|
"name": "todo-validator",
|
|
1194
|
-
"timeout":
|
|
1323
|
+
"timeout": 5
|
|
1195
1324
|
}
|
|
1196
1325
|
]
|
|
1197
1326
|
}
|
|
@@ -1285,7 +1414,7 @@ exit 0
|
|
|
1285
1414
|
"type": "command",
|
|
1286
1415
|
"command": "$HOME/.qwen/hooks/todo-completion-validator.sh",
|
|
1287
1416
|
"name": "completion-validator",
|
|
1288
|
-
"timeout":
|
|
1417
|
+
"timeout": 5
|
|
1289
1418
|
}
|
|
1290
1419
|
]
|
|
1291
1420
|
}
|
|
@@ -1301,6 +1430,34 @@ exit 0
|
|
|
1301
1430
|
- **Workflow Control**: Block completion until prerequisites are met
|
|
1302
1431
|
- **Integration**: Sync todos with external task management systems (Jira, Trello, etc.)
|
|
1303
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
|
+
|
|
1304
1461
|
## Hook Configuration
|
|
1305
1462
|
|
|
1306
1463
|
Hooks are configured in Qwen Code settings, typically in `.qwen/settings.json` or user configuration files:
|
|
@@ -1318,7 +1475,7 @@ Hooks are configured in Qwen Code settings, typically in `.qwen/settings.json` o
|
|
|
1318
1475
|
"command": "/path/to/security-check.sh",
|
|
1319
1476
|
"name": "security-check",
|
|
1320
1477
|
"description": "Run security checks before tool execution",
|
|
1321
|
-
"timeout":
|
|
1478
|
+
"timeout": 30
|
|
1322
1479
|
}
|
|
1323
1480
|
]
|
|
1324
1481
|
}
|
|
@@ -1350,13 +1507,14 @@ Hooks are configured in Qwen Code settings, typically in `.qwen/settings.json` o
|
|
|
1350
1507
|
|
|
1351
1508
|
Only `command` type supports asynchronous execution. Setting `"async": true` runs the hook in the background without blocking the main flow.
|
|
1352
1509
|
|
|
1353
|
-
Async hooks are scoped to the Qwen process
|
|
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.
|
|
1354
1511
|
|
|
1355
1512
|
**Features:**
|
|
1356
1513
|
|
|
1357
|
-
- Cannot return decision control (
|
|
1358
|
-
-
|
|
1359
|
-
- Suitable for auditing, logging
|
|
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
|
|
1360
1518
|
|
|
1361
1519
|
**Example:**
|
|
1362
1520
|
|
|
@@ -1369,9 +1527,9 @@ Async hooks are scoped to the Qwen process because their captured output is deli
|
|
|
1369
1527
|
"hooks": [
|
|
1370
1528
|
{
|
|
1371
1529
|
"type": "command",
|
|
1372
|
-
"command": "$QWEN_PROJECT_DIR/.qwen/hooks/run-tests-async.sh",
|
|
1530
|
+
"command": "\"$QWEN_PROJECT_DIR/.qwen/hooks/run-tests-async.sh\"",
|
|
1373
1531
|
"async": true,
|
|
1374
|
-
"timeout":
|
|
1532
|
+
"timeout": 300
|
|
1375
1533
|
}
|
|
1376
1534
|
]
|
|
1377
1535
|
}
|
|
@@ -1385,11 +1543,12 @@ Async hooks are scoped to the Qwen process because their captured output is deli
|
|
|
1385
1543
|
INPUT=$(cat)
|
|
1386
1544
|
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
|
|
1387
1545
|
if [[ "$FILE_PATH" != *.ts && "$FILE_PATH" != *.js ]]; then exit 0; fi
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
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"
|
|
1391
1550
|
else
|
|
1392
|
-
echo "
|
|
1551
|
+
echo "Tests failed after editing $FILE_PATH" >>"$LOG"
|
|
1393
1552
|
fi
|
|
1394
1553
|
```
|
|
1395
1554
|
|
|
@@ -1397,7 +1556,7 @@ fi
|
|
|
1397
1556
|
|
|
1398
1557
|
- Hooks run in the user's environment with user privileges
|
|
1399
1558
|
- Project-level hooks require trusted folder status
|
|
1400
|
-
- Timeouts prevent hanging hooks (default: 60 seconds)
|
|
1559
|
+
- Timeouts prevent hanging hooks (default: 60 seconds for command hooks)
|
|
1401
1560
|
|
|
1402
1561
|
## Best Practices
|
|
1403
1562
|
|
|
@@ -1457,7 +1616,7 @@ Configure in `.qwen/settings.json`:
|
|
|
1457
1616
|
"command": "${SECURITY_CHECK_SCRIPT}",
|
|
1458
1617
|
"name": "security-checker",
|
|
1459
1618
|
"description": "Security validation for bash commands",
|
|
1460
|
-
"timeout":
|
|
1619
|
+
"timeout": 10
|
|
1461
1620
|
}
|
|
1462
1621
|
]
|
|
1463
1622
|
}
|
|
@@ -1495,11 +1654,11 @@ A PostToolUse HTTP hook that sends all tool execution records to a remote audit
|
|
|
1495
1654
|
}
|
|
1496
1655
|
```
|
|
1497
1656
|
|
|
1498
|
-
### Example 3:
|
|
1657
|
+
### Example 3: Submitted Prompt Validation Hook
|
|
1499
1658
|
|
|
1500
|
-
|
|
1659
|
+
On the core/headless path, `prompt` can include generated or expanded content rather than original user input. On ACP it starts with the pre-expansion request text, so reading it does not inspect attachment bodies or the complete model input. `UserPromptSubmit` does not cover every model send. Do not silently fall back from `submitted_prompt` to `prompt` when source provenance is required.
|
|
1501
1660
|
|
|
1502
|
-
A UserPromptSubmit hook that validates supported
|
|
1661
|
+
A UserPromptSubmit hook that validates supported submitted text and provides context for long prompts. It also runs on headless submissions and explicitly declared ACP/daemon submissions; it is not TUI-only. It skips invocations where source provenance is unavailable. A blocking result stops the affected invocation, including on these non-TUI paths. The keyword check is illustrative and is not a complete DLP policy:
|
|
1503
1662
|
|
|
1504
1663
|
**prompt_validator.py**
|
|
1505
1664
|
|
|
@@ -1554,9 +1713,24 @@ sys.exit(0)
|
|
|
1554
1713
|
|
|
1555
1714
|
## Troubleshooting
|
|
1556
1715
|
|
|
1557
|
-
|
|
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
|
+
|
|
1558
1733
|
- Verify hook script permissions and executability
|
|
1559
1734
|
- Ensure proper JSON formatting in hook outputs
|
|
1560
1735
|
- Use specific matcher patterns to avoid unintended hook execution
|
|
1561
|
-
- 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.
|
|
1562
1736
|
- Temporarily disable all hooks: add `"disableAllHooks": true` in settings
|