@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.
Files changed (234) hide show
  1. package/bundled/loop/loop-tick-resolver.test.ts +42 -0
  2. package/bundled/loop/loop-tick-resolver.ts +1 -1
  3. package/bundled/qc-helper/docs/configuration/auth.md +1 -1
  4. package/bundled/qc-helper/docs/configuration/settings.md +23 -11
  5. package/bundled/qc-helper/docs/features/approval-mode.md +3 -0
  6. package/bundled/qc-helper/docs/features/auto-mode.md +40 -0
  7. package/bundled/qc-helper/docs/features/channels/overview.md +81 -18
  8. package/bundled/qc-helper/docs/features/code-review.md +17 -61
  9. package/bundled/qc-helper/docs/features/commands.md +6 -6
  10. package/bundled/qc-helper/docs/features/mcp.md +3 -1
  11. package/bundled/qc-helper/docs/features/scheduled-tasks.md +10 -0
  12. package/bundled/qc-helper/docs/qwen-serve.md +19 -0
  13. package/bundled/review/DESIGN.md +21 -26
  14. package/bundled/review/SKILL.md +45 -129
  15. package/chunks/{MaxSizedBox-UZHJ73JB.js → MaxSizedBox-ERTNFI22.js} +20 -18
  16. package/chunks/{StandaloneSessionPicker-GGUIZWCE.js → StandaloneSessionPicker-Y5NGRLRY.js} +32 -29
  17. package/chunks/{acpAgent-QYZFICEZ.js → acpAgent-UMN6OYTR.js} +473 -187
  18. package/chunks/{agent-2EN7YNSW.js → agent-56DZU4ZU.js} +17 -15
  19. package/chunks/{agent-headless-SLTEZ5LV.js → agent-headless-SR7N2IJG.js} +17 -15
  20. package/chunks/{anthropicContentGenerator-CA3JTAMO.js → anthropicContentGenerator-5OZFO6WQ.js} +1 -1
  21. package/chunks/{artifact-tool-RM7WINJO.js → artifact-tool-JVZMHA4B.js} +1 -1
  22. package/chunks/{askUserQuestion-J3P6QAJ7.js → askUserQuestion-CMJZ2F3D.js} +1 -1
  23. package/chunks/{bridge-HZVAUTMX.js → bridge-AUHNFOUS.js} +23 -21
  24. package/chunks/channel-worker-supervisor-A74FV522.js +308 -0
  25. package/chunks/{chunk-N4V4VBP6.js → chunk-2X2JUE47.js} +2 -2
  26. package/chunks/{chunk-JV7A66DR.js → chunk-4VZH35PN.js} +528 -358
  27. package/chunks/{chunk-M2U5NM24.js → chunk-54YZOP7P.js} +309 -72
  28. package/chunks/{chunk-WGY3GIPP.js → chunk-6AQR7732.js} +1 -1
  29. package/chunks/{chunk-FR3II765.js → chunk-6CIIP6OE.js} +4 -4
  30. package/chunks/{chunk-IKO44NAT.js → chunk-6TLY5W3B.js} +2 -2
  31. package/chunks/{chunk-VN4CKYUW.js → chunk-73H73ASU.js} +1 -1
  32. package/chunks/{chunk-IBEM64M4.js → chunk-75X2VLSH.js} +36 -25
  33. package/chunks/{chunk-PLQTLKMR.js → chunk-7KPI4LAI.js} +3 -3
  34. package/chunks/{chunk-NVTRORSK.js → chunk-7VPC7D7O.js} +2 -2
  35. package/chunks/chunk-AHNXYU4O.js +24 -0
  36. package/chunks/{chunk-MTJVHQDP.js → chunk-B7KGXIPZ.js} +302 -257
  37. package/chunks/{chunk-35FH347N.js → chunk-BFG6OZN7.js} +16097 -16236
  38. package/chunks/{chunk-T44AF4I6.js → chunk-BNJLLAQ7.js} +1 -1
  39. package/chunks/{chunk-OEY3YAL2.js → chunk-BQNJBEUA.js} +2 -2
  40. package/chunks/{chunk-Q7TDHJ2G.js → chunk-C2IHHGBZ.js} +10 -10
  41. package/chunks/chunk-CG7SVARK.js +367 -0
  42. package/chunks/{chunk-7SP275SH.js → chunk-CS5XYDBO.js} +5 -5
  43. package/chunks/{chunk-V5YJAUHW.js → chunk-CUGEBAKG.js} +1 -1
  44. package/chunks/{chunk-FQDMX5IL.js → chunk-D5KISTLW.js} +309 -72
  45. package/chunks/{chunk-I4MXURND.js → chunk-DQ74W65K.js} +356 -468
  46. package/chunks/chunk-E5A7LHNN.js +51 -0
  47. package/chunks/{chunk-3PJXIDKI.js → chunk-E6US47KI.js} +3 -27
  48. package/chunks/chunk-EDAGQADF.js +21 -0
  49. package/chunks/{chunk-HUGAEYZR.js → chunk-FNLXLI4I.js} +2 -2
  50. package/chunks/{chunk-WJAY4WXR.js → chunk-FYKX6XOT.js} +1 -1
  51. package/chunks/{chunk-CA4ML3VH.js → chunk-G7OQ3RFJ.js} +1 -1
  52. package/chunks/{chunk-VHRREANT.js → chunk-GICCHL2Q.js} +3 -1
  53. package/chunks/{chunk-QHHNFG22.js → chunk-GLPV75ES.js} +1 -1
  54. package/chunks/{chunk-LD2XBG6Z.js → chunk-GO6LNQXT.js} +1 -39
  55. package/chunks/chunk-HI55Z6PR.js +3523 -0
  56. package/chunks/{chunk-B5MPZI4K.js → chunk-HJDF3ZVU.js} +2670 -1233
  57. package/chunks/{chunk-GDIG7TMG.js → chunk-HRZB5CSC.js} +1 -1
  58. package/chunks/{chunk-LDWTYE33.js → chunk-J3F7X3LW.js} +1 -1
  59. package/chunks/{chunk-FV4SQ54H.js → chunk-KVPFPC4J.js} +227 -85
  60. package/chunks/{chunk-Q3JOGB4U.js → chunk-L7QPM2YD.js} +1 -1
  61. package/chunks/{chunk-4722VFFU.js → chunk-L7VH7HQA.js} +6 -6
  62. package/chunks/{chunk-HWG4XLD7.js → chunk-LKWAVAB5.js} +1 -1
  63. package/chunks/{chunk-YCRTJYSQ.js → chunk-MEQWZGK5.js} +1 -1
  64. package/chunks/{chunk-6FIWYVN4.js → chunk-MKHC4BYZ.js} +30 -5
  65. package/chunks/{chunk-YCEHOJZJ.js → chunk-MNDTD5E5.js} +65 -38
  66. package/chunks/{chunk-ZGSV5ORL.js → chunk-MVZXZWGT.js} +809 -759
  67. package/chunks/chunk-MX2YXRER.js +44 -0
  68. package/chunks/{chunk-TMILTLP3.js → chunk-ND25GXEU.js} +21 -4
  69. package/chunks/{chunk-AIBPG5MB.js → chunk-OAFUMTWW.js} +2 -2
  70. package/chunks/chunk-OJCECIJA.js +238 -0
  71. package/chunks/{chunk-EUURTJY7.js → chunk-PIYV6COW.js} +1 -1
  72. package/chunks/{chunk-LXEW6BHF.js → chunk-Q7VHIRDD.js} +1 -1
  73. package/chunks/{chunk-DBR7PF4B.js → chunk-QAFQLTXG.js} +1 -1
  74. package/chunks/{chunk-3TK7FSCP.js → chunk-QMIND2AS.js} +3 -3
  75. package/chunks/{chunk-ESVSWG6Z.js → chunk-QOMAHFYI.js} +1 -1
  76. package/chunks/{chunk-J37FGIOA.js → chunk-QXPI7FEC.js} +38 -4
  77. package/chunks/chunk-RM3PGSGL.js +66 -0
  78. package/chunks/chunk-RNBYOUGV.js +42 -0
  79. package/chunks/chunk-S5EQPDTM.js +91 -0
  80. package/chunks/{chunk-GZKQ36JS.js → chunk-SFN4TEHY.js} +4 -4
  81. package/chunks/{chunk-DHXWNSJA.js → chunk-T22H4V4R.js} +42 -0
  82. package/chunks/{chunk-LXGWLOCM.js → chunk-TENOUWY2.js} +1 -1
  83. package/chunks/{chunk-BLAE2TCO.js → chunk-TTFNVEO5.js} +3 -3
  84. package/chunks/{chunk-FZY7NH37.js → chunk-UANCYOOQ.js} +1 -1
  85. package/chunks/{chunk-E5I6YSNO.js → chunk-UQFP2FEF.js} +1 -1
  86. package/chunks/{chunk-3O2BJMFW.js → chunk-UQYOMM6J.js} +4 -4
  87. package/chunks/{chunk-JERW36RG.js → chunk-UT5JU5DJ.js} +15 -15
  88. package/chunks/{chunk-DJ25MIU2.js → chunk-VKGG724L.js} +8 -8
  89. package/chunks/{chunk-G525INVW.js → chunk-W2ZOAX7F.js} +3 -3
  90. package/chunks/{chunk-HIYUAXBG.js → chunk-W6X4FGWX.js} +1 -1
  91. package/chunks/{chunk-OE5J6UA7.js → chunk-XCUFHOAD.js} +1 -1
  92. package/chunks/{chunk-KXVVXAAC.js → chunk-YBDZ63KI.js} +3 -3
  93. package/chunks/{chunk-Z34RYLRO.js → chunk-ZJP5T7IA.js} +1 -1
  94. package/chunks/{chunk-NOYV2NXI.js → chunk-ZXCVPMIK.js} +411 -43
  95. package/chunks/{computer-use-FCNWHVPW.js → computer-use-VWN5HH6A.js} +20 -18
  96. package/chunks/{contextCommand-FVFMZZEU.js → contextCommand-DFFG5KDJ.js} +19 -17
  97. package/chunks/{cron-create-IY5NMIHQ.js → cron-create-CSSWJ67I.js} +1 -1
  98. package/chunks/{cron-delete-OLNEQWKO.js → cron-delete-E56CFQ7A.js} +1 -1
  99. package/chunks/{cron-list-YAUAUV24.js → cron-list-BKSINY6Y.js} +1 -1
  100. package/chunks/daemon-5T6IHWJV.js +8430 -0
  101. package/chunks/{daemon-status-provider-42JEXENZ.js → daemon-status-provider-V5UY7O7J.js} +26 -24
  102. package/chunks/{dist-4FCNM6KJ.js → dist-2HDL5SHQ.js} +2 -2
  103. package/chunks/{dist-SU6L7ZNJ.js → dist-B7SSDVWT.js} +3 -3
  104. package/chunks/{dist-VD7HXTML.js → dist-BL3SL665.js} +1 -1
  105. package/chunks/{dist-UKPWQJCL.js → dist-TAVAGZU6.js} +37 -13
  106. package/chunks/{dist-K4XZILIO.js → dist-XBOVZ3R5.js} +26 -5
  107. package/chunks/{earlyInputCapture-FFFEC6P4.js → earlyInputCapture-VVYU4FDO.js} +17 -15
  108. package/chunks/{edit-32ILSGZY.js → edit-F35PTMBA.js} +17 -15
  109. package/chunks/{en-U3LWGSFX.js → en-FZREZFPO.js} +18 -0
  110. package/chunks/{enter-worktree-XWZKIN6A.js → enter-worktree-3DIW7EGJ.js} +17 -15
  111. package/chunks/{enterPlanMode-LPFFY7BJ.js → enterPlanMode-QNXT77KP.js} +27 -15
  112. package/chunks/{errors-UXBPYPI2.js → errors-M53YG76R.js} +19 -17
  113. package/chunks/{exit-worktree-IBS4UIU7.js → exit-worktree-BSDWNWHZ.js} +17 -15
  114. package/chunks/{exitPlanMode-JA72YHII.js → exitPlanMode-EL7AY327.js} +41 -23
  115. package/chunks/{fast-path-7UU67Y2W.js → fast-path-DUCSMUFW.js} +2 -2
  116. package/chunks/{gemini-GMVKJNMX.js → gemini-F3IERB37.js} +59 -51
  117. package/chunks/{geminiContentGenerator-7NIFF2L4.js → geminiContentGenerator-6OULAKFQ.js} +1 -1
  118. package/chunks/{glob-4NJCW5HI.js → glob-ZMLFTD4T.js} +17 -15
  119. package/chunks/{grep-PAIMLQEL.js → grep-H5X66EI7.js} +17 -15
  120. package/chunks/{initializer-R6KU4VYM.js → initializer-LEOT2OLH.js} +21 -19
  121. package/chunks/{list-H7LXAO64.js → list-M3DKXML6.js} +23 -21
  122. package/chunks/{loadedSettingsAdapter-H27JMTLU.js → loadedSettingsAdapter-OKMQFGGG.js} +21 -19
  123. package/chunks/{loop-wakeup-Y3OIRQFM.js → loop-wakeup-FPBAVVPR.js} +2 -2
  124. package/chunks/{ls-TVJEYS7O.js → ls-UGWQXPTY.js} +1 -1
  125. package/chunks/{lsp-JZSDVR3F.js → lsp-24WV7NXB.js} +1 -1
  126. package/chunks/{monitor-JSIHDPXP.js → monitor-ARL5P45R.js} +19 -16
  127. package/chunks/{nonInteractiveCli-Y4CHOETG.js → nonInteractiveCli-NUVLF3YR.js} +53 -45
  128. package/chunks/{notebook-edit-SHRNL2UM.js → notebook-edit-ANTZ2DDY.js} +17 -15
  129. package/chunks/{openaiContentGenerator-ORZZ7VFO.js → openaiContentGenerator-TFGMKGHN.js} +6 -6
  130. package/chunks/pidfile-AWTL4C63.js +72 -0
  131. package/chunks/{qwenContentGenerator-H643PL2G.js → qwenContentGenerator-6QWAYTWS.js} +18 -16
  132. package/chunks/{qwenOAuth2-OI2B7PES.js → qwenOAuth2-LWLA6MQG.js} +3 -3
  133. package/chunks/{read-file-5PRNPTTY.js → read-file-EJY73XQ3.js} +4 -4
  134. package/chunks/{read-mcp-resource-QTXGKTEV.js → read-mcp-resource-NCBTPP7X.js} +1 -1
  135. package/chunks/{ripGrep-JIKZMABJ.js → ripGrep-HC4SA6CQ.js} +17 -15
  136. package/chunks/{run-qwen-serve-PQV7QOHZ.js → run-qwen-serve-AGLZ642J.js} +291 -55
  137. package/chunks/{scheduler-OS3R5MGU.js → scheduler-TURO7NGY.js} +17 -15
  138. package/chunks/{send-message-DKGHWSTF.js → send-message-3S2NYS3O.js} +5 -3
  139. package/chunks/{serve-LVYZDKCZ.js → serve-5DAMOIDW.js} +22 -19
  140. package/chunks/{server-P4YIH35I.js → server-4AGEK2HC.js} +2268 -1222
  141. package/chunks/{session-DE4TZBKH.js → session-7ZOQUC4Y.js} +54 -46
  142. package/chunks/{settings-DFTYMJYF.js → settings-DR4V6L5Y.js} +20 -18
  143. package/chunks/{shell-3GNQLNV7.js → shell-H5WFKUXH.js} +17 -15
  144. package/chunks/{skill-NCNG4KKZ.js → skill-ANHU5ZCR.js} +4 -4
  145. package/chunks/{spawnChannel-DHRIMDVL.js → spawnChannel-VN5LJV7Z.js} +19 -17
  146. package/chunks/{src-PNZYGM3R.js → src-OVZLTVVM.js} +49 -17
  147. package/chunks/{startInteractiveUI-P6GZBFQW.js → startInteractiveUI-OA22V32P.js} +11110 -10670
  148. package/chunks/{syntheticOutput-X7L5HWLN.js → syntheticOutput-SV7GBHZ5.js} +2 -2
  149. package/chunks/{task-create-AWEUI4GI.js → task-create-W2H2UJCH.js} +6 -5
  150. package/chunks/{task-list-KZ3VJLDU.js → task-list-THBOPV4G.js} +5 -4
  151. package/chunks/{task-stop-GUNOZKJ5.js → task-stop-33FVCNCJ.js} +1 -1
  152. package/chunks/{task-update-Y56GP6DU.js → task-update-LVFQLXEI.js} +6 -5
  153. package/chunks/{team-create-6JMW3KQK.js → team-create-OYL5CAQO.js} +17 -15
  154. package/chunks/{team-delete-6AFRGDJY.js → team-delete-NTUQ25UY.js} +5 -4
  155. package/chunks/{theme-manager-FEHQO22G.js → theme-manager-XCMPF2SI.js} +17 -15
  156. package/chunks/{todoWrite-JRS6NOEU.js → todoWrite-SEPO2RI3.js} +1 -1
  157. package/chunks/{tool-search-IXAEKS7J.js → tool-search-YXW55X6Z.js} +29 -5
  158. package/chunks/{trustedFolders-SJRXNHZE.js → trustedFolders-TEPGM5YL.js} +18 -16
  159. package/chunks/{validateNonInterActiveAuth-HCH7OBDH.js → validateNonInterActiveAuth-OQIS7WUE.js} +50 -42
  160. package/chunks/{web-fetch-RELNL37A.js → web-fetch-OE7LHURA.js} +4 -4
  161. package/chunks/{workflow-M2COBI7R.js → workflow-RTUWORAP.js} +48 -27
  162. package/chunks/{workspace-providers-status-GOCWYDMK.js → workspace-providers-status-DM2XANVB.js} +23 -21
  163. package/chunks/{workspace-service-34C7SUBU.js → workspace-service-VKBI2KZD.js} +27 -25
  164. package/chunks/{write-file-E52WRXZL.js → write-file-WGALQ53L.js} +17 -15
  165. package/chunks/{zh-TW-LKLBTZHE.js → zh-TW-6GIKXEAN.js} +18 -0
  166. package/chunks/{zh-F5T4WWZO.js → zh-V3B4TFWL.js} +18 -0
  167. package/cli.js +6 -6
  168. package/locales/en.js +30 -0
  169. package/locales/fr.js +1 -2
  170. package/locales/ja.js +1 -2
  171. package/locales/zh-TW.js +29 -0
  172. package/locales/zh.js +29 -0
  173. package/node_modules/@qwen-code/audio-capture/package.json +1 -1
  174. package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-arm64/@qwen-code+audio-capture.node +0 -0
  175. package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-x64/@qwen-code+audio-capture.node +0 -0
  176. package/node_modules/@qwen-code/audio-capture/prebuilds/win32-x64/@qwen-code+audio-capture.node +0 -0
  177. package/package.json +3 -3
  178. package/web-shell/assets/{arc-C2DILvUl.js → arc-Det5Ccum.js} +1 -1
  179. package/web-shell/assets/{architectureDiagram-3BPJPVTR-b8gZ2cNw.js → architectureDiagram-3BPJPVTR-DqNWVFpl.js} +1 -1
  180. package/web-shell/assets/{blockDiagram-GPEHLZMM-BuRpghMj.js → blockDiagram-GPEHLZMM-CYl7tYBi.js} +1 -1
  181. package/web-shell/assets/{c4Diagram-AAUBKEIU-2ItdhFmE.js → c4Diagram-AAUBKEIU-DaAEi0NQ.js} +1 -1
  182. package/web-shell/assets/channel-Bm0bFauD.js +1 -0
  183. package/web-shell/assets/{chunk-2J33WTMH-B1QXa0q3.js → chunk-2J33WTMH-Df2CDEE2.js} +1 -1
  184. package/web-shell/assets/{chunk-4BX2VUAB-DXfhKlNq.js → chunk-4BX2VUAB-DNBFcyL2.js} +1 -1
  185. package/web-shell/assets/{chunk-55IACEB6-ClSNjxLo.js → chunk-55IACEB6-BKjF-0HI.js} +1 -1
  186. package/web-shell/assets/{chunk-727SXJPM-Dsh2wisB.js → chunk-727SXJPM-DYwAwfIM.js} +1 -1
  187. package/web-shell/assets/{chunk-AQP2D5EJ-C1TkY5AR.js → chunk-AQP2D5EJ-C6FswLqy.js} +1 -1
  188. package/web-shell/assets/{chunk-FMBD7UC4-CGtN9XR6.js → chunk-FMBD7UC4-DRWAcZSY.js} +1 -1
  189. package/web-shell/assets/{chunk-ND2GUHAM-BHiPi1SS.js → chunk-ND2GUHAM-AoL16mNR.js} +1 -1
  190. package/web-shell/assets/{chunk-QZHKN3VN-CzG3I5o1.js → chunk-QZHKN3VN-a8PtLMck.js} +1 -1
  191. package/web-shell/assets/classDiagram-4FO5ZUOK--NgUfb55.js +1 -0
  192. package/web-shell/assets/classDiagram-v2-Q7XG4LA2--NgUfb55.js +1 -0
  193. package/web-shell/assets/{cose-bilkent-S5V4N54A-EgrIoH_K.js → cose-bilkent-S5V4N54A-C4Aeu5qf.js} +1 -1
  194. package/web-shell/assets/{dagre-BM42HDAG-BUnpdX8S.js → dagre-BM42HDAG-BOulamjo.js} +1 -1
  195. package/web-shell/assets/{diagram-2AECGRRQ-BlLUCVYu.js → diagram-2AECGRRQ-D1wt2ykO.js} +1 -1
  196. package/web-shell/assets/{diagram-5GNKFQAL-FG-enmjQ.js → diagram-5GNKFQAL-BRseus-O.js} +1 -1
  197. package/web-shell/assets/{diagram-KO2AKTUF-BlzmTONk.js → diagram-KO2AKTUF-XSMkNzpZ.js} +1 -1
  198. package/web-shell/assets/{diagram-LMA3HP47-CoBQ8mIx.js → diagram-LMA3HP47-21KNLqoi.js} +1 -1
  199. package/web-shell/assets/{diagram-OG6HWLK6-DvxV6sX8.js → diagram-OG6HWLK6-DnUI8F5G.js} +1 -1
  200. package/web-shell/assets/{erDiagram-TEJ5UH35-Jq1tpAoj.js → erDiagram-TEJ5UH35-BVSOMuM2.js} +1 -1
  201. package/web-shell/assets/{flowDiagram-I6XJVG4X-CbtYOry5.js → flowDiagram-I6XJVG4X-fYtDPJsW.js} +1 -1
  202. package/web-shell/assets/{ganttDiagram-6RSMTGT7-ZEn2VEKR.js → ganttDiagram-6RSMTGT7-CmRXosW_.js} +1 -1
  203. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-BZh-LkhJ.js → gitGraphDiagram-PVQCEYII-DPrmySxO.js} +1 -1
  204. package/web-shell/assets/index-BpKnmyFV.js +717 -0
  205. package/web-shell/assets/index-fLrtxpOG.css +5 -0
  206. package/web-shell/assets/{infoDiagram-5YYISTIA-B9HuZygK.js → infoDiagram-5YYISTIA-x3VbEuCV.js} +1 -1
  207. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-D76cNpYG.js → ishikawaDiagram-YF4QCWOH-SmitHRMC.js} +1 -1
  208. package/web-shell/assets/{journeyDiagram-JHISSGLW-6bGo7P1t.js → journeyDiagram-JHISSGLW-BxvA551S.js} +1 -1
  209. package/web-shell/assets/{kanban-definition-UN3LZRKU-DuYyRBvB.js → kanban-definition-UN3LZRKU-DNHC16jY.js} +1 -1
  210. package/web-shell/assets/{linear-CpdSW1BC.js → linear-CQ6irBL9.js} +1 -1
  211. package/web-shell/assets/{mermaid.core-s5xbZMMj.js → mermaid.core-DtB6NO1e.js} +72 -72
  212. package/web-shell/assets/{mindmap-definition-RKZ34NQL-go01fZ2y.js → mindmap-definition-RKZ34NQL-QKMAgV2v.js} +1 -1
  213. package/web-shell/assets/{pieDiagram-4H26LBE5-BfuZiEHO.js → pieDiagram-4H26LBE5-bvb6dGn6.js} +1 -1
  214. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-DsoINqV6.js → quadrantDiagram-W4KKPZXB-DLgdlG4D.js} +1 -1
  215. package/web-shell/assets/{requirementDiagram-4Y6WPE33-B7FU4LiU.js → requirementDiagram-4Y6WPE33-2M9YH4GF.js} +1 -1
  216. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-BEDjFnGB.js → sankeyDiagram-5OEKKPKP-DzwfclTH.js} +1 -1
  217. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-gzmmL5tK.js → sequenceDiagram-3UESZ5HK-BvPmTuy2.js} +1 -1
  218. package/web-shell/assets/{stateDiagram-AJRCARHV-BtHD4IN_.js → stateDiagram-AJRCARHV-BjwUmrJF.js} +1 -1
  219. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-C4L8zXeL.js +1 -0
  220. package/web-shell/assets/{timeline-definition-PNZ67QCA-T_8gmMCf.js → timeline-definition-PNZ67QCA-CXzS6qqz.js} +1 -1
  221. package/web-shell/assets/{vennDiagram-CIIHVFJN-DdjuqnjO.js → vennDiagram-CIIHVFJN-yRSolF5B.js} +1 -1
  222. package/web-shell/assets/{wardley-L42UT6IY-Cgtrvb37.js → wardley-L42UT6IY-ClLJjHPG.js} +1 -1
  223. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-BW3f3-yW.js → wardleyDiagram-YWT4CUSO-VIa6t2p2.js} +1 -1
  224. package/web-shell/assets/{xychartDiagram-2RQKCTM6-BUS9IKkc.js → xychartDiagram-2RQKCTM6-CtmrkezW.js} +1 -1
  225. package/web-shell/index.html +18 -2
  226. package/chunks/chunk-2JKEQWDZ.js +0 -1596
  227. package/chunks/chunk-32MCHZQC.js +0 -73
  228. package/chunks/chunk-UAKXW3DN.js +0 -30
  229. package/web-shell/assets/channel-eRvn2UA3.js +0 -1
  230. package/web-shell/assets/classDiagram-4FO5ZUOK-YZNwy1rx.js +0 -1
  231. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-YZNwy1rx.js +0 -1
  232. package/web-shell/assets/index-5FhE0ORO.css +0 -5
  233. package/web-shell/assets/index-CDTGmqVm.js +0 -720
  234. 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` | OpenAI, Azure OpenAI, OpenRouter, Requesty, ModelScope, Alibaba Cloud, any OpenAI-compatible endpoint |
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 | Default |
289
- | -------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------ | ------- |
290
- | `memory.enableManagedAutoMemory` | boolean | Enable background extraction of memories from conversations. | `true` |
291
- | `memory.enableManagedAutoDream` | boolean | Enable automatic consolidation (deduplication and cleanup) of collected memories. | `true` |
292
- | `memory.enableAutoSkill` | boolean | Enable background review for reusable project skills after tool-heavy sessions. | `true` |
293
- | `memory.autoSkillConfirm` | boolean | Ask for confirmation before auto-generated skills are added to the skill library. When off, auto-skills are saved immediately. | `true` |
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 | Default |
428
- | ------------------- | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
429
- | `mcp.serverCommand` | string | Command to start an MCP server. | `undefined` |
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. | `undefined` |
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
- | `groups` | No | Per-group settings. Keys are group chat IDs or `"*"` for defaults. See [Group Chats](#group-chats) |
64
- | `dispatchMode` | No | What happens when you send a message while the bot is busy: `steer` (default), `collect`, or `followup`. See [Dispatch Modes](#dispatch-modes) |
65
- | `blockStreaming` | No | Progressive response delivery: `on` or `off` (default). See [Block Streaming](#block-streaming) |
66
- | `blockStreamingChunk` | No | Chunk size bounds: `{ "minChars": 400, "maxChars": 1000 }`. See [Block Streaming](#block-streaming) |
67
- | `blockStreamingCoalesce` | No | Idle flush: `{ "idleMs": 1500 }`. See [Block Streaming](#block-streaming) |
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: Run deterministic analysis (linter, typecheck) [zero LLM cost]
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 5: Deduplicate --> Batch verify --> Aggregate [1 LLM call]
41
- Step 6: Iterative reverse audit (1-3 rounds, gap finding) [1-3 LLM calls]
42
- Step 7: Present findings + verdict
43
- Step 8: Autofix (user-confirmed, optional)
44
- Step 9: Post PR inline comments (if requested)
45
- Step 10: Save report + incremental cache
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 linting and build/test work
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 linter, no build/test, no autofix. The review is based on the diff text only (fetched via GitHub API). PR comments can still be posted if you have write access.
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 (including linter warnings)
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, use Autofix (Step 8) — the worktree is cleaned up after the review, so post-review interactive fixing is not possible.
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, deterministic analysis results, all findings with verification status, and the verdict.
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
- | Deterministic analysis (Step 3) | 0 | Shell commands only |
264
- | Review agents (Step 4) | 9 (or 8) | Run in parallel; Agent 7 skipped in cross-repo mode |
265
- | Batch verification (Step 5) | 1 | Single agent verifies all findings at once |
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/formatting/naming that matches your codebase conventions
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
- - Style/formatting issues matching codebase conventions are excluded
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 | Usage Examples |
131
- | ------------ | ------------------------------------------------------------------- | ------------------------------------------------- |
132
- | `/review` | Review code changes with 5 parallel agents + deterministic analysis | `/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?` |
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: