@qwen-code/qwen-code 0.19.6 → 0.19.7-nightly.20260708.394c1a289

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 (267) hide show
  1. package/bundled/qc-helper/docs/configuration/model-providers.md +5 -1
  2. package/bundled/qc-helper/docs/configuration/settings.md +33 -1
  3. package/bundled/qc-helper/docs/features/channels/_meta.ts +1 -0
  4. package/bundled/qc-helper/docs/features/channels/overview.md +41 -31
  5. package/bundled/qc-helper/docs/features/channels/wecom.md +111 -0
  6. package/bundled/qc-helper/docs/features/code-review.md +16 -6
  7. package/bundled/qc-helper/docs/features/commands.md +1 -1
  8. package/bundled/qc-helper/docs/features/hooks.md +6 -0
  9. package/bundled/qc-helper/docs/features/skills.md +5 -3
  10. package/bundled/qc-helper/docs/integration-github-action.md +1 -1
  11. package/bundled/review/DESIGN.md +50 -18
  12. package/bundled/review/SKILL.md +102 -12
  13. package/chunks/{MaxSizedBox-SK7CUWZQ.js → MaxSizedBox-XS37LWTD.js} +31 -29
  14. package/chunks/{StandaloneSessionPicker-G44HGSAP.js → StandaloneSessionPicker-LPALJTKN.js} +44 -41
  15. package/chunks/{acpAgent-PKCTYWJV.js → acpAgent-4VE3FGJX.js} +769 -366
  16. package/chunks/{agent-IYMHUXWB.js → agent-CCHERW6L.js} +24 -24
  17. package/chunks/{agent-headless-L2DAW6I5.js → agent-headless-55N6UBUU.js} +24 -24
  18. package/chunks/{anthropicContentGenerator-H5ZOEENQ.js → anthropicContentGenerator-AKYPSZIV.js} +7 -7
  19. package/chunks/{artifact-tool-SLYPWG3C.js → artifact-tool-D233YJFH.js} +27 -8
  20. package/chunks/{askUserQuestion-OKPTECON.js → askUserQuestion-MKL5ZTMC.js} +2 -2
  21. package/chunks/{bridge-DF3IJQ5V.js → bridge-U6HXOHE7.js} +34 -32
  22. package/chunks/{channel-worker-supervisor-JUYQ5Z4R.js → channel-worker-supervisor-CRCVYQIE.js} +1 -1
  23. package/chunks/{chunk-AVQDCKNF.js → chunk-22MNNNXE.js} +4 -0
  24. package/chunks/chunk-2DYY5XUZ.js +8223 -0
  25. package/chunks/chunk-2FHWCKWA.js +262 -0
  26. package/chunks/{chunk-6BEOH4KK.js → chunk-2NPS2UDH.js} +767 -122
  27. package/chunks/{chunk-N2IJLN2L.js → chunk-2SWMCXVR.js} +13 -5
  28. package/chunks/{chunk-OBVBTAX5.js → chunk-2YELHTUE.js} +2 -2
  29. package/chunks/chunk-332PWN27.js +19 -0
  30. package/chunks/{chunk-CLQPBI4H.js → chunk-3B26UVCX.js} +132 -26
  31. package/chunks/{chunk-HCFSKO6K.js → chunk-3QDZDAJG.js} +1 -1
  32. package/chunks/{chunk-G7OQ3RFJ.js → chunk-42XGFRJS.js} +3 -3
  33. package/chunks/{chunk-SL2P3JUA.js → chunk-43W4YSO6.js} +1 -12
  34. package/chunks/{chunk-JA5KWZTJ.js → chunk-44NROQYV.js} +5 -3
  35. package/chunks/{chunk-BOAWGUY6.js → chunk-4AFOWB47.js} +121 -49
  36. package/chunks/{chunk-MOUXUCXQ.js → chunk-4KJ2BPIT.js} +1 -1
  37. package/chunks/{chunk-YTWX5TT2.js → chunk-5FL2K3ZB.js} +1 -1
  38. package/chunks/{chunk-UNXGEDX2.js → chunk-5OSSOBZC.js} +133 -25
  39. package/chunks/{chunk-JN2VJ33O.js → chunk-7I4MGFBN.js} +966 -121
  40. package/chunks/{chunk-T42ACHFI.js → chunk-7LTB54MK.js} +1 -1
  41. package/chunks/chunk-A2X3KLC3.js +3807 -0
  42. package/chunks/{chunk-EWALXUAD.js → chunk-AGHU5VRK.js} +8 -0
  43. package/chunks/{chunk-GLPV75ES.js → chunk-AHNJGLFV.js} +2 -2
  44. package/chunks/{chunk-IUSKVKH5.js → chunk-AXTPFMRS.js} +1 -1
  45. package/chunks/{chunk-T22H4V4R.js → chunk-B34OV7K2.js} +1 -1
  46. package/chunks/{chunk-FZ5NVRVK.js → chunk-B5FOCTEZ.js} +3 -3
  47. package/chunks/{chunk-3UC7ZC43.js → chunk-B6WUEODT.js} +7 -7
  48. package/chunks/{chunk-MJKEQSZI.js → chunk-BGL43SJ3.js} +1 -1
  49. package/chunks/{chunk-OAYOHSGP.js → chunk-BHRU4SDF.js} +4 -4
  50. package/chunks/{chunk-YPCPZSZB.js → chunk-CCGOFQV3.js} +56 -4
  51. package/chunks/{chunk-FDY3XOTM.js → chunk-CR5IU2RX.js} +4 -4
  52. package/chunks/{chunk-LWGLBVWA.js → chunk-CSOTA7KX.js} +1 -1
  53. package/chunks/{chunk-AGZF43UV.js → chunk-E7HM76PR.js} +7153 -4406
  54. package/chunks/{chunk-NIOPRZNN.js → chunk-E7KNELIZ.js} +1 -1
  55. package/chunks/{chunk-YSU33ACT.js → chunk-ELMPRVCB.js} +5 -13
  56. package/chunks/{chunk-SEZC2725.js → chunk-ER3BKOLB.js} +13 -0
  57. package/chunks/{chunk-3VJ7MT3N.js → chunk-EXPMGZZV.js} +14 -3
  58. package/chunks/{chunk-DBF3HTLT.js → chunk-FB2ULV4M.js} +4 -4
  59. package/chunks/{chunk-RZORUN6X.js → chunk-FEJ2FZ3U.js} +1 -1
  60. package/chunks/chunk-FK77ILF5.js +2477 -0
  61. package/chunks/{chunk-DMSNJDWG.js → chunk-FV7425LN.js} +38 -3
  62. package/chunks/{chunk-ALX6BUYW.js → chunk-G7ZG7CA6.js} +186 -27
  63. package/chunks/{chunk-2INJBYLJ.js → chunk-GIY6JTTC.js} +6 -6
  64. package/chunks/{chunk-D5KISTLW.js → chunk-H6EMK6QK.js} +1 -1
  65. package/chunks/{chunk-KYTQOCDE.js → chunk-HW4N45EE.js} +17 -46
  66. package/chunks/{chunk-VXGPYF7U.js → chunk-IFEWJXFS.js} +1 -1
  67. package/chunks/chunk-II73RK2S.js +158 -0
  68. package/chunks/{chunk-TENOUWY2.js → chunk-IJRL2S3D.js} +3 -3
  69. package/chunks/{chunk-GQBRGBLS.js → chunk-J43WPR6U.js} +9 -9
  70. package/chunks/{chunk-SRNPMG7J.js → chunk-JYOWO2F7.js} +16 -10
  71. package/chunks/{chunk-57NRQM3P.js → chunk-K34DD7FH.js} +2 -2
  72. package/chunks/{chunk-O2RJARYU.js → chunk-KKWO4IX2.js} +1409 -4088
  73. package/chunks/{chunk-SOT7OMGL.js → chunk-KT3SI3CQ.js} +2 -2
  74. package/chunks/{chunk-NUK2PFSU.js → chunk-L7IWK7JY.js} +1 -1
  75. package/chunks/{chunk-MHQKYQDS.js → chunk-LC4SMGYY.js} +158 -3
  76. package/chunks/chunk-LGFAYIKX.js +115 -0
  77. package/chunks/{chunk-MBWLP5OT.js → chunk-LKXDC3AW.js} +162 -40
  78. package/chunks/{chunk-7Z6UEJA4.js → chunk-ME344634.js} +5 -2
  79. package/chunks/{chunk-V6NH3CUC.js → chunk-MOQOAH7N.js} +3 -3
  80. package/chunks/{chunk-FPHA7WIZ.js → chunk-MYZWWRVW.js} +3 -3
  81. package/chunks/{chunk-YHTNWGRR.js → chunk-MZ7BABX3.js} +1 -1
  82. package/chunks/chunk-N74BA4VP.js +949 -0
  83. package/chunks/{chunk-B236XPGF.js → chunk-NQKLOAVJ.js} +29 -2
  84. package/chunks/{chunk-LXFCHX4X.js → chunk-OU6FPTJZ.js} +312 -25
  85. package/chunks/{chunk-HTWHAN44.js → chunk-PC4ZXHU2.js} +1 -1
  86. package/chunks/{chunk-3X76L4UF.js → chunk-PLGONYEL.js} +5 -5
  87. package/chunks/{chunk-WXUDZHOJ.js → chunk-PVXPDMGP.js} +10 -2
  88. package/chunks/{chunk-ZO5EA3XJ.js → chunk-QCSLZO6J.js} +1 -1
  89. package/chunks/{chunk-CEYA7K7C.js → chunk-QHT5USLK.js} +62 -12
  90. package/chunks/{chunk-NPQWQYU6.js → chunk-QYNNN7BK.js} +1 -1
  91. package/chunks/{chunk-N4YJQTRL.js → chunk-RFIL6REB.js} +71 -2
  92. package/chunks/{chunk-KSPVDFE4.js → chunk-SAIILPQ3.js} +0 -3
  93. package/chunks/{chunk-OIFSBXSP.js → chunk-SJHAUELE.js} +3 -3
  94. package/chunks/{chunk-BZHLWC6T.js → chunk-SUAKHHK7.js} +2 -2
  95. package/chunks/{chunk-QOKV6AO4.js → chunk-T2EJHSE3.js} +184 -147
  96. package/chunks/{chunk-ZI4MGBB5.js → chunk-TBAZMRW3.js} +1 -1
  97. package/chunks/{chunk-6QVRLKTZ.js → chunk-TBLJNMI7.js} +7 -7
  98. package/chunks/{chunk-J6ABRKAB.js → chunk-TDGF35EN.js} +2 -2
  99. package/chunks/chunk-TEYGKLIZ.js +167 -0
  100. package/chunks/{chunk-TOAUDIS7.js → chunk-TLWA7TPR.js} +6 -2
  101. package/chunks/chunk-UIDXQNMV.js +13 -0
  102. package/chunks/{chunk-MX7CTJHR.js → chunk-UZCT5OLN.js} +9 -9
  103. package/chunks/{chunk-LM3YCCZJ.js → chunk-VEB3NYSO.js} +1 -1
  104. package/chunks/{chunk-UTL7KABL.js → chunk-VQJ64BIQ.js} +7 -7
  105. package/chunks/{chunk-C2QKQZEQ.js → chunk-VTCPREC7.js} +3 -3
  106. package/chunks/{chunk-5ES5YPED.js → chunk-VZ7HY3YU.js} +1 -1
  107. package/chunks/{chunk-QOMAHFYI.js → chunk-W7EEOR7D.js} +3 -3
  108. package/chunks/{chunk-NVFJSIAX.js → chunk-WMPVYQ4P.js} +1 -1
  109. package/chunks/{chunk-V5VTULL5.js → chunk-X265R5C6.js} +3 -3
  110. package/chunks/{chunk-LKWAVAB5.js → chunk-X2XNQQJI.js} +2 -2
  111. package/chunks/{chunk-MJKMIQMK.js → chunk-X3YGAX7V.js} +1 -1
  112. package/chunks/{chunk-5WQF27GW.js → chunk-XQ2GVLNJ.js} +1 -1
  113. package/chunks/chunk-XUSONNJ4.js +28 -0
  114. package/chunks/{chunk-DXXNMPJH.js → chunk-YMWIKAEE.js} +460 -93
  115. package/chunks/{chunk-A34EPIUV.js → chunk-YYU6H66M.js} +18 -15
  116. package/chunks/{chunk-XH7H6YG4.js → chunk-ZK5EI6NR.js} +4 -107
  117. package/chunks/{computer-use-5S3NVXRA.js → computer-use-4CTF6WS3.js} +24 -24
  118. package/chunks/{contextCommand-DPBALZFK.js → contextCommand-Z3XWQCY6.js} +28 -27
  119. package/chunks/{cron-create-7JYUDTUY.js → cron-create-JSXEIPVS.js} +4 -4
  120. package/chunks/{cron-delete-YPULQQAK.js → cron-delete-OIFVEPGU.js} +4 -4
  121. package/chunks/{cron-list-HJIW5MHP.js → cron-list-D4ZX4IOE.js} +11 -7
  122. package/chunks/{daemon-7XYW4BC3.js → daemon-F3I2RXP6.js} +208 -63
  123. package/chunks/daemon-status-provider-6A4QCG6Q.js +74 -0
  124. package/chunks/dist-573HNSVO.js +3217 -0
  125. package/chunks/{dist-ABQ7VWRR.js → dist-FQ5WRJPL.js} +2 -2
  126. package/chunks/{dist-JPSVN367.js → dist-IMFFBMAT.js} +6 -3792
  127. package/chunks/{dist-BV56HW3W.js → dist-OT7G2WNM.js} +250 -1
  128. package/chunks/{dist-AW5ZYMUI.js → dist-PKFTNUHO.js} +10 -11
  129. package/chunks/{dist-AAO65DPC.js → dist-YTRKAVUB.js} +1 -1
  130. package/chunks/{earlyInputCapture-GGPV4IFT.js → earlyInputCapture-7O47HW62.js} +25 -25
  131. package/chunks/{edit-HJ7ISN4C.js → edit-E32KWLF2.js} +25 -25
  132. package/chunks/{en-XR3S5VWY.js → en-GA2RMXY5.js} +6 -1
  133. package/chunks/{enter-worktree-2BQT675D.js → enter-worktree-ZKFFMHUD.js} +24 -24
  134. package/chunks/{enterPlanMode-SJXHJ3WD.js → enterPlanMode-HLDC6NGX.js} +24 -24
  135. package/chunks/{errors-EVGER4AZ.js → errors-MTIDDXX7.js} +26 -26
  136. package/chunks/{exit-worktree-RPDDOSPM.js → exit-worktree-YHY72XA2.js} +24 -24
  137. package/chunks/{exitPlanMode-BQEROAJ7.js → exitPlanMode-JNXKBZ2C.js} +24 -24
  138. package/chunks/{fast-path-FX2ICJ2O.js → fast-path-DVAGBROV.js} +5 -2
  139. package/chunks/{fr-MBMNQSQ6.js → fr-GWNQG4XH.js} +4 -0
  140. package/chunks/{gemini-EHUXCOUI.js → gemini-2TMHJVRC.js} +444 -256
  141. package/chunks/{geminiContentGenerator-YDUUKAM2.js → geminiContentGenerator-WCH4GWD3.js} +4 -4
  142. package/chunks/{glob-3VIGV2DL.js → glob-I6Y4AGKO.js} +52 -28
  143. package/chunks/{grep-4D3S4NUC.js → grep-3P2J3LU5.js} +24 -24
  144. package/chunks/handleAutoUpdate-4IVRMRG4.js +65 -0
  145. package/chunks/{initializer-QZTZSSLW.js → initializer-DVNCPVTC.js} +31 -29
  146. package/chunks/{ja-HFV5QCHR.js → ja-2HOTA47X.js} +4 -0
  147. package/chunks/{keychain-token-storage-GPAKRDKQ.js → keychain-token-storage-UJV5XP4Z.js} +2 -2
  148. package/chunks/{list-WQ24EAMK.js → list-4D6QK2KZ.js} +30 -30
  149. package/chunks/{loadedSettingsAdapter-XV74KOSR.js → loadedSettingsAdapter-GNGELH6Q.js} +28 -28
  150. package/chunks/{loop-wakeup-34YK7T7O.js → loop-wakeup-OHWEMFP5.js} +5 -5
  151. package/chunks/{ls-MPD5OJUX.js → ls-L654WOAT.js} +4 -4
  152. package/chunks/{lsp-72PWTDW7.js → lsp-M35KE54Y.js} +2 -2
  153. package/chunks/{mcp-CO3MKM7N.js → mcp-2IL72YJP.js} +28 -28
  154. package/chunks/{monitor-GB56T65A.js → monitor-BLVCZAVX.js} +32 -27
  155. package/chunks/nonInteractiveCli-UD3V7UOO.js +116 -0
  156. package/chunks/{notebook-edit-VMXAAE3R.js → notebook-edit-5TVMWIWY.js} +25 -25
  157. package/chunks/{openaiContentGenerator-GM77FLII.js → openaiContentGenerator-5LJ5A7YY.js} +12 -12
  158. package/chunks/{pidfile-HFXSHR64.js → pidfile-AN5JQJ2T.js} +25 -25
  159. package/chunks/{qwenContentGenerator-QSCXQIKJ.js → qwenContentGenerator-E2JSB4FJ.js} +26 -26
  160. package/chunks/{qwenOAuth2-LWLA6MQG.js → qwenOAuth2-ZV7YLMND.js} +5 -5
  161. package/chunks/{read-file-SVH6CGQY.js → read-file-N5DEFUDU.js} +8 -8
  162. package/chunks/{read-mcp-resource-OWOBJY72.js → read-mcp-resource-CNQHBSJM.js} +2 -2
  163. package/chunks/{record-artifact-URK3YUDJ.js → record-artifact-PP3LKHTS.js} +2 -2
  164. package/chunks/{ripGrep-JD5O2FLX.js → ripGrep-BLJHTHKE.js} +24 -24
  165. package/chunks/{run-qwen-serve-FADLRJUN.js → run-qwen-serve-4JDO64RN.js} +785 -35
  166. package/chunks/{scheduler-Q65SB7DJ.js → scheduler-FQR4XA7J.js} +24 -24
  167. package/chunks/{send-message-L7OLQEKH.js → send-message-OA6MV4EU.js} +3 -3
  168. package/chunks/{serve-6ZXAMQ4M.js → serve-ZOCFC7YM.js} +29 -29
  169. package/chunks/{server-WKDQA6XR.js → server-GEOYEPYT.js} +2504 -439
  170. package/chunks/{session-STWOX7RA.js → session-NJCONHGX.js} +66 -61
  171. package/chunks/{settings-LC4CCWQQ.js → settings-QBGGXANI.js} +27 -27
  172. package/chunks/{shell-FEG3RLPW.js → shell-2DVPSEKT.js} +24 -24
  173. package/chunks/{skill-XTXAMDAP.js → skill-HIPXUHV7.js} +24 -12
  174. package/chunks/{spawnChannel-B6JJPBPV.js → spawnChannel-3JYXY52G.js} +27 -27
  175. package/chunks/{src-HITDGVRM.js → src-NLEX4CUC.js} +91 -36
  176. package/chunks/{startInteractiveUI-IT423PW4.js → startInteractiveUI-TYGZIU27.js} +6213 -14273
  177. package/chunks/{syntheticOutput-J3MLCQAR.js → syntheticOutput-F7LSDCAR.js} +3 -3
  178. package/chunks/{task-create-ELEBZ7H2.js → task-create-RPFZNB4B.js} +7 -7
  179. package/chunks/{task-list-IEUZLF3Y.js → task-list-TGGJX7EA.js} +5 -5
  180. package/chunks/{task-stop-QEZW3UDY.js → task-stop-W7NGTMYQ.js} +2 -2
  181. package/chunks/{task-update-DW36J5P5.js → task-update-5WUG5MVQ.js} +7 -7
  182. package/chunks/{team-create-DAG6SNHZ.js → team-create-MGX57SZJ.js} +24 -24
  183. package/chunks/{team-delete-SVITIMBO.js → team-delete-UHQQ2QQX.js} +5 -5
  184. package/chunks/{team-plan-approval-DRDY5OPC.js → team-plan-approval-BO2N7J3E.js} +24 -24
  185. package/chunks/{theme-manager-N67EZC6B.js → theme-manager-WU7LOA64.js} +25 -25
  186. package/chunks/{todoWrite-SFFQHZYY.js → todoWrite-C4ZAMSR3.js} +4 -4
  187. package/chunks/{tool-search-CMDJ5HGM.js → tool-search-CLBKVEVK.js} +11 -28
  188. package/chunks/{trustedFolders-JD4QX6UJ.js → trustedFolders-GAQM2GHB.js} +25 -25
  189. package/chunks/updateCheck-RIK2YIQE.js +65 -0
  190. package/chunks/{validateNonInterActiveAuth-ADDCGZ6A.js → validateNonInterActiveAuth-NS3GBIJZ.js} +61 -56
  191. package/chunks/{version-VAONYVE5.js → version-B3RSLP54.js} +2 -1
  192. package/chunks/{web-fetch-SXAXJHIO.js → web-fetch-UYGMOHW4.js} +5 -5
  193. package/chunks/{workflow-DG2BR42M.js → workflow-7APPIGND.js} +25 -25
  194. package/chunks/{workspace-providers-status-XGW5OZTD.js → workspace-providers-status-SC67GLMY.js} +30 -30
  195. package/chunks/{workspace-service-GX3GGZLU.js → workspace-service-ZJHF22WA.js} +35 -35
  196. package/chunks/{workspace-skills-status-LFK5WV2V.js → workspace-skills-status-NJEK6P6Y.js} +29 -29
  197. package/chunks/{write-file-UR7FXWOU.js → write-file-R6Z3VLRY.js} +25 -25
  198. package/chunks/{zh-FSVJTXA4.js → zh-7XVVRTDH.js} +6 -1
  199. package/chunks/{zh-TW-66MG4LWL.js → zh-TW-DPH554OG.js} +6 -1
  200. package/cli.js +19 -11
  201. package/locales/en.js +9 -2
  202. package/locales/fr.js +6 -0
  203. package/locales/ja.js +6 -0
  204. package/locales/zh-TW.js +9 -2
  205. package/locales/zh.js +9 -2
  206. package/node_modules/@qwen-code/audio-capture/package.json +1 -1
  207. package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-arm64/@qwen-code+audio-capture.node +0 -0
  208. package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-x64/@qwen-code+audio-capture.node +0 -0
  209. package/node_modules/@qwen-code/audio-capture/prebuilds/win32-x64/@qwen-code+audio-capture.node +0 -0
  210. package/package.json +3 -3
  211. package/web-shell/assets/{arc-CUpe0ibu.js → arc-C7hjaa7g.js} +1 -1
  212. package/web-shell/assets/{architectureDiagram-3BPJPVTR-JvyrY_mK.js → architectureDiagram-3BPJPVTR-pm9KtMZY.js} +1 -1
  213. package/web-shell/assets/{blockDiagram-GPEHLZMM-CK3Y_vom.js → blockDiagram-GPEHLZMM-CApElKsU.js} +1 -1
  214. package/web-shell/assets/{c4Diagram-AAUBKEIU-DprSnyrf.js → c4Diagram-AAUBKEIU-BeDe0-9N.js} +1 -1
  215. package/web-shell/assets/channel-BNf1dW-j.js +1 -0
  216. package/web-shell/assets/{chunk-2J33WTMH-DJtRJPmu.js → chunk-2J33WTMH-DJEkmLdl.js} +1 -1
  217. package/web-shell/assets/{chunk-4BX2VUAB-ON6Q2-BG.js → chunk-4BX2VUAB-DXX8gdpe.js} +1 -1
  218. package/web-shell/assets/{chunk-55IACEB6-c60ou5HZ.js → chunk-55IACEB6-DORmk1kQ.js} +1 -1
  219. package/web-shell/assets/{chunk-727SXJPM-BamtPKxx.js → chunk-727SXJPM-DWmO4mCZ.js} +1 -1
  220. package/web-shell/assets/{chunk-AQP2D5EJ-CsVgpu-T.js → chunk-AQP2D5EJ-C7LRaYw2.js} +1 -1
  221. package/web-shell/assets/{chunk-FMBD7UC4-vZrpjAx4.js → chunk-FMBD7UC4-CCdXgyC5.js} +1 -1
  222. package/web-shell/assets/{chunk-ND2GUHAM-qxyNOd5t.js → chunk-ND2GUHAM-SyL_xvWc.js} +1 -1
  223. package/web-shell/assets/{chunk-QZHKN3VN-BvTJSM_S.js → chunk-QZHKN3VN-BzOuCKxa.js} +1 -1
  224. package/web-shell/assets/classDiagram-4FO5ZUOK-uOIGlzgi.js +1 -0
  225. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-uOIGlzgi.js +1 -0
  226. package/web-shell/assets/{cose-bilkent-S5V4N54A-1tXB4pju.js → cose-bilkent-S5V4N54A-BMPWyDKc.js} +1 -1
  227. package/web-shell/assets/{dagre-BM42HDAG-DglBzme8.js → dagre-BM42HDAG-B_GnPWik.js} +1 -1
  228. package/web-shell/assets/{diagram-2AECGRRQ-DEJpqsWz.js → diagram-2AECGRRQ-fJqMc3S_.js} +1 -1
  229. package/web-shell/assets/{diagram-5GNKFQAL-CsQ1NrMG.js → diagram-5GNKFQAL-ximV3O9D.js} +1 -1
  230. package/web-shell/assets/{diagram-KO2AKTUF-Z-3codAi.js → diagram-KO2AKTUF-2vVyjzqw.js} +1 -1
  231. package/web-shell/assets/{diagram-LMA3HP47-mBuPTA2i.js → diagram-LMA3HP47-Dckcx1sT.js} +1 -1
  232. package/web-shell/assets/{diagram-OG6HWLK6-tcA3K3s9.js → diagram-OG6HWLK6-BAVv47ga.js} +1 -1
  233. package/web-shell/assets/{erDiagram-TEJ5UH35-D9bXFRyZ.js → erDiagram-TEJ5UH35-Bn3nf5J0.js} +1 -1
  234. package/web-shell/assets/{flowDiagram-I6XJVG4X-Ck0Py04s.js → flowDiagram-I6XJVG4X-BIbGF9JT.js} +1 -1
  235. package/web-shell/assets/{ganttDiagram-6RSMTGT7-rOevCekE.js → ganttDiagram-6RSMTGT7-CDbhb3AH.js} +1 -1
  236. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-CoPQaLj0.js → gitGraphDiagram-PVQCEYII-CbKG1a_w.js} +1 -1
  237. package/web-shell/assets/index-CnE2ur2L.js +779 -0
  238. package/web-shell/assets/index-hSKXrlSE.css +5 -0
  239. package/web-shell/assets/{infoDiagram-5YYISTIA-a77CUKoI.js → infoDiagram-5YYISTIA-DUFxTy8m.js} +1 -1
  240. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-DlLgUAO-.js → ishikawaDiagram-YF4QCWOH-D69hrBG8.js} +1 -1
  241. package/web-shell/assets/{journeyDiagram-JHISSGLW-BXR5kVAZ.js → journeyDiagram-JHISSGLW-DsvEw51Y.js} +1 -1
  242. package/web-shell/assets/{kanban-definition-UN3LZRKU-h5CoHZg7.js → kanban-definition-UN3LZRKU-lFFjZEYd.js} +1 -1
  243. package/web-shell/assets/{linear-BkaREbyD.js → linear-Bo5bWzvo.js} +1 -1
  244. package/web-shell/assets/{mermaid.core-Bkagz0ng.js → mermaid.core-C_HKMJx5.js} +5 -5
  245. package/web-shell/assets/{mindmap-definition-RKZ34NQL-D7EMKR_5.js → mindmap-definition-RKZ34NQL-DlV-NUTs.js} +1 -1
  246. package/web-shell/assets/{pieDiagram-4H26LBE5-DAmPOjsL.js → pieDiagram-4H26LBE5-B2e6FH2a.js} +1 -1
  247. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-e4WFQkQu.js → quadrantDiagram-W4KKPZXB-D75kSk-b.js} +1 -1
  248. package/web-shell/assets/{requirementDiagram-4Y6WPE33-v1zo7OiV.js → requirementDiagram-4Y6WPE33-CQ6xakhM.js} +1 -1
  249. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-Bstm4aW_.js → sankeyDiagram-5OEKKPKP-J_XTKrcY.js} +1 -1
  250. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-DzcZy6xN.js → sequenceDiagram-3UESZ5HK-D7jTcBtf.js} +1 -1
  251. package/web-shell/assets/{stateDiagram-AJRCARHV-BEJH6YbH.js → stateDiagram-AJRCARHV-CrlM_OT3.js} +1 -1
  252. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-Bs4TK_84.js +1 -0
  253. package/web-shell/assets/{timeline-definition-PNZ67QCA-TI1wH-Pm.js → timeline-definition-PNZ67QCA-5oZi76Ef.js} +1 -1
  254. package/web-shell/assets/{vennDiagram-CIIHVFJN-YaH8VDMS.js → vennDiagram-CIIHVFJN-DO5YptPK.js} +1 -1
  255. package/web-shell/assets/{wardley-L42UT6IY-B80co7OP.js → wardley-L42UT6IY-4t1eJDvM.js} +1 -1
  256. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-4fHNDEMl.js → wardleyDiagram-YWT4CUSO-DKZc661S.js} +1 -1
  257. package/web-shell/assets/{xychartDiagram-2RQKCTM6-DT3q4Z3J.js → xychartDiagram-2RQKCTM6-su9hp08G.js} +1 -1
  258. package/web-shell/index.html +2 -2
  259. package/chunks/chunk-L7QPM2YD.js +0 -481
  260. package/chunks/daemon-status-provider-2EWTHT7Y.js +0 -73
  261. package/chunks/nonInteractiveCli-HNZRIM5I.js +0 -111
  262. package/web-shell/assets/channel-BAxQ2-aZ.js +0 -1
  263. package/web-shell/assets/classDiagram-4FO5ZUOK-Cvd_xhZI.js +0 -1
  264. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-Cvd_xhZI.js +0 -1
  265. package/web-shell/assets/index-Cr7MYW6T.css +0 -5
  266. package/web-shell/assets/index-DCHPAUp3.js +0 -730
  267. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-BopifCBI.js +0 -1
