@qwen-code/qwen-code 0.22.2 → 0.22.3-nightly.20260831.3a0c4c6108
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 +3 -3
- package/bundled/qc-helper/docs/common-workflow.md +32 -0
- package/bundled/qc-helper/docs/configuration/auth.md +6 -6
- package/bundled/qc-helper/docs/configuration/model-providers.md +4 -2
- package/bundled/qc-helper/docs/configuration/settings.md +47 -44
- package/bundled/qc-helper/docs/extension/introduction.md +1 -1
- package/bundled/qc-helper/docs/features/approval-mode.md +3 -0
- package/bundled/qc-helper/docs/features/auto-mode.md +34 -17
- package/bundled/qc-helper/docs/features/channels/dws.md +2 -0
- package/bundled/qc-helper/docs/features/channels/overview.md +36 -3
- package/bundled/qc-helper/docs/features/code-review.md +5 -5
- package/bundled/qc-helper/docs/features/commands.md +41 -0
- package/bundled/qc-helper/docs/features/computer-use.md +2 -2
- package/bundled/qc-helper/docs/features/hooks.md +6 -2
- package/bundled/qc-helper/docs/features/memory.md +1 -0
- package/bundled/qc-helper/docs/features/tool-use-summaries.md +1 -1
- package/bundled/qc-helper/docs/qwen-serve-deploy-local.md +17 -7
- package/bundled/qc-helper/docs/qwen-serve.md +59 -55
- package/bundled/review/SKILL.md +90 -31
- package/bundled/review/references/persistence.md +7 -3
- package/bundled/review/references/posting.md +11 -5
- package/chunks/MaxSizedBox-IHRTWGSY.js +115 -0
- package/chunks/{StandaloneSessionPicker-AVLI6VJP.js → StandaloneSessionPicker-TLVWVTJ7.js} +88 -85
- package/chunks/{acp-startup-profiler-GNYAL6LI.js → acp-startup-profiler-M4X5F3VK.js} +2 -2
- package/chunks/{acpAgent-MXEAN54C.js → acpAgent-7I5LLPP3.js} +1563 -407
- package/chunks/agent-4Z4NTJXD.js +99 -0
- package/chunks/agent-headless-TVUJXQWU.js +89 -0
- package/chunks/{anthropicContentGenerator-HGMBACVE.js → anthropicContentGenerator-VSSPG7XV.js} +84 -55
- package/chunks/{artifact-tool-5YT4QF7Y.js → artifact-tool-TEYW6I4A.js} +11 -3
- package/chunks/{askUserQuestion-4SWJY65V.js → askUserQuestion-PYNBWV63.js} +45 -7
- package/chunks/bridge-EVURP4NO.js +122 -0
- package/chunks/{ca-7HPYOYSZ.js → ca-BNU7YNDE.js} +3 -0
- package/chunks/{channel-management-service-X4AZ6IXX.js → channel-management-service-IDBNYSFW.js} +6 -6
- package/chunks/channel-settings-store-MZNXRKVI.js +125 -0
- package/chunks/{channel-worker-group-27HMGD5S.js → channel-worker-group-ZLP5SJHT.js} +7 -7
- package/chunks/{channel-worker-manager-QEGX646Z.js → channel-worker-manager-FG5377T2.js} +7 -7
- package/chunks/{channel-worker-supervisor-UEW2WWCC.js → channel-worker-supervisor-HDVE4ADS.js} +4 -4
- package/chunks/{chunk-PPKZ7JOE.js → chunk-22UH7VTP.js} +1 -1
- package/chunks/chunk-24FVUD5P.js +49 -0
- package/chunks/{chunk-CMHFCLBU.js → chunk-26SIKQIC.js} +1 -1
- package/chunks/{chunk-5PA6UEYA.js → chunk-3452WXOK.js} +4 -1
- package/chunks/{chunk-SFPGAQUL.js → chunk-373DQUVA.js} +72 -31
- package/chunks/{chunk-H2WDGQ6D.js → chunk-3AKCBZVW.js} +3 -3
- package/chunks/{chunk-LXIBMVRN.js → chunk-3CZGSTZX.js} +15 -9
- package/chunks/{chunk-JVPFTDBK.js → chunk-3EGEBDTW.js} +1 -1
- package/chunks/{chunk-K2NQPH5D.js → chunk-3NQCZMUB.js} +79 -5
- package/chunks/{chunk-E7REAOTN.js → chunk-47ECGEJC.js} +4 -0
- package/chunks/{chunk-WKK5BQNP.js → chunk-4P7PPAHN.js} +45 -421
- package/chunks/chunk-4VQBQLIZ.js +293 -0
- package/chunks/{chunk-4JWNNLPT.js → chunk-5FGWVPCM.js} +4 -4
- package/chunks/{chunk-ZFKOCECU.js → chunk-5ICKESC3.js} +2 -2
- package/chunks/{chunk-3I6UTTDX.js → chunk-67AY5D3M.js} +20 -20
- package/chunks/chunk-6HUXPLB5.js +110 -0
- package/chunks/{chunk-BRVWYMKV.js → chunk-6MBXY6WM.js} +1 -1
- package/chunks/{chunk-6LFTG244.js → chunk-6NWPR2EB.js} +19 -9
- package/chunks/chunk-6OO7QEWV.js +2581 -0
- package/chunks/{chunk-TWSKM647.js → chunk-6VHIWUJP.js} +1 -1
- package/chunks/{chunk-RJC5EIKY.js → chunk-6YXNJXQW.js} +7 -5
- package/chunks/{chunk-TPI7O7HR.js → chunk-7DDTI7Q3.js} +1 -1
- package/chunks/{chunk-KGJGEEVR.js → chunk-7FA2II6K.js} +10 -1
- package/chunks/chunk-7J6OTNGO.js +424 -0
- package/chunks/{chunk-NIFYWDYN.js → chunk-7TBU7PU2.js} +1 -1
- package/chunks/{chunk-3FDFA4MZ.js → chunk-7XICSE62.js} +3 -3
- package/chunks/{chunk-V2NDP3I4.js → chunk-7XL4WRXM.js} +2 -2
- package/chunks/{chunk-F7TNAPZ4.js → chunk-AAX236AR.js} +45 -11
- package/chunks/{chunk-T32W2JHI.js → chunk-ACZ4YRYK.js} +6 -6
- package/chunks/chunk-ADJD4LZF.js +210 -0
- package/chunks/{chunk-JWALNCLT.js → chunk-AF3QB6OL.js} +1 -1
- package/chunks/{chunk-P2SU6ZTI.js → chunk-AI35S34R.js} +3 -3
- package/chunks/{chunk-OIP7C4FE.js → chunk-AKNQMSL2.js} +5 -5
- package/chunks/{chunk-6CGL7E7G.js → chunk-AN3KFCNH.js} +2 -2
- package/chunks/{chunk-ABS25QER.js → chunk-ANVG3BVV.js} +1 -1
- package/chunks/chunk-AYYKUUKP.js +972 -0
- package/chunks/chunk-B2RIIK3K.js +346 -0
- package/chunks/{chunk-F5SZP77N.js → chunk-BBYTY46C.js} +153 -112
- package/chunks/{chunk-XRSOI3DL.js → chunk-BE5FGT5Z.js} +1 -1
- package/chunks/{chunk-BGXZBI5B.js → chunk-BHTYRHJF.js} +3 -2
- package/chunks/{chunk-CSMI4FP5.js → chunk-BSJOBW4U.js} +1 -1
- package/chunks/{chunk-Z7TGYN5F.js → chunk-BXNKREX7.js} +3 -3
- package/chunks/{chunk-4MQEPP3Y.js → chunk-BY24DZ4J.js} +5 -119
- package/chunks/{chunk-5XBFCMWD.js → chunk-CAZADEU7.js} +17 -9
- package/chunks/chunk-CHEIIBT3.js +40 -0
- package/chunks/{chunk-BBWV7ONL.js → chunk-CM4F4JBB.js} +6 -6
- package/chunks/{chunk-CAJTKR6W.js → chunk-D7D3HSYQ.js} +6 -5
- package/chunks/{chunk-3DXFGHAJ.js → chunk-DBTMP3P4.js} +213 -185
- package/chunks/chunk-DJBQCO2E.js +842 -0
- package/chunks/{chunk-RXFQM6FQ.js → chunk-DMEUXLSS.js} +16 -1
- package/chunks/{chunk-3AFMQUTI.js → chunk-E4JNFXNI.js} +3 -3
- package/chunks/{chunk-UHQFIS7N.js → chunk-EAHOJF6V.js} +28 -4
- package/chunks/{chunk-OIVXBW3W.js → chunk-ED7DD7MV.js} +3 -3
- package/chunks/{chunk-6DIGWMGT.js → chunk-EIJT2PQ6.js} +2 -2
- package/chunks/{chunk-XQFT3QUF.js → chunk-ENYUKMFK.js} +1 -1
- package/chunks/{chunk-CQH5KTKC.js → chunk-ERHAMGAA.js} +1 -1
- package/chunks/{chunk-IOPCFOTF.js → chunk-ERRJA23L.js} +3 -3
- package/chunks/{chunk-LDP5OD6N.js → chunk-EU2B4P3D.js} +12 -12
- package/chunks/{chunk-W5MJJ2V7.js → chunk-FHPYRXRH.js} +1 -1
- package/chunks/{chunk-IZIVM7LZ.js → chunk-FIWZOMBF.js} +3 -3
- package/chunks/{chunk-4HV6HH33.js → chunk-FPMQT2YY.js} +9 -9
- package/chunks/{chunk-Z7VOMGDC.js → chunk-FTJMWDND.js} +0 -24
- package/chunks/{chunk-L2M46FP5.js → chunk-FXUSWLBF.js} +225 -12
- package/chunks/{chunk-VVW4ZNFY.js → chunk-GB4UKWY5.js} +16 -8
- package/chunks/{chunk-PKAYJDB3.js → chunk-GCUR24KK.js} +22 -4
- package/chunks/{chunk-DIMEPKCW.js → chunk-GDXSXL3H.js} +11 -1
- package/chunks/{chunk-7JPW6IYH.js → chunk-GN422P4J.js} +1 -1
- package/chunks/{chunk-66KDY3LV.js → chunk-GS7XT345.js} +3 -3
- package/chunks/{chunk-PFCQ62V4.js → chunk-H2A2GJGL.js} +6 -6
- package/chunks/{chunk-Z7FLBQPR.js → chunk-H5GPPDGY.js} +8 -8
- package/chunks/{chunk-CPGJJJLU.js → chunk-HDMKCJHI.js} +1 -1
- package/chunks/{chunk-6PJOTWAN.js → chunk-HT5S5TRQ.js} +1 -1
- package/chunks/{chunk-Z4X5MTRT.js → chunk-HWVUSYSN.js} +5 -12
- package/chunks/{chunk-V4QXXQJ2.js → chunk-I75VKFCJ.js} +4 -4
- package/chunks/{chunk-NU7RKEZR.js → chunk-IBMUI5EV.js} +3 -3
- package/chunks/{chunk-4J657AJR.js → chunk-ID33ZRWH.js} +42 -42
- package/chunks/{chunk-R4PMVSR5.js → chunk-IIFL7QDN.js} +30 -192
- package/chunks/{chunk-MQM5PJML.js → chunk-IVUWTA2D.js} +1 -1
- package/chunks/{chunk-E55H6BZ7.js → chunk-IXEZHTDR.js} +1616 -151
- package/chunks/{chunk-XF63PKEN.js → chunk-IXHV5MIC.js} +1 -1
- package/chunks/{chunk-JHS74YAB.js → chunk-J4Y3QJHF.js} +3 -1
- package/chunks/{chunk-MIIVI25Q.js → chunk-JDIO45X7.js} +3 -3
- package/chunks/{chunk-QFCDF5PL.js → chunk-JHN7UIDW.js} +1 -1
- package/chunks/{chunk-FDY5RMGH.js → chunk-JLSZT354.js} +2 -2
- package/chunks/chunk-JMRE4WJQ.js +1849 -0
- package/chunks/{chunk-FY76G3G5.js → chunk-JOTYTYYW.js} +6 -6
- package/chunks/{chunk-TRZTNIQ6.js → chunk-JOWQD4LO.js} +3 -3
- package/chunks/{chunk-KEKZFOL6.js → chunk-JPKTAQS3.js} +1 -1
- package/chunks/chunk-JS73NNWF.js +30 -0
- package/chunks/chunk-JX6XHPTX.js +26 -0
- package/chunks/{chunk-5JTIYALA.js → chunk-JZWOCUZ3.js} +1 -1
- package/chunks/{chunk-3JGZSIDA.js → chunk-KFN2IZYR.js} +3 -3
- package/chunks/{chunk-23RFD54N.js → chunk-KHP66DFN.js} +1 -1
- package/chunks/{chunk-AGR5UROZ.js → chunk-KUDI54QQ.js} +23 -33
- package/chunks/{chunk-3SGB2UHX.js → chunk-L2OKAIUK.js} +28 -16
- package/chunks/{chunk-BXDAPVQU.js → chunk-L6CUJZDG.js} +28 -4
- package/chunks/chunk-LAUEEBDL.js +277 -0
- package/chunks/{chunk-BNMF3K5X.js → chunk-LFAR7CPW.js} +55 -39
- package/chunks/{chunk-Y3QL45LS.js → chunk-LKODFJRD.js} +9 -9
- package/chunks/{chunk-BWORX6FA.js → chunk-LMMHS3RS.js} +1 -1
- package/chunks/{chunk-UTLCH2FK.js → chunk-LYSZVCCD.js} +10 -7
- package/chunks/{chunk-F6FV3C5K.js → chunk-MBZ5ORJB.js} +264 -283
- package/chunks/{chunk-L6YT5H34.js → chunk-MJBHSZEJ.js} +5 -5
- package/chunks/{chunk-B7CDU2SL.js → chunk-MOF6VZN2.js} +18 -21
- package/chunks/{chunk-6LFJEACX.js → chunk-MZ5A5PQW.js} +7 -7
- package/chunks/chunk-MZYWNU66.js +149 -0
- package/chunks/{chunk-2TNL5KPM.js → chunk-N4QWUPDM.js} +7 -0
- package/chunks/{chunk-5O72BNDD.js → chunk-ND7TQQPE.js} +9 -9
- package/chunks/{chunk-QP4C6WCE.js → chunk-NGKLMNWN.js} +3 -3
- package/chunks/{chunk-JSC3H3TD.js → chunk-NT5XIL5H.js} +46 -18
- package/chunks/{chunk-KUX5D6DK.js → chunk-NT7LXVV5.js} +11010 -11138
- package/chunks/{chunk-PDQGMSZK.js → chunk-ODZF64DM.js} +1 -1
- package/chunks/{chunk-FBSSIAAQ.js → chunk-OE5AQVNB.js} +8 -8
- package/chunks/chunk-OHU2H5CS.js +130 -0
- package/chunks/{chunk-2K6ORIHJ.js → chunk-OKMDOATP.js} +13 -13
- package/chunks/{chunk-JB4JIVTJ.js → chunk-OKTNXDVO.js} +1 -1
- package/chunks/{chunk-XDLEZ5HX.js → chunk-OQYXJK2V.js} +1 -1
- package/chunks/{chunk-EFUM7RVY.js → chunk-OSTQZIOY.js} +944 -18
- package/chunks/{chunk-VQUGEVGR.js → chunk-OTTNXUT5.js} +1 -1
- package/chunks/{chunk-T3WXYEZ4.js → chunk-PB7JBAHF.js} +53 -54
- package/chunks/{chunk-WAOIHTJS.js → chunk-PDAKFU7M.js} +1 -1
- package/chunks/{chunk-43GGFFLY.js → chunk-PDXYZBBQ.js} +3 -3
- package/chunks/{chunk-4CMJKUND.js → chunk-PNIGAVY6.js} +67 -2
- package/chunks/{chunk-SAH4BD2J.js → chunk-PQEISIKS.js} +67 -0
- package/chunks/{chunk-4CDSK5AZ.js → chunk-PWR2NQBS.js} +6 -6
- package/chunks/{chunk-YTDVNSUQ.js → chunk-QAK5475D.js} +1 -1
- package/chunks/{chunk-IJKTMLBE.js → chunk-QE7DTCLX.js} +1 -1
- package/chunks/{chunk-SMPR7SPO.js → chunk-QJNDUTOL.js} +45 -239
- package/chunks/{chunk-C6K43ZDE.js → chunk-QTMPM6RC.js} +16 -10
- package/chunks/{chunk-P5GGM4KS.js → chunk-RAEEQEC5.js} +5 -5
- package/chunks/{chunk-XDFHY4R3.js → chunk-RGEV5AUD.js} +242 -14
- package/chunks/{chunk-M6FOJXW3.js → chunk-RKW36UWC.js} +1 -1
- package/chunks/{chunk-RIEFGNTP.js → chunk-RLSPPTWH.js} +5119 -683
- package/chunks/{chunk-PDMJ3KGS.js → chunk-RT4QNQ5P.js} +3 -3
- package/chunks/{chunk-SJ3ZUWFK.js → chunk-RVCGAHC7.js} +4 -26
- package/chunks/{chunk-77RG5SFQ.js → chunk-RY7DL5IF.js} +11 -6
- package/chunks/{chunk-4FTKQNWJ.js → chunk-S2T7H5MI.js} +182 -3
- package/chunks/{chunk-EOGELB3H.js → chunk-SDCHI64N.js} +4 -4
- package/chunks/{chunk-EKSCLBBF.js → chunk-SMJYTKTB.js} +23 -5
- package/chunks/{chunk-MZS7GEC7.js → chunk-SMRDCANI.js} +1 -1
- package/chunks/{chunk-43UYNAWX.js → chunk-T3TL6S3B.js} +4 -4
- package/chunks/{chunk-4K7NQDCG.js → chunk-T4EFG2P5.js} +18 -9
- package/chunks/{chunk-IK5BW3CS.js → chunk-T4RMUTTT.js} +16 -5
- package/chunks/{chunk-L6BZRIUL.js → chunk-TBJ3SNS3.js} +183 -5
- package/chunks/{chunk-CCBZDVUA.js → chunk-TNMOFNT4.js} +133 -122
- package/chunks/{chunk-Y6LSMB6J.js → chunk-TV7BJ7TX.js} +1 -1
- package/chunks/{chunk-G34IR3D6.js → chunk-U5RTYI7D.js} +102 -146
- package/chunks/{chunk-TTX2JUE6.js → chunk-U6D2PPMN.js} +1 -1
- package/chunks/{chunk-D5LUXLUH.js → chunk-UJ4DUYIH.js} +18 -4
- package/chunks/{chunk-A7YP63XN.js → chunk-UKB2TZAO.js} +5 -5
- package/chunks/{chunk-VTHREBQM.js → chunk-UKYXYWI2.js} +2 -2
- package/chunks/{chunk-2NYCN6F2.js → chunk-UVYKCRJZ.js} +46 -29
- package/chunks/{chunk-HVEYF6VT.js → chunk-UXEW7TQS.js} +2 -2
- package/chunks/{chunk-HVQ3B7FF.js → chunk-V4HN35IF.js} +44 -7
- package/chunks/chunk-VGHZT6JR.js +51 -0
- package/chunks/{chunk-V5J4J5TP.js → chunk-VYSZUQGU.js} +2 -20
- package/chunks/{chunk-6IUNAPLR.js → chunk-W4BDHLRT.js} +3 -3
- package/chunks/{chunk-Q26AYA62.js → chunk-W7KWB6AH.js} +7 -4
- package/chunks/chunk-WLEYH7CD.js +332 -0
- package/chunks/{chunk-RU7BK6B3.js → chunk-X7C7KFWA.js} +2 -2
- package/chunks/{chunk-YRLW2MSX.js → chunk-XBVNNDPK.js} +11 -4
- package/chunks/{chunk-BFPESSTR.js → chunk-XEAAO654.js} +1 -1
- package/chunks/{chunk-JU4EEXC7.js → chunk-XLENZQXH.js} +2 -2
- package/chunks/{chunk-JSHHYW6T.js → chunk-XPDKSOVW.js} +69 -64
- package/chunks/chunk-YDQ4OCDK.js +1222 -0
- package/chunks/{chunk-ZU4UDIWX.js → chunk-YKADANK6.js} +6 -7
- package/chunks/{chunk-JCQD3INC.js → chunk-YNG7XAJU.js} +3 -3
- package/chunks/{chunk-O2UN57NX.js → chunk-YOFULAHO.js} +19 -2
- package/chunks/{chunk-BAJKAAOY.js → chunk-YOMKOM7E.js} +4892 -1504
- package/chunks/{chunk-ERFDKH32.js → chunk-YPISTYEI.js} +8 -7
- package/chunks/{chunk-TGWAQ5RB.js → chunk-ZBDYI7VM.js} +6900 -6882
- package/chunks/{chunk-OZ6KS6KW.js → chunk-ZGCKTAL5.js} +6 -1
- package/chunks/chunk-ZHO2CW6D.js +205 -0
- package/chunks/{chunk-DZWPESIF.js → chunk-ZQ3FKEWA.js} +3 -3
- package/chunks/{chunk-7EQQR46F.js → chunk-ZVP4PWBU.js} +1 -1
- package/chunks/{chunk-7UYV53BC.js → chunk-ZYPJ7HVZ.js} +1 -1
- package/chunks/config-utils-NNUPVGEC.js +118 -0
- package/chunks/contextCommand-S3TPCDM5.js +111 -0
- package/chunks/{core-runtime-677KFX6Q.js → core-runtime-NASPCSQX.js} +66 -63
- package/chunks/{create-sub-session-23ITIELI.js → create-sub-session-36TNCHCP.js} +3 -3
- package/chunks/{create-sub-session-JKZAYZX7.js → create-sub-session-DS4BJLYZ.js} +97 -68
- package/chunks/{cron-create-KJ4IY6PP.js → cron-create-QXHTYUTO.js} +4 -4
- package/chunks/{cron-delete-MBLQCAYY.js → cron-delete-WV2BM42M.js} +4 -4
- package/chunks/{cron-list-DWH2PQ47.js → cron-list-7KVNBLZ7.js} +4 -4
- package/chunks/{daemon-MJQUO7RA.js → daemon-UCVUHPJD.js} +723 -90
- package/chunks/{daemon-git-worktree-guard-6MVAAZZZ.js → daemon-git-worktree-guard-ATXVQPS3.js} +63 -60
- package/chunks/daemon-status-provider-UI3GBTMO.js +121 -0
- package/chunks/daemon-trust-policy-SUCBJ2CA.js +117 -0
- package/chunks/{daemon-trust-policy-monitor-B5U6TQX5.js → daemon-trust-policy-monitor-3LM5RQNS.js} +71 -68
- package/chunks/{de-X6HLSIFE.js → de-T4BLOKEC.js} +3 -0
- package/chunks/deferred-core-runtime-SCOJLVYG.js +119 -0
- package/chunks/{display-image-BE7I6ZB6.js → display-image-Z4VBQDEJ.js} +5 -5
- package/chunks/{dist-TJUDJTCB.js → dist-5423MG3D.js} +411 -91
- package/chunks/{dist-ILDBUWDB.js → dist-7WDZYMWV.js} +43 -25
- package/chunks/{dist-ZBVOXSKF.js → dist-FLJLHASF.js} +219 -121
- package/chunks/{dist-QODVOVWI.js → dist-GPSRNVVP.js} +43 -35
- package/chunks/{dist-DJBNNPLN.js → dist-LY66XNUL.js} +10 -3
- package/chunks/{dist-7CKN54NL.js → dist-S3BKCTWF.js} +205 -89
- package/chunks/{dist-UQUFZDIY.js → dist-SDKHGH5O.js} +41 -20
- package/chunks/{dist-4Q7NTUNB.js → dist-WAUO5OMN.js} +46 -22
- package/chunks/{dist-SATKXKUR.js → dist-WIVVPE7M.js} +28 -14
- package/chunks/earlyInputCapture-INWJ2STR.js +112 -0
- package/chunks/{edit-BSV6YRVW.js → edit-B7ZRRGAE.js} +51 -49
- package/chunks/{en-YLXBXM4Z.js → en-E4AYTX6H.js} +3 -0
- package/chunks/{enter-worktree-MQXFFPKM.js → enter-worktree-SPZHEETQ.js} +7 -7
- package/chunks/{enterPlanMode-PKNF35FE.js → enterPlanMode-S554IKJ2.js} +55 -53
- package/chunks/environment-25ADH4Y6.js +134 -0
- package/chunks/errors-G2I6LFTW.js +118 -0
- package/chunks/{exit-worktree-L344UY7K.js → exit-worktree-AWUXAMAM.js} +7 -7
- package/chunks/exitPlanMode-ZFH4OYPM.js +87 -0
- package/chunks/{fast-path-773PV7PU.js → fast-path-WZHVZ2ER.js} +8 -7
- package/chunks/{fast-path-settings-XMFBYFUH.js → fast-path-settings-NILM6QZL.js} +3 -3
- package/chunks/{fr-FTZWF462.js → fr-BGHGYX6A.js} +3 -0
- package/chunks/{glob-CZHOWUEA.js → glob-UOVDMBUP.js} +50 -48
- package/chunks/{goal-tools-YZQJXTGH.js → goal-tools-7TNK5ZHC.js} +5 -4
- package/chunks/{grep-5GPICQBU.js → grep-LHYJ5V2N.js} +9 -7
- package/chunks/handleAutoUpdate-4MZ45DZY.js +114 -0
- package/chunks/i18n-KWUEI4DS.js +129 -0
- package/chunks/{image-gen-HAYOEQ4O.js → image-gen-YZDVO5YS.js} +8 -10
- package/chunks/initializer-2NBROGMG.js +118 -0
- package/chunks/installationInfo-YKUSY3ZB.js +112 -0
- package/chunks/{ja-2GL5FKYJ.js → ja-G3FTD5XE.js} +3 -0
- package/chunks/{keychain-token-storage-37XPR34V.js → keychain-token-storage-REZVMJA6.js} +2 -2
- package/chunks/list-W2WV3COM.js +121 -0
- package/chunks/list-agents-PMVMHNY7.js +128 -0
- package/chunks/{gemini-IP4FJAP5.js → llm-NPPHLIJI.js} +162 -133
- package/chunks/{geminiContentGenerator-PUNEBWJW.js → llm-content-generator-YK3WN6XW.js} +29 -29
- package/chunks/loadedSettingsAdapter-2P7DFWUR.js +115 -0
- package/chunks/{loggingContentGenerator-2GGZNGLG.js → loggingContentGenerator-QYYYGU6V.js} +318 -35
- package/chunks/{loop-wakeup-XJFONSQ7.js → loop-wakeup-EBM4F5MZ.js} +5 -5
- package/chunks/{ls-3VAT2J7A.js → ls-F6TRX3DD.js} +4 -4
- package/chunks/{lsp-5W7IRUBH.js → lsp-QYTOS2FI.js} +2 -2
- package/chunks/{managed-npm-update-5TEV2E3J.js → managed-npm-update-UMC4NBWW.js} +64 -61
- package/chunks/mcp-OFI6XDP2.js +115 -0
- package/chunks/{monitor-FI7PY36Z.js → monitor-QX3BM3JY.js} +50 -48
- package/chunks/nonInteractiveCli-NVRMD5MN.js +193 -0
- package/chunks/{notebook-edit-TPGMGBST.js → notebook-edit-AAILDPSV.js} +51 -49
- package/chunks/{open-with-auth-4UI3KHUR.js → open-with-auth-D6JD6LDS.js} +4 -4
- package/chunks/{openaiContentGenerator-SUCYANUZ.js → openaiContentGenerator-53PB3CMN.js} +27 -29
- package/chunks/pidfile-5ACKG2LI.js +116 -0
- package/chunks/process-registry-OAEG6WGC.js +662 -0
- package/chunks/{processUtils-IQZBYWSB.js → processUtils-2BCDO3DZ.js} +2 -2
- package/chunks/prompt-terminal-ledger-3RKW73A2.js +110 -0
- package/chunks/{pt-XN2YWJVM.js → pt-D73IFYT7.js} +3 -0
- package/chunks/{qwenContentGenerator-J4TXFGJT.js → qwenContentGenerator-N4LLWDPH.js} +56 -54
- package/chunks/{qwenOAuth2-RF33DNZW.js → qwenOAuth2-7AOCKSOQ.js} +7 -9
- package/chunks/{read-file-QE2B5FTX.js → read-file-DPAKXHYE.js} +13 -13
- package/chunks/{read-mcp-resource-XD257PGJ.js → read-mcp-resource-R4NO75DW.js} +2 -2
- package/chunks/{record-artifact-RZGZBENU.js → record-artifact-2EAYLAL5.js} +4 -4
- package/chunks/{report-findings-Q3SYKKW5.js → report-findings-Y4MSHDS3.js} +9 -5
- package/chunks/{request-shutdown-BCLA3JV2.js → request-shutdown-DWRMGTMB.js} +8 -7
- package/chunks/resumeHistoryUtils-3JQORXAK.js +123 -0
- package/chunks/ripGrep-AHF5QCI7.js +39 -0
- package/chunks/{ru-OLTMFJEW.js → ru-QMISLKRH.js} +3 -0
- package/chunks/{run-qwen-serve-TPHZMSXJ.js → run-qwen-serve-3LKV7KDC.js} +728 -256
- package/chunks/runtime-66F4W3IA.js +153 -0
- package/chunks/scheduled-tasks-2NVKS5Q2.js +132 -0
- package/chunks/scheduler-JNV7T3ZO.js +127 -0
- package/chunks/{sdk-exporters-http-KCJ4ZFG7.js → sdk-exporters-http-MFIWD23D.js} +2 -2
- package/chunks/{sdk-impl-HLSEDAEP.js → sdk-impl-2RXJ4Q6X.js} +11 -5
- package/chunks/send-message-WPZRCJOB.js +442 -0
- package/chunks/serve-GP2UNRP7.js +123 -0
- package/chunks/{server-DFUSSSHI.js → server-7W6C3SOW.js} +5233 -3623
- package/chunks/{session-3TEHNENZ.js → session-PZLBAQGG.js} +125 -118
- package/chunks/session-pr-refresh-OIVL3U3Z.js +367 -0
- package/chunks/{settings-VOZYKLTT.js → settings-ZOHIQWYK.js} +70 -67
- package/chunks/shell-FWZT6IUR.js +97 -0
- package/chunks/{skill-FEOKFX26.js → skill-RTQC2YGA.js} +121 -65
- package/chunks/skill-settings-AKMIXFSJ.js +123 -0
- package/chunks/spawnChannel-ZP23JL6O.js +116 -0
- package/chunks/standalone-update-P2Q5H4ZU.js +123 -0
- package/chunks/{startInteractiveUI-WHJPFOGH.js → startInteractiveUI-NSA6QPQZ.js} +2018 -1526
- package/chunks/{stdioHelpers-7A2EE64Z.js → stdioHelpers-AY6XCDY2.js} +3 -1
- package/chunks/{syntheticOutput-ML43GEFN.js → syntheticOutput-5URSQLIS.js} +3 -3
- package/chunks/{task-create-TMSV7RD5.js → task-create-3EXVDG3G.js} +12 -12
- package/chunks/{task-list-W55RBFRX.js → task-list-PIBYNSE7.js} +5 -6
- package/chunks/{task-stop-CXEH5L2D.js → task-stop-IV3BYWJC.js} +2 -2
- package/chunks/{task-update-N536I4GQ.js → task-update-H5BPDS5Y.js} +13 -14
- package/chunks/{team-create-QYSWCYCL.js → team-create-53T42W37.js} +56 -55
- package/chunks/{team-delete-FJRFX33M.js → team-delete-X3WPELS6.js} +25 -8
- package/chunks/{team-plan-approval-P7DAD644.js → team-plan-approval-D45ZC5OE.js} +50 -48
- package/chunks/terminal-image-renderer-FCRUWT6C.js +121 -0
- package/chunks/theme-manager-MHNPEDP7.js +107 -0
- package/chunks/{todoWrite-WDJNQEMW.js → todoWrite-A5IOZZ3P.js} +4 -4
- package/chunks/{tool-search-F2EMIAPV.js → tool-search-6RPBGGUX.js} +27 -23
- package/chunks/total-session-admission-MGV56XDK.js +117 -0
- package/chunks/trustedFolders-QJYEFMTU.js +127 -0
- package/chunks/{types-WYCFCEHR.js → types-HKLPXZB3.js} +1 -3
- package/chunks/{update-relaunch-4GF3OXMB.js → update-relaunch-ZDMQX63C.js} +6 -6
- package/chunks/updateCheck-4QZWCGP6.js +123 -0
- package/chunks/useAutoAcceptIndicator-DLIQN256.js +125 -0
- package/chunks/{validateNonInterActiveAuth-BPPA563H.js → validateNonInterActiveAuth-HGTG7AEK.js} +114 -107
- package/chunks/{version-ANP4TS6O.js → version-CPAZMC4B.js} +1 -1
- package/chunks/{web-fetch-QJADSAH3.js → web-fetch-N4K5M3M4.js} +16 -18
- package/chunks/{web-search-7TTQKEKM.js → web-search-4VZKM5SF.js} +9 -11
- package/chunks/{web-shell-static-A6QMUNNV.js → web-shell-static-PW7OEDQO.js} +3 -2
- package/chunks/{workflow-5XN6XSOT.js → workflow-2ALQKTHG.js} +229 -146
- package/chunks/workspace-providers-status-5JM4CB6R.js +119 -0
- package/chunks/{workspace-registration-store-XKVW2YVH.js → workspace-registration-store-RNMFVCH7.js} +2 -1
- package/chunks/workspace-registry-6EULAPZC.js +126 -0
- package/chunks/workspace-runtime-coordinator-IRI2DRCJ.js +127 -0
- package/chunks/workspace-service-SETHN4WE.js +131 -0
- package/chunks/workspace-skills-status-4D4EUEQU.js +118 -0
- package/chunks/{workspace-trust-reconciler-KLGOB53D.js → workspace-trust-reconciler-4LR3CDL4.js} +77 -76
- package/chunks/write-file-45GWPSOI.js +92 -0
- package/chunks/{zh-UNY63FR3.js → zh-2BQ7P6OD.js} +3 -0
- package/chunks/{zh-TW-RPTMRTHG.js → zh-TW-UFXRZTXX.js} +3 -0
- package/chunks/{zoom-image-6ASG6J4C.js → zoom-image-K6IQUKRC.js} +13 -13
- package/cli.js +129 -92
- package/locales/ca.js +6 -0
- package/locales/de.js +6 -0
- package/locales/en.js +6 -0
- package/locales/fr.js +6 -0
- package/locales/ja.js +6 -0
- package/locales/pt.js +6 -0
- package/locales/ru.js +6 -0
- package/locales/zh-TW.js +6 -0
- package/locales/zh.js +6 -0
- package/package.json +3 -3
- package/web-shell/assets/{abnfDiagram-VCTEODGH-uS-vtfs3.js → abnfDiagram-VCTEODGH-C80OZcPP.js} +1 -1
- package/web-shell/assets/{arc-BSTnk5pu.js → arc-AUqStYgf.js} +1 -1
- package/web-shell/assets/{architectureDiagram-5GKGNRK7-DCMyiqzy.js → architectureDiagram-5GKGNRK7-CQYOdYla.js} +1 -1
- package/web-shell/assets/{blockDiagram-NRAW4CY4-C7_gt0r1.js → blockDiagram-NRAW4CY4-lYKlFysy.js} +1 -1
- package/web-shell/assets/{c4Diagram-UCG6FXSJ-BeQg2L8B.js → c4Diagram-UCG6FXSJ-BoS23iIp.js} +1 -1
- package/web-shell/assets/channel-B0ovOJeK.js +1 -0
- package/web-shell/assets/{chunk-2Q5K7J3B-DnV9bKBe.js → chunk-2Q5K7J3B-DLLooL1E.js} +1 -1
- package/web-shell/assets/{chunk-5VM5RSS4-rT1GAcT7.js → chunk-5VM5RSS4-kPfJxScY.js} +1 -1
- package/web-shell/assets/{chunk-F27PBJKO-BcgSxqGA.js → chunk-F27PBJKO-CVGFBqkD.js} +1 -1
- package/web-shell/assets/{chunk-G27WJ6UU-Bw1ZhyZq.js → chunk-G27WJ6UU-CnM_kOVV.js} +1 -1
- package/web-shell/assets/{chunk-JWPE2WC7-D4iDw-96.js → chunk-JWPE2WC7-Cj-ajOkT.js} +1 -1
- package/web-shell/assets/{chunk-LCL6LL3I-D3MB3GTZ.js → chunk-LCL6LL3I-8L5c-wFo.js} +1 -1
- package/web-shell/assets/{chunk-POPQ4Y6H-Cep2ndrS.js → chunk-POPQ4Y6H-DsXTxpvL.js} +1 -1
- package/web-shell/assets/{chunk-SVP7TREG-BuahMHJc.js → chunk-SVP7TREG-DU5GE1_z.js} +1 -1
- package/web-shell/assets/{chunk-XXDRQBXY-BdujIvJY.js → chunk-XXDRQBXY-D2IIWZKt.js} +1 -1
- package/web-shell/assets/classDiagram-DTDB5LWJ-DMll2-6_.js +1 -0
- package/web-shell/assets/classDiagram-v2-JRS7N3AN-DMll2-6_.js +1 -0
- package/web-shell/assets/{cose-bilkent-JH36ORCC-CGLLUbF8.js → cose-bilkent-JH36ORCC-CF_txUJr.js} +1 -1
- package/web-shell/assets/{cynefin-OW5HDTMX-D6kDsRSh.js → cynefin-OW5HDTMX-DEZ-My-Z.js} +1 -1
- package/web-shell/assets/{cynefinDiagram-5FMLGOSQ-CCy78qZx.js → cynefinDiagram-5FMLGOSQ-BV7EKUS6.js} +1 -1
- package/web-shell/assets/{dagre-3AP2YEHR-D5gJuJsf.js → dagre-3AP2YEHR-JGIX0G4H.js} +1 -1
- package/web-shell/assets/{diagram-S7CK7UJ4-ZwEZ5W__.js → diagram-S7CK7UJ4-DdUY7q6A.js} +1 -1
- package/web-shell/assets/{diagram-UQ7AKVKN-B036APjv.js → diagram-UQ7AKVKN-fhzRZ19v.js} +1 -1
- package/web-shell/assets/{diagram-VSXAHHWV-BfDJ57Fq.js → diagram-VSXAHHWV-BOgOex6q.js} +1 -1
- package/web-shell/assets/{diagram-VX7I27RA-Wha0p5rT.js → diagram-VX7I27RA-C0NknIz6.js} +1 -1
- package/web-shell/assets/{diagram-Z3DM3KII-L20bz2K1.js → diagram-Z3DM3KII-C__3mUBX.js} +1 -1
- package/web-shell/assets/{ebnfDiagram-PWID7BFC-D1ZM0Cp7.js → ebnfDiagram-PWID7BFC-BvPhqycH.js} +1 -1
- package/web-shell/assets/{erDiagram-SSCWMZ5O-CMtA19v8.js → erDiagram-SSCWMZ5O-BqzoNoL9.js} +1 -1
- package/web-shell/assets/{flowDiagram-A5DVABFB-D96m326S.js → flowDiagram-A5DVABFB-CJKOre47.js} +1 -1
- package/web-shell/assets/{ganttDiagram-EL5Y4UJY-BuHiYG2o.js → ganttDiagram-EL5Y4UJY-C5xZjrp0.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-WWUBYQGX-Ck3NmkSw.js → gitGraphDiagram-WWUBYQGX-C0EjwuPK.js} +1 -1
- package/web-shell/assets/index-B_IPzA0h.js +2020 -0
- package/web-shell/assets/{index-CBGz4Qjl.js → index-C5M93syE.js} +1 -1
- package/web-shell/assets/index-D1OKGQlM.css +36 -0
- package/web-shell/assets/{infoDiagram-RXCK75RN-B6DAOyXe.js → infoDiagram-RXCK75RN-BUwzsYOs.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-5VMMS53U-Bpg-joFo.js → ishikawaDiagram-5VMMS53U-EDJ_DH3V.js} +1 -1
- package/web-shell/assets/{journeyDiagram-EYS64GPL-BclrHzGa.js → journeyDiagram-EYS64GPL-BnfcOsS0.js} +1 -1
- package/web-shell/assets/{kanban-definition-3QL26DDD-5gJzNTYG.js → kanban-definition-3QL26DDD-D_ofTVGu.js} +1 -1
- package/web-shell/assets/{layout-CEz_1L8z.js → layout-CBuQFdfZ.js} +1 -1
- package/web-shell/assets/{linear-CBjTq9Hc.js → linear-DRIHtmGv.js} +1 -1
- package/web-shell/assets/{mermaid.core-Dzhbxx_I.js → mermaid.core-CmR5wZH6.js} +6 -6
- package/web-shell/assets/{mindmap-definition-FBJOCRG2-DQdVqlBF.js → mindmap-definition-FBJOCRG2-BV374olC.js} +1 -1
- package/web-shell/assets/{pegDiagram-XKGWAZYB-D1JZlYXL.js → pegDiagram-XKGWAZYB-Bpy1SplK.js} +1 -1
- package/web-shell/assets/{pieDiagram-E7YTZNPT-BmkpYL0w.js → pieDiagram-E7YTZNPT-CeZx4hR2.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-AXDQQJYC-DRvD6co5.js → quadrantDiagram-AXDQQJYC-COYKs14h.js} +1 -1
- package/web-shell/assets/{railroadDiagram-O6MQD6OU-CEdjDuoo.js → railroadDiagram-O6MQD6OU-5g2pOeTs.js} +1 -1
- package/web-shell/assets/{requirementDiagram-EFPCY7ZU-BCHG-ie8.js → requirementDiagram-EFPCY7ZU-Yn8uPGtF.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-P5KCCOFB-C9cZMnye.js → sankeyDiagram-P5KCCOFB-CTayAGq6.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-WJ2MYXX4-DYHRV4zL.js → sequenceDiagram-WJ2MYXX4-BFWDKzUU.js} +1 -1
- package/web-shell/assets/{sizeCapture-X5ZJPWSS-DlK21aye.js → sizeCapture-X5ZJPWSS-CtErUbj4.js} +1 -1
- package/web-shell/assets/{stateDiagram-HBIQ2CUA-BrmZssvk.js → stateDiagram-HBIQ2CUA-Co3HFzOd.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-4QOOHH4V-C3gdRjPm.js +1 -0
- package/web-shell/assets/{swimlanes-XN3QIQJK-D9xfcayR.js → swimlanes-XN3QIQJK-CDZuxzOj.js} +1 -1
- package/web-shell/assets/swimlanesDiagram-VK2B7HYN-C34TGCPZ.js +8 -0
- package/web-shell/assets/{timeline-definition-24CTP7MA-D4gdDL_d.js → timeline-definition-24CTP7MA-UcNHj8At.js} +1 -1
- package/web-shell/assets/{vennDiagram-4TSXK5OY-DdhIExjI.js → vennDiagram-4TSXK5OY-JKR9pVFG.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-VM6X3IG4-C9RS_Zof.js → wardleyDiagram-VM6X3IG4-C4SU-yIW.js} +1 -1
- package/web-shell/assets/{xychartDiagram-S5SC5T6Z-orRgmxWk.js → xychartDiagram-S5SC5T6Z-D_yoWGZ4.js} +1 -1
- package/web-shell/index.html +197 -3
- package/chunks/MaxSizedBox-X5FZSNAJ.js +0 -112
- package/chunks/agent-PJIPDWHB.js +0 -97
- package/chunks/agent-headless-B4JVD7UK.js +0 -87
- package/chunks/bridge-FKZTVIS3.js +0 -121
- package/chunks/channel-settings-store-4UFCLBBG.js +0 -117
- package/chunks/chunk-7DJCPZE3.js +0 -945
- package/chunks/chunk-CPBF7KYF.js +0 -51
- package/chunks/chunk-H72BQNM3.js +0 -645
- package/chunks/chunk-J2OSJFP3.js +0 -202
- package/chunks/chunk-K2OJUPOE.js +0 -78
- package/chunks/chunk-P3QQPMQA.js +0 -19
- package/chunks/chunk-RUGNCYNO.js +0 -699
- package/chunks/chunk-T26EAKDL.js +0 -13
- package/chunks/chunk-ZGXYO7DY.js +0 -3416
- package/chunks/chunk-ZYNTSXWK.js +0 -32
- package/chunks/config-utils-BBOCOGZW.js +0 -113
- package/chunks/contextCommand-EET67MQ2.js +0 -108
- package/chunks/daemon-status-provider-RFKZOK3S.js +0 -119
- package/chunks/daemon-trust-policy-DRZPFB4Q.js +0 -114
- package/chunks/deferred-core-runtime-BBVIOP24.js +0 -116
- package/chunks/earlyInputCapture-2JOMMNQ4.js +0 -109
- package/chunks/environment-MOZMPUHR.js +0 -131
- package/chunks/errors-DMPQVYJL.js +0 -115
- package/chunks/exitPlanMode-UE4FGCY4.js +0 -85
- package/chunks/handleAutoUpdate-SGXKTQM6.js +0 -111
- package/chunks/i18n-B42HKHKH.js +0 -126
- package/chunks/initializer-FB66WYR3.js +0 -115
- package/chunks/installationInfo-Y7AULNMX.js +0 -109
- package/chunks/list-2HWGSVRA.js +0 -118
- package/chunks/list-agents-DI3YFTDT.js +0 -80
- package/chunks/loadedSettingsAdapter-7Y7IEI6T.js +0 -112
- package/chunks/mcp-QGG5NMJJ.js +0 -112
- package/chunks/nonInteractiveCli-4LO2TL72.js +0 -186
- package/chunks/pidfile-JMF2CLMY.js +0 -113
- package/chunks/process-registry-PMJOA5CO.js +0 -172
- package/chunks/prompt-terminal-ledger-DCZO6S7C.js +0 -107
- package/chunks/resumeHistoryUtils-CZ4JRDVW.js +0 -120
- package/chunks/ripGrep-R6B6HWPX.js +0 -39
- package/chunks/runtime-TTIGSBM4.js +0 -150
- package/chunks/scheduled-tasks-QB4ZVUQS.js +0 -129
- package/chunks/scheduler-YRUG22M7.js +0 -124
- package/chunks/send-message-Y5I6NYAM.js +0 -295
- package/chunks/serve-MXXCDAQN.js +0 -120
- package/chunks/shell-6RTKZVMI.js +0 -95
- package/chunks/skill-settings-VA4XVYVL.js +0 -120
- package/chunks/spawnChannel-F6WVP723.js +0 -114
- package/chunks/standalone-update-RGILUQVK.js +0 -120
- package/chunks/terminal-image-renderer-SMQE46UJ.js +0 -116
- package/chunks/theme-manager-RFO5WWFF.js +0 -104
- package/chunks/total-session-admission-HTVTP4BS.js +0 -116
- package/chunks/trustedFolders-7OCNMUQE.js +0 -124
- package/chunks/updateCheck-7QBDXZRT.js +0 -120
- package/chunks/useAutoAcceptIndicator-UI4SNL2O.js +0 -122
- package/chunks/workspace-providers-status-PDFZWL5Q.js +0 -116
- package/chunks/workspace-registry-23R7XRB5.js +0 -125
- package/chunks/workspace-service-MUYO2QIC.js +0 -131
- package/chunks/workspace-skills-status-IKECTOOQ.js +0 -115
- package/chunks/write-file-GGRBB5TZ.js +0 -90
- package/web-shell/assets/channel-CENAhErJ.js +0 -1
- package/web-shell/assets/classDiagram-DTDB5LWJ-CM6FArGH.js +0 -1
- package/web-shell/assets/classDiagram-v2-JRS7N3AN-CM6FArGH.js +0 -1
- package/web-shell/assets/index-8hXIpvo4.js +0 -1865
- package/web-shell/assets/index-DclEv91i.css +0 -5
- package/web-shell/assets/stateDiagram-v2-4QOOHH4V-B2Q7XDaE.js +0 -1
- package/web-shell/assets/swimlanesDiagram-VK2B7HYN-DpZPOSbX.js +0 -8
|
@@ -287,15 +287,21 @@ tightened over time.
|
|
|
287
287
|
- **Not a substitute for `deny` rules.** The classifier is best-effort.
|
|
288
288
|
For commands you're sure should never run, put them in
|
|
289
289
|
`permissions.deny`.
|
|
290
|
-
- **MCP tools
|
|
291
|
-
(`mcp__*`)
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
290
|
+
- **MCP tools are judged on their arguments, not verified behaviour.**
|
|
291
|
+
Third-party MCP tools (`mcp__*`) are never on the fast-path allowlist;
|
|
292
|
+
every call from a server that is not marked `trust: true` goes to the
|
|
293
|
+
classifier with the server name, the tool name, the server's
|
|
294
|
+
self-reported annotations (`readOnlyHint` / `destructiveHint` /
|
|
295
|
+
`idempotentHint` / `openWorldHint`) and a bounded copy of the
|
|
296
|
+
arguments. The classifier is told the annotations are unverified. It
|
|
297
|
+
cannot see what the server actually does with the call, so a
|
|
298
|
+
misleading tool name plus benign arguments can still pass. If you
|
|
299
|
+
trust a specific MCP tool, add
|
|
300
|
+
`permissions.allow: ["mcp__server__tool"]` so it bypasses the
|
|
301
|
+
classifier entirely; if you want the classifier to see only the tool
|
|
302
|
+
name (for example when it runs against a different provider than the
|
|
303
|
+
main model), set `permissions.autoMode.mcp.forwardArguments: false`
|
|
304
|
+
— most MCP calls are then conservatively blocked.
|
|
299
305
|
|
|
300
306
|
## FAQ
|
|
301
307
|
|
|
@@ -312,7 +318,7 @@ projection exposes:
|
|
|
312
318
|
|
|
313
319
|
- `read_file` and other read-only tools: not invoked (they're on the
|
|
314
320
|
fast-path allowlist).
|
|
315
|
-
- `edit` / `write_file`: file_path plus
|
|
321
|
+
- `edit` / `write_file`: file_path plus a 300-character preview of
|
|
316
322
|
old/new content. Full content is not forwarded.
|
|
317
323
|
- `run_shell_command`: the full command (it has to — that's what the
|
|
318
324
|
classifier judges).
|
|
@@ -326,13 +332,24 @@ projection exposes:
|
|
|
326
332
|
Tool results (the actual content returned by tools) are stripped from
|
|
327
333
|
the classifier transcript entirely.
|
|
328
334
|
|
|
329
|
-
MCP tools (`mcp__*`)
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
335
|
+
MCP tools (`mcp__*`): the server name, the tool name, the server's
|
|
336
|
+
annotations and the call arguments are forwarded. Each string (value
|
|
337
|
+
or key) is cut at 2,000 characters, names at 200, the whole payload
|
|
338
|
+
shares a 16,000 character budget measured on the pretty-printed form
|
|
339
|
+
the classifier receives, and nesting / entry counts are capped; every
|
|
340
|
+
cut is marked in place (`…[truncated N chars]` or `[omitted: …]`) and
|
|
341
|
+
flagged with `arguments_truncated: true` / `name_truncated: true` so
|
|
342
|
+
the classifier never mistakes an omission for an absence. Historical
|
|
343
|
+
actions in the transcript are capped at 4,000 characters each and
|
|
344
|
+
40,000 in total (newest kept first; older ones keep only their tool
|
|
345
|
+
name). The arguments are what the agent is about to
|
|
346
|
+
send to that server — the classifier's data-exfiltration and
|
|
347
|
+
external-write rules can only be applied to them, and they were
|
|
348
|
+
already produced by the main model, so forwarding them to a classifier
|
|
349
|
+
on the same model configuration discloses nothing new. If your
|
|
350
|
+
classifier runs against a different provider, set
|
|
351
|
+
`permissions.autoMode.mcp.forwardArguments: false` to restore the
|
|
352
|
+
name-only projection (expect most MCP calls to be blocked).
|
|
336
353
|
|
|
337
354
|
**Can I disable the first-time information message?**
|
|
338
355
|
|
|
@@ -77,6 +77,8 @@ qwen channel pairing approve dws-work CODE
|
|
|
77
77
|
|
|
78
78
|
Group mentions use the real-time personal event stream first. The channel also checks recent `@` message history every five seconds, so mentions from external groups are recovered when DingTalk omits them from the personal event stream. Messages are deduplicated by conversation and message ID across both paths.
|
|
79
79
|
|
|
80
|
+
Ordinary direct messages are recovered the same way: a five-second history check re-drives any direct message the real-time stream omitted, deduplicated by conversation and message ID across both paths.
|
|
81
|
+
|
|
80
82
|
When a message quotes another DingTalk message, the quoted text is included as reply context for the agent on both the real-time and history fallback paths.
|
|
81
83
|
|
|
82
84
|
## Document Mentions
|
|
@@ -62,6 +62,7 @@ Channels are configured under the `channels` key in `settings.json`. Each channe
|
|
|
62
62
|
| `senderPolicy` | No | Who can talk to the bot: `allowlist` (default), `open`, or `pairing` |
|
|
63
63
|
| `allowedUsers` | No | List of user IDs allowed to use the bot (used by `allowlist` and `pairing` policies) |
|
|
64
64
|
| `sessionScope` | No | How sessions are scoped: `user` (default), `chat_thread`, or `single`. Legacy `thread` remains compatible when already configured but is not offered for new Web Shell configurations |
|
|
65
|
+
| `multiSession` | No | Retain up to eight owner-scoped named tasks in one chat. Requires daemon-managed mode, `sessionScope: "user"`, no webhooks or group-history backfill, and no enabled Channel loops |
|
|
65
66
|
| `cwd` | No | Working directory for the agent. Defaults to the current directory |
|
|
66
67
|
| `approvalMode` | No | Tool approval mode for channel sessions. Unattended webhook tasks require `yolo`; the setting applies to every session on the channel |
|
|
67
68
|
| `instructions` | No | Custom instructions prepended to the first message of each session |
|
|
@@ -88,9 +89,34 @@ Controls who can interact with the bot:
|
|
|
88
89
|
Controls how conversation sessions are managed:
|
|
89
90
|
|
|
90
91
|
- **`user`** (default) — One session per user. All messages from the same user share a conversation.
|
|
91
|
-
- **`
|
|
92
|
+
- **`chat_thread`** — One session per chat thread/topic, shared by participants in that thread.
|
|
93
|
+
- **`thread`** — Legacy thread/topic routing retained for existing configurations.
|
|
92
94
|
- **`single`** — One shared session for all users. Everyone shares the same conversation.
|
|
93
95
|
|
|
96
|
+
### Named Tasks
|
|
97
|
+
|
|
98
|
+
Daemon-managed Channels can retain several named conversations for the same user in one chat:
|
|
99
|
+
|
|
100
|
+
```json
|
|
101
|
+
{
|
|
102
|
+
"channels": {
|
|
103
|
+
"my-channel": {
|
|
104
|
+
"type": "telegram",
|
|
105
|
+
"sessionScope": "user",
|
|
106
|
+
"multiSession": true
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
The catalog is private to the exact channel, chat, and sender. Task names use 1–32 ASCII letters, numbers, underscores, or hyphens, and are unique case-insensitively. Up to eight tasks may be open; closing a task detaches it without deleting its transcript, so selecting it later reopens the exact conversation. Session IDs are never accepted by or shown in chat commands.
|
|
113
|
+
|
|
114
|
+
Named results identify their originating task: direct chats use `[task]`, while group chats use `[sender · task]`. Named text permission prompts also show the exact request ID and the corresponding `/approve <id>`, `/approve-always <id>`, and `/deny <id>` commands. The label is presentation-only and is not stored in the model transcript.
|
|
115
|
+
|
|
116
|
+
One task remains selected to receive the next normal message, but other named tasks may keep running concurrently in the shared working directory. Creating or selecting another task does not cancel or retarget earlier work, and late results retain their originating task label. A busy task cannot be closed, but its active prompt can be cancelled with `/session cancel [<name>]` through the existing Channel cancellation behavior. Independently queued turns are not cancelled, but in `collect` dispatch mode any follow-ups buffered behind the cancelled prompt are discarded by that existing behavior. Media preparation is not targeted. Bare permission commands apply only to the selected task, while an explicit request ID can answer an owned inactive task. Per-task worktrees are planned for Part 4. Channel memory remains scoped to the chat rather than to a named task.
|
|
117
|
+
|
|
118
|
+
This mode is unavailable in standalone `qwen channel start`, with webhooks, with non-zero channel or group `groupHistoryLimit`, or with Channel loops. If an enabled loop already exists for that channel, the daemon worker refuses to start until the loop is disabled.
|
|
119
|
+
|
|
94
120
|
### Channel Memory
|
|
95
121
|
|
|
96
122
|
Channel memory stores durable context for one chat or thread. Entries have stable
|
|
@@ -463,14 +489,21 @@ Channels support slash commands. These are handled locally (no agent round-trip)
|
|
|
463
489
|
- `/help` — List available commands
|
|
464
490
|
- `/clear` — Clear your session and start fresh (aliases: `/reset`, `/new`)
|
|
465
491
|
- `/status` — Show session info and access policy
|
|
492
|
+
- `/sessions [all]` — List open named tasks, or include closed tasks; available only with `multiSession: true`
|
|
493
|
+
- `/session current` — Show the selected named task
|
|
494
|
+
- `/session new <name>` — Create and select a shared-workspace task
|
|
495
|
+
- `/session new <name> --worktree` — Recognized but deferred to Part 4
|
|
496
|
+
- `/session use <name>` — Select an open task or reopen a closed task
|
|
497
|
+
- `/session cancel [<name>]` — Cancel the selected task's active prompt, or name another owned task; independently queued turns are not cancelled, but `collect`-mode follow-ups buffered behind the cancelled prompt are discarded by the existing cancellation behavior; media preparation is not targeted
|
|
498
|
+
- `/session close <name>` — Close a task without deleting its transcript
|
|
466
499
|
- `/loop add "<cron>" <prompt>` — Create a persistent scheduled channel loop
|
|
467
500
|
- `/loop list` — List loops for the current chat
|
|
468
501
|
- `/loop inspect <id>` — Show loop status and run details
|
|
469
502
|
- `/loop cancel <id>` — Disable a loop
|
|
470
503
|
|
|
471
|
-
All other slash commands (e.g., `/compress`, `/summary`) are forwarded to the agent.
|
|
504
|
+
All other slash commands (e.g., `/compress`, `/summary`) are forwarded to the agent. Named-task commands are registered only when the mode is enabled, so `/sessions` remains agent-visible for existing configurations.
|
|
472
505
|
|
|
473
|
-
|
|
506
|
+
Named-task commands work on all channel types (Telegram, WeChat, QQ, DingTalk, WeCom, Feishu, GitHub). `/cancel` is currently registered only by Telegram, and loop creation requires proactive delivery support for the current adapter and target.
|
|
474
507
|
|
|
475
508
|
## Running
|
|
476
509
|
|
|
@@ -41,7 +41,7 @@ If there are no uncommitted changes, `/review` will let you know and stop — no
|
|
|
41
41
|
| `medium` | The high pipeline minus its most expensive passes: the parallel finder fan-out over a reduced dimension set, plus build/test and a single verification pass | Uncapped (verified) | Approve capped at Comment | Never |
|
|
42
42
|
| `high` | Full pipeline: up to 16 parallel agents → sharded verification → iterative reverse audit | Uncapped (verified) | Approve / Request changes / Comment | With `--comment` |
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
`/review` resolves effort in this order: an explicit `--effort`, the last level explicitly typed for this project, the operator `review.effort` setting, then the built-in target default (**high** for PR reviews, **medium** for local and file reviews). When a remembered level applies, `/review` announces it before work begins; type a new `--effort` to replace it. An effective `--comment` forces high (posted comments must survive verification) — on a non-PR target `--comment` is ignored with a warning and does **not** change the effort. Medium keeps the security and test-coverage agents and build/test, and drops the adversarial personas, the language-pitfall and wrapper/proxy specialists (Agents 1d/1e), the diff-specialist finders and the reverse audit — so a subtle Critical only the second look would surface can slip; use `--effort high` for security-sensitive or pre-release reviews. Only `low` is unverified. Worktree isolation applies to same-repo PR reviews; cross-repo PRs run in lightweight mode (diff-only, no worktree or build/test). The low pass is labeled unverified, emits no verdict, and never writes the incremental review cache, so a later `--effort high` run is never skipped as "already reviewed"; medium is verified but its Approve is capped at Comment, because nothing looked twice for what the first pass missed. The diff-obtaining mechanics are identical at every level — PR reviews always use the isolated worktree and the same base resolution, so the review is never against the wrong base. One scope difference remains: the incremental cache is high-only, so a high re-review may cover just the new commits (`lastCommitSha..HEAD`) while low/medium always review the full PR diff.
|
|
45
45
|
|
|
46
46
|
## How It Works
|
|
47
47
|
|
|
@@ -240,7 +240,7 @@ A long review that dies part-way — a dropped connection, a timeout, a killed t
|
|
|
240
240
|
|
|
241
241
|
It applies to **PR targets only** (a local review's diff comes from a live working tree, which has no stable interrupted state to continue), and it is safe to pass whenever you are unsure: the review rules on the on-disk state itself — the worktree still at the fetched commit and clean, the captured diff unchanged byte for byte, the PR head unmoved, the resume limit unspent — and silently starts fresh whenever anything no longer matches, telling you which check refused. A continuation reuses the earlier attempt's certified agent results, so the report says how many were recovered; it is disclosed, never a coverage gap.
|
|
242
242
|
|
|
243
|
-
Two things to know.
|
|
243
|
+
Two things to know. With only the built-in target default, a continuation keeps the interrupted run's recorded **effort**. An explicit `--effort`, a project-remembered level, the operator `review.effort` setting, or an effective `--comment` supplies a required level; if it differs from the interrupted run, resume is refused and a fresh run starts at that level, because different effort is different work. And if the PR head moved while the review was down, the resume refuses (`head-moved`) and the fresh run reviews the new commits — which is what you want, and it counts as this review's one restart.
|
|
244
244
|
|
|
245
245
|
## Findings as Data
|
|
246
246
|
|
|
@@ -261,9 +261,9 @@ export QWEN_REVIEW_ASSETS_REPO=your-org/your-repo # a repo you can push to
|
|
|
261
261
|
/review 123 --comment
|
|
262
262
|
```
|
|
263
263
|
|
|
264
|
-
|
|
264
|
+
Point it at a repository you can push to — a dedicated image-host repository is the recommended destination; a fork or scratch repo works too. Avoid the repository under review itself: image branches pushed there become reachable objects that every clone fetches. Images land on the `pr-assets/<pr>-review` branch with content-hashed names, and comments reference them by **commit-pinned** URL — immutable even if the branch later moves, and working unchanged on GitHub Enterprise.
|
|
265
265
|
|
|
266
|
-
For GitHub-triggered reviews (the PR-review workflow), the same variable is wired from a **repository variable** of the same name: with the variable unset the workflow passes an empty value and publishing refuses — nothing changes. A maintainer who sets `QWEN_REVIEW_ASSETS_REPO` in the repository's Actions variables
|
|
266
|
+
For GitHub-triggered reviews (the PR-review workflow), the same variable is wired from a **repository variable** of the same name, and the workflow passes through only a dedicated external host: with the variable unset, or set to the repository under review (compared after trimming and case-normalization, so padded or case-shifted spellings of the same repository count as self-targeting), the workflow passes an empty value and publishing refuses — nothing changes, and the review keeps its evidence as prose and local artifact paths. A maintainer who sets `QWEN_REVIEW_ASSETS_REPO` in the repository's Actions variables to a separate image-host repository enables review comments to embed capture PNGs. An external destination manages its own retention; the visuals cleanup workflow only drains the historical `pr-assets/*` branches that former Git-backed publishers left in this repository.
|
|
267
267
|
|
|
268
268
|
The publishing is gated exactly like posting: no designated repo means no publish, and an unauthorized run (no effective `--comment`) is refused the same way `submit` refuses. Only image types are accepted (SVG is excluded deliberately), with size caps, and each file's bytes must match the format its extension claims — mislabeled or unrecognized content is refused. A manifest records every file pushed. Without a designation, findings keep their evidence as local file paths in the terminal and saved report — nothing breaks, comments just stay text-only.
|
|
269
269
|
|
|
@@ -410,7 +410,7 @@ The exit code is the contract a gate should read:
|
|
|
410
410
|
|
|
411
411
|
`3` (not `2`) lets a gate distinguish "the review is blocking" from "the tool broke" — yargs already uses `1` for usage errors — without parsing any output. `--timeout-minutes` (default 120, floored at 1) terminates a hung review and exits `1`, and cancelling the command (Ctrl+C / SIGTERM) terminates the review's process group rather than orphaning it.
|
|
412
412
|
|
|
413
|
-
`--resume` continues an interrupted review of the same PR instead of starting over — when a long local run dies part-way (a dropped connection, a timeout, a killed terminal), the retry would otherwise re-fetch, re-chunk and re-launch agents whose work is already on disk. It is safe to pass unconditionally on a retry: `fetch-pr` rules on the on-disk state itself (worktree still at the fetched SHA and clean, diff bytes unchanged, PR head unmoved, resume cap unspent) and silently falls back to a fresh review whenever anything no longer matches, so the flag never fails a run that could start over.
|
|
413
|
+
`--resume` continues an interrupted review of the same PR instead of starting over — when a long local run dies part-way (a dropped connection, a timeout, a killed terminal), the retry would otherwise re-fetch, re-chunk and re-launch agents whose work is already on disk. It is safe to pass unconditionally on a retry: `fetch-pr` rules on the on-disk state itself (worktree still at the fetched SHA and clean, diff bytes unchanged, PR head unmoved, resume cap unspent) and silently falls back to a fresh review whenever anything no longer matches, so the flag never fails a run that could start over. When the current invocation has only the built-in target default, a continuation stays pinned to the interrupted run's recorded effort. An explicit `--effort`, a project-remembered level, the operator `review.effort` setting, or an effective `--comment` supplies a required level; a mismatch refuses the resume and runs fresh at that level. PR targets only (a local review's diff is captured from a live working tree, which has no stable interrupted state to continue). Resume is a **local convenience**: the repository's own CI review workflow does **not** resume — each retry re-runs fresh, because a CI attempt runs no-sandbox and its worktree is deleted on exit, leaving no interrupted state to continue.
|
|
414
414
|
|
|
415
415
|
A time-budgeted run can also export a **soft** deadline so the review stops its open-ended reverse-audit loop while there is still time to verify, compose and post: `QWEN_REVIEW_DEADLINE_EPOCH` is the Unix-seconds moment the run will be killed, and `QWEN_REVIEW_DEADLINE_RESERVE_SECONDS` (default 3600; `0` keeps only the round estimate) is the tail that must remain for the last round's verification, `compose-review` and submission. When the remaining budget no longer fits another round plus that tail, the round builder refuses to build it, and the composed verdict discloses the truncated audit (an otherwise-Approve verdict is capped at Comment). A missing or malformed deadline leaves the review ungated — the outer timeout still bounds the run.
|
|
416
416
|
|
|
@@ -96,6 +96,7 @@ Commands for managing AI tools and models.
|
|
|
96
96
|
| → `auto-edit` | Auto-approve edits (trusted environment) | `/approval-mode auto-edit` |
|
|
97
97
|
| → `auto` | Classifier-evaluated approval (autonomous) | `/approval-mode auto` |
|
|
98
98
|
| → `yolo` | Auto-approve everything (quick prototyping) | `/approval-mode yolo` |
|
|
99
|
+
| `/peers` | Review messages held from other Qwen Code sessions on this machine | `/peers`, `/peers accept <id>`, `/peers deny all` |
|
|
99
100
|
| `/model` | Switch model used in current session | `/model`, `/model <model-id>` (switch immediately) |
|
|
100
101
|
| `/model --fast` | Set a lighter model for prompt suggestions | `/model --fast qwen3-coder-flash` |
|
|
101
102
|
| `/model --voice` | Set the model used for voice transcription | `/model --voice <model-id>` |
|
|
@@ -795,3 +796,43 @@ qwen sessions ps
|
|
|
795
796
|
# raw-data note above); pipe through a sanitizer if the path is untrusted.
|
|
796
797
|
qwen sessions ps --json | jq -r .cwd
|
|
797
798
|
```
|
|
799
|
+
|
|
800
|
+
## 6. Messaging Another Running Session
|
|
801
|
+
|
|
802
|
+
Two interactive sessions on the same machine can send each other
|
|
803
|
+
messages. The feature is experimental and **off by default**; turn it on
|
|
804
|
+
in `settings.json` and restart:
|
|
805
|
+
|
|
806
|
+
```json
|
|
807
|
+
{ "agents": { "crossSessionMessaging": true } }
|
|
808
|
+
```
|
|
809
|
+
|
|
810
|
+
Once on, the model in one session can discover the others with
|
|
811
|
+
`list_agents` — each appears under `sessions` with the `name` that
|
|
812
|
+
`qwen sessions ps --json` records (the table view may truncate long
|
|
813
|
+
names) — and address one with `send_message` using
|
|
814
|
+
that name as `to`. When two sessions share a name, `list_agents` shows
|
|
815
|
+
each with a short `[ref]` and the send must include it (`name [ref]`); a
|
|
816
|
+
bare name that could mean either is refused rather than guessed.
|
|
817
|
+
`list_agents` also reports the session's own name under `self`, and
|
|
818
|
+
`to: "*"` still means "my Agent Team teammates" and never reaches other
|
|
819
|
+
sessions.
|
|
820
|
+
|
|
821
|
+
A message arrives in the other session marked as coming from another
|
|
822
|
+
session, not from its user, and carries none of your authority there:
|
|
823
|
+
the receiving session acts on it only within its own permission settings.
|
|
824
|
+
Its user can choose what happens to incoming messages with
|
|
825
|
+
`agents.crossSessionInbound` (`accept`, `hold`, or `refuse`). When unset,
|
|
826
|
+
a message is delivered if the receiving session still reviews each
|
|
827
|
+
action (default or plan mode), or if both sessions are in a mode that
|
|
828
|
+
applies actions without per-action review; otherwise it is held for
|
|
829
|
+
review. Held messages are listed and released with `/peers` in the
|
|
830
|
+
receiving session.
|
|
831
|
+
|
|
832
|
+
The `send_message` call only confirms the message was handed to the other
|
|
833
|
+
session. What became of it arrives later as a receipt: if it was held,
|
|
834
|
+
declined, expired, or misaddressed (the address changed hands — list the
|
|
835
|
+
agents again) — or released after a hold — a notice appears in the
|
|
836
|
+
sending session's transcript (`Message to <name>: …`). The model that
|
|
837
|
+
sent it is not told; if the other session replies, the reply arrives as a
|
|
838
|
+
cross-session message.
|
|
@@ -25,8 +25,8 @@ Node.js 22 or later and npm are required.
|
|
|
25
25
|
When first used, the skill runs these commands itself:
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
|
-
qwen mcp add --scope user node-repl npx -y @qwen-code/node-repl-mcp@0.1.
|
|
29
|
-
npm install --no-save --package-lock=false @qwen-code/cua-sdk@0.20.
|
|
28
|
+
qwen mcp add --scope user node-repl npx -y @qwen-code/node-repl-mcp@0.1.1
|
|
29
|
+
npm install --no-save --package-lock=false @qwen-code/cua-sdk@0.20.2
|
|
30
30
|
```
|
|
31
31
|
|
|
32
32
|
Restart Qwen Code after the MCP server is first added. The skill then resumes
|
|
@@ -766,7 +766,7 @@ When sent to the model, injected `additionalContext` is appended as its own mess
|
|
|
766
766
|
}
|
|
767
767
|
```
|
|
768
768
|
|
|
769
|
-
The hook uses the deleting runtime's normal session fields (`session_id`, `transcript_path`, and `cwd`); over ACP, `transcript_path` is empty because the deleting runtime has no transcript of its own. `SessionDelete` currently fires for the interactive `/delete` flow and ACP's explicit `deleteSession` method; daemon REST batch deletion and internal cleanup do not emit it.
|
|
769
|
+
The hook uses the deleting runtime's normal session fields (`session_id`, `transcript_path`, and `cwd`); over ACP, `transcript_path` is empty because the deleting runtime has no transcript of its own. `SessionDelete` currently fires for the interactive `/delete` flow and ACP's explicit `deleteSession` method; daemon REST batch deletion and internal cleanup do not emit it. A command hook is left to finish if Qwen exits after dispatch; its stdout and stderr are ignored and remain independent of Qwen's pipes.
|
|
770
770
|
|
|
771
771
|
#### MessageDisplay
|
|
772
772
|
|
|
@@ -886,6 +886,8 @@ The `context_usage`, `context_limit`, and `input_tokens` fields allow hook scrip
|
|
|
886
886
|
- Billing error notifications
|
|
887
887
|
- Error statistics collection
|
|
888
888
|
|
|
889
|
+
A command hook is left to finish if Qwen exits after dispatch; its stdout and stderr are ignored and remain independent of Qwen's pipes.
|
|
890
|
+
|
|
889
891
|
#### SubagentStart
|
|
890
892
|
|
|
891
893
|
**Purpose**: Executed when a subagent (like the Task tool) is started to set up context or permissions.
|
|
@@ -1347,10 +1349,12 @@ Hooks are configured in Qwen Code settings, typically in `.qwen/settings.json` o
|
|
|
1347
1349
|
|
|
1348
1350
|
Only `command` type supports asynchronous execution. Setting `"async": true` runs the hook in the background without blocking the main flow.
|
|
1349
1351
|
|
|
1352
|
+
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.
|
|
1353
|
+
|
|
1350
1354
|
**Features:**
|
|
1351
1355
|
|
|
1352
1356
|
- Cannot return decision control (operation has already occurred)
|
|
1353
|
-
- Results are injected in the next conversation turn via `systemMessage` or `additionalContext
|
|
1357
|
+
- Results are injected in the next conversation turn via `systemMessage` or `additionalContext`, except for output-ignored fire-and-forget event types documented above
|
|
1354
1358
|
- Suitable for auditing, logging, background testing, etc.
|
|
1355
1359
|
|
|
1356
1360
|
**Example:**
|
|
@@ -19,6 +19,7 @@ Add things you'd otherwise have to repeat every session:
|
|
|
19
19
|
- Coding conventions your team follows ("all new files must have JSDoc comments")
|
|
20
20
|
- Architectural decisions ("we use the repository pattern, never call the database directly from controllers")
|
|
21
21
|
- Personal preferences ("always use pnpm, not npm")
|
|
22
|
+
- A verification policy for high-stakes work — for example "verify against the database before concluding" (see [Enforce evidence-based conclusions](../common-workflow.md#enforce-evidence-based-conclusions) for a ready-made template)
|
|
22
23
|
|
|
23
24
|
Don't include things Qwen can figure out by reading your code. QWEN.md works best when it's short and specific — the longer it gets, the less reliably Qwen follows it.
|
|
24
25
|
|
|
@@ -124,7 +124,7 @@ Three points that tend to trip up a first read of this feature:
|
|
|
124
124
|
|
|
125
125
|
1. **One generation per batch, shared by both display modes.** The fast-model call happens exactly once in `handleCompletedTools` when a tool batch finalizes. Toggling `Ctrl+O` expanded detail mode afterwards does **not** trigger a new call — both the collapsed and the expanded rendering read from the same `tool_use_summary` history entry that was captured the first time.
|
|
126
126
|
2. **No backfill on toggle or on session resume.** A `tool_group` that completed before the feature was enabled (or before you flipped the setting on, or in a resumed session — `ChatRecordingService` does not persist summary entries) will never get a label. There is no "sweep existing history" pass. If you turn this setting on mid-session, only _future_ batches will show a label; older groups keep the default rendering with no indicator that a label is missing.
|
|
127
|
-
3. **Main-agent batches only.** The trigger lives in the main session's turn loop (`
|
|
127
|
+
3. **Main-agent batches only.** The trigger lives in the main session's turn loop (`useLlmStream`), so:
|
|
128
128
|
- ✅ Shell, MCP, file operations, and the `Task` / subagent tool _call itself_ (as it appears in the main batch) are summarized.
|
|
129
129
|
- ❌ A subagent's **internal** tool batches (run through `packages/core/src/agents/runtime/`) are not summarized.
|
|
130
130
|
|
|
@@ -40,9 +40,10 @@ are logged rather than restoring the removed runtime.
|
|
|
40
40
|
|
|
41
41
|
Runtime isolation covers cwd, environment overlay, filesystem/trust boundary,
|
|
42
42
|
workspace services, bridge, Voice lease state, channel worker, and the ACP/MCP
|
|
43
|
-
resource boundary. Production attempts to preheat the primary ACP child
|
|
44
|
-
|
|
45
|
-
and untrusted secondaries do not start ACP.
|
|
43
|
+
resource boundary. Production attempts to preheat the trusted primary ACP child
|
|
44
|
+
for compatibility; trusted secondaries start on their first runtime-backed
|
|
45
|
+
command or Session, and untrusted secondaries do not start ACP. Legacy primary
|
|
46
|
+
routes retain their existing compatibility behavior.
|
|
46
47
|
Authentication, HTTP rate limits, listener and Voice admission caps,
|
|
47
48
|
total-session admission, metrics, shutdown, and the process fault radius remain
|
|
48
49
|
daemon-global. Run separate daemons when those process-level boundaries must be
|
|
@@ -50,7 +51,7 @@ independent.
|
|
|
50
51
|
|
|
51
52
|
## Linux: systemd user unit
|
|
52
53
|
|
|
53
|
-
> **Find your `qwen` binary first.** The unit file's `ExecStart=` must hold an **absolute path
|
|
54
|
+
> **Find your `qwen` binary and trusted tool directories first.** The unit file's `ExecStart=` must hold an **absolute path**, and its explicit `PATH` must include trusted directories for tools that daemon sessions need, such as `gh`, `git`, `npm`, and the `node` interpreter used by a script-based `qwen` launcher. Service managers don't read your shell profile. Run `which qwen gh git npm node` in your normal shell, then substitute the actual executable and directories everywhere the template below shows `/PATH/TO/qwen` and `/PATH/TO/USER/BIN`.
|
|
54
55
|
|
|
55
56
|
`~/.config/systemd/user/qwen-serve.service`:
|
|
56
57
|
|
|
@@ -65,6 +66,9 @@ Type=simple
|
|
|
65
66
|
WorkingDirectory=%h/project-a
|
|
66
67
|
# Run `which qwen` to find the absolute path. systemd does NOT read $PATH.
|
|
67
68
|
ExecStart=/PATH/TO/qwen serve --hostname 127.0.0.1 --port 4170 --workspace %h/project-a --workspace %h/project-b
|
|
69
|
+
# Replace the first entry with trusted directories that contain qwen's
|
|
70
|
+
# interpreter and user-installed tools. systemd does not read shell profiles.
|
|
71
|
+
Environment=PATH=/PATH/TO/USER/BIN:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
|
|
68
72
|
# Read the bearer token from a chmod 600 file rather than inlining it
|
|
69
73
|
# in the unit. `Environment=` would expose the token in the unit file
|
|
70
74
|
# (typically 644 = world-readable). EnvironmentFile keeps the token in
|
|
@@ -99,11 +103,11 @@ systemctl --user disable --now qwen-serve.service
|
|
|
99
103
|
|
|
100
104
|
Without `loginctl enable-linger`, the user-level systemd instance shuts down when the user logs out and only restarts on next login — on a headless dev box the daemon would not survive an SSH session ending. `enable-linger` is what makes "across reboots" actually work.
|
|
101
105
|
|
|
102
|
-
**System-wide alternative** (shared dev hosts, less common): drop the unit at `/etc/systemd/system/qwen-serve@.service` with `User=%i`, manage via `sudo systemctl enable --now qwen-serve@<username>.service`. Same `[Service]` body otherwise
|
|
106
|
+
**System-wide alternative** (shared dev hosts, less common): drop the unit at `/etc/systemd/system/qwen-serve@.service` with `User=%i`, manage via `sudo systemctl enable --now qwen-serve@<username>.service`. Same `[Service]` body otherwise. The non-sensitive `PATH` can remain in `Environment=`, but never put the bearer token there: use `EnvironmentFile=` pointing at the user's `chmod 600` file. Pick user-level + linger for single-user workstations.
|
|
103
107
|
|
|
104
108
|
## macOS: launchd user agent
|
|
105
109
|
|
|
106
|
-
> **Find your `qwen` binary first.** Same constraint as systemd
|
|
110
|
+
> **Find your `qwen` binary and trusted tool directories first.** Same constraint as systemd: `ProgramArguments` must hold an **absolute path**, while `EnvironmentVariables.PATH` must include trusted directories containing tools daemon sessions need. Run `which qwen gh git npm node` in your normal shell. Common locations on macOS include `/opt/homebrew/bin` (Homebrew on Apple Silicon), `/usr/local/bin` (Homebrew on Intel and manual installs), `~/.nvm/versions/node/vX.Y.Z/bin` (nvm), and `~/.volta/bin` (Volta). Substitute the actual absolute paths below; launchd does not expand `~` or shell variables.
|
|
107
111
|
|
|
108
112
|
`~/Library/LaunchAgents/com.qwenlm.qwen-serve.plist`:
|
|
109
113
|
|
|
@@ -133,6 +137,10 @@ Without `loginctl enable-linger`, the user-level systemd instance shuts down whe
|
|
|
133
137
|
<string>/Users/YOUR-USERNAME/project-a</string>
|
|
134
138
|
<key>EnvironmentVariables</key>
|
|
135
139
|
<dict>
|
|
140
|
+
<!-- launchd does not read shell profiles. Replace the first entry with
|
|
141
|
+
trusted directories containing qwen's interpreter and user tools. -->
|
|
142
|
+
<key>PATH</key>
|
|
143
|
+
<string>/PATH/TO/USER/BIN:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
|
|
136
144
|
<!-- DO NOT COMMIT this file with a real token. Also chmod 600 the
|
|
137
145
|
plist itself so the inlined token is not world-readable. -->
|
|
138
146
|
<key>QWEN_SERVER_TOKEN</key>
|
|
@@ -180,6 +188,8 @@ tail -f ~/Library/Logs/qwen-serve/out.log ~/Library/Logs/qwen-serve/err.log
|
|
|
180
188
|
|
|
181
189
|
After editing the plist (e.g., rotating the token) you must `unload` then `load` again — `launchctl` does not auto-reload on plist changes the way `systemd daemon-reload` does. Note: each `load` truncates the log files, so save them off if you're investigating an incident before rotating.
|
|
182
190
|
|
|
191
|
+
After starting or restarting either service, open a new daemon session and verify that the tools it needs resolve without changing `PATH` inside the command, for example `command -v gh`. If a tool is missing, add its trusted, absolute containing directory to the service-level `PATH` and reload the service; do not rely on `~/.zshrc`, `~/.bashrc`, or another interactive-shell profile.
|
|
192
|
+
|
|
183
193
|
## tmux session (interactive supervision)
|
|
184
194
|
|
|
185
195
|
Assumes `QWEN_SERVER_TOKEN` is already exported in your shell (see the setup section above):
|
|
@@ -216,7 +226,7 @@ curl -H "Authorization: Bearer $QWEN_SERVER_TOKEN" \
|
|
|
216
226
|
http://127.0.0.1:4170/capabilities | jq .protocolVersions # daemon's feature set
|
|
217
227
|
```
|
|
218
228
|
|
|
219
|
-
When auth is configured (
|
|
229
|
+
When auth is configured (`--token` or `QWEN_SERVER_TOKEN`), every normal API route except `/health` on an ordinary loopback bind requires `Authorization: Bearer <token>`; channel webhook ingress always uses its configured `x-qwen-webhook-secret`, and Web Shell document and asset routes remain pre-auth. `--require-auth=true` requires a token at boot and additionally moves loopback `/health` behind the bearer gate without changing webhook authentication. If you started the daemon without a token on the loopback default (the `qwen serve` zero-config path), neither call requires a header and any local process that can reach the primary listener receives full operator API authority, including code execution as the daemon user. The templates above all configure a token, so the `Authorization` header is needed in practice. If `/capabilities` returns `401`, the unit / plist token doesn't match the env-exported token your `curl` is using.
|
|
220
230
|
|
|
221
231
|
## Token rotation
|
|
222
232
|
|