@qwen-code/qwen-code 0.23.1 → 0.23.2-nightly.20260909.2e212144d3

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 (293) hide show
  1. package/README.md +35 -15
  2. package/bundled/computer-use/SKILL.md +1 -1
  3. package/bundled/qc-helper/docs/configuration/auth.md +1 -1
  4. package/bundled/qc-helper/docs/configuration/model-providers.md +19 -15
  5. package/bundled/qc-helper/docs/configuration/settings.md +1 -1
  6. package/bundled/qc-helper/docs/features/_meta.ts +1 -0
  7. package/bundled/qc-helper/docs/features/channels/dingtalk.md +1 -1
  8. package/bundled/qc-helper/docs/features/channels/github.md +1 -9
  9. package/bundled/qc-helper/docs/features/channels/overview.md +26 -51
  10. package/bundled/qc-helper/docs/features/channels/qqbot.md +1 -2
  11. package/bundled/qc-helper/docs/features/commands.md +79 -17
  12. package/bundled/qc-helper/docs/features/computer-use.md +1 -1
  13. package/bundled/qc-helper/docs/features/cross-session-protocol.md +291 -0
  14. package/bundled/qc-helper/docs/features/goals.md +3 -1
  15. package/bundled/qc-helper/docs/features/sub-agents.md +8 -0
  16. package/bundled/qc-helper/docs/qwen-serve.md +62 -48
  17. package/chunks/{MaxSizedBox-UDO6Y7RB.js → MaxSizedBox-ZBGWYJZW.js} +20 -19
  18. package/chunks/{StandaloneSessionPicker-D4CUOO4H.js → StandaloneSessionPicker-NR5ACIJZ.js} +35 -34
  19. package/chunks/{acpAgent-KWLJFADK.js → acpAgent-DM6XRCDQ.js} +307 -183
  20. package/chunks/{agent-GSUPGEOL.js → agent-EF3IIYE3.js} +13 -13
  21. package/chunks/{agent-headless-HNYCQUJB.js → agent-headless-5J2KFYR4.js} +13 -13
  22. package/chunks/{anthropicContentGenerator-I7LQZH26.js → anthropicContentGenerator-VIW2FG7G.js} +4 -4
  23. package/chunks/{artifact-tool-P52OKKEF.js → artifact-tool-G5LHNECG.js} +1 -1
  24. package/chunks/{askUserQuestion-I5W5S3D6.js → askUserQuestion-R3TXY77M.js} +1 -1
  25. package/chunks/{bridge-B7CV6RVI.js → bridge-LEMQM6QE.js} +21 -20
  26. package/chunks/{channel-management-service-TRTLQTSV.js → channel-management-service-TGF6XFXT.js} +4 -4
  27. package/chunks/{channel-settings-store-FW45IRUP.js → channel-settings-store-FV365JSF.js} +29 -28
  28. package/chunks/{channel-worker-group-PIYPVCTF.js → channel-worker-group-SQ5FRWOH.js} +5 -5
  29. package/chunks/{channel-worker-manager-FQHEDTD2.js → channel-worker-manager-TU4ZNWOE.js} +5 -5
  30. package/chunks/{channel-worker-supervisor-XJPZZ3VK.js → channel-worker-supervisor-EMITFMCP.js} +4 -4
  31. package/chunks/{chunk-3SH53ANB.js → chunk-22GORRNY.js} +12 -0
  32. package/chunks/{chunk-3LPJ776W.js → chunk-2HYOOFDS.js} +9 -6
  33. package/chunks/{chunk-S6QVI3MV.js → chunk-34VPADLG.js} +2 -2
  34. package/chunks/{chunk-WJDXKQIO.js → chunk-3A2IMUDH.js} +14 -2
  35. package/chunks/{chunk-DXQ6Z7AH.js → chunk-3O77M472.js} +224 -84
  36. package/chunks/{chunk-5CVY5Q2P.js → chunk-43EUMPKQ.js} +1 -1
  37. package/chunks/{chunk-ZNO5BUAD.js → chunk-4DIMJKWU.js} +46 -37
  38. package/chunks/{chunk-O2JBJQCF.js → chunk-5HV2HPO7.js} +1 -1
  39. package/chunks/{chunk-RXT4QBDX.js → chunk-5WBA3DEF.js} +1 -1
  40. package/chunks/{chunk-ARYNBBBM.js → chunk-6GAYNM3F.js} +3 -3
  41. package/chunks/{chunk-EEKU6COG.js → chunk-6S7YYUUH.js} +3 -3
  42. package/chunks/{chunk-OPMKGOLD.js → chunk-6VIATHL7.js} +1 -1
  43. package/chunks/{chunk-ENZDGHGJ.js → chunk-76I36BEM.js} +3 -3
  44. package/chunks/{chunk-B54PFQS5.js → chunk-7CLLH5TI.js} +1 -1
  45. package/chunks/{chunk-UHUT4IDM.js → chunk-7IDZFJAV.js} +9 -9
  46. package/chunks/{chunk-5Z4FCEPY.js → chunk-7K4GGN3D.js} +606 -109
  47. package/chunks/{chunk-ZPL2TZNA.js → chunk-7KZVXJ4U.js} +1 -1
  48. package/chunks/{chunk-FWRRUITH.js → chunk-7WCJEY3A.js} +4 -4
  49. package/chunks/{chunk-MFYH2VXV.js → chunk-A7QZIGRB.js} +2 -2
  50. package/chunks/{chunk-27LTEY6D.js → chunk-ATBLEXXV.js} +7 -2
  51. package/chunks/{chunk-3BTHHXXE.js → chunk-AUTUFD5X.js} +1 -1
  52. package/chunks/chunk-AXMWHKXA.js +42 -0
  53. package/chunks/{chunk-QZOXVQPK.js → chunk-AXWTG6R7.js} +2 -5
  54. package/chunks/{chunk-PDUMGZ2P.js → chunk-BDAVT6K2.js} +486 -409
  55. package/chunks/{chunk-2YS3NU4A.js → chunk-BDP3NTWD.js} +3 -3
  56. package/chunks/{chunk-IKG2YVRZ.js → chunk-BZUHZCUO.js} +2 -2
  57. package/chunks/{chunk-USN6VNTO.js → chunk-C24ZDDNY.js} +1 -1
  58. package/chunks/{chunk-RPFJJ33Z.js → chunk-CALTQWTZ.js} +1 -1
  59. package/chunks/{chunk-BF3RUIVP.js → chunk-CH2YDT6X.js} +36 -38
  60. package/chunks/{chunk-3VDLQUR2.js → chunk-D6AGS266.js} +1 -1
  61. package/chunks/{chunk-DO5SMV52.js → chunk-D7DFZAK2.js} +17 -11
  62. package/chunks/{chunk-GM44O6F7.js → chunk-DARWOZY6.js} +1 -1
  63. package/chunks/{chunk-HUX2DOTF.js → chunk-DGNRLJ6S.js} +3 -3
  64. package/chunks/{chunk-FW4E4QPG.js → chunk-DVOCOIS5.js} +1 -1
  65. package/chunks/{chunk-OESZTXTG.js → chunk-E4LXNQAK.js} +1 -1
  66. package/chunks/{chunk-TWAMIEQ2.js → chunk-EATP5QCN.js} +16 -18
  67. package/chunks/{chunk-DZ6D4B3K.js → chunk-EDSU3VUG.js} +12 -5
  68. package/chunks/{chunk-EOET4H7C.js → chunk-EE5ZD4XU.js} +3 -3
  69. package/chunks/{chunk-B3EL44K3.js → chunk-EN3Q2S3J.js} +3 -3
  70. package/chunks/{chunk-N7YQEKGX.js → chunk-EOLGAQ25.js} +16 -15
  71. package/chunks/{chunk-3YQMUBTS.js → chunk-EYCW6UF2.js} +7 -7
  72. package/chunks/{chunk-ZELCTN6Y.js → chunk-F23YN37B.js} +10 -0
  73. package/chunks/{chunk-FPGTNKCP.js → chunk-F3M6P6IQ.js} +199 -1
  74. package/chunks/{chunk-B44JBZBB.js → chunk-F4SAL7WM.js} +91 -3
  75. package/chunks/{chunk-XZ3Z43XL.js → chunk-FEEVHJOR.js} +3 -3
  76. package/chunks/{chunk-CHVU543W.js → chunk-FN4KHWCL.js} +1 -1
  77. package/chunks/{chunk-6QV7Z74P.js → chunk-FRS3P7MQ.js} +15 -2
  78. package/chunks/{chunk-FDOGGKAA.js → chunk-GSFV5RQW.js} +2 -0
  79. package/chunks/{chunk-XBVNNDPK.js → chunk-GSYD7MYP.js} +8 -3
  80. package/chunks/{chunk-VF6D6EGV.js → chunk-HSO6D4KX.js} +82 -25
  81. package/chunks/{chunk-L7V52QEZ.js → chunk-HUJJFSMO.js} +10 -10
  82. package/chunks/{chunk-CIKL2DQP.js → chunk-HW4MRP4V.js} +1 -1
  83. package/chunks/{chunk-TWWS7XUW.js → chunk-HWLLUDIA.js} +108 -16
  84. package/chunks/{chunk-75LBC7SV.js → chunk-IKK6NNS6.js} +32 -29
  85. package/chunks/{chunk-UXDVUFKU.js → chunk-JFAGT5YG.js} +2 -2
  86. package/chunks/{chunk-6SADVYQQ.js → chunk-JGTMTJSQ.js} +1 -1
  87. package/chunks/{chunk-45ROPFQY.js → chunk-JYGIJA4W.js} +1 -1
  88. package/chunks/{chunk-5WC2ECUK.js → chunk-KECCLCXM.js} +42 -8
  89. package/chunks/{chunk-CABDNUJ4.js → chunk-KEPC5BOL.js} +5 -5
  90. package/chunks/{chunk-WNISCNTA.js → chunk-L5VHJYHH.js} +2 -2
  91. package/chunks/{chunk-25CBAK3H.js → chunk-LKBOBUA2.js} +2 -2
  92. package/chunks/{chunk-6QILGINT.js → chunk-LOBKNYPR.js} +2 -2
  93. package/chunks/{chunk-2ZFO5JD7.js → chunk-LOVGQ3HZ.js} +9 -9
  94. package/chunks/{chunk-QK4K76T6.js → chunk-MUF4UGPB.js} +2 -2
  95. package/chunks/{chunk-JGDRB4FP.js → chunk-N3Z6Q7KC.js} +125 -10
  96. package/chunks/chunk-NFXXBWSE.js +463 -0
  97. package/chunks/{chunk-PQSCGZT2.js → chunk-NPKCVSXX.js} +26 -2
  98. package/chunks/{chunk-YCEKI7QX.js → chunk-NV4YYXFT.js} +1 -1
  99. package/chunks/{chunk-5IL2BZHW.js → chunk-O6BFERWN.js} +3 -3
  100. package/chunks/{chunk-TGC4264Q.js → chunk-OVTPETDL.js} +5 -5
  101. package/chunks/chunk-PLEBBGHL.js +1401 -0
  102. package/chunks/{chunk-3VWPPK5Q.js → chunk-PWR6BQ3U.js} +4 -4
  103. package/chunks/{chunk-D6AQNMUA.js → chunk-QA2B26PL.js} +3 -3
  104. package/chunks/{chunk-NFIDVZND.js → chunk-QB3KS3N3.js} +2 -21
  105. package/chunks/{chunk-LNCNUMJ5.js → chunk-SK6VACCM.js} +558 -158
  106. package/chunks/{chunk-YAC7H4K3.js → chunk-SM66GFKJ.js} +1 -1
  107. package/chunks/{chunk-MA5OUNN6.js → chunk-SNMUO5Z7.js} +1 -1
  108. package/chunks/{chunk-IRKQ4YYX.js → chunk-SVWWF5TZ.js} +29 -1
  109. package/chunks/{chunk-6JXHO7LG.js → chunk-SYKPMH2X.js} +3 -3
  110. package/chunks/{chunk-5HBA2Z7V.js → chunk-TGNNLRC3.js} +2 -3
  111. package/chunks/{chunk-EHTKOO6W.js → chunk-TRQNRP2H.js} +2 -2
  112. package/chunks/{chunk-LZGFVUWZ.js → chunk-UQOP2APG.js} +4 -24
  113. package/chunks/{chunk-T2IHCZLS.js → chunk-VAWM3A5N.js} +1 -1
  114. package/chunks/{chunk-M73KHGNR.js → chunk-VJJXG73H.js} +404 -226
  115. package/chunks/{chunk-WAASYFPK.js → chunk-VJWJOKOQ.js} +2 -2
  116. package/chunks/{chunk-WQMUGQ6G.js → chunk-VR6Y23FW.js} +1 -1
  117. package/chunks/{chunk-E7XSUYCZ.js → chunk-VX2NR3SD.js} +19 -4
  118. package/chunks/{chunk-XVTCSVBK.js → chunk-WDVV3LRM.js} +193 -169
  119. package/chunks/{chunk-RNYENHN5.js → chunk-WEU6O6VN.js} +2 -2
  120. package/chunks/{chunk-YHDGABDC.js → chunk-XKBFYTCD.js} +1 -1
  121. package/chunks/{chunk-66JBCTJF.js → chunk-Y7YHAY32.js} +23 -6
  122. package/chunks/{chunk-7SL55L5H.js → chunk-YIE6REQ5.js} +20 -15
  123. package/chunks/{chunk-ZU2T5JIS.js → chunk-ZEFWBG2C.js} +736 -1148
  124. package/chunks/{chunk-6TPVIESH.js → chunk-ZM2TCZZ7.js} +3 -3
  125. package/chunks/{chunk-2TMJRF46.js → chunk-ZZ7RVOTU.js} +50 -18
  126. package/chunks/{config-utils-KTDSQ4MU.js → config-utils-SXFK3G4X.js} +24 -23
  127. package/chunks/{contextCommand-UQ3KRYGK.js → contextCommand-QFPD26QO.js} +21 -20
  128. package/chunks/{core-runtime-JR34JAFH.js → core-runtime-VXKNBODM.js} +26 -24
  129. package/chunks/{create-sub-session-RGPJOI4S.js → create-sub-session-7WSQETFR.js} +20 -19
  130. package/chunks/{daemon-UI6SQSBV.js → daemon-U2456K5H.js} +2 -2
  131. package/chunks/{daemon-git-worktree-guard-H3OA26KQ.js → daemon-git-worktree-guard-I4DCSDUS.js} +20 -19
  132. package/chunks/{daemon-status-provider-6WZLKSZU.js → daemon-status-provider-5UV56RI4.js} +25 -24
  133. package/chunks/{daemon-trust-policy-3EDP2BYD.js → daemon-trust-policy-DKIBWTKU.js} +25 -24
  134. package/chunks/{daemon-trust-policy-monitor-CRHZPK52.js → daemon-trust-policy-monitor-CPSD7UKT.js} +25 -24
  135. package/chunks/{deferred-core-runtime-LO5NTQQ4.js → deferred-core-runtime-D2RF35BL.js} +20 -19
  136. package/chunks/{dist-STAGIFNB.js → dist-6YDUH3BB.js} +388 -102
  137. package/chunks/{dist-XJ25G6OH.js → dist-BNQVF565.js} +2 -8
  138. package/chunks/{dist-NQ2636VT.js → dist-F34J4FZX.js} +1 -1
  139. package/chunks/{dist-OR2ZQTXZ.js → dist-F6JLAJLE.js} +1 -1
  140. package/chunks/{dist-24TCWK5H.js → dist-K5GHMXIG.js} +2 -2
  141. package/chunks/{dist-WZTUKIDR.js → dist-NP7QKLVG.js} +2 -2
  142. package/chunks/{dist-M4CBX53H.js → dist-UFTFGI6I.js} +1 -1
  143. package/chunks/{dist-5I4HLUTO.js → dist-XLV33CLY.js} +1 -2
  144. package/chunks/{dist-FDISN4AK.js → dist-ZDNJK74R.js} +3 -7
  145. package/chunks/{edit-LB7Z7XK5.js → edit-4IBADZ3O.js} +13 -13
  146. package/chunks/{enterPlanMode-P6TVUFIY.js → enterPlanMode-YN3GPQU5.js} +13 -13
  147. package/chunks/{environment-QATJNNKI.js → environment-E272IJMF.js} +22 -21
  148. package/chunks/{errors-3XJ37PS2.js → errors-CVAH3RWQ.js} +22 -21
  149. package/chunks/{exitPlanMode-A3OKL5UO.js → exitPlanMode-24J5IHGC.js} +13 -13
  150. package/chunks/{fast-path-DBIT5YQQ.js → fast-path-M5IDBMXF.js} +3 -3
  151. package/chunks/{glob-73EDTXUE.js → glob-ERBD7JYP.js} +13 -13
  152. package/chunks/{goal-tools-DFI6YMSD.js → goal-tools-245ULLQT.js} +13 -13
  153. package/chunks/{handleAutoUpdate-2FUNJO3B.js → handleAutoUpdate-JDZHHZKK.js} +22 -21
  154. package/chunks/{i18n-FDIA6KFI.js → i18n-LA4D5IXM.js} +20 -19
  155. package/chunks/{initializer-4MJTJOTW.js → initializer-SHPTSWUZ.js} +25 -24
  156. package/chunks/{installationInfo-232RA2OK.js → installationInfo-QEQEPB3G.js} +20 -19
  157. package/chunks/{list-WN6WSGEB.js → list-IBHCQWTF.js} +28 -27
  158. package/chunks/{list-agents-I5TRH3J7.js → list-agents-EDPZCGKN.js} +5 -4
  159. package/chunks/{llm-UDFWQWZA.js → llm-JAWCQLA4.js} +68 -62
  160. package/chunks/{llm-content-generator-VLMZ2A7A.js → llm-content-generator-GOV3A23T.js} +2 -2
  161. package/chunks/{loadedSettingsAdapter-OBQEIXM7.js → loadedSettingsAdapter-RVE2GNVU.js} +25 -24
  162. package/chunks/{loggingContentGenerator-RGVUMUVX.js → loggingContentGenerator-SSHNN5YW.js} +15 -15
  163. package/chunks/{managed-npm-update-QBAJYCFU.js → managed-npm-update-BHSTITQO.js} +20 -19
  164. package/chunks/{mcp-OTIZZCPY.js → mcp-6ZZ7P2HU.js} +25 -24
  165. package/chunks/{monitor-BV5XF6LL.js → monitor-RKK6GSHG.js} +13 -13
  166. package/chunks/{nonInteractiveCli-W6MUKDVJ.js → nonInteractiveCli-UQHP3G6P.js} +58 -57
  167. package/chunks/{notebook-edit-HGBEKGTE.js → notebook-edit-YM47A7WO.js} +13 -13
  168. package/chunks/{open-with-auth-D6JD6LDS.js → open-with-auth-6MVIHMXB.js} +1 -1
  169. package/chunks/{openaiContentGenerator-NSU3ERBH.js → openaiContentGenerator-FHKDWNI2.js} +9 -9
  170. package/chunks/{pidfile-LE3TU4GE.js → pidfile-SIIEJEEH.js} +23 -20
  171. package/chunks/{processUtils-YFBGJK67.js → processUtils-JF7CWBJC.js} +2 -2
  172. package/chunks/{prompt-terminal-ledger-4W4W7DSO.js → prompt-terminal-ledger-FXXHAEQU.js} +21 -20
  173. package/chunks/{qwenContentGenerator-HTA57WFC.js → qwenContentGenerator-KFJ77JP6.js} +16 -16
  174. package/chunks/{read-file-KHPQ2MB6.js → read-file-S2NOCBIL.js} +4 -4
  175. package/chunks/{resumeHistoryUtils-K7RV3QBN.js → resumeHistoryUtils-QHHPSQWU.js} +22 -21
  176. package/chunks/{ripGrep-NBBVCMG4.js → ripGrep-F6TNOJUO.js} +5 -5
  177. package/chunks/{run-qwen-serve-A3JBOZCM.js → run-qwen-serve-KYBDQRDD.js} +216 -64
  178. package/chunks/{runtime-7YOU2KJ3.js → runtime-3WNOFLCR.js} +32 -29
  179. package/chunks/{scheduled-tasks-52LXK7LN.js → scheduled-tasks-RNBH56DJ.js} +23 -22
  180. package/chunks/{scheduler-J44M72VM.js → scheduler-ERMW7Q7B.js} +22 -21
  181. package/chunks/{send-message-AWKUDJBH.js → send-message-V5T3NMFM.js} +3 -3
  182. package/chunks/{serve-TRC6XJUB.js → serve-7NV46RMP.js} +25 -24
  183. package/chunks/{server-YPNTJLX2.js → server-6RZJR5QF.js} +106 -154
  184. package/chunks/{session-FMMIBFYX.js → session-Z4EV7NVV.js} +91 -63
  185. package/chunks/{session-attachments-root-LDJMNK7K.js → session-attachments-root-SG5FC52X.js} +20 -19
  186. package/chunks/{session-pr-refresh-NLR4EK2J.js → session-pr-refresh-ILC4Z3ZM.js} +22 -21
  187. package/chunks/{settings-A46L577J.js → settings-Y47SPE3X.js} +24 -23
  188. package/chunks/{shell-Q5LSQPPY.js → shell-YBVCOPVO.js} +13 -13
  189. package/chunks/{skill-75KPJRCM.js → skill-AXC63EBA.js} +4 -4
  190. package/chunks/{skill-settings-775YT4YR.js → skill-settings-AFPAYGLO.js} +24 -23
  191. package/chunks/{spawnChannel-XY73I5CU.js → spawnChannel-ZFL4J2V3.js} +20 -19
  192. package/chunks/{standalone-update-L46XXNQ2.js → standalone-update-Y2OZPLNJ.js} +21 -20
  193. package/chunks/{start-opentui-ui-WLV43247.js → start-opentui-ui-G6TKT4LI.js} +449 -210
  194. package/chunks/{startInteractiveUI-F5DKMLOV.js → startInteractiveUI-YTNDPW7J.js} +1182 -1245
  195. package/chunks/{task-create-PMAFST2T.js → task-create-MWXJFRRM.js} +3 -3
  196. package/chunks/{task-list-R2HSY2NC.js → task-list-EYO3FE57.js} +2 -2
  197. package/chunks/{task-update-JYC57USF.js → task-update-2JJJRHMT.js} +3 -3
  198. package/chunks/{team-create-2PATB77U.js → team-create-BUFLGGSH.js} +13 -13
  199. package/chunks/{team-delete-CBHVBTPB.js → team-delete-IQZ6XGFI.js} +2 -2
  200. package/chunks/{team-plan-approval-QTANEWOS.js → team-plan-approval-OUWWM42U.js} +13 -13
  201. package/chunks/{terminal-image-renderer-OGULCFNF.js → terminal-image-renderer-WH2WV5ES.js} +20 -19
  202. package/chunks/{theme-manager-CNO3QERP.js → theme-manager-5UDRARM2.js} +20 -19
  203. package/chunks/{tool-search-VXWEOZE7.js → tool-search-MCDIRPHN.js} +4 -4
  204. package/chunks/{total-session-admission-4KAADZPB.js → total-session-admission-VL27U74Z.js} +21 -20
  205. package/chunks/{trustedFolders-PPJSOPOT.js → trustedFolders-MSXT4VDD.js} +21 -20
  206. package/chunks/{update-relaunch-4PT4MW7B.js → update-relaunch-JKLEWVCB.js} +5 -5
  207. package/chunks/{updateCheck-WAVFLWNG.js → updateCheck-ARTHAJT2.js} +20 -19
  208. package/chunks/{useAutoAcceptIndicator-XNED4NRB.js → useAutoAcceptIndicator-YEAAGYVU.js} +26 -25
  209. package/chunks/{validateNonInterActiveAuth-J676DUQ2.js → validateNonInterActiveAuth-EMRQKH5S.js} +56 -55
  210. package/chunks/{version-J6SRRQB2.js → version-HFQU35WD.js} +3 -1
  211. package/chunks/{web-fetch-FMZZYX44.js → web-fetch-QBXAO6VF.js} +4 -4
  212. package/chunks/{web-search-3G2KXCX5.js → web-search-2URQXA3A.js} +186 -9
  213. package/chunks/{web-shell-static-POZHGGXE.js → web-shell-static-BFDESDD4.js} +5 -4
  214. package/chunks/{workflow-PPZZICQ7.js → workflow-JDD6WDAH.js} +204 -68
  215. package/chunks/{workspace-providers-status-IIYTAQST.js → workspace-providers-status-B4IKR6YJ.js} +27 -26
  216. package/chunks/{workspace-registration-store-VHCDXAV7.js → workspace-registration-store-PJ3YHR45.js} +1 -2
  217. package/chunks/{workspace-registry-I7VQIPS2.js → workspace-registry-WVYJ5UGB.js} +21 -20
  218. package/chunks/{workspace-runtime-coordinator-DBGNY32G.js → workspace-runtime-coordinator-DXL5YVAG.js} +21 -20
  219. package/chunks/{workspace-service-QSKB2T54.js → workspace-service-QNGAMVH7.js} +26 -25
  220. package/chunks/{workspace-skills-status-T7GPT65J.js → workspace-skills-status-BEISJIII.js} +25 -24
  221. package/chunks/{workspace-trust-reconciler-2PKRDAU4.js → workspace-trust-reconciler-ORYJF5L4.js} +26 -25
  222. package/chunks/{write-file-L76CGFTQ.js → write-file-DWLKFBTJ.js} +14 -14
  223. package/chunks/{zoom-image-TDJJY2VZ.js → zoom-image-BYVIXSNQ.js} +4 -4
  224. package/cli.js +12 -12
  225. package/export-transcript-document.js +106 -106
  226. package/package.json +4 -4
  227. package/web-shell/assets/{abnfDiagram-VCTEODGH-DHc6plZn.js → abnfDiagram-VCTEODGH-C_8kzsly.js} +1 -1
  228. package/web-shell/assets/{arc-BQ9m8TDV.js → arc-CDg7Zfpm.js} +1 -1
  229. package/web-shell/assets/{architectureDiagram-5GKGNRK7-D5ap3oVB.js → architectureDiagram-5GKGNRK7-DZzdCWyF.js} +1 -1
  230. package/web-shell/assets/{blockDiagram-NRAW4CY4-BIbnyNph.js → blockDiagram-NRAW4CY4-DI3B4gyR.js} +1 -1
  231. package/web-shell/assets/{c4Diagram-UCG6FXSJ-BRsdx_iG.js → c4Diagram-UCG6FXSJ-CfOgwHZW.js} +1 -1
  232. package/web-shell/assets/channel-e4xwS72w.js +1 -0
  233. package/web-shell/assets/{chunk-2Q5K7J3B-3lf1fNlx.js → chunk-2Q5K7J3B-B_PUth0g.js} +1 -1
  234. package/web-shell/assets/{chunk-5VM5RSS4-DP8VNRc4.js → chunk-5VM5RSS4-CrKtvBIL.js} +1 -1
  235. package/web-shell/assets/{chunk-F27PBJKO-DrohDmZ6.js → chunk-F27PBJKO-B4z2n8Py.js} +1 -1
  236. package/web-shell/assets/{chunk-G27WJ6UU-UZ2QhSx6.js → chunk-G27WJ6UU-BUtrFEO8.js} +1 -1
  237. package/web-shell/assets/{chunk-JWPE2WC7-BIMHVcZK.js → chunk-JWPE2WC7-Cqw3aXW0.js} +1 -1
  238. package/web-shell/assets/{chunk-LCL6LL3I-izRxdSDd.js → chunk-LCL6LL3I-CZolnvls.js} +1 -1
  239. package/web-shell/assets/{chunk-POPQ4Y6H-CXADD4PP.js → chunk-POPQ4Y6H-DivgasCa.js} +1 -1
  240. package/web-shell/assets/{chunk-SVP7TREG-B96d8Y_1.js → chunk-SVP7TREG--seyb1B6.js} +1 -1
  241. package/web-shell/assets/{chunk-XXDRQBXY-CF2sVQpv.js → chunk-XXDRQBXY-D7pHtuVM.js} +1 -1
  242. package/web-shell/assets/classDiagram-DTDB5LWJ-CzXfUUOt.js +1 -0
  243. package/web-shell/assets/classDiagram-v2-JRS7N3AN-CzXfUUOt.js +1 -0
  244. package/web-shell/assets/{cose-bilkent-JH36ORCC-CT6tXVAS.js → cose-bilkent-JH36ORCC-4MWaRF_3.js} +1 -1
  245. package/web-shell/assets/{cynefin-OW5HDTMX-X1NS4vtV.js → cynefin-OW5HDTMX-nhJhAjgD.js} +1 -1
  246. package/web-shell/assets/{cynefinDiagram-5FMLGOSQ-DNsKNOT4.js → cynefinDiagram-5FMLGOSQ-NF-PwXlq.js} +1 -1
  247. package/web-shell/assets/{dagre-3AP2YEHR-9-AHKqsb.js → dagre-3AP2YEHR-Bu0ncdWP.js} +1 -1
  248. package/web-shell/assets/{diagram-S7CK7UJ4-Bjgms7j6.js → diagram-S7CK7UJ4-CsvhFHZC.js} +1 -1
  249. package/web-shell/assets/{diagram-UQ7AKVKN-h6bCprbE.js → diagram-UQ7AKVKN-Ck61sIB3.js} +1 -1
  250. package/web-shell/assets/{diagram-VSXAHHWV-4SbQXVLt.js → diagram-VSXAHHWV-D0171zrb.js} +1 -1
  251. package/web-shell/assets/{diagram-VX7I27RA-B5gPCzzB.js → diagram-VX7I27RA-DvdxY4UL.js} +1 -1
  252. package/web-shell/assets/{diagram-Z3DM3KII-DFJXIA3A.js → diagram-Z3DM3KII-CGGpseiB.js} +1 -1
  253. package/web-shell/assets/{ebnfDiagram-PWID7BFC-FwyaU7VY.js → ebnfDiagram-PWID7BFC-K8-QMvY8.js} +1 -1
  254. package/web-shell/assets/{erDiagram-SSCWMZ5O-8vJQh2te.js → erDiagram-SSCWMZ5O-D316nAem.js} +1 -1
  255. package/web-shell/assets/{flowDiagram-A5DVABFB-BzA_1gMN.js → flowDiagram-A5DVABFB-B7siy_mn.js} +1 -1
  256. package/web-shell/assets/{ganttDiagram-EL5Y4UJY-Co-ABbVX.js → ganttDiagram-EL5Y4UJY-BZQDxzTu.js} +1 -1
  257. package/web-shell/assets/{gitGraphDiagram-WWUBYQGX-DW_FcyrX.js → gitGraphDiagram-WWUBYQGX-DZynLCSV.js} +1 -1
  258. package/web-shell/assets/{index-BbMXfhNG.js → index-9ie6xLTM.js} +1 -1
  259. package/web-shell/assets/{index-Bu-rZoJ-.js → index-DirkXQEg.js} +488 -474
  260. package/web-shell/assets/index-DzdST_7L.css +36 -0
  261. package/web-shell/assets/{infoDiagram-RXCK75RN-BEgfhUFN.js → infoDiagram-RXCK75RN-B0gr769A.js} +1 -1
  262. package/web-shell/assets/{ishikawaDiagram-5VMMS53U-DCsMxQmc.js → ishikawaDiagram-5VMMS53U-0pQFfjvX.js} +1 -1
  263. package/web-shell/assets/{journeyDiagram-EYS64GPL-DyIEYoHz.js → journeyDiagram-EYS64GPL-DEGtClWb.js} +1 -1
  264. package/web-shell/assets/{kanban-definition-3QL26DDD-CkxjqCNr.js → kanban-definition-3QL26DDD-CnN8gPzw.js} +1 -1
  265. package/web-shell/assets/{layout-BEWc0Al9.js → layout-C_70RhaT.js} +1 -1
  266. package/web-shell/assets/{linear-CNuNxirL.js → linear-BJ2ZLmcq.js} +1 -1
  267. package/web-shell/assets/{mermaid.core-DZBre674.js → mermaid.core-RlY0zPNC.js} +6 -6
  268. package/web-shell/assets/{mindmap-definition-FBJOCRG2-CpafFz_F.js → mindmap-definition-FBJOCRG2-CpVAxTNl.js} +1 -1
  269. package/web-shell/assets/{pegDiagram-XKGWAZYB-DfZqk_dq.js → pegDiagram-XKGWAZYB-DmrSv3hD.js} +1 -1
  270. package/web-shell/assets/{pieDiagram-E7YTZNPT-S0UWXlgC.js → pieDiagram-E7YTZNPT-CJmgp8KJ.js} +1 -1
  271. package/web-shell/assets/{quadrantDiagram-AXDQQJYC-dd37_Ohj.js → quadrantDiagram-AXDQQJYC-UsgOyNco.js} +1 -1
  272. package/web-shell/assets/{railroadDiagram-O6MQD6OU-CH8NJZ7u.js → railroadDiagram-O6MQD6OU-DQ6gMs_W.js} +1 -1
  273. package/web-shell/assets/{requirementDiagram-EFPCY7ZU-CFdqWYih.js → requirementDiagram-EFPCY7ZU-DhqadamF.js} +1 -1
  274. package/web-shell/assets/{sankeyDiagram-P5KCCOFB-CsddcEGD.js → sankeyDiagram-P5KCCOFB-R4WnURaE.js} +1 -1
  275. package/web-shell/assets/{sequenceDiagram-WJ2MYXX4-BZ270mGw.js → sequenceDiagram-WJ2MYXX4-D7BwMi_D.js} +1 -1
  276. package/web-shell/assets/{sizeCapture-X5ZJPWSS-CGaS4DBV.js → sizeCapture-X5ZJPWSS-Bqngz088.js} +1 -1
  277. package/web-shell/assets/{stateDiagram-HBIQ2CUA-COpIzMu6.js → stateDiagram-HBIQ2CUA-DwaXPGqn.js} +1 -1
  278. package/web-shell/assets/stateDiagram-v2-4QOOHH4V-8GCQZAvv.js +1 -0
  279. package/web-shell/assets/{swimlanes-XN3QIQJK-CMF889m3.js → swimlanes-XN3QIQJK-BsaLeRDY.js} +1 -1
  280. package/web-shell/assets/swimlanesDiagram-VK2B7HYN-BoRBF2Yw.js +8 -0
  281. package/web-shell/assets/{timeline-definition-24CTP7MA-BelnxYz5.js → timeline-definition-24CTP7MA-NJ9G-NUU.js} +1 -1
  282. package/web-shell/assets/{vennDiagram-4TSXK5OY-CU-NRqIB.js → vennDiagram-4TSXK5OY-Ca3W4rSq.js} +1 -1
  283. package/web-shell/assets/{wardleyDiagram-VM6X3IG4-CDNKqWh-.js → wardleyDiagram-VM6X3IG4-OabvjC-6.js} +1 -1
  284. package/web-shell/assets/{xychartDiagram-S5SC5T6Z-CLqguL5D.js → xychartDiagram-S5SC5T6Z-C7rbjvpc.js} +1 -1
  285. package/web-shell/index.html +2 -2
  286. package/chunks/chunk-6YEOCHSE.js +0 -142
  287. package/chunks/chunk-X35VIWWJ.js +0 -276
  288. package/web-shell/assets/channel-uMMdTrYk.js +0 -1
  289. package/web-shell/assets/classDiagram-DTDB5LWJ-DcY-26Ig.js +0 -1
  290. package/web-shell/assets/classDiagram-v2-JRS7N3AN-DcY-26Ig.js +0 -1
  291. package/web-shell/assets/index-CsPwZ1ut.css +0 -36
  292. package/web-shell/assets/stateDiagram-v2-4QOOHH4V-D6qEVAji.js +0 -1
  293. package/web-shell/assets/swimlanesDiagram-VK2B7HYN-mem5Jj4m.js +0 -8
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  <a href="https://trendshift.io/repositories/15287" target="_blank"><img src="https://trendshift.io/api/badge/repositories/15287" alt="QwenLM%2Fqwen-code | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
9
9
 
