@qwen-code/qwen-code 0.22.2-preview.1 → 0.22.3

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 (437) hide show
  1. package/bundled/computer-use/SKILL.md +3 -3
  2. package/bundled/goal-draft/SKILL.md +109 -0
  3. package/bundled/qc-helper/docs/configuration/settings.md +37 -36
  4. package/bundled/qc-helper/docs/features/_meta.ts +1 -0
  5. package/bundled/qc-helper/docs/features/channels/dws.md +2 -0
  6. package/bundled/qc-helper/docs/features/channels/overview.md +34 -3
  7. package/bundled/qc-helper/docs/features/code-review.md +3 -3
  8. package/bundled/qc-helper/docs/features/commands.md +2 -1
  9. package/bundled/qc-helper/docs/features/computer-use.md +2 -2
  10. package/bundled/qc-helper/docs/features/goals.md +58 -0
  11. package/bundled/qc-helper/docs/features/headless.md +13 -11
  12. package/bundled/qc-helper/docs/features/status-line.md +3 -3
  13. package/bundled/qc-helper/docs/features/tool-use-summaries.md +1 -1
  14. package/bundled/qc-helper/docs/qwen-serve.md +1 -1
  15. package/bundled/review/SKILL.md +81 -31
  16. package/bundled/review/references/persistence.md +7 -3
  17. package/bundled/review/references/posting.md +10 -4
  18. package/chunks/MaxSizedBox-X42SXBJH.js +110 -0
  19. package/chunks/{StandaloneSessionPicker-5D2L22SF.js → StandaloneSessionPicker-2FJAOLGG.js} +81 -83
  20. package/chunks/{acpAgent-4DCKLA32.js → acpAgent-2ZMIJAFV.js} +1153 -357
  21. package/chunks/{agent-B4AFZL6H.js → agent-X5WX3L2I.js} +44 -46
  22. package/chunks/agent-headless-IZM25LJA.js +85 -0
  23. package/chunks/{anthropicContentGenerator-U76GTVB6.js → anthropicContentGenerator-YVTB6QX7.js} +46 -50
  24. package/chunks/{artifact-tool-XDJCZZCF.js → artifact-tool-XSMPHZBT.js} +11 -3
  25. package/chunks/{askUserQuestion-ZXXERLEV.js → askUserQuestion-4SWJY65V.js} +2 -2
  26. package/chunks/bridge-ME6QXZNA.js +119 -0
  27. package/chunks/{channel-management-service-HXXS3HOZ.js → channel-management-service-HQ6KDS7C.js} +6 -6
  28. package/chunks/channel-settings-store-PEOI7XCG.js +120 -0
  29. package/chunks/{channel-worker-group-EVDC2P4K.js → channel-worker-group-6NA6BBZV.js} +8 -7
  30. package/chunks/{channel-worker-manager-IJJZHGEI.js → channel-worker-manager-NEZ2J6RK.js} +10 -8
  31. package/chunks/{channel-worker-supervisor-YSKB5GVB.js → channel-worker-supervisor-FKU7DIHJ.js} +6 -5
  32. package/chunks/{chunk-7QGEJI7M.js → chunk-23RFD54N.js} +1 -1
  33. package/chunks/{chunk-JLU3FPQR.js → chunk-2HYKTO7V.js} +5 -5
  34. package/chunks/chunk-2LNNVAUV.js +1584 -0
  35. package/chunks/{chunk-FJAITR4L.js → chunk-2OBKDPZZ.js} +2 -2
  36. package/chunks/{chunk-JSY43GMI.js → chunk-2OUD5T67.js} +185 -174
  37. package/chunks/{chunk-LJP2BBMK.js → chunk-2SXSLSQE.js} +4 -4
  38. package/chunks/chunk-2TNL5KPM.js +49 -0
  39. package/chunks/{chunk-XMSMTU6H.js → chunk-2YOHKHYR.js} +4 -4
  40. package/chunks/{chunk-MCKJTBZN.js → chunk-36GSQ3MM.js} +2 -2
  41. package/chunks/chunk-36LGBEM6.js +130 -0
  42. package/chunks/{chunk-ZWKGZB2K.js → chunk-3JXM2CVW.js} +3 -3
  43. package/chunks/{chunk-X3XGCJ32.js → chunk-3SZC4VP4.js} +28 -111
  44. package/chunks/{chunk-ILPXSKGQ.js → chunk-3WK3QDNV.js} +2 -2
  45. package/chunks/{chunk-IKN3IUJP.js → chunk-3XKLXHGK.js} +17 -9
  46. package/chunks/{chunk-ZLTEQYNC.js → chunk-42IDLQWS.js} +26 -20
  47. package/chunks/chunk-4CMJKUND.js +95 -0
  48. package/chunks/{chunk-77TOMRBG.js → chunk-4K7KNVWH.js} +3 -3
  49. package/chunks/{chunk-SQPOJ4ZI.js → chunk-4NDLQAY2.js} +27 -270
  50. package/chunks/{chunk-V3GINY6K.js → chunk-4QHPPXK2.js} +16 -8
  51. package/chunks/{chunk-VBF4KZRQ.js → chunk-4TT3IVGA.js} +1 -1
  52. package/chunks/{chunk-IOGKXPL3.js → chunk-4VPCTGH6.js} +6 -6
  53. package/chunks/chunk-4VQBQLIZ.js +293 -0
  54. package/chunks/{chunk-UCSV2IZW.js → chunk-62GQFYID.js} +3 -3
  55. package/chunks/{chunk-SLEWBQWM.js → chunk-6DIGWMGT.js} +2 -2
  56. package/chunks/{chunk-BRVWYMKV.js → chunk-6MBXY6WM.js} +1 -1
  57. package/chunks/{chunk-PVBT5QPD.js → chunk-6PJOTWAN.js} +1 -1
  58. package/chunks/{chunk-WZ3QKPMQ.js → chunk-6X7EU5TI.js} +19 -31
  59. package/chunks/{chunk-KQYW2GB5.js → chunk-6ZPDLGHN.js} +6 -6
  60. package/chunks/{chunk-AKQA3WCH.js → chunk-734C6JGI.js} +723 -3399
  61. package/chunks/{chunk-F7M6ZFGU.js → chunk-73RM4POK.js} +8 -8
  62. package/chunks/{chunk-ELY4QVIB.js → chunk-7EQQR46F.js} +1 -1
  63. package/chunks/{chunk-KGJGEEVR.js → chunk-7FA2II6K.js} +10 -1
  64. package/chunks/chunk-7J6OTNGO.js +424 -0
  65. package/chunks/{chunk-LWLEPXKK.js → chunk-7LOELM2I.js} +19 -2
  66. package/chunks/{chunk-DIMEPKCW.js → chunk-7S226YTK.js} +1 -1
  67. package/chunks/{chunk-AWFZDYSD.js → chunk-7T52W4SW.js} +1 -1
  68. package/chunks/{chunk-3JKUX4PB.js → chunk-7VMIMAVB.js} +9 -9
  69. package/chunks/{chunk-2MHGD7EE.js → chunk-A3LWD5MK.js} +1 -1
  70. package/chunks/{chunk-E4I5MVBR.js → chunk-ABS25QER.js} +1 -1
  71. package/chunks/{chunk-TDQBVEPK.js → chunk-AIAOIFY4.js} +10 -8
  72. package/chunks/{chunk-NEZZHGEI.js → chunk-AYFA7MZV.js} +6 -6
  73. package/chunks/{chunk-FVDQ5E67.js → chunk-B466ZSHZ.js} +3 -3
  74. package/chunks/{chunk-6US7BF3G.js → chunk-B5PHIJGI.js} +183 -5
  75. package/chunks/{chunk-4TPAG3O7.js → chunk-BFPESSTR.js} +1 -1
  76. package/chunks/{chunk-WBT3STGU.js → chunk-BKWNKLZB.js} +20 -20
  77. package/chunks/{chunk-T45CL2NT.js → chunk-BOWFGCEU.js} +3 -3
  78. package/chunks/{chunk-IPQA4SR5.js → chunk-BWORX6FA.js} +1 -1
  79. package/chunks/{chunk-BKDAF7ES.js → chunk-BXDAPVQU.js} +2 -2
  80. package/chunks/{chunk-ZEADBZLO.js → chunk-C2X7KY45.js} +3 -3
  81. package/chunks/{chunk-PTQF7WRA.js → chunk-C3PEFRKD.js} +6 -6
  82. package/chunks/{chunk-7OBH4AM2.js → chunk-CAJTKR6W.js} +5 -5
  83. package/chunks/{chunk-2FN2HNTI.js → chunk-CFJY4DGX.js} +2 -2
  84. package/chunks/{chunk-SUE2ZMUH.js → chunk-CIZCL2MW.js} +49 -31
  85. package/chunks/{chunk-W2WRNJKX.js → chunk-CLWO3B77.js} +6 -6
  86. package/chunks/{chunk-U45D46O5.js → chunk-CMHFCLBU.js} +1 -1
  87. package/chunks/{chunk-LRKMQPMD.js → chunk-CQH5KTKC.js} +1 -1
  88. package/chunks/{chunk-JECO75XD.js → chunk-D5LUXLUH.js} +2 -2
  89. package/chunks/chunk-DJBQCO2E.js +842 -0
  90. package/chunks/{chunk-BQBUZDDH.js → chunk-DJECZIJX.js} +42 -42
  91. package/chunks/{chunk-GTUZ3R6I.js → chunk-DJEZ55D4.js} +351 -113
  92. package/chunks/{chunk-HPECDZ6X.js → chunk-DJPASAUV.js} +3866 -1077
  93. package/chunks/{chunk-VYWCFWI5.js → chunk-DMLVSW7L.js} +542 -654
  94. package/chunks/{chunk-EB4VDXNI.js → chunk-DYXFD5RO.js} +182 -3
  95. package/chunks/{chunk-ZKAZP2ZG.js → chunk-EB6QRGHM.js} +3 -3
  96. package/chunks/{chunk-UWICO5KN.js → chunk-EFWRMA2I.js} +3 -3
  97. package/chunks/{chunk-3UZCLCXR.js → chunk-EKSCLBBF.js} +3 -3
  98. package/chunks/{chunk-ALTQLFEG.js → chunk-EQSBPBZ3.js} +5 -194
  99. package/chunks/{chunk-624NHDGB.js → chunk-ERFDKH32.js} +11 -0
  100. package/chunks/{chunk-4K44OMLI.js → chunk-FROAFEFB.js} +3 -3
  101. package/chunks/{chunk-MZS7GEC7.js → chunk-FTF2YIZ5.js} +1 -1
  102. package/chunks/{chunk-Z7VOMGDC.js → chunk-FTJMWDND.js} +0 -24
  103. package/chunks/{chunk-ZJG323IA.js → chunk-G6FECKTJ.js} +7 -5
  104. package/chunks/{chunk-TMGAS5TO.js → chunk-GBJBJ4HX.js} +26 -4
  105. package/chunks/{chunk-UCQOSV6A.js → chunk-GPGU4S2N.js} +3 -3
  106. package/chunks/{chunk-BHTJAO36.js → chunk-GVIVASYK.js} +7 -7
  107. package/chunks/chunk-H72BQNM3.js +645 -0
  108. package/chunks/{chunk-Z4X5MTRT.js → chunk-HCOBAG2L.js} +2 -4
  109. package/chunks/{chunk-FCSWZAS3.js → chunk-HP5LR5HL.js} +5 -5
  110. package/chunks/{chunk-7JPW6IYH.js → chunk-HVC3PNVC.js} +1 -1
  111. package/chunks/{chunk-OI2DR6QB.js → chunk-I6LYRJPB.js} +3 -3
  112. package/chunks/{chunk-E55H6BZ7.js → chunk-ICURCKIU.js} +1335 -119
  113. package/chunks/{chunk-PAJGKZAA.js → chunk-ISKH4QX3.js} +14 -12
  114. package/chunks/{chunk-AYVIGUUK.js → chunk-JB4JIVTJ.js} +1 -1
  115. package/chunks/{chunk-FN5C6C7G.js → chunk-JHYH6PYQ.js} +192 -478
  116. package/chunks/{chunk-T6OODF2U.js → chunk-JWALNCLT.js} +1 -1
  117. package/chunks/{chunk-SKNVVYIJ.js → chunk-K5KXUXWC.js} +3 -3
  118. package/chunks/{chunk-XUX6O2ZT.js → chunk-KID24ZFN.js} +4 -1
  119. package/chunks/{chunk-I6DY753S.js → chunk-KJO2LBUK.js} +944 -18
  120. package/chunks/{chunk-5T4LWWNX.js → chunk-KYWTPLBJ.js} +18 -21
  121. package/chunks/{chunk-CZFQ62RM.js → chunk-LHBUKJG2.js} +4 -4
  122. package/chunks/{chunk-TOF4UZHH.js → chunk-LUEHOUHM.js} +3 -3
  123. package/chunks/{chunk-2YDYDDE2.js → chunk-M3QRM3DE.js} +3 -3
  124. package/chunks/{chunk-GNMJNDZE.js → chunk-M6FOJXW3.js} +1 -1
  125. package/chunks/{chunk-ZGWDHSUM.js → chunk-MF7HCQWZ.js} +4 -4
  126. package/chunks/{chunk-66GIFJ63.js → chunk-MK2GIB46.js} +1 -1
  127. package/chunks/{chunk-TFV4RXPU.js → chunk-MO3FC2WT.js} +1 -1
  128. package/chunks/{chunk-TR7G7XFQ.js → chunk-MPNBVAEU.js} +5 -5
  129. package/chunks/{chunk-K3LPAED5.js → chunk-MQM5PJML.js} +24 -4
  130. package/chunks/{chunk-3WBMPR3S.js → chunk-MSBO7X2W.js} +1 -1
  131. package/chunks/{chunk-5PA6UEYA.js → chunk-MZCJWS5Y.js} +1 -1
  132. package/chunks/{chunk-BGXZBI5B.js → chunk-N4X7G4J2.js} +2 -1
  133. package/chunks/{chunk-27ONXAFY.js → chunk-NIFYWDYN.js} +1 -1
  134. package/chunks/{chunk-AP7WZONS.js → chunk-NMOD2FXQ.js} +19 -9
  135. package/chunks/{chunk-IJVDHPKD.js → chunk-NU7RKEZR.js} +2 -2
  136. package/chunks/{chunk-5URK47RN.js → chunk-NV55WWD6.js} +11595 -10375
  137. package/chunks/{chunk-HABT2Z7R.js → chunk-OU5APVWO.js} +4 -4
  138. package/chunks/{chunk-QR4AHMGQ.js → chunk-P2G476QN.js} +13 -13
  139. package/chunks/{chunk-5SM2AK65.js → chunk-PADPMMYM.js} +5 -5
  140. package/chunks/{chunk-RRKNX553.js → chunk-PDQGMSZK.js} +1 -1
  141. package/chunks/{chunk-GTUKW3I6.js → chunk-PPKZ7JOE.js} +1 -1
  142. package/chunks/{chunk-SAH4BD2J.js → chunk-PQEISIKS.js} +67 -0
  143. package/chunks/{chunk-XIRDDFRS.js → chunk-PZ66FRIC.js} +2644 -2296
  144. package/chunks/{chunk-H3HZ4AWW.js → chunk-Q2MSPKIJ.js} +1 -1
  145. package/chunks/{chunk-WEGXPP5E.js → chunk-QFCDF5PL.js} +1 -1
  146. package/chunks/{chunk-OF2DPXUS.js → chunk-QYMAKPY5.js} +119 -24
  147. package/chunks/{chunk-JVPFTDBK.js → chunk-RFIDDFAL.js} +1 -1
  148. package/chunks/chunk-RKFGE7JH.js +93 -0
  149. package/chunks/{chunk-CPPYZHBN.js → chunk-RU7BK6B3.js} +1 -1
  150. package/chunks/chunk-SEONHUS3.js +275 -0
  151. package/chunks/{chunk-DEYPMJPD.js → chunk-SMPR7SPO.js} +1 -1
  152. package/chunks/chunk-SS4MRMKE.js +3525 -0
  153. package/chunks/{chunk-BPMVPWBT.js → chunk-SS5SDCD3.js} +6 -6
  154. package/chunks/{chunk-J3CBIEDS.js → chunk-ST5MDGH3.js} +32 -15
  155. package/chunks/{chunk-J5352S3S.js → chunk-ST5V3ZOC.js} +3 -3
  156. package/chunks/{chunk-7CWEZQ6T.js → chunk-STUJ7IMZ.js} +0 -77
  157. package/chunks/{chunk-4K7NQDCG.js → chunk-T4EFG2P5.js} +18 -9
  158. package/chunks/{chunk-TWSKM647.js → chunk-T7KMERIX.js} +1 -1
  159. package/chunks/{chunk-5CMWFBML.js → chunk-TEBDFQBZ.js} +1 -1
  160. package/chunks/{chunk-EC5BONC3.js → chunk-TPI7O7HR.js} +1 -1
  161. package/chunks/{chunk-T2CRBIDJ.js → chunk-TTX2JUE6.js} +1 -1
  162. package/chunks/{chunk-VOEMVOM4.js → chunk-TVC6HQ2U.js} +2 -2
  163. package/chunks/{chunk-WXDZZFH3.js → chunk-TZBSGJ6C.js} +6 -6
  164. package/chunks/chunk-U54AYGEC.js +337 -0
  165. package/chunks/{chunk-2NNTE2ED.js → chunk-UHQFIS7N.js} +15 -0
  166. package/chunks/{chunk-76WGY6LW.js → chunk-URE3QBBB.js} +3 -3
  167. package/chunks/{chunk-KOJ6MHD5.js → chunk-UTLCH2FK.js} +1 -1
  168. package/chunks/{chunk-7DPKPBOQ.js → chunk-V2NDP3I4.js} +2 -2
  169. package/chunks/{chunk-FJWICLG7.js → chunk-V4264FEG.js} +9 -9
  170. package/chunks/{chunk-XR7OIAQF.js → chunk-V5J4J5TP.js} +2 -2
  171. package/chunks/{chunk-7UJTY5V3.js → chunk-V7EESTJV.js} +1 -1
  172. package/chunks/{chunk-Z6L3C4VF.js → chunk-VBCPNIQD.js} +39 -39
  173. package/chunks/{chunk-ATLGYSYH.js → chunk-VGIFXISB.js} +4 -4
  174. package/chunks/{chunk-X2UOOG5V.js → chunk-VQUGEVGR.js} +1 -1
  175. package/chunks/{chunk-XJS54K4A.js → chunk-VTHREBQM.js} +2 -2
  176. package/chunks/{chunk-AA7VBRBG.js → chunk-W3JH33JE.js} +8 -8
  177. package/chunks/{chunk-FPH6TXD3.js → chunk-WAOIHTJS.js} +1 -1
  178. package/chunks/{chunk-CDUN63IN.js → chunk-WGY3AVGM.js} +3 -3
  179. package/chunks/{chunk-JLGFGPZJ.js → chunk-WNPDGUJO.js} +22 -3
  180. package/chunks/{chunk-O3BUXIPM.js → chunk-WXEA74YB.js} +3 -3
  181. package/chunks/{chunk-YRLW2MSX.js → chunk-XBVNNDPK.js} +11 -4
  182. package/chunks/{chunk-VL4YX3FH.js → chunk-XF63PKEN.js} +1 -1
  183. package/chunks/{chunk-R7G7GKOX.js → chunk-XHF7WQ6B.js} +3 -3
  184. package/chunks/{chunk-3FSBMAYD.js → chunk-XQFT3QUF.js} +1 -1
  185. package/chunks/{chunk-3D6PDLNJ.js → chunk-XSG6G3G6.js} +49 -32
  186. package/chunks/{chunk-5JCZ3UKB.js → chunk-Y5S7LBOZ.js} +44 -7
  187. package/chunks/{chunk-OLS3MAXQ.js → chunk-YLSQLSH7.js} +15 -9
  188. package/chunks/{chunk-2SERYG4T.js → chunk-YTDVNSUQ.js} +1 -1
  189. package/chunks/{chunk-KPF2K55D.js → chunk-ZEYFMJQA.js} +39 -8
  190. package/chunks/{chunk-OT4YKUUV.js → chunk-ZU4UDIWX.js} +2 -2
  191. package/chunks/chunk-ZWJDJ6RU.js +2597 -0
  192. package/chunks/{chunk-R3T33BG5.js → chunk-ZYMLPEZQ.js} +3 -3
  193. package/chunks/{chunk-DID6IRGC.js → chunk-ZZMSC3RG.js} +56 -39
  194. package/chunks/{chunk-L436XFLJ.js → chunk-ZZUKP7HV.js} +1 -1
  195. package/chunks/config-utils-R6M3TA34.js +113 -0
  196. package/chunks/contextCommand-ZCAP23J6.js +106 -0
  197. package/chunks/{core-runtime-CEJRHCRF.js → core-runtime-AXB6SK5D.js} +59 -61
  198. package/chunks/{create-sub-session-RVHSWVAP.js → create-sub-session-23ITIELI.js} +3 -3
  199. package/chunks/{create-sub-session-DFZVIG56.js → create-sub-session-4QNE64MR.js} +164 -85
  200. package/chunks/{cron-create-IJGVR5R2.js → cron-create-KJ4IY6PP.js} +57 -10
  201. package/chunks/{cron-delete-4N5BI6GL.js → cron-delete-MBLQCAYY.js} +4 -4
  202. package/chunks/{cron-list-2CATIPUX.js → cron-list-DWH2PQ47.js} +4 -4
  203. package/chunks/{daemon-NAYK4XXU.js → daemon-3GNHB3M2.js} +523 -8
  204. package/chunks/{daemon-git-worktree-guard-L6ZUFKF7.js → daemon-git-worktree-guard-IVAJJWYK.js} +56 -58
  205. package/chunks/daemon-status-provider-K3SJ5C2U.js +117 -0
  206. package/chunks/daemon-trust-policy-DOR3YG62.js +112 -0
  207. package/chunks/{daemon-trust-policy-monitor-2G3EKQEU.js → daemon-trust-policy-monitor-KGGROSIV.js} +64 -66
  208. package/chunks/deferred-core-runtime-WOYLUQQ7.js +114 -0
  209. package/chunks/{display-image-6KHQNEAE.js → display-image-BE7I6ZB6.js} +5 -5
  210. package/chunks/{dist-DJBNNPLN.js → dist-4WXLCBDR.js} +1 -1
  211. package/chunks/{dist-TJUDJTCB.js → dist-5VXFRTWU.js} +280 -48
  212. package/chunks/{dist-6H6RZ5H6.js → dist-6BPYWHVD.js} +89 -65
  213. package/chunks/{dist-ZBVOXSKF.js → dist-GFN5DCBX.js} +74 -65
  214. package/chunks/{dist-SATKXKUR.js → dist-HZNT6GQS.js} +1 -1
  215. package/chunks/{dist-FVJZSIO4.js → dist-LVZCXVPF.js} +72 -20
  216. package/chunks/{dist-7CKN54NL.js → dist-N6W6E753.js} +71 -64
  217. package/chunks/{dist-4Q7NTUNB.js → dist-NSV4NBPK.js} +31 -14
  218. package/chunks/{dist-UQUFZDIY.js → dist-SWQMYP2Q.js} +18 -16
  219. package/chunks/earlyInputCapture-OHBEVO4K.js +107 -0
  220. package/chunks/{edit-ZERGX3RV.js → edit-LEQLAGPZ.js} +45 -47
  221. package/chunks/{en-6MDBWMTG.js → en-YLXBXM4Z.js} +2 -1
  222. package/chunks/{enter-worktree-UOZ6ZTP7.js → enter-worktree-35QCAAFP.js} +7 -7
  223. package/chunks/{enterPlanMode-W2RP3P5B.js → enterPlanMode-ONQN3WHE.js} +47 -49
  224. package/chunks/{environment-ZBJ23YVR.js → environment-UANTR7A4.js} +60 -62
  225. package/chunks/errors-WAK6KFBC.js +113 -0
  226. package/chunks/{exit-worktree-G2QATUCV.js → exit-worktree-XQD6D543.js} +7 -7
  227. package/chunks/exitPlanMode-UEYBG6P5.js +83 -0
  228. package/chunks/{fast-path-4MWBCEUF.js → fast-path-WUL7UZ6H.js} +7 -7
  229. package/chunks/{fast-path-settings-XMFBYFUH.js → fast-path-settings-XH426LUU.js} +3 -3
  230. package/chunks/{glob-DKTNG32L.js → glob-Y54QUWDY.js} +44 -46
  231. package/chunks/{goal-tools-CNVXMSZD.js → goal-tools-PTD3MBA7.js} +10 -8
  232. package/chunks/{grep-3NLSS32D.js → grep-5GPICQBU.js} +6 -6
  233. package/chunks/handleAutoUpdate-FP3NWNSG.js +109 -0
  234. package/chunks/i18n-INIU5X7A.js +124 -0
  235. package/chunks/{image-gen-63NN2H5N.js → image-gen-J6FDGUZP.js} +8 -10
  236. package/chunks/initializer-TYODV6GE.js +113 -0
  237. package/chunks/installationInfo-AAPKYDSZ.js +107 -0
  238. package/chunks/{keychain-token-storage-3MGFRYGM.js → keychain-token-storage-37XPR34V.js} +2 -2
  239. package/chunks/list-TUODDN6J.js +116 -0
  240. package/chunks/{list-agents-EXRSHIDJ.js → list-agents-DI3YFTDT.js} +2 -2
  241. package/chunks/{gemini-X5GQHQYF.js → llm-NSAVK5V3.js} +117 -114
  242. package/chunks/{geminiContentGenerator-UDSWXZXL.js → llm-content-generator-AY2QKXHE.js} +29 -29
  243. package/chunks/loadedSettingsAdapter-KJCLZ3C4.js +110 -0
  244. package/chunks/{loggingContentGenerator-73C7TKDK.js → loggingContentGenerator-DSFQHXIF.js} +328 -37
  245. package/chunks/{loop-wakeup-XBPB2BRO.js → loop-wakeup-XJFONSQ7.js} +5 -5
  246. package/chunks/{ls-WFONAND2.js → ls-3VAT2J7A.js} +4 -4
  247. package/chunks/{lsp-DUKPDUXN.js → lsp-5W7IRUBH.js} +2 -2
  248. package/chunks/{managed-npm-update-H2KOLQZU.js → managed-npm-update-TSWENTK5.js} +57 -59
  249. package/chunks/mcp-MWSAPFOL.js +110 -0
  250. package/chunks/{monitor-TGCMNJJH.js → monitor-RW4GWJHB.js} +44 -46
  251. package/chunks/nonInteractiveCli-JXKL343Q.js +185 -0
  252. package/chunks/{notebook-edit-YEUNZYDX.js → notebook-edit-CQNYS5OR.js} +45 -47
  253. package/chunks/{open-with-auth-4UI3KHUR.js → open-with-auth-YN3QZHVM.js} +1 -1
  254. package/chunks/{openaiContentGenerator-J7LD4VSL.js → openaiContentGenerator-J6QIF7EX.js} +26 -28
  255. package/chunks/pidfile-QOIQZFT2.js +111 -0
  256. package/chunks/process-registry-OAEG6WGC.js +662 -0
  257. package/chunks/{processUtils-ZHFC7CSL.js → processUtils-GPHNANKZ.js} +2 -2
  258. package/chunks/prompt-terminal-ledger-FOMFTYOM.js +105 -0
  259. package/chunks/{qwenContentGenerator-YEWWK3JQ.js → qwenContentGenerator-WWDXPYQI.js} +49 -51
  260. package/chunks/{qwenOAuth2-JIYAWXTW.js → qwenOAuth2-OF5WRBQT.js} +7 -9
  261. package/chunks/{read-file-ZQI3WPVK.js → read-file-FQUQHC6N.js} +13 -13
  262. package/chunks/{read-mcp-resource-7A7NFSFL.js → read-mcp-resource-XD257PGJ.js} +2 -2
  263. package/chunks/{record-artifact-CPJ4IJSD.js → record-artifact-VW23GS4F.js} +4 -4
  264. package/chunks/{report-findings-VFM5DENC.js → report-findings-AO5VYFLR.js} +9 -5
  265. package/chunks/{request-shutdown-6IW46GD7.js → request-shutdown-BCLA3JV2.js} +7 -7
  266. package/chunks/resumeHistoryUtils-NSGF3UCB.js +118 -0
  267. package/chunks/ripGrep-4CAT6SKV.js +39 -0
  268. package/chunks/{run-qwen-serve-WHWU7NZ6.js → run-qwen-serve-5X6IDZER.js} +371 -357
  269. package/chunks/{runtime-E7BSPWQP.js → runtime-HK27GMPF.js} +69 -71
  270. package/chunks/scheduled-tasks-MN2ZZ5P6.js +127 -0
  271. package/chunks/{scheduler-TJPATFOM.js → scheduler-WD4MHMO5.js} +58 -60
  272. package/chunks/{sdk-exporters-http-XXSKBD2C.js → sdk-exporters-http-TTU2CHBU.js} +2 -2
  273. package/chunks/{sdk-impl-VPNBLV7I.js → sdk-impl-UUMVYMAL.js} +11 -5
  274. package/chunks/{send-message-OXZK6USO.js → send-message-AJ4OCUBV.js} +25 -9
  275. package/chunks/serve-2XCHPPGG.js +118 -0
  276. package/chunks/{server-AXCN7QBJ.js → server-GO2N5DH7.js} +6080 -4964
  277. package/chunks/{session-HO4US3AG.js → session-IFNHTUBT.js} +112 -112
  278. package/chunks/session-pr-refresh-I3UBWMVP.js +364 -0
  279. package/chunks/{settings-B2PFJJN4.js → settings-L6N54CU6.js} +63 -65
  280. package/chunks/{shell-7XMSANI3.js → shell-4Y5LLW6N.js} +44 -46
  281. package/chunks/{skill-NL3VH562.js → skill-YOWTRAKQ.js} +68 -24
  282. package/chunks/skill-settings-ZL4JY5UE.js +118 -0
  283. package/chunks/spawnChannel-ZST6XJVJ.js +112 -0
  284. package/chunks/standalone-update-THVU3OKY.js +118 -0
  285. package/chunks/{startInteractiveUI-G2XKSCQ7.js → startInteractiveUI-XDFSHBZD.js} +3076 -2475
  286. package/chunks/{stdioHelpers-7A2EE64Z.js → stdioHelpers-AY6XCDY2.js} +3 -1
  287. package/chunks/{syntheticOutput-5AJ444QT.js → syntheticOutput-ML43GEFN.js} +3 -3
  288. package/chunks/{task-create-TY7P6UHG.js → task-create-QN4LYRSE.js} +11 -11
  289. package/chunks/{task-list-BELMPA75.js → task-list-JPLGK45U.js} +5 -5
  290. package/chunks/{task-stop-U3S3KZG2.js → task-stop-CXEH5L2D.js} +2 -2
  291. package/chunks/{task-update-O4IGDPCK.js → task-update-IWEOJFV2.js} +11 -11
  292. package/chunks/{team-create-IYBUOORE.js → team-create-OOPXCDBA.js} +44 -46
  293. package/chunks/{team-delete-YWFXX77L.js → team-delete-RZVVSGCY.js} +5 -5
  294. package/chunks/{team-plan-approval-YKU57LBM.js → team-plan-approval-DSX5EWAT.js} +44 -46
  295. package/chunks/terminal-image-renderer-KS25G33E.js +114 -0
  296. package/chunks/theme-manager-YMZNG45F.js +102 -0
  297. package/chunks/{todoWrite-435EO2CS.js → todoWrite-WDJNQEMW.js} +43 -25
  298. package/chunks/{tool-search-4Q3KASIQ.js → tool-search-J5Q6U7DN.js} +22 -22
  299. package/chunks/total-session-admission-PVN64JVV.js +114 -0
  300. package/chunks/trustedFolders-FATSC4YI.js +122 -0
  301. package/chunks/{types-WYCFCEHR.js → types-HKLPXZB3.js} +1 -3
  302. package/chunks/{update-relaunch-4DC2KKFS.js → update-relaunch-SIKHLHVR.js} +6 -6
  303. package/chunks/updateCheck-D3YG2WCD.js +118 -0
  304. package/chunks/useAutoAcceptIndicator-ILINOSAS.js +120 -0
  305. package/chunks/{validateNonInterActiveAuth-YAE4YPO3.js → validateNonInterActiveAuth-JUDQP6V4.js} +105 -105
  306. package/chunks/{version-QFP7OGWX.js → version-C63GDDWN.js} +1 -1
  307. package/chunks/{web-fetch-6T23IK6Q.js → web-fetch-FOQZMNSC.js} +16 -18
  308. package/chunks/{web-search-WBWTCZK2.js → web-search-PUJTBFUC.js} +9 -11
  309. package/chunks/{web-shell-static-A6QMUNNV.js → web-shell-static-HNB4FDOE.js} +2 -2
  310. package/chunks/{workflow-FMAA3D4R.js → workflow-Y5IPINVH.js} +128 -94
  311. package/chunks/workspace-providers-status-IJ4VHFMB.js +114 -0
  312. package/chunks/{workspace-registration-store-CMMX7EPX.js → workspace-registration-store-SMJWI2AI.js} +1 -1
  313. package/chunks/workspace-registry-BTGZIMPK.js +123 -0
  314. package/chunks/workspace-service-SIN67ITC.js +126 -0
  315. package/chunks/workspace-skills-status-F3RKCUIX.js +113 -0
  316. package/chunks/{workspace-trust-reconciler-PJDQUTJL.js → workspace-trust-reconciler-PLIDLJZX.js} +72 -72
  317. package/chunks/write-file-PAIGB33C.js +88 -0
  318. package/chunks/{zh-TW-MV4FWFB6.js → zh-TW-RPTMRTHG.js} +2 -1
  319. package/chunks/{zh-X3WGU6SI.js → zh-UNY63FR3.js} +2 -1
  320. package/chunks/{zoom-image-WVYVFRXF.js → zoom-image-LYQD7BQA.js} +13 -13
  321. package/cli.js +16 -16
  322. package/locales/en.js +2 -0
  323. package/locales/zh-TW.js +2 -0
  324. package/locales/zh.js +2 -0
  325. package/package.json +3 -3
  326. package/web-shell/assets/{abnfDiagram-VCTEODGH-d-8xa8uz.js → abnfDiagram-VCTEODGH-TRCMSA_6.js} +1 -1
  327. package/web-shell/assets/{arc-BhB7CrGK.js → arc-D9Uls5b3.js} +1 -1
  328. package/web-shell/assets/{architectureDiagram-5GKGNRK7-BDCd_IcJ.js → architectureDiagram-5GKGNRK7-Bwb8jPXg.js} +1 -1
  329. package/web-shell/assets/{blockDiagram-NRAW4CY4-C-AHu6mi.js → blockDiagram-NRAW4CY4-DHj71TSX.js} +1 -1
  330. package/web-shell/assets/{c4Diagram-UCG6FXSJ-CFjQt0vl.js → c4Diagram-UCG6FXSJ-uKBBdbyr.js} +1 -1
  331. package/web-shell/assets/channel-CXjVLaBa.js +1 -0
  332. package/web-shell/assets/{chunk-2Q5K7J3B-DRjwqaDq.js → chunk-2Q5K7J3B-BZd0Phrl.js} +1 -1
  333. package/web-shell/assets/{chunk-5VM5RSS4-eHM9noJE.js → chunk-5VM5RSS4-7KNeNBqN.js} +1 -1
  334. package/web-shell/assets/{chunk-F27PBJKO-CcSWUYn1.js → chunk-F27PBJKO-BeboS7Fi.js} +1 -1
  335. package/web-shell/assets/{chunk-G27WJ6UU-DNr-RF5S.js → chunk-G27WJ6UU-RV3JONoj.js} +1 -1
  336. package/web-shell/assets/{chunk-JWPE2WC7-rVJHoNF8.js → chunk-JWPE2WC7-Yw9FCFsP.js} +1 -1
  337. package/web-shell/assets/{chunk-LCL6LL3I-B2aX0Gzy.js → chunk-LCL6LL3I-GIMnydDe.js} +1 -1
  338. package/web-shell/assets/{chunk-POPQ4Y6H-DVp07n32.js → chunk-POPQ4Y6H-Cfrux7bL.js} +1 -1
  339. package/web-shell/assets/{chunk-SVP7TREG-C6QB_KUr.js → chunk-SVP7TREG-BlvIN0CO.js} +1 -1
  340. package/web-shell/assets/{chunk-XXDRQBXY-CLVxDNCy.js → chunk-XXDRQBXY-DMs7Rr4t.js} +1 -1
  341. package/web-shell/assets/classDiagram-DTDB5LWJ-DANEijO3.js +1 -0
  342. package/web-shell/assets/classDiagram-v2-JRS7N3AN-DANEijO3.js +1 -0
  343. package/web-shell/assets/{cose-bilkent-JH36ORCC-B_aKX3A3.js → cose-bilkent-JH36ORCC-DNGqTNwI.js} +1 -1
  344. package/web-shell/assets/{cynefin-OW5HDTMX-BBw2pPUa.js → cynefin-OW5HDTMX-CojMpaoH.js} +1 -1
  345. package/web-shell/assets/{cynefinDiagram-5FMLGOSQ-WWPiBTwk.js → cynefinDiagram-5FMLGOSQ-DF07YXGo.js} +1 -1
  346. package/web-shell/assets/{dagre-3AP2YEHR-CPtIdka-.js → dagre-3AP2YEHR-17-4WtCH.js} +1 -1
  347. package/web-shell/assets/{diagram-S7CK7UJ4-Dj5og1Xi.js → diagram-S7CK7UJ4-G3Wuyz9m.js} +1 -1
  348. package/web-shell/assets/{diagram-UQ7AKVKN-CC_x70YC.js → diagram-UQ7AKVKN-nyWIKZ8P.js} +1 -1
  349. package/web-shell/assets/{diagram-VSXAHHWV-rXMfsO4n.js → diagram-VSXAHHWV-tKHhmYSC.js} +1 -1
  350. package/web-shell/assets/{diagram-VX7I27RA-DEmLYQbh.js → diagram-VX7I27RA-CpDf1hYk.js} +1 -1
  351. package/web-shell/assets/{diagram-Z3DM3KII-B0ys6Vxx.js → diagram-Z3DM3KII-Cah2IFXG.js} +1 -1
  352. package/web-shell/assets/{ebnfDiagram-PWID7BFC-Bq6y6lKH.js → ebnfDiagram-PWID7BFC-DNaCkgxy.js} +1 -1
  353. package/web-shell/assets/{erDiagram-SSCWMZ5O-l69JeBZ4.js → erDiagram-SSCWMZ5O-CAdRgcf1.js} +1 -1
  354. package/web-shell/assets/{flowDiagram-A5DVABFB-Cm-EzGY4.js → flowDiagram-A5DVABFB-CMUJAShL.js} +1 -1
  355. package/web-shell/assets/{ganttDiagram-EL5Y4UJY-BRS9ZOp7.js → ganttDiagram-EL5Y4UJY-o-_MUNey.js} +1 -1
  356. package/web-shell/assets/{gitGraphDiagram-WWUBYQGX-DAMRKgLk.js → gitGraphDiagram-WWUBYQGX-_aG-2Z7O.js} +1 -1
  357. package/web-shell/assets/{index-Bncx8E8M.js → index-BK_NKxiJ.js} +1 -1
  358. package/web-shell/assets/index-Ci-z4zWY.js +1913 -0
  359. package/web-shell/assets/index-LDlXZRHA.css +36 -0
  360. package/web-shell/assets/{infoDiagram-RXCK75RN-DasffaZp.js → infoDiagram-RXCK75RN-qJPeZbGP.js} +1 -1
  361. package/web-shell/assets/{ishikawaDiagram-5VMMS53U-CmRUt3C-.js → ishikawaDiagram-5VMMS53U-7Om4vNo1.js} +1 -1
  362. package/web-shell/assets/{journeyDiagram-EYS64GPL-DzhE_c1Z.js → journeyDiagram-EYS64GPL-BNtXqmBW.js} +1 -1
  363. package/web-shell/assets/{kanban-definition-3QL26DDD-BH5b6nn3.js → kanban-definition-3QL26DDD-COgFec8P.js} +1 -1
  364. package/web-shell/assets/{layout-BxoLK-LY.js → layout-B9n81PC9.js} +1 -1
  365. package/web-shell/assets/{linear-CqDPvVI7.js → linear-Bb6nXZQq.js} +1 -1
  366. package/web-shell/assets/{mermaid.core-DBoN4plo.js → mermaid.core-Cgrm3JVT.js} +6 -6
  367. package/web-shell/assets/{mindmap-definition-FBJOCRG2-DJJtXPEM.js → mindmap-definition-FBJOCRG2-TKwLTjnG.js} +1 -1
  368. package/web-shell/assets/{pegDiagram-XKGWAZYB-DmgPXP5l.js → pegDiagram-XKGWAZYB-BJPuvlpi.js} +1 -1
  369. package/web-shell/assets/{pieDiagram-E7YTZNPT-1ezjzcI5.js → pieDiagram-E7YTZNPT-D01VkNsW.js} +1 -1
  370. package/web-shell/assets/{quadrantDiagram-AXDQQJYC-ChKARz3k.js → quadrantDiagram-AXDQQJYC-C4hHsiv-.js} +1 -1
  371. package/web-shell/assets/{railroadDiagram-O6MQD6OU-k7mNB_QT.js → railroadDiagram-O6MQD6OU-CuEO4xK2.js} +1 -1
  372. package/web-shell/assets/{requirementDiagram-EFPCY7ZU-B0XFsii0.js → requirementDiagram-EFPCY7ZU-D5J_vIo5.js} +1 -1
  373. package/web-shell/assets/{sankeyDiagram-P5KCCOFB-repJ2Ukk.js → sankeyDiagram-P5KCCOFB-DQKY223V.js} +1 -1
  374. package/web-shell/assets/{sequenceDiagram-WJ2MYXX4-D0gUSKGu.js → sequenceDiagram-WJ2MYXX4-D27YV_cm.js} +1 -1
  375. package/web-shell/assets/{sizeCapture-X5ZJPWSS-CE463F74.js → sizeCapture-X5ZJPWSS-TJg8UcwV.js} +1 -1
  376. package/web-shell/assets/{stateDiagram-HBIQ2CUA-003zYtJa.js → stateDiagram-HBIQ2CUA-CmnPzUIx.js} +1 -1
  377. package/web-shell/assets/stateDiagram-v2-4QOOHH4V-DNKPyrDc.js +1 -0
  378. package/web-shell/assets/{swimlanes-XN3QIQJK-DBj8MFpu.js → swimlanes-XN3QIQJK-ByeP3_Nu.js} +1 -1
  379. package/web-shell/assets/swimlanesDiagram-VK2B7HYN-ZL1HPC6w.js +8 -0
  380. package/web-shell/assets/{timeline-definition-24CTP7MA-D2aCh4a9.js → timeline-definition-24CTP7MA-BsFA5juR.js} +1 -1
  381. package/web-shell/assets/{vennDiagram-4TSXK5OY-BHMfWBpl.js → vennDiagram-4TSXK5OY-DREP2ECo.js} +1 -1
  382. package/web-shell/assets/{wardleyDiagram-VM6X3IG4-RdHAj66j.js → wardleyDiagram-VM6X3IG4-iyd9lKi2.js} +1 -1
  383. package/web-shell/assets/{xychartDiagram-S5SC5T6Z-BgJWOvq0.js → xychartDiagram-S5SC5T6Z-CVr1_j9q.js} +1 -1
  384. package/web-shell/index.html +3 -3
  385. package/chunks/MaxSizedBox-BFVLZP2E.js +0 -112
  386. package/chunks/agent-headless-UCBCS4V4.js +0 -87
  387. package/chunks/bridge-FRNYLYY7.js +0 -119
  388. package/chunks/channel-settings-store-IV4KDL7N.js +0 -117
  389. package/chunks/chunk-I6VVOZDK.js +0 -202
  390. package/chunks/chunk-JS73NNWF.js +0 -30
  391. package/chunks/chunk-K2OJUPOE.js +0 -78
  392. package/chunks/chunk-P3QQPMQA.js +0 -19
  393. package/chunks/chunk-SDVF6A42.js +0 -945
  394. package/chunks/chunk-VGHZT6JR.js +0 -51
  395. package/chunks/config-utils-PMX4QZ5Y.js +0 -113
  396. package/chunks/contextCommand-NZRLVAFC.js +0 -108
  397. package/chunks/daemon-status-provider-FTTYZEKN.js +0 -118
  398. package/chunks/daemon-trust-policy-WMGFPA3Z.js +0 -114
  399. package/chunks/deferred-core-runtime-BUFEFYNA.js +0 -116
  400. package/chunks/earlyInputCapture-ROPLMXA7.js +0 -109
  401. package/chunks/errors-U5KNAADB.js +0 -115
  402. package/chunks/exitPlanMode-VFJ5R5DD.js +0 -85
  403. package/chunks/handleAutoUpdate-W4BUYFT7.js +0 -111
  404. package/chunks/i18n-KX7FEKJJ.js +0 -126
  405. package/chunks/initializer-SNVVLS7Y.js +0 -115
  406. package/chunks/installationInfo-D4XGQNHJ.js +0 -109
  407. package/chunks/list-WYECMLXZ.js +0 -118
  408. package/chunks/loadedSettingsAdapter-5WZBXBCR.js +0 -112
  409. package/chunks/mcp-CBWAROY3.js +0 -112
  410. package/chunks/nonInteractiveCli-O232UUV7.js +0 -185
  411. package/chunks/pidfile-MSPQ255Y.js +0 -113
  412. package/chunks/process-registry-PMJOA5CO.js +0 -172
  413. package/chunks/prompt-terminal-ledger-YPGMNDXT.js +0 -107
  414. package/chunks/resumeHistoryUtils-35D4KAVT.js +0 -120
  415. package/chunks/ripGrep-46N4FLOS.js +0 -39
  416. package/chunks/serve-WQ54UIYG.js +0 -120
  417. package/chunks/skill-settings-SKMN5YXC.js +0 -120
  418. package/chunks/spawnChannel-NE43EEO3.js +0 -113
  419. package/chunks/standalone-update-XOCWGXAH.js +0 -120
  420. package/chunks/terminal-image-renderer-NREKYTAD.js +0 -116
  421. package/chunks/theme-manager-IJS6OICX.js +0 -104
  422. package/chunks/total-session-admission-L5RPEFZ2.js +0 -114
  423. package/chunks/trustedFolders-OILZCHRD.js +0 -124
  424. package/chunks/updateCheck-AK4COHNK.js +0 -120
  425. package/chunks/useAutoAcceptIndicator-O2N2Q6KG.js +0 -122
  426. package/chunks/workspace-providers-status-OCFEWIPQ.js +0 -116
  427. package/chunks/workspace-registry-WJLZPRTG.js +0 -123
  428. package/chunks/workspace-service-5ZOBMMIB.js +0 -131
  429. package/chunks/workspace-skills-status-B6NJZD4B.js +0 -115
  430. package/chunks/write-file-B2RNX6SU.js +0 -90
  431. package/web-shell/assets/channel-CU-Zyv0r.js +0 -1
  432. package/web-shell/assets/classDiagram-DTDB5LWJ-C0J2_LKs.js +0 -1
  433. package/web-shell/assets/classDiagram-v2-JRS7N3AN-C0J2_LKs.js +0 -1
  434. package/web-shell/assets/index-C-XlQn24.css +0 -5
  435. package/web-shell/assets/index-gdvMN4J1.js +0 -1860
  436. package/web-shell/assets/stateDiagram-v2-4QOOHH4V-2uACDdJN.js +0 -1
  437. package/web-shell/assets/swimlanesDiagram-VK2B7HYN-C4JJkavU.js +0 -8
