@qwen-code/qwen-code 0.19.3-nightly.20260701.a974594d7 → 0.19.4
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/loop/loop-tick-resolver.test.ts +42 -0
- package/bundled/loop/loop-tick-resolver.ts +1 -1
- package/bundled/qc-helper/docs/configuration/auth.md +1 -1
- package/bundled/qc-helper/docs/configuration/settings.md +23 -11
- package/bundled/qc-helper/docs/features/approval-mode.md +3 -0
- package/bundled/qc-helper/docs/features/auto-mode.md +40 -0
- package/bundled/qc-helper/docs/features/channels/overview.md +81 -18
- package/bundled/qc-helper/docs/features/code-review.md +17 -61
- package/bundled/qc-helper/docs/features/commands.md +6 -6
- package/bundled/qc-helper/docs/features/mcp.md +3 -1
- package/bundled/qc-helper/docs/features/scheduled-tasks.md +10 -0
- package/bundled/qc-helper/docs/qwen-serve.md +19 -0
- package/bundled/review/DESIGN.md +21 -26
- package/bundled/review/SKILL.md +45 -129
- package/chunks/{MaxSizedBox-UZHJ73JB.js → MaxSizedBox-ERTNFI22.js} +20 -18
- package/chunks/{StandaloneSessionPicker-GGUIZWCE.js → StandaloneSessionPicker-Y5NGRLRY.js} +32 -29
- package/chunks/{acpAgent-QYZFICEZ.js → acpAgent-UMN6OYTR.js} +473 -187
- package/chunks/{agent-2EN7YNSW.js → agent-56DZU4ZU.js} +17 -15
- package/chunks/{agent-headless-SLTEZ5LV.js → agent-headless-SR7N2IJG.js} +17 -15
- package/chunks/{anthropicContentGenerator-CA3JTAMO.js → anthropicContentGenerator-5OZFO6WQ.js} +1 -1
- package/chunks/{artifact-tool-RM7WINJO.js → artifact-tool-JVZMHA4B.js} +1 -1
- package/chunks/{askUserQuestion-J3P6QAJ7.js → askUserQuestion-CMJZ2F3D.js} +1 -1
- package/chunks/{bridge-HZVAUTMX.js → bridge-AUHNFOUS.js} +23 -21
- package/chunks/channel-worker-supervisor-A74FV522.js +308 -0
- package/chunks/{chunk-N4V4VBP6.js → chunk-2X2JUE47.js} +2 -2
- package/chunks/{chunk-JV7A66DR.js → chunk-4VZH35PN.js} +528 -358
- package/chunks/{chunk-M2U5NM24.js → chunk-54YZOP7P.js} +309 -72
- package/chunks/{chunk-WGY3GIPP.js → chunk-6AQR7732.js} +1 -1
- package/chunks/{chunk-FR3II765.js → chunk-6CIIP6OE.js} +4 -4
- package/chunks/{chunk-IKO44NAT.js → chunk-6TLY5W3B.js} +2 -2
- package/chunks/{chunk-VN4CKYUW.js → chunk-73H73ASU.js} +1 -1
- package/chunks/{chunk-IBEM64M4.js → chunk-75X2VLSH.js} +36 -25
- package/chunks/{chunk-PLQTLKMR.js → chunk-7KPI4LAI.js} +3 -3
- package/chunks/{chunk-NVTRORSK.js → chunk-7VPC7D7O.js} +2 -2
- package/chunks/chunk-AHNXYU4O.js +24 -0
- package/chunks/{chunk-MTJVHQDP.js → chunk-B7KGXIPZ.js} +302 -257
- package/chunks/{chunk-35FH347N.js → chunk-BFG6OZN7.js} +16097 -16236
- package/chunks/{chunk-T44AF4I6.js → chunk-BNJLLAQ7.js} +1 -1
- package/chunks/{chunk-OEY3YAL2.js → chunk-BQNJBEUA.js} +2 -2
- package/chunks/{chunk-Q7TDHJ2G.js → chunk-C2IHHGBZ.js} +10 -10
- package/chunks/chunk-CG7SVARK.js +367 -0
- package/chunks/{chunk-7SP275SH.js → chunk-CS5XYDBO.js} +5 -5
- package/chunks/{chunk-V5YJAUHW.js → chunk-CUGEBAKG.js} +1 -1
- package/chunks/{chunk-FQDMX5IL.js → chunk-D5KISTLW.js} +309 -72
- package/chunks/{chunk-I4MXURND.js → chunk-DQ74W65K.js} +356 -468
- package/chunks/chunk-E5A7LHNN.js +51 -0
- package/chunks/{chunk-3PJXIDKI.js → chunk-E6US47KI.js} +3 -27
- package/chunks/chunk-EDAGQADF.js +21 -0
- package/chunks/{chunk-HUGAEYZR.js → chunk-FNLXLI4I.js} +2 -2
- package/chunks/{chunk-WJAY4WXR.js → chunk-FYKX6XOT.js} +1 -1
- package/chunks/{chunk-CA4ML3VH.js → chunk-G7OQ3RFJ.js} +1 -1
- package/chunks/{chunk-VHRREANT.js → chunk-GICCHL2Q.js} +3 -1
- package/chunks/{chunk-QHHNFG22.js → chunk-GLPV75ES.js} +1 -1
- package/chunks/{chunk-LD2XBG6Z.js → chunk-GO6LNQXT.js} +1 -39
- package/chunks/chunk-HI55Z6PR.js +3523 -0
- package/chunks/{chunk-B5MPZI4K.js → chunk-HJDF3ZVU.js} +2670 -1233
- package/chunks/{chunk-GDIG7TMG.js → chunk-HRZB5CSC.js} +1 -1
- package/chunks/{chunk-LDWTYE33.js → chunk-J3F7X3LW.js} +1 -1
- package/chunks/{chunk-FV4SQ54H.js → chunk-KVPFPC4J.js} +227 -85
- package/chunks/{chunk-Q3JOGB4U.js → chunk-L7QPM2YD.js} +1 -1
- package/chunks/{chunk-4722VFFU.js → chunk-L7VH7HQA.js} +6 -6
- package/chunks/{chunk-HWG4XLD7.js → chunk-LKWAVAB5.js} +1 -1
- package/chunks/{chunk-YCRTJYSQ.js → chunk-MEQWZGK5.js} +1 -1
- package/chunks/{chunk-6FIWYVN4.js → chunk-MKHC4BYZ.js} +30 -5
- package/chunks/{chunk-YCEHOJZJ.js → chunk-MNDTD5E5.js} +65 -38
- package/chunks/{chunk-ZGSV5ORL.js → chunk-MVZXZWGT.js} +809 -759
- package/chunks/chunk-MX2YXRER.js +44 -0
- package/chunks/{chunk-TMILTLP3.js → chunk-ND25GXEU.js} +21 -4
- package/chunks/{chunk-AIBPG5MB.js → chunk-OAFUMTWW.js} +2 -2
- package/chunks/chunk-OJCECIJA.js +238 -0
- package/chunks/{chunk-EUURTJY7.js → chunk-PIYV6COW.js} +1 -1
- package/chunks/{chunk-LXEW6BHF.js → chunk-Q7VHIRDD.js} +1 -1
- package/chunks/{chunk-DBR7PF4B.js → chunk-QAFQLTXG.js} +1 -1
- package/chunks/{chunk-3TK7FSCP.js → chunk-QMIND2AS.js} +3 -3
- package/chunks/{chunk-ESVSWG6Z.js → chunk-QOMAHFYI.js} +1 -1
- package/chunks/{chunk-J37FGIOA.js → chunk-QXPI7FEC.js} +38 -4
- package/chunks/chunk-RM3PGSGL.js +66 -0
- package/chunks/chunk-RNBYOUGV.js +42 -0
- package/chunks/chunk-S5EQPDTM.js +91 -0
- package/chunks/{chunk-GZKQ36JS.js → chunk-SFN4TEHY.js} +4 -4
- package/chunks/{chunk-DHXWNSJA.js → chunk-T22H4V4R.js} +42 -0
- package/chunks/{chunk-LXGWLOCM.js → chunk-TENOUWY2.js} +1 -1
- package/chunks/{chunk-BLAE2TCO.js → chunk-TTFNVEO5.js} +3 -3
- package/chunks/{chunk-FZY7NH37.js → chunk-UANCYOOQ.js} +1 -1
- package/chunks/{chunk-E5I6YSNO.js → chunk-UQFP2FEF.js} +1 -1
- package/chunks/{chunk-3O2BJMFW.js → chunk-UQYOMM6J.js} +4 -4
- package/chunks/{chunk-JERW36RG.js → chunk-UT5JU5DJ.js} +15 -15
- package/chunks/{chunk-DJ25MIU2.js → chunk-VKGG724L.js} +8 -8
- package/chunks/{chunk-G525INVW.js → chunk-W2ZOAX7F.js} +3 -3
- package/chunks/{chunk-HIYUAXBG.js → chunk-W6X4FGWX.js} +1 -1
- package/chunks/{chunk-OE5J6UA7.js → chunk-XCUFHOAD.js} +1 -1
- package/chunks/{chunk-KXVVXAAC.js → chunk-YBDZ63KI.js} +3 -3
- package/chunks/{chunk-Z34RYLRO.js → chunk-ZJP5T7IA.js} +1 -1
- package/chunks/{chunk-NOYV2NXI.js → chunk-ZXCVPMIK.js} +411 -43
- package/chunks/{computer-use-FCNWHVPW.js → computer-use-VWN5HH6A.js} +20 -18
- package/chunks/{contextCommand-FVFMZZEU.js → contextCommand-DFFG5KDJ.js} +19 -17
- package/chunks/{cron-create-IY5NMIHQ.js → cron-create-CSSWJ67I.js} +1 -1
- package/chunks/{cron-delete-OLNEQWKO.js → cron-delete-E56CFQ7A.js} +1 -1
- package/chunks/{cron-list-YAUAUV24.js → cron-list-BKSINY6Y.js} +1 -1
- package/chunks/daemon-5T6IHWJV.js +8430 -0
- package/chunks/{daemon-status-provider-42JEXENZ.js → daemon-status-provider-V5UY7O7J.js} +26 -24
- package/chunks/{dist-4FCNM6KJ.js → dist-2HDL5SHQ.js} +2 -2
- package/chunks/{dist-SU6L7ZNJ.js → dist-B7SSDVWT.js} +3 -3
- package/chunks/{dist-VD7HXTML.js → dist-BL3SL665.js} +1 -1
- package/chunks/{dist-UKPWQJCL.js → dist-TAVAGZU6.js} +37 -13
- package/chunks/{dist-K4XZILIO.js → dist-XBOVZ3R5.js} +26 -5
- package/chunks/{earlyInputCapture-FFFEC6P4.js → earlyInputCapture-VVYU4FDO.js} +17 -15
- package/chunks/{edit-32ILSGZY.js → edit-F35PTMBA.js} +17 -15
- package/chunks/{en-U3LWGSFX.js → en-FZREZFPO.js} +18 -0
- package/chunks/{enter-worktree-XWZKIN6A.js → enter-worktree-3DIW7EGJ.js} +17 -15
- package/chunks/{enterPlanMode-LPFFY7BJ.js → enterPlanMode-QNXT77KP.js} +27 -15
- package/chunks/{errors-UXBPYPI2.js → errors-M53YG76R.js} +19 -17
- package/chunks/{exit-worktree-IBS4UIU7.js → exit-worktree-BSDWNWHZ.js} +17 -15
- package/chunks/{exitPlanMode-JA72YHII.js → exitPlanMode-EL7AY327.js} +41 -23
- package/chunks/{fast-path-7UU67Y2W.js → fast-path-DUCSMUFW.js} +2 -2
- package/chunks/{gemini-GMVKJNMX.js → gemini-F3IERB37.js} +59 -51
- package/chunks/{geminiContentGenerator-7NIFF2L4.js → geminiContentGenerator-6OULAKFQ.js} +1 -1
- package/chunks/{glob-4NJCW5HI.js → glob-ZMLFTD4T.js} +17 -15
- package/chunks/{grep-PAIMLQEL.js → grep-H5X66EI7.js} +17 -15
- package/chunks/{initializer-R6KU4VYM.js → initializer-LEOT2OLH.js} +21 -19
- package/chunks/{list-H7LXAO64.js → list-M3DKXML6.js} +23 -21
- package/chunks/{loadedSettingsAdapter-H27JMTLU.js → loadedSettingsAdapter-OKMQFGGG.js} +21 -19
- package/chunks/{loop-wakeup-Y3OIRQFM.js → loop-wakeup-FPBAVVPR.js} +2 -2
- package/chunks/{ls-TVJEYS7O.js → ls-UGWQXPTY.js} +1 -1
- package/chunks/{lsp-JZSDVR3F.js → lsp-24WV7NXB.js} +1 -1
- package/chunks/{monitor-JSIHDPXP.js → monitor-ARL5P45R.js} +19 -16
- package/chunks/{nonInteractiveCli-Y4CHOETG.js → nonInteractiveCli-NUVLF3YR.js} +53 -45
- package/chunks/{notebook-edit-SHRNL2UM.js → notebook-edit-ANTZ2DDY.js} +17 -15
- package/chunks/{openaiContentGenerator-ORZZ7VFO.js → openaiContentGenerator-TFGMKGHN.js} +6 -6
- package/chunks/pidfile-AWTL4C63.js +72 -0
- package/chunks/{qwenContentGenerator-H643PL2G.js → qwenContentGenerator-6QWAYTWS.js} +18 -16
- package/chunks/{qwenOAuth2-OI2B7PES.js → qwenOAuth2-LWLA6MQG.js} +3 -3
- package/chunks/{read-file-5PRNPTTY.js → read-file-EJY73XQ3.js} +4 -4
- package/chunks/{read-mcp-resource-QTXGKTEV.js → read-mcp-resource-NCBTPP7X.js} +1 -1
- package/chunks/{ripGrep-JIKZMABJ.js → ripGrep-HC4SA6CQ.js} +17 -15
- package/chunks/{run-qwen-serve-PQV7QOHZ.js → run-qwen-serve-AGLZ642J.js} +291 -55
- package/chunks/{scheduler-OS3R5MGU.js → scheduler-TURO7NGY.js} +17 -15
- package/chunks/{send-message-DKGHWSTF.js → send-message-3S2NYS3O.js} +5 -3
- package/chunks/{serve-LVYZDKCZ.js → serve-5DAMOIDW.js} +22 -19
- package/chunks/{server-P4YIH35I.js → server-4AGEK2HC.js} +2268 -1222
- package/chunks/{session-DE4TZBKH.js → session-7ZOQUC4Y.js} +54 -46
- package/chunks/{settings-DFTYMJYF.js → settings-DR4V6L5Y.js} +20 -18
- package/chunks/{shell-3GNQLNV7.js → shell-H5WFKUXH.js} +17 -15
- package/chunks/{skill-NCNG4KKZ.js → skill-ANHU5ZCR.js} +4 -4
- package/chunks/{spawnChannel-DHRIMDVL.js → spawnChannel-VN5LJV7Z.js} +19 -17
- package/chunks/{src-PNZYGM3R.js → src-OVZLTVVM.js} +49 -17
- package/chunks/{startInteractiveUI-P6GZBFQW.js → startInteractiveUI-OA22V32P.js} +11110 -10670
- package/chunks/{syntheticOutput-X7L5HWLN.js → syntheticOutput-SV7GBHZ5.js} +2 -2
- package/chunks/{task-create-AWEUI4GI.js → task-create-W2H2UJCH.js} +6 -5
- package/chunks/{task-list-KZ3VJLDU.js → task-list-THBOPV4G.js} +5 -4
- package/chunks/{task-stop-GUNOZKJ5.js → task-stop-33FVCNCJ.js} +1 -1
- package/chunks/{task-update-Y56GP6DU.js → task-update-LVFQLXEI.js} +6 -5
- package/chunks/{team-create-6JMW3KQK.js → team-create-OYL5CAQO.js} +17 -15
- package/chunks/{team-delete-6AFRGDJY.js → team-delete-NTUQ25UY.js} +5 -4
- package/chunks/{theme-manager-FEHQO22G.js → theme-manager-XCMPF2SI.js} +17 -15
- package/chunks/{todoWrite-JRS6NOEU.js → todoWrite-SEPO2RI3.js} +1 -1
- package/chunks/{tool-search-IXAEKS7J.js → tool-search-YXW55X6Z.js} +29 -5
- package/chunks/{trustedFolders-SJRXNHZE.js → trustedFolders-TEPGM5YL.js} +18 -16
- package/chunks/{validateNonInterActiveAuth-HCH7OBDH.js → validateNonInterActiveAuth-OQIS7WUE.js} +50 -42
- package/chunks/{web-fetch-RELNL37A.js → web-fetch-OE7LHURA.js} +4 -4
- package/chunks/{workflow-M2COBI7R.js → workflow-RTUWORAP.js} +48 -27
- package/chunks/{workspace-providers-status-GOCWYDMK.js → workspace-providers-status-DM2XANVB.js} +23 -21
- package/chunks/{workspace-service-34C7SUBU.js → workspace-service-VKBI2KZD.js} +27 -25
- package/chunks/{write-file-E52WRXZL.js → write-file-WGALQ53L.js} +17 -15
- package/chunks/{zh-TW-LKLBTZHE.js → zh-TW-6GIKXEAN.js} +18 -0
- package/chunks/{zh-F5T4WWZO.js → zh-V3B4TFWL.js} +18 -0
- package/cli.js +6 -6
- package/locales/en.js +30 -0
- package/locales/fr.js +1 -2
- package/locales/ja.js +1 -2
- package/locales/zh-TW.js +29 -0
- package/locales/zh.js +29 -0
- package/node_modules/@qwen-code/audio-capture/package.json +1 -1
- package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-arm64/@qwen-code+audio-capture.node +0 -0
- package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-x64/@qwen-code+audio-capture.node +0 -0
- package/node_modules/@qwen-code/audio-capture/prebuilds/win32-x64/@qwen-code+audio-capture.node +0 -0
- package/package.json +3 -3
- package/web-shell/assets/{arc-C2DILvUl.js → arc-Det5Ccum.js} +1 -1
- package/web-shell/assets/{architectureDiagram-3BPJPVTR-b8gZ2cNw.js → architectureDiagram-3BPJPVTR-DqNWVFpl.js} +1 -1
- package/web-shell/assets/{blockDiagram-GPEHLZMM-BuRpghMj.js → blockDiagram-GPEHLZMM-CYl7tYBi.js} +1 -1
- package/web-shell/assets/{c4Diagram-AAUBKEIU-2ItdhFmE.js → c4Diagram-AAUBKEIU-DaAEi0NQ.js} +1 -1
- package/web-shell/assets/channel-Bm0bFauD.js +1 -0
- package/web-shell/assets/{chunk-2J33WTMH-B1QXa0q3.js → chunk-2J33WTMH-Df2CDEE2.js} +1 -1
- package/web-shell/assets/{chunk-4BX2VUAB-DXfhKlNq.js → chunk-4BX2VUAB-DNBFcyL2.js} +1 -1
- package/web-shell/assets/{chunk-55IACEB6-ClSNjxLo.js → chunk-55IACEB6-BKjF-0HI.js} +1 -1
- package/web-shell/assets/{chunk-727SXJPM-Dsh2wisB.js → chunk-727SXJPM-DYwAwfIM.js} +1 -1
- package/web-shell/assets/{chunk-AQP2D5EJ-C1TkY5AR.js → chunk-AQP2D5EJ-C6FswLqy.js} +1 -1
- package/web-shell/assets/{chunk-FMBD7UC4-CGtN9XR6.js → chunk-FMBD7UC4-DRWAcZSY.js} +1 -1
- package/web-shell/assets/{chunk-ND2GUHAM-BHiPi1SS.js → chunk-ND2GUHAM-AoL16mNR.js} +1 -1
- package/web-shell/assets/{chunk-QZHKN3VN-CzG3I5o1.js → chunk-QZHKN3VN-a8PtLMck.js} +1 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK--NgUfb55.js +1 -0
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2--NgUfb55.js +1 -0
- package/web-shell/assets/{cose-bilkent-S5V4N54A-EgrIoH_K.js → cose-bilkent-S5V4N54A-C4Aeu5qf.js} +1 -1
- package/web-shell/assets/{dagre-BM42HDAG-BUnpdX8S.js → dagre-BM42HDAG-BOulamjo.js} +1 -1
- package/web-shell/assets/{diagram-2AECGRRQ-BlLUCVYu.js → diagram-2AECGRRQ-D1wt2ykO.js} +1 -1
- package/web-shell/assets/{diagram-5GNKFQAL-FG-enmjQ.js → diagram-5GNKFQAL-BRseus-O.js} +1 -1
- package/web-shell/assets/{diagram-KO2AKTUF-BlzmTONk.js → diagram-KO2AKTUF-XSMkNzpZ.js} +1 -1
- package/web-shell/assets/{diagram-LMA3HP47-CoBQ8mIx.js → diagram-LMA3HP47-21KNLqoi.js} +1 -1
- package/web-shell/assets/{diagram-OG6HWLK6-DvxV6sX8.js → diagram-OG6HWLK6-DnUI8F5G.js} +1 -1
- package/web-shell/assets/{erDiagram-TEJ5UH35-Jq1tpAoj.js → erDiagram-TEJ5UH35-BVSOMuM2.js} +1 -1
- package/web-shell/assets/{flowDiagram-I6XJVG4X-CbtYOry5.js → flowDiagram-I6XJVG4X-fYtDPJsW.js} +1 -1
- package/web-shell/assets/{ganttDiagram-6RSMTGT7-ZEn2VEKR.js → ganttDiagram-6RSMTGT7-CmRXosW_.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-PVQCEYII-BZh-LkhJ.js → gitGraphDiagram-PVQCEYII-DPrmySxO.js} +1 -1
- package/web-shell/assets/index-BpKnmyFV.js +717 -0
- package/web-shell/assets/index-fLrtxpOG.css +5 -0
- package/web-shell/assets/{infoDiagram-5YYISTIA-B9HuZygK.js → infoDiagram-5YYISTIA-x3VbEuCV.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-D76cNpYG.js → ishikawaDiagram-YF4QCWOH-SmitHRMC.js} +1 -1
- package/web-shell/assets/{journeyDiagram-JHISSGLW-6bGo7P1t.js → journeyDiagram-JHISSGLW-BxvA551S.js} +1 -1
- package/web-shell/assets/{kanban-definition-UN3LZRKU-DuYyRBvB.js → kanban-definition-UN3LZRKU-DNHC16jY.js} +1 -1
- package/web-shell/assets/{linear-CpdSW1BC.js → linear-CQ6irBL9.js} +1 -1
- package/web-shell/assets/{mermaid.core-s5xbZMMj.js → mermaid.core-DtB6NO1e.js} +72 -72
- package/web-shell/assets/{mindmap-definition-RKZ34NQL-go01fZ2y.js → mindmap-definition-RKZ34NQL-QKMAgV2v.js} +1 -1
- package/web-shell/assets/{pieDiagram-4H26LBE5-BfuZiEHO.js → pieDiagram-4H26LBE5-bvb6dGn6.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-W4KKPZXB-DsoINqV6.js → quadrantDiagram-W4KKPZXB-DLgdlG4D.js} +1 -1
- package/web-shell/assets/{requirementDiagram-4Y6WPE33-B7FU4LiU.js → requirementDiagram-4Y6WPE33-2M9YH4GF.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-5OEKKPKP-BEDjFnGB.js → sankeyDiagram-5OEKKPKP-DzwfclTH.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-3UESZ5HK-gzmmL5tK.js → sequenceDiagram-3UESZ5HK-BvPmTuy2.js} +1 -1
- package/web-shell/assets/{stateDiagram-AJRCARHV-BtHD4IN_.js → stateDiagram-AJRCARHV-BjwUmrJF.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-C4L8zXeL.js +1 -0
- package/web-shell/assets/{timeline-definition-PNZ67QCA-T_8gmMCf.js → timeline-definition-PNZ67QCA-CXzS6qqz.js} +1 -1
- package/web-shell/assets/{vennDiagram-CIIHVFJN-DdjuqnjO.js → vennDiagram-CIIHVFJN-yRSolF5B.js} +1 -1
- package/web-shell/assets/{wardley-L42UT6IY-Cgtrvb37.js → wardley-L42UT6IY-ClLJjHPG.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-YWT4CUSO-BW3f3-yW.js → wardleyDiagram-YWT4CUSO-VIa6t2p2.js} +1 -1
- package/web-shell/assets/{xychartDiagram-2RQKCTM6-BUS9IKkc.js → xychartDiagram-2RQKCTM6-CtmrkezW.js} +1 -1
- package/web-shell/index.html +18 -2
- package/chunks/chunk-2JKEQWDZ.js +0 -1596
- package/chunks/chunk-32MCHZQC.js +0 -73
- package/chunks/chunk-UAKXW3DN.js +0 -30
- package/web-shell/assets/channel-eRvn2UA3.js +0 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-YZNwy1rx.js +0 -1
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-YZNwy1rx.js +0 -1
- package/web-shell/assets/index-5FhE0ORO.css +0 -5
- package/web-shell/assets/index-CDTGmqVm.js +0 -720
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DFy6gLDd.js +0 -1
|
@@ -649,6 +649,48 @@ describe('LoopTickResolver', () => {
|
|
|
649
649
|
}
|
|
650
650
|
});
|
|
651
651
|
|
|
652
|
+
it('homeLoopLabel uses forward slashes for Windows tilde labels under the real home', async () => {
|
|
653
|
+
const prevQwenHome = process.env['QWEN_HOME'];
|
|
654
|
+
delete process.env['QWEN_HOME'];
|
|
655
|
+
vi.resetModules();
|
|
656
|
+
vi.doMock('node:path', async (importActual) => {
|
|
657
|
+
const actual = await importActual<typeof import('node:path')>();
|
|
658
|
+
return {
|
|
659
|
+
...actual.win32,
|
|
660
|
+
default: actual.win32,
|
|
661
|
+
posix: actual.posix,
|
|
662
|
+
win32: actual.win32,
|
|
663
|
+
};
|
|
664
|
+
});
|
|
665
|
+
vi.doMock('node:os', async (importActual) => {
|
|
666
|
+
const actual = await importActual<typeof import('node:os')>();
|
|
667
|
+
return {
|
|
668
|
+
...actual,
|
|
669
|
+
default: { ...actual, homedir: () => 'C:\\Users\\runneradmin' },
|
|
670
|
+
homedir: () => 'C:\\Users\\runneradmin',
|
|
671
|
+
};
|
|
672
|
+
});
|
|
673
|
+
try {
|
|
674
|
+
const { LoopTickResolver: WindowsPathResolver } = await import(
|
|
675
|
+
'./loop-tick-resolver.js'
|
|
676
|
+
);
|
|
677
|
+
const windowsPathResolver = new WindowsPathResolver({
|
|
678
|
+
projectRoot: 'C:\\project',
|
|
679
|
+
homeDir: 'C:\\Users\\runneradmin',
|
|
680
|
+
homeQwenDir: 'C:\\Users\\runneradmin\\.qwen-loop',
|
|
681
|
+
allowProjectFile: () => true,
|
|
682
|
+
});
|
|
683
|
+
|
|
684
|
+
expect(windowsPathResolver.homeLoopLabel()).toBe('~/.qwen-loop/loop.md');
|
|
685
|
+
} finally {
|
|
686
|
+
vi.doUnmock('node:path');
|
|
687
|
+
vi.doUnmock('node:os');
|
|
688
|
+
vi.resetModules();
|
|
689
|
+
if (prevQwenHome === undefined) delete process.env['QWEN_HOME'];
|
|
690
|
+
else process.env['QWEN_HOME'] = prevQwenHome;
|
|
691
|
+
}
|
|
692
|
+
});
|
|
693
|
+
|
|
652
694
|
it('re-expands after delete→recreate even when the recreated content is identical', async () => {
|
|
653
695
|
await writeProject('- same tasks');
|
|
654
696
|
expect((await resolver.resolve('dynamic')).full).toBe(true);
|
|
@@ -276,7 +276,7 @@ export class LoopTickResolver {
|
|
|
276
276
|
|
|
277
277
|
const tildeified = tildeifyPath(homeLoopPath);
|
|
278
278
|
if (tildeified !== homeLoopPath) {
|
|
279
|
-
return tildeified;
|
|
279
|
+
return tildeified.replace(/\\/g, '/');
|
|
280
280
|
}
|
|
281
281
|
// Outside $HOME: tildeifyPath was a no-op. When $QWEN_HOME relocated the
|
|
282
282
|
// global dir (homeQwenDir is its resolved value), report the literal env-var
|
|
@@ -165,7 +165,7 @@ The key concept is **Model Providers** (`modelProviders`): Qwen Code supports mu
|
|
|
165
165
|
|
|
166
166
|
| Protocol | `modelProviders` key | Environment variables | Providers |
|
|
167
167
|
| ----------------- | -------------------- | ---------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
|
|
168
|
-
| OpenAI-compatible | `openai` | `OPENAI_API_KEY`, `OPENAI_BASE_URL`, `OPENAI_MODEL`
|
|
168
|
+
| OpenAI-compatible | `openai` | `OPENAI_API_KEY`, `OPENAI_BASE_URL`, `OPENAI_MODEL` (alias: `QWEN_MODEL`) | OpenAI, Azure OpenAI, OpenRouter, Requesty, ModelScope, Alibaba Cloud, any OpenAI-compatible endpoint |
|
|
169
169
|
| Anthropic | `anthropic` | `ANTHROPIC_API_KEY`, `ANTHROPIC_BASE_URL`, `ANTHROPIC_MODEL` | Anthropic Claude |
|
|
170
170
|
| Google GenAI | `gemini` | `GEMINI_API_KEY`, `GEMINI_MODEL` | Google Gemini |
|
|
171
171
|
| Vertex AI | `vertex-ai` | `GOOGLE_API_KEY`, `GOOGLE_MODEL` (sets `GOOGLE_GENAI_USE_VERTEXAI=true`; uses the `gemini` protocol) | Google Vertex AI |
|
|
@@ -91,6 +91,9 @@ Settings are organized into categories. Most settings should be placed within th
|
|
|
91
91
|
| `general.language` | enum | Language for the user interface. Use `"auto"` to detect from system settings, or a language code (e.g. `"zh-CN"`, `"fr"`). Custom codes can be added by placing JS locale files in `~/.qwen/locales/`. See [i18n](../features/language). Requires restart. | `"auto"` |
|
|
92
92
|
| `general.outputLanguage` | string | Language for model output. Use `"auto"` to detect from system settings, or set a specific language. Requires restart. | `"auto"` |
|
|
93
93
|
| `general.dynamicCommandTranslation` | boolean | Enable AI translation of dynamic slash-command descriptions. When disabled, dynamic commands keep their original descriptions and skip translation model calls. | `false` |
|
|
94
|
+
| `general.terminalBell` | boolean | Play a terminal bell sound when a response completes or needs approval. | `true` |
|
|
95
|
+
| `general.preventSystemSleep` | boolean | Prevent the system from sleeping while Qwen Code is streaming a model response or executing tools. Idle prompt time and permission prompts do not inhibit sleep. Read once at startup, so changes take effect after restart. | `true` |
|
|
96
|
+
| `general.chatRecording` | boolean | Save chat history to disk. Disabling this also prevents `--continue` and `--resume` from working. Requires restart. | `true` |
|
|
94
97
|
|
|
95
98
|
#### output
|
|
96
99
|
|
|
@@ -127,6 +130,12 @@ Settings are organized into categories. Most settings should be placed within th
|
|
|
127
130
|
| `ui.enableFollowupSuggestions` | boolean | Enable [followup suggestions](../features/followup-suggestions) that predict what you want to type next after the model responds. Suggestions appear as placeholder text and are accepted with Tab, Enter, or Right Arrow (which fill the input — they do not auto-submit). On by default; set to `false` to opt out. | `true` |
|
|
128
131
|
| `ui.enableCacheSharing` | boolean | Use cache-aware forked queries for suggestion generation. Reduces cost on providers that support prefix caching (experimental). | `true` |
|
|
129
132
|
| `ui.enableSpeculation` | boolean | Speculatively execute accepted suggestions before submission. Results appear instantly when you accept (experimental). | `false` |
|
|
133
|
+
| `ui.showStatusInTitle` | boolean | Show the Qwen Code session name and status in the terminal window title. | `true` |
|
|
134
|
+
| `ui.disableWorkflowKeywordTrigger` | boolean | When `true`, mentioning the word `workflow` in a prompt no longer softly steers the turn toward the Workflow tool (and the Footer `workflow active` indicator is suppressed). Only applies when workflows are enabled. | `false` |
|
|
135
|
+
| `ui.enableUserFeedback` | boolean | Show an optional feedback dialog after conversations to help improve Qwen performance. | `true` |
|
|
136
|
+
| `ui.compactInline` | boolean | Compact tool display within each group instead of merging across groups. Requires `ui.compactMode` to be enabled. Requires restart. | `false` |
|
|
137
|
+
| `ui.useTerminalBuffer` | boolean | Render conversation history in an in-app scrollable viewport instead of the terminal scrollback buffer. Recommended if you see flicker, scroll-storm, or interface freeze on long sessions. Scroll with `Shift+↑/↓` (line), `PgUp`/`PgDn` (page), `Ctrl+Home/End` (top/bottom), or the mouse wheel. Does not use the host terminal scrollback while enabled; hold `Shift` (or `Option` on macOS) while dragging for native text selection. | `false` |
|
|
138
|
+
| `ui.hideBuiltinWorktreeIndicator` | boolean | Hide the built-in `⎇ worktree-<branch> (<slug>)` line in the Footer. The worktree state is still passed to custom statusline scripts via the stdin payload. Keep at the default unless your custom statusline renders the worktree itself. | `false` |
|
|
130
139
|
|
|
131
140
|
#### ide
|
|
132
141
|
|
|
@@ -278,6 +287,7 @@ If you are experiencing performance issues with file searching (e.g., with `@` c
|
|
|
278
287
|
| `tools.truncateToolOutputLines` | number | Maximum lines or entries kept when truncating tool output. Applies to Shell, Grep, Glob, ReadFile and ReadManyFiles tools. | `1000` | Requires restart: Yes |
|
|
279
288
|
| `tools.computerUse.enabled` | boolean | Enable the built-in Computer Use tools (cua-driver native desktop automation). When `true` (default), the `computer_use__*` tools are registered as deferred built-ins; the first invocation downloads the pinned, signed cua-driver binary into `~/.qwen/computer-use/` and walks through macOS Accessibility / Screen Recording permissions. | `true` | Requires restart: Yes |
|
|
280
289
|
| `tools.computerUse.maxImageDimension` | number | Longest-edge pixel cap applied to cua-driver screenshots (via `set_config`'s `max_image_dimension`). `-1` (default) keeps cua-driver's built-in default (1568); `0` disables resizing (full resolution); a positive value caps the longest edge. Lower caps cut vision-token cost at the expense of fine detail. | `-1` | Requires restart: Yes. Env override: `QWEN_COMPUTER_USE_MAX_IMAGE_DIMENSION` (a non-negative integer; takes precedence over this setting) |
|
|
290
|
+
| `tools.toolSearch.enabled` | boolean | Load MCP tools on demand via ToolSearch to reduce prompt size. Disable this for models that rely on prefix-based KV caching (e.g. DeepSeek) to keep the prompt prefix stable and maximize cache hit rates. | `true` | Requires restart: Yes |
|
|
281
291
|
|
|
282
292
|
> [!note]
|
|
283
293
|
>
|
|
@@ -285,12 +295,14 @@ If you are experiencing performance issues with file searching (e.g., with `@` c
|
|
|
285
295
|
|
|
286
296
|
#### memory
|
|
287
297
|
|
|
288
|
-
| Setting | Type | Description
|
|
289
|
-
| -------------------------------- | ------- |
|
|
290
|
-
| `memory.enableManagedAutoMemory` | boolean | Enable background extraction of memories from conversations.
|
|
291
|
-
| `memory.enableManagedAutoDream` | boolean | Enable automatic consolidation (deduplication and cleanup) of collected memories.
|
|
292
|
-
| `memory.enableAutoSkill` | boolean | Enable background review for reusable project skills after tool-heavy sessions.
|
|
293
|
-
| `memory.autoSkillConfirm` | boolean | Ask for confirmation before auto-generated skills are added to the skill library. When off, auto-skills are saved immediately.
|
|
298
|
+
| Setting | Type | Description | Default |
|
|
299
|
+
| -------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
|
|
300
|
+
| `memory.enableManagedAutoMemory` | boolean | Enable background extraction of memories from conversations. | `true` |
|
|
301
|
+
| `memory.enableManagedAutoDream` | boolean | Enable automatic consolidation (deduplication and cleanup) of collected memories. | `true` |
|
|
302
|
+
| `memory.enableAutoSkill` | boolean | Enable background review for reusable project skills after tool-heavy sessions. | `true` |
|
|
303
|
+
| `memory.autoSkillConfirm` | boolean | Ask for confirmation before auto-generated skills are added to the skill library. When off, auto-skills are saved immediately. | `true` |
|
|
304
|
+
| `memory.enableTeamMemory` | boolean | Enable a project memory tier shared with collaborators via the git-tracked `.qwen/team-memory/` directory. Writes to it are secret-scanned and reviewable in the git diff. | `false` |
|
|
305
|
+
| `memory.enableTeamMemorySync` | boolean | When team memory is enabled, automatically commit, fast-forward-pull, and push the `.qwen/team-memory/` directory at session start so collaborators stay in sync. Requires a configured git upstream. | `false` |
|
|
294
306
|
|
|
295
307
|
See [Memory](../features/memory) for details on how auto-memory works and how to use the `/memory`, `/remember`, and `/dream` commands.
|
|
296
308
|
|
|
@@ -424,11 +436,11 @@ execute when typed.
|
|
|
424
436
|
|
|
425
437
|
#### mcp
|
|
426
438
|
|
|
427
|
-
| Setting | Type | Description
|
|
428
|
-
| ------------------- | ---------------- |
|
|
429
|
-
| `mcp.serverCommand` | string | Command to start an MCP server.
|
|
430
|
-
| `mcp.allowed` | array of strings | An allowlist of MCP servers to allow. Allows you to specify a list of MCP server names that should be made available to the model. This can be used to restrict the set of MCP servers to connect to. Note that this will be ignored if `--allowed-mcp-server-names` is set. | `undefined` |
|
|
431
|
-
| `mcp.excluded` | array of strings | A denylist of MCP servers to exclude. A server listed in both `mcp.excluded` and `mcp.allowed` is excluded. Note that this will be ignored if `--allowed-mcp-server-names` is set.
|
|
439
|
+
| Setting | Type | Description | Default |
|
|
440
|
+
| ------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
|
|
441
|
+
| `mcp.serverCommand` | string | Command to start an MCP server. | `undefined` |
|
|
442
|
+
| `mcp.allowed` | array of strings | An allowlist of MCP servers to allow. Allows you to specify a list of MCP server names that should be made available to the model. This can be used to restrict the set of MCP servers to connect to. Supports glob patterns (`*` matches any sequence, `?` matches a single character — e.g. `"*puppeteer*"`); entries without glob characters are matched exactly. Note that this will be ignored if `--allowed-mcp-server-names` is set. | `undefined` |
|
|
443
|
+
| `mcp.excluded` | array of strings | A denylist of MCP servers to exclude. A server listed in both `mcp.excluded` and `mcp.allowed` is excluded. Supports glob patterns (`*`, `?`) the same way as `mcp.allowed`. Note that this will be ignored if `--allowed-mcp-server-names` is set. | `undefined` |
|
|
432
444
|
|
|
433
445
|
> [!note]
|
|
434
446
|
>
|
|
@@ -300,6 +300,9 @@ reason inline and decide whether to switch to Ask Permissions Mode for that step
|
|
|
300
300
|
"deny": ["Any network call to intranet.example.com"],
|
|
301
301
|
},
|
|
302
302
|
"environment": ["Open-source monorepo; commits are signed"],
|
|
303
|
+
// Optional: route ALL shell commands (including read-only ones like
|
|
304
|
+
// ls, cat) through the classifier for defense-in-depth.
|
|
305
|
+
// "classifyAllShell": true,
|
|
303
306
|
},
|
|
304
307
|
},
|
|
305
308
|
}
|
|
@@ -43,6 +43,14 @@ The classifier uses your configured fast model
|
|
|
43
43
|
(`/model --fast`). If no fast model is configured, the main session
|
|
44
44
|
model is used instead.
|
|
45
45
|
|
|
46
|
+
> [!tip]
|
|
47
|
+
>
|
|
48
|
+
> Shell commands that the permission system detects as read-only (e.g.
|
|
49
|
+
> `ls`, `cat`, `git log`) are auto-approved before reaching the
|
|
50
|
+
> classifier. Set `permissions.autoMode.classifyAllShell: true` to
|
|
51
|
+
> override this and route all shell commands through the classifier —
|
|
52
|
+
> see [Classify all shell commands](#classify-all-shell-commands) below.
|
|
53
|
+
|
|
46
54
|
## Hard rules still win
|
|
47
55
|
|
|
48
56
|
Auto Mode does **not** replace hard permission rules. Before the classifier
|
|
@@ -145,6 +153,38 @@ To keep the classifier system prompt small:
|
|
|
145
153
|
way other permission settings are: arrays are concatenated and
|
|
146
154
|
de-duplicated.
|
|
147
155
|
|
|
156
|
+
### Classify all shell commands
|
|
157
|
+
|
|
158
|
+
By default, read-only shell commands (`ls`, `cat`, `git status`, …) are
|
|
159
|
+
auto-approved without invoking the classifier — the permission system
|
|
160
|
+
detects them as safe at layer 3 and skips the classifier entirely. Set
|
|
161
|
+
`classifyAllShell` to `true` to force **every** shell command through
|
|
162
|
+
the classifier, including read-only ones:
|
|
163
|
+
|
|
164
|
+
```json
|
|
165
|
+
{
|
|
166
|
+
"permissions": {
|
|
167
|
+
"autoMode": {
|
|
168
|
+
"classifyAllShell": true
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
This is useful for production or high-security environments where you
|
|
175
|
+
want defense-in-depth: even seemingly harmless commands are reviewed by
|
|
176
|
+
the classifier before execution. The trade-off is added latency (~300ms
|
|
177
|
+
per read-only shell call) and reliance on classifier availability — if
|
|
178
|
+
the classifier API is unreachable, read-only shell commands will also be
|
|
179
|
+
blocked (fail-closed).
|
|
180
|
+
|
|
181
|
+
> [!note]
|
|
182
|
+
>
|
|
183
|
+
> `classifyAllShell` only affects shell commands (`run_shell_command` and
|
|
184
|
+
> `monitor`). Built-in read-only tools (`read_file`, `grep_search`,
|
|
185
|
+
> `glob`, `list_directory`, etc.) are unaffected and still use the
|
|
186
|
+
> fast-path allowlist.
|
|
187
|
+
|
|
148
188
|
## Reading the decision
|
|
149
189
|
|
|
150
190
|
When the classifier blocks an action, the tool call fails with one of
|
|
@@ -47,24 +47,25 @@ Channels are configured under the `channels` key in `settings.json`. Each channe
|
|
|
47
47
|
|
|
48
48
|
### Options
|
|
49
49
|
|
|
50
|
-
| Option | Required | Description
|
|
51
|
-
| ------------------------ | -------- |
|
|
52
|
-
| `type` | Yes | Channel type: `telegram`, `weixin`, `qq`, `dingtalk`, `feishu`, or a custom type from an extension (see [Plugins](./plugins))
|
|
53
|
-
| `token` | Telegram | Bot token. Supports `$ENV_VAR` syntax to read from environment variables. Not needed for WeChat or DingTalk
|
|
54
|
-
| `clientId` | DingTalk | DingTalk AppKey. Supports `$ENV_VAR` syntax
|
|
55
|
-
| `clientSecret` | DingTalk | DingTalk AppSecret. Supports `$ENV_VAR` syntax
|
|
56
|
-
| `model` | No | Model to use for this channel (e.g., `qwen3.5-plus`). Overrides the default model. Useful for multimodal models that support image input
|
|
57
|
-
| `senderPolicy` | No | Who can talk to the bot: `allowlist` (default), `open`, or `pairing`
|
|
58
|
-
| `allowedUsers` | No | List of user IDs allowed to use the bot (used by `allowlist` and `pairing` policies)
|
|
59
|
-
| `sessionScope` | No | How sessions are scoped: `user` (default), `thread`, or `single`
|
|
60
|
-
| `cwd` | No | Working directory for the agent. Defaults to the current directory
|
|
61
|
-
| `instructions` | No | Custom instructions prepended to the first message of each session
|
|
62
|
-
| `groupPolicy` | No | Group chat access: `disabled` (default), `allowlist`, or `open`. See [Group Chats](#group-chats)
|
|
63
|
-
| `
|
|
64
|
-
| `
|
|
65
|
-
| `
|
|
66
|
-
| `
|
|
67
|
-
| `
|
|
50
|
+
| Option | Required | Description |
|
|
51
|
+
| ------------------------ | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
52
|
+
| `type` | Yes | Channel type: `telegram`, `weixin`, `qq`, `dingtalk`, `feishu`, or a custom type from an extension (see [Plugins](./plugins)) |
|
|
53
|
+
| `token` | Telegram | Bot token. Supports `$ENV_VAR` syntax to read from environment variables. Not needed for WeChat or DingTalk |
|
|
54
|
+
| `clientId` | DingTalk | DingTalk AppKey. Supports `$ENV_VAR` syntax |
|
|
55
|
+
| `clientSecret` | DingTalk | DingTalk AppSecret. Supports `$ENV_VAR` syntax |
|
|
56
|
+
| `model` | No | Model to use for this channel (e.g., `qwen3.5-plus`). Overrides the default model. Useful for multimodal models that support image input |
|
|
57
|
+
| `senderPolicy` | No | Who can talk to the bot: `allowlist` (default), `open`, or `pairing` |
|
|
58
|
+
| `allowedUsers` | No | List of user IDs allowed to use the bot (used by `allowlist` and `pairing` policies) |
|
|
59
|
+
| `sessionScope` | No | How sessions are scoped: `user` (default), `thread`, or `single` |
|
|
60
|
+
| `cwd` | No | Working directory for the agent. Defaults to the current directory |
|
|
61
|
+
| `instructions` | No | Custom instructions prepended to the first message of each session |
|
|
62
|
+
| `groupPolicy` | No | Group chat access: `disabled` (default), `allowlist`, or `open`. See [Group Chats](#group-chats) |
|
|
63
|
+
| `groupHistoryLimit` | No | Opt-in group history backfill. `0` or omitted disables it. A positive number persists that many authorized, unmentioned group messages for the next bot mention/reply. |
|
|
64
|
+
| `groups` | No | Per-group settings. Keys are group chat IDs or `"*"` for defaults. See [Group Chats](#group-chats) |
|
|
65
|
+
| `dispatchMode` | No | What happens when you send a message while the bot is busy: `steer` (default), `collect`, or `followup`. See [Dispatch Modes](#dispatch-modes) |
|
|
66
|
+
| `blockStreaming` | No | Progressive response delivery: `on` or `off` (default). See [Block Streaming](#block-streaming) |
|
|
67
|
+
| `blockStreamingChunk` | No | Chunk size bounds: `{ "minChars": 400, "maxChars": 1000 }`. See [Block Streaming](#block-streaming) |
|
|
68
|
+
| `blockStreamingCoalesce` | No | Idle flush: `{ "idleMs": 1500 }`. See [Block Streaming](#block-streaming) |
|
|
68
69
|
|
|
69
70
|
### Sender Policy
|
|
70
71
|
|
|
@@ -82,6 +83,18 @@ Controls how conversation sessions are managed:
|
|
|
82
83
|
- **`thread`** — One session per thread/topic. Useful for group chats with threads.
|
|
83
84
|
- **`single`** — One shared session for all users. Everyone shares the same conversation.
|
|
84
85
|
|
|
86
|
+
### Channel Memory
|
|
87
|
+
|
|
88
|
+
Channel memory lets an authorized channel member save stable context for one chat or thread. Qwen Code injects that memory when a fresh channel session starts, including after `/clear`.
|
|
89
|
+
|
|
90
|
+
Commands:
|
|
91
|
+
|
|
92
|
+
- `/remember-channel <text>` saves a memory line for the current chat or thread.
|
|
93
|
+
- `/channel-memory` shows saved memory for the current chat or thread.
|
|
94
|
+
- `/forget-channel confirm` clears saved memory for the current chat or thread.
|
|
95
|
+
|
|
96
|
+
Only users listed in `allowedUsers` can read, write, or clear channel memory. If `allowedUsers` is empty, channel memory commands are disabled for everyone.
|
|
97
|
+
|
|
85
98
|
### Token Security
|
|
86
99
|
|
|
87
100
|
Bot tokens should not be stored directly in `settings.json`. Instead, use environment variable references:
|
|
@@ -158,6 +171,38 @@ Configure per-group with the `groups` setting:
|
|
|
158
171
|
- **Group chat ID** — Override settings for a specific group. Overrides `"*"` defaults.
|
|
159
172
|
- **`requireMention`** (default: `true`) — When `true`, the bot only responds to messages that @mention it or reply to one of its messages. When `false`, the bot responds to all messages (useful for dedicated task groups).
|
|
160
173
|
|
|
174
|
+
### Group History Backfill
|
|
175
|
+
|
|
176
|
+
By default, Qwen ignores unmentioned group messages and does not store them as session turns. To let the next `@mention` include recent group context, set `groupHistoryLimit` to a positive number.
|
|
177
|
+
|
|
178
|
+
```json
|
|
179
|
+
{
|
|
180
|
+
"channels": {
|
|
181
|
+
"my-dingtalk": {
|
|
182
|
+
"type": "dingtalk",
|
|
183
|
+
"clientId": "$DINGTALK_CLIENT_ID",
|
|
184
|
+
"clientSecret": "$DINGTALK_CLIENT_SECRET",
|
|
185
|
+
"groupPolicy": "open",
|
|
186
|
+
"groupHistoryLimit": 50,
|
|
187
|
+
"groups": {
|
|
188
|
+
"*": { "requireMention": true },
|
|
189
|
+
"sensitive-group-id": {
|
|
190
|
+
"requireMention": true,
|
|
191
|
+
"groupHistoryLimit": 0
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
- Omitted or `0` disables backfill.
|
|
200
|
+
- Group-level `groupHistoryLimit` overrides the channel-level value.
|
|
201
|
+
- Only messages from authorized senders are persisted.
|
|
202
|
+
- Messages rejected by `groupPolicy` or group allowlist are not persisted.
|
|
203
|
+
- Pending group history is stored as local JSONL under `~/.qwen/channels/<channel-name>-group-history.jsonl` or `$QWEN_HOME/channels/<channel-name>-group-history.jsonl`.
|
|
204
|
+
- Cached messages are injected as untrusted context on the next real trigger and are not written as standalone session turns.
|
|
205
|
+
|
|
161
206
|
### How group messages are evaluated
|
|
162
207
|
|
|
163
208
|
```
|
|
@@ -312,6 +357,24 @@ qwen channel stop
|
|
|
312
357
|
|
|
313
358
|
The bot runs in the foreground. Press `Ctrl+C` to stop, or use `qwen channel stop` from another terminal.
|
|
314
359
|
|
|
360
|
+
### Experimental Daemon-Managed Mode
|
|
361
|
+
|
|
362
|
+
You can also run configured channels under `qwen serve`:
|
|
363
|
+
|
|
364
|
+
```bash
|
|
365
|
+
# Start one channel under the daemon lifecycle
|
|
366
|
+
qwen serve --channel my-channel
|
|
367
|
+
|
|
368
|
+
# Start all configured channels
|
|
369
|
+
qwen serve --channel all
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
This mode starts one channel worker process owned by `qwen serve`. The worker connects back to the daemon through the SDK and uses the same channel adapters. It is separate from the daemon process, so a channel adapter crash does not crash the daemon.
|
|
373
|
+
|
|
374
|
+
`qwen serve --channel` is not the same service as `qwen channel start`. Standalone `qwen channel start` still uses the ACP-backed channel service and can run channel configs with different `cwd` values. Daemon-managed channels require every selected channel's `cwd` to resolve to the daemon workspace.
|
|
375
|
+
|
|
376
|
+
When channels are serve-managed, `qwen channel status` shows the owner as `qwen serve`, and `qwen channel stop` tells you to stop the daemon instead of signaling the worker directly. If a ready worker exits unexpectedly, the daemon continues running and reports a channel-worker warning in `/daemon/status`.
|
|
377
|
+
|
|
315
378
|
### Multi-Channel Mode
|
|
316
379
|
|
|
317
380
|
When you run `qwen channel start` without a name, all channels defined in `settings.json` start together sharing a single agent process. Each channel maintains its own sessions — a Telegram user and a WeChat user get separate conversations, even though they share the same agent.
|
|
@@ -28,8 +28,7 @@ The `/review` command runs a multi-stage pipeline:
|
|
|
28
28
|
```
|
|
29
29
|
Step 1: Determine scope (local diff / PR worktree / file)
|
|
30
30
|
Step 2: Load project review rules
|
|
31
|
-
Step 3:
|
|
32
|
-
Step 4: 9 parallel review agents [9 LLM calls]
|
|
31
|
+
Step 3: 9 parallel review agents [9 LLM calls]
|
|
33
32
|
|-- Agent 1: Correctness
|
|
34
33
|
|-- Agent 2: Security
|
|
35
34
|
|-- Agent 3: Code Quality
|
|
@@ -37,13 +36,12 @@ Step 4: 9 parallel review agents [9 LLM calls]
|
|
|
37
36
|
|-- Agent 5: Test Coverage
|
|
38
37
|
|-- Agent 6: Undirected Audit (3 personas: 6a/6b/6c)
|
|
39
38
|
'-- Agent 7: Build & Test (runs shell commands)
|
|
40
|
-
Step
|
|
41
|
-
Step
|
|
42
|
-
Step
|
|
43
|
-
Step
|
|
44
|
-
Step
|
|
45
|
-
Step
|
|
46
|
-
Step 11: Clean up (remove worktree + temp files)
|
|
39
|
+
Step 4: Deduplicate --> Batch verify --> Aggregate [1 LLM call]
|
|
40
|
+
Step 5: Iterative reverse audit (1-3 rounds, gap finding) [1-3 LLM calls]
|
|
41
|
+
Step 6: Present findings + verdict
|
|
42
|
+
Step 7: Submit PR review (inline comments, if requested)
|
|
43
|
+
Step 8: Save report + incremental cache
|
|
44
|
+
Step 9: Clean up (remove worktree + temp files)
|
|
47
45
|
```
|
|
48
46
|
|
|
49
47
|
### Review Agents
|
|
@@ -60,29 +58,6 @@ Step 11: Clean up (remove worktree + temp files)
|
|
|
60
58
|
|
|
61
59
|
All agents run in parallel (Agent 6 launches 3 persona variants concurrently, totaling 9 parallel tasks for same-repo reviews). Findings from Agents 1-6 are verified in a **single batch verification pass** (one agent reviews all findings at once, keeping verification cost fixed regardless of finding count). After verification, **iterative reverse audit** runs 1-3 rounds of gap-finding — each round receives the cumulative finding list from prior rounds, so successive rounds focus on whatever's left undiscovered. The loop stops as soon as a round returns "No issues found", or after 3 rounds (hard cap). Reverse audit findings skip verification (the agent already has full context) and are included as high-confidence results.
|
|
62
60
|
|
|
63
|
-
## Deterministic Analysis
|
|
64
|
-
|
|
65
|
-
Before the LLM agents run, `/review` automatically runs your project's existing linters and type checkers:
|
|
66
|
-
|
|
67
|
-
| Language | Tools detected |
|
|
68
|
-
| --------------------- | ---------------------------------------------------------------- |
|
|
69
|
-
| TypeScript/JavaScript | `tsc --noEmit`, `npm run lint`, `eslint` |
|
|
70
|
-
| Python | `ruff`, `mypy`, `flake8` |
|
|
71
|
-
| Rust | `cargo clippy` |
|
|
72
|
-
| Go | `go vet`, `golangci-lint` |
|
|
73
|
-
| Java | `mvn compile`, `checkstyle`, `spotbugs`, `pmd` |
|
|
74
|
-
| C/C++ | `clang-tidy` (if `compile_commands.json` available) |
|
|
75
|
-
| Other | Auto-discovered from CI config (`.github/workflows/*.yml`, etc.) |
|
|
76
|
-
|
|
77
|
-
For projects that don't match standard patterns (e.g., OpenJDK), `/review` reads CI configuration files to discover what lint/check commands the project uses. No user configuration needed.
|
|
78
|
-
|
|
79
|
-
Deterministic findings are tagged with `[linter]` or `[typecheck]` and skip LLM verification — they are ground truth.
|
|
80
|
-
|
|
81
|
-
- **Errors** → Critical severity
|
|
82
|
-
- **Warnings** → Nice to have (terminal only, not posted as PR comments)
|
|
83
|
-
|
|
84
|
-
If a tool is not installed or times out, it is skipped with an informational note.
|
|
85
|
-
|
|
86
61
|
## Severity Levels
|
|
87
62
|
|
|
88
63
|
| Severity | Meaning | Posted as PR comment? |
|
|
@@ -93,26 +68,12 @@ If a tool is not installed or times out, it is skipped with an informational not
|
|
|
93
68
|
|
|
94
69
|
Low-confidence findings appear in a separate "Needs Human Review" section in the terminal and are never posted as PR comments.
|
|
95
70
|
|
|
96
|
-
## Autofix
|
|
97
|
-
|
|
98
|
-
After presenting findings, `/review` offers to auto-apply fixes for Critical and Suggestion findings that have clear solutions:
|
|
99
|
-
|
|
100
|
-
```
|
|
101
|
-
Found 3 issues with auto-fixable suggestions. Apply auto-fixes? (y/n)
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
- Fixes are applied using the `edit` tool (targeted replacements, not full-file rewrites)
|
|
105
|
-
- Per-file linter checks run after fixes to verify they don't introduce new issues
|
|
106
|
-
- For PR reviews, fixes are committed and pushed from the worktree automatically — your working tree stays clean
|
|
107
|
-
- Nice to have and low-confidence findings are never auto-fixed
|
|
108
|
-
- PR review submission always uses the **pre-fix verdict** (e.g., "Request changes") since the remote PR hasn't been updated until the autofix push completes
|
|
109
|
-
|
|
110
71
|
## Worktree Isolation
|
|
111
72
|
|
|
112
73
|
When reviewing a PR, `/review` creates a temporary git worktree (`.qwen/tmp/review-pr-<number>`) instead of switching your current branch. This means:
|
|
113
74
|
|
|
114
75
|
- Your working tree, staged changes, and current branch are **never touched**
|
|
115
|
-
- Dependencies are installed in the worktree (`npm ci`, etc.) so
|
|
76
|
+
- Dependencies are installed in the worktree (`npm ci`, etc.) so build/test work
|
|
116
77
|
- Build and test commands run in isolation without polluting your local build cache
|
|
117
78
|
- If anything goes wrong, your environment is unaffected — just delete the worktree
|
|
118
79
|
- The worktree is automatically cleaned up after the review completes
|
|
@@ -127,15 +88,13 @@ You can review PRs from other repositories by passing the full URL:
|
|
|
127
88
|
/review https://github.com/other-org/other-repo/pull/456
|
|
128
89
|
```
|
|
129
90
|
|
|
130
|
-
This runs in **lightweight mode** — no worktree, no
|
|
91
|
+
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.
|
|
131
92
|
|
|
132
93
|
| Capability | Same-repo | Cross-repo |
|
|
133
94
|
| ---------------------------------------------------------- | --------- | ----------------------------- |
|
|
134
95
|
| LLM review (Agents 1-6 + verify + iterative reverse audit) | ✅ | ✅ |
|
|
135
96
|
| Agent 7: Build & test | ✅ | ❌ (no local codebase) |
|
|
136
|
-
| Deterministic analysis (linter/typecheck) | ✅ | ❌ |
|
|
137
97
|
| Cross-file impact analysis | ✅ | ❌ |
|
|
138
|
-
| Autofix | ✅ | ❌ |
|
|
139
98
|
| PR inline comments | ✅ | ✅ (if you have write access) |
|
|
140
99
|
| Incremental review cache | ✅ | ❌ |
|
|
141
100
|
|
|
@@ -158,7 +117,7 @@ Or, after running `/review 123`, type `post comments` to publish findings withou
|
|
|
158
117
|
|
|
159
118
|
**What stays terminal-only:**
|
|
160
119
|
|
|
161
|
-
- Nice to have findings
|
|
120
|
+
- Nice to have findings
|
|
162
121
|
- Low-confidence findings
|
|
163
122
|
|
|
164
123
|
**Self-authored PRs:** GitHub does not allow you to submit `APPROVE` or `REQUEST_CHANGES` reviews on your own pull request — both fail with HTTP 422. When `/review` detects that the PR author matches the current authenticated user, it automatically downgrades the API event to `COMMENT` regardless of verdict, so the submission still succeeds. The terminal still shows the honest verdict ("Approve" / "Request changes" / "Comment") — only the GitHub-side review event is neutralized. The actual findings still appear as inline comments on specific lines, so substantive feedback is unchanged.
|
|
@@ -178,7 +137,7 @@ After the review, context-aware tips appear as ghost text. Press Tab to accept:
|
|
|
178
137
|
| PR review, zero findings | `post comments` | Approves the PR on GitHub (LGTM) |
|
|
179
138
|
| Local review, all clear | `commit` | Commits your changes |
|
|
180
139
|
|
|
181
|
-
Note: `fix these issues` is only available for local reviews. For PR reviews
|
|
140
|
+
Note: `fix these issues` is only available for local reviews. For PR reviews the worktree is cleaned up after the review, so post-review interactive fixing is not possible — use `--comment` or `post comments` to publish findings instead.
|
|
182
141
|
|
|
183
142
|
## Project Review Rules
|
|
184
143
|
|
|
@@ -241,7 +200,7 @@ For same-repo reviews, results are saved as a Markdown file in your project's `.
|
|
|
241
200
|
.qwen/reviews/2026-04-06-150510-local.md
|
|
242
201
|
```
|
|
243
202
|
|
|
244
|
-
Reports include: timestamp, diff stats,
|
|
203
|
+
Reports include: timestamp, diff stats, build/test results, all findings with verification status, and the verdict.
|
|
245
204
|
|
|
246
205
|
## Cross-file Impact Analysis
|
|
247
206
|
|
|
@@ -260,10 +219,9 @@ The review pipeline uses a bounded number of LLM calls regardless of how many fi
|
|
|
260
219
|
|
|
261
220
|
| Stage | LLM calls | Notes |
|
|
262
221
|
| -------------------------------- | ----------------- | --------------------------------------------------- |
|
|
263
|
-
|
|
|
264
|
-
|
|
|
265
|
-
|
|
|
266
|
-
| Iterative reverse audit (Step 6) | 1-3 | Loops until "No issues found" or 3-round cap |
|
|
222
|
+
| Review agents (Step 3) | 9 (or 8) | Run in parallel; Agent 7 skipped in cross-repo mode |
|
|
223
|
+
| Batch verification (Step 4) | 1 | Single agent verifies all findings at once |
|
|
224
|
+
| Iterative reverse audit (Step 5) | 1-3 | Loops until "No issues found" or 3-round cap |
|
|
267
225
|
| **Total** | **11-13 (10-12)** | Same-repo: 11-13; cross-repo: 10-12 (no Agent 7) |
|
|
268
226
|
|
|
269
227
|
Most PRs converge to the lower end of the range (1 reverse audit round); the cap prevents runaway cost on pathological cases.
|
|
@@ -273,8 +231,7 @@ Most PRs converge to the lower end of the range (1 reverse audit round); the cap
|
|
|
273
231
|
The review intentionally excludes:
|
|
274
232
|
|
|
275
233
|
- Pre-existing issues in unchanged code (focus on the diff only)
|
|
276
|
-
- Style
|
|
277
|
-
- Issues a linter or type checker would catch (handled by deterministic analysis)
|
|
234
|
+
- Style or formatting a formatter would auto-normalize, or naming matching your codebase conventions — but NOT substantive issues a linter or type checker would flag (unused variables, unreachable code, type errors), which are in scope
|
|
278
235
|
- Subjective "consider doing X" suggestions without a real problem
|
|
279
236
|
- Minor refactoring that doesn't fix a bug or risk
|
|
280
237
|
- Missing documentation unless the logic is genuinely confusing
|
|
@@ -285,7 +242,6 @@ The review intentionally excludes:
|
|
|
285
242
|
> **Silence is better than noise.** Every comment should be worth the reader's time.
|
|
286
243
|
|
|
287
244
|
- If unsure whether something is a problem → don't report it
|
|
288
|
-
- Linter/typecheck issues are handled by tools, not LLM guesses
|
|
289
245
|
- Same pattern across N files → aggregated into one finding
|
|
290
246
|
- PR comments are high-confidence only
|
|
291
|
-
-
|
|
247
|
+
- Cosmetic style/formatting matching codebase conventions is excluded
|
|
@@ -127,12 +127,12 @@ Commands for managing AI tools and models.
|
|
|
127
127
|
|
|
128
128
|
These commands invoke bundled skills that provide specialized workflows.
|
|
129
129
|
|
|
130
|
-
| Command | Description
|
|
131
|
-
| ------------ |
|
|
132
|
-
| `/review` | Review code changes with
|
|
133
|
-
| `/loop` | Run a prompt on a recurring schedule
|
|
134
|
-
| `/simplify` | Review recent changes and apply safe cleanup edits directly
|
|
135
|
-
| `/qc-helper` | Answer questions about Qwen Code usage and configuration
|
|
130
|
+
| Command | Description | Usage Examples |
|
|
131
|
+
| ------------ | ----------------------------------------------------------- | ------------------------------------------------- |
|
|
132
|
+
| `/review` | Review code changes with 9 parallel review agents | `/review`, `/review 123`, `/review 123 --comment` |
|
|
133
|
+
| `/loop` | Run a prompt on a recurring schedule | `/loop 5m check the build` |
|
|
134
|
+
| `/simplify` | Review recent changes and apply safe cleanup edits directly | `/simplify`, `/simplify focus on duplication` |
|
|
135
|
+
| `/qc-helper` | Answer questions about Qwen Code usage and configuration | `/qc-helper how do I configure MCP?` |
|
|
136
136
|
|
|
137
137
|
See [Code Review](./code-review.md) for full `/review` documentation.
|
|
138
138
|
|
|
@@ -381,12 +381,14 @@ The `mcp` object in your `settings.json` defines global rules for all MCP server
|
|
|
381
381
|
- `mcp.allowed`: allow-list of MCP server names (keys in `mcpServers`)
|
|
382
382
|
- `mcp.excluded`: deny-list of MCP server names
|
|
383
383
|
|
|
384
|
+
Both lists support glob patterns: `*` matches any sequence of characters and `?` matches a single character (for example, `"*puppeteer*"` matches every server whose name contains `puppeteer`). Entries without glob characters are matched exactly. When a server matches both lists, `mcp.excluded` takes precedence.
|
|
385
|
+
|
|
384
386
|
Example:
|
|
385
387
|
|
|
386
388
|
```json
|
|
387
389
|
{
|
|
388
390
|
"mcp": {
|
|
389
|
-
"allowed": ["my-trusted-server"],
|
|
391
|
+
"allowed": ["my-trusted-server", "*-internal"],
|
|
390
392
|
"excluded": ["experimental-server"]
|
|
391
393
|
}
|
|
392
394
|
}
|
|
@@ -40,6 +40,16 @@ The scheduled prompt can itself be a command or skill invocation. This is useful
|
|
|
40
40
|
|
|
41
41
|
Each time the job fires, Qwen Code runs `/review-pr 1234` as if you had typed it.
|
|
42
42
|
|
|
43
|
+
### Autonomous mode
|
|
44
|
+
|
|
45
|
+
Running `/loop` with **no prompt** starts an autonomous loop instead of repeating a fixed prompt. Qwen Code acts as a steward of the work already established in the conversation — it keeps your work moving while you're away:
|
|
46
|
+
|
|
47
|
+
```text
|
|
48
|
+
/loop
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
A bare `/loop` (no prompt, no interval) runs a self-paced autonomous loop; `/loop <interval>` with no prompt runs the same autonomous loop on a fixed cadence (e.g. `/loop 10m`). On each fire it advances what the conversation already set up — finishing things you started, maintaining an in-progress PR (addressing review threads, fixing failing CI, resolving conflicts), and honoring follow-up commitments. It only acts on work the transcript already established: it never invents new work or makes irreversible changes (push, delete, send) without clear authorization, and it stops once everything is quiet.
|
|
52
|
+
|
|
43
53
|
### Manage loops
|
|
44
54
|
|
|
45
55
|
`/loop` also supports two subcommands for managing existing jobs:
|