@qwen-code/qwen-code 0.22.0 → 0.22.2-preview.0
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 +229 -0
- package/bundled/computer-use/agents/openai.yaml +4 -0
- package/bundled/coordinate/SKILL.md +5 -5
- package/bundled/qc-helper/docs/configuration/auth.md +7 -7
- package/bundled/qc-helper/docs/configuration/model-providers.md +70 -9
- package/bundled/qc-helper/docs/configuration/settings.md +40 -40
- package/bundled/qc-helper/docs/extension/introduction.md +3 -1
- package/bundled/qc-helper/docs/features/channels/_meta.ts +1 -0
- package/bundled/qc-helper/docs/features/channels/dingtalk.md +12 -0
- package/bundled/qc-helper/docs/features/channels/dws.md +120 -0
- package/bundled/qc-helper/docs/features/channels/overview.md +3 -3
- package/bundled/qc-helper/docs/features/code-review.md +25 -21
- package/bundled/qc-helper/docs/features/commands.md +2 -2
- package/bundled/qc-helper/docs/features/computer-use.md +57 -51
- package/bundled/qc-helper/docs/features/mcp.md +35 -12
- package/bundled/qc-helper/docs/features/sub-agents.md +1 -1
- package/bundled/qc-helper/docs/features/worktree.md +1 -1
- package/bundled/qc-helper/docs/overview.md +1 -1
- package/bundled/qc-helper/docs/quickstart.md +1 -1
- package/bundled/qc-helper/docs/qwen-serve.md +29 -6
- package/bundled/review/SKILL.md +119 -417
- package/bundled/review/references/aone.md +18 -0
- package/bundled/review/references/persistence.md +105 -0
- package/bundled/review/references/posting.md +270 -0
- package/chunks/MaxSizedBox-XYQOMOBE.js +112 -0
- package/chunks/{StandaloneSessionPicker-KTHPCSR6.js → StandaloneSessionPicker-KFMJILVY.js} +87 -86
- package/chunks/{acp-startup-profiler-T4GEAPLX.js → acp-startup-profiler-GNYAL6LI.js} +2 -2
- package/chunks/{acpAgent-CRY3JZ5O.js → acpAgent-KNFTTDWL.js} +2216 -1931
- package/chunks/agent-6V6MZOA7.js +97 -0
- package/chunks/agent-headless-3ZC4LX3E.js +87 -0
- package/chunks/{anthropicContentGenerator-Y2OX6LS4.js → anthropicContentGenerator-U76GTVB6.js} +128 -58
- package/chunks/{artifact-tool-SBXMTVCB.js → artifact-tool-XDJCZZCF.js} +2 -2
- package/chunks/{askUserQuestion-KEQJRFD6.js → askUserQuestion-ZXXERLEV.js} +2 -2
- package/chunks/bridge-LFFLHLU5.js +119 -0
- package/chunks/{ca-D3F4S6NG.js → ca-7HPYOYSZ.js} +3 -0
- package/chunks/{channel-management-service-IRTT7RNE.js → channel-management-service-HXXS3HOZ.js} +4 -4
- package/chunks/channel-settings-store-CAL2HWAH.js +117 -0
- package/chunks/{channel-worker-group-BJNMR2MP.js → channel-worker-group-EVDC2P4K.js} +8 -7
- package/chunks/{channel-worker-manager-EMA7CQDJ.js → channel-worker-manager-IJJZHGEI.js} +8 -7
- package/chunks/{channel-worker-supervisor-F6I6WSWW.js → channel-worker-supervisor-YSKB5GVB.js} +12 -7
- package/chunks/{chunk-2TRNCJK4.js → chunk-27ONXAFY.js} +1 -1
- package/chunks/{read-package-up-UXSW3YPB.js → chunk-2EAZ43JQ.js} +1 -0
- package/chunks/{chunk-DB2OKNTU.js → chunk-2FN2HNTI.js} +2 -2
- package/chunks/{chunk-KM73TBQ4.js → chunk-2LD5U7Q3.js} +31 -0
- package/chunks/{chunk-QJHPWLZC.js → chunk-2MHGD7EE.js} +1 -1
- package/chunks/{chunk-A5F2YNO6.js → chunk-2NNTE2ED.js} +245 -10
- package/chunks/{chunk-Z3JMO2CH.js → chunk-2SERYG4T.js} +1 -1
- package/chunks/{chunk-4J7OPYNS.js → chunk-2YDYDDE2.js} +6 -6
- package/chunks/{chunk-SE55HQGF.js → chunk-3B5DCAQU.js} +74 -52
- package/chunks/{chunk-UIRLQ3N7.js → chunk-3BV7TZNQ.js} +3 -3
- package/chunks/{chunk-2Z6LSQMF.js → chunk-3FSBMAYD.js} +1 -1
- package/chunks/{chunk-S4C4JJKE.js → chunk-3UXJFOB3.js} +5 -5
- package/chunks/{chunk-DJEHYM4H.js → chunk-3UZCLCXR.js} +3 -3
- package/chunks/{chunk-BUGYW6FB.js → chunk-4IDJQOCO.js} +1 -1
- package/chunks/chunk-4K7NQDCG.js +104 -0
- package/chunks/{chunk-WS7PAXXR.js → chunk-4N6UAPD3.js} +18 -13
- package/chunks/{chunk-VYC7XFYV.js → chunk-4PLAO7FS.js} +5 -5
- package/chunks/{chunk-UZPYR3EV.js → chunk-4TPAG3O7.js} +1 -1
- package/chunks/{chunk-2E3V7G6Y.js → chunk-4X5GYZFO.js} +55 -50
- package/chunks/{chunk-XYQHT3AW.js → chunk-4Z3PSHN4.js} +2 -2
- package/chunks/{chunk-PDL6LKB5.js → chunk-5AFPOEY3.js} +1 -1
- package/chunks/{chunk-BB5IMQCV.js → chunk-5CW26JIE.js} +2 -2
- package/chunks/{chunk-7KOFLDEP.js → chunk-5JTIYALA.js} +1 -1
- package/chunks/{chunk-U2UYQMM6.js → chunk-5NV2AN56.js} +3 -3
- package/chunks/{chunk-CXJHQVEK.js → chunk-5PA6UEYA.js} +4 -0
- package/chunks/{chunk-IBJ5S45N.js → chunk-5T4LWWNX.js} +2 -2
- package/chunks/{chunk-VUMLT7E5.js → chunk-5Y2JCJAH.js} +2 -2
- package/chunks/{chunk-BEGIBJAZ.js → chunk-6HOU52QX.js} +4 -4
- package/chunks/{chunk-GAHYKJPV.js → chunk-6US7BF3G.js} +7 -59
- package/chunks/{chunk-3CLIDIVQ.js → chunk-73WFGVIZ.js} +3 -3
- package/chunks/{chunk-ZZUVC6RI.js → chunk-76WGY6LW.js} +3 -3
- package/chunks/{chunk-XLDFW44M.js → chunk-77TOMRBG.js} +3 -3
- package/chunks/{chunk-ND7NOI4P.js → chunk-7CWEZQ6T.js} +0 -15
- package/chunks/{chunk-DWCKACFL.js → chunk-7DPKPBOQ.js} +2 -2
- package/chunks/{chunk-X7V3N6YH.js → chunk-7JJUFI36.js} +218 -37
- package/chunks/{chunk-45NQKMYB.js → chunk-7JPW6IYH.js} +1 -1
- package/chunks/{chunk-HDKCKCYO.js → chunk-7QGEJI7M.js} +1 -1
- package/chunks/{chunk-PHJJ3RVO.js → chunk-7XKW4CVK.js} +7 -15
- package/chunks/{chunk-O5Z7EB6Y.js → chunk-AYHQZBJ4.js} +170 -207
- package/chunks/{chunk-7DYNJFES.js → chunk-AYVIGUUK.js} +6 -1
- package/chunks/{chunk-43T5WDQ7.js → chunk-BFSFJR3D.js} +1 -1
- package/chunks/{chunk-OARZJFZX.js → chunk-BGWT7VBV.js} +4 -4
- package/chunks/{chunk-AP3B7LKD.js → chunk-BKDAF7ES.js} +2 -2
- package/chunks/{chunk-B6UBOIFE.js → chunk-BQBUZDDH.js} +14 -11
- package/chunks/{chunk-6PCOVQO2.js → chunk-BU7OUDQB.js} +8 -8
- package/chunks/{chunk-VLRBJ24J.js → chunk-BVE5EMIG.js} +2 -2
- package/chunks/{chunk-6UQSU7CQ.js → chunk-C2BAEV64.js} +58 -107
- package/chunks/{chunk-QKBYFU2Q.js → chunk-CFKIH3D3.js} +21 -1
- package/chunks/{chunk-URN2JIAQ.js → chunk-CITGRGCM.js} +2 -1
- package/chunks/{chunk-WU5E4HMO.js → chunk-CPPYZHBN.js} +1 -1
- package/chunks/{chunk-T6XLJRQY.js → chunk-D6XO27Z5.js} +36509 -5182
- package/chunks/{chunk-Q54XG7IX.js → chunk-DEYPMJPD.js} +1 -1
- package/chunks/{chunk-KSPRQSB4.js → chunk-DIMEPKCW.js} +52 -12
- package/chunks/{chunk-I432KXWD.js → chunk-DP7LABIB.js} +1 -1
- package/chunks/{chunk-P47E4SJC.js → chunk-DWRFOH3G.js} +3 -3
- package/chunks/{chunk-J5ZDDUKM.js → chunk-DX5FZGHZ.js} +4 -4
- package/chunks/{chunk-36OF5PRW.js → chunk-E4I5MVBR.js} +7 -3
- package/chunks/{chunk-AW27A43Y.js → chunk-E55H6BZ7.js} +93 -1
- package/chunks/{chunk-K623ENWT.js → chunk-E6FGMDFQ.js} +4 -0
- package/chunks/{chunk-YZBDKFRQ.js → chunk-EADEZDPO.js} +993 -895
- package/chunks/{chunk-5XUTPXQU.js → chunk-EAV3TENS.js} +6 -9
- package/chunks/{chunk-LI4YHTQK.js → chunk-EB4VDXNI.js} +1 -1
- package/chunks/{chunk-JOLJTKIG.js → chunk-EC5BONC3.js} +1 -1
- package/chunks/{chunk-W4CRPSC5.js → chunk-ELY4QVIB.js} +1 -1
- package/chunks/{chunk-AVCCKIZ6.js → chunk-EWBY3PFB.js} +1 -1
- package/chunks/chunk-FBX2SDQ4.js +48 -0
- package/chunks/{chunk-C72BXMJ5.js → chunk-FJWICLG7.js} +1 -1
- package/chunks/{chunk-LDGWX737.js → chunk-FN5C6C7G.js} +160 -59
- package/chunks/{chunk-3ZFJUBTP.js → chunk-FPH6TXD3.js} +1 -1
- package/chunks/{chunk-WRT324N6.js → chunk-FVDQ5E67.js} +3 -3
- package/chunks/{chunk-2A4C2MEG.js → chunk-FY62MBPS.js} +35 -12
- package/chunks/{chunk-VFACN2CE.js → chunk-GNMJNDZE.js} +1 -1
- package/chunks/{chunk-6QSA4JHL.js → chunk-GQAIZL3H.js} +2772 -814
- package/chunks/{chunk-PZRUV52H.js → chunk-GTUKW3I6.js} +20 -2
- package/chunks/{chunk-7DMTAQJ6.js → chunk-GXWY24QS.js} +132 -49
- package/chunks/chunk-GYTKQYDB.js +23 -0
- package/chunks/{chunk-VMJL7RH6.js → chunk-GZJUCMH4.js} +4 -4
- package/chunks/{chunk-2GXYDNXP.js → chunk-H2MDBYLL.js} +8 -8
- package/chunks/{chunk-RDG44S5I.js → chunk-H4JK2A2V.js} +2 -2
- package/chunks/{chunk-FVBVJEBG.js → chunk-HOANA6GC.js} +10 -8
- package/chunks/{chunk-AO4M6NMD.js → chunk-I6HWGOWD.js} +60 -20
- package/chunks/{chunk-7IV52LTO.js → chunk-I6VVOZDK.js} +2 -2
- package/chunks/{chunk-SQS55KR4.js → chunk-IJVDHPKD.js} +2 -2
- package/chunks/{chunk-QS4ENGVF.js → chunk-IKN3IUJP.js} +9 -8
- package/chunks/{chunk-2UZJWSVD.js → chunk-ILPXSKGQ.js} +2 -2
- package/chunks/{chunk-OVH5Y7KS.js → chunk-IN66KO3N.js} +19 -3
- package/chunks/{chunk-ZRYQMWEP.js → chunk-IPQA4SR5.js} +2 -2
- package/chunks/{chunk-AZF6SME3.js → chunk-JECO75XD.js} +3 -3
- package/chunks/{chunk-MQP3MHWN.js → chunk-JJJD6QCC.js} +21 -15
- package/chunks/chunk-JLGFGPZJ.js +346 -0
- package/chunks/{chunk-WZDM44SB.js → chunk-JUIJ3FXC.js} +7 -7
- package/chunks/{chunk-A6NRNRKE.js → chunk-JVPFTDBK.js} +1 -1
- package/chunks/{chunk-2J3OJGTL.js → chunk-K2OJUPOE.js} +1 -21
- package/chunks/{chunk-GHY5OIYP.js → chunk-K5PNJ6VL.js} +13 -13
- package/chunks/{chunk-NW35NVFN.js → chunk-K6FURWIX.js} +4 -4
- package/chunks/{chunk-6NFAEG54.js → chunk-KOJ6MHD5.js} +24 -13
- package/chunks/{chunk-A5F63FEW.js → chunk-L436XFLJ.js} +1 -1
- package/chunks/{chunk-GIWB5QLV.js → chunk-LJP2BBMK.js} +4 -4
- package/chunks/{chunk-FYZMB6DB.js → chunk-LKOSBI2M.js} +11 -11
- package/chunks/{create-sub-session-XBCVGNFU.js → chunk-LRKMQPMD.js} +4 -6
- package/chunks/{chunk-5HJUPACR.js → chunk-LRLMDV5X.js} +2 -2
- package/chunks/{chunk-MHG6NDS6.js → chunk-MB4OCRQ2.js} +2 -2
- package/chunks/{chunk-IIWGSX4L.js → chunk-MI7CMXPU.js} +1 -1
- package/chunks/{chunk-ZLCT4C5A.js → chunk-MZS7GEC7.js} +1 -1
- package/chunks/{chunk-WWUSHZ7M.js → chunk-N4B7VPXK.js} +5 -5
- package/chunks/{chunk-BMCSKS37.js → chunk-NUHCXGAD.js} +6 -6
- package/chunks/{chunk-XZJKSETB.js → chunk-O3BUXIPM.js} +3 -3
- package/chunks/{chunk-4XPSVIED.js → chunk-O5YGAEQS.js} +6 -6
- package/chunks/{chunk-ZRFUT5VV.js → chunk-OAAPGZVH.js} +7 -7
- package/chunks/{chunk-UU4WC7DK.js → chunk-OGZAQWJP.js} +82 -12
- package/chunks/{chunk-5XHAOUWD.js → chunk-OI2DR6QB.js} +3 -3
- package/chunks/{chunk-EFB657PR.js → chunk-OX44MOAN.js} +3 -3
- package/chunks/{chunk-LURJYO2T.js → chunk-OZ6KS6KW.js} +4 -0
- package/chunks/{chunk-4F5WV4RF.js → chunk-PAJGKZAA.js} +281 -10
- package/chunks/{chunk-HIK2OF33.js → chunk-PVBT5QPD.js} +1 -1
- package/chunks/{chunk-MPHLIJYL.js → chunk-QB5DD75E.js} +14 -8
- package/chunks/chunk-QHMLYMMS.js +32 -0
- package/chunks/{chunk-4CWDWDL6.js → chunk-RCDXSEJ5.js} +1 -1
- package/chunks/{chunk-L4HVF7LM.js → chunk-RQ5ASDFQ.js} +3 -3
- package/chunks/{chunk-PXOJLJ5W.js → chunk-RQAMNZ4Y.js} +333 -184
- package/chunks/{chunk-K52PZNU4.js → chunk-RRKNX553.js} +2 -2
- package/chunks/{chunk-RPJQ3O4M.js → chunk-RUJTCU46.js} +31 -41
- package/chunks/{chunk-62JOGZL5.js → chunk-RUQBJS34.js} +199 -87
- package/chunks/chunk-RXFQM6FQ.js +42 -0
- package/chunks/{chunk-SJ4HB27T.js → chunk-SDVF6A42.js} +3 -3
- package/chunks/{chunk-TBVSALA3.js → chunk-SKNVVYIJ.js} +3 -3
- package/chunks/{chunk-JGUBDRBC.js → chunk-SLEWBQWM.js} +3 -3
- package/chunks/{chunk-UUQFJILB.js → chunk-SQPOJ4ZI.js} +15 -3
- package/chunks/{chunk-ISJMN3ML.js → chunk-T2CRBIDJ.js} +1 -1
- package/chunks/{chunk-MZKWFWVG.js → chunk-T2HMXHYA.js} +6 -6
- package/chunks/{chunk-FEMQ6Y7W.js → chunk-T6OODF2U.js} +47 -126
- package/chunks/{chunk-KVGR4MCF.js → chunk-TOF4UZHH.js} +3 -3
- package/chunks/{chunk-7HFULI45.js → chunk-TQYZG5DU.js} +3 -3
- package/chunks/{chunk-LD5VIJ7S.js → chunk-TWSKM647.js} +1 -1
- package/chunks/{chunk-25NESM4G.js → chunk-TWUA5EIL.js} +29 -5
- package/chunks/{chunk-6FRJEE2S.js → chunk-U66FXEH2.js} +5 -5
- package/chunks/{chunk-7NBVNAJJ.js → chunk-UCSV2IZW.js} +3 -3
- package/chunks/chunk-UVDOONRU.js +20 -0
- package/chunks/{chunk-FDD2IUEL.js → chunk-UX3IFLJM.js} +229 -21
- package/chunks/{chunk-YDJRMQU4.js → chunk-V3GINY6K.js} +3 -3
- package/chunks/{chunk-XL5K4SVK.js → chunk-VL4YX3FH.js} +1 -1
- package/chunks/{chunk-ZS5BHEPD.js → chunk-VLY6XOBY.js} +1 -1
- package/chunks/{chunk-KIVGVFMM.js → chunk-VUZY6MEQ.js} +16 -4
- package/chunks/{chunk-OE52YHCZ.js → chunk-W2WRNJKX.js} +11 -11
- package/chunks/{chunk-YLFLHKDL.js → chunk-W3N5XAZ6.js} +1 -1
- package/chunks/{chunk-IWOWEENB.js → chunk-WBT3STGU.js} +385 -25
- package/chunks/{chunk-S3G6YFQC.js → chunk-WEGXPP5E.js} +1 -1
- package/chunks/{chunk-RDQ7QB4Y.js → chunk-XJS54K4A.js} +2 -2
- package/chunks/{chunk-7JBHIQS2.js → chunk-XO4NGYRP.js} +7 -13
- package/chunks/{chunk-F6WFNA7U.js → chunk-XZA32HII.js} +3 -6
- package/chunks/{chunk-VEND4KA4.js → chunk-YT5XN3HV.js} +1 -1
- package/chunks/{chunk-NUGZAFR2.js → chunk-ZEADBZLO.js} +147 -6
- package/chunks/chunk-ZELCTN6Y.js +29 -0
- package/chunks/{chunk-TQOF5KBL.js → chunk-ZEZKIS2K.js} +0 -31
- package/chunks/{chunk-IOSEW6KP.js → chunk-ZJG323IA.js} +5 -4
- package/chunks/{chunk-VSNPOSDN.js → chunk-ZKAZP2ZG.js} +107 -12
- package/chunks/{chunk-YMVFIYHV.js → chunk-ZLTEQYNC.js} +2 -2
- package/chunks/{chunk-O5BDEWBC.js → chunk-ZWKGZB2K.js} +3 -3
- package/chunks/chunk-ZYNTSXWK.js +32 -0
- package/chunks/config-utils-YMJNA25D.js +113 -0
- package/chunks/contextCommand-WMPSNKPG.js +108 -0
- package/chunks/{core-runtime-CES6JSVV.js → core-runtime-6TBMEULI.js} +63 -58
- package/chunks/create-sub-session-RVHSWVAP.js +17 -0
- package/chunks/{create-sub-session-UJTPMVOG.js → create-sub-session-SAOMTP62.js} +60 -58
- package/chunks/{cron-create-IKA56DAF.js → cron-create-IJGVR5R2.js} +4 -4
- package/chunks/{cron-delete-K5Q62EGH.js → cron-delete-4N5BI6GL.js} +4 -4
- package/chunks/{cron-list-QBFGAMP7.js → cron-list-2CATIPUX.js} +4 -4
- package/chunks/{daemon-RZZUPGOJ.js → daemon-NAYK4XXU.js} +51 -24
- package/chunks/{daemon-git-worktree-guard-3QY2BQYB.js → daemon-git-worktree-guard-TYLESM6G.js} +338 -92
- package/chunks/daemon-status-provider-YBQAZD3G.js +118 -0
- package/chunks/daemon-trust-policy-O75ZSIJN.js +114 -0
- package/chunks/{daemon-trust-policy-monitor-TK4K7M63.js → daemon-trust-policy-monitor-WWX7I7P6.js} +68 -66
- package/chunks/{de-RYUHH2C6.js → de-X6HLSIFE.js} +1 -0
- package/chunks/deferred-core-runtime-MGCCR6LA.js +116 -0
- package/chunks/{display-image-OEJMJV3S.js → display-image-DR55LL6M.js} +5 -5
- package/chunks/dist-4Q7NTUNB.js +2512 -0
- package/chunks/{dist-ESS34DHC.js → dist-6H6RZ5H6.js} +2 -2
- package/chunks/{dist-LZO24N3E.js → dist-7CKN54NL.js} +1 -1
- package/chunks/{dist-5EV2G6MC.js → dist-DJBNNPLN.js} +1 -1
- package/chunks/{dist-J6P3C52Z.js → dist-FVJZSIO4.js} +28 -7
- package/chunks/{dist-K7IQB53U.js → dist-SATKXKUR.js} +1 -1
- package/chunks/{dist-ES6HNUW2.js → dist-TJUDJTCB.js} +246 -17
- package/chunks/{dist-VVQBOKDH.js → dist-UQUFZDIY.js} +1 -1
- package/chunks/{dist-2OG3PGKO.js → dist-ZBVOXSKF.js} +3 -3
- package/chunks/earlyInputCapture-2EJKJET3.js +109 -0
- package/chunks/{edit-A2633SLR.js → edit-GBDKI5DZ.js} +48 -48
- package/chunks/{en-3RHLPITS.js → en-6MDBWMTG.js} +3 -0
- package/chunks/{enter-worktree-OIAHE2TB.js → enter-worktree-UOZ6ZTP7.js} +7 -8
- package/chunks/{enterPlanMode-SUGIKLR7.js → enterPlanMode-2KTIPPM3.js} +47 -47
- package/chunks/environment-XJ75LJ6N.js +131 -0
- package/chunks/errors-XEI3SJRV.js +115 -0
- package/chunks/{exit-worktree-3UT3SSWT.js → exit-worktree-G2QATUCV.js} +7 -8
- package/chunks/exitPlanMode-AUMYTFIQ.js +85 -0
- package/chunks/{fast-path-3AVP3G35.js → fast-path-TU7U2ETU.js} +28 -7
- package/chunks/{fast-path-settings-WHX3J3ZI.js → fast-path-settings-XMFBYFUH.js} +2 -2
- package/chunks/{fr-4PL5GHG4.js → fr-FTZWF462.js} +1 -0
- package/chunks/{gemini-7PVQWHTH.js → gemini-FKMYDP64.js} +129 -123
- package/chunks/{geminiContentGenerator-B2FOJJDJ.js → geminiContentGenerator-WSHP7CSR.js} +16 -13
- package/chunks/{glob-7YGXE6OV.js → glob-EOM6XK7H.js} +47 -47
- package/chunks/{goal-tools-TLJCE7YZ.js → goal-tools-CNVXMSZD.js} +72 -28
- package/chunks/{grep-6DV6LTON.js → grep-3NLSS32D.js} +6 -6
- package/chunks/handleAutoUpdate-S4CLP36D.js +111 -0
- package/chunks/i18n-XX7U2Q3X.js +126 -0
- package/chunks/{image-gen-7CSCJ73T.js → image-gen-63NN2H5N.js} +9 -11
- package/chunks/initializer-D3CA3272.js +115 -0
- package/chunks/installationInfo-HVDQOSIE.js +109 -0
- package/chunks/{ja-HZ7X7PQO.js → ja-2GL5FKYJ.js} +1 -0
- package/chunks/{keychain-token-storage-MTFTAESK.js → keychain-token-storage-3MGFRYGM.js} +2 -2
- package/chunks/list-XUDSTGT3.js +118 -0
- package/chunks/{list-agents-43XUEXJV.js → list-agents-EXRSHIDJ.js} +2 -2
- package/chunks/loadedSettingsAdapter-ZOJ4QEID.js +112 -0
- package/chunks/{loggingContentGenerator-RNE66CKK.js → loggingContentGenerator-TUDGCVUG.js} +27 -30
- package/chunks/{loop-wakeup-E54KDUXC.js → loop-wakeup-XBPB2BRO.js} +5 -5
- package/chunks/{ls-CGL2UC3H.js → ls-WFONAND2.js} +4 -4
- package/chunks/{lsp-5IKUO5DX.js → lsp-DUKPDUXN.js} +2 -2
- package/chunks/{managed-npm-update-Y3SC3GLJ.js → managed-npm-update-5K4FWFX2.js} +61 -59
- package/chunks/mcp-QJ6AUYE5.js +112 -0
- package/chunks/{monitor-PXYSGSUN.js → monitor-UUHIAGT7.js} +47 -47
- package/chunks/nonInteractiveCli-PAWO75YO.js +185 -0
- package/chunks/{notebook-edit-ISIBJVBR.js → notebook-edit-GZPB3Q57.js} +48 -48
- package/chunks/open-with-auth-4UI3KHUR.js +55 -0
- package/chunks/{openaiContentGenerator-6TBOPEGT.js → openaiContentGenerator-RPP6YBS3.js} +29 -30
- package/chunks/pidfile-RF3WUFKR.js +113 -0
- package/chunks/{processUtils-YK2TDTTU.js → processUtils-ENAY2GSA.js} +2 -2
- package/chunks/prompt-terminal-ledger-4CCXZ2LF.js +107 -0
- package/chunks/{pt-QT5N2Q6Q.js → pt-XN2YWJVM.js} +1 -0
- package/chunks/{qwenContentGenerator-CLDMA2Y4.js → qwenContentGenerator-GLUZVJAU.js} +53 -59
- package/chunks/{qwenOAuth2-DLDR6UC5.js → qwenOAuth2-JIYAWXTW.js} +8 -10
- package/chunks/{read-file-2HOD2ATO.js → read-file-75R5LUWQ.js} +13 -14
- package/chunks/{read-mcp-resource-XYES2B42.js → read-mcp-resource-7A7NFSFL.js} +2 -2
- package/chunks/read-package-up-6T6ICKR7.js +13 -0
- package/chunks/{record-artifact-W3IBTGL7.js → record-artifact-CPJ4IJSD.js} +4 -5
- package/chunks/report-findings-VFM5DENC.js +33 -0
- package/chunks/request-shutdown-AXVOFN5C.js +133 -0
- package/chunks/resumeHistoryUtils-GFPJD2XB.js +120 -0
- package/chunks/ripGrep-FNLXQYBS.js +39 -0
- package/chunks/{ru-STMG5BPD.js → ru-OLTMFJEW.js} +1 -0
- package/chunks/{run-qwen-serve-XJHOW2NY.js → run-qwen-serve-FJD4VMI2.js} +622 -79
- package/chunks/{runtime-J4SPTJRQ.js → runtime-INDSJB4K.js} +73 -71
- package/chunks/{scheduler-VRAEZZ4E.js → scheduler-Z52TCSUG.js} +62 -60
- package/chunks/{sdk-exporters-http-RSIOP3G2.js → sdk-exporters-http-XXSKBD2C.js} +5 -5
- package/chunks/{sdk-impl-CB3KARSK.js → sdk-impl-VPNBLV7I.js} +7 -7
- package/chunks/{send-message-J4VT46OI.js → send-message-A2GXDX3B.js} +10 -31
- package/chunks/serve-GVD2WXVL.js +120 -0
- package/chunks/{server-74ONDK62.js → server-PSN5OOSX.js} +965 -405
- package/chunks/{session-BO6VBWJP.js → session-JPE34X6Q.js} +151 -140
- package/chunks/{settings-35QZNFDG.js → settings-IVGC4UYK.js} +71 -69
- package/chunks/shell-A5PZGPBR.js +95 -0
- package/chunks/{skill-DKEMQSNJ.js → skill-UUXQPDEH.js} +108 -25
- package/chunks/skill-settings-WVRXLTK4.js +120 -0
- package/chunks/spawnChannel-KTURLD4B.js +113 -0
- package/chunks/standalone-update-IRFRNGAA.js +120 -0
- package/chunks/{startInteractiveUI-J2QSGWPU.js → startInteractiveUI-MC4GLL6G.js} +381 -293
- package/chunks/{syntheticOutput-JAXMIMZP.js → syntheticOutput-5AJ444QT.js} +3 -3
- package/chunks/{task-create-I2H322E4.js → task-create-CDJSOEQD.js} +11 -11
- package/chunks/{task-list-3OLIWFTQ.js → task-list-BELMPA75.js} +5 -5
- package/chunks/{task-stop-JAUY6MSY.js → task-stop-U3S3KZG2.js} +2 -2
- package/chunks/{task-update-B3XO4CPI.js → task-update-77VCFDDZ.js} +11 -11
- package/chunks/{team-create-W534PMGX.js → team-create-WO5ZBCFW.js} +48 -48
- package/chunks/{team-delete-Q7GE7RRI.js → team-delete-YWFXX77L.js} +5 -5
- package/chunks/{team-plan-approval-WNV6P6NG.js → team-plan-approval-KAVKRN7U.js} +47 -47
- package/chunks/terminal-image-renderer-SMRRNI6Z.js +116 -0
- package/chunks/theme-manager-A7CPN7F4.js +104 -0
- package/chunks/{todoWrite-FJJTY2TI.js → todoWrite-435EO2CS.js} +4 -4
- package/chunks/{tool-search-Y4KL3LRE.js → tool-search-FBN6OC6U.js} +18 -19
- package/chunks/total-session-admission-B7U6UWKQ.js +114 -0
- package/chunks/trustedFolders-B4LPJBFK.js +124 -0
- package/chunks/{update-relaunch-OHVFN6KF.js → update-relaunch-X5TJVKVG.js} +6 -6
- package/chunks/updateCheck-JCLP5JFT.js +120 -0
- package/chunks/useAutoAcceptIndicator-VBT3NKDM.js +122 -0
- package/chunks/{validateNonInterActiveAuth-WJXH426F.js → validateNonInterActiveAuth-W7HYH5ZN.js} +113 -106
- package/chunks/{version-QMDRADXM.js → version-JG4J76GL.js} +2 -2
- package/chunks/{web-fetch-ROS6P4LP.js → web-fetch-SPLMEDWF.js} +25 -242
- package/chunks/{web-search-JS3E76O6.js → web-search-PNW6OEH6.js} +11 -11
- package/chunks/{web-shell-static-3NUTRHAH.js → web-shell-static-A6QMUNNV.js} +11 -4
- package/chunks/webapi-Z5OM224P.js +4118 -0
- package/chunks/{workflow-2FCMBTBZ.js → workflow-QHOIIXJO.js} +635 -94
- package/chunks/workspace-providers-status-653DTR35.js +116 -0
- package/chunks/{workspace-registration-store-SU4EJKSD.js → workspace-registration-store-H375IYR2.js} +1 -1
- package/chunks/workspace-registry-XTLCD7Z2.js +123 -0
- package/chunks/workspace-service-KVJWACCS.js +131 -0
- package/chunks/workspace-skills-status-TRJ2VWGU.js +115 -0
- package/chunks/{workspace-trust-reconciler-4Y4F7XIX.js → workspace-trust-reconciler-6SC6RKQE.js} +74 -73
- package/chunks/write-file-EAZSJZKR.js +90 -0
- package/chunks/{zh-TW-NX43Z2S2.js → zh-TW-MV4FWFB6.js} +3 -0
- package/chunks/{zh-3JQ75KFU.js → zh-X3WGU6SI.js} +3 -0
- package/chunks/{zoom-image-DNBKCGGF.js → zoom-image-WGNPZ572.js} +13 -14
- package/cli.js +15 -15
- package/locales/ca.js +3 -0
- package/locales/de.js +1 -0
- package/locales/en.js +3 -0
- package/locales/fr.js +1 -0
- package/locales/ja.js +1 -0
- package/locales/pt.js +1 -0
- package/locales/ru.js +1 -0
- package/locales/zh-TW.js +3 -0
- package/locales/zh.js +3 -0
- package/package.json +3 -3
- package/web-shell/assets/{abnfDiagram-VCTEODGH-DWHXEVlf.js → abnfDiagram-VCTEODGH-yq7z7Anb.js} +1 -1
- package/web-shell/assets/{arc-CXKjm86V.js → arc-CbJO0xnT.js} +1 -1
- package/web-shell/assets/{architectureDiagram-5GKGNRK7-B_ynI0cX.js → architectureDiagram-5GKGNRK7-CRh89421.js} +1 -1
- package/web-shell/assets/{blockDiagram-NRAW4CY4-DMebd9X0.js → blockDiagram-NRAW4CY4-C75KAhKv.js} +1 -1
- package/web-shell/assets/{c4Diagram-UCG6FXSJ-BZ5BlxS-.js → c4Diagram-UCG6FXSJ-BzlMveFB.js} +1 -1
- package/web-shell/assets/channel-B3sGR79J.js +1 -0
- package/web-shell/assets/{chunk-2Q5K7J3B-CluJKopE.js → chunk-2Q5K7J3B-DA8QDX3a.js} +1 -1
- package/web-shell/assets/{chunk-5VM5RSS4-hzDAPFOo.js → chunk-5VM5RSS4-Bgu7gQ7Y.js} +1 -1
- package/web-shell/assets/{chunk-F27PBJKO-6vHioKJe.js → chunk-F27PBJKO-BOew7pIK.js} +1 -1
- package/web-shell/assets/{chunk-G27WJ6UU-B_5hKTGo.js → chunk-G27WJ6UU-DHx1I-hO.js} +1 -1
- package/web-shell/assets/{chunk-JWPE2WC7-CO9VoFCH.js → chunk-JWPE2WC7-SarFW0WU.js} +1 -1
- package/web-shell/assets/{chunk-LCL6LL3I-7L5JpxYu.js → chunk-LCL6LL3I-BLzP083Z.js} +1 -1
- package/web-shell/assets/{chunk-POPQ4Y6H-DHLJMAqj.js → chunk-POPQ4Y6H-Bmkv_iKm.js} +1 -1
- package/web-shell/assets/{chunk-SVP7TREG-Dt-4Cqdl.js → chunk-SVP7TREG-MPx9r1N2.js} +1 -1
- package/web-shell/assets/{chunk-XXDRQBXY-QlSQ3ssG.js → chunk-XXDRQBXY-Ck-09rKG.js} +1 -1
- package/web-shell/assets/classDiagram-DTDB5LWJ-sTGo0K3v.js +1 -0
- package/web-shell/assets/classDiagram-v2-JRS7N3AN-sTGo0K3v.js +1 -0
- package/web-shell/assets/{cose-bilkent-JH36ORCC-DMw3EOxl.js → cose-bilkent-JH36ORCC-DWm6lfOG.js} +1 -1
- package/web-shell/assets/{cynefin-OW5HDTMX-s6vEA7RQ.js → cynefin-OW5HDTMX-DcBUyr5R.js} +1 -1
- package/web-shell/assets/{cynefinDiagram-5FMLGOSQ-AOKsvYLt.js → cynefinDiagram-5FMLGOSQ-Df8qmd_p.js} +1 -1
- package/web-shell/assets/{dagre-3AP2YEHR-9QAZn3m7.js → dagre-3AP2YEHR-DDmGspD7.js} +1 -1
- package/web-shell/assets/{diagram-S7CK7UJ4-CWpnu4FN.js → diagram-S7CK7UJ4-BK_qFvbi.js} +1 -1
- package/web-shell/assets/{diagram-UQ7AKVKN-9l0jXD8q.js → diagram-UQ7AKVKN-Uw3AP_bi.js} +1 -1
- package/web-shell/assets/{diagram-VSXAHHWV-BMUHroj4.js → diagram-VSXAHHWV-CJOQKxY7.js} +1 -1
- package/web-shell/assets/{diagram-VX7I27RA-Co9x27vm.js → diagram-VX7I27RA-DhdvZna5.js} +1 -1
- package/web-shell/assets/{diagram-Z3DM3KII-BKnTeOER.js → diagram-Z3DM3KII-edQU0nlP.js} +1 -1
- package/web-shell/assets/{ebnfDiagram-PWID7BFC-QBZD9CKG.js → ebnfDiagram-PWID7BFC-4kugBEsO.js} +1 -1
- package/web-shell/assets/{erDiagram-SSCWMZ5O-dKWAEGun.js → erDiagram-SSCWMZ5O-BMkFivWO.js} +1 -1
- package/web-shell/assets/{flowDiagram-A5DVABFB-CR_UgVqj.js → flowDiagram-A5DVABFB-BM1ea8g-.js} +1 -1
- package/web-shell/assets/{ganttDiagram-EL5Y4UJY-DQUnjWO6.js → ganttDiagram-EL5Y4UJY-CXj_cKRf.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-WWUBYQGX-C4j59wPL.js → gitGraphDiagram-WWUBYQGX-D0nEqwqu.js} +1 -1
- package/web-shell/assets/{index-tYXRIPz4.js → index-B6JN54Pd.js} +1 -1
- package/web-shell/assets/{index-BN_m_uHJ.css → index-C-XlQn24.css} +1 -1
- package/web-shell/assets/index-DLjXM0dn.js +1860 -0
- package/web-shell/assets/{infoDiagram-RXCK75RN-mzqbt50w.js → infoDiagram-RXCK75RN-DF7aGGbQ.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-5VMMS53U-ChLOqhGl.js → ishikawaDiagram-5VMMS53U-CZYNX1lL.js} +1 -1
- package/web-shell/assets/{journeyDiagram-EYS64GPL-SifZE-R8.js → journeyDiagram-EYS64GPL-CvrqMUz1.js} +1 -1
- package/web-shell/assets/{kanban-definition-3QL26DDD-Sft2qlbc.js → kanban-definition-3QL26DDD-BZNJQZBj.js} +1 -1
- package/web-shell/assets/{layout-O2uHVkPd.js → layout-Bf83x7D6.js} +1 -1
- package/web-shell/assets/{linear-BVqYgjSc.js → linear-Bkc3ES2f.js} +1 -1
- package/web-shell/assets/{mermaid.core-CZ9MQaJ6.js → mermaid.core-C6xuovwz.js} +6 -6
- package/web-shell/assets/{mindmap-definition-FBJOCRG2-BNQYjBqM.js → mindmap-definition-FBJOCRG2-DzH6gVRg.js} +1 -1
- package/web-shell/assets/{pegDiagram-XKGWAZYB-rh1J8uv6.js → pegDiagram-XKGWAZYB-DCvLh2fa.js} +1 -1
- package/web-shell/assets/{pieDiagram-E7YTZNPT-BQHR5mn9.js → pieDiagram-E7YTZNPT-BtjVlx_6.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-AXDQQJYC-CLCbP7mK.js → quadrantDiagram-AXDQQJYC-IbroqxFe.js} +1 -1
- package/web-shell/assets/{railroadDiagram-O6MQD6OU-CDQhrkbm.js → railroadDiagram-O6MQD6OU-BvMykiWW.js} +1 -1
- package/web-shell/assets/{requirementDiagram-EFPCY7ZU-BdP9uswg.js → requirementDiagram-EFPCY7ZU-D-HHMyrh.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-P5KCCOFB-CFZDFBXF.js → sankeyDiagram-P5KCCOFB-C0XXhB6d.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-WJ2MYXX4-BW9WOJXI.js → sequenceDiagram-WJ2MYXX4-DseAXj5d.js} +1 -1
- package/web-shell/assets/{sizeCapture-X5ZJPWSS-CPMia32z.js → sizeCapture-X5ZJPWSS-Cek2EweK.js} +1 -1
- package/web-shell/assets/{stateDiagram-HBIQ2CUA-BANp9p7F.js → stateDiagram-HBIQ2CUA-yLv8wafW.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-4QOOHH4V-DeThXnol.js +1 -0
- package/web-shell/assets/{swimlanes-XN3QIQJK-JroXksK-.js → swimlanes-XN3QIQJK-Cwz-opvE.js} +1 -1
- package/web-shell/assets/swimlanesDiagram-VK2B7HYN-GW0R1ZSv.js +8 -0
- package/web-shell/assets/{timeline-definition-24CTP7MA-DfuVIfYY.js → timeline-definition-24CTP7MA-BJuFD7OG.js} +1 -1
- package/web-shell/assets/{vennDiagram-4TSXK5OY-BZXoSjRB.js → vennDiagram-4TSXK5OY-CNAavdoV.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-VM6X3IG4-BdiY8avC.js → wardleyDiagram-VM6X3IG4-DaIjAidq.js} +1 -1
- package/web-shell/assets/{xychartDiagram-S5SC5T6Z-DcXh_U4H.js → xychartDiagram-S5SC5T6Z-DkcQXjTy.js} +1 -1
- package/web-shell/index.html +19 -4
- package/chunks/MaxSizedBox-3OZJCC3J.js +0 -110
- package/chunks/agent-BFE3DQM3.js +0 -93
- package/chunks/agent-headless-LLVKZZ4P.js +0 -87
- package/chunks/bridge-EBYO4SYM.js +0 -118
- package/chunks/channel-settings-store-5VP2Y2YM.js +0 -115
- package/chunks/chunk-AXMWHKXA.js +0 -42
- package/chunks/chunk-IO257NUD.js +0 -623
- package/chunks/chunk-YHC2EYYG.js +0 -125
- package/chunks/computer-use-EGPWFEX6.js +0 -2142
- package/chunks/config-utils-WZ43VOBS.js +0 -25
- package/chunks/contextCommand-5DSEQI6S.js +0 -106
- package/chunks/daemon-status-provider-EYMLPYJU.js +0 -116
- package/chunks/daemon-trust-policy-CQYKZ7VO.js +0 -112
- package/chunks/deferred-core-runtime-WFEPUXZR.js +0 -114
- package/chunks/earlyInputCapture-PN4PP7V5.js +0 -107
- package/chunks/environment-WUPHLPKZ.js +0 -127
- package/chunks/errors-WPMPVIAT.js +0 -113
- package/chunks/exitPlanMode-MLFHYZNB.js +0 -85
- package/chunks/handleAutoUpdate-F5OTWUT5.js +0 -109
- package/chunks/i18n-C562S6KN.js +0 -124
- package/chunks/initializer-7YPGOFP4.js +0 -113
- package/chunks/installationInfo-ARU5Q2H7.js +0 -107
- package/chunks/list-KTSK275C.js +0 -116
- package/chunks/loadedSettingsAdapter-F3T2EQ5J.js +0 -110
- package/chunks/mcp-6ONTVPAY.js +0 -110
- package/chunks/nonInteractiveCli-KZDWFAN6.js +0 -178
- package/chunks/pidfile-IO7ALSZF.js +0 -111
- package/chunks/prompt-terminal-ledger-TCE7PMCE.js +0 -105
- package/chunks/resumeHistoryUtils-DDSBAQJS.js +0 -118
- package/chunks/ripGrep-E7P6K4QR.js +0 -40
- package/chunks/serve-KEAWV4TI.js +0 -118
- package/chunks/shell-H6K63WG3.js +0 -95
- package/chunks/skill-settings-TCKLXIXM.js +0 -118
- package/chunks/spawnChannel-2K6NKWM5.js +0 -111
- package/chunks/standalone-update-LSCGOEFP.js +0 -118
- package/chunks/terminal-image-renderer-UHX3UD66.js +0 -114
- package/chunks/theme-manager-6B47ZPIF.js +0 -102
- package/chunks/total-session-admission-NSCFWGJH.js +0 -113
- package/chunks/trustedFolders-7XMJWGQ3.js +0 -122
- package/chunks/updateCheck-EOVLHD4T.js +0 -118
- package/chunks/useAutoAcceptIndicator-ZNMIGBTN.js +0 -120
- package/chunks/workspace-providers-status-GPGU5YMT.js +0 -113
- package/chunks/workspace-registry-BQISXT6Y.js +0 -122
- package/chunks/workspace-service-LLY6HCUC.js +0 -129
- package/chunks/workspace-skills-status-L5N2Y3ZP.js +0 -113
- package/chunks/write-file-EJHU2Z3E.js +0 -90
- package/web-shell/assets/channel-Zg3WHgq_.js +0 -1
- package/web-shell/assets/classDiagram-DTDB5LWJ-C16l9jQz.js +0 -1
- package/web-shell/assets/classDiagram-v2-JRS7N3AN-C16l9jQz.js +0 -1
- package/web-shell/assets/index-DrlJu79f.js +0 -1792
- package/web-shell/assets/stateDiagram-v2-4QOOHH4V-NZYAoQLU.js +0 -1
- package/web-shell/assets/swimlanesDiagram-VK2B7HYN-3YdVX3vj.js +0 -8
|
@@ -39,9 +39,9 @@ If there are no uncommitted changes, `/review` will let you know and stop — no
|
|
|
39
39
|
| -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | ----------------------------------- | ---------------- |
|
|
40
40
|
| `low` | 3-6 directed inline angles over the diff (scaled by diff size) plus a gap sweep — no subagents, no build/test, no project rules | 10 (unverified) | None | Never |
|
|
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
|
-
| `high` | Full pipeline:
|
|
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
|
-
Defaults: **high** for PR reviews, **medium** for local and file reviews. 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 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.
|
|
44
|
+
Defaults: **high** for PR reviews, **medium** for local and file reviews. 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
|
|
|
@@ -52,12 +52,14 @@ Step 1: Determine scope + effort level (local diff / PR worktree / file)
|
|
|
52
52
|
Capture the diff to a file + partition it into chunks
|
|
53
53
|
Step 2: Load project review rules (medium/high)
|
|
54
54
|
Step 3C: low effort: 3-6 inline angles + gap sweep [0 subagent calls]
|
|
55
|
-
Step 3A: high, <=500 src AND <=3200 total:
|
|
55
|
+
Step 3A: high, <=500 src AND <=3200 total: up to 16 agents [16+ LLM calls]
|
|
56
56
|
|-- Agent 0: Issue Fidelity & Root-Cause Ownership
|
|
57
57
|
|-- Agent 1a: Correctness — line-by-line scan
|
|
58
|
-
| (incl. language-pitfall + wrapper-routing checks)
|
|
59
58
|
|-- Agent 1b: Correctness — removed-behavior audit
|
|
60
59
|
|-- Agent 1c: Correctness — cross-file tracer
|
|
60
|
+
|-- Agent 1d: Correctness — language-pitfall scan
|
|
61
|
+
|-- Agent 1e: Correctness — wrapper/proxy routing
|
|
62
|
+
| (only when the diff signals a wrapping type)
|
|
61
63
|
|-- Agent 2: Security
|
|
62
64
|
|-- Agent 3a: Reuse & duplication
|
|
63
65
|
|-- Agent 3b: Altitude & abstraction fit
|
|
@@ -102,9 +104,11 @@ Steps 3A/3B/4/5 are the high-effort pipeline; at `--effort low|medium` a single
|
|
|
102
104
|
| Agent | Focus |
|
|
103
105
|
| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
104
106
|
| Agent 0: Issue Fidelity | Linked issue evidence, root-cause ownership, and whether the PR solves the reported problem |
|
|
105
|
-
| Agent 1a: Line-by-line scan | Walks every hunk plus its enclosing function: wrong conditions, off-by-one, missing `await`,
|
|
107
|
+
| Agent 1a: Line-by-line scan | Walks every hunk plus its enclosing function: wrong conditions, off-by-one, missing `await`, edge cases, race conditions |
|
|
106
108
|
| Agent 1b: Removed-behavior audit | Walks every deleted/replaced line: names the invariant it enforced and hunts for where the new code re-establishes it — including removed **exports**, whose replacement often lives in another file and quietly changed a default. In 3B it runs whole-diff (chunk agents keep the local half) |
|
|
107
109
|
| Agent 1c: Cross-file tracer | Walks every changed symbol's callers (consumer direction) and every added field's read sites (producer direction), plus same-PR callee changes |
|
|
110
|
+
| Agent 1d: Language-pitfall scan | Carries the classic-footgun checklist for the diff's language (`==` coercion, falsy-value traps, loop-variable capture, mutable defaults, nil-map writes, SQL concatenation, DST arithmetic) and pattern-matches every hunk against it |
|
|
111
|
+
| Agent 1e: Wrapper/proxy routing | For every type the diff adds or modifies that wraps another (cache, proxy, decorator, adapter): every method routes through the wrapped instance, and the wrapper forwards every method callers use. Rostered only when the diff signals a wrapping type |
|
|
108
112
|
| Agent 2: Security | Injection, XSS, SSRF, auth bypass, sensitive data exposure |
|
|
109
113
|
| Agent 3a: Reuse & duplication | Does the codebase already have this? Greps for the behavior, names the existing helper to call instead, and flags dead code the diff leaves behind |
|
|
110
114
|
| Agent 3b: Altitude & abstraction | Is the fix at the right depth — or a bandaid on shared infrastructure, a downstream compensation for an upstream bug, or an abstraction serving one call site? |
|
|
@@ -115,19 +119,19 @@ Steps 3A/3B/4/5 are the high-effort pipeline; at `--effort low|medium` a single
|
|
|
115
119
|
| Agent 7: Build & Test | Runs build and test commands, reports failures |
|
|
116
120
|
| Agent 8: Diff-specialized finders | 0-2 extra finders written per-review when the diff concentrates in a domain with known failure modes (reconnect logic, module loaders, schedulers, codecs) |
|
|
117
121
|
|
|
118
|
-
The three Correctness agents are **procedural**: each is defined by how it walks the diff (line-by-line / deleted lines / cross-file edges), not by a bug taxonomy — so their coverage is complementary instead of overlapping. The same reasoning splits **code quality into three** (3a/3b/3c): one agent holding a six-item checklist finishes one item — measured on a heavily-rewritten file, one agent holding an eight-item checklist found 1 of 5 defects and the same model split three ways found all 5 — so the quality checklist is cut where the questions genuinely differ. All agents run in parallel (Agent 1 launches 3 procedural variants, Agent 3 launches 3 checklist slices, and Agent 6 launches 3 persona variants concurrently, totaling
|
|
122
|
+
The three Correctness agents are **procedural**: each is defined by how it walks the diff (line-by-line / deleted lines / cross-file edges), not by a bug taxonomy — so their coverage is complementary instead of overlapping. Two further dedicated angles (1d/1e) split the language-pitfall checklist and wrapper/proxy routing out of the line-by-line walk: a checklist pattern-match and a structural routing expectation are different attention modes, and folded into the walk they were diluted by its rhythm. The same reasoning splits **code quality into three** (3a/3b/3c): one agent holding a six-item checklist finishes one item — measured on a heavily-rewritten file, one agent holding an eight-item checklist found 1 of 5 defects and the same model split three ways found all 5 — so the quality checklist is cut where the questions genuinely differ. All agents run in parallel (Agent 1 launches 3 procedural variants and 2 dedicated angles, Agent 3 launches 3 checklist slices, and Agent 6 launches 3 persona variants concurrently, totaling up to 16 parallel tasks for same-repo PR reviews — Agent 1e runs only when the diff signals a wrapping type — plus 0-2 Agent 8 finders when the diff's domain calls for them, so 15-18 in practice; Agent 0 is skipped for local-diff and file-path reviews, which run 14-17; cross-repo lightweight mode also skips Agents 1c and 7, running 13-16).
|
|
119
123
|
|
|
120
124
|
Every finding must state a **failure scenario** — the concrete input, state, or timing that triggers it and the wrong outcome that results (for quality findings, the concrete cost instead). A finding that cannot name its scenario is dropped at the source, and verification re-traces the claimed scenario through the real code rather than judging the finding's prose.
|
|
121
125
|
|
|
122
|
-
Once a PR carries more than 500 lines of **source** change — or more than 3 200 diff lines in total, past which the
|
|
126
|
+
Once a PR carries more than 500 lines of **source** change — or more than 3 200 diff lines in total, past which the fifteen whole-diff readers are each too diluted to read carefully (an attention bound, not a promise of fewer calls — heavy files and specialized finders can make 3B cost more) — this dimension fan-out is replaced by a **territory × dimension** fan-out: the diff is split into ~400-line chunks — boundaries fall on hunk boundaries, and a hunk too large to fit is split only at a top-level declaration, never inside a function — and each chunk gets its own agent that applies every review dimension to that chunk alone.
|
|
123
127
|
|
|
124
|
-
The gate deliberately counts source lines rather than diff lines. Test code, prose and lockfiles dominate diff size — across this repo's last 40 merged PRs the median diff is 41% tests — so a gate on raw size would carve a 173-line production change into territories just because it shipped 489 lines of new tests, leaving that production code with one reviewer instead of
|
|
128
|
+
The gate deliberately counts source lines rather than diff lines. Test code, prose and lockfiles dominate diff size — across this repo's last 40 merged PRs the median diff is 41% tests — so a gate on raw size would carve a 173-line production change into territories just because it shipped 489 lines of new tests, leaving that production code with one reviewer instead of fourteen lenses (the diff-reading dimension agents — sixteen minus Issue Fidelity and Build & Test). Chunking still covers every line either way, tests included; what the gate decides is how many reviewers there are and what each is asked to do. Fourteen diff-reading lenses all walking one large diff read the same early hunks fourteen times over; one agent per chunk means every line of the diff has exactly one accountable reviewer. Each chunk agent returns a `Covered:` receipt, and a chunk with no receipt is re-reviewed before the run proceeds — so "no blockers" can never be reported over code that nobody read.
|
|
125
129
|
|
|
126
130
|
A **source** file that is largely rewritten (an existing file of 300+ lines that is now 40%+ new, or has 800+ changed lines) also gets **three whole-file invariant agents**. Test and generated files never qualify — the checklist asks about fields, timers, and error taxonomies, which a rewritten test file does not have. Its bugs are usually not inside any one hunk but _between_ the new lines — a timer armed near the top of the file and a teardown path two thousand lines below. Each agent reads the whole post-change file and walks two or three items of a fixed checklist: mutable fields cleared on every exit path, timers cancelled on every close (and cancellation not discarding captured data), map inserts matched by deletes, retry counters incremented at every entry, status return values actually checked, error codes exhaustively classified permanent vs transient, config fields honoured on every path, and early returns that skip a required side effect.
|
|
127
131
|
|
|
128
132
|
The checklist is split three ways on purpose. Handing one agent all eight checks over a 2 400-line file gets one of them done properly; three agents with two or three checks each get all of them done. Chunk agents do not substitute for this — on PR #6457 they held every one of these defects inside their assigned territory and reported none. What they lacked was not the lines but the question.
|
|
129
133
|
|
|
130
|
-
Findings are verified in **sharded batches** (at most 8 findings per verification agent, all launched together). A verifier may reject a Critical only by quoting the code that contradicts it (or when the diff's own comments document the flagged behavior as deliberate); anything less certain is downgraded to low confidence rather than deleted — a silently rejected Critical is invisible to every later stage, while a downgraded one still reaches a human. After verification, **iterative reverse audit** hunts for gaps, fanned out one auditor per chunk per round, each with the cumulative finding list. The loop stops after **two consecutive dry rounds** (or at the plan's round cap — reported as such rather than as convergence). That cap follows the diff's topology: **10** on a small diff, where a round is a single auditor; **5** on a chunked one, where it is one auditor per chunk; and **3** on a huge diff (≥ 3000 effective lines) _when the run has a deadline_, because five ~90-minute rounds do not fit a six-hour CI ceiling and a review killed mid-flight posts nothing — with no deadline a huge diff keeps the chunked cap of 5. An operator can lower whichever cap applies for every review with the `review.reverseAuditRounds` setting; it can never raise one. One dry round is not evidence of convergence, and reverse-audit findings are verified like any other.
|
|
134
|
+
Findings are verified in **sharded batches** (at most 8 findings per verification agent, all launched together). A verifier may reject a Critical only by quoting the code that contradicts it (or when the diff's own comments document the flagged behavior as deliberate); anything less certain is downgraded to low confidence rather than deleted — a silently rejected Critical is invisible to every later stage, while a downgraded one still reaches a human. The bar applies to the shape of every rejection: it must be constructible from the code — quote the line the finding misreads, prove the claimed state impossible from a type, constant, or invariant, cite the in-diff guard that covers the trigger, or match a pure-style change with no observable effect — or otherwise match an exclusion criterion — and "too speculative" is never one of them. A finding whose failure scenario names a state the code does not exclude is plausible by default: a concurrency race, nil/undefined on a rare-but-reachable path, a falsy zero or empty collection treated as missing, an off-by-one on an unexcluded boundary, a retry storm or partial failure, a regex or allowlist that lost an anchor. A rejection that constructs none of the four grounds downgrades instead of dropping. After verification, **iterative reverse audit** hunts for gaps, fanned out one auditor per chunk per round, each with the cumulative finding list. The loop stops after **two consecutive dry rounds** (or at the plan's round cap — reported as such rather than as convergence). That cap follows the diff's topology: **10** on a small diff, where a round is a single auditor; **5** on a chunked one, where it is one auditor per chunk; and **3** on a huge diff (≥ 3000 effective lines) _when the run has a deadline_, because five ~90-minute rounds do not fit a six-hour CI ceiling and a review killed mid-flight posts nothing — with no deadline a huge diff keeps the chunked cap of 5. An operator can lower whichever cap applies for every review with the `review.reverseAuditRounds` setting; it can never raise one. One dry round is not evidence of convergence, and reverse-audit findings are verified like any other.
|
|
131
135
|
|
|
132
136
|
## Severity Levels
|
|
133
137
|
|
|
@@ -163,14 +167,14 @@ You can review PRs from other repositories by passing the full URL:
|
|
|
163
167
|
|
|
164
168
|
This runs in **lightweight mode** — no worktree, no build/test. The review is based on the diff text only (fetched via GitHub API). PR comments can still be posted if you have write access.
|
|
165
169
|
|
|
166
|
-
| Capability
|
|
167
|
-
|
|
|
168
|
-
| LLM review (Agents 0, 1a, 1b, 2-6 + verify + iterative reverse audit) | ✅ | ✅ |
|
|
169
|
-
| Agent 1c: Cross-file tracer
|
|
170
|
-
| Agent 7: Build & test
|
|
171
|
-
| Agent 8: Diff-specialized finders (0-2, when the domain calls for it)
|
|
172
|
-
| PR inline comments
|
|
173
|
-
| Incremental review cache
|
|
170
|
+
| Capability | Same-repo | Cross-repo |
|
|
171
|
+
| ----------------------------------------------------------------------------- | --------- | ------------------------------ |
|
|
172
|
+
| LLM review (Agents 0, 1a, 1b, 1d, 1e, 2-6 + verify + iterative reverse audit) | ✅ | ✅ |
|
|
173
|
+
| Agent 1c: Cross-file tracer | ✅ | ❌ (no local codebase to grep) |
|
|
174
|
+
| Agent 7: Build & test | ✅ | ❌ (no local codebase) |
|
|
175
|
+
| Agent 8: Diff-specialized finders (0-2, when the domain calls for it) | ✅ | ✅ (needs only the diff) |
|
|
176
|
+
| PR inline comments | ✅ | ✅ (if you have write access) |
|
|
177
|
+
| Incremental review cache | ✅ | ❌ |
|
|
174
178
|
|
|
175
179
|
## PR Inline Comments
|
|
176
180
|
|
|
@@ -361,7 +365,7 @@ If you switch models (via `/model`) and re-review the same PR, `/review` detects
|
|
|
361
365
|
# → "Previous review used qwen3-coder. Running full review with gpt-4o for a second opinion."
|
|
362
366
|
```
|
|
363
367
|
|
|
364
|
-
The model match also gates incremental scoping, not just the skip: "clean up to the cached commit" is the previous model's verdict, so when new commits have landed since the cached review, a model mismatch never scopes to `lastCommitSha..HEAD` — the range is the full diff, noting "Previous round was reviewed by qwen3-coder. Running full review with gpt-4o." — unless an anchor certified by the model now running is recovered from the last posted review (below), which scopes the range instead. The previous round's findings still carry over to be re-ruled; only the anchor does not. The same gate binds the anchor recovered from the last posted review's machine-ledger marker when the cache is absent or its anchor is unusable (CI, another clone): it scopes the incremental range only if the model now running certified it — a marker certified by a different model, or carrying no model (a review posted with `review.attribution` off, or one from before the field), falls back to the full diff.
|
|
368
|
+
The model match also gates incremental scoping, not just the skip: "clean up to the cached commit" is the previous model's verdict, so when new commits have landed since the cached review, a model mismatch never scopes to `lastCommitSha..HEAD` — the range is the full diff, noting "Previous round was reviewed by qwen3-coder. Running full review with gpt-4o." — unless an anchor certified by the model now running is recovered from the last posted review (below), which scopes the range instead. The previous round's findings still carry over to be re-ruled; only the anchor does not. The same gate binds the anchor recovered from the last posted review's machine-ledger marker when the cache is absent or its anchor is unusable (CI, another clone): it scopes the incremental range only if the model now running certified it — a marker certified by a different model, or carrying no model (a review posted with `review.attribution` off, or one from before the field), falls back to the full diff. A round that did not close cleanly posts its marker without an anchor (it cannot certify a range), but that loss is not sticky when the round's work list survived whole: recovery grafts the anchor forward from the most recent earlier marker your own account posted with one, so a single non-clean round no longer forces every later round to re-read the full diff — the next round scopes `anchor..HEAD`, which re-covers the range the non-clean round could not certify. A size-capped round's graft is refused (dropped findings would fall outside the grafted scope and retire silently), so later rounds keep re-reading the full diff until a complete marker lands.
|
|
365
369
|
|
|
366
370
|
Cache is stored in `.qwen/review-cache/` and tracks both the commit SHA and model ID. Make sure this directory is in your `.gitignore` (a broader rule like `.qwen/*` also works). On GitHub, if the cached commit was rebased or force-pushed away, it falls back to a full review; Aone rules the cached anchor differently — see its paragraph below. Only high-effort reviews consult or write the cache — a `--effort low|medium` quick pass never counts as "already reviewed".
|
|
367
371
|
|
|
@@ -382,7 +386,7 @@ The deterministic halves of the pipeline — argument parsing (`qwen review pars
|
|
|
382
386
|
|
|
383
387
|
**GitHub Enterprise:** reviewing a PR URL on a non-`github.com` host routes every GitHub call at that host — the review subcommands (`match-remote`, `meta`, `fetch-pr`, `pr-context`, `comment-status`, `issue-context`, `fetch-diff`, `comment-body`, `plan-diff`, `test-plan`, `presubmit`, `compose-review`, `submit`, `publish-assets`) accept `--host` and set it in code, so a forgotten host cannot silently retarget the review at `github.com`.
|
|
384
388
|
|
|
385
|
-
**Aone Code:** for a clone whose origin is on `gitlab.alibaba-inc.com`, run `/review` from inside that clone — the platform is detected from the remote and the subcommands work, backed by the `a1` CLI (at least 0.1.90 — an older install is refused at authentication time with an upgrade message) — the target number is the global MR id. `fetch-pr` fetches `refs/merge-requests/<id>/head` and builds the worktree + diff, so the agent review of the worktree is unchanged, and `test-plan` works too — it reads the MR description through the same reader.
|
|
389
|
+
**Aone Code:** for a clone whose origin is on `gitlab.alibaba-inc.com`, run `/review` from inside that clone — the platform is detected from the remote and the subcommands work, backed by the `a1` CLI (at least 0.1.90 — an older install is refused at authentication time with an upgrade message) — the target number is the global MR id. `fetch-pr` fetches `refs/merge-requests/<id>/head` and builds the worktree + diff, so the agent review of the worktree is unchanged, and `test-plan` works too — it reads the MR description through the same reader. `pr-context` is backed too: it reads the MR's metadata, discussion threads, and previously posted qwen summaries (the machine ledger recovers from them), so an Aone run sees the MR's existing discussion exactly as a GitHub run sees a PR's. `comment-status` and `presubmit` are a1-backed too (presubmit fully: self-PR detection, head drift, merge-gate CI, and existing-comment dedup), so repeat `--comment` rounds dedup against the MR's existing comments instead of re-posting them (a thread the platform marks outdated — its line no longer maps after an amend — stays re-postable), and self-PR detection works too. The `publish-assets` write is skipped. `--comment` **posts** the review through the `a1` CLI: one comment per inline finding, then the summary comment. Aone has no native request-changes state — on that verdict the summary comment carries a blocking header, and any inline Criticals that were actually posted block the merge through the discussion gate while their discussions stay unresolved (when no inline Critical posted, the header is advisory and nothing mechanically blocks the merge). The posted comments carry no AI-comment flag — `a1` cannot set one — so a repo's dedicated `ai_comment` merge gate does not track them. The native `a1 repo mr approve` fires for an Approve verdict when the run read the MR's context (the same gate as GitHub; a context-unavailable run stays capped at Comment). Incremental re-review follows the AGit-Flow update model: an update AMENDS the single CR commit in place, orphaning the head the previous round reviewed — so the cached anchor is ruled WITHOUT ancestry (the anchor-behind-head test would fail for every update), and the re-review scopes the PR's own diff to the files the update touched instead of falling back to a full review; an update that also rebased onto newer master keeps that scope only while the rebase's drift stays within the CR's files — drift touching any other file falls back to the full review, and no drift byte enters the published scope either way. See `docs/design/2026-08-15-review-aone-provider.md`.
|
|
386
390
|
|
|
387
391
|
Every run ends with one machine-readable line (`Review complete: <target> — <disposition>`), so scripts and CI wrappers can detect completion and outcome with a single `^Review complete: ` match.
|
|
388
392
|
|
|
@@ -446,10 +450,10 @@ The high-effort pipeline bounds each stage (shard size, audit rounds), but total
|
|
|
446
450
|
|
|
447
451
|
| Stage | LLM calls | Notes |
|
|
448
452
|
| -------------------------------- | ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
449
|
-
| Review agents (Step 3) |
|
|
453
|
+
| Review agents (Step 3) | 16 (+0-2) | Run in parallel; Agent 1e only when the diff signals a wrapping type (15 without it); cross-repo skips Agents 1c and 7 (14), local/file skips Agent 0 (15) |
|
|
450
454
|
| Sharded verification (Step 4) | ceil(F/8) | F = findings; at most 8 per verification agent, launched together |
|
|
451
455
|
| Iterative reverse audit (Step 5) | 2-10 (3A); rounds × chunks (3B) | Two consecutive dry rounds to stop; the cap follows the topology — 10 on a small diff, 5 on a chunked one, 3 on a huge one when the run has a deadline. 3B fans out one auditor per chunk per round |
|
|
452
|
-
| **Total** | **~
|
|
456
|
+
| **Total** | **~19-30 (~17-29)** | 3A same-repo: ~19-30 (typical ~19-21); cross-repo or local/file: ~17-29; one fewer when Agent 1e is not rostered; 3B scales with chunks (see DESIGN.md) |
|
|
453
457
|
|
|
454
458
|
Most PRs converge to the lower end of the range; the caps prevent runaway cost on pathological cases. At `--effort low` the review runs entirely inline — **0 subagent calls** — walking the diff once per angle instead of once in total.
|
|
455
459
|
|
|
@@ -101,7 +101,7 @@ Commands for managing AI tools and models.
|
|
|
101
101
|
| `/model --voice` | Set the model used for voice transcription | `/model --voice <model-id>` |
|
|
102
102
|
| `/model --vision` | Set the vision-bridge model used to transcribe images for a text-only main model | `/model --vision <model-id>` |
|
|
103
103
|
| `/model --compaction` | Set the model used for chat compression | `/model --compaction <model-id>`, `/model --compaction clear` |
|
|
104
|
-
| `/model --image` | Set an image-
|
|
104
|
+
| `/model --image` | Set an image-generation-capable model for the built-in image generation tool | `/model --image <model-id>` |
|
|
105
105
|
| `/effort` | Set reasoning effort for thinking-capable models | `/effort` (opens picker), `/effort high` (low/medium/high/xhigh/max; mapped & clamped per provider) |
|
|
106
106
|
| `/extensions` | Manage extensions | `/extensions list`, `/extensions manage` |
|
|
107
107
|
| → `list` | List installed extensions | `/extensions list` |
|
|
@@ -133,7 +133,7 @@ Commands for managing AI tools and models.
|
|
|
133
133
|
|
|
134
134
|
> [!note]
|
|
135
135
|
>
|
|
136
|
-
> `/workflows`, `/lsp`, and `/trust` are registered only when their feature is enabled — via the `QWEN_CODE_ENABLE_WORKFLOWS=1` env var, the `--experimental-lsp` CLI flag, and the `security.folderTrust.enabled` setting respectively. When disabled
|
|
136
|
+
> `/workflows`, `/lsp`, and `/trust` are registered only when their feature is enabled — via the user/system-scoped `tools.workflowsEnabled` setting or `QWEN_CODE_ENABLE_WORKFLOWS=1` env var, the `--experimental-lsp` CLI flag, and the `security.folderTrust.enabled` setting respectively. Workspace values for `tools.workflowsEnabled` are ignored. When disabled these commands won't appear and will report an unknown command. Similarly, `/dream` and `/forget` are registered only when managed auto-memory is available; without it they won't appear.
|
|
137
137
|
|
|
138
138
|
### 1.5 Built-in Skills
|
|
139
139
|
|
|
@@ -1,77 +1,83 @@
|
|
|
1
1
|
# Computer Use
|
|
2
2
|
|
|
3
|
-
Qwen Code
|
|
3
|
+
Qwen Code includes a `computer-use` skill that teaches the model how to
|
|
4
|
+
operate desktop applications through two separately installed packages:
|
|
5
|
+
|
|
6
|
+
```text
|
|
7
|
+
bundled computer-use skill
|
|
8
|
+
-> @qwen-code/node-repl-mcp
|
|
9
|
+
-> @qwen-code/cua-sdk/computer-use
|
|
10
|
+
-> native cua-driver accessibility backend
|
|
11
|
+
```
|
|
4
12
|
|
|
5
|
-
|
|
13
|
+
Qwen Code does not bundle the MCP server, SDK, or native driver. The skill
|
|
14
|
+
installs the external packages automatically when they are missing.
|
|
6
15
|
|
|
7
16
|
> [!warning]
|
|
8
17
|
>
|
|
9
|
-
> Computer Use
|
|
18
|
+
> Computer Use can read application UI and control mouse and keyboard input.
|
|
19
|
+
> Use it only in trusted environments and review MCP approvals carefully.
|
|
10
20
|
|
|
11
|
-
##
|
|
21
|
+
## Automatic setup
|
|
12
22
|
|
|
13
|
-
|
|
23
|
+
Node.js 22 or later and npm are required.
|
|
14
24
|
|
|
15
|
-
|
|
25
|
+
When first used, the skill runs these commands itself:
|
|
16
26
|
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
"computerUse": {
|
|
21
|
-
"enabled": false,
|
|
22
|
-
},
|
|
23
|
-
},
|
|
24
|
-
}
|
|
27
|
+
```bash
|
|
28
|
+
qwen mcp add --scope user node-repl npx -y @qwen-code/node-repl-mcp@0.1.0
|
|
29
|
+
npm install --no-save --package-lock=false @qwen-code/cua-sdk@0.20.0
|
|
25
30
|
```
|
|
26
31
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
## First run and the native driver
|
|
30
|
-
|
|
31
|
-
The first time the agent invokes a Computer Use tool, Qwen Code downloads a pinned, signed `cua-driver` binary (~20 MB) into `~/.qwen/computer-use/` and spawns it as a local process. Prebuilt binaries are published for macOS (Apple Silicon and Intel), Linux (x86_64), and Windows (x86_64).
|
|
32
|
-
|
|
33
|
-
### macOS permissions
|
|
34
|
-
|
|
35
|
-
On macOS, desktop automation requires two system permissions:
|
|
32
|
+
Restart Qwen Code after the MCP server is first added. The skill then resumes
|
|
33
|
+
the desktop task through `node_repl`.
|
|
36
34
|
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
The SDK installation leaves `package.json` and the lockfile unchanged, but it
|
|
36
|
+
does write to the workspace's `node_modules`. Its postinstall downloads and
|
|
37
|
+
verifies the native payload for the current platform.
|
|
39
38
|
|
|
40
|
-
|
|
39
|
+
Removing the MCP configuration or workspace SDK installation disables the
|
|
40
|
+
execution path; there is no legacy fallback.
|
|
41
41
|
|
|
42
|
-
##
|
|
42
|
+
## Use
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
Ask Qwen Code to use `$computer-use` for the desktop task. After bootstrap, it
|
|
45
|
+
follows the standard Computer Use workflow:
|
|
45
46
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
| Browser pages | `page` (execute JavaScript, read text, query the DOM, click elements) |
|
|
53
|
-
| Screenshots | `get_window_state` (captures a PNG), `page` |
|
|
54
|
-
| Recording | `start_recording`, `stop_recording`, `replay_trajectory` (record/replay a session) |
|
|
55
|
-
| Sessions | `start_session`, `end_session`, agent-cursor overlay controls |
|
|
47
|
+
1. discovers the exact application and window;
|
|
48
|
+
2. observes full accessibility state;
|
|
49
|
+
3. acts through current semantic element tokens when possible;
|
|
50
|
+
4. fetches fresh state after every mutation;
|
|
51
|
+
5. verifies the requested result; and
|
|
52
|
+
6. closes the SDK client and resets the REPL.
|
|
56
53
|
|
|
57
|
-
|
|
54
|
+
The driver is the only component that computes observation diffs. Model code
|
|
55
|
+
uses the typed SDK methods and does not dispatch arbitrary driver tool names.
|
|
58
56
|
|
|
59
|
-
|
|
57
|
+
## Permissions
|
|
60
58
|
|
|
61
|
-
|
|
59
|
+
The Node REPL is an MCP server that executes model-authored JavaScript with
|
|
60
|
+
ordinary Node.js authority. Its calls follow Qwen Code's normal
|
|
61
|
+
[MCP approval flow](./approval-mode.md). The SDK also enforces native
|
|
62
|
+
authorization.
|
|
62
63
|
|
|
63
|
-
|
|
64
|
+
On macOS, accessibility observation and input require Accessibility permission.
|
|
65
|
+
Screenshots additionally require Screen Recording permission. macOS may
|
|
66
|
+
attribute the grant to the terminal or IDE that launched Qwen Code. Windows and
|
|
67
|
+
Linux use their platform accessibility and input facilities.
|
|
64
68
|
|
|
65
|
-
|
|
66
|
-
| ------------------------------------- | ------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
67
|
-
| `tools.computerUse.enabled` | boolean | `true` | Register the `computer_use__*` tools. When `false`, the driver is never downloaded or spawned. |
|
|
68
|
-
| `tools.computerUse.maxImageDimension` | number | `-1` | Longest-edge pixel cap for screenshots. `-1` keeps the driver's default (1568); `0` disables resizing (full resolution); a positive value caps the longest edge. Lower caps cut vision-token cost. Env override: `QWEN_COMPUTER_USE_MAX_IMAGE_DIMENSION`. |
|
|
69
|
-
| `tools.computerUse.idleTimeoutMs` | number | `300000` | Milliseconds to keep the driver process alive after the last `computer_use__*` call (default 5 minutes). `0` keeps it running until Qwen Code exits. |
|
|
69
|
+
## Troubleshooting
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
- If `node_repl` is still unavailable after automatic setup, restart Qwen Code
|
|
72
|
+
and verify the server with `qwen mcp list`.
|
|
73
|
+
- If the SDK import still fails after automatic setup, confirm Qwen Code is
|
|
74
|
+
running from the workspace where the package was installed.
|
|
75
|
+
- After a timeout, cancellation, reset, or kernel crash, bootstrap the SDK
|
|
76
|
+
client again and request fresh state.
|
|
72
77
|
|
|
73
78
|
## See also
|
|
74
79
|
|
|
75
|
-
- [
|
|
76
|
-
- [
|
|
77
|
-
- [
|
|
80
|
+
- [Skills](./skills.md)
|
|
81
|
+
- [MCP servers](./mcp.md)
|
|
82
|
+
- [Approval Mode](./approval-mode.md)
|
|
83
|
+
- [Sandboxing](./sandbox.md)
|
|
@@ -261,6 +261,28 @@ The existing `timeout` field is **tool-call** timeout (used for each
|
|
|
261
261
|
`discoveryTimeoutMs` — a long-running tool invocation is not a startup
|
|
262
262
|
pathology.
|
|
263
263
|
|
|
264
|
+
### Automatic stdio negotiation
|
|
265
|
+
|
|
266
|
+
Stdio servers use the single-process legacy initialize flow by default. To
|
|
267
|
+
connect to a modern-only stdio server, opt into automatic protocol negotiation:
|
|
268
|
+
|
|
269
|
+
```jsonc
|
|
270
|
+
{
|
|
271
|
+
"mcpServers": {
|
|
272
|
+
"modern-server": {
|
|
273
|
+
"command": "node",
|
|
274
|
+
"args": ["./server.js"],
|
|
275
|
+
"versionNegotiation": "auto",
|
|
276
|
+
},
|
|
277
|
+
},
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
Automatic negotiation runs a short-lived copy of the configured server before
|
|
282
|
+
starting the session process and can use up to five seconds of the discovery
|
|
283
|
+
budget. Keep the default legacy policy for servers with non-idempotent startup
|
|
284
|
+
side effects, single-owner locks or PID files, or slow initialize handshakes.
|
|
285
|
+
|
|
264
286
|
### Rolling back progressive MCP
|
|
265
287
|
|
|
266
288
|
If you need the old synchronous behavior (cli waits for every MCP server
|
|
@@ -454,18 +476,19 @@ Required (one of the following):
|
|
|
454
476
|
|
|
455
477
|
Optional:
|
|
456
478
|
|
|
457
|
-
| Property | Type/Default
|
|
458
|
-
| ---------------------- |
|
|
459
|
-
| `args` | array
|
|
460
|
-
| `headers` | object
|
|
461
|
-
| `env` | object
|
|
462
|
-
| `cwd` | string
|
|
463
|
-
| `timeout` | number<br>(default: 600,000)
|
|
464
|
-
| `
|
|
465
|
-
| `
|
|
466
|
-
| `
|
|
467
|
-
| `
|
|
468
|
-
| `
|
|
479
|
+
| Property | Type/Default | Description |
|
|
480
|
+
| ---------------------- | --------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
481
|
+
| `args` | array | Command-line arguments for Stdio transport |
|
|
482
|
+
| `headers` | object | Custom HTTP headers when using `url` or `httpUrl` |
|
|
483
|
+
| `env` | object | Environment variables for the server process. Values can reference environment variables using `$VAR_NAME` or `${VAR_NAME}` syntax |
|
|
484
|
+
| `cwd` | string | Working directory for Stdio transport |
|
|
485
|
+
| `timeout` | number<br>(default: 600,000) | Request timeout in milliseconds (default: 600,000ms = 10 minutes) |
|
|
486
|
+
| `versionNegotiation` | `"auto" \| "legacy"`<br>(default: `"legacy"`) | For Stdio servers, `"auto"` opts into protocol negotiation on a disposable sibling process. The default `"legacy"` starts only the session process. |
|
|
487
|
+
| `trust` | boolean<br>(default: false) | When `true`, bypasses tool call confirmations for this server in a trusted workspace (default: `false`) |
|
|
488
|
+
| `includeTools` | array | List of tool names to include from this MCP server. When specified, only the tools listed here will be available from this server (allowlist behavior). If not specified, all tools from the server are enabled by default. |
|
|
489
|
+
| `excludeTools` | array | List of tool names to exclude from this MCP server. Tools listed here will not be available to the model, even if they are exposed by the server.<br>Note: `excludeTools` takes precedence over `includeTools` - if a tool is in both lists, it will be excluded. |
|
|
490
|
+
| `targetAudience` | string | The OAuth Client ID allowlisted on the IAP-protected application you are trying to access. Used with `authProviderType: 'service_account_impersonation'`. |
|
|
491
|
+
| `targetServiceAccount` | string | The email address of the Google Cloud Service Account to impersonate. Used with `authProviderType: 'service_account_impersonation'`. |
|
|
469
492
|
|
|
470
493
|
<a id="qwen-mcp-cli"></a>
|
|
471
494
|
|
|
@@ -135,7 +135,7 @@ Use continuation for related follow-up work. Launch a new agent when the task is
|
|
|
135
135
|
|
|
136
136
|
For a named regular subagent, `working_dir` pins the agent to an existing git worktree of the current repository. Relative paths resolve from the current directory, and the worktree must already be registered with git as a linked worktree of this repository.
|
|
137
137
|
|
|
138
|
-
|
|
138
|
+
`working_dir` cannot be combined with `subagent_type: "fork"`. An unnamed caller-owned `working_dir` launch runs in the foreground because Qwen Code does not own that worktree's lifecycle: an explicit `run_in_background: true` request is rejected, while a configured background default (`background: true` in a subagent definition) is rejected at the top level and downgraded to the foreground when nested. If both `working_dir` and `isolation: "worktree"` are supplied, Qwen Code reuses the caller-owned worktree instead of creating another one. Workflow scripts are deliberately stricter: a workflow `agent()` call that receives both `workingDir` and `isolation` is rejected rather than run with `isolation` ignored.
|
|
139
139
|
|
|
140
140
|
## Getting Started
|
|
141
141
|
|
|
@@ -182,7 +182,7 @@ The `agent` tool accepts an optional `isolation: "worktree"` parameter. When set
|
|
|
182
182
|
Two constraints:
|
|
183
183
|
|
|
184
184
|
- `isolation: "worktree"` requires a non-fork `subagent_type` — forked sub-agents (`subagent_type: "fork"`) reuse the parent's full conversation context, so isolating them would split intent from working tree.
|
|
185
|
-
- Agents using `isolation: "worktree"` follow the default background behavior; the cleanup runs when the agent reports completion. Set `run_in_background: false` for an inline result.
|
|
185
|
+
- Agents using `isolation: "worktree"` follow the default background behavior; the cleanup runs when the agent reports completion. Set `run_in_background: false` for an inline result. Unnamed caller-owned `working_dir` launches run in the foreground; explicit background execution is rejected, while configured background execution (`background: true` in a subagent definition) is rejected at the top level and downgraded to a foreground run when nested because their lifecycle is managed externally.
|
|
186
186
|
|
|
187
187
|
### Automatic Stale Cleanup
|
|
188
188
|
|
|
@@ -40,7 +40,7 @@ cd your-project
|
|
|
40
40
|
qwen
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
-
On first launch you'll be prompted to connect a model provider. The menu offers **Alibaba ModelStudio** (Coding Plan, Token Plan, or Standard API Key), **Third-party Providers** (built-in providers such as DeepSeek, MiniMax, Z.AI, and OpenRouter, connected with an API key), and **Custom Provider** (a local server, proxy, or unsupported provider). For the [Alibaba Cloud Coding Plan](https://bailian.console.aliyun.com/cn-beijing/?tab=coding-plan#/efm/coding-plan-index) ([intl](https://modelstudio.console.alibabacloud.com/?tab=coding-plan#/efm/coding-plan-index)), choose **Alibaba ModelStudio → Coding Plan**; to use a ModelStudio API key, choose **Alibaba ModelStudio → Standard API Key** and follow the API setup guide ([Beijing](https://bailian.console.aliyun.com/cn-beijing/?tab=doc#/doc/?type=model&url=3023091) / [intl](https://modelstudio.console.alibabacloud.com/ap-southeast-1?tab=doc#/doc/?type=model&url=2974721)). Then let's start with understanding your codebase. Try one of these commands:
|
|
43
|
+
On first launch you'll be prompted to connect a model provider. The menu offers **Alibaba ModelStudio** (Coding Plan, Token Plan, or Standard API Key), **Third-party Providers** (built-in providers such as DeepSeek, MiniMax, Z.AI, Kimi, and OpenRouter, connected with an API key), and **Custom Provider** (a local server, proxy, or unsupported provider). For the [Alibaba Cloud Coding Plan](https://bailian.console.aliyun.com/cn-beijing/?tab=coding-plan#/efm/coding-plan-index) ([intl](https://modelstudio.console.alibabacloud.com/?tab=coding-plan#/efm/coding-plan-index)), choose **Alibaba ModelStudio → Coding Plan**; to use a ModelStudio API key, choose **Alibaba ModelStudio → Standard API Key** and follow the API setup guide ([Beijing](https://bailian.console.aliyun.com/cn-beijing/?tab=doc#/doc/?type=model&url=3023091) / [intl](https://modelstudio.console.alibabacloud.com/ap-southeast-1?tab=doc#/doc/?type=model&url=2974721)). Then let's start with understanding your codebase. Try one of these commands:
|
|
44
44
|
|
|
45
45
|
```
|
|
46
46
|
what does this project do?
|
|
@@ -72,7 +72,7 @@ The first-run menu lets you connect a model provider. Choose one of:
|
|
|
72
72
|
- **Coding Plan**: for individual developers, with an included weekly quota and diverse model options. See the [Coding Plan guide](https://bailian.console.aliyun.com/cn-beijing/?tab=coding-plan#/efm/coding-plan-index) ([intl](https://modelstudio.console.alibabacloud.com/?tab=coding-plan#/efm/coding-plan-index)) for setup instructions.
|
|
73
73
|
- **Token Plan**: usage-based billing with a dedicated endpoint, aimed at teams and companies.
|
|
74
74
|
- **Standard API Key**: connect with an existing API key from Alibaba Cloud ModelStudio ([Beijing](https://bailian.console.aliyun.com/) / [intl](https://modelstudio.console.alibabacloud.com/)). See the API setup guide ([Beijing](https://bailian.console.aliyun.com/cn-beijing/?tab=doc#/doc/?type=model&url=3023091) / [intl](https://modelstudio.console.alibabacloud.com/ap-southeast-1?tab=doc#/doc/?type=model&url=2974721)) for details.
|
|
75
|
-
- **Third-party Providers** — choose a built-in provider (DeepSeek, MiniMax, Z.AI, ModelScope, OpenRouter, Requesty, and more) and connect with an API key.
|
|
75
|
+
- **Third-party Providers** — choose a built-in provider (DeepSeek, Grok, MiniMax, Z.AI, Kimi, Idealab, ModelScope, OpenRouter, Requesty, and more) and connect with an API key.
|
|
76
76
|
- **Custom Provider** — manually connect a local server, proxy, or unsupported provider.
|
|
77
77
|
|
|
78
78
|
> ⚠️ **Note**: Qwen OAuth was discontinued on April 15, 2026. If you were previously using Qwen OAuth, please switch to one of the methods above.
|
|
@@ -68,6 +68,21 @@ The default bind is `127.0.0.1:4170`. Bearer auth is **off** on loopback so loca
|
|
|
68
68
|
|
|
69
69
|
**Open the Web Shell UI.** Browse to `http://127.0.0.1:4170/` (or start the daemon with `qwen serve --open` to launch it automatically) for the full browser terminal — chat, diffs, commit history, tool calls, and permission prompts. The UI is served at the daemon root on the same origin as the API. The rest of this guide uses raw HTTP so you can script against the API directly.
|
|
70
70
|
|
|
71
|
+
For an authenticated single-user launch without manually creating a token, opt in explicitly:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
qwen serve --open-with-auth
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
This loopback-only mode generates a 256-bit bearer token when neither `--token` nor `QWEN_SERVER_TOKEN` supplies one, then gives it to the opened Web Shell as a `#token=` URL fragment. The shell removes the fragment and keeps the credential in that tab's `sessionStorage`; refresh works, but closing the tab or restarting the daemon loses the credential. In CI, SSH, or another environment where auto-open is unavailable, the daemon starts and prints the fragment URL for manual opening. The printed URL is secret-bearing.
|
|
78
|
+
|
|
79
|
+
The flag is default-off, includes the browser-opening behavior, and requires the Web Shell, built Web Shell assets, and a loopback bind. Bare `qwen serve --open` remains token-less on loopback. In authenticated-open mode, normal API routes reject other local clients without the bearer; static Web Shell assets and loopback `/health` keep their existing pre-authentication behavior unless `--require-auth` is also set. For multiple clients or a reopenable Web Shell, use a stable shared token instead:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
export QWEN_SERVER_TOKEN="$(openssl rand -hex 32)"
|
|
83
|
+
qwen serve --open
|
|
84
|
+
```
|
|
85
|
+
|
|
71
86
|
### 2. Sanity-check it
|
|
72
87
|
|
|
73
88
|
```bash
|
|
@@ -113,6 +128,8 @@ This mode is experimental and daemon-managed. It does not replace the standalone
|
|
|
113
128
|
|
|
114
129
|
Runtime control is exposed as `GET`, `PUT`, and `DELETE /workspace/channel`; SDK helpers are `getChannelWorkerControl()`, `setChannelWorkerSelection()`, and `stopChannelWorker()`. PUT/DELETE/reload use the strict mutation gate, so the daemon must have a bearer token configured. Runtime selections are deliberately ephemeral: PUT does not edit settings or the boot options, and a restart returns to the `qwen serve --channel` selection (or disabled when that flag is omitted). Named selections are trimmed and deduplicated in first-occurrence order; order is preserved because the first channel can affect shared model selection.
|
|
115
130
|
|
|
131
|
+
Daemon-backed `qwen channel set` and `qwen channel reload`, plus `status` and `stop` with `--daemon-url`, cannot discover a token generated by `--open-with-auth`. Use `QWEN_SERVER_TOKEN` and pass the same value with `--token` to those clients, or omit authenticated-open mode.
|
|
132
|
+
|
|
116
133
|
The daemon reads each channel's settings (tokens, `proxy`, per-channel `model`) when its worker starts. To re-read settings without changing the committed selection, call `POST /workspace/channel/reload` (SDK `client.reloadChannelWorker()`, or `qwen channel reload`). Reload re-resolves workspace ownership and restarts selected workers through the same rollback-safe reconcile path. The `channel_control` capability is present whenever runtime control is wired; `channel_reload` is present only while the manager is enabled. Persisted threads are restored from disk.
|
|
117
134
|
|
|
118
135
|
Each selected channel's `cwd` must resolve to a registered workspace, and channels are grouped by that owning workspace: a single-workspace daemon runs one worker (unchanged from before); a multi-workspace daemon (`--workspace` repeated) runs one worker per workspace that owns a selected channel, each bound to that workspace's cwd, `QWEN_DAEMON_WORKSPACE`, and env overlay. To host a channel in a non-primary workspace, define it in that workspace's own `.qwen/settings.json` (no `cwd` needed) or set an explicit `cwd` equal to the workspace path; a channel defined only in user/system scope with no `cwd` is ambiguous across workspaces and causes a boot error. `--channel all` stays primary-only (it hosts the primary workspace's channels) and cannot be combined with named channels.
|
|
@@ -346,6 +363,8 @@ curl -H "Authorization: Bearer $QWEN_SERVER_TOKEN" http://your-host:4170/capabil
|
|
|
346
363
|
|
|
347
364
|
The token comparison is constant-time (SHA-256 + `crypto.timingSafeEqual`); 401 responses are uniform across "missing header", "wrong scheme", and "wrong token" so a side-channel can't distinguish.
|
|
348
365
|
|
|
366
|
+
`--open-with-auth` is a CLI-owned convenience, not another daemon token source: it selects `--token` when that option is defined (even if blank), otherwise `QWEN_SERVER_TOKEN`, then trims the selected value and generates only if the result is empty. The daemon does not persist the generated value or export it as `QWEN_SERVER_TOKEN`; the existing internal authenticated-child handoff remains unchanged. The Web Shell stores its browser copy only in the receiving tab's `sessionStorage`; this mode adds no cross-tab or external-client credential discovery mechanism. The token is not independently revocable or tied to a client identity. Possession grants the same daemon authority as any other bearer token. See the [authenticated Web Shell launch design](../design/2026-08-22-serve-open-with-auth.md) and related future work in [#4514](https://github.com/QwenLM/qwen-code/issues/4514).
|
|
367
|
+
|
|
349
368
|
## HTTPS / TLS (for mobile / cross-device access)
|
|
350
369
|
|
|
351
370
|
By default the daemon serves plain HTTP. That's fine on `localhost`, but a phone or tablet hitting a LAN IP (`https://192.168.x.x:4170`) is **not** a [secure context](https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts) over `http://` — so browsers block `getUserMedia` (voice input), WebRTC, and other secure-context-only APIs. Pass `--tls-cert` + `--tls-key` to serve the Web Shell over HTTPS and unlock them:
|
|
@@ -377,6 +396,8 @@ Notes:
|
|
|
377
396
|
- **Both flags or neither** — boot fails if only one is given (a cert with no key can't start an HTTPS listener).
|
|
378
397
|
- **TLS is orthogonal to auth** — HTTPS encrypts the transport; the bearer token still gates every API route. Non-loopback binds require a token with or without TLS.
|
|
379
398
|
- **Scope is TLS termination only** — no auto-generation, no ACME / Let's Encrypt. This is a LAN / dev convenience; for internet-facing deployments terminate TLS at a reverse proxy (see the threat model below).
|
|
399
|
+
- **Channel workers dial the daemon back over `https://`** — so they need to trust the serving certificate too. A self-signed cert (or a fullchain that carries its own root) needs nothing: the daemon injects it into each worker's `NODE_EXTRA_CA_CERTS`. The mkcert flow above is **CA-issued**, so the leaf alone cannot anchor the chain — export `NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem"` in the daemon's launch environment before starting with `--channel`. An operator-set value is _merged_ with the daemon cert, not replaced. Without it the daemon boots green while every channel worker restart-loops on `UNABLE_TO_VERIFY_LEAF_SIGNATURE`; the daemon log names the gap at boot.
|
|
400
|
+
- **Rotating `--tls-cert` in place needs a daemon restart** — the daemon serves the bytes it read at boot, so until it restarts, respawned workers can load newer contents than the daemon presents and their handshakes fail.
|
|
380
401
|
|
|
381
402
|
## CLI flags
|
|
382
403
|
|
|
@@ -415,6 +436,7 @@ Notes:
|
|
|
415
436
|
| `--allow-origin <pat>` | — | T2.4 ([#4514](https://github.com/QwenLM/qwen-code/issues/4514)). Cross-origin allowlist for browser webui clients. Repeatable. Each value is `*` (any origin — boot refuses if no bearer token is configured; `--require-auth` on loopback is recommended so `/health` is also bearer-gated, since it is pre-auth on loopback by default; the Web Shell static assets stay pre-auth in every mode, so pass `--no-web` to remove them) or a canonical URL origin (`<scheme>://<host>[:<port>]`, no trailing slash / path / userinfo / query). **Subdomain wildcards (`https://*.example.com`) are intentionally unsupported** — list each subdomain explicitly, or use `*` with a configured token (and `--require-auth` for full hardening). Matched origins receive CORS response headers (`Access-Control-Allow-Origin`, `Vary: Origin`, methods, headers, max-age, and exposed `Retry-After`); unmatched origins still get a 403 with the same envelope as today's wall. `Origin: null` (sandboxed iframes, file:// docs) is always rejected, even under `*`. Pre-flight via `caps.features.allow_origin`. Loopback self-origin hits are unaffected. |
|
|
416
437
|
| `--web` / `--no-web` | `true` | Serve the built Web Shell SPA at the daemon root (`GET /`, `/assets/*`, and `GET /session/<id>` document navigations). These entry points are registered **before** the bearer-auth gate — a browser can't attach a token to a `<script>` subresource or an address-bar navigation, and the shell carries no secrets. Every API route stays token-gated regardless, and the SPA deep-link fallback for all other paths sits behind the bearer gate too. On non-loopback binds a one-line stderr warning notes the UI is reachable without auth. Use `--no-web` for an API-only daemon. No effect when the build omits the Web Shell assets (the daemon logs a breadcrumb and runs API-only). |
|
|
417
438
|
| `--open` | `false` | After the listener is up, open the Web Shell in your default browser at the daemon URL (with `#token=` appended as a URL fragment when a token is configured — a fragment is never sent to the server, keeping the token out of access logs and Referer headers). No-op with `--no-web`, or in headless / CI / SSH environments where no browser is available. |
|
|
439
|
+
| `--open-with-auth` | `false` | Open the Web Shell with bearer authentication on loopback. Requires an enabled Web Shell and built assets. Reuses a configured token or generates a process-lifetime 256-bit bearer and delivers it in the Web Shell fragment. Browser-ineligible environments print the secret-bearing manual URL. Other clients need the same explicitly configured shared token instead. |
|
|
418
440
|
|
|
419
441
|
> **Memory project scope caveats.**
|
|
420
442
|
>
|
|
@@ -659,14 +681,15 @@ provider decision with their normal tool policy and isolation boundary.
|
|
|
659
681
|
|
|
660
682
|
### Deadlines and writer idle timeout
|
|
661
683
|
|
|
662
|
-
Issue [#4514](https://github.com/QwenLM/qwen-code/issues/4514) T2.9 ships two opt-in flags that close the long-running / remote-deployment gaps the 15s heartbeat + AbortSignal don't cover.
|
|
684
|
+
Issue [#4514](https://github.com/QwenLM/qwen-code/issues/4514) T2.9 ships two opt-in flags that close the long-running / remote-deployment gaps the 15s heartbeat + AbortSignal don't cover. The shared permission-response timeout is listed here as well. All three are off by default.
|
|
663
685
|
|
|
664
|
-
| Flag
|
|
665
|
-
|
|
|
666
|
-
| `--prompt-deadline-ms <n>`
|
|
667
|
-
| `--writer-idle-timeout-ms <n>`
|
|
686
|
+
| Flag | Env var | Default | What it does |
|
|
687
|
+
| -------------------------------------- | ----------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
688
|
+
| `--prompt-deadline-ms <n>` | `QWEN_SERVE_PROMPT_DEADLINE_MS` | unset | Server-side wallclock cap on a single `POST /session/:id/prompt`. On expiry the daemon aborts the prompt's AbortController and returns HTTP `504` with `{code:"prompt_deadline_exceeded", errorKind:"prompt_deadline_exceeded", deadlineMs:n}`. A per-prompt request body field `deadlineMs` can SHORTEN the effective deadline below the flag but never extend it. Capability tag (conditional): `prompt_absolute_deadline`. |
|
|
689
|
+
| `--writer-idle-timeout-ms <n>` | `QWEN_SERVE_WRITER_IDLE_TIMEOUT_MS` | unset | Per-SSE-connection idle deadline. When no write has SUCCESSFULLY flushed for `n` ms — neither a real event nor the 15s heartbeat — the daemon emits a terminal `client_evicted` frame with `data.reason = 'writer_idle_timeout'` (mirrored on `data.errorKind`) and closes the stream. **Pick a value comfortably above the 15s heartbeat** (e.g. `30000`–`300000`) so legitimate idle streams aren't evicted; values `< 15000` WILL evict otherwise-healthy idle connections before the first heartbeat fires (intentional only for tests / short-lived dev sessions). Capability tag (conditional): `writer_idle_timeout`. |
|
|
690
|
+
| `--permission-response-timeout-ms <n>` | — | `0` | Shared wallclock for ordinary permission and `ask_user_question` responses in daemon mode. `0` or an omitted flag waits indefinitely; a positive integer imposes a deadline on both. Voter cancellation, session cancellation, and daemon shutdown still resolve pending interactions when the timer is disabled. |
|
|
668
691
|
|
|
669
|
-
|
|
692
|
+
The prompt and writer flags accept a positive integer in milliseconds; `0`, `NaN`, non-integer, or negative values are rejected at boot with a clear error message. The permission-response timeout accepts `0` or a positive integer. For the two environment-backed deadlines, explicit `ServeOptions` fields win over env values. SDK consumers should pre-flight the matching capability tag before relying on the prompt and writer behaviors.
|
|
670
693
|
|
|
671
694
|
### New-file mode for agent text writes
|
|
672
695
|
|