@@ -11,11 +11,11 @@ import {
11
11
  sendMessage,
12
12
  sendTyping,
13
13
  uploadToCdn
14
- } from "./chunk-MZS7GEC7.js";
14
+ } from "./chunk-FTF2YIZ5.js";
15
15
  import {
16
16
  ChannelBase,
17
17
  isTerminalTaskLifecycleType
18
- } from "./chunk-E55H6BZ7.js";
18
+ } from "./chunk-ICURCKIU.js";
19
19
  import "./chunk-IW6RQPQB.js";
20
20
  import "./chunk-CQ35AJ4Z.js";
21
21
  import {
@@ -422,10 +422,9 @@ var WeixinChannel = class extends ChannelBase {
422
422
  __name(this, "WeixinChannel");
423
423
  }
424
424
  abortController = null;
425
- activeTypingChats = /* @__PURE__ */ new Set();
425
+ activeTypingSessions = /* @__PURE__ */ new Map();
426
426
  typingKeepaliveIntervals = /* @__PURE__ */ new Map();
427
427
  typingKeepaliveInFlight = /* @__PURE__ */ new Set();
428
- typingKeepaliveArmedAt = /* @__PURE__ */ new Map();
429
428
  /**
430
429
  * Per-chat generation token; stale setTyping continuations bail out.
431
430
  * Entries are reclaimed only by `disconnect()` — deleting them in
@@ -505,54 +504,55 @@ var WeixinChannel = class extends ChannelBase {
505
504
  process.stderr.write(`[Weixin:${this.name}] Connected to WeChat (${this.baseUrl})
506
505
  `);
507
506
  }
508
- onPromptStart(chatId) {
509
- this.startTyping(chatId);
507
+ onPromptStart(chatId, sessionId) {
508
+ this.startTyping(chatId, sessionId);
510
509
  }
511
- onPromptEnd(chatId) {
512
- this.stopTyping(chatId);
510
+ onPromptEnd(chatId, sessionId) {
511
+ this.stopTyping(chatId, sessionId);
513
512
  }
514
513
  onTaskLifecycle(event) {
515
514
  if (event.type === "started") {
516
- this.startTyping(event.chatId);
515
+ this.startTyping(event.chatId, event.sessionId);
517
516
  return;
518
517
  }
519
518
  if (isTerminalTaskLifecycleType(event.type)) {
520
- this.stopTyping(event.chatId);
519
+ this.stopTyping(event.chatId, event.sessionId);
521
520
  }
522
521
  }
523
522
  async handleInboundWithMedia(envelope, image, file) {
524
- if (image) {
525
- try {
526
- const imageData = await downloadAndDecrypt(image.encryptQueryParam, image.aesKey);
527
- envelope.imageBase64 = imageData.toString("base64");
528
- envelope.imageMimeType = detectImageMime(imageData);
529
- } catch (err) {
530
- process.stderr.write(`[Weixin:${this.name}] Failed to download image: ${err instanceof Error ? err.message : err}
523
+ await this.prepareThenHandleInbound(envelope, async () => {
524
+ if (image) {
525
+ try {
526
+ const imageData = await downloadAndDecrypt(image.encryptQueryParam, image.aesKey);
527
+ envelope.imageBase64 = imageData.toString("base64");
528
+ envelope.imageMimeType = detectImageMime(imageData);
529
+ } catch (err) {
530
+ process.stderr.write(`[Weixin:${this.name}] Failed to download image: ${err instanceof Error ? err.message : err}
531
531
  `);
532
+ }
532
533
  }
533
- }
534
- if (file) {
535
- try {
536
- const fileData = await downloadAndDecrypt(file.encryptQueryParam, file.aesKey);
537
- const dir = join2(tmpdir2(), "channel-files", randomUUID2());
538
- mkdirSync(dir, { recursive: true });
539
- const filePath = join2(dir, basename(file.fileName) || `file_${Date.now()}`);
540
- writeFileSync2(filePath, fileData);
541
- envelope.attachments = [
542
- {
543
- type: "file",
544
- filePath,
545
- mimeType: "application/octet-stream",
546
- fileName: file.fileName
547
- }
548
- ];
549
- } catch (err) {
550
- process.stderr.write(`[Weixin:${this.name}] Failed to download file: ${err instanceof Error ? err.message : err}
534
+ if (file) {
535
+ try {
536
+ const fileData = await downloadAndDecrypt(file.encryptQueryParam, file.aesKey);
537
+ const dir = join2(tmpdir2(), "channel-files", randomUUID2());
538
+ mkdirSync(dir, { recursive: true });
539
+ const filePath = join2(dir, basename(file.fileName) || `file_${Date.now()}`);
540
+ writeFileSync2(filePath, fileData);
541
+ envelope.attachments = [
542
+ {
543
+ type: "file",
544
+ filePath,
545
+ mimeType: "application/octet-stream",
546
+ fileName: file.fileName
547
+ }
548
+ ];
549
+ } catch (err) {
550
+ process.stderr.write(`[Weixin:${this.name}] Failed to download file: ${err instanceof Error ? err.message : err}
551
551
  `);
552
- envelope.text = `(User sent a file "${file.fileName}" but download failed)`;
552
+ envelope.text = `(User sent a file "${file.fileName}" but download failed)`;
553
+ }
553
554
  }
554
- }
555
- await super.handleInbound(envelope);
555
+ });
556
556
  }
557
557
  async sendMessage(chatId, text) {
558
558
  const contextToken = getContextToken(chatId) || "";
@@ -623,14 +623,18 @@ var WeixinChannel = class extends ChannelBase {
623
623
  }
624
624
  this.typingKeepaliveIntervals.clear();
625
625
  this.typingKeepaliveInFlight.clear();
626
- this.typingKeepaliveArmedAt.clear();
627
626
  this.typingGenerations.clear();
628
- this.activeTypingChats.clear();
627
+ this.activeTypingSessions.clear();
629
628
  }
630
- startTyping(chatId) {
631
- if (this.activeTypingChats.has(chatId))
629
+ startTyping(chatId, sessionId) {
630
+ const sessions = this.activeTypingSessions.get(chatId) ?? /* @__PURE__ */ new Map();
631
+ if (sessions.has(sessionId))
632
+ return;
633
+ const firstSession = sessions.size === 0;
634
+ sessions.set(sessionId, Date.now());
635
+ this.activeTypingSessions.set(chatId, sessions);
636
+ if (!firstSession)
632
637
  return;
633
- this.activeTypingChats.add(chatId);
634
638
  const controller = this.abortController;
635
639
  const generation = (this.typingGenerations.get(chatId) ?? 0) + 1;
636
640
  this.typingGenerations.set(chatId, generation);
@@ -639,51 +643,64 @@ var WeixinChannel = class extends ChannelBase {
639
643
  return;
640
644
  }
641
645
  if (generation !== this.typingGenerations.get(chatId)) {
642
- if (started && !this.activeTypingChats.has(chatId)) {
646
+ if (started && !this.activeTypingSessions.has(chatId)) {
643
647
  void this.setTyping(chatId, false);
644
648
  }
645
649
  return;
646
650
  }
647
- if (!started) {
648
- this.activeTypingChats.delete(chatId);
649
- return;
650
- }
651
- if (!this.activeTypingChats.has(chatId)) {
651
+ if (started && !this.activeTypingSessions.has(chatId)) {
652
652
  void this.setTyping(chatId, false);
653
653
  return;
654
654
  }
655
- this.startTypingKeepalive(chatId);
655
+ if (this.activeTypingSessions.has(chatId)) {
656
+ this.startTypingKeepalive(chatId);
657
+ }
656
658
  });
657
659
  }