@@ -7,7 +7,7 @@ import {
7
7
  sanitizeLogText,
8
8
  sanitizePromptText,
9
9
  sanitizeSenderName
10
- } from "./chunk-6BEOH4KK.js";
10
+ } from "./chunk-2NPS2UDH.js";
11
11
  import "./chunk-VRDMOSQS.js";
12
12
  import "./chunk-K5PGHDBN.js";
13
13
  import {
@@ -1464,6 +1464,8 @@ var QQChannel = class _QQChannel extends ChannelBase {
1464
1464
  beforeExitHook = null;
1465
1465
  /** Timer for reconnectWithRetry fallback (unref'd so it doesn't block exit). */
1466
1466
  reconnectTimer = null;
1467
+ /** 30s READY timeout to prevent hanging on gateway without response. */
1468
+ readyTimeout = null;
1467
1469
  /** Guard against parallel reconnectWithRetry chains from stale close events. */
1468
1470
  isReconnecting = false;
1469
1471
  /** Track whether a chatId is a group or C2C for correct API routing. */
@@ -1476,7 +1478,40 @@ var QQChannel = class _QQChannel extends ChannelBase {
1476
1478
  replyMsgIdCleanupTimer = null;
1477
1479
  /** 5-minute TTL for replyMsgId entries and seenMessages dedup. */
1478
1480
  static REPLY_MSG_ID_TTL_MS = 3e5;
1481
+ /** Idle-flush timeout: buffer is sent after this many ms of silence. */
1482
+ static IDLE_FLUSH_MS = 2e3;
1483
+ /** Max consecutive send failures before the stream is abandoned. */
1484
+ static MAX_FLUSH_RETRIES = 3;
1485
+ /** Retry delay for subsequent attempts (backoff beyond first retry). */
1486
+ static IDLE_FLUSH_BACKOFF_MS = 4e3;
1487
+ /** Max buffer length before forcing an immediate flush. */
1488
+ static MAX_BUFFER_LENGTH = 4096;
1479
1489
  /** Path to persisted QQ routing state: chatTypeMap, replyMsgId, msgSeqMap. */
1490
+ /**
1491
+ * Streaming state machine with per-session buffers.
1492
+ *
1493
+ * Three states for each session:
1494
+ * active — accumulating chunks in buffer (onResponseChunk extends timer)
1495
+ * flushing — sendMessage() is in-flight (prevents parallel sends)
1496
+ * idle — waiting for next chunk (timer counting down to idleFlush)
1497
+ *
1498
+ * Transitions:
1499
+ * active → flushing: idleFlush timer fires, or onToolCall cancels timer
1500
+ * flushing → idle: send settles, idle timer restarts on retry
1501
+ * any → done: onResponseComplete sends remaining content
1502
+ *
1503
+ * Guards:
1504
+ * - flushingSessions prevents concurrent sends per session
1505
+ * - pendingStreamDelete defers cleanup until in-flight send resolves
1506
+ * - flushedSessions tracks already-sent sessions to skip final fullText
1507
+ */
1508
+ // ── Streaming state ───────────────────────────────────────────
1509
+ streamState = /* @__PURE__ */ new Map();
1510
+ flushingSessions = /* @__PURE__ */ new Set();
1511
+ pendingStreamDelete = /* @__PURE__ */ new Set();
1512
+ reconnectId = 0;
1513
+ blockStreaming = false;
1514
+ flushedSessions = /* @__PURE__ */ new Set();
1480
1515
  qqStatePath;
1481
1516
  /**
1482
1517
  * Path to the SessionRouter persistence file we back up before shutdown.
@@ -1499,6 +1534,7 @@ var QQChannel = class _QQChannel extends ChannelBase {
1499
1534
  registerBridgeEvents: options?.registerBridgeEvents ?? !hasExternalRouter
1500
1535
  });
1501
1536
  this.qqConfig = config;
1537
+ this.blockStreaming = this.config.blockStreaming === "on";
1502
1538
  this.qqStatePath = join2(stateDir, `${safeName}-state.json`);
1503
1539
  this.globalSessionsPath = hasExternalRouter ? join2(stateDir, "sessions.json") : sessionsPath;
1504
1540
  this.sessionsBackupPath = join2(stateDir, `${safeName}-sessions-backup.json`);
@@ -1506,6 +1542,7 @@ var QQChannel = class _QQChannel extends ChannelBase {
1506
1542
  // ── ChannelBase interface ──────────────────────────────────────
1507
1543
  async connect() {
1508
1544
  this.disposed = false;
1545
+ this.reconnectId++;
1509
1546
  if (!this.config.instructions) {
1510
1547
  this.config.instructions = [
1511
1548
  "## QQ Bot Channel",
@@ -1690,6 +1727,10 @@ var QQChannel = class _QQChannel extends ChannelBase {
1690
1727
  }
1691
1728
  this.flushQQState();
1692
1729
  this.backupGlobalSessions();
1730
+ if (this.readyTimeout) {
1731
+ clearTimeout(this.readyTimeout);
1732
+ this.readyTimeout = null;
1733
+ }
1693
1734
  if (this.ws) {
1694
1735
  this.ws.close(1e3);
1695
1736
  this.ws = null;
@@ -1701,6 +1742,16 @@ var QQChannel = class _QQChannel extends ChannelBase {
1701
1742
  this.chatTypeMap.clear();
1702
1743
  this.replyMsgId.clear();
1703
1744
  this.msgSeqMap.clear();
1745
+ for (const [, state] of this.streamState) {
1746
+ if (state.timer)
1747
+ clearTimeout(state.timer);
1748
+ }
1749
+ this.streamState.clear();
1750
+ this.flushingSessions.clear();
1751
+ this.pendingStreamDelete.clear();
1752
+ this.flushedSessions.clear();
1753
+ this.seenMessages.clear();
1754
+ this.reconnectId++;
1704
1755
  }
1705
1756
  /**
1706
1757
  * QQ Bot API V2 does not provide a typing indicator endpoint.
@@ -1711,6 +1762,182 @@ var QQChannel = class _QQChannel extends ChannelBase {
1711
1762
  }
1712
1763
  onPromptEnd(_chatId, _sessionId, _messageId) {
1713
1764
  }
1765
+ // ── Streaming (idle-flush with per-session buffers) ────────────
1766
+ onResponseChunk(chatId, chunk, sessionId) {
1767
+ if (this.blockStreaming)
1768
+ return;
1769
+ let state = this.streamState.get(sessionId);
1770
+ if (!state) {
1771
+ state = { chatId, buffer: chunk, timer: null, retryCount: 0 };
1772
+ this.streamState.set(sessionId, state);
1773
+ } else {
1774
+ state.buffer += chunk;
1775
+ if (state.timer) {
1776
+ clearTimeout(state.timer);
1777
+ state.timer = null;
1778
+ }
1779
+ if (state.buffer.length >= _QQChannel.MAX_BUFFER_LENGTH) {
1780
+ const buf = state.buffer;
1781
+ state.buffer = "";
1782
+ this.flushAndTrack(sessionId, buf, state, "idleFlush");
1783
+ return;
1784
+ }
1785
+ }
1786
+ const reconnectId = this.reconnectId;
1787
+ state.timer = setTimeout(() => {
1788
+ this.idleFlush(sessionId, reconnectId);
1789
+ }, _QQChannel.IDLE_FLUSH_MS);
1790
+ state.timer.unref?.();
1791
+ }
1792
+ idleFlush(sessionId, reconnectId) {
1793
+ if (this.reconnectId !== reconnectId) {
1794
+ process.stderr.write(`[QQ:${this.name}] idleFlush discarded (reconnect) session=${sanitizeLogText(sessionId, 32)}
1795
+ `);
1796
+ return;
1797
+ }
1798
+ const state = this.streamState.get(sessionId);
1799
+ if (!state || !state.buffer)
1800
+ return;
1801
+ if (this.flushingSessions.has(sessionId)) {
1802
+ if (!state.timer) {
1803
+ const retryReconnectId = this.reconnectId;
1804
+ state.timer = setTimeout(() => {
1805
+ this.idleFlush(sessionId, retryReconnectId);
1806
+ }, _QQChannel.IDLE_FLUSH_MS);
1807
+ state.timer.unref?.();
1808
+ }
1809
+ return;
1810
+ }
1811
+ const buffer = state.buffer;
1812
+ state.buffer = "";
1813
+ state.timer = null;
1814
+ this.flushAndTrack(sessionId, buffer, state, "idleFlush");
1815
+ }
1816
+ /**
1817
+ * Shared send-and-track helper used by idleFlush and onToolCall.
1818
+ * Encapsulates .then() (cleanup on success) and .catch() (retry/re-buffer
1819
+ * on failure) logic to eliminate duplication.
1820
+ */
1821
+ flushAndTrack(sessionId, buffer, state, logLabel) {
1822
+ this.flushingSessions.add(sessionId);
1823
+ this.sendMessage(state.chatId, buffer).then(() => {
1824
+ const current = this.streamState.get(sessionId);
1825
+ if (current !== state)
1826
+ return;
1827
+ current.retryCount = 0;
1828
+ this.flushedSessions.add(sessionId);
1829
+ if (this.pendingStreamDelete.has(sessionId)) {
1830
+ this.pendingStreamDelete.delete(sessionId);
1831
+ const s2 = this.streamState.get(sessionId);
1832
+ if (s2 === state && s2.buffer) {
1833
+ this.idleFlush(sessionId, this.reconnectId);
1834
+ }
1835
+ }
1836
+ const s = this.streamState.get(sessionId);
1837
+ if (s === state && !s.buffer) {
1838
+ this.streamState.delete(sessionId);
1839
+ }
1840
+ }).catch((e) => {
1841
+ process.stderr.write(`[QQ:${this.name}] ${logLabel} send failed: ${sanitizeLogText(e instanceof Error ? e.message : String(e), 200)}
1842
+ `);
1843
+ if (this.pendingStreamDelete.has(sessionId)) {
1844
+ this.pendingStreamDelete.delete(sessionId);
1845
+ const current = this.streamState.get(sessionId);
1846
+ if (current === state) {
1847
+ current.buffer = buffer;
1848
+ current.retryCount++;
1849
+ if (current.retryCount < _QQChannel.MAX_FLUSH_RETRIES) {
1850
+ const reconnectId = this.reconnectId;
1851
+ const delay = current.retryCount > 1 ? _QQChannel.IDLE_FLUSH_BACKOFF_MS : _QQChannel.IDLE_FLUSH_MS;
1852
+ current.timer = setTimeout(() => {
1853
+ this.idleFlush(sessionId, reconnectId);
1854
+ }, delay);
1855
+ current.timer.unref?.();
1856
+ } else {
1857
+ this.streamState.delete(sessionId);
1858
+ this.flushedSessions.delete(sessionId);
1859
+ process.stderr.write(`[QQ:${this.name}] ${logLabel} retries exhausted for ${sanitizeLogText(sessionId, 64)}
1860
+ `);
1861
+ }
1862
+ }
1863
+ } else {
1864
+ const current = this.streamState.get(sessionId);
1865
+ if (current === state) {
1866
+ current.buffer = buffer + (current.buffer || "");
1867
+ if (current.buffer.length >= _QQChannel.MAX_BUFFER_LENGTH) {
1868
+ this.idleFlush(sessionId, this.reconnectId);
1869
+ } else {
1870
+ current.retryCount++;
1871
+ if (current.retryCount < _QQChannel.MAX_FLUSH_RETRIES) {
1872
+ if (!current.timer) {
1873
+ const reconnectId = this.reconnectId;
1874
+ const delay = current.retryCount > 1 ? _QQChannel.IDLE_FLUSH_BACKOFF_MS : _QQChannel.IDLE_FLUSH_MS;
1875
+ current.timer = setTimeout(() => {
1876
+ this.idleFlush(sessionId, reconnectId);
1877
+ }, delay);
1878
+ current.timer.unref?.();
1879
+ }
1880
+ } else {
1881
+ this.streamState.delete(sessionId);
1882
+ this.flushedSessions.delete(sessionId);
1883
+ process.stderr.write(`[QQ:${this.name}] ${logLabel} retries exhausted for ${sanitizeLogText(sessionId, 64)}
1884
+ `);
1885
+ }
1886
+ }
1887
+ }
1888
+ }
1889
+ }).finally(() => {
1890
+ const current = this.streamState.get(sessionId);
1891
+ if (!current || current === state) {
1892
+ this.flushingSessions.delete(sessionId);
1893
+ }
1894
+ });
1895
+ }
1896
+ onToolCall(_chatId, event) {
1897
+ const state = this.streamState.get(event.sessionId);
1898
+ if (!state || !state.buffer)
1899
+ return;
1900
+ if (this.flushingSessions.has(event.sessionId))
1901
+ return;
1902
+ if (state.timer) {
1903
+ clearTimeout(state.timer);
1904
+ state.timer = null;
1905
+ }
1906
+ const buffer = state.buffer;
1907
+ state.buffer = "";
1908
+ this.flushAndTrack(event.sessionId, buffer, state, "toolCallFlush");
1909
+ }
1910
+ async onResponseComplete(chatId, fullText, sessionId) {
1911
+ const state = this.streamState.get(sessionId);
1912
+ if (state?.timer) {
1913
+ clearTimeout(state.timer);
1914
+ state.timer = null;
1915
+ }
1916
+ if (state && this.flushingSessions.has(sessionId)) {
1917
+ this.pendingStreamDelete.add(sessionId);
1918
+ process.stderr.write(`[QQ:${this.name}] onResponseComplete deferred (flush in-flight) session=${sanitizeLogText(sessionId, 32)}
1919
+ `);
1920
+ return;
1921
+ }
1922
+ const wasFlushed = this.flushedSessions.has(sessionId);
1923
+ const remaining = state?.buffer ?? (wasFlushed ? "" : fullText);
1924
+ this.streamState.delete(sessionId);
1925
+ this.flushedSessions.delete(sessionId);
1926
+ if (remaining) {
1927
+ await super.onResponseComplete(chatId, remaining, sessionId);
1928
+ }
1929
+ }
1930
+ onSessionDied(sessionId) {
1931
+ const state = this.streamState.get(sessionId);
1932
+ if (state?.timer) {
1933
+ clearTimeout(state.timer);
1934
+ }
1935
+ this.streamState.delete(sessionId);
1936
+ this.flushingSessions.delete(sessionId);
1937
+ this.pendingStreamDelete.delete(sessionId);
1938
+ this.flushedSessions.delete(sessionId);
1939
+ super.onSessionDied(sessionId);
1940
+ }
1714
1941
  // ── State Persistence (cross-server context continuation) ──────
1715
1942
  /** Debounced state persistence to avoid blocking event loop. */
1716
1943
  saveQQState() {
@@ -2008,6 +2235,13 @@ var QQChannel = class _QQChannel extends ChannelBase {
2008
2235
  dialGateway(url, resolve, reject) {
2009
2236
  this.ws = new wrapper_default(url);
2010
2237
  const dialed = this.ws;
2238
+ this.readyTimeout = setTimeout(() => {
2239
+ if (this.ws !== dialed)
2240
+ return;
2241
+ this.ws.close(4002, "READY timeout");
2242
+ reject(new Error(`[QQ:${this.name}] READY timeout after 30s`));
2243
+ }, 3e4);
2244
+ this.readyTimeout.unref?.();
2011
2245
  this.ws.on("open", () => {
2012
2246
  process.stderr.write(`[QQ:${this.name}] WebSocket connected
2013
2247
  `);
@@ -2026,6 +2260,10 @@ var QQChannel = class _QQChannel extends ChannelBase {
2026
2260
  return;
2027
2261
  process.stderr.write(`[QQ:${this.name}] WebSocket closed (code=${code})
2028
2262
  `);
2263
+ if (this.readyTimeout) {
2264
+ clearTimeout(this.readyTimeout);
2265
+ this.readyTimeout = null;
2266
+ }
2029
2267
  this.stopHeartbeat();
2030
2268
  this.ws = null;
2031
2269
  const shouldReconnect = this.serverRequestedReconnect || code !== 1e3 && this.reconnectAttempts < this.maxReconnectAttempts;
@@ -2080,6 +2318,10 @@ var QQChannel = class _QQChannel extends ChannelBase {
2080
2318
  if (t === "READY") {
2081
2319
  this.reconnectAttempts = 0;
2082
2320
  this.isReconnecting = false;
2321
+ if (this.readyTimeout) {
2322
+ clearTimeout(this.readyTimeout);
2323
+ this.readyTimeout = null;
2324
+ }
2083
2325
  this.sessionId = msg["d"]?.["session_id"] || "";
2084
2326
  this.tryResume = true;
2085
2327
  this.connectReject = null;
@@ -2101,6 +2343,10 @@ var QQChannel = class _QQChannel extends ChannelBase {
2101
2343
  } else if (t === "RESUMED") {
2102
2344
  this.reconnectAttempts = 0;
2103
2345
  this.isReconnecting = false;
2346
+ if (this.readyTimeout) {
2347
+ clearTimeout(this.readyTimeout);
2348
+ this.readyTimeout = null;
2349
+ }
2104
2350
  this.connectReject = null;
2105
2351
  this.startHeartbeat();
2106
2352
  onReady();
@@ -2218,6 +2464,7 @@ var QQChannel = class _QQChannel extends ChannelBase {
2218
2464
  }
2219
2465
  this.ws.send(JSON.stringify({ op: OpCode.HEARTBEAT, d: this.seq }));
2220
2466
  }, this.heartbeatInterval);
2467
+ this.heartbeatTimer.unref();
2221
2468
  }
2222
2469
  stopHeartbeat() {
2223
2470
  if (this.heartbeatTimer) {
@@ -2252,6 +2499,8 @@ var QQChannel = class _QQChannel extends ChannelBase {
2252
2499
  return;
2253
2500
  if (!event.content?.trim())
2254
2501
  return;
2502
+ if (!event.author)
2503
+ return;
2255
2504
  const chatId = event.author.user_openid || event.author.id;
2256
2505
  this.chatTypeMap.set(chatId, "c2c");
2257
2506
  this.setReplyMsgId(chatId, event.id);
@@ -11,7 +11,7 @@ import {
11
11
  isTerminalTaskLifecycleType,
12
12
  sanitizeLogText,
13
13
  sanitizeSenderName
14
- } from "./chunk-6BEOH4KK.js";
14
+ } from "./chunk-2NPS2UDH.js";
15
15
  import "./chunk-VRDMOSQS.js";
16
16
  import "./chunk-K5PGHDBN.js";
17
17
  import "./chunk-UWCTAVOD.js";
@@ -4309,8 +4309,8 @@ function isTableSeparator(line) {
4309
4309
  const trimmed = line.trim();
4310
4310
  if (!trimmed.includes("-"))
4311
4311
  return false;
4312
- const cells = trimmed.replace(/^\|/, "").replace(/\|$/, "").split("|").map((c) => c.trim());
4313
- return cells.length > 0 && cells.every((c) => /^:?-{3,}:?$/.test(c));
4312
+ const cells = trimmed.replace(/^\|/, "").replace(/\|$/, "").split("|").map((cell) => cell.trim());
4313
+ return cells.length > 0 && cells.every((cell) => /^:?-{3,}:?$/.test(cell));
4314
4314
  }
4315
4315
  __name(isTableSeparator, "isTableSeparator");
4316
4316
  function isTableRow(line) {
@@ -4319,7 +4319,7 @@ function isTableRow(line) {
4319
4319
  }
4320
4320
  __name(isTableRow, "isTableRow");
4321
4321
  function parseTableRow(line) {
4322
- return line.trim().replace(/^\|/, "").replace(/\|$/, "").split("|").map((c) => c.trim());
4322
+ return line.trim().replace(/^\|/, "").replace(/\|$/, "").split("|").map((cell) => cell.trim());
4323
4323
  }
4324
4324
  __name(parseTableRow, "parseTableRow");
4325
4325
  function renderTable(lines) {
@@ -4432,8 +4432,7 @@ function extractTitle(text) {
4432
4432
  }
4433
4433
  __name(extractTitle, "extractTitle");
4434
4434
  function normalizeDingTalkMarkdown(text) {
4435
- const converted = convertTables(text);
4436
- return splitChunks(converted);
4435
+ return splitChunks(convertTables(text));
4437
4436
  }
4438
4437
  __name(normalizeDingTalkMarkdown, "normalizeDingTalkMarkdown");
4439
4438
 
@@ -4760,13 +4759,13 @@ var DingtalkChannel = class _DingtalkChannel extends ChannelBase {
4760
4759
  return this.client.getConfig().access_token;
4761
4760
  }
4762
4761
  async emotionApi(endpoint, msgId, conversationId) {
4763
- const token = this.getAccessToken();
4764
- if (!token)
4765
- return;
4766
4762
  const robotCode = this.config.clientId;
4767
4763
  if (!robotCode || !msgId || !conversationId)
4768
4764
  return;
4769
4765
  try {
4766
+ const token = this.config.clientSecret ? await this.getProactiveToken() : this.getAccessToken();
4767
+ if (!token)
4768
+ return;
4770
4769
  const resp = await fetch(`${EMOTION_API}/${endpoint}`, {
4771
4770
  method: "POST",
4772
4771
  headers: {
@@ -4788,7 +4787,7 @@ var DingtalkChannel = class _DingtalkChannel extends ChannelBase {
4788
4787
  })
4789
4788
  });
4790
4789
  if (!resp.ok) {
4791
- const detail = await resp.text().catch(() => "");
4790
+ const detail = sanitizeLogText(await resp.text().catch(() => ""), 500);
4792
4791
  process.stderr.write(`[DingTalk:${this.name}] emotion/${endpoint} failed: ${resp.status} ${detail}
4793
4792
  `);
4794
4793
  }
@@ -5117,7 +5116,7 @@ var DingtalkChannel = class _DingtalkChannel extends ChannelBase {
5117
5116
  const content = this.extractContent(data);
5118
5117
  let cleanText = content.text;
5119
5118
  if (isMentioned) {
5120
- cleanText = cleanText.replace(/@\S+/, "").trim();
5119
+ cleanText = cleanText.replace(/@[^\s\p{Cf}]+/u, "").trim();
5121
5120
  }
5122
5121
  const quoted = this.extractQuotedContext(data);
5123
5122
  const chatId = conversationId || sessionWebhook;
@@ -3,7 +3,7 @@
3
3
  import {
4
4
  ChannelBase,
5
5
  isTerminalTaskLifecycleType
6
- } from "./chunk-6BEOH4KK.js";
6
+ } from "./chunk-2NPS2UDH.js";
7
7
  import "./chunk-VRDMOSQS.js";
8
8
  import "./chunk-K5PGHDBN.js";
9
9
  import {
@@ -7,52 +7,52 @@ import {
7
7
  startEarlyInputCapture,
8
8
  stopAndGetCapturedInput,
9
9
  stopEarlyInputCapture
10
- } from "./chunk-LWGLBVWA.js";
11
- import "./chunk-AGZF43UV.js";
10
+ } from "./chunk-CSOTA7KX.js";
11
+ import "./chunk-E7HM76PR.js";
12
12
  import "./chunk-5P5XGNYH.js";
13
13
  import "./chunk-SKAZWEV5.js";
14
14
  import "./chunk-K5PGHDBN.js";
15
- import "./chunk-CLQPBI4H.js";
16
- import "./chunk-QOMAHFYI.js";
17
- import "./chunk-G7OQ3RFJ.js";
18
- import "./chunk-LKWAVAB5.js";
19
- import "./chunk-5ES5YPED.js";
15
+ import "./chunk-3B26UVCX.js";
16
+ import "./chunk-W7EEOR7D.js";
17
+ import "./chunk-42XGFRJS.js";
18
+ import "./chunk-X2XNQQJI.js";
19
+ import "./chunk-VZ7HY3YU.js";
20
20
  import "./chunk-2MPVVENX.js";
21
21
  import "./chunk-ZTQ26VBE.js";
22
- import "./chunk-DMSNJDWG.js";
22
+ import "./chunk-FV7425LN.js";
23
23
  import "./chunk-MLZQVCF3.js";
24
24
  import "./chunk-LQ7TMOCE.js";
25
25
  import "./chunk-E5A7LHNN.js";
26
- import "./chunk-LM3YCCZJ.js";
26
+ import "./chunk-VEB3NYSO.js";
27
27
  import "./chunk-GO6LNQXT.js";
28
- import "./chunk-B236XPGF.js";
29
- import "./chunk-NVFJSIAX.js";
30
- import "./chunk-TOAUDIS7.js";
31
- import "./chunk-NPQWQYU6.js";
32
- import "./chunk-JN2VJ33O.js";
28
+ import "./chunk-NQKLOAVJ.js";
29
+ import "./chunk-WMPVYQ4P.js";
30
+ import "./chunk-TLWA7TPR.js";
31
+ import "./chunk-QYNNN7BK.js";
32
+ import "./chunk-7I4MGFBN.js";
33
33
  import "./chunk-E6US47KI.js";
34
34
  import "./chunk-UWCTAVOD.js";
35
35
  import "./chunk-OFEVLU4C.js";
36
36
  import "./chunk-OMX7CUOE.js";
37
- import "./chunk-MOUXUCXQ.js";
38
- import "./chunk-BZHLWC6T.js";
39
- import "./chunk-RZORUN6X.js";
40
- import "./chunk-MJKMIQMK.js";
41
- import "./chunk-TENOUWY2.js";
42
- import "./chunk-GLPV75ES.js";
37
+ import "./chunk-4KJ2BPIT.js";
38
+ import "./chunk-SUAKHHK7.js";
39
+ import "./chunk-FEJ2FZ3U.js";
40
+ import "./chunk-X3YGAX7V.js";
41
+ import "./chunk-IJRL2S3D.js";
42
+ import "./chunk-AHNJGLFV.js";
43
43
  import "./chunk-22IFUCVR.js";
44
- import "./chunk-T42ACHFI.js";
44
+ import "./chunk-7LTB54MK.js";
45
45
  import "./chunk-SIUQ3YYX.js";
46
- import "./chunk-KYTQOCDE.js";
47
- import "./chunk-YPCPZSZB.js";
46
+ import "./chunk-HW4N45EE.js";
47
+ import "./chunk-CCGOFQV3.js";
48
48
  import "./chunk-IRJWHZWU.js";
49
49
  import "./chunk-SYCJMSIJ.js";
50
50
  import "./chunk-55ZMG67I.js";
51
51
  import "./chunk-H6BD2ELD.js";
52
52
  import "./chunk-5IFG2VC4.js";
53
53
  import "./chunk-64WXLC72.js";
54
- import "./chunk-D5KISTLW.js";
55
- import "./chunk-AVQDCKNF.js";
54
+ import "./chunk-H6EMK6QK.js";
55
+ import "./chunk-22MNNNXE.js";
56
56
  import "./chunk-ZERZSAZL.js";
57
57
  import "./chunk-QN5NZ3UQ.js";
58
58
  import "./chunk-BR4QREVK.js";
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
  import {
4
4
  checkTeamMemorySecrets
5
- } from "./chunk-J6ABRKAB.js";
5
+ } from "./chunk-TDGF35EN.js";
6
6
  import {
7
7
  CommitAttributionService,
8
8
  FileEncoding,
@@ -13,27 +13,27 @@ import {
13
13
  getDiffStat,
14
14
  needsUtf8Bom,
15
15
  safeLiteralReplace
16
- } from "./chunk-AGZF43UV.js";
16
+ } from "./chunk-E7HM76PR.js";
17
17
  import "./chunk-5P5XGNYH.js";
18
18
  import "./chunk-SKAZWEV5.js";
19
19
  import "./chunk-K5PGHDBN.js";
20
- import "./chunk-CLQPBI4H.js";
21
- import "./chunk-QOMAHFYI.js";
22
- import "./chunk-G7OQ3RFJ.js";
23
- import "./chunk-LKWAVAB5.js";
24
- import "./chunk-5ES5YPED.js";
20
+ import "./chunk-3B26UVCX.js";
21
+ import "./chunk-W7EEOR7D.js";
22
+ import "./chunk-42XGFRJS.js";
23
+ import "./chunk-X2XNQQJI.js";
24
+ import "./chunk-VZ7HY3YU.js";
25
25
  import "./chunk-2MPVVENX.js";
26
26
  import "./chunk-ZTQ26VBE.js";
27
- import "./chunk-DMSNJDWG.js";
27
+ import "./chunk-FV7425LN.js";
28
28
  import "./chunk-MLZQVCF3.js";
29
29
  import "./chunk-LQ7TMOCE.js";
30
30
  import "./chunk-E5A7LHNN.js";
31
- import "./chunk-LM3YCCZJ.js";
31
+ import "./chunk-VEB3NYSO.js";
32
32
  import "./chunk-GO6LNQXT.js";
33
- import "./chunk-B236XPGF.js";
34
- import "./chunk-NVFJSIAX.js";
35
- import "./chunk-TOAUDIS7.js";
36
- import "./chunk-NPQWQYU6.js";
33
+ import "./chunk-NQKLOAVJ.js";
34
+ import "./chunk-WMPVYQ4P.js";
35
+ import "./chunk-TLWA7TPR.js";
36
+ import "./chunk-QYNNN7BK.js";
37
37
  import {
38
38
  FileOperationEvent,
39
39
  ReadFileTool,
@@ -41,7 +41,7 @@ import {
41
41
  getLanguageFromFilePath,
42
42
  getSpecificMimeType,
43
43
  logFileOperation
44
- } from "./chunk-JN2VJ33O.js";
44
+ } from "./chunk-7I4MGFBN.js";
45
45
  import "./chunk-E6US47KI.js";
46
46
  import "./chunk-UWCTAVOD.js";
47
47
  import "./chunk-OFEVLU4C.js";
@@ -49,28 +49,28 @@ import "./chunk-OMX7CUOE.js";
49
49
  import {
50
50
  isAnyAutoMemPath,
51
51
  isTeamAutoMemPath
52
- } from "./chunk-MOUXUCXQ.js";
53
- import "./chunk-BZHLWC6T.js";
54
- import "./chunk-RZORUN6X.js";
52
+ } from "./chunk-4KJ2BPIT.js";
53
+ import "./chunk-SUAKHHK7.js";
54
+ import "./chunk-FEJ2FZ3U.js";
55
55
  import {
56
56
  BaseDeclarativeTool,
57
57
  ToolDisplayNames,
58
58
  ToolNames
59
- } from "./chunk-MJKMIQMK.js";
60
- import "./chunk-TENOUWY2.js";
61
- import "./chunk-GLPV75ES.js";
59
+ } from "./chunk-X3YGAX7V.js";
60
+ import "./chunk-IJRL2S3D.js";
61
+ import "./chunk-AHNJGLFV.js";
62
62
  import "./chunk-22IFUCVR.js";
63
- import "./chunk-T42ACHFI.js";
63
+ import "./chunk-7LTB54MK.js";
64
64
  import "./chunk-SIUQ3YYX.js";
65
- import "./chunk-KYTQOCDE.js";
66
- import "./chunk-YPCPZSZB.js";
65
+ import "./chunk-HW4N45EE.js";
66
+ import "./chunk-CCGOFQV3.js";
67
67
  import "./chunk-IRJWHZWU.js";
68
68
  import "./chunk-SYCJMSIJ.js";
69
69
  import "./chunk-55ZMG67I.js";
70
70
  import "./chunk-H6BD2ELD.js";
71
71
  import "./chunk-5IFG2VC4.js";
72
72
  import "./chunk-64WXLC72.js";
73
- import "./chunk-D5KISTLW.js";
73
+ import "./chunk-H6EMK6QK.js";
74
74
  import {
75
75
  createDebugLogger,
76
76
  getErrorMessage,
@@ -78,7 +78,7 @@ import {
78
78
  makeRelative,
79
79
  shortenPath,
80
80
  unescapePath
81
- } from "./chunk-AVQDCKNF.js";
81
+ } from "./chunk-22MNNNXE.js";
82
82
  import "./chunk-ZERZSAZL.js";
83
83
  import "./chunk-QN5NZ3UQ.js";
84
84
  import "./chunk-BR4QREVK.js";
@@ -1056,6 +1056,7 @@ var en_default = {
1056
1056
  "Size:": "Size:",
1057
1057
  "{{count}} bytes": "{{count}} bytes",
1058
1058
  "Reference in chat": "Reference in chat",
1059
+ "MCP server": "MCP server",
1059
1060
  "MCP resource server": "MCP resource server",
1060
1061
  // Invalid tool related translations
1061
1062
  "{{count}} invalid tools": "{{count}} invalid tools",
@@ -1087,7 +1088,7 @@ var en_default = {
1087
1088
  // ============================================================================
1088
1089
  "Switch the model for this session (--fast for suggestion model, [model-id] to switch immediately).": "Switch the model for this session (--fast for suggestion model, [model-id] to switch immediately).",
1089
1090
  "Switch the model for this session (--fast for suggestion model, --voice for voice transcription model, [model-id] to switch immediately).": "Switch the model for this session (--fast for suggestion model, --voice for voice transcription model, [model-id] to switch immediately).",
1090
- "Switch the model for this session (--fast for suggestion model, --voice for voice transcription model, --vision for the vision bridge model, [model-id] to switch immediately, or [model-id] [prompt] to run a one-off prompt on another model; the inline prompt is sent verbatim without @file expansion).": "Switch the model for this session (--fast for suggestion model, --voice for voice transcription model, --vision for the vision bridge model, [model-id] to switch immediately, or [model-id] [prompt] to run a one-off prompt on another model; the inline prompt is sent verbatim without @file expansion).",
1091
+ "Switch the model for this session (--fast for suggestion model, --voice for voice transcription model, --vision for the vision bridge model, --project to persist to project settings, --global to persist to user settings, [model-id] to switch immediately, or [model-id] [prompt] to run a one-off prompt on another model; the inline prompt is sent verbatim without @file expansion).": "Switch the model for this session (--fast for suggestion model, --voice for voice transcription model, --vision for the vision bridge model, --project to persist to project settings, --global to persist to user settings, [model-id] to switch immediately, or [model-id] [prompt] to run a one-off prompt on another model; the inline prompt is sent verbatim without @file expansion).",
1091
1092
  "Inline one-shot override isn't supported in this mode \u2014 run '/model {{model}}' first, then send your prompt.": "Inline one-shot override isn't supported in this mode \u2014 run '/model {{model}}' first, then send your prompt.",
1092
1093
  "Inline one-shot override can't switch providers. '{{model}}' belongs to a different provider \u2014 run '/model {{model}}' first, then send your prompt.": "Inline one-shot override can't switch providers. '{{model}}' belongs to a different provider \u2014 run '/model {{model}}' first, then send your prompt.",
1093
1094
  "\u26A0 '{{model}}' is not a known image-capable model; the vision bridge may fail on images.": "\u26A0 '{{model}}' is not a known image-capable model; the vision bridge may fail on images.",
@@ -1095,6 +1096,8 @@ var en_default = {
1095
1096
  "Toggle voice dictation input": "Toggle voice dictation input",
1096
1097
  "Set the model for voice transcription": "Set the model for voice transcription",
1097
1098
  "Set the image-capable model used to transcribe images for a text-only main model": "Set the image-capable model used to transcribe images for a text-only main model",
1099
+ "Persist the model selection to the project settings (workspace scope)": "Persist the model selection to the project settings (workspace scope)",
1100
+ "Persist the model selection to the user settings (global scope)": "Persist the model selection to the user settings (global scope)",
1098
1101
  "Select Fast Model": "Select Fast Model",
1099
1102
  "Select Vision Model": "Select Vision Model",
1100
1103
  "Select Voice Model": "Select Voice Model",
@@ -1257,6 +1260,8 @@ var en_default = {
1257
1260
  // Dialogs - Model
1258
1261
  // ============================================================================
1259
1262
  "Select Model": "Select Model",
1263
+ " (this project)": " (this project)",
1264
+ " (global)": " (global)",
1260
1265
  "API Key": "API Key",
1261
1266
  "(default)": "(default)",
1262
1267
  "(not set)": "(not set)",