@qwen-code/qwen-code 0.19.5 → 0.19.6

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 (233) hide show
  1. package/bundled/dataviz/SKILL.md +50 -0
  2. package/bundled/dataviz/references/anti-patterns.md +12 -0
  3. package/bundled/dataviz/references/choosing-a-form.md +16 -0
  4. package/bundled/dataviz/references/palette.md +57 -0
  5. package/bundled/dataviz/scripts/validate_palette.js +328 -0
  6. package/bundled/loop/SKILL.md +1 -1
  7. package/bundled/qc-helper/docs/configuration/settings.md +9 -8
  8. package/bundled/qc-helper/docs/features/headless.md +2 -2
  9. package/bundled/qc-helper/docs/features/scheduled-tasks.md +4 -2
  10. package/bundled/qc-helper/docs/reference/keyboard-shortcuts.md +1 -1
  11. package/chunks/{MaxSizedBox-5JV77KRA.js → MaxSizedBox-SK7CUWZQ.js} +14 -14
  12. package/chunks/{StandaloneSessionPicker-MGUGB6PH.js → StandaloneSessionPicker-G44HGSAP.js} +25 -25
  13. package/chunks/{acpAgent-4F36XM3X.js → acpAgent-PKCTYWJV.js} +346 -131
  14. package/chunks/{agent-IWBUZI6A.js → agent-IYMHUXWB.js} +11 -11
  15. package/chunks/{agent-headless-JUTICAYO.js → agent-headless-L2DAW6I5.js} +11 -11
  16. package/chunks/{anthropicContentGenerator-WL3LJOUB.js → anthropicContentGenerator-H5ZOEENQ.js} +2 -2
  17. package/chunks/{artifact-tool-W76WC2JX.js → artifact-tool-SLYPWG3C.js} +15 -2
  18. package/chunks/{askUserQuestion-J3P6TH3V.js → askUserQuestion-OKPTECON.js} +1 -1
  19. package/chunks/{bridge-DHZHQ4UV.js → bridge-DF3IJQ5V.js} +17 -16
  20. package/chunks/{channel-worker-supervisor-EVPAYNZ5.js → channel-worker-supervisor-JUYQ5Z4R.js} +5 -5
  21. package/chunks/chunk-2INJBYLJ.js +949 -0
  22. package/chunks/chunk-3RW4AZJV.js +5063 -0
  23. package/chunks/{chunk-NSSVORTQ.js → chunk-3UC7ZC43.js} +16 -12
  24. package/chunks/chunk-3VJ7MT3N.js +111 -0
  25. package/chunks/{chunk-DRS2HTNT.js → chunk-3X76L4UF.js} +5 -5
  26. package/chunks/{chunk-PPFWEV7G.js → chunk-4RQIB5UZ.js} +62 -62
  27. package/chunks/{chunk-EROWZQN7.js → chunk-57NRQM3P.js} +6 -6
  28. package/chunks/{chunk-L7OJ3ZO3.js → chunk-5ES5YPED.js} +1 -1
  29. package/chunks/{chunk-RNGAT2Y2.js → chunk-5WQF27GW.js} +1 -1
  30. package/chunks/{chunk-7DMQRPC7.js → chunk-6BEOH4KK.js} +1 -1
  31. package/chunks/{chunk-CXBG27SF.js → chunk-6IAWPIQ6.js} +3 -2
  32. package/chunks/{chunk-DM4E337C.js → chunk-6QVRLKTZ.js} +4 -4
  33. package/chunks/{chunk-RM3PGSGL.js → chunk-6SHO7WFF.js} +15 -2
  34. package/chunks/{chunk-LHMZCIKL.js → chunk-7Z6UEJA4.js} +3 -1
  35. package/chunks/{chunk-SBMHB6N5.js → chunk-A34EPIUV.js} +12 -12
  36. package/chunks/{chunk-6QTCOQX7.js → chunk-AGZF43UV.js} +1967 -1399
  37. package/chunks/{chunk-QHYITL6P.js → chunk-BOAWGUY6.js} +5 -11
  38. package/chunks/{chunk-TN6RT6EJ.js → chunk-C2QKQZEQ.js} +16 -4
  39. package/chunks/{chunk-BC4R5C5R.js → chunk-CEYA7K7C.js} +32 -6
  40. package/chunks/{chunk-R6RI2HIC.js → chunk-CLQPBI4H.js} +40 -13
  41. package/chunks/{chunk-OQHLUA2Y.js → chunk-DBF3HTLT.js} +3 -3
  42. package/chunks/{chunk-SJBIFVD2.js → chunk-DMSNJDWG.js} +5 -1
  43. package/chunks/{chunk-KKQWC6WS.js → chunk-DNV4FSN5.js} +1 -1
  44. package/chunks/chunk-DXXNMPJH.js +5468 -0
  45. package/chunks/{chunk-CBJE2PLG.js → chunk-FDY3XOTM.js} +2 -2
  46. package/chunks/{chunk-NDY7OENU.js → chunk-FPHA7WIZ.js} +2 -2
  47. package/chunks/{chunk-MNOXKSM2.js → chunk-FZ5NVRVK.js} +1 -1
  48. package/chunks/{chunk-UJT42DB6.js → chunk-GQBRGBLS.js} +5 -5
  49. package/chunks/{chunk-Y4UQT3PM.js → chunk-HCFSKO6K.js} +1 -1
  50. package/chunks/{chunk-2Z43HUXT.js → chunk-HLKG6CZN.js} +3 -2
  51. package/chunks/{chunk-WALEWZ44.js → chunk-IUSKVKH5.js} +1 -1
  52. package/chunks/{chunk-XKSCTXPK.js → chunk-J6ABRKAB.js} +2 -1
  53. package/chunks/{chunk-DX3TKXNT.js → chunk-JA5KWZTJ.js} +1 -1
  54. package/chunks/{chunk-CHY5C5T4.js → chunk-JN2VJ33O.js} +171 -79
  55. package/chunks/{chunk-YTFBURQD.js → chunk-KYTQOCDE.js} +1 -1
  56. package/chunks/{chunk-BPFJQGY7.js → chunk-LM3YCCZJ.js} +164 -5
  57. package/chunks/{chunk-ZISMVA6U.js → chunk-LXFCHX4X.js} +1371 -24
  58. package/chunks/{chunk-6KPZJJ6U.js → chunk-MBWLP5OT.js} +9 -9
  59. package/chunks/{chunk-IMAMNLY6.js → chunk-MHQKYQDS.js} +3 -3
  60. package/chunks/{chunk-M5ITDKSM.js → chunk-MJKEQSZI.js} +1 -1
  61. package/chunks/{chunk-MTNTVOJR.js → chunk-MJKMIQMK.js} +5 -2
  62. package/chunks/{chunk-CSPSJU5R.js → chunk-MX7CTJHR.js} +16 -16
  63. package/chunks/{chunk-HISPEX42.js → chunk-N2IJLN2L.js} +7 -7
  64. package/chunks/{chunk-YCU7QV7Q.js → chunk-N4YJQTRL.js} +4 -0
  65. package/chunks/{chunk-R3UWLLRQ.js → chunk-NUK2PFSU.js} +1 -1
  66. package/chunks/{chunk-YXK4GPYO.js → chunk-NVFJSIAX.js} +29 -0
  67. package/chunks/{chunk-4MCC4XHH.js → chunk-O2RJARYU.js} +38 -37
  68. package/chunks/{chunk-JKGCBO3O.js → chunk-OAYOHSGP.js} +3 -3
  69. package/chunks/{chunk-G4M7FPNY.js → chunk-OBVBTAX5.js} +1 -1
  70. package/chunks/{chunk-JJ6B3ZD3.js → chunk-OIFSBXSP.js} +2 -2
  71. package/chunks/{chunk-NNEJEBCF.js → chunk-QOKV6AO4.js} +30 -21
  72. package/chunks/{chunk-DG573EOO.js → chunk-RZORUN6X.js} +1 -1
  73. package/chunks/{chunk-RSBQS6M4.js → chunk-SL2P3JUA.js} +1 -1
  74. package/chunks/{chunk-K4I4STSL.js → chunk-SOT7OMGL.js} +2 -2
  75. package/chunks/{chunk-MDBNFHIO.js → chunk-SRNPMG7J.js} +3 -3
  76. package/chunks/{chunk-SJVPSHXU.js → chunk-UNXGEDX2.js} +4 -4
  77. package/chunks/{chunk-WZ724G6K.js → chunk-UTL7KABL.js} +5 -5
  78. package/chunks/{chunk-UY2TCIZS.js → chunk-V5VTULL5.js} +2 -2
  79. package/chunks/{chunk-Z7XNVNPM.js → chunk-V6NH3CUC.js} +1 -1
  80. package/chunks/{chunk-J3ERRYYI.js → chunk-WXUDZHOJ.js} +2 -2
  81. package/chunks/{chunk-2CAII5HD.js → chunk-XH7H6YG4.js} +1 -1
  82. package/chunks/{chunk-XKZXGIRM.js → chunk-YSU33ACT.js} +2 -2
  83. package/chunks/{chunk-6QVQZAW6.js → chunk-YTWX5TT2.js} +1 -1
  84. package/chunks/{chunk-5B2WNM6V.js → chunk-ZI4MGBB5.js} +1 -1
  85. package/chunks/{chunk-2YH27UNF.js → chunk-ZO5EA3XJ.js} +1 -1
  86. package/chunks/{computer-use-ON3JQUHW.js → computer-use-5S3NVXRA.js} +11 -11
  87. package/chunks/{contextCommand-OGCG7W6N.js → contextCommand-DPBALZFK.js} +13 -13
  88. package/chunks/{cron-create-6YTCOX6P.js → cron-create-7JYUDTUY.js} +20 -5
  89. package/chunks/{cron-delete-E3NIFSUK.js → cron-delete-YPULQQAK.js} +2 -2
  90. package/chunks/{cron-list-Q64MNQNE.js → cron-list-HJIW5MHP.js} +2 -2
  91. package/chunks/{daemon-EEB2RYOL.js → daemon-7XYW4BC3.js} +102 -0
  92. package/chunks/{daemon-status-provider-P72STMLB.js → daemon-status-provider-2EWTHT7Y.js} +20 -19
  93. package/chunks/{dist-AP5V4WYU.js → dist-AAO65DPC.js} +2 -2
  94. package/chunks/{dist-X4ZDE726.js → dist-ABQ7VWRR.js} +3 -3
  95. package/chunks/{dist-SNXOUPYS.js → dist-AW5ZYMUI.js} +2 -2
  96. package/chunks/{dist-Z57Q4YF5.js → dist-BV56HW3W.js} +276 -95
  97. package/chunks/{dist-IZP2VV4C.js → dist-JPSVN367.js} +2 -2
  98. package/chunks/{earlyInputCapture-DAFHSGVW.js → earlyInputCapture-GGPV4IFT.js} +11 -11
  99. package/chunks/{edit-3QFNCSZH.js → edit-HJ7ISN4C.js} +12 -12
  100. package/chunks/{en-M4EBUBNU.js → en-XR3S5VWY.js} +1 -0
  101. package/chunks/{enter-worktree-62EQQMLD.js → enter-worktree-2BQT675D.js} +11 -11
  102. package/chunks/{enterPlanMode-VUQSE4EG.js → enterPlanMode-SJXHJ3WD.js} +11 -11
  103. package/chunks/{errors-PW75PZXE.js → errors-EVGER4AZ.js} +13 -13
  104. package/chunks/{exit-worktree-VVNH7OVY.js → exit-worktree-RPDDOSPM.js} +11 -11
  105. package/chunks/{exitPlanMode-RUYRCYZW.js → exitPlanMode-BQEROAJ7.js} +11 -11
  106. package/chunks/{fast-path-TFRJRTTR.js → fast-path-FX2ICJ2O.js} +3 -3
  107. package/chunks/{fast-path-settings-UQLRFDQP.js → fast-path-settings-RCRXH2JG.js} +2 -2
  108. package/chunks/{gemini-XW7ZDUVR.js → gemini-EHUXCOUI.js} +69 -64
  109. package/chunks/{geminiContentGenerator-MZDVHVZH.js → geminiContentGenerator-YDUUKAM2.js} +1 -1
  110. package/chunks/{glob-WAY2PUWA.js → glob-3VIGV2DL.js} +11 -11
  111. package/chunks/{grep-W6CBKSYC.js → grep-4D3S4NUC.js} +11 -11
  112. package/chunks/{initializer-HK2XE6P2.js → initializer-QZTZSSLW.js} +16 -16
  113. package/chunks/{list-RVLIIKKL.js → list-WQ24EAMK.js} +18 -18
  114. package/chunks/{loadedSettingsAdapter-C63OUYZC.js → loadedSettingsAdapter-XV74KOSR.js} +16 -16
  115. package/chunks/{loop-wakeup-G2EHBRGR.js → loop-wakeup-34YK7T7O.js} +3 -3
  116. package/chunks/{ls-IDHUVSAG.js → ls-MPD5OJUX.js} +1 -1
  117. package/chunks/{lsp-FSRYXGFT.js → lsp-72PWTDW7.js} +1 -1
  118. package/chunks/{workspace-skills-status-ONEPXJV6.js → mcp-CO3MKM7N.js} +20 -16
  119. package/chunks/{monitor-FOG36ABM.js → monitor-GB56T65A.js} +11 -11
  120. package/chunks/{nonInteractiveCli-6BYQSJTB.js → nonInteractiveCli-HNZRIM5I.js} +46 -44
  121. package/chunks/{notebook-edit-GC6NXRCX.js → notebook-edit-VMXAAE3R.js} +12 -12
  122. package/chunks/{openaiContentGenerator-EXR3ZL3Z.js → openaiContentGenerator-GM77FLII.js} +6 -6
  123. package/chunks/{pidfile-FNZM2DDH.js → pidfile-HFXSHR64.js} +11 -11
  124. package/chunks/{qwenContentGenerator-A7B6J4U7.js → qwenContentGenerator-QSCXQIKJ.js} +13 -13
  125. package/chunks/{read-file-6JL4ULMY.js → read-file-SVH6CGQY.js} +3 -3
  126. package/chunks/{read-mcp-resource-PIJF24RO.js → read-mcp-resource-OWOBJY72.js} +1 -1
  127. package/chunks/record-artifact-URK3YUDJ.js +343 -0
  128. package/chunks/{ripGrep-DIUGLJE5.js → ripGrep-JD5O2FLX.js} +11 -11
  129. package/chunks/{run-qwen-serve-CME3AKM4.js → run-qwen-serve-FADLRJUN.js} +67 -28
  130. package/chunks/{scheduler-L7F6GDDT.js → scheduler-Q65SB7DJ.js} +11 -11
  131. package/chunks/{send-message-33PYFMCT.js → send-message-L7OLQEKH.js} +2 -2
  132. package/chunks/{serve-SRCBOJGP.js → serve-6ZXAMQ4M.js} +18 -18
  133. package/chunks/{server-QSQ45QFR.js → server-WKDQA6XR.js} +1184 -490
  134. package/chunks/{session-5DG6NXHZ.js → session-STWOX7RA.js} +48 -46
  135. package/chunks/{settings-3EEQI4MN.js → settings-LC4CCWQQ.js} +15 -15
  136. package/chunks/{shell-B7FNYF5S.js → shell-FEG3RLPW.js} +11 -11
  137. package/chunks/{skill-AAOGHD5O.js → skill-XTXAMDAP.js} +4 -4
  138. package/chunks/{spawnChannel-3CBN3ZLK.js → spawnChannel-B6JJPBPV.js} +15 -15
  139. package/chunks/{src-T5A7P7FS.js → src-HITDGVRM.js} +47 -21
  140. package/chunks/{startInteractiveUI-2FGEQ6AS.js → startInteractiveUI-IT423PW4.js} +354 -152
  141. package/chunks/{syntheticOutput-YOSWIHDJ.js → syntheticOutput-J3MLCQAR.js} +2 -2
  142. package/chunks/{task-create-NHS2NGB3.js → task-create-ELEBZ7H2.js} +3 -3
  143. package/chunks/{task-list-5UIB564R.js → task-list-IEUZLF3Y.js} +1 -1
  144. package/chunks/{task-stop-HGXZ2VZ3.js → task-stop-QEZW3UDY.js} +1 -1
  145. package/chunks/{task-update-IYYWUILG.js → task-update-DW36J5P5.js} +3 -3
  146. package/chunks/{team-create-KDF6W6PV.js → team-create-DAG6SNHZ.js} +11 -11
  147. package/chunks/{team-delete-FEKJCU4P.js → team-delete-SVITIMBO.js} +1 -1
  148. package/chunks/{team-plan-approval-PSFKQX7M.js → team-plan-approval-DRDY5OPC.js} +11 -11
  149. package/chunks/{theme-manager-5XOA2AO7.js → theme-manager-N67EZC6B.js} +11 -11
  150. package/chunks/{todoWrite-TKMVZ2HT.js → todoWrite-SFFQHZYY.js} +2 -2
  151. package/chunks/{tool-search-LFRILZXC.js → tool-search-CMDJ5HGM.js} +4 -4
  152. package/chunks/{trustedFolders-7HQY6T6X.js → trustedFolders-JD4QX6UJ.js} +12 -12
  153. package/chunks/{validateNonInterActiveAuth-UC27B7BA.js → validateNonInterActiveAuth-ADDCGZ6A.js} +43 -41
  154. package/chunks/version-VAONYVE5.js +10 -0
  155. package/chunks/{web-fetch-J4PIW36Q.js → web-fetch-SXAXJHIO.js} +2 -2
  156. package/chunks/{workflow-KUTESS6L.js → workflow-DG2BR42M.js} +20 -13
  157. package/chunks/{workspace-providers-status-LJT5AQDS.js → workspace-providers-status-XGW5OZTD.js} +18 -18
  158. package/chunks/{workspace-service-YOBYVDXH.js → workspace-service-GX3GGZLU.js} +23 -23
  159. package/chunks/workspace-skills-status-LFK5WV2V.js +68 -0
  160. package/chunks/{write-file-FJYBZUHP.js → write-file-UR7FXWOU.js} +12 -12
  161. package/chunks/yargs-B64EYTCF.js +10 -0
  162. package/chunks/{zh-SLZNSSZB.js → zh-FSVJTXA4.js} +1 -0
  163. package/chunks/{zh-TW-P53C2SL5.js → zh-TW-66MG4LWL.js} +1 -0
  164. package/cli-entry.js +81 -8
  165. package/cli.js +348 -55
  166. package/locales/en.js +1 -0
  167. package/locales/zh-TW.js +1 -0
  168. package/locales/zh.js +1 -0
  169. package/node_modules/@qwen-code/audio-capture/package.json +1 -1
  170. package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-arm64/@qwen-code+audio-capture.node +0 -0
  171. package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-x64/@qwen-code+audio-capture.node +0 -0
  172. package/node_modules/@qwen-code/audio-capture/prebuilds/win32-x64/@qwen-code+audio-capture.node +0 -0
  173. package/package.json +3 -3
  174. package/web-shell/assets/{arc-D_rAuMDd.js → arc-CUpe0ibu.js} +1 -1
  175. package/web-shell/assets/{architectureDiagram-3BPJPVTR-DUCzbHVo.js → architectureDiagram-3BPJPVTR-JvyrY_mK.js} +1 -1
  176. package/web-shell/assets/{blockDiagram-GPEHLZMM-BEEBt1LL.js → blockDiagram-GPEHLZMM-CK3Y_vom.js} +1 -1
  177. package/web-shell/assets/{c4Diagram-AAUBKEIU-5ZJ_DeFL.js → c4Diagram-AAUBKEIU-DprSnyrf.js} +1 -1
  178. package/web-shell/assets/channel-BAxQ2-aZ.js +1 -0
  179. package/web-shell/assets/{chunk-2J33WTMH-Cfw7EiLn.js → chunk-2J33WTMH-DJtRJPmu.js} +1 -1
  180. package/web-shell/assets/{chunk-4BX2VUAB-FGuZNCZY.js → chunk-4BX2VUAB-ON6Q2-BG.js} +1 -1
  181. package/web-shell/assets/{chunk-55IACEB6-CaBwYPBF.js → chunk-55IACEB6-c60ou5HZ.js} +1 -1
  182. package/web-shell/assets/{chunk-727SXJPM-BlR04OFz.js → chunk-727SXJPM-BamtPKxx.js} +1 -1
  183. package/web-shell/assets/{chunk-AQP2D5EJ-D3_mYJH5.js → chunk-AQP2D5EJ-CsVgpu-T.js} +1 -1
  184. package/web-shell/assets/{chunk-FMBD7UC4-7D4q4SbB.js → chunk-FMBD7UC4-vZrpjAx4.js} +1 -1
  185. package/web-shell/assets/{chunk-ND2GUHAM-BjX_Iwmr.js → chunk-ND2GUHAM-qxyNOd5t.js} +1 -1
  186. package/web-shell/assets/{chunk-QZHKN3VN-C3Hz_ZQh.js → chunk-QZHKN3VN-BvTJSM_S.js} +1 -1
  187. package/web-shell/assets/classDiagram-4FO5ZUOK-Cvd_xhZI.js +1 -0
  188. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-Cvd_xhZI.js +1 -0
  189. package/web-shell/assets/{cose-bilkent-S5V4N54A-Ax4UycaT.js → cose-bilkent-S5V4N54A-1tXB4pju.js} +1 -1
  190. package/web-shell/assets/{dagre-BM42HDAG-C6hmPtGt.js → dagre-BM42HDAG-DglBzme8.js} +1 -1
  191. package/web-shell/assets/{diagram-2AECGRRQ-tXZnxjmw.js → diagram-2AECGRRQ-DEJpqsWz.js} +1 -1
  192. package/web-shell/assets/{diagram-5GNKFQAL-99dwIzQG.js → diagram-5GNKFQAL-CsQ1NrMG.js} +1 -1
  193. package/web-shell/assets/{diagram-KO2AKTUF-Bqhn0-2s.js → diagram-KO2AKTUF-Z-3codAi.js} +1 -1
  194. package/web-shell/assets/{diagram-LMA3HP47-DzThVSvo.js → diagram-LMA3HP47-mBuPTA2i.js} +1 -1
  195. package/web-shell/assets/{diagram-OG6HWLK6-DPE8vjln.js → diagram-OG6HWLK6-tcA3K3s9.js} +1 -1
  196. package/web-shell/assets/{erDiagram-TEJ5UH35-KzUKgQCV.js → erDiagram-TEJ5UH35-D9bXFRyZ.js} +1 -1
  197. package/web-shell/assets/{flowDiagram-I6XJVG4X-DBN-DXw5.js → flowDiagram-I6XJVG4X-Ck0Py04s.js} +1 -1
  198. package/web-shell/assets/{ganttDiagram-6RSMTGT7-DuBsP9u8.js → ganttDiagram-6RSMTGT7-rOevCekE.js} +1 -1
  199. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-BjWHMyKR.js → gitGraphDiagram-PVQCEYII-CoPQaLj0.js} +1 -1
  200. package/web-shell/assets/index-Cr7MYW6T.css +5 -0
  201. package/web-shell/assets/index-DCHPAUp3.js +730 -0
  202. package/web-shell/assets/{infoDiagram-5YYISTIA-BVux0vP6.js → infoDiagram-5YYISTIA-a77CUKoI.js} +1 -1
  203. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-2qzw7f--.js → ishikawaDiagram-YF4QCWOH-DlLgUAO-.js} +1 -1
  204. package/web-shell/assets/{journeyDiagram-JHISSGLW-Dnl65sxL.js → journeyDiagram-JHISSGLW-BXR5kVAZ.js} +1 -1
  205. package/web-shell/assets/{kanban-definition-UN3LZRKU-BElSQYtY.js → kanban-definition-UN3LZRKU-h5CoHZg7.js} +1 -1
  206. package/web-shell/assets/{linear-BjoycSSY.js → linear-BkaREbyD.js} +1 -1
  207. package/web-shell/assets/{mermaid.core-xe6bvMRz.js → mermaid.core-Bkagz0ng.js} +5 -5
  208. package/web-shell/assets/{mindmap-definition-RKZ34NQL-D8DQgI4U.js → mindmap-definition-RKZ34NQL-D7EMKR_5.js} +1 -1
  209. package/web-shell/assets/{pieDiagram-4H26LBE5-Dwh7Gp7c.js → pieDiagram-4H26LBE5-DAmPOjsL.js} +1 -1
  210. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-BXKNBln2.js → quadrantDiagram-W4KKPZXB-e4WFQkQu.js} +1 -1
  211. package/web-shell/assets/{requirementDiagram-4Y6WPE33-BzaC3cIA.js → requirementDiagram-4Y6WPE33-v1zo7OiV.js} +1 -1
  212. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-DP2t7eZk.js → sankeyDiagram-5OEKKPKP-Bstm4aW_.js} +1 -1
  213. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-XlFiWEYv.js → sequenceDiagram-3UESZ5HK-DzcZy6xN.js} +1 -1
  214. package/web-shell/assets/{stateDiagram-AJRCARHV-CupgUMJO.js → stateDiagram-AJRCARHV-BEJH6YbH.js} +1 -1
  215. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-BopifCBI.js +1 -0
  216. package/web-shell/assets/{timeline-definition-PNZ67QCA-DstuGywa.js → timeline-definition-PNZ67QCA-TI1wH-Pm.js} +1 -1
  217. package/web-shell/assets/{vennDiagram-CIIHVFJN-CnbNp6zu.js → vennDiagram-CIIHVFJN-YaH8VDMS.js} +1 -1
  218. package/web-shell/assets/{wardley-L42UT6IY-DnvoHq6R.js → wardley-L42UT6IY-B80co7OP.js} +1 -1
  219. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-Cz0xHEWB.js → wardleyDiagram-YWT4CUSO-4fHNDEMl.js} +1 -1
  220. package/web-shell/assets/{xychartDiagram-2RQKCTM6-p36gfo88.js → xychartDiagram-2RQKCTM6-DT3q4Z3J.js} +1 -1
  221. package/web-shell/index.html +2 -2
  222. package/bundled/loop/SKILL.test.ts +0 -119
  223. package/bundled/loop/autonomous-loop.test.ts +0 -59
  224. package/bundled/loop/loop-task-file.test.ts +0 -1064
  225. package/bundled/loop/loop-tick-resolver.test.ts +0 -906
  226. package/chunks/chunk-EJ7BN3EN.js +0 -11396
  227. package/web-shell/assets/channel-B5ynH0q8.js +0 -1
  228. package/web-shell/assets/classDiagram-4FO5ZUOK-CK3ibywp.js +0 -1
  229. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-CK3ibywp.js +0 -1
  230. package/web-shell/assets/index-9qfvU0_r.css +0 -5
  231. package/web-shell/assets/index-CWzDaQT5.js +0 -717
  232. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-By3E4QwN.js +0 -1
  233. package/chunks/{chunk-UFC57OYT.js → chunk-VRDMOSQS.js} +54 -54
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: dataviz
3
+ description: Design guidance for charts, graphs, dashboards, maps, and data visualizations, including a local palette validator.
4
+ when_to_use: When creating or revising charts, graphs, dashboards, maps, plots, inline SVG, D3, Plotly, Recharts, matplotlib, or any Artifact page that visualizes data.
5
+ allowedTools:
6
+ - read_file
7
+ ---
8
+
9
+ # Dataviz
10
+
11
+ Use this skill before producing a chart, dashboard, map, or data visualization.
12
+
13
+ ## Workflow
14
+
15
+ 1. Identify the analytic task: comparison, trend, distribution, relationship,
16
+ ranking, part-to-whole, geography, or status monitoring.
17
+ 2. Choose the simplest chart form that answers that task. Read
18
+ `references/choosing-a-form.md` when the form is not obvious.
19
+ 3. Write the finding into the title, subtitle, axis label, or direct annotation.
20
+ A viewer should know what changed, what is high or low, or what decision the
21
+ chart supports.
22
+ 4. Pick colors from `references/palette.md`, or validate any custom palette with
23
+ the script below.
24
+ 5. Check `references/anti-patterns.md` before finalizing the design.
25
+
26
+ ## Palette Validation
27
+
28
+ Resolve paths relative to the skill base directory shown above this skill body.
29
+ Do not assume `$QWEN_SKILL_ROOT` is set for normal shell commands.
30
+
31
+ Run:
32
+
33
+ ```bash
34
+ node <skill-base-directory>/scripts/validate_palette.js '#1d4ed8,#b45309,#166534' --mode light
35
+ ```
36
+
37
+ Treat `FAIL` as a required palette change. Treat `WARN` as acceptable only when
38
+ the chart also uses labels, shape, texture, ordering, or another secondary
39
+ encoding.
40
+
41
+ ## Mark Rules
42
+
43
+ - Use categorical palettes for unordered groups; use sequential or diverging
44
+ ramps only for ordered values.
45
+ - Prefer direct labels over legends when the chart has a small number of series.
46
+ - Keep gridlines subtle and fewer than the data marks.
47
+ - Avoid dual axes unless both series share a clearly explained transformation.
48
+ - Do not rely on color alone for critical distinctions.
49
+ - Keep dashboards scan-friendly: align cards, use consistent number formats,
50
+ and reserve saturated color for important state changes.
@@ -0,0 +1,12 @@
1
+ # Dataviz Anti-Patterns
2
+
3
+ - Do not use rainbow palettes for ordered data.
4
+ - Do not use sequential ramps for unrelated categories.
5
+ - Do not encode critical differences with color only.
6
+ - Do not start a bar chart above zero unless the truncation is explicit and
7
+ justified.
8
+ - Do not use dual axes when the visual comparison implies a relationship that
9
+ is not in the data.
10
+ - Do not hide units, denominators, sample sizes, or time windows.
11
+ - Do not let chart decoration compete with marks, labels, and annotations.
12
+ - Do not use a dashboard card if a compact table is clearer.
@@ -0,0 +1,16 @@
1
+ # Choosing A Form
2
+
3
+ | Task | Prefer | Avoid |
4
+ | --------------------- | --------------------------------- | --------------------------------------- |
5
+ | Compare categories | sorted bar chart | pie with many slices |
6
+ | Show change over time | line chart | disconnected bars for dense time series |
7
+ | Show ranking | horizontal bar chart | unsorted columns |
8
+ | Show distribution | histogram, box plot, violin plot | averages without spread |
9
+ | Show relationship | scatter plot | dual-axis line chart |
10
+ | Show part-to-whole | stacked bar for few parts | nested donuts |
11
+ | Show geography | choropleth or symbol map | map when location is irrelevant |
12
+ | Monitor status | compact dashboard with thresholds | decorative KPI cards |
13
+
14
+ Prefer the chart that makes the comparison visible without interaction. Add
15
+ interaction only when it reveals detail, filters clutter, or supports a real
16
+ workflow.
@@ -0,0 +1,57 @@
1
+ # Palette Reference
2
+
3
+ ## Categorical
4
+
5
+ Use these first for independent categories:
6
+
7
+ ```text
8
+ #1d4ed8 blue
9
+ #b45309 orange
10
+ #166534 green
11
+ #7c3aed purple
12
+ #0891b2 cyan
13
+ #be123c rose
14
+ ```
15
+
16
+ Start with three to five colors. If the chart needs more categories than that,
17
+ prefer direct labels, grouping, faceting, or filtering over adding more hues.
18
+
19
+ ## Sequential
20
+
21
+ Use one hue ramp for ordered magnitude:
22
+
23
+ ```text
24
+ #eff6ff #bfdbfe #60a5fa #2563eb #1e3a8a
25
+ ```
26
+
27
+ The lightest and darkest ramp endpoints are for backgrounds, area fills, and
28
+ labels. When choosing exact line, point, or bar mark colors, validate the marks
29
+ you actually use rather than the full ramp.
30
+
31
+ ## Diverging
32
+
33
+ Use a diverging ramp only when there is a meaningful center such as zero,
34
+ target, or baseline:
35
+
36
+ ```text
37
+ #b91c1c #fca5a5 #f8fafc #93c5fd #1d4ed8
38
+ ```
39
+
40
+ The center and endpoint colors provide range context. For exact chart marks,
41
+ validate the selected mark colors and add direct labels or another encoding when
42
+ the validator reports `WARN`.
43
+
44
+ ## Validation
45
+
46
+ Run the validator whenever exact mark colors are chosen:
47
+
48
+ ```bash
49
+ node <skill-base-directory>/scripts/validate_palette.js '#1d4ed8,#b45309,#166534' --mode light
50
+ ```
51
+
52
+ The validator's 2.5:1 contrast floor is a practical chart-mark heuristic, not a
53
+ WCAG AA guarantee. Use 3:1 or higher when chart marks must satisfy WCAG 2.1
54
+ non-text contrast without relying on labels or secondary encodings.
55
+
56
+ The validator also enforces OKLCH lightness bands so marks are neither too pale
57
+ nor too dark for the selected surface, even when contrast alone looks adequate.
@@ -0,0 +1,328 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @license
4
+ * Copyright 2026 Qwen Team
5
+ * SPDX-License-Identifier: Apache-2.0
6
+ */
7
+
8
+ import { resolve } from 'node:path';
9
+ import process from 'node:process';
10
+ import { fileURLToPath } from 'node:url';
11
+
12
+ const MODE_CONFIG = {
13
+ light: {
14
+ surface: [255, 255, 255],
15
+ minLightness: 0.25,
16
+ maxLightness: 0.88,
17
+ minContrast: 2.5,
18
+ },
19
+ dark: {
20
+ surface: [17, 24, 39],
21
+ minLightness: 0.45,
22
+ maxLightness: 0.92,
23
+ minContrast: 2.5,
24
+ },
25
+ };
26
+
27
+ const CVD_MATRICES = {
28
+ protanopia: [
29
+ [0.56667, 0.43333, 0],
30
+ [0.55833, 0.44167, 0],
31
+ [0, 0, 1],
32
+ ],
33
+ deuteranopia: [
34
+ [0.625, 0.375, 0],
35
+ [0.7, 0.3, 0],
36
+ [0, 0.3, 0.7],
37
+ ],
38
+ tritanopia: [
39
+ [0.95, 0.05, 0],
40
+ [0, 0.43333, 0.56667],
41
+ [0, 0.475, 0.525],
42
+ ],
43
+ };
44
+
45
+ const MAX_PALETTE_COLORS = 50;
46
+
47
+ export function validatePalette(input, options = {}) {
48
+ const mode = options.mode ?? 'light';
49
+ const config = modeConfig(mode);
50
+ const failures = [];
51
+ const warnings = [];
52
+
53
+ if (!config) {
54
+ return {
55
+ status: 'FAIL',
56
+ failures: [`Unsupported mode "${mode}". Use "light" or "dark".`],
57
+ warnings,
58
+ };
59
+ }
60
+
61
+ if (input.length === 0) {
62
+ return { status: 'FAIL', failures: ['No colors provided.'], warnings };
63
+ }
64
+
65
+ if (input.length > MAX_PALETTE_COLORS) {
66
+ return {
67
+ status: 'FAIL',
68
+ failures: [
69
+ `Palette has ${input.length} colors; maximum supported is ${MAX_PALETTE_COLORS}.`,
70
+ ],
71
+ warnings,
72
+ };
73
+ }
74
+
75
+ const colors = input.map((value, index) => {
76
+ const rgb = parseHexColor(value);
77
+ if (!rgb) {
78
+ failures.push(
79
+ `Color ${index + 1} has invalid hex color syntax: ${value}`,
80
+ );
81
+ return null;
82
+ }
83
+ const oklch = rgbToOklch(rgb);
84
+ return { value: normalizeHex(rgb), rgb, oklch };
85
+ });
86
+
87
+ if (failures.length > 0) {
88
+ return { status: 'FAIL', failures, warnings };
89
+ }
90
+
91
+ for (const color of colors) {
92
+ if (
93
+ color.oklch.l < config.minLightness ||
94
+ color.oklch.l > config.maxLightness
95
+ ) {
96
+ failures.push(
97
+ `${color.value} has OKLCH lightness ${format(color.oklch.l)}, outside the ${mode} mark band ${config.minLightness}-${config.maxLightness}.`,
98
+ );
99
+ }
100
+
101
+ if (color.oklch.c < 0.04) {
102
+ warnings.push(
103
+ `${color.value} has low OKLCH chroma ${format(color.oklch.c)} and may read as gray.`,
104
+ );
105
+ }
106
+
107
+ const contrast = contrastRatio(color.rgb, config.surface);
108
+ if (contrast < config.minContrast) {
109
+ failures.push(
110
+ `${color.value} contrast ${format(contrast)} is below ${config.minContrast}:1 against the ${mode} chart surface.`,
111
+ );
112
+ }
113
+ }
114
+
115
+ for (const [kind, matrix] of Object.entries(CVD_MATRICES)) {
116
+ const simulated = colors.map((color) => {
117
+ const rgb = applyMatrix(color.rgb, matrix);
118
+ return { value: color.value, rgb, lab: rgbToLab(rgb) };
119
+ });
120
+
121
+ for (const color of simulated) {
122
+ const contrast = contrastRatio(color.rgb, config.surface);
123
+ if (contrast < config.minContrast) {
124
+ warnings.push(
125
+ `${color.value} contrast ${format(contrast)} is below ${config.minContrast}:1 against the ${mode} chart surface under colorblind ${kind} simulation.`,
126
+ );
127
+ }
128
+ }
129
+
130
+ for (let i = 0; i < simulated.length; i++) {
131
+ for (let j = i + 1; j < simulated.length; j++) {
132
+ const distance = labDistance(simulated[i].lab, simulated[j].lab);
133
+ if (distance < 40) {
134
+ warnings.push(
135
+ `${simulated[i].value} and ${simulated[j].value} are close under colorblind ${kind} simulation (DeltaE ${format(distance)}); add secondary encoding such as labels, shape, or texture.`,
136
+ );
137
+ }
138
+ }
139
+ }
140
+ }
141
+
142
+ const uniqueFailures = [...new Set(failures)];
143
+ const uniqueWarnings = [...new Set(warnings)];
144
+ return {
145
+ status:
146
+ uniqueFailures.length > 0
147
+ ? 'FAIL'
148
+ : uniqueWarnings.length > 0
149
+ ? 'WARN'
150
+ : 'PASS',
151
+ failures: uniqueFailures,
152
+ warnings: uniqueWarnings,
153
+ };
154
+ }
155
+
156
+ function parseHexColor(value) {
157
+ if (typeof value !== 'string') return null;
158
+ const hex = value.trim();
159
+ const short = /^#([0-9a-f]{3})$/i.exec(hex);
160
+ if (short) {
161
+ return short[1].split('').map((part) => parseInt(part + part, 16));
162
+ }
163
+ const long = /^#([0-9a-f]{6})$/i.exec(hex);
164
+ if (!long) return null;
165
+ return [0, 2, 4].map((offset) =>
166
+ parseInt(long[1].slice(offset, offset + 2), 16),
167
+ );
168
+ }
169
+
170
+ function normalizeHex(rgb) {
171
+ return `#${rgb.map((channel) => channel.toString(16).padStart(2, '0')).join('')}`;
172
+ }
173
+
174
+ function applyMatrix(rgb, matrix) {
175
+ const linear = rgb.map(srgbChannelToLinear);
176
+ return matrix
177
+ .map((row) => row[0] * linear[0] + row[1] * linear[1] + row[2] * linear[2])
178
+ .map(linearChannelToSrgb);
179
+ }
180
+
181
+ function contrastRatio(left, right) {
182
+ const l1 = relativeLuminance(left);
183
+ const l2 = relativeLuminance(right);
184
+ const lighter = Math.max(l1, l2);
185
+ const darker = Math.min(l1, l2);
186
+ return (lighter + 0.05) / (darker + 0.05);
187
+ }
188
+
189
+ function relativeLuminance(rgb) {
190
+ const [r, g, b] = rgb.map(srgbChannelToLinear);
191
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b;
192
+ }
193
+
194
+ function rgbToLab(rgb) {
195
+ const [x, y, z] = rgbToXyz(rgb);
196
+ const xn = 0.95047;
197
+ const yn = 1;
198
+ const zn = 1.08883;
199
+ const fx = labPivot(x / xn);
200
+ const fy = labPivot(y / yn);
201
+ const fz = labPivot(z / zn);
202
+ return {
203
+ l: 116 * fy - 16,
204
+ a: 500 * (fx - fy),
205
+ b: 200 * (fy - fz),
206
+ };
207
+ }
208
+
209
+ function rgbToXyz(rgb) {
210
+ const [r, g, b] = rgb.map(srgbChannelToLinear);
211
+ return [
212
+ r * 0.4124564 + g * 0.3575761 + b * 0.1804375,
213
+ r * 0.2126729 + g * 0.7151522 + b * 0.072175,
214
+ r * 0.0193339 + g * 0.119192 + b * 0.9503041,
215
+ ];
216
+ }
217
+
218
+ function labPivot(value) {
219
+ return value > 0.008856 ? Math.cbrt(value) : 7.787 * value + 16 / 116;
220
+ }
221
+
222
+ function rgbToOklch(rgb) {
223
+ const [r, g, b] = rgb.map(srgbChannelToLinear);
224
+
225
+ const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);
226
+ const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);
227
+ const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);
228
+
229
+ const okL = 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s;
230
+ const okA = 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s;
231
+ const okB = 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s;
232
+
233
+ return {
234
+ l: okL,
235
+ c: Math.sqrt(okA * okA + okB * okB),
236
+ };
237
+ }
238
+
239
+ function srgbChannelToLinear(channel) {
240
+ const value = channel / 255;
241
+ return value <= 0.04045 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;
242
+ }
243
+
244
+ function linearChannelToSrgb(channel) {
245
+ const value = Math.max(0, Math.min(1, channel));
246
+ const encoded =
247
+ value <= 0.0031308 ? value * 12.92 : 1.055 * value ** (1 / 2.4) - 0.055;
248
+ return Math.round(encoded * 255);
249
+ }
250
+
251
+ function labDistance(left, right) {
252
+ return Math.sqrt(
253
+ (left.l - right.l) ** 2 + (left.a - right.a) ** 2 + (left.b - right.b) ** 2,
254
+ );
255
+ }
256
+
257
+ function format(value) {
258
+ return Number(value.toFixed(3)).toString();
259
+ }
260
+
261
+ function parseArgs(argv) {
262
+ let mode = 'light';
263
+ let palette;
264
+ for (let i = 0; i < argv.length; i++) {
265
+ if (argv[i] === '--mode') {
266
+ if (!argv[i + 1] || argv[i + 1].startsWith('--')) {
267
+ process.stderr.write(
268
+ 'Error: --mode requires a value (light or dark)\n',
269
+ );
270
+ process.exit(2);
271
+ }
272
+ mode = argv[++i];
273
+ } else if (argv[i].startsWith('--mode=')) {
274
+ mode = argv[i].slice('--mode='.length);
275
+ if (!mode) {
276
+ process.stderr.write(
277
+ 'Error: --mode requires a value (light or dark)\n',
278
+ );
279
+ process.exit(2);
280
+ }
281
+ } else if (!palette) {
282
+ palette = argv[i];
283
+ }
284
+ }
285
+ return { palette, mode };
286
+ }
287
+
288
+ function printResult(result) {
289
+ process.stdout.write(`${result.status}\n`);
290
+ for (const failure of result.failures) {
291
+ process.stderr.write(`FAIL: ${failure}\n`);
292
+ }
293
+ for (const warning of result.warnings) {
294
+ process.stdout.write(`WARN: ${warning}\n`);
295
+ }
296
+ }
297
+
298
+ function modeConfig(mode) {
299
+ return Object.hasOwn(MODE_CONFIG, mode) ? MODE_CONFIG[mode] : undefined;
300
+ }
301
+
302
+ if (
303
+ process.argv[1] &&
304
+ fileURLToPath(import.meta.url) === resolve(process.argv[1])
305
+ ) {
306
+ const { palette, mode } = parseArgs(process.argv.slice(2));
307
+ if (!palette) {
308
+ process.stderr.write(
309
+ "Usage: node validate_palette.js '#1d4ed8,#b45309,#166534' --mode light\n",
310
+ );
311
+ process.exit(2);
312
+ }
313
+ if (!modeConfig(mode)) {
314
+ process.stderr.write(
315
+ `Error: Unsupported mode "${mode}". Use "light" or "dark".\n`,
316
+ );
317
+ process.exit(2);
318
+ }
319
+ const result = validatePalette(
320
+ palette
321
+ .split(',')
322
+ .map((color) => color.trim())
323
+ .filter(Boolean),
324
+ { mode },
325
+ );
326
+ printResult(result);
327
+ process.exit(result.status === 'FAIL' ? 1 : 0);
328
+ }
@@ -88,7 +88,7 @@ If the interval does not cleanly divide its unit (for example `7m` gives uneven
88
88
  - `prompt`: the parsed prompt from above, verbatim (slash commands are passed through unchanged)
89
89
  - `recurring`: `true`
90
90
  - `durable`: `true` if the user's language implies persistence ("keep doing this", "set this up permanently", "every day even after restart"). Otherwise omit (defaults to session-only).
91
- 2. Briefly confirm: what is scheduled, the cron expression, the human-readable cadence, that recurring tasks auto-expire after 7 days, and that they can cancel sooner with CronDelete (include the job ID).
91
+ 2. Briefly confirm: what is scheduled, the cron expression, the human-readable cadence, the auto-expiry (7 days after creation by default — the CronCreate tool description states the configured limit, which may differ or be disabled), and that they can cancel sooner with CronDelete (include the job ID).
92
92
  3. Then immediately execute the parsed prompt now. Do not wait for the first cron fire.
93
93
  - If it is a slash command, invoke it via the Skill tool.
94
94
  - Otherwise, act on it directly.
@@ -155,11 +155,13 @@ Settings are organized into categories. Most settings should be placed within th
155
155
  | Setting | Type | Description | Default |
156
156
  | -------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
157
157
  | `model.name` | string | The Qwen model to use for conversations. | `undefined` |
158
+ | `model.reasoningEffort` | enum | How hard reasoning-capable models think, applied across all providers. Set with the [`/effort`](../features/commands) command (`low`, `medium`, `high`, `xhigh`, `max`). Each provider maps and clamps this to what the active model supports (e.g. Gemini caps at `high`; Anthropic clamps tiers a model lacks). Leave unset to use the model/provider default. | `undefined` |
158
159
  | `model.baseUrl` | string | Persisted automatically by the model picker to disambiguate when multiple `modelProviders` entries share the same model id. Not intended to be set by hand — use the `/model` picker or a `modelProviders` entry instead; a stale hand-edited value can silently route requests to a different same-id provider. | `undefined` |
159
160
  | `model.sessionTokenLimit` | number | Maximum recorded prompt token count allowed before sending the next message. `-1` means unlimited; `0` is also treated as unlimited (unlike `model.maxToolCalls`, where `0` disallows all calls). When the recorded prompt count exceeds the limit, the next send is dropped (the session is not aborted). | `-1` |
160
161
  | `model.maxSessionTurns` | number | Maximum number of user/model/tool turns to keep in a session. -1 means unlimited. | `-1` |
161
162
  | `model.maxWallTimeSeconds` | number | Wall-clock budget for headless / unattended runs, in seconds. `-1` means unlimited. Overridable per-invocation via `--max-wall-time`, which requires a positive duration (`90`, `30s`, `5m`, `1h`, `1.5h`); the minimum is 1 second — sub-second values (`500ms`, `0.5`) are rejected as typos. Omit the flag to fall back to this setting. Aborts with exit code 55 when exceeded. | `-1` |
162
163
  | `model.maxToolCalls` | number | Cumulative tool-call budget for a run (counts every executed tool, success or failure; `structured_output` under `--json-schema` is exempt). `-1` means unlimited; `0` means "no tool calls allowed". Capped at 1,000,000 to catch typos. Overridable via `--max-tool-calls`. Aborts with exit code 55 when exceeded. | `-1` |
164
+ | `model.maxSubagentDepth` | number | Maximum sub-agent nesting depth (1-based levels: a top-level sub-agent is level 1). `1` keeps sub-agents available but disables nesting — the pre-nesting behavior. Values clamp to the range 1–100; non-finite values fall back to the default. Teammates, forks, and workflow-spawned agents never nest regardless of this setting. Overridable via `--max-subagent-depth`. | `5` |
163
165
  | `model.generationConfig` | object | Advanced overrides passed to the underlying content generator. Supports request controls such as `timeout`, `maxRetries`, `enableCacheControl`, `splitToolMedia` (default `true`; splits tool-returned media — including images read by the built-in read_file — into a follow-up user message instead of the spec-violating `role: "tool"` message, so strict OpenAI-compatible servers like doubao / new-api / LM Studio can see it; set `false` to restore the legacy embed-in-tool behavior), `toolResultContentFormat` (default `"parts"`; set `"string"` only for legacy OpenAI-compatible runtimes whose tool templates ignore text content parts), `contextWindowSize` (override model's context window size), `modalities` (override auto-detected input modalities), `customHeaders` (custom HTTP headers for API requests), and `extra_body` (additional body parameters for OpenAI-compatible API requests only), along with fine-tuning knobs under `samplingParams` (for example `temperature`, `top_p`, `max_tokens`). Leave unset to rely on provider defaults. | `undefined` |
164
166
  | `model.chatCompression.contextPercentageThreshold` | number | **REMOVED.** Replaced by `context.autoCompactThreshold` (see `#### context` section below). Auto-compaction now uses a three-tier threshold ladder (warn / auto / hard) computed internally from the model's context window via the `computeThresholds()` function. The old setting is silently ignored (no startup warning). See PR #4345 / `docs/design/auto-compaction-threshold-redesign.md` for the redesign rationale. | `N/A` |
165
167
  | `model.chatCompression.maxRecentFilesToRetain` | number | Number of most-recently-touched files whose current content is restored (embedded if small, otherwise referenced by path) into history after auto-compaction. `0` restores none. Env override: `QWEN_COMPACT_MAX_RECENT_FILES`. | `5` |
@@ -496,12 +498,13 @@ LSP server configuration is done through `.lsp.json` files in your project root
496
498
  >
497
499
  > **Experimental features.** These toggles gate in-development capabilities and may change or be removed in future releases.
498
500
 
499
- | Setting | Type | Description | Default |
500
- | ----------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
501
- | `experimental.cron` | boolean | Enable in-session cron/loop tools (`cron_create`, `cron_list`, `cron_delete`) so the model can create recurring prompts. Can be disabled via the `QWEN_CODE_DISABLE_CRON=1` environment variable. Requires restart. | `true` |
502
- | `experimental.agentTeam` | boolean | Enable agent-team collaboration tools (`team_create`, `task_create`, `task_update`, `send_message`, etc.) for multi-agent coordination. Can also be enabled via `QWEN_CODE_ENABLE_AGENT_TEAM=1`. Requires restart. | `false` |
503
- | `experimental.artifact` | boolean | Enable the Artifact tool, letting the model publish a self-contained HTML page and open it in the browser. Interactive, non-SDK sessions only. Toggle via `QWEN_CODE_ENABLE_ARTIFACT=1` / `QWEN_CODE_DISABLE_ARTIFACT=1`. Requires restart. | `false` |
504
- | `experimental.emitToolUseSummaries` | boolean | Generate a short LLM-based label after each tool-call batch completes. See [Tool-Use Summaries](../features/tool-use-summaries). Requires a fast model to be configured (`fastModel`); silently skipped otherwise. Can be overridden per-session with `QWEN_CODE_EMIT_TOOL_USE_SUMMARIES=0` or `=1`. | `true` |
501
+ | Setting | Type | Description | Default |
502
+ | -------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
503
+ | `experimental.cron` | boolean | Enable in-session cron/loop tools (`cron_create`, `cron_list`, `cron_delete`) so the model can create recurring prompts. Can be disabled via the `QWEN_CODE_DISABLE_CRON=1` environment variable. Requires restart. | `true` |
504
+ | `experimental.cronRecurringMaxAgeDays` | number | Days a recurring cron/loop job lives before auto-expiring (it fires one final time, then is deleted). Set to `0` to disable expiry so jobs run until deleted — useful for long-running daemon deployments. Can be overridden via the `QWEN_CODE_CRON_MAX_AGE_DAYS` environment variable. Requires restart. | `7` |
505
+ | `experimental.agentTeam` | boolean | Enable agent-team collaboration tools (`team_create`, `task_create`, `task_update`, `send_message`, etc.) for multi-agent coordination. Can also be enabled via `QWEN_CODE_ENABLE_AGENT_TEAM=1`. Requires restart. | `false` |
506
+ | `experimental.artifact` | boolean | Enable the Artifact tool, letting the model publish a self-contained HTML page and open it in the browser. Interactive, non-SDK sessions only. `QWEN_CODE_ENABLE_ARTIFACT=1` enables metadata-only `record_artifact` for non-SDK daemon sessions and also enables the Artifact tool in interactive sessions; `QWEN_CODE_DISABLE_ARTIFACT=1` disables both. Requires restart. | `false` |
507
+ | `experimental.emitToolUseSummaries` | boolean | Generate a short LLM-based label after each tool-call batch completes. See [Tool-Use Summaries](../features/tool-use-summaries). Requires a fast model to be configured (`fastModel`); silently skipped otherwise. Can be overridden per-session with `QWEN_CODE_EMIT_TOOL_USE_SUMMARIES=0` or `=1`. | `true` |
505
508
 
506
509
  #### mcpServers
507
510
 
@@ -680,9 +683,7 @@ For sandbox image selection, precedence is:
680
683
  | `--sandbox` | `-s` | Enables sandbox mode for this session. | | |
681
684
  | `--sandbox-image` | | Sets the sandbox image URI. | | |
682
685
  | `--debug` | `-d` | Enables debug mode for this session, providing more verbose output. | | |
683
- | `--all-files` | `-a` | If set, recursively includes all files within the current directory as context for the prompt. | | |
684
686
  | `--help` | `-h` | Displays help information about command-line arguments. | | |
685
- | `--show-memory-usage` | | Displays the current memory usage. | | |
686
687
  | `--yolo` | | Enables YOLO mode, which automatically approves all tool calls. | | |
687
688
  | `--approval-mode` | | Sets the approval mode for tool calls. | `plan`, `default`, `auto-edit`, `auto`, `yolo` | Supported modes: `plan`: Analyze only—do not modify files or execute commands. `default`: Require approval for file edits or shell commands (default behavior). `auto-edit`: Automatically approve edit tools (`edit`, `write_file`, `notebook_edit`) while prompting for others. `auto`: LLM classifier auto-approves safe actions and blocks risky ones. `yolo`: Automatically approve all tool calls (equivalent to `--yolo`). Cannot be used together with `--yolo`. Use `--approval-mode=yolo` instead of `--yolo` for the new unified approach. Example: `qwen --approval-mode auto-edit`<br>See more about [Approval Mode](../features/approval-mode). |
688
689
  | `--allowed-tools` | | A comma-separated list of tool names that will bypass the confirmation dialog. | Tool names | Example: `qwen --allowed-tools "Shell(git status)"` |
@@ -233,10 +233,10 @@ Key command-line options for headless usage:
233
233
  | `--append-system-prompt` | Append extra instructions to the main session system prompt for this run | `qwen -p "query" --append-system-prompt "Focus on concrete findings."` |
234
234
  | `--debug`, `-d` | Enable debug mode | `qwen -p "query" --debug` |
235
235
  | `--safe-mode` | Disable all customizations — context files, hooks, extensions, skills, MCP servers, custom subagents (only built-in subagents load), permission rules, settings-sourced approval mode overrides, memory features, and sandbox settings — to isolate problems; the CLI flags `--yolo` and `--approval-mode` still take effect. See [Troubleshooting](../support/troubleshooting). Also settable via `QWEN_CODE_SAFE_MODE=true`. | `qwen -p "query" --safe-mode` |
236
- | `--all-files`, `-a` | Include all files in context | `qwen -p "query" --all-files` |
236
+ | `--model`, `-m` | Model to use for this run | `qwen -p "query" --model qwen3-coder-plus` |
237
237
  | `--include-directories` | Include additional directories | `qwen -p "query" --include-directories src,docs` |
238
238
  | `--yolo`, `-y` | Auto-approve all actions | `qwen -p "query" --yolo` |
239
- | `--approval-mode` | Set approval mode | `qwen -p "query" --approval-mode auto_edit` |
239
+ | `--approval-mode` | Set approval mode (`plan`, `default`, `auto-edit`, `auto`, `yolo`) | `qwen -p "query" --approval-mode auto-edit` |
240
240
  | `--continue` | Resume the most recent session for this project | `qwen --continue -p "Pick up where we left off"` |
241
241
  | `--resume [sessionId]` | Resume a specific session (or choose interactively) | `qwen --resume 123e... -p "Finish the refactor"` |
242
242
  | `--max-session-turns` | Cap the number of user/model/tool turns in the run | `qwen -p "..." --max-session-turns 30` |
@@ -117,9 +117,11 @@ To avoid every session hitting the API at the same wall-clock moment, the schedu
117
117
 
118
118
  The offset is derived from the task ID, so the same task always gets the same offset. If exact timing matters, pick a minute that is not `:00` or `:30`, for example `3 9 * * *` instead of `0 9 * * *`, and the one-shot jitter will not apply.
119
119
 
120
- ### Three-day expiry
120
+ ### Recurring-task expiry
121
121
 
122
- Recurring tasks automatically expire 3 days after creation. The task fires one final time, then deletes itself. This bounds how long a forgotten loop can run. If you need a recurring task to last longer, cancel and recreate it before it expires.
122
+ Recurring tasks automatically expire 7 days after creation by default. The task fires one final time, then deletes itself. This bounds how long a forgotten loop can run.
123
+
124
+ To change the limit, set `experimental.cronRecurringMaxAgeDays` in your [settings](../configuration/settings.md), or set the `QWEN_CODE_CRON_MAX_AGE_DAYS` environment variable (the environment variable wins — convenient for cloud or container deployments where editing `settings.json` is impractical). A value of `0` disables expiry entirely, so tasks run until you delete them — useful for long-running daemon deployments that host daily reports, digests, or ongoing monitoring. The configured limit also applies to durable tasks restored from disk after a restart.
123
125
 
124
126
  One-shot tasks do not expire on a timer — they simply delete themselves after firing once.
125
127
 
@@ -47,7 +47,7 @@ This document lists the available keyboard shortcuts in Qwen Code.
47
47
  | `Ctrl+U` | Delete from the cursor to the beginning of the line. |
48
48
  | `Ctrl+V` (Windows: `Alt+V`) | Paste clipboard content. If the clipboard contains an image, it will be saved and a reference to it will be inserted in the prompt. |
49
49
  | `Ctrl+W` / `Meta+Backspace` / `Ctrl+Backspace` | Delete the word to the left of the cursor. |
50
- | `Ctrl+X` / `Meta+Enter` | Open the current input in an external editor. |
50
+ | `Ctrl+X` | Open the current input in an external editor. |
51
51
 
52
52
  ## Suggestions
53
53