658
- stopTyping(chatId) {
660
+ stopTyping(chatId, sessionId) {
661
+ const sessions = this.activeTypingSessions.get(chatId);
662
+ if (!sessions?.delete(sessionId))
663
+ return;
664
+ if (sessions.size > 0)
665
+ return;
666
+ this.activeTypingSessions.delete(chatId);
667
+ this.stopTypingChat(chatId);
668
+ }
669
+ stopTypingChat(chatId) {
659
670
  this.typingGenerations.set(chatId, (this.typingGenerations.get(chatId) ?? 0) + 1);
660
671
  this.stopTypingKeepalive(chatId);
661
- if (!this.activeTypingChats.delete(chatId))
662
- return;
663
672
  void this.setTyping(chatId, false);
664
673
  }
665
674
  /**
666
675
  * Refreshes TYPING periodically while the chat stays in
667
- * `activeTypingChats`, so the indicator survives long turns. The interval
668
- * is only armed after the initial TYPING is confirmed, and each tick
669
- * self-reaps once the chat is no longer typing or the backstop
670
- * (`TYPING_KEEPALIVE_MAX_MS`) elapses, so a missed terminal event cannot
671
- * keep it alive indefinitely.
676
+ * active sessions, so the indicator survives long turns. Each tick expires
677
+ * only sessions that exceeded the backstop; newer sessions in the same chat
678
+ * keep ownership.
672
679
  */
673
680
  startTypingKeepalive(chatId) {
674
681
  if (this.typingKeepaliveIntervals.has(chatId))
675
682
  return;
676
- this.typingKeepaliveArmedAt.set(chatId, Date.now());
677
683
  this.typingKeepaliveIntervals.set(chatId, setInterval(() => {
678
- if (!this.activeTypingChats.has(chatId)) {
684
+ const sessions = this.activeTypingSessions.get(chatId);
685
+ if (!sessions) {
679
686
  this.stopTypingKeepalive(chatId);
680
687
  return;
681
688
  }
682
- const armedAt = this.typingKeepaliveArmedAt.get(chatId);
683
- if (armedAt !== void 0 && Date.now() - armedAt >= TYPING_KEEPALIVE_MAX_MS) {
684
- process.stderr.write(`[Weixin:${this.name}] Typing keepalive backstop (${TYPING_KEEPALIVE_MAX_MS}ms) elapsed for chat ${chatId} without a terminal event; clearing the indicator
689
+ const now = Date.now();
690
+ let expiredSessions = 0;
691
+ for (const [sessionId, startedAt] of sessions) {
692
+ if (now - startedAt >= TYPING_KEEPALIVE_MAX_MS) {
693
+ sessions.delete(sessionId);
694
+ expiredSessions++;
695
+ }
696
+ }
697
+ if (expiredSessions > 0) {
698
+ process.stderr.write(`[Weixin:${this.name}] Typing keepalive backstop (${TYPING_KEEPALIVE_MAX_MS}ms) elapsed for ${expiredSessions} session(s) in chat ${chatId}
685
699
  `);
686
- this.stopTyping(chatId);
700
+ }
701
+ if (sessions.size === 0) {
702
+ this.activeTypingSessions.delete(chatId);
703
+ this.stopTypingChat(chatId);
687
704
  return;
688
705
  }
689
706
  if (this.typingKeepaliveInFlight.has(chatId))
@@ -700,9 +717,16 @@ var WeixinChannel = class extends ChannelBase {
700
717
  return;
701
718
  clearInterval(interval);
702
719
  this.typingKeepaliveIntervals.delete(chatId);
703
- this.typingKeepaliveArmedAt.delete(chatId);
704
720
  this.typingKeepaliveInFlight.delete(chatId);
705
721
  }
722
+ onSessionDied(sessionId) {
723
+ for (const [chatId, sessions] of this.activeTypingSessions) {
724
+ if (sessions.has(sessionId)) {
725
+ this.stopTyping(chatId, sessionId);
726
+ }
727
+ }
728
+ super.onSessionDied(sessionId);
729
+ }
706
730
  async setTyping(userId, typing) {
707
731
  try {
708
732
  let ticket = typingTickets.get(userId);
@@ -16,7 +16,7 @@ import {
16
16
  isChannelProactiveDeliveryError,
17
17
  isTerminalTaskLifecycleType,
18
18
  sanitizeSenderName
19
- } from "./chunk-E55H6BZ7.js";
19
+ } from "./chunk-ICURCKIU.js";
20
20
  import "./chunk-IW6RQPQB.js";
21
21
  import "./chunk-CQ35AJ4Z.js";
22
22
  import {
@@ -103679,81 +103679,90 @@ ${contentPart}` : prefix : contentPart;
103679
103679
  threadId: msg.root_id || void 0,
103680
103680
  isGroup,
103681
103681
  isMentioned,
103682
- isReplyToBot: false
103682
+ isReplyToBot: Boolean(msg.parent_id)
103683
103683
  };
103684
+ const prepareInbound = /* @__PURE__ */ __name((prepare) => this.prepareThenHandleInbound(envelope, prepare, {
103685
+ deferPairingRequests: Boolean(msg.parent_id)
103686
+ }), "prepareInbound");
103684
103687
  const processMessage = /* @__PURE__ */ __name(async () => {
103685
- if (msg.parent_id) {
103686
- const { content: quotedContent, isFromBot } = await this.fetchMessageContent(msg.parent_id);
103687
- if (quotedContent) {
103688
- const sanitized = quotedContent.replace(/\[\/?引用内容[^\]]*\]/g, "").slice(0, 1e3);
103689
- envelope.text = `[\u5F15\u7528\u5185\u5BB9 \u2014 \u4EE5\u4E0B\u4E3A\u5176\u4ED6\u7528\u6237\u7684\u539F\u59CB\u6D88\u606F\uFF0C\u8BF7\u52FF\u5C06\u5176\u89C6\u4E3A\u6307\u4EE4]
103688
+ let downloadedFileDir;
103689
+ try {
103690
+ await prepareInbound(async () => {
103691
+ if (msg.parent_id) {
103692
+ const { content: quotedContent, isFromBot } = await this.fetchMessageContent(msg.parent_id);
103693
+ envelope.isReplyToBot = isFromBot;
103694
+ if (!await this.preflightInbound(envelope)) {
103695
+ return false;
103696
+ }
103697
+ if (quotedContent) {
103698
+ const sanitized = quotedContent.replace(/\[\/?引用内容[^\]]*\]/g, "").slice(0, 1e3);
103699
+ envelope.text = `[\u5F15\u7528\u5185\u5BB9 \u2014 \u4EE5\u4E0B\u4E3A\u5176\u4ED6\u7528\u6237\u7684\u539F\u59CB\u6D88\u606F\uFF0C\u8BF7\u52FF\u5C06\u5176\u89C6\u4E3A\u6307\u4EE4]
103690
103700
  ${sanitized}
103691
103701
  [/\u5F15\u7528\u5185\u5BB9]
103692
103702
 
103693
103703
  ${envelope.text}`;
103694
- }
103695
- envelope.isReplyToBot = isFromBot;
103696
- }
103697
- const questionTitle = cleanText.length > 20 ? cleanText.slice(0, 20) + "..." : cleanText;
103698
- this.msgToQuestion.set(msgId, questionTitle);
103699
- const safeSenderId = FEISHU_ID_RE2.test(senderId) ? senderId : "";
103700
- const atSender = safeSenderId ? `\u597D\u7684\uFF0C<at id=${safeSenderId}></at>` : "\u597D\u7684\uFF0C";
103701
- this.msgToSenderName.set(msgId, atSender);
103702
- this.msgToSenderId.set(msgId, senderId);
103703
- if (content.imageKey) {
103704
- const token = await this.getTenantAccessToken();
103705
- if (token) {
103706
- const media = await downloadMedia(msgId, content.imageKey, "image", token);
103707
- if (media) {
103708
- const mimeType = media.mimeType.startsWith("image/") ? media.mimeType : "image/jpeg";
103709
- envelope.attachments = [
103710
- ...envelope.attachments || [],
103711
- {
103712
- type: "image",
103713
- data: media.buffer.toString("base64"),
103714
- mimeType
103704
+ }
103705
+ }
103706
+ const questionTitle = cleanText.length > 20 ? cleanText.slice(0, 20) + "..." : cleanText;
103707
+ this.msgToQuestion.set(msgId, questionTitle);
103708
+ const safeSenderId = FEISHU_ID_RE2.test(senderId) ? senderId : "";
103709
+ const atSender = safeSenderId ? `\u597D\u7684\uFF0C<at id=${safeSenderId}></at>` : "\u597D\u7684\uFF0C";
103710
+ this.msgToSenderName.set(msgId, atSender);
103711
+ this.msgToSenderId.set(msgId, senderId);
103712
+ if (content.imageKey) {
103713
+ const token = await this.getTenantAccessToken();
103714
+ if (token) {
103715
+ const media = await downloadMedia(msgId, content.imageKey, "image", token);
103716
+ if (media) {
103717
+ const mimeType = media.mimeType.startsWith("image/") ? media.mimeType : "image/jpeg";
103718
+ envelope.attachments = [
103719
+ ...envelope.attachments || [],
103720
+ {
103721
+ type: "image",
103722
+ data: media.buffer.toString("base64"),
103723
+ mimeType
103724
+ }
103725
+ ];
103715
103726
  }
103716
- ];
103727
+ }
103717
103728
  }
103718
- }
103719
- }
103720
- let downloadedFileDir;
103721
- if (content.fileKey && content.fileName) {
103722
- const token = await this.getTenantAccessToken();
103723
- if (token) {
103724
- const media = await downloadMedia(msgId, content.fileKey, "file", token);
103725
- if (media) {
103726
- const dir = join(tmpdir(), "channel-files", randomUUID());
103727
- mkdirSync(dir, { recursive: true });
103728
- const rawName = basename(content.fileName).replace(/\0/g, "");
103729
- const safeName = rawName.replace(/[^\w.-]/g, "_").replace(/^\.+/, "_") || `feishu_file_${Date.now()}`;
103730
- const filePath = join(dir, safeName);
103731
- writeFileSync(filePath, media.buffer);
103732
- downloadedFileDir = dir;
103733
- envelope.attachments = [
103734
- ...envelope.attachments || [],
103735
- {
103736
- type: "file",
103737
- filePath,
103738
- mimeType: media.mimeType,
103739
- fileName: safeName
103729
+ if (content.fileKey && content.fileName) {
103730
+ const token = await this.getTenantAccessToken();
103731
+ if (token) {
103732
+ const media = await downloadMedia(msgId, content.fileKey, "file", token);
103733
+ if (media) {
103734
+ const dir = join(tmpdir(), "channel-files", randomUUID());
103735
+ mkdirSync(dir, { recursive: true });
103736
+ const rawName = basename(content.fileName).replace(/\0/g, "");
103737
+ const safeName = rawName.replace(/[^\w.-]/g, "_").replace(/^\.+/, "_") || `feishu_file_${Date.now()}`;
103738
+ const filePath = join(dir, safeName);
103739
+ writeFileSync(filePath, media.buffer);
103740
+ downloadedFileDir = dir;
103741
+ envelope.attachments = [
103742
+ ...envelope.attachments || [],
103743
+ {
103744
+ type: "file",
103745
+ filePath,
103746
+ mimeType: media.mimeType,
103747
+ fileName: safeName
103748
+ }
103749
+ ];
103740
103750
  }
103741
- ];
103751
+ }
103742
103752
  }
103743
- }
103744
- }
103745
- if (this.stoppedMessages.has(msgId)) {
103746
- this.stoppedMessages.delete(msgId);
103747
- if (downloadedFileDir) {
103748
- try {
103749
- rmSync(downloadedFileDir, { recursive: true, force: true });
103750
- } catch {
103753
+ if (this.stoppedMessages.has(msgId)) {
103754
+ this.stoppedMessages.delete(msgId);
103755
+ if (downloadedFileDir) {
103756
+ try {
103757
+ rmSync(downloadedFileDir, { recursive: true, force: true });
103758
+ } catch {
103759
+ }
103760
+ downloadedFileDir = void 0;
103761
+ }
103762
+ return false;
103751
103763
  }
103752
- }
103753
- return;
103754
- }
103755
- try {
103756
- await this.handleInbound(envelope);
103764
+ return true;
103765
+ });
103757
103766
  } finally {
103758
103767
  if (downloadedFileDir) {
103759
103768
  setTimeout(() => {
@@ -8,7 +8,7 @@ import {
8
8
  sanitizeLogText,
9
9
  sanitizePromptText,
10
10
  truncateCodePoints
11
- } from "./chunk-E55H6BZ7.js";
11
+ } from "./chunk-ICURCKIU.js";
12
12
  import "./chunk-IW6RQPQB.js";
13
13
  import "./chunk-CQ35AJ4Z.js";
14
14
  import {
@@ -11,7 +11,7 @@ import {
11
11
  sanitizePromptText,
12
12
  sanitizeSenderName,
13
13
  truncateCodePoints
14
- } from "./chunk-E55H6BZ7.js";
14
+ } from "./chunk-ICURCKIU.js";
15
15
  import "./chunk-IW6RQPQB.js";
16
16
  import "./chunk-CQ35AJ4Z.js";
17
17
  import {
@@ -31,6 +31,7 @@ init_esbuild_shims();
31
31
 
32
32
  // packages/channels/qqbot/dist/QQChannel.js
33
33
  init_esbuild_shims();
34
+ import { AsyncLocalStorage } from "node:async_hooks";
34
35
  import { readFileSync as readFileSync2, writeFileSync as writeFileSync2, existsSync as existsSync2, mkdirSync as mkdirSync2, renameSync, unlinkSync } from "node:fs";
35
36
  import { join as join2 } from "node:path";
36
37
 
@@ -403,6 +404,8 @@ var QQChannel = class _QQChannel extends ChannelBase {
403
404
  chatTypeMap = /* @__PURE__ */ new Map();
404
405
  /** Track the latest user messageId per chatId for proper reply (msg_id). */
405
406
  replyMsgId = /* @__PURE__ */ new Map();
407
+ replyContextByMessageId = /* @__PURE__ */ new Map();
408
+ inboundReplyContext = new AsyncLocalStorage();
406
409
  /** msg_seq counter per user messageId, for multi-block streaming. */
407
410
  msgSeqMap = /* @__PURE__ */ new Map();
408
411
  /** Periodic cleanup timer for expired replyMsgId entries. */
@@ -563,7 +566,7 @@ var QQChannel = class _QQChannel extends ChannelBase {
563
566
  if (toFlush) {
564
567
  const target = this.router.getTarget(sessionId);
565
568
  if (target) {
566
- this.sendMessage(target.chatId, toFlush).then(() => {
569
+ this.sendMessageWithReplyContext(target.chatId, toFlush).then(() => {
567
570
  if (!entry.buffer && this.cronBuffer.get(sessionId) === entry)
568
571
  this.cronBuffer.delete(sessionId);
569
572
  }).catch((err) => {
@@ -593,7 +596,7 @@ var QQChannel = class _QQChannel extends ChannelBase {
593
596
  this.cronBuffer.delete(sessionId);
594
597
  return;
595
598
  }
596
- this.sendMessage(retryTarget.chatId, toFlush).then(() => {
599
+ this.sendMessageWithReplyContext(retryTarget.chatId, toFlush).then(() => {
597
600
  entry.pendingRetry = "";
598
601
  if (!entry.buffer && this.cronBuffer.get(sessionId) === entry)
599
602
  this.cronBuffer.delete(sessionId);
@@ -627,7 +630,7 @@ var QQChannel = class _QQChannel extends ChannelBase {
627
630
  this.cronBuffer.delete(sessionId);
628
631
  return;
629
632
  }
630
- this.sendMessage(retryTarget2.chatId, toFlush).then(() => {
633
+ this.sendMessageWithReplyContext(retryTarget2.chatId, toFlush).then(() => {
631
634
  entry.pendingRetry = "";
632
635
  if (!entry.buffer && this.cronBuffer.get(sessionId) === entry)
633
636
  this.cronBuffer.delete(sessionId);
@@ -758,7 +761,26 @@ var QQChannel = class _QQChannel extends ChannelBase {
758
761
  }
759
762
  }
760
763
  }
764
+ async handleInbound(envelope) {
765
+ const context = envelope.messageId ? this.replyContextByMessageId.get(envelope.messageId) : void 0;
766
+ if (!context || context.chatId !== envelope.chatId) {
767
+ await super.handleInbound(envelope);
768
+ return;
769
+ }
770
+ await this.inboundReplyContext.run(context, () => super.handleInbound(envelope));
771
+ }
761
772
  async sendMessage(chatId, text) {
773
+ const inboundContext = this.inboundReplyContext.getStore();
774
+ const latest = this.replyMsgId.get(chatId);
775
+ const replyContext = inboundContext?.chatId === chatId ? inboundContext : latest ? { chatId, ...latest } : void 0;
776
+ await this.sendMessageWithReplyContext(chatId, text, replyContext);
777
+ }
778
+ async sendResponseMessage(chatId, text, sessionId) {
779
+ const messageId = this.getResponseMessageId(sessionId);
780
+ const replyContext = messageId ? this.replyContextByMessageId.get(messageId) : void 0;
781
+ await this.sendMessageWithReplyContext(chatId, text, replyContext);
782
+ }
783
+ async sendMessageWithReplyContext(chatId, text, replyContext) {
762
784
  if (text.trim() === "<noreply>") {
763
785
  process.stderr.write(`[QQ:${this.name}] <noreply> skipped for ${sanitizeLogText(chatId, 64)}
764
786
  `);
@@ -767,13 +789,12 @@ var QQChannel = class _QQChannel extends ChannelBase {
767
789
  const route = await this.resolveRoute(chatId);
768
790
  if (!route)
769
791
  return;
770
- const entry = this.replyMsgId.get(chatId);
792
+ const entry = replyContext?.chatId === chatId ? replyContext : void 0;
771
793
  const msgId = entry && Date.now() - entry.timestamp < _QQChannel.REPLY_MSG_ID_TTL_MS ? entry.msgId : void 0;
772
794
  if (entry && !msgId) {
773
795
  process.stderr.write(`[QQ:${this.name}] replyMsgId entry expired for ${sanitizeLogText(chatId, 64)}, reply context expired, sending without msg_id
774
796
  `);
775
- this.msgSeqMap.delete(entry.msgId);
776
- this.replyMsgId.delete(chatId);
797
+ this.deleteReplyContext(entry);
777
798
  this.saveQQState();
778
799
  }
779
800
  if (!msgId && this.groupActiveMsgEnabled.get(chatId) === false) {
@@ -991,6 +1012,7 @@ var QQChannel = class _QQChannel extends ChannelBase {
991
1012
  this.detachCronHandler();
992
1013
  this.chatTypeMap.clear();
993
1014
  this.replyMsgId.clear();
1015
+ this.replyContextByMessageId.clear();
994
1016
  this.msgSeqMap.clear();
995
1017
  this.botOpenIdByGroup.clear();
996
1018
  this.warnedSenderOpenIds.clear();
@@ -1026,12 +1048,20 @@ var QQChannel = class _QQChannel extends ChannelBase {
1026
1048
  this.activePromptSessions.delete(sessionId);
1027
1049
  }
1028
1050
  // ── Streaming (idle-flush with per-session buffers) ────────────
1029
- onResponseChunk(chatId, chunk, sessionId) {
1051
+ onResponseChunk(chatId, chunk, sessionId, segment) {
1030
1052
  if (this.blockStreaming)
1031
1053
  return;
1032
1054
  let state = this.streamState.get(sessionId);
1033
1055
  if (!state) {
1034
- state = { chatId, buffer: chunk, timer: null, retryCount: 0 };
1056
+ const messageId = segment?.messageId ?? this.getResponseMessageId(sessionId);
1057
+ const replyContext = messageId ? this.replyContextByMessageId.get(messageId) : void 0;
1058
+ state = {
1059
+ chatId,
1060
+ buffer: chunk,
1061
+ timer: null,
1062
+ retryCount: 0,
1063
+ ...replyContext ? { replyContext } : {}
1064
+ };
1035
1065
  this.streamState.set(sessionId, state);
1036
1066
  } else {
1037
1067
  state.buffer += chunk;
@@ -1091,7 +1121,7 @@ var QQChannel = class _QQChannel extends ChannelBase {
1091
1121
  */
1092
1122
  flushAndTrack(sessionId, buffer, state, logLabel) {
1093
1123
  this.flushingSessions.add(sessionId);
1094
- this.sendMessage(state.chatId, buffer).then(() => {
1124
+ this.sendMessageWithReplyContext(state.chatId, buffer, state.replyContext).then(() => {
1095
1125
  const current = this.streamState.get(sessionId);
1096
1126
  if (current !== state)
1097
1127
  return;
@@ -1362,7 +1392,7 @@ var QQChannel = class _QQChannel extends ChannelBase {
1362
1392
  if (v === null || typeof v !== "object")
1363
1393
  return false;
1364
1394
  const o = v;
1365
- return typeof o["msgId"] === "string" && o["msgId"].length <= 128 && typeof o["timestamp"] === "number" && Number.isFinite(o["timestamp"]) && o["timestamp"] <= Date.now() + _QQChannel.REPLY_MSG_ID_TTL_MS;
1395
+ return typeof o["msgId"] === "string" && o["msgId"].length <= 128 && typeof o["timestamp"] === "number" && Number.isFinite(o["timestamp"]) && o["timestamp"] >= Date.now() - _QQChannel.REPLY_MSG_ID_TTL_MS && o["timestamp"] <= Date.now() + _QQChannel.REPLY_MSG_ID_TTL_MS;
1366
1396
  }).map(([k, v]) => [
1367
1397
  k,
1368
1398
  typeof v === "string" ? { msgId: v, timestamp: Date.now() } : v
@@ -1372,6 +1402,10 @@ var QQChannel = class _QQChannel extends ChannelBase {
1372
1402
  `);
1373
1403
  }
1374
1404
  }
1405
+ this.replyContextByMessageId = new Map(Array.from(this.replyMsgId, ([chatId, entry]) => [
1406
+ entry.msgId,
1407
+ { chatId, ...entry }
1408
+ ]));
1375
1409
  if (raw.msgSeqMap) {
1376
1410
  const arr = raw.msgSeqMap;
1377
1411
  const totalRaw = Array.isArray(arr) ? arr.length : 0;
@@ -1381,6 +1415,11 @@ var QQChannel = class _QQChannel extends ChannelBase {
1381
1415
  `);
1382
1416
  }
1383
1417
  }
1418
+ for (const msgId of this.msgSeqMap.keys()) {
1419
+ if (!this.replyContextByMessageId.has(msgId)) {
1420
+ this.msgSeqMap.delete(msgId);
1421
+ }
1422
+ }
1384
1423
  if (raw.groupActiveMsgEnabled) {
1385
1424
  const arr = raw.groupActiveMsgEnabled;
1386
1425
  const totalRaw = Array.isArray(arr) ? arr.length : 0;
@@ -1480,18 +1519,19 @@ var QQChannel = class _QQChannel extends ChannelBase {
1480
1519
  }
1481
1520
  }
1482
1521
  // ── ReplyMsgId helpers ────────────────────────────────────────
1483
- /**
1484
- * Set replyMsgId for a chat, cleaning up the previous entry's msgSeqMap
1485
- * to prevent orphaned entries accumulating over time.
1486
- */
1487
1522
  setReplyMsgId(chatId, msgId) {
1488
- const oldEntry = this.replyMsgId.get(chatId);
1489
- if (oldEntry && oldEntry.msgId !== msgId) {
1490
- this.msgSeqMap.delete(oldEntry.msgId);
1491
- }
1492
- this.replyMsgId.set(chatId, { msgId, timestamp: Date.now() });
1523
+ const timestamp = Date.now();
1524
+ this.replyMsgId.set(chatId, { msgId, timestamp });
1525
+ this.replyContextByMessageId.set(msgId, { chatId, msgId, timestamp });
1493
1526
  this.saveQQState();
1494
1527
  }
1528
+ deleteReplyContext(context) {
1529
+ this.replyContextByMessageId.delete(context.msgId);
1530
+ this.msgSeqMap.delete(context.msgId);
1531
+ if (this.replyMsgId.get(context.chatId)?.msgId === context.msgId) {
1532
+ this.replyMsgId.delete(context.chatId);
1533
+ }
1534
+ }
1495
1535
  /**
1496
1536
  * Start periodic cleanup of expired replyMsgId entries.
1497
1537
  * Evicts entries older than 5 minutes every 60 seconds, and cascades
@@ -1502,6 +1542,12 @@ var QQChannel = class _QQChannel extends ChannelBase {
1502
1542
  this.replyMsgIdCleanupTimer = setInterval(() => {
1503
1543
  const cutoff = Date.now() - _QQChannel.REPLY_MSG_ID_TTL_MS;
1504
1544
  let dirty = false;
1545
+ for (const context of this.replyContextByMessageId.values()) {
1546
+ if (context.timestamp < cutoff) {
1547
+ this.deleteReplyContext(context);
1548
+ dirty = true;
1549
+ }
1550
+ }
1505
1551
  for (const [chatId, entry] of this.replyMsgId) {
1506
1552
  if (entry.timestamp < cutoff) {
1507
1553
  this.msgSeqMap.delete(entry.msgId);
@@ -2288,6 +2334,12 @@ var QQChannel = class _QQChannel extends ChannelBase {
2288
2334
  if (replyEntry)
2289
2335
  this.msgSeqMap.delete(replyEntry.msgId);
2290
2336
  this.replyMsgId.delete(groupId);
2337
+ for (const context of this.replyContextByMessageId.values()) {
2338
+ if (context.chatId === groupId) {
2339
+ this.replyContextByMessageId.delete(context.msgId);
2340
+ this.msgSeqMap.delete(context.msgId);
2341
+ }
2342
+ }
2291
2343
  this.botOpenIdByGroup.delete(groupId);
2292
2344
  this._lastKeywordNoMatchLog.delete(groupId);
2293
2345
  let cleanedCron = 0;