10
- **The open-source AI coding agent that lives in your terminal.**
10
+ **The open-source AI coding agent for your terminal, editor, desktop, browser, and chat.**
11
11
 
12
12
  <a href="https://qwenlm.github.io/qwen-code-docs/zh/users/overview">中文</a> |
13
13
  <a href="https://qwenlm.github.io/qwen-code-docs/de/users/overview">Deutsch</a> |
@@ -19,12 +19,14 @@
19
19
 
20
20
  </div>
21
21
 
22
+ ![Qwen Code in the terminal, desktop app, browser, editor, and chat, with VS Code, Zed, JetBrains, Telegram, DingTalk, WeChat, and Feishu integrations](https://img.alicdn.com/imgextra/i3/O1CN01l5GyhGuOPGC3XHtt_!!6000000005884-2-tps-1742-903.png)
23
+
22
24
  ## Why Qwen Code?
23
25
 
24
26
  - **Agentic out of the box** — Auto-Memory, Auto-Skills, SubAgents, Agent Teams, and MCP. Dynamic workflows, zero setup.
25
27
  - **Open-source, inside and out** — The framework and the Qwen models are open-source. They evolve together. No vendor lock-in.
26
28
  - **Multi-protocol** — Supports OpenAI, Anthropic, Gemini, and Qwen APIs. Any third-party provider or local model (Ollama / vLLM). Switch at runtime.
27
- - **Beyond the terminal** — IDE plugins, Desktop app, daemon mode, SDKs, and IM bots (Telegram / DingTalk / WeChat / Feishu).
29
+ - **Beyond the terminal** — IDE plugins, Desktop app, Web UI, SDKs, and chat integrations (Telegram / DingTalk / WeChat / Feishu).
28
30
 
29
31
  > [!TIP]
30
32
  > Qwen Code is actively iterating on itself — using its own agent and models to file issues, submit PRs, review code, and run tests. Powered by the community, driven by AI.
@@ -64,27 +66,45 @@ brew install qwen-code
64
66
 
65
67
  ## Quick Start
66
68
 
69
+ Open a terminal in your project and start Qwen Code:
70
+
67
71
  ```bash
68
- qwen # Launch interactive terminal UI
69
- # Inside the session:
70
- /auth # Configure your provider and API key
72
+ cd /path/to/your-project
73
+ qwen
74
+ ```
75
+
76
+ Inside the session, run `/auth` to configure your provider and API key. Then try:
77
+
78
+ ```text
79
+ Explain this repository and show me where to start.
71
80
  ```
72
81
 
73
82
  See the [Authentication Guide](https://qwenlm.github.io/qwen-code-docs/en/users/configuration/auth/) and [Settings Reference](https://qwenlm.github.io/qwen-code-docs/en/users/configuration/settings/) for detailed setup.
74
83
 
75
- ![Qwen Code](https://img.alicdn.com/imgextra/i2/O1CN01K0nwj41RM1Il8kB0t_!!6000000002096-2-tps-1544-1060.png)
84
+ <details>
85
+ <summary>See the terminal interface</summary>
86
+
87
+ ![Qwen Code terminal interface](https://img.alicdn.com/imgextra/i2/O1CN01K0nwj41RM1Il8kB0t_!!6000000002096-2-tps-1544-1060.png)
88
+
89
+ </details>
76
90
 
77
91
  ## How to Use Qwen Code
78
92
 
79
- | Mode | Command | Use Case |
80
- | --------------- | --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
81
- | **Interactive** | `qwen` | Terminal UI with rich rendering, `@file` references, slash commands |
82
- | **Headless** | `qwen -p "..."` | Scripts, CI/CD, batch processing — no UI |
83
- | **IDE** | | [VS Code](https://qwenlm.github.io/qwen-code-docs/en/users/integration-vscode/), [Zed](https://qwenlm.github.io/qwen-code-docs/en/users/integration-zed/), [JetBrains](https://qwenlm.github.io/qwen-code-docs/en/users/integration-jetbrains/) |
84
- | **Desktop** | — | [Qwen Code Desktop](https://github.com/QwenLM/qwen-code/releases/tag/desktop-latest) — GUI for macOS, Windows, Linux |
85
- | **Daemon** | `qwen serve` | Shared agent session over HTTP+SSE (ACP). Multiple clients, one agent. _(experimental)_ [Docs](https://qwenlm.github.io/qwen-code-docs/en/users/qwen-serve) |
86
- | **SDK** | — | [TypeScript](./packages/sdk-typescript/README.md), [Python](./packages/sdk-python/README.md), [Java](./packages/sdk-java/qwencode/README.md) |
87
- | **IM Bot** | `qwen channel` | Connect to Telegram, DingTalk, WeChat, or Feishu |
93
+ Choose the interface that fits your workflow:
94
+
95
+ | Interface | Get started |
96
+ | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
97
+ | **Terminal** | Run `qwen` in your project — see [Quick Start](#quick-start). |
98
+ | **Desktop** | [Download Qwen Code Desktop](https://github.com/QwenLM/qwen-code/releases/tag/desktop-latest) for macOS, Windows, and Linux. |
99
+ | **Web** | Run `qwen serve --open` to open the [Web UI](https://qwenlm.github.io/qwen-code-docs/en/users/qwen-serve/) in your browser. _(experimental)_ |
100
+ | **Editor** | Set up [VS Code](https://qwenlm.github.io/qwen-code-docs/en/users/integration-vscode/), [Zed](https://qwenlm.github.io/qwen-code-docs/en/users/integration-zed/), or [JetBrains](https://qwenlm.github.io/qwen-code-docs/en/users/integration-jetbrains/). |
101
+ | **Chat** | Connect [Telegram](https://qwenlm.github.io/qwen-code-docs/en/users/features/channels/telegram/), [DingTalk](https://qwenlm.github.io/qwen-code-docs/en/users/features/channels/dingtalk/), [WeChat](https://qwenlm.github.io/qwen-code-docs/en/users/features/channels/weixin/), or [Feishu](https://qwenlm.github.io/qwen-code-docs/en/users/features/channels/feishu/), then run `qwen channel start`. |
102
+
103
+ For automation and custom integrations:
104
+
105
+ - **Headless** — Run `qwen -p "..."` in scripts, CI/CD, or batch jobs.
106
+ - **SDKs** — Build with [TypeScript](./packages/sdk-typescript/README.md), [Python](./packages/sdk-python/README.md), or [Java](./packages/sdk-java/qwencode/README.md).
107
+ - **Daemon** — Run `qwen serve` to connect clients over HTTP + SSE (ACP). _(experimental)_ [Daemon guide](https://qwenlm.github.io/qwen-code-docs/en/users/qwen-serve/).
88
108
 
89
109
  <details>
90
110
  <summary>SDK example (Python)</summary>
@@ -17,7 +17,7 @@ If `node_repl` is unavailable, run:
17
17
 
18
18
  ```bash
19
19
  qwen mcp add --scope user node-repl npx -y @qwen-code/node-repl-mcp@0.1.3
20
- npm install --no-save --package-lock=false @qwen-code/cua-sdk@0.20.4
20
+ npm install --no-save --package-lock=false @qwen-code/cua-sdk@0.20.5
21
21
  ```
22
22
 
23
23
  Tell the user to restart Qwen Code, then stop. If only the SDK import is missing,
@@ -2,7 +2,7 @@
2
2
 
3
3
  Qwen Code's first-run `/auth` menu has three top-level options. Pick the one that matches how you want to run the CLI:
4
4
 
5
- - **Alibaba ModelStudio**: official recommended setup. Opens a sub-menu with **Coding Plan** (for individual developers · weekly quota included), **Token Plan** (for teams and companies · usage-based billing with a dedicated endpoint), or **Standard API Key** (connect with an existing ModelStudio API key).
5
+ - **Alibaba ModelStudio**: official recommended setup. Opens a sub-menu with **Coding Plan** (for individual developers · weekly quota included), **Token Plan** (for teams and companies · usage-based billing with a dedicated endpoint), or **Standard API Key** (connect with an existing ModelStudio API key). Token Plan and Standard API Key also enable the built-in [`web_search` tool](../../developers/tools/web-search.md) with no extra setup.
6
6
  - **Third-party Providers**: choose a built-in provider and connect with an API key (DeepSeek, Grok, MiniMax, Z.AI, Kimi, Idealab, ModelScope, OpenRouter, Requesty).
7
7
  - **Custom Provider**: manually connect a local server, proxy, or unsupported provider — supports OpenAI, Anthropic, Gemini, and other compatible endpoints.
8
8
 
@@ -666,7 +666,7 @@ The merge strategy for `modelProviders` itself is REPLACE: the entire `modelProv
666
666
 
667
667
  ## Reasoning / thinking configuration
668
668
 
669
- The optional `reasoning` field under `generationConfig` controls how aggressively the model reasons before responding. The Anthropic and Gemini converters always honor it. The OpenAI-compatible pipeline honors it **unless** `generationConfig.samplingParams` is set see the "Interaction with `samplingParams`" caveat below.
669
+ The optional `reasoning` field under `generationConfig` controls how aggressively the model reasons before responding. The Anthropic and Gemini converters always honor it. The OpenAI-compatible pipeline honors it **unless** `generationConfig.samplingParams` is set. Known GPT-5 models and GPT-6 Astra are an exception: unrelated sampling keys do not suppress configured effort. See "Interaction with `samplingParams`" below.
670
670
 
671
671
  ```jsonc
672
672
  {
@@ -693,33 +693,37 @@ The optional `reasoning` field under `generationConfig` controls how aggressivel
693
693
 
694
694
  ### Per-provider behavior
695
695
 
696
- | Protocol / provider | Wire shape | Notes |
697
- | --------------------------------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
698
- | **OpenAI / DashScope** (`qwen3.8-max` family) | Flat `reasoning_effort: <effort>` body parameter | The `/effort` tiers are passed through for any model id starting with `qwen3.8-max` (including dated snapshots and `-latest` aliases); DashScope applies any model-specific mapping. This family's ladder stops at `xhigh`, so a configured `max` is clamped to `xhigh` (logged once) rather than sent and rejected. An explicit `reasoning_effort` in `samplingParams` or `extra_body` is a verbatim override and is not clamped. When `reasoning_effort` and `thinking_budget` conflict, the normal `extra_body` > `samplingParams` > `reasoning` precedence keeps only the higher-priority field; an explicit same-layer pair keeps `reasoning_effort`, matching the provider's behavior before cross-layer resolution. If a static field wins, `/effort` reports that field instead of implying the requested tier is effective. When an effort tier wins, a conflicting `enable_thinking` is also dropped. An explicit `enable_thinking: false` in `extra_body` is honoured rather than dropped: it overrides the configured tier as `reasoning_effort: 'none'`, one of the few places `extra_body` does not win verbatim. Other Qwen models continue to map a selected effort to `enable_thinking: true`; a `reasoning_effort` override passes through there unless it conflicts with a `thinking_budget` (a pair DashScope rejects), in which case the inert `reasoning_effort` is dropped and both `enable_thinking` and `thinking_budget` survive. |
699
- | **OpenAI / DeepSeek** (`api.deepseek.com`) | Flat `reasoning_effort: <effort>` body parameter | When `reasoning.effort` is set in the nested config shape, it's rewritten to flat `reasoning_effort` and `'low'`/`'medium'` are normalized to `'high'`, `'xhigh'` to `'max'` — mirroring DeepSeek's [server-side back-compat](https://api-docs.deepseek.com/zh-cn/api/create-chat-completion). Top-level `samplingParams.reasoning_effort` or `extra_body.reasoning_effort` overrides skip this normalization and ship verbatim. `max` is accepted only on a real DeepSeek hostname; a `deepseek`-named model on another host keeps the generic `xhigh` ceiling, matching the hostname gate on the reshape itself. |
700
- | **OpenAI / Z.ai** (`z.ai`, `bigmodel.cn`) | Flat `reasoning_effort: <effort>` body parameter | GLM-5.2+ on a Z.ai host takes the full ladder, `max` included, and the nested `reasoning.effort` is rewritten to the flat field. Older GLM ids, and a `glm-*` model reached on any other host, keep the generic `xhigh` ceiling: the model name alone says nothing about what that endpoint accepts. |
701
- | **OpenAI** (other compatible servers) | `reasoning: { effort, ... }` passed through | A configured `max` is clamped to `xhigh` (logged once), since `max` is a vendor extension rather than part of the generic OpenAI ladder. Set via `samplingParams` (e.g. `samplingParams.reasoning_effort` for GPT-5/o-series) when the provider expects a different shape; an explicit `samplingParams` / `extra_body` value is not clamped. |
702
- | **Anthropic** (real `api.anthropic.com`) | `output_config: { effort }` plus the `effort-2025-11-24` beta header | Real Anthropic accepts `'low'`/`'medium'`/`'high'` only. `'max'` is **clamped to `'high'`** with a `debugLogger.warn` line (once per generator); if you want max effort, switch the baseURL to a DeepSeek-compatible endpoint that supports it. |
703
- | **Anthropic** (`api.deepseek.com/anthropic`) | Same `output_config: { effort }` + beta header | `'max'` is passed through unchanged. |
704
- | **Gemini** (`@google/genai`) | `thinkingConfig: { includeThoughts: true, thinkingLevel }` | `'low'` → `LOW`, `'high'`/`'max'` → `HIGH`, others → `THINKING_LEVEL_UNSPECIFIED` (Gemini has no `MAX` tier). |
696
+ | Protocol / provider | Wire shape | Notes |
697
+ | --------------------------------------------- | ------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
698
+ | **OpenAI / DashScope** (`qwen3.8-max` family) | Flat `reasoning_effort: <effort>` body parameter | The `/effort` tiers are passed through for any model id starting with `qwen3.8-max` (including dated snapshots and `-latest` aliases); DashScope applies any model-specific mapping. This family's ladder stops at `xhigh`, so a configured `max` is clamped to `xhigh` (logged once) rather than sent and rejected. An explicit `reasoning_effort` in `samplingParams` or `extra_body` is a verbatim override and is not clamped. When `reasoning_effort` and `thinking_budget` conflict, the normal `extra_body` > `samplingParams` > `reasoning` precedence keeps only the higher-priority field; an explicit same-layer pair keeps `reasoning_effort`, matching the provider's behavior before cross-layer resolution. If a static field wins, `/effort` reports that field instead of implying the requested tier is effective. When an effort tier wins, a conflicting `enable_thinking` is also dropped. An explicit `enable_thinking: false` in `extra_body` is honoured rather than dropped: it overrides the configured tier as `reasoning_effort: 'none'`, one of the few places `extra_body` does not win verbatim. Other Qwen models continue to map a selected effort to `enable_thinking: true`; a `reasoning_effort` override passes through there unless it conflicts with a `thinking_budget` (a pair DashScope rejects), in which case the inert `reasoning_effort` is dropped and both `enable_thinking` and `thinking_budget` survive. |
699
+ | **OpenAI / DeepSeek** (`api.deepseek.com`) | Flat `reasoning_effort: <effort>` body parameter | When `reasoning.effort` is set in the nested config shape, it's rewritten to flat `reasoning_effort` and `'low'`/`'medium'` are normalized to `'high'`, `'xhigh'` to `'max'` — mirroring DeepSeek's [server-side back-compat](https://api-docs.deepseek.com/zh-cn/api/create-chat-completion). Top-level `samplingParams.reasoning_effort` or `extra_body.reasoning_effort` overrides skip this normalization and ship verbatim. `max` is accepted only on a real DeepSeek hostname; a `deepseek`-named model on another host keeps the generic `xhigh` ceiling, matching the hostname gate on the reshape itself. |
700
+ | **OpenAI / Z.ai** (`z.ai`, `bigmodel.cn`) | Flat `reasoning_effort: <effort>` body parameter | GLM-5.2+ on a Z.ai host takes the full ladder, `max` included, and the nested `reasoning.effort` is rewritten to the flat field. Older GLM ids, and a `glm-*` model reached on any other host, keep the generic `xhigh` ceiling: the model name alone says nothing about what that endpoint accepts. |
701
+ | **OpenAI** (other compatible servers) | Known GPT-5 / GPT-6 Astra: flat `reasoning_effort`; other models: nested `reasoning` | GPT effort is clamped in both directions to the supported subset for the known model. GPT-5.6 and GPT-6 Astra allow `max`, while earlier models have lower ceilings. Tiers below the model floor are raised: GPT-5 Pro accepts only `high`; GPT-5.2 Pro, GPT-5.4 Pro and GPT-5.5 Pro raise `low` to `medium`. OpenRouter retains nested `reasoning`. Unknown model names keep the generic `xhigh` ceiling and nested shape. Explicit reasoning values in `samplingParams` / `extra_body` bypass the configured-tier clamp. |
702
+ | **Anthropic** (real `api.anthropic.com`) | `output_config: { effort }` plus the `effort-2025-11-24` beta header | Real Anthropic accepts `'low'`/`'medium'`/`'high'` only. `'max'` is **clamped to `'high'`** with a `debugLogger.warn` line (once per generator); if you want max effort, switch the baseURL to a DeepSeek-compatible endpoint that supports it. |
703
+ | **Anthropic** (`api.deepseek.com/anthropic`) | Same `output_config: { effort }` + beta header | `'max'` is passed through unchanged. |
704
+ | **Gemini** (`@google/genai`) | `thinkingConfig: { includeThoughts: true, thinkingLevel }` | `'low'` → `LOW`, `'high'`/`'max'` → `HIGH`, others → `THINKING_LEVEL_UNSPECIFIED` (Gemini has no `MAX` tier). |
705
705
 
706
706
  ### `reasoning: false`
707
707
 
708
- Setting `reasoning: false` (the literal boolean) explicitly disables thinking on every provider — useful for cheap side queries that don't benefit from reasoning. This is honored at the request level too via `request.config.thinkingConfig.includeThoughts: false` for one-off calls (e.g. suggestion generation).
708
+ Setting `reasoning: false` (the literal boolean) explicitly disables thinking on models that support disabling — useful for cheap side queries that don't benefit from reasoning. This is honored at the request level too via `request.config.thinkingConfig.includeThoughts: false` for one-off calls (e.g. suggestion generation).
709
709
 
710
710
  On a `api.deepseek.com` baseURL, the OpenAI pipeline emits the explicit `thinking: { type: 'disabled' }` field that DeepSeek V4+ requires — the server-side default is `'enabled'`, so simply omitting `reasoning_effort` would still pay thinking latency/cost. Self-hosted DeepSeek backends (sglang/vllm) and other OpenAI-compatible servers do **not** receive this field; if you need to disable thinking on those, inject `thinking: { type: 'disabled' }` (or whatever knob your inference framework exposes) via `samplingParams`/`extra_body`.
711
711
 
712
- On an `openrouter.ai` baseURL, the OpenAI pipeline emits OpenRouter's provider-level `reasoning: { enabled: false }` field when reasoning is disabled. Other OpenAI-compatible servers do not receive this OpenRouter-specific field; use `samplingParams`/`extra_body` for their native disable knob.
712
+ For known GPT models that allow disabling, non-OpenRouter endpoints receive `reasoning_effort: 'none'`; OpenRouter receives nested `reasoning: { enabled: false }` instead. Mandatory-thinking models reject off in model controls and omit unsupported disable values from requests, so `reasoning: false` cannot turn their thinking off. An explicit model reasoning capability takes precedence over the built-in tier list and selects the native disable field; OpenRouter keeps its provider-level disable behavior. The built-in mandatory set is `gpt-5`, `gpt-5-mini`, `gpt-5-nano`, `gpt-5-pro`, `gpt-5.1-codex`, `gpt-5.1-codex-max`, `gpt-5.2-codex`, `gpt-5.3-codex`, `gpt-5.2-pro`, `gpt-5.4-pro`, `gpt-5.5-pro`, and `gpt-6-astra`.
713
+
714
+ On an `openrouter.ai` baseURL, the OpenAI pipeline emits OpenRouter's provider-level `reasoning: { enabled: false }` field when reasoning is disabled. Mandatory-thinking models do not receive this disable field. Other OpenAI-compatible servers do not automatically receive this OpenRouter-specific field; use their native disable knob.
713
715
 
714
716
  ### Interaction with `samplingParams` (OpenAI-compatible only)
715
717
 
716
718
  > [!warning]
717
719
  >
718
- > When `generationConfig.samplingParams` is set on an OpenAI-compatible provider, the pipeline ships those keys to the wire **verbatim** and skips the separate `reasoning` injection entirely. So a config like `{ samplingParams: { temperature: 0.5 }, reasoning: { effort: 'max' } }` will silently drop the reasoning field on OpenAI/DeepSeek requests. A `reasoning` object placed inside `samplingParams` is your own value and ships unchanged: the effort ceiling above applies only to the tier the pipeline injects from `/effort`.
720
+ > Except for known GPT models and models with explicit reasoning capabilities, when `generationConfig.samplingParams` is set on an OpenAI-compatible provider, the pipeline ships those keys to the wire **verbatim** and skips the separate `reasoning` injection entirely. So a config like `{ samplingParams: { temperature: 0.5 }, reasoning: { effort: 'max' } }` will silently drop the reasoning field on OpenAI/DeepSeek requests. A `reasoning` object placed inside `samplingParams` is your own value and ships unchanged while reasoning is enabled: the effort ceiling above applies only to the tier the pipeline injects from `/effort`.
721
+ >
722
+ > Known GPT-5 models and GPT-6 Astra keep configured effort alongside unrelated sampling keys. For example, `{ samplingParams: { temperature: 0.5 }, reasoning: { effort: 'max' } }` sends `temperature: 0.5` and flat `reasoning_effort: 'xhigh'` on GPT-5.4, or `'max'` on GPT-5.6 / GPT-6 Astra. On an `openrouter.ai` baseURL the same clamped tier ships as nested `reasoning: { effort }` instead. On non-OpenRouter endpoints, explicit flat reasoning overrides win; nullish or empty-string flat placeholders allow the configured tier. On OpenRouter, a sampling flat override suppresses configured nested effort unless explicit model capabilities inject it; an extra-body-only flat override does not replace the configured nested effort.
719
723
  >
720
- > DashScope Qwen models are an exception: their provider reads `reasoning` directly and maps it to `reasoning_effort` or `enable_thinking`. On the qwen3.8-max family, provider-specific `samplingParams` fields still take precedence when the wire parameters conflict; on older qwen hybrids, a configured effort tier collapses to `enable_thinking: true`, which overrides a `samplingParams.enable_thinking` value.
724
+ > DashScope Qwen models are another exception: their provider reads `reasoning` directly and maps it to `reasoning_effort` or `enable_thinking`. On the qwen3.8-max family, provider-specific `samplingParams` fields still take precedence when the wire parameters conflict; on older qwen hybrids, a configured effort tier collapses to `enable_thinking: true`, which overrides a `samplingParams.enable_thinking` value.
721
725
  >
722
- > If you set `samplingParams`, include the reasoning knob inside it directly — for DeepSeek that's `samplingParams.reasoning_effort`, for GPT-5/o-series it's `samplingParams.reasoning_effort` (their flat field) or `samplingParams.reasoning` (the nested object). For OpenRouter and other providers the field name varies; consult the provider docs.
726
+ > For other models, include the provider's reasoning knob directly when using `samplingParams` — for DeepSeek that is `samplingParams.reasoning_effort`. Known GPT models map configured effort automatically; only add a raw override when intentionally bypassing that mapping. Raw nested `reasoning`, including `null`, remains a whole-object override while reasoning is enabled. Disabling via `reasoning: false` or request-level `includeThoughts: false` removes the nested value, including raw overrides in either layer. Non-OpenRouter GPT requests then send `reasoning_effort: 'none'` when disabling is allowed; OpenRouter uses its nested disable field instead. Mandatory-thinking models receive neither substitute. Outside OpenRouter its meaning depends on the gateway, so model controls show the model default. Any raw override that blocks a configured tier causes an explicit tier change to fail without saving a preference. The thinking switch restores configured raw defaults after disabling only when they permit thinking. If the raw state or configured reasoning default is off, the thinking switch cannot be turned on and the saved preference is retained. This also applies when explicit capabilities omit a default tier or expose only a thinking toggle. An explicit default command still resets the preference. Remove the blocking raw override to choose a different tier.
723
727
  >
724
728
  > The Anthropic and Gemini converters are unaffected — they always read `reasoning.effort` directly regardless of `samplingParams`.
725
729
 
@@ -181,7 +181,7 @@ These settings are read from operator scopes only (User, System, and SystemDefau
181
181
  | `model.maxSessionTurns` | integer | Maximum number of user/model/tool turns to keep in a session. -1 means unlimited. | `-1` |
182
182
  | `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` |
183
183
  | `model.goalTokenBudget` | integer | Autonomous spend window armed on each new Goal, in tokens as counted by the Goal meter (`totalTokenCount` summed over the model calls the Goal makes in its own turns). A Goal that spends its window gets one wind-down turn to hand off, then stops until you resume it, which arms another window. Unset uses the built-in default of 30,000,000; `-1` means unlimited. Zero, values above 300,000,000 (10x the default, a typo guard), other negative, fractional, or non-number values are rejected at startup. | `30000000` |
184
- | `model.goalCheckpointTimeoutSeconds` | integer | Ceiling on one Goal evidence-checkpoint call, in seconds. A long Goal periodically compresses its evidence into checkpoint claims with a side model call; a call that does not finish in time is abandoned as an inconclusive check the checkpoint stall streak is preserved rather than incremented and a later turn retries it. Unset uses the built-in default of 180. Must be an integer between 1 and 900; other values are rejected at startup. The call is streamed, so the per-request transport timeout (`model.generationConfig.timeout`, default 120 s) bounds only connect and first response, and values above 900 are rejected because past the default stream lifetime guard that guard, not this setting, ends the call. The 900 ceiling is fixed: raising `QWEN_STREAM_MAX_LIFETIME_MS` does not lift it. | `180` |
184
+ | `model.goalCheckpointTimeoutSeconds` | integer | Ceiling on one Goal evidence-checkpoint check, in seconds. A long Goal periodically compresses its evidence into checkpoint claims with a side model call. A check whose claims overrun the aggregate byte budget, or include a claim over the per-claim character limit, makes one corrective retry, and both calls share this ceiling. A check that does not finish in time is abandoned as inconclusive; it counts toward the checkpoint stall limit only when the evidence window has overflowed, while a non-overflowing check preserves the streak and retries on a later turn. Unset uses the built-in default of 180. Must be an integer between 1 and 900; other values are rejected at startup. The calls are streamed, so the per-request transport timeout (`model.generationConfig.timeout`, default 120 s) bounds only connect and first response, and values above 900 are rejected because past the default stream lifetime guard that guard, not this setting, ends the check. The 900 ceiling is fixed: raising `QWEN_STREAM_MAX_LIFETIME_MS` does not lift it. | `180` |
185
185
  | `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` |
186
186
  | `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` |
187
187
  | `model.generationConfig` | object | Advanced overrides passed to the underlying content generator. Supports request controls such as `timeout`, `maxRetries`, `retryInitialDelayMs`, `retryMaxDelayMs`, `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` |
@@ -1,5 +1,6 @@
1
1
  export default {
2
2
  commands: 'Commands',
3
+ 'cross-session-protocol': 'Cross-Session Protocol',
3
4
  'code-review': 'Code Review',
4
5
  'followup-suggestions': 'Followup Suggestions',
5
6
  'tool-use-summaries': 'Tool-Use Summaries',
@@ -198,7 +198,7 @@ You can send photos and documents to the bot, not just text.
198
198
 
199
199
  **Files:** Send a PDF, code file, or any document. The bot downloads it from DingTalk's servers and saves it locally so the agent can read it with its file tools. Audio and video files are also supported. This works with any model.
200
200
 
201
- **Generated files:** Ask the agent explicitly to send a completed local file and it can return the file as a native DingTalk attachment. Files must be non-empty, no larger than 20 MB, and located inside the configured workspace or the system temporary directory. One response can send at most five files. Outbound file attachments are unavailable when `blockStreaming` is set to `"on"`; upload or delivery failures are reported in the final text instead.
201
+ **Generated files:** Ask the agent explicitly to send a completed local file and it can return the file as a native DingTalk attachment. Files must be non-empty, no larger than 20 MB, and located inside the configured workspace or the system temporary directory. One response can send at most five files. Upload or delivery failures are reported in the final text instead.
202
202
 
203
203
  ## Forwarded Chat Records
204
204
 
@@ -46,7 +46,6 @@ Add the channel to `~/.qwen/settings.json`:
46
46
  "allowedUsers": ["operator-github-username"],
47
47
  "sessionScope": "chat_thread",
48
48
  "cwd": "/path/to/your/project",
49
- "blockStreaming": "off",
50
49
  "groupPolicy": "open",
51
50
  "groups": {
52
51
  "*": { "requireMention": true }
@@ -87,7 +86,6 @@ Local `gh` authentication requires an HTTPS `baseUrl` so the daemon host credent
87
86
  | `groupPolicy` | `"disabled"` | Must be `"open"`, `"allowlist"` with the repo (`owner/repo`) listed in `groups`, or `"pairing"` with the repo approved for notifications to flow |
88
87
  | `senderPolicy` | `"allowlist"` | Who can trigger the bot |
89
88
  | `groups.*.requireMention` | `true` | Require @mentions for ordinary comments; directed notification reasons still run |
90
- | `blockStreaming` | `"off"` | Always forced to `"off"`; intermediate model chunks aren't published; `"on"` is not supported |
91
89
  | `reasonFilter` | unset | Optional allowlist of GitHub notification reasons to process |
92
90
 
93
91
  Use `reasonFilter` to drop noisy notification classes such as `ci_activity` or `state_change`. Do not use `reasonFilter: ["mention"]` as a replacement for `groups.*.requireMention`: GitHub's `mention` reason is sticky at the thread level, so real new @mentions can arrive later under `comment`, `subscribed`, `author`, or other reasons and would be skipped.
@@ -133,13 +131,7 @@ For an accepted issue or pull-request comment, the channel adds GitHub's `👀`
133
131
 
134
132
  ### Final-only output
135
133
 
136
- The GitHub channel always forces final-only delivery. The adapter sets `blockStreaming` to `"off"`, so intermediate model chunks are never published as separate comments and `blockStreaming: "on"` is not supported.
137
-
138
- ```json
139
- {
140
- "blockStreaming": "off"
141
- }
142
- ```
134
+ The GitHub channel publishes only completed responses. Intermediate model chunks are never published as separate comments.
143
135
 
144
136
  If GitHub returns a definite no-write delivery failure, such as a rate-limit
145
137
  response, the channel stores the final reply in
@@ -50,32 +50,29 @@ Channels are configured under the `channels` key in `settings.json`. Each channe
50
50
 
51
51
  ### Options
52
52
 
53
- | Option | Required | Description |
54
- | ------------------------ | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
55
- | `type` | Yes | Channel type: `telegram`, `weixin`, `qq`, `dingtalk`, `dws`, `wecom`, `feishu`, `github`, `gitlab`, or a custom type from an extension (see [Plugins](./plugins)) |
56
- | `token` | Telegram | Bot token. Supports `$ENV_VAR` syntax to read from environment variables. Not needed for WeChat, DingTalk, WeCom, or Feishu |
57
- | `clientId` | DingTalk, Feishu | DingTalk AppKey or Feishu App ID. Supports `$ENV_VAR` syntax |
58
- | `clientSecret` | DingTalk, Feishu | DingTalk AppSecret or Feishu App Secret. Supports `$ENV_VAR` syntax |
59
- | `botId` | WeCom | WeCom intelligent robot Bot ID. Supports `$ENV_VAR` syntax. See [WeCom](./wecom) |
60
- | `secret` | WeCom | WeCom intelligent robot Secret. Supports `$ENV_VAR` syntax. See [WeCom](./wecom) |
61
- | `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 |
62
- | `senderPolicy` | No | Who can talk to the bot: `allowlist` (default), `open`, or `pairing` |
63
- | `allowedUsers` | No | List of user IDs allowed to use the bot (used by `allowlist` and `pairing` policies) |
64
- | `sessionScope` | No | How sessions are scoped: `user` (default), `chat_thread`, or `single`. Legacy `thread` remains compatible when already configured but is not offered for new Web Shell configurations |
65
- | `multiSession` | No | Retain up to eight owner-scoped named tasks in one chat. Requires daemon-managed mode, `sessionScope: "user"`, no webhooks or group-history backfill, and no enabled Channel loops |
66
- | `messagePrefix` | No | Only dispatch user messages that begin with this exact, case-sensitive prefix after any leading `@mentions`; the prefix and following whitespace are removed before dispatch |
67
- | `cwd` | No | Working directory for the agent. Defaults to the current directory |
68
- | `approvalMode` | No | Tool approval mode for channel sessions. Unattended webhook tasks require `yolo`; the setting applies to every session on the channel |
69
- | `instructions` | No | Custom instructions prepended to the first message of each session |
70
- | `webhooks` | No | Webhook sources and delivery targets for daemon-managed channels. See [Webhook-triggered tasks](#webhook-triggered-tasks) |
71
- | `groupPolicy` | No | Group chat access: `disabled` (default), `allowlist`, `pairing`, or `open`. See [Group Chats](#group-chats) |
72
- | `dmPolicy` | No | Private/DM access: `open` (default) or `disabled` (silently drop all DMs). Useful for group-only bots |
73
- | `groupHistoryLimit` | No | Opt-in group history backfill. `0` or omitted disables it. A positive number persists that many unmentioned group messages from authorized senders or members of approved paired groups for the next bot mention/reply. |
74
- | `groups` | No | Per-group settings. Keys are group chat IDs or `"*"` for defaults. See [Group Chats](#group-chats) |
75
- | `dispatchMode` | No | What happens when you send a message while the bot is busy: `steer` (default), `collect`, or `followup`. See [Dispatch Modes](#dispatch-modes) |
76
- | `blockStreaming` | No | Progressive response delivery: `on` or `off` (default). See [Block Streaming](#block-streaming) |
77
- | `blockStreamingChunk` | No | Chunk size bounds: `{ "minChars": 400, "maxChars": 1000 }`. See [Block Streaming](#block-streaming) |
78
- | `blockStreamingCoalesce` | No | Idle flush: `{ "idleMs": 1500 }`. See [Block Streaming](#block-streaming) |
53
+ | Option | Required | Description |
54
+ | ------------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
55
+ | `type` | Yes | Channel type: `telegram`, `weixin`, `qq`, `dingtalk`, `dws`, `wecom`, `feishu`, `github`, `gitlab`, or a custom type from an extension (see [Plugins](./plugins)) |
56
+ | `token` | Telegram | Bot token. Supports `$ENV_VAR` syntax to read from environment variables. Not needed for WeChat, DingTalk, WeCom, or Feishu |
57
+ | `clientId` | DingTalk, Feishu | DingTalk AppKey or Feishu App ID. Supports `$ENV_VAR` syntax |
58
+ | `clientSecret` | DingTalk, Feishu | DingTalk AppSecret or Feishu App Secret. Supports `$ENV_VAR` syntax |
59
+ | `botId` | WeCom | WeCom intelligent robot Bot ID. Supports `$ENV_VAR` syntax. See [WeCom](./wecom) |
60
+ | `secret` | WeCom | WeCom intelligent robot Secret. Supports `$ENV_VAR` syntax. See [WeCom](./wecom) |
61
+ | `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 |
62
+ | `senderPolicy` | No | Who can talk to the bot: `allowlist` (default), `open`, or `pairing` |
63
+ | `allowedUsers` | No | List of user IDs allowed to use the bot (used by `allowlist` and `pairing` policies) |
64
+ | `sessionScope` | No | How sessions are scoped: `user` (default), `chat_thread`, or `single`. Legacy `thread` remains compatible when already configured but is not offered for new Web Shell configurations |
65
+ | `multiSession` | No | Retain up to eight owner-scoped named tasks in one chat. Requires daemon-managed mode, `sessionScope: "user"`, no webhooks or group-history backfill, and no enabled Channel loops |
66
+ | `messagePrefix` | No | Only dispatch user messages that begin with this exact, case-sensitive prefix after any leading `@mentions`; the prefix and following whitespace are removed before dispatch |
67
+ | `cwd` | No | Working directory for the agent. Defaults to the current directory |
68
+ | `approvalMode` | No | Tool approval mode for channel sessions. Unattended webhook tasks require `yolo`; the setting applies to every session on the channel |
69
+ | `instructions` | No | Custom instructions prepended to the first message of each session |
70
+ | `webhooks` | No | Webhook sources and delivery targets for daemon-managed channels. See [Webhook-triggered tasks](#webhook-triggered-tasks) |
71
+ | `groupPolicy` | No | Group chat access: `disabled` (default), `allowlist`, `pairing`, or `open`. See [Group Chats](#group-chats) |
72
+ | `dmPolicy` | No | Private/DM access: `open` (default) or `disabled` (silently drop all DMs). Useful for group-only bots |
73
+ | `groupHistoryLimit` | No | Opt-in group history backfill. `0` or omitted disables it. A positive number persists that many unmentioned group messages from authorized senders or members of approved paired groups for the next bot mention/reply. |
74
+ | `groups` | No | Per-group settings. Keys are group chat IDs or `"*"` for defaults. See [Group Chats](#group-chats) |
75
+ | `dispatchMode` | No | What happens when you send a message while the bot is busy: `steer` (default), `collect`, or `followup`. See [Dispatch Modes](#dispatch-modes) |
79
76
 
80
77
  When `messagePrefix` is set, every user-authored message must begin with the prefix and a non-empty payload, for example `/review inspect #123`. Only the prefix and the mentions ahead of it are removed; a mention the user typed after the prefix reaches the agent unchanged. Shared and agent commands use the same rule (`/review /help`, `/review /clear`, and so on). Telegram's registered command-menu actions remain available without the prefix — unless the configured prefix is itself one of them, in which case the prefix wins and that command has to be sent prefixed too (`/new /new`). Attachments need a matching caption when the platform supports one; captionless Telegram, Feishu, WeChat, DingTalk and WeCom media messages continue to run, and their placeholder text is never quoted back as group history. Native todos, webhooks, and provider-generated assignment or review-request events also continue to run without a prefix because they are system events rather than chat messages.
81
78
 
@@ -417,33 +414,11 @@ You can also set dispatch mode per group, overriding the channel default:
417
414
  }
418
415
  ```
419
416
 
420
- ## Block Streaming
417
+ ## Response delivery
421
418
 
422
- By default, the agent works for a while and then sends one large response. With block streaming enabled, the response arrives as multiple shorter messages while the agent is still working similar to how ChatGPT or Claude show progressive output.
419
+ Channels use their normal response delivery path. The shared delivery layer sends completed responses, and adapters may provide native progressive display, such as updating an interactive card in place. Platform message-length limits may still split long responses.
423
420
 
424
- ```json
425
- {
426
- "channels": {
427
- "my-channel": {
428
- "type": "telegram",
429
- "blockStreaming": "on",
430
- "blockStreamingChunk": { "minChars": 400, "maxChars": 1000 },
431
- "blockStreamingCoalesce": { "idleMs": 1500 },
432
- ...
433
- }
434
- }
435
- }
436
- ```
437
-
438
- ### How it works
439
-
440
- - The agent's response is split into blocks at paragraph boundaries and sent as separate messages
441
- - `minChars` (default 400) — don't send a block until it's at least this long, to avoid spamming tiny messages
442
- - `maxChars` (default 1000) — if a block gets this long without a natural break, send it anyway
443
- - `idleMs` (default 1500) — if the agent pauses (e.g., running a tool), send what's buffered so far
444
- - When the agent finishes, any remaining text is sent immediately
445
-
446
- Only `blockStreaming` is required. The chunk and coalesce settings are optional and have sensible defaults.
421
+ The obsolete `blockStreaming`, `blockStreamingChunk`, and `blockStreamingCoalesce` settings are no longer supported and can be removed from channel configuration. They do not affect delivery. Channel settings management rejects newly added or changed values for these fields. An unchanged stored value is retained, or removed, when the edit keeps the channel's `type`; changing a channel's `type` requires removing these fields first.
447
422
 
448
423
  ## Scheduled Channel Loops
449
424
 
@@ -63,7 +63,6 @@ export QQ_APP_SECRET=<your-app-secret>
63
63
  "sessionScope": "user",
64
64
  "cwd": "/path/to/your/project",
65
65
  "instructions": "你是一个通过 QQ Bot 对话的 AI 助手。回复控制在 2000 字符以内。",
66
- "blockStreaming": "on",
67
66
  "groupPolicy": "disabled",
68
67
  "groups": {
69
68
  "*": { "requireMention": true }
@@ -82,7 +81,7 @@ export QQ_APP_SECRET=<your-app-secret>
82
81
  | `sandbox` | `false` | Set to `true` to use the QQ sandbox API environment (`sandbox.api.sgroup.qq.com`) |
83
82
 
84
83
  All standard channel options (see [Channel Overview](./overview#options)) are also supported:
85
- `senderPolicy`, `allowedUsers`, `sessionScope`, `cwd`, `instructions`, `groupPolicy`, `groups`, `dispatchMode`, `blockStreaming`, `blockStreamingChunk`, `blockStreamingCoalesce`.
84
+ `senderPolicy`, `allowedUsers`, `sessionScope`, `cwd`, `instructions`, `groupPolicy`, `groups`, `dispatchMode`.
86
85
 
87
86
  ## Running
88
87
 
@@ -757,12 +757,11 @@ qwen sessions list --json | jq .
757
757
 
758
758
  #### `qwen sessions ps`
759
759
 
760
- Lists the interactive Qwen Code sessions running on this machine right
761
- now. `sessions list` walks saved transcripts ("what have I worked on");
762
- this walks the live-process registry ("what is running at this moment").
763
- Records left behind by a killed session are swept as they are found.
764
- Headless sessions (`qwen -p`) do not register with the live-process
765
- registry, so they are not shown.
760
+ Lists the Qwen Code sessions registered on this machine right now.
761
+ `sessions list` walks saved transcripts ("what have I worked on"); this
762
+ walks the live-process registry ("what is running at this moment").
763
+ Records left behind by a killed session are swept as they are found. A
764
+ one-shot `qwen -p` run never registers, so it is never shown.
766
765
 
767
766
  **Flags:**
768
767
 
@@ -772,7 +771,16 @@ registry, so they are not shown.
772
771
 
773
772
  **Human-readable output (default):**
774
773
 
775
- A table with columns: NAME, PID, AGE, DIRECTORY.
774
+ A table with columns: NAME, KIND, PID, AGE, DIRECTORY.
775
+
776
+ KIND says what registered the session — `tui` for someone at a terminal,
777
+ `external` for a program that is not a Qwen Code session at all (a voice
778
+ front-end, a relay), and `headless` or `serve` for a session another
779
+ program drives. It is a self-report, like NAME and DIRECTORY: every field
780
+ here was written by the process it describes, and nothing about what a
781
+ session is allowed to do depends on it. See
782
+ [Cross-Session Protocol](./cross-session-protocol.md) for the record
783
+ format and for how to register a program of your own.
776
784
 
777
785
  **JSON output (`--json`):**
778
786
 
@@ -781,7 +789,7 @@ object with fields:
781
789
 
782
790
  ```
783
791
  schemaVersion, pid, procStart, pidNs, sessionId, cwd, name, startedAt,
784
- qwenVersion, ipcPath (when peer messaging is available)
792
+ qwenVersion, kind, ipcPath (when peer messaging is available)
785
793
  ```
786
794
 
787
795
  Nothing else is written to stdout — an empty listing prints nothing at
@@ -871,14 +879,50 @@ session registry rather than deriving it.
871
879
 
872
880
  The `send_message` call only confirms the message was handed to the other
873
881
  session. What became of it arrives later as a receipt: if it was held,
874
- declined, refused, expired, or misaddressed (the address changed hands —
875
- list the agents again) — or released after a hold — a notice appears in
876
- the sending session's transcript (`Message to <name>: …`). Declined and
877
- refused are different answers: declined means someone reviewed the
878
- message and said no, while refused means that session's
879
- `agents.crossSessionInbound` is `refuse` and nobody saw it at all. The
880
- model that sent it is not told; if the other session replies, the reply
881
- arrives as a cross-session message.
882
+ declined, refused, dropped, expired, or misaddressed (the address changed
883
+ hands — list the agents again) — or released after a hold — a notice
884
+ appears in the sending session's transcript (`Message to <name>: …`).
885
+ Declined, refused and dropped are three different answers: declined means
886
+ someone reviewed the message and said no, refused means that session's
887
+ `agents.crossSessionInbound` is `refuse` and nobody saw it at all, and
888
+ dropped means its inbox turned the message away before any of that (see
889
+ below). The first drop is answered at once and the rest are folded into a
890
+ receipt every few seconds, each naming the messages it stands for, so a
891
+ run of them costs a handful of lines rather than one line each. The model that
892
+ sent it is not told; if the other session replies, the reply arrives as a
893
+ cross-session message.
894
+
895
+ ### Flood protection
896
+
897
+ A session accepts up to 30 messages at once from one sender and then one
898
+ every two seconds, and up to 32 at once from all senders together and
899
+ then one a second. The second limit exists because a sender names itself:
900
+ rotating that name gets a fresh allowance from the first limit but not
901
+ from the second. It is barely above the first because every accepted
902
+ message draws a receipt, and a session can only have so many of those
903
+ going out at once. A message from another session that repeats that
904
+ sender's previous message word for word within 30 seconds is also turned
905
+ away — a model looping on one sentence mints a fresh message id every
906
+ time, so the text is what catches it. Messages from a script the session
907
+ started and from a trusted controller are exempt from the repeat check,
908
+ because a hook reporting the same line twice is reporting two facts and a
909
+ person saying "continue" twice means it twice; both are still subject to
910
+ the rate limits. Finally, a message that is accepted but cannot be queued
911
+ because the session already has 50 waiting is turned away too.
912
+
913
+ A message turned away this way is never held, never shown to the model,
914
+ and leaves no record, so the sender can try again later and land. The
915
+ receiving session says so in its transcript at most once a minute per
916
+ sender, with a count of what that line stands for. The sending session
917
+ gets one receipt naming every message the burst cost it, and its
918
+ transcript says to fold what still matters into one later message rather
919
+ than re-sending.
920
+
921
+ The sending side does not wait to find out. Each session tracks what it
922
+ has sent to each address and refuses a send that the receiver would
923
+ drop, so the model is told to batch before the message is written rather
924
+ than after — and the receiver never spends a connection on a message it
925
+ was going to turn away.
882
926
 
883
927
  ### Inbox authentication and scripted injection
884
928
 
@@ -904,7 +948,10 @@ recognized as the session's own rather than as another session's.
904
948
 
905
949
  Give every injection a fresh `msgId`. The receiving gate remembers the
906
950
  ids it has already settled, so a hook that reuses one is delivered the
907
- first time and silently deduplicated on every run after that.
951
+ first time and silently deduplicated on every run after that. Repeating
952
+ the same _text_ is fine — the repeat check above does not apply to a
953
+ session's own processes — but the rate limits do apply, so a hook in a
954
+ loop is dropped like any other flood.
908
955
 
909
956
  An injected message still goes through the inbound gate and is marked as
910
957
  not coming from the user, but the gate knows it came from the session's
@@ -979,3 +1026,18 @@ on your behalf.
979
1026
  Anyone who holds the token can send as that controller, so treat it like
980
1027
  any other credential: give it to one program, keep it out of shared
981
1028
  config, and revoke it when that program is done.
1029
+
1030
+ ### Programs that are not Qwen Code sessions
1031
+
1032
+ Everything above works between sessions, but nothing in it is specific to
1033
+ one. A program that writes a registry record for itself and binds an
1034
+ inbox the same way is listed by `qwen sessions ps` and by `list_agents`,
1035
+ can be addressed by name from `send_message`, and receives delivery
1036
+ receipts for what it sends — a voice front-end, a relay, a build watcher.
1037
+ It should record `kind: "external"` so a listing can say what it is.
1038
+
1039
+ [Cross-Session Protocol](./cross-session-protocol.md) is the contract for
1040
+ writing one: the record schema and how liveness is judged, the socket
1041
+ paths and framing, the auth line, every frame field, the receipt states
1042
+ and their transitions, and what a receiver does with a message before its
1043
+ model sees it.