@qwen-code/qwen-code 0.23.1-preview.2 → 0.23.1

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 (297) hide show
  1. package/bundled/computer-use/SKILL.md +189 -116
  2. package/bundled/goal-draft/SKILL.md +23 -13
  3. package/bundled/qc-helper/docs/_meta.ts +1 -0
  4. package/bundled/qc-helper/docs/configuration/model-providers.md +47 -1
  5. package/bundled/qc-helper/docs/configuration/settings.md +50 -0
  6. package/bundled/qc-helper/docs/conversations-recovery.md +102 -0
  7. package/bundled/qc-helper/docs/features/channels/overview.md +1 -1
  8. package/bundled/qc-helper/docs/features/computer-use.md +9 -7
  9. package/bundled/qc-helper/docs/features/followup-suggestions.md +2 -2
  10. package/bundled/qc-helper/docs/features/goals.md +15 -3
  11. package/bundled/qc-helper/docs/qwen-serve.md +19 -1
  12. package/chunks/{MaxSizedBox-IYIQ43IZ.js → MaxSizedBox-UDO6Y7RB.js} +20 -20
  13. package/chunks/{StandaloneSessionPicker-AWB2OHX6.js → StandaloneSessionPicker-D4CUOO4H.js} +38 -38
  14. package/chunks/{acp-startup-profiler-BAL4LJTN.js → acp-startup-profiler-KEU6VAYR.js} +2 -2
  15. package/chunks/{acpAgent-ZC57OLS4.js → acpAgent-KWLJFADK.js} +118 -91
  16. package/chunks/{agent-GEBPAEJS.js → agent-GSUPGEOL.js} +13 -13
  17. package/chunks/{agent-headless-63ZEYAJK.js → agent-headless-HNYCQUJB.js} +13 -13
  18. package/chunks/{anthropicContentGenerator-6XDHXIII.js → anthropicContentGenerator-I7LQZH26.js} +30 -7
  19. package/chunks/{askUserQuestion-3KAYLLMM.js → askUserQuestion-I5W5S3D6.js} +1 -1
  20. package/chunks/{bridge-MHWO5I5T.js → bridge-B7CV6RVI.js} +23 -23
  21. package/chunks/{channel-management-service-NFRZXQFO.js → channel-management-service-TRTLQTSV.js} +4 -4
  22. package/chunks/{channel-settings-store-T7PMIHKC.js → channel-settings-store-FW45IRUP.js} +31 -31
  23. package/chunks/{channel-worker-group-O2BWK5F7.js → channel-worker-group-PIYPVCTF.js} +6 -6
  24. package/chunks/{channel-worker-manager-4WP7VJOD.js → channel-worker-manager-FQHEDTD2.js} +6 -6
  25. package/chunks/{channel-worker-supervisor-CCUXD6J5.js → channel-worker-supervisor-XJPZZ3VK.js} +3 -3
  26. package/chunks/{chunk-KTLT7VCX.js → chunk-25CBAK3H.js} +2 -2
  27. package/chunks/{chunk-SHX2HIE7.js → chunk-27LTEY6D.js} +1 -1
  28. package/chunks/{chunk-ZT3XUGSU.js → chunk-2TMJRF46.js} +86 -9
  29. package/chunks/{chunk-HWZOOSEB.js → chunk-2YS3NU4A.js} +3 -3
  30. package/chunks/chunk-2Z3T52OC.js +82 -0
  31. package/chunks/{chunk-QW7BUOSI.js → chunk-2ZFO5JD7.js} +20 -3
  32. package/chunks/{chunk-RH344FKI.js → chunk-3BTHHXXE.js} +1 -1
  33. package/chunks/{chunk-OFB36ZBA.js → chunk-3LPJ776W.js} +1 -1
  34. package/chunks/{chunk-GEV66YGE.js → chunk-3VDLQUR2.js} +1 -1
  35. package/chunks/{chunk-RRCNEW2A.js → chunk-3VWPPK5Q.js} +58 -4
  36. package/chunks/{chunk-L36LLVA5.js → chunk-3YQMUBTS.js} +3 -3
  37. package/chunks/{chunk-LTCI6ZOJ.js → chunk-45ROPFQY.js} +1 -1
  38. package/chunks/{chunk-W4LL5RZO.js → chunk-4ALNJDHL.js} +52 -13
  39. package/chunks/{chunk-4OCYWXKF.js → chunk-5CVY5Q2P.js} +3 -3
  40. package/chunks/{chunk-ZRVFHLLK.js → chunk-5DQ4YTIZ.js} +1 -1
  41. package/chunks/{chunk-FWH4736Q.js → chunk-5IL2BZHW.js} +3 -3
  42. package/chunks/{chunk-537SQ2AI.js → chunk-5WC2ECUK.js} +104 -16
  43. package/chunks/{chunk-3K65MUKD.js → chunk-65I7S4Z3.js} +2 -1
  44. package/chunks/{chunk-RUMSY4ES.js → chunk-66JBCTJF.js} +8 -7
  45. package/chunks/{chunk-YLFICBYK.js → chunk-6JXHO7LG.js} +3 -3
  46. package/chunks/{chunk-TDHVOZ65.js → chunk-6QILGINT.js} +2 -2
  47. package/chunks/{chunk-WQBR7LN5.js → chunk-6QV7Z74P.js} +1 -1
  48. package/chunks/{chunk-RSU3I6UL.js → chunk-6SADVYQQ.js} +1 -1
  49. package/chunks/{chunk-AIMZIXZM.js → chunk-6TPVIESH.js} +5 -7
  50. package/chunks/{chunk-2LD5U7Q3.js → chunk-6YEOCHSE.js} +29 -1
  51. package/chunks/{chunk-7PMKXGRP.js → chunk-75LBC7SV.js} +66 -9
  52. package/chunks/{chunk-B5FF3LRF.js → chunk-7SL55L5H.js} +22 -15
  53. package/chunks/{chunk-I7UNCY24.js → chunk-ARYNBBBM.js} +3 -3
  54. package/chunks/{chunk-QQGAR64U.js → chunk-B3EL44K3.js} +4 -4
  55. package/chunks/{chunk-KAZWXVI3.js → chunk-CABDNUJ4.js} +2 -2
  56. package/chunks/{chunk-R7TKFIQO.js → chunk-CALNF3Z3.js} +1 -1
  57. package/chunks/{chunk-75UQFGFE.js → chunk-CHVU543W.js} +1 -1
  58. package/chunks/{chunk-C4NXRR7T.js → chunk-CIKL2DQP.js} +2 -2
  59. package/chunks/{chunk-LD53HMPV.js → chunk-CRZBDVP2.js} +1 -0
  60. package/chunks/{chunk-SHK2SIR5.js → chunk-D6AQNMUA.js} +4 -4
  61. package/chunks/{chunk-EPZWBYQI.js → chunk-DO5SMV52.js} +8 -6
  62. package/chunks/{chunk-P5Z7VD23.js → chunk-DXQ6Z7AH.js} +106 -39
  63. package/chunks/{chunk-3RMVM33U.js → chunk-DZ6D4B3K.js} +5 -5
  64. package/chunks/{chunk-T7TP5UQL.js → chunk-E7XSUYCZ.js} +4 -4
  65. package/chunks/{chunk-2C3XDBGL.js → chunk-EEKU6COG.js} +4 -4
  66. package/chunks/{chunk-AX23QSX3.js → chunk-EHTKOO6W.js} +4 -4
  67. package/chunks/{chunk-XNC2TCUO.js → chunk-ENZDGHGJ.js} +4 -4
  68. package/chunks/{chunk-733KQL63.js → chunk-EOET4H7C.js} +3 -3
  69. package/chunks/{chunk-37SOBIA3.js → chunk-ERXNTINK.js} +1 -1
  70. package/chunks/{chunk-F47DITLZ.js → chunk-FAWTMDX7.js} +14 -0
  71. package/chunks/{chunk-5JLQWQK6.js → chunk-FV4DM2M4.js} +2 -2
  72. package/chunks/{chunk-UTVIIA7N.js → chunk-FW4E4QPG.js} +1 -1
  73. package/chunks/{chunk-REDVV5NC.js → chunk-FWRRUITH.js} +7 -7
  74. package/chunks/{chunk-5V4B3EWA.js → chunk-GM44O6F7.js} +1 -1
  75. package/chunks/{chunk-Z6DDPSGJ.js → chunk-GNY7B3CA.js} +1 -1
  76. package/chunks/{chunk-ERMAXPXA.js → chunk-HIXUUCGY.js} +187 -12
  77. package/chunks/{chunk-EJNYBDYC.js → chunk-HNLMYDQE.js} +1 -1
  78. package/chunks/{chunk-XX4MBBFW.js → chunk-HUX2DOTF.js} +3 -3
  79. package/chunks/{chunk-RCUWMVN3.js → chunk-HZ2HUXX7.js} +1 -1
  80. package/chunks/{chunk-RD3VPM4E.js → chunk-IKG2YVRZ.js} +2 -2
  81. package/chunks/{chunk-IMWCUWQT.js → chunk-J3TJH52D.js} +1 -1
  82. package/chunks/{chunk-ZJ2LM2SI.js → chunk-JGDRB4FP.js} +104 -33
  83. package/chunks/{chunk-ANVC5CSK.js → chunk-L7V52QEZ.js} +10 -10
  84. package/chunks/{chunk-MFCWL4LI.js → chunk-LNCNUMJ5.js} +451 -396
  85. package/chunks/{chunk-AUJOWIT5.js → chunk-LZGFVUWZ.js} +3 -3
  86. package/chunks/{chunk-6KYWU726.js → chunk-M73KHGNR.js} +13 -66
  87. package/chunks/{chunk-ADJD4LZF.js → chunk-MA5OUNN6.js} +1 -1
  88. package/chunks/{chunk-I67KJGM6.js → chunk-MFYH2VXV.js} +3 -3
  89. package/chunks/{chunk-PLUAIHZO.js → chunk-N7YQEKGX.js} +6 -6
  90. package/chunks/{chunk-JOV46WGX.js → chunk-NB3NDQQK.js} +1 -1
  91. package/chunks/chunk-NOO4QFXM.js +171 -0
  92. package/chunks/{chunk-VYCJITND.js → chunk-O2JBJQCF.js} +1 -1
  93. package/chunks/{chunk-RQNAO42A.js → chunk-OESZTXTG.js} +1 -1
  94. package/chunks/{chunk-UKADFFL2.js → chunk-OFVAS4AR.js} +1 -1
  95. package/chunks/{chunk-Y3C5COGI.js → chunk-OPMKGOLD.js} +1 -1
  96. package/chunks/{chunk-TSLRORQR.js → chunk-PDUMGZ2P.js} +1467 -1323
  97. package/chunks/{chunk-Z6KFLEG7.js → chunk-PSPAM24S.js} +1 -0
  98. package/chunks/{chunk-5FYGZ7E3.js → chunk-QK4K76T6.js} +2 -2
  99. package/chunks/{chunk-NUQFUXOG.js → chunk-QTNCGZHQ.js} +2 -0
  100. package/chunks/{chunk-WFXD5OZH.js → chunk-QZOXVQPK.js} +1 -1
  101. package/chunks/{chunk-QJVZLILI.js → chunk-R7OO56VZ.js} +1 -1
  102. package/chunks/{chunk-KP5QK3FB.js → chunk-RNYENHN5.js} +397 -54
  103. package/chunks/{chunk-22QOQKG4.js → chunk-RXT4QBDX.js} +1 -1
  104. package/chunks/{chunk-LYHYXJJ3.js → chunk-S6QVI3MV.js} +3 -3
  105. package/chunks/{chunk-NXWYCSPL.js → chunk-SOA4HKRJ.js} +1 -1
  106. package/chunks/{chunk-IGOIYZBG.js → chunk-T2IHCZLS.js} +2 -2
  107. package/chunks/{chunk-C55CR5I4.js → chunk-TGC4264Q.js} +6 -6
  108. package/chunks/{chunk-EGRFCIXD.js → chunk-TWAMIEQ2.js} +79 -18
  109. package/chunks/{chunk-PMGWY6ZP.js → chunk-TWWS7XUW.js} +13 -10
  110. package/chunks/{chunk-RGAQDQ3Z.js → chunk-UHUT4IDM.js} +18 -9
  111. package/chunks/{chunk-HPE4LEWX.js → chunk-USN6VNTO.js} +1 -1
  112. package/chunks/{chunk-BNWIX6BM.js → chunk-UXDVUFKU.js} +3 -3
  113. package/chunks/{chunk-HY3DXYZK.js → chunk-UYDQYDW2.js} +1 -1
  114. package/chunks/{chunk-3K456UJF.js → chunk-VF6D6EGV.js} +12 -4
  115. package/chunks/{chunk-ZNI3V2XA.js → chunk-WAASYFPK.js} +2 -2
  116. package/chunks/{chunk-OHOO527W.js → chunk-WG7BL3FY.js} +52 -2
  117. package/chunks/{chunk-C7M445SS.js → chunk-WJDXKQIO.js} +1 -1
  118. package/chunks/{chunk-HZS3JRQW.js → chunk-WNISCNTA.js} +40 -2
  119. package/chunks/{chunk-AWDF462I.js → chunk-WQMUGQ6G.js} +2 -2
  120. package/chunks/{chunk-VU7O7CGQ.js → chunk-XDNFODER.js} +1 -1
  121. package/chunks/{chunk-65GHQ4FX.js → chunk-XVTCSVBK.js} +514 -47
  122. package/chunks/{chunk-SI6Q52UI.js → chunk-XZ3Z43XL.js} +3 -3
  123. package/chunks/{chunk-SD7Y2PMC.js → chunk-YAC7H4K3.js} +2 -2
  124. package/chunks/{chunk-FXYNIZPW.js → chunk-YCEKI7QX.js} +51 -10
  125. package/chunks/{chunk-7IKXTGZT.js → chunk-YI2YCNSP.js} +1 -1
  126. package/chunks/{chunk-E4VX6LXB.js → chunk-YZTGGCEE.js} +10 -2
  127. package/chunks/{chunk-VMFPZXRT.js → chunk-ZNO5BUAD.js} +43 -31
  128. package/chunks/{chunk-WLZRMF3C.js → chunk-ZPL2TZNA.js} +353 -11
  129. package/chunks/{chunk-TXAEXF2B.js → chunk-ZU2T5JIS.js} +21 -8
  130. package/chunks/{config-utils-F4CFJ4MW.js → config-utils-KTDSQ4MU.js} +24 -24
  131. package/chunks/{contextCommand-OIIGGOMU.js → contextCommand-UQ3KRYGK.js} +22 -22
  132. package/chunks/{core-runtime-JEHLOGMB.js → core-runtime-JR34JAFH.js} +20 -20
  133. package/chunks/{create-sub-session-MVFBE5RA.js → create-sub-session-RGPJOI4S.js} +21 -21
  134. package/chunks/{daemon-LCUELM6E.js → daemon-UI6SQSBV.js} +1 -1
  135. package/chunks/{daemon-git-worktree-guard-5FTKLJOU.js → daemon-git-worktree-guard-H3OA26KQ.js} +20 -20
  136. package/chunks/{daemon-status-provider-P6A5MPMW.js → daemon-status-provider-6WZLKSZU.js} +27 -27
  137. package/chunks/{daemon-trust-policy-ZJ3NFYUO.js → daemon-trust-policy-3EDP2BYD.js} +27 -27
  138. package/chunks/{daemon-trust-policy-monitor-6SDLEW7S.js → daemon-trust-policy-monitor-CRHZPK52.js} +27 -27
  139. package/chunks/{deferred-core-runtime-DWOXIU5S.js → deferred-core-runtime-LO5NTQQ4.js} +20 -20
  140. package/chunks/{discovery-TUM3ZQ6U.js → discovery-XP4RMDUM.js} +4 -2
  141. package/chunks/{dist-NXW4DUUX.js → dist-24TCWK5H.js} +1 -1
  142. package/chunks/{dist-I74QLLQS.js → dist-5I4HLUTO.js} +1 -1
  143. package/chunks/{dist-XINEKB5A.js → dist-FDISN4AK.js} +1 -1
  144. package/chunks/{dist-VCAS67N5.js → dist-M4CBX53H.js} +1 -1
  145. package/chunks/{dist-AI25RVRA.js → dist-NQ2636VT.js} +1 -1
  146. package/chunks/{dist-3H3WODVS.js → dist-OR2ZQTXZ.js} +1 -1
  147. package/chunks/{dist-P6YWBITG.js → dist-STAGIFNB.js} +430 -51
  148. package/chunks/{dist-YNQU4CKC.js → dist-WZTUKIDR.js} +2 -2
  149. package/chunks/{dist-T4PRA5EZ.js → dist-XJ25G6OH.js} +1 -1
  150. package/chunks/{edit-WPVXLL3T.js → edit-LB7Z7XK5.js} +13 -13
  151. package/chunks/{enter-worktree-5A6VW6BN.js → enter-worktree-YFTKHXHZ.js} +2 -2
  152. package/chunks/{enterPlanMode-JSODW7E2.js → enterPlanMode-P6TVUFIY.js} +13 -13
  153. package/chunks/{environment-5LLJ3I3W.js → environment-QATJNNKI.js} +23 -23
  154. package/chunks/{errors-IQT3YZEP.js → errors-3XJ37PS2.js} +22 -22
  155. package/chunks/{exit-worktree-QV7E7KP6.js → exit-worktree-NF2XEMES.js} +3 -3
  156. package/chunks/{exitPlanMode-DDVFYNW4.js → exitPlanMode-A3OKL5UO.js} +13 -13
  157. package/chunks/{fast-path-PAUQQEVU.js → fast-path-DBIT5YQQ.js} +3 -3
  158. package/chunks/{fast-path-settings-ISEJPRYE.js → fast-path-settings-SATXY3PD.js} +3 -3
  159. package/chunks/{glob-SQ7CTZ7F.js → glob-73EDTXUE.js} +13 -13
  160. package/chunks/{goal-tools-UWZRCLQB.js → goal-tools-DFI6YMSD.js} +13 -13
  161. package/chunks/{handleAutoUpdate-RUPZZTSG.js → handleAutoUpdate-2FUNJO3B.js} +23 -23
  162. package/chunks/{i18n-SF5MPWEB.js → i18n-FDIA6KFI.js} +23 -21
  163. package/chunks/{image-gen-Q3RUTVKR.js → image-gen-XP4NNIYG.js} +4 -4
  164. package/chunks/{initializer-CK4WPYZG.js → initializer-4MJTJOTW.js} +27 -27
  165. package/chunks/{installationInfo-IRPQEYRF.js → installationInfo-232RA2OK.js} +20 -20
  166. package/chunks/{list-E3PS3EBJ.js → list-WN6WSGEB.js} +30 -30
  167. package/chunks/{llm-JQKBOYAF.js → llm-UDFWQWZA.js} +62 -62
  168. package/chunks/{llm-content-generator-2QWGBW42.js → llm-content-generator-VLMZ2A7A.js} +23 -8
  169. package/chunks/{loadedSettingsAdapter-DGXGVYZS.js → loadedSettingsAdapter-OBQEIXM7.js} +27 -27
  170. package/chunks/{loggingContentGenerator-ZYURLJKK.js → loggingContentGenerator-RGVUMUVX.js} +14 -14
  171. package/chunks/{managed-npm-update-HTHR63EA.js → managed-npm-update-QBAJYCFU.js} +20 -20
  172. package/chunks/{mcp-I7G2AEWS.js → mcp-OTIZZCPY.js} +27 -27
  173. package/chunks/{monitor-4R76BCRZ.js → monitor-BV5XF6LL.js} +13 -13
  174. package/chunks/{nonInteractiveCli-24OQ3VP2.js → nonInteractiveCli-W6MUKDVJ.js} +64 -61
  175. package/chunks/{notebook-edit-PPSH7FEX.js → notebook-edit-HGBEKGTE.js} +13 -13
  176. package/chunks/{openaiContentGenerator-K7V5EO7F.js → openaiContentGenerator-NSU3ERBH.js} +8 -8
  177. package/chunks/{pidfile-TGIUY2GG.js → pidfile-LE3TU4GE.js} +20 -20
  178. package/chunks/{processUtils-3USXUQWX.js → processUtils-YFBGJK67.js} +2 -2
  179. package/chunks/{prompt-terminal-ledger-XHVZRXJI.js → prompt-terminal-ledger-4W4W7DSO.js} +21 -21
  180. package/chunks/{qwenContentGenerator-MPBOQB64.js → qwenContentGenerator-HTA57WFC.js} +16 -16
  181. package/chunks/{qwenOAuth2-BS5D2LYV.js → qwenOAuth2-KX6LVYQ3.js} +4 -4
  182. package/chunks/{read-file-R256LDWQ.js → read-file-KHPQ2MB6.js} +2 -2
  183. package/chunks/{resumeHistoryUtils-S43LTFHD.js → resumeHistoryUtils-K7RV3QBN.js} +23 -23
  184. package/chunks/{ripGrep-L7HPZ75Y.js → ripGrep-NBBVCMG4.js} +3 -3
  185. package/chunks/{run-qwen-serve-CTFL5R6U.js → run-qwen-serve-A3JBOZCM.js} +58 -60
  186. package/chunks/{runtime-FS5TL6P7.js → runtime-7YOU2KJ3.js} +32 -32
  187. package/chunks/{scheduled-tasks-QXPV3Q35.js → scheduled-tasks-52LXK7LN.js} +25 -25
  188. package/chunks/{scheduler-EXU5HMVK.js → scheduler-J44M72VM.js} +22 -22
  189. package/chunks/{send-message-GQKXGMPI.js → send-message-AWKUDJBH.js} +1 -1
  190. package/chunks/{serve-ITJC7WNN.js → serve-TRC6XJUB.js} +27 -27
  191. package/chunks/{server-6JQY3PTU.js → server-YPNTJLX2.js} +1296 -822
  192. package/chunks/{session-PJDEKXD4.js → session-FMMIBFYX.js} +63 -62
  193. package/chunks/{session-attachments-root-L37ORSST.js → session-attachments-root-LDJMNK7K.js} +20 -20
  194. package/chunks/{session-pr-refresh-WIFD52YL.js → session-pr-refresh-NLR4EK2J.js} +24 -24
  195. package/chunks/{settings-LO6J5SAZ.js → settings-A46L577J.js} +26 -26
  196. package/chunks/{shell-ANAFVYGR.js → shell-Q5LSQPPY.js} +13 -13
  197. package/chunks/{skill-SHJWKSPH.js → skill-75KPJRCM.js} +2 -2
  198. package/chunks/{skill-settings-GX3XHZ5Q.js → skill-settings-775YT4YR.js} +26 -26
  199. package/chunks/{spawnChannel-WE42VBKM.js → spawnChannel-XY73I5CU.js} +20 -20
  200. package/chunks/{standalone-update-CWDIKJRP.js → standalone-update-L46XXNQ2.js} +22 -22
  201. package/chunks/{start-opentui-ui-BBHGFOTF.js → start-opentui-ui-WLV43247.js} +1991 -986
  202. package/chunks/{startInteractiveUI-FQX7LUYP.js → startInteractiveUI-F5DKMLOV.js} +1119 -1478
  203. package/chunks/{team-create-WKTPCH6D.js → team-create-2PATB77U.js} +13 -13
  204. package/chunks/{team-plan-approval-Y23DL7WR.js → team-plan-approval-QTANEWOS.js} +13 -13
  205. package/chunks/{terminal-image-renderer-B646HBDW.js → terminal-image-renderer-OGULCFNF.js} +20 -20
  206. package/chunks/{theme-manager-BNWESY26.js → theme-manager-CNO3QERP.js} +20 -20
  207. package/chunks/{tool-search-PVQ5O5Y2.js → tool-search-VXWEOZE7.js} +2 -2
  208. package/chunks/{total-session-admission-P5Z43KNW.js → total-session-admission-4KAADZPB.js} +24 -24
  209. package/chunks/{trustedFolders-FH2LT2MZ.js → trustedFolders-PPJSOPOT.js} +21 -21
  210. package/chunks/{update-relaunch-WOWTKJSN.js → update-relaunch-4PT4MW7B.js} +5 -5
  211. package/chunks/{updateCheck-3MYFMM35.js → updateCheck-WAVFLWNG.js} +22 -22
  212. package/chunks/{useAutoAcceptIndicator-Q7ZRRRKO.js → useAutoAcceptIndicator-XNED4NRB.js} +29 -29
  213. package/chunks/{validateNonInterActiveAuth-MYEWJX3G.js → validateNonInterActiveAuth-J676DUQ2.js} +59 -58
  214. package/chunks/{version-RO2FPO76.js → version-J6SRRQB2.js} +1 -1
  215. package/chunks/{web-fetch-QAKY2LUA.js → web-fetch-FMZZYX44.js} +5 -5
  216. package/chunks/{web-search-XA5Z4ZCD.js → web-search-3G2KXCX5.js} +18 -7
  217. package/chunks/{workflow-QFIOCMDM.js → workflow-PPZZICQ7.js} +15 -15
  218. package/chunks/{workspace-providers-status-B2UD7RAG.js → workspace-providers-status-IIYTAQST.js} +29 -29
  219. package/chunks/{workspace-registration-store-VZLRTI3Q.js → workspace-registration-store-VHCDXAV7.js} +1 -1
  220. package/chunks/{workspace-registry-GYOGG6TM.js → workspace-registry-I7VQIPS2.js} +24 -24
  221. package/chunks/{workspace-runtime-coordinator-7KRXGQ4V.js → workspace-runtime-coordinator-DBGNY32G.js} +24 -24
  222. package/chunks/{workspace-service-DJEYGJE4.js → workspace-service-QSKB2T54.js} +31 -31
  223. package/chunks/{workspace-skills-status-MOKNESUC.js → workspace-skills-status-T7GPT65J.js} +27 -27
  224. package/chunks/{workspace-trust-reconciler-AXOSUTQW.js → workspace-trust-reconciler-2PKRDAU4.js} +31 -31
  225. package/chunks/{write-file-QOYVHAKK.js → write-file-L76CGFTQ.js} +14 -14
  226. package/chunks/{zoom-image-UCCLGFNC.js → zoom-image-TDJJY2VZ.js} +2 -2
  227. package/cli.js +13 -13
  228. package/export-transcript-document.js +126 -122
  229. package/package.json +3 -3
  230. package/web-shell/assets/{abnfDiagram-VCTEODGH-CTstZpXw.js → abnfDiagram-VCTEODGH-DHc6plZn.js} +1 -1
  231. package/web-shell/assets/{arc-DKW0mbPo.js → arc-BQ9m8TDV.js} +1 -1
  232. package/web-shell/assets/{architectureDiagram-5GKGNRK7-DkMpJ42t.js → architectureDiagram-5GKGNRK7-D5ap3oVB.js} +1 -1
  233. package/web-shell/assets/{blockDiagram-NRAW4CY4-7Cp1_4i3.js → blockDiagram-NRAW4CY4-BIbnyNph.js} +1 -1
  234. package/web-shell/assets/{c4Diagram-UCG6FXSJ-BfaoSlBK.js → c4Diagram-UCG6FXSJ-BRsdx_iG.js} +1 -1
  235. package/web-shell/assets/channel-uMMdTrYk.js +1 -0
  236. package/web-shell/assets/{chunk-2Q5K7J3B-_n1qzAio.js → chunk-2Q5K7J3B-3lf1fNlx.js} +1 -1
  237. package/web-shell/assets/{chunk-5VM5RSS4-0cira5ZV.js → chunk-5VM5RSS4-DP8VNRc4.js} +1 -1
  238. package/web-shell/assets/{chunk-F27PBJKO-DseRXSHC.js → chunk-F27PBJKO-DrohDmZ6.js} +1 -1
  239. package/web-shell/assets/{chunk-G27WJ6UU-BehQWin0.js → chunk-G27WJ6UU-UZ2QhSx6.js} +1 -1
  240. package/web-shell/assets/{chunk-JWPE2WC7-B5ftg1Bb.js → chunk-JWPE2WC7-BIMHVcZK.js} +1 -1
  241. package/web-shell/assets/{chunk-LCL6LL3I-D7rnbVdk.js → chunk-LCL6LL3I-izRxdSDd.js} +1 -1
  242. package/web-shell/assets/{chunk-POPQ4Y6H-2Bp-Orju.js → chunk-POPQ4Y6H-CXADD4PP.js} +1 -1
  243. package/web-shell/assets/{chunk-SVP7TREG-CD2goGva.js → chunk-SVP7TREG-B96d8Y_1.js} +1 -1
  244. package/web-shell/assets/{chunk-XXDRQBXY-DzQt-Rji.js → chunk-XXDRQBXY-CF2sVQpv.js} +1 -1
  245. package/web-shell/assets/classDiagram-DTDB5LWJ-DcY-26Ig.js +1 -0
  246. package/web-shell/assets/classDiagram-v2-JRS7N3AN-DcY-26Ig.js +1 -0
  247. package/web-shell/assets/{cose-bilkent-JH36ORCC-C-BZXSUn.js → cose-bilkent-JH36ORCC-CT6tXVAS.js} +1 -1
  248. package/web-shell/assets/csv-CX7rUNeC.svg +1 -0
  249. package/web-shell/assets/{cynefin-OW5HDTMX-BTcvowe1.js → cynefin-OW5HDTMX-X1NS4vtV.js} +1 -1
  250. package/web-shell/assets/{cynefinDiagram-5FMLGOSQ-BoUE6K81.js → cynefinDiagram-5FMLGOSQ-DNsKNOT4.js} +1 -1
  251. package/web-shell/assets/{dagre-3AP2YEHR-BHxy9xeB.js → dagre-3AP2YEHR-9-AHKqsb.js} +1 -1
  252. package/web-shell/assets/{diagram-S7CK7UJ4-DMiJIvDT.js → diagram-S7CK7UJ4-Bjgms7j6.js} +1 -1
  253. package/web-shell/assets/{diagram-UQ7AKVKN-DXV09Aes.js → diagram-UQ7AKVKN-h6bCprbE.js} +1 -1
  254. package/web-shell/assets/{diagram-VSXAHHWV-CocpRomV.js → diagram-VSXAHHWV-4SbQXVLt.js} +1 -1
  255. package/web-shell/assets/{diagram-VX7I27RA-DL7nqtb4.js → diagram-VX7I27RA-B5gPCzzB.js} +1 -1
  256. package/web-shell/assets/{diagram-Z3DM3KII-CPZ2Jux_.js → diagram-Z3DM3KII-DFJXIA3A.js} +1 -1
  257. package/web-shell/assets/{ebnfDiagram-PWID7BFC-BX-eVNsX.js → ebnfDiagram-PWID7BFC-FwyaU7VY.js} +1 -1
  258. package/web-shell/assets/{erDiagram-SSCWMZ5O-CPy_Ir6y.js → erDiagram-SSCWMZ5O-8vJQh2te.js} +1 -1
  259. package/web-shell/assets/{flowDiagram-A5DVABFB-eknAOte9.js → flowDiagram-A5DVABFB-BzA_1gMN.js} +1 -1
  260. package/web-shell/assets/{ganttDiagram-EL5Y4UJY-crAxw_t7.js → ganttDiagram-EL5Y4UJY-Co-ABbVX.js} +1 -1
  261. package/web-shell/assets/{gitGraphDiagram-WWUBYQGX-M29pa3Tc.js → gitGraphDiagram-WWUBYQGX-DW_FcyrX.js} +1 -1
  262. package/web-shell/assets/{index-C9R-iojE.js → index-BbMXfhNG.js} +1 -1
  263. package/web-shell/assets/{index-B4TLaxWs.js → index-Bu-rZoJ-.js} +462 -454
  264. package/web-shell/assets/index-CsPwZ1ut.css +36 -0
  265. package/web-shell/assets/{infoDiagram-RXCK75RN-XqspXdOU.js → infoDiagram-RXCK75RN-BEgfhUFN.js} +1 -1
  266. package/web-shell/assets/{ishikawaDiagram-5VMMS53U-C5KFS-7j.js → ishikawaDiagram-5VMMS53U-DCsMxQmc.js} +1 -1
  267. package/web-shell/assets/{journeyDiagram-EYS64GPL-Cc57LVRo.js → journeyDiagram-EYS64GPL-DyIEYoHz.js} +1 -1
  268. package/web-shell/assets/{kanban-definition-3QL26DDD-C81OG-AI.js → kanban-definition-3QL26DDD-CkxjqCNr.js} +1 -1
  269. package/web-shell/assets/{layout-CFVu37BB.js → layout-BEWc0Al9.js} +1 -1
  270. package/web-shell/assets/{linear-ChBxdtWf.js → linear-CNuNxirL.js} +1 -1
  271. package/web-shell/assets/{mermaid.core-CMLfue0w.js → mermaid.core-DZBre674.js} +6 -6
  272. package/web-shell/assets/{mindmap-definition-FBJOCRG2-DFsvJThp.js → mindmap-definition-FBJOCRG2-CpafFz_F.js} +1 -1
  273. package/web-shell/assets/{pegDiagram-XKGWAZYB-BzpRzM4F.js → pegDiagram-XKGWAZYB-DfZqk_dq.js} +1 -1
  274. package/web-shell/assets/{pieDiagram-E7YTZNPT-Cv0Kankl.js → pieDiagram-E7YTZNPT-S0UWXlgC.js} +1 -1
  275. package/web-shell/assets/{quadrantDiagram-AXDQQJYC-Bh2BJ3Ay.js → quadrantDiagram-AXDQQJYC-dd37_Ohj.js} +1 -1
  276. package/web-shell/assets/{railroadDiagram-O6MQD6OU-y8rNDdDS.js → railroadDiagram-O6MQD6OU-CH8NJZ7u.js} +1 -1
  277. package/web-shell/assets/{requirementDiagram-EFPCY7ZU-C0m2DKJ_.js → requirementDiagram-EFPCY7ZU-CFdqWYih.js} +1 -1
  278. package/web-shell/assets/{sankeyDiagram-P5KCCOFB-BzdGnSF4.js → sankeyDiagram-P5KCCOFB-CsddcEGD.js} +1 -1
  279. package/web-shell/assets/{sequenceDiagram-WJ2MYXX4-DPzAVmzz.js → sequenceDiagram-WJ2MYXX4-BZ270mGw.js} +1 -1
  280. package/web-shell/assets/{sizeCapture-X5ZJPWSS-LcHG28Zh.js → sizeCapture-X5ZJPWSS-CGaS4DBV.js} +1 -1
  281. package/web-shell/assets/{stateDiagram-HBIQ2CUA-C1Bzy3IT.js → stateDiagram-HBIQ2CUA-COpIzMu6.js} +1 -1
  282. package/web-shell/assets/stateDiagram-v2-4QOOHH4V-D6qEVAji.js +1 -0
  283. package/web-shell/assets/{swimlanes-XN3QIQJK-Bftk8V64.js → swimlanes-XN3QIQJK-CMF889m3.js} +1 -1
  284. package/web-shell/assets/swimlanesDiagram-VK2B7HYN-mem5Jj4m.js +8 -0
  285. package/web-shell/assets/{timeline-definition-24CTP7MA-BfXHcN1A.js → timeline-definition-24CTP7MA-BelnxYz5.js} +1 -1
  286. package/web-shell/assets/{vennDiagram-4TSXK5OY-DRSlI9-V.js → vennDiagram-4TSXK5OY-CU-NRqIB.js} +1 -1
  287. package/web-shell/assets/{wardleyDiagram-VM6X3IG4-CaLmqGau.js → wardleyDiagram-VM6X3IG4-CDNKqWh-.js} +1 -1
  288. package/web-shell/assets/{xychartDiagram-S5SC5T6Z-8lgUT6e8.js → xychartDiagram-S5SC5T6Z-CLqguL5D.js} +1 -1
  289. package/web-shell/index.html +2 -2
  290. package/chunks/chunk-3UMWOKJC.js +0 -78
  291. package/chunks/chunk-IQAFKVXS.js +0 -22
  292. package/web-shell/assets/channel-CQx7VSAp.js +0 -1
  293. package/web-shell/assets/classDiagram-DTDB5LWJ-C-Uz8hHk.js +0 -1
  294. package/web-shell/assets/classDiagram-v2-JRS7N3AN-C-Uz8hHk.js +0 -1
  295. package/web-shell/assets/index-CCrkEbzz.css +0 -36
  296. package/web-shell/assets/stateDiagram-v2-4QOOHH4V-LuuL5byY.js +0 -1
  297. package/web-shell/assets/swimlanesDiagram-VK2B7HYN-COmnNq8s.js +0 -8
@@ -14,7 +14,7 @@ import {
14
14
  sanitizePromptText,
15
15
  sanitizeSenderName,
16
16
  truncateUtf16Units
17
- } from "./chunk-65GHQ4FX.js";
17
+ } from "./chunk-XVTCSVBK.js";
18
18
  import "./chunk-IW6RQPQB.js";
19
19
  import "./chunk-CQ35AJ4Z.js";
20
20
  import "./chunk-DMTGGOSA.js";
@@ -6933,6 +6933,95 @@ __name(parseDingtalkCardActorId, "parseDingtalkCardActorId");
6933
6933
  // packages/channels/dingtalk/dist/status-card-controller.js
6934
6934
  init_esbuild_shims();
6935
6935
  import { randomUUID as randomUUID2 } from "node:crypto";
6936
+
6937
+ // packages/channels/dingtalk/dist/presentation-phase.js
6938
+ init_esbuild_shims();
6939
+ var DINGTALK_PRESENTATION_PHASE_LABELS = {
6940
+ thinking: "\u{1F914} Thinking",
6941
+ reading: "\u{1F4D6} Reading",
6942
+ searching: "\u{1F50E} Searching",
6943
+ running: "\u{1F5A5}\uFE0F Running",
6944
+ editing: "\u{1F6E0}\uFE0F Editing",
6945
+ deleting: "\u{1F5D1}\uFE0F Deleting",
6946
+ moving: "\u{1F4E6} Moving",
6947
+ fetching: "\u{1F310} Fetching",
6948
+ switching: "\u{1F504} Switching mode",
6949
+ working: "\u{1F6E0}\uFE0F Working",
6950
+ failed: "\u26A0\uFE0F Tool failed",
6951
+ replying: "\u270D\uFE0F Replying"
6952
+ };
6953
+ var DINGTALK_ZH_PRESENTATION_PHASE_LABELS = {
6954
+ thinking: "\u{1F914} \u601D\u8003\u4E2D",
6955
+ reading: "\u{1F4D6} \u8BFB\u53D6\u4E2D",
6956
+ searching: "\u{1F50E} \u641C\u7D22\u4E2D",
6957
+ running: "\u{1F5A5}\uFE0F \u6267\u884C\u4E2D",
6958
+ editing: "\u{1F6E0}\uFE0F \u7F16\u8F91\u4E2D",
6959
+ deleting: "\u{1F5D1}\uFE0F \u5220\u9664\u4E2D",
6960
+ moving: "\u{1F4E6} \u79FB\u52A8\u4E2D",
6961
+ fetching: "\u{1F310} \u83B7\u53D6\u4E2D",
6962
+ switching: "\u{1F504} \u5207\u6362\u6A21\u5F0F\u4E2D",
6963
+ working: "\u{1F6E0}\uFE0F \u5904\u7406\u4E2D",
6964
+ failed: "\u26A0\uFE0F \u5DE5\u5177\u5931\u8D25",
6965
+ replying: "\u270D\uFE0F \u56DE\u590D\u4E2D"
6966
+ };
6967
+ function isChinesePresentationLanguage(language) {
6968
+ const normalized = language?.trim().toLowerCase().replaceAll("_", "-");
6969
+ return normalized === "zh" || normalized === "zh-cn";
6970
+ }
6971
+ __name(isChinesePresentationLanguage, "isChinesePresentationLanguage");
6972
+ function presentationPhaseLabel(phase, language) {
6973
+ return (isChinesePresentationLanguage(language) ? DINGTALK_ZH_PRESENTATION_PHASE_LABELS : DINGTALK_PRESENTATION_PHASE_LABELS)[phase];
6974
+ }
6975
+ __name(presentationPhaseLabel, "presentationPhaseLabel");
6976
+ function toolPresentationPhase(kind) {
6977
+ switch (kind.trim().toLowerCase()) {
6978
+ case "read":
6979
+ return "reading";
6980
+ case "edit":
6981
+ return "editing";
6982
+ case "delete":
6983
+ return "deleting";
6984
+ case "move":
6985
+ return "moving";
6986
+ case "search":
6987
+ return "searching";
6988
+ case "execute":
6989
+ return "running";
6990
+ case "think":
6991
+ return "thinking";
6992
+ case "fetch":
6993
+ return "fetching";
6994
+ case "switch_mode":
6995
+ return "switching";
6996
+ case "other":
6997
+ return "working";
6998
+ default:
6999
+ if (/read/iu.test(kind))
7000
+ return "reading";
7001
+ if (/search|browser|web/iu.test(kind))
7002
+ return "searching";
7003
+ if (/shell|exec|command|run/iu.test(kind))
7004
+ return "running";
7005
+ if (/edit|write|patch/iu.test(kind))
7006
+ return "editing";
7007
+ return "working";
7008
+ }
7009
+ }
7010
+ __name(toolPresentationPhase, "toolPresentationPhase");
7011
+ function lifecyclePresentationPhase(event) {
7012
+ if (event.type === "text_chunk")
7013
+ return "replying";
7014
+ if (event.type !== "tool_call")
7015
+ return void 0;
7016
+ if (/fail|error/iu.test(event.toolCall.status))
7017
+ return "failed";
7018
+ if (/complete|success/iu.test(event.toolCall.status))
7019
+ return "thinking";
7020
+ return toolPresentationPhase(event.toolCall.kind);
7021
+ }
7022
+ __name(lifecyclePresentationPhase, "lifecyclePresentationPhase");
7023
+
7024
+ // packages/channels/dingtalk/dist/status-card-controller.js
6936
7025
  var FLUSH_INTERVAL_MS = 500;
6937
7026
  var STATUS_REFRESH_INTERVAL_MS = 1e3;
6938
7027
  var CONTENT_SYNC_INTERVAL_SECONDS = 5;
@@ -6948,6 +7037,23 @@ function boundContent(content) {
6948
7037
  return `${TRUNCATION_MARKER}${content.slice(content.length - (CONTENT_LIMIT - TRUNCATION_MARKER.length))}`;
6949
7038
  }
6950
7039
  __name(boundContent, "boundContent");
7040
+ function activeContent(phase, content, language, sourcePrefix) {
7041
+ const label = presentationPhaseLabel(phase, language);
7042
+ const sanitized = sanitizeStreamingImageMarkers(content);
7043
+ const renderedSourcePrefix = sourcePrefix && (sanitized === sourcePrefix || sanitized.startsWith(`${sourcePrefix}
7044
+
7045
+ `)) ? sourcePrefix : void 0;
7046
+ const body = renderedSourcePrefix ? sanitized.slice(renderedSourcePrefix.length + (sanitized.length === renderedSourcePrefix.length ? 0 : 2)) : sanitized;
7047
+ const prefix = [label, renderedSourcePrefix].filter(Boolean).join("\n\n");
7048
+ if (!body)
7049
+ return prefix;
7050
+ const separator = "\n\n";
7051
+ const available = CONTENT_LIMIT - prefix.length - separator.length;
7052
+ if (body.length <= available)
7053
+ return `${prefix}${separator}${body}`;
7054
+ return `${prefix}${separator}${TRUNCATION_MARKER}${body.slice(body.length - (available - TRUNCATION_MARKER.length))}`;
7055
+ }
7056
+ __name(activeContent, "activeContent");
6951
7057
  var StatusCardController = class {
6952
7058
  static {
6953
7059
  __name(this, "StatusCardController");
@@ -7080,6 +7186,8 @@ var StatusCardController = class {
7080
7186
  target,
7081
7187
  outTrackId,
7082
7188
  content: boundContent(initialContent),
7189
+ ...segment.sourceLabel ? { sourcePrefix: escapeDingTalkMarkdown(segment.sourceLabel) } : {},
7190
+ phase: "thinking",
7083
7191
  startedAt: Date.now(),
7084
7192
  lastStatusSecond: 0,
7085
7193
  lastContentSyncSecond: 0,
@@ -7114,6 +7222,20 @@ var StatusCardController = class {
7114
7222
  complete(segmentId, text, retainedContent) {
7115
7223
  return this.finalize(segmentId, boundContent(text), "Completed", false, retainedContent);
7116
7224
  }
7225
+ updateRunPhase(runId, phase) {
7226
+ if (this.disposed)
7227
+ return;
7228
+ for (const segmentId of this.segmentIdsByRun.get(runId) ?? []) {
7229
+ const record = this.recordsBySegment.get(segmentId);
7230
+ if (!record || record.terminal || record.streamFailed || record.phase === phase) {
7231
+ continue;
7232
+ }
7233
+ record.phase = phase;
7234
+ record.contentVersion++;
7235
+ record.hasPendingWrite = true;
7236
+ this.scheduleFlush(record);
7237
+ }
7238
+ }
7117
7239
  fail(segmentId, error) {
7118
7240
  void this.finalize(segmentId, boundContent(error), "Failed", true);
7119
7241
  }
@@ -7169,9 +7291,9 @@ var StatusCardController = class {
7169
7291
  outTrackId: record.outTrackId,
7170
7292
  target,
7171
7293
  cardParamMap: {
7172
- content: sanitizeStreamingImageMarkers(record.content),
7294
+ content: activeContent(record.phase, record.content, this.options.language, record.sourcePrefix),
7173
7295
  flowStatus: 2,
7174
- statusLine: this.statusLine(record, "Running").text,
7296
+ statusLine: this.statusLine(record).text,
7175
7297
  hasAction: "true",
7176
7298
  stop_action: "true"
7177
7299
  }
@@ -7196,7 +7318,7 @@ var StatusCardController = class {
7196
7318
  await this.options.client.openOrUpdateStream({
7197
7319
  outTrackId: record.outTrackId,
7198
7320
  key: "content",
7199
- content: sanitizeStreamingImageMarkers(record.content),
7321
+ content: activeContent(record.phase, record.content, this.options.language, record.sourcePrefix),
7200
7322
  finalize: false
7201
7323
  });
7202
7324
  } catch (error) {
@@ -7245,7 +7367,7 @@ var StatusCardController = class {
7245
7367
  await this.options.client.openOrUpdateStream({
7246
7368
  outTrackId: record.outTrackId,
7247
7369
  key: "content",
7248
- content: sanitizeStreamingImageMarkers(record.content),
7370
+ content: activeContent(record.phase, record.content, this.options.language, record.sourcePrefix),
7249
7371
  finalize: false
7250
7372
  });
7251
7373
  contentWritten = true;
@@ -7448,14 +7570,28 @@ var StatusCardController = class {
7448
7570
  const second = Math.max(0, Math.floor((Date.now() - record.startedAt) / 1e3));
7449
7571
  const model = this.options.model?.trim();
7450
7572
  return {
7451
- text: [state, model, `${second}s`].filter(Boolean).join(" \xB7 "),
7573
+ text: [
7574
+ state ? this.statusStateLabel(state) : void 0,
7575
+ model,
7576
+ `${second}s`
7577
+ ].filter(Boolean).join(" \xB7 "),
7452
7578
  second
7453
7579
  };
7454
7580
  }
7581
+ statusStateLabel(state) {
7582
+ if (!isChinesePresentationLanguage(this.options.language))
7583
+ return state;
7584
+ return {
7585
+ Completed: "\u5DF2\u5B8C\u6210",
7586
+ Failed: "\u5DF2\u5931\u8D25",
7587
+ Stopped: "\u5DF2\u7EC8\u6B62",
7588
+ Cancelled: "\u5DF2\u53D6\u6D88"
7589
+ }[state] ?? state;
7590
+ }
7455
7591
  async updateRunningStatus(record) {
7456
7592
  if (this.disposed || record.terminal || record.streamFailed)
7457
7593
  return;
7458
- const status = this.statusLine(record, "Running");
7594
+ const status = this.statusLine(record);
7459
7595
  if (status.second === record.lastStatusSecond)
7460
7596
  return;
7461
7597
  const syncContent = status.second - record.lastContentSyncSecond >= CONTENT_SYNC_INTERVAL_SECONDS;
@@ -7463,7 +7599,9 @@ var StatusCardController = class {
7463
7599
  await this.options.client.updateInstance({
7464
7600
  outTrackId: record.outTrackId,
7465
7601
  cardParamMap: {
7466
- ...syncContent ? { content: sanitizeStreamingImageMarkers(record.content) } : {},
7602
+ ...syncContent ? {
7603
+ content: activeContent(record.phase, record.content, this.options.language, record.sourcePrefix)
7604
+ } : {},
7467
7605
  statusLine: status.text
7468
7606
  }
7469
7607
  });
@@ -7905,6 +8043,12 @@ var DingtalkInteractionPresenter = class {
7905
8043
  statusCards?.replace(statusContext, target, this.withSourcePrefix(run, ""));
7906
8044
  });
7907
8045
  }
8046
+ updateStatusCardPhase(runId, phase) {
8047
+ const run = this.runs.get(runId);
8048
+ if (!run || run.terminal)
8049
+ return;
8050
+ void this.enqueue(run, () => this.options.statusCards?.updateRunPhase(runId, phase));
8051
+ }
7908
8052
  appendOutput(segment, chunk) {
7909
8053
  const run = this.runs.get(segment.runId);
7910
8054
  if (!run || run.terminal || run.ownerId !== segment.owner.id || run.target.chatId !== segment.target.chatId || run.target.isGroup !== segment.target.isGroup || !chunk || this.terminalSegmentIds.has(segment.segmentId)) {
@@ -8005,6 +8149,20 @@ var DingtalkInteractionPresenter = class {
8005
8149
  return Promise.resolve({ kind: "unsupported" });
8006
8150
  return questionCards.present(context, this.cardTarget(context.target));
8007
8151
  }
8152
+ terminalCopy() {
8153
+ if (this.options.language !== void 0 && !isChinesePresentationLanguage(this.options.language)) {
8154
+ return {
8155
+ failed: "Processing failed, please try again later.",
8156
+ stopped: "Task stopped",
8157
+ cancelled: "Task cancelled"
8158
+ };
8159
+ }
8160
+ return {
8161
+ failed: "\u672C\u6B21\u5904\u7406\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",
8162
+ stopped: "\u4EFB\u52A1\u5DF2\u505C\u6B62",
8163
+ cancelled: "\u4EFB\u52A1\u5DF2\u53D6\u6D88"
8164
+ };
8165
+ }
8008
8166
  terminalizeRun(runId, terminal, detail = "") {
8009
8167
  const run = this.runs.get(runId);
8010
8168
  if (!run || run.terminal)
@@ -8017,16 +8175,17 @@ var DingtalkInteractionPresenter = class {
8017
8175
  this.segments.delete(activeSegmentId);
8018
8176
  this.addTerminalSegment(activeSegmentId);
8019
8177
  }
8178
+ const copy = this.terminalCopy();
8020
8179
  const finalization = this.enqueue(run, async () => {
8021
8180
  if (terminal === "failed") {
8022
8181
  const statusContext = this.ensureStatusContext(run);
8023
8182
  this.options.statusCards?.ensure(statusContext, this.cardTarget(statusContext.target));
8024
- this.options.statusCards?.fail(statusContext.segmentId, this.withSenderPrefix(run, "\u672C\u6B21\u5904\u7406\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"));
8183
+ this.options.statusCards?.fail(statusContext.segmentId, this.withSenderPrefix(run, copy.failed));
8025
8184
  await this.redeliverCardDeliveredContent(run);
8026
8185
  } else if (terminal === "cancelled") {
8027
8186
  const statusContext = run.statusContext;
8028
8187
  if (statusContext) {
8029
- this.options.statusCards?.replace(statusContext, this.cardTarget(statusContext.target), this.withSenderPrefix(run, detail === "cancel_command" ? "\u4EFB\u52A1\u5DF2\u505C\u6B62" : "\u4EFB\u52A1\u5DF2\u53D6\u6D88"));
8188
+ this.options.statusCards?.replace(statusContext, this.cardTarget(statusContext.target), this.withSenderPrefix(run, detail === "cancel_command" ? copy.stopped : copy.cancelled));
8030
8189
  }
8031
8190
  this.options.statusCards?.cancelRun(runId, detail === "cancel_command" ? "cancel_command" : "dropped");
8032
8191
  await this.redeliverCardDeliveredContent(run);
@@ -8388,9 +8547,15 @@ var BACKGROUND_RESPONSE_AGGREGATION_MAX_RETRIES = 3;
8388
8547
  var ACK_REACTION_NAME = "\u{1F440}";
8389
8548
  var ACK_EMOTION_ID = "2659900";
8390
8549
  var ACK_EMOTION_BG_ID = "im_bg_1";
8550
+ var STATUS_EMOTION_ID = "34019";
8551
+ var STATUS_EMOTION_BG_ID = "im_bg_6";
8552
+ var DONE_EMOTION_ID = "54054";
8553
+ var DONE_EMOTION_BG_ID = "im_bg_5";
8391
8554
  var EMOTION_API = "https://api.dingtalk.com/v1.0/robot/emotion";
8392
8555
  var EMOTION_MAX_ATTEMPTS = 3;
8393
8556
  var EMOTION_RETRY_BASE_DELAY_MS = 250;
8557
+ var EMOTION_FETCH_TIMEOUT_MS = 15e3;
8558
+ var EMOTION_FINISH_MAX_ATTEMPTS = 3;
8394
8559
  var GROUP_MSG_API = "https://api.dingtalk.com/v1.0/robot/groupMessages/send";
8395
8560
  var DIRECT_MSG_API = "https://api.dingtalk.com/v1.0/robot/oToMessages/batchSend";
8396
8561
  var PROACTIVE_MSG_KEY = "sampleMarkdown";
@@ -8518,6 +8683,26 @@ var FILE_INSTRUCTIONS = [
8518
8683
  "File paths containing ] are not supported.",
8519
8684
  "Do not claim delivery succeeded; DingTalk shows successful files separately and reports failures in the final text."
8520
8685
  ].join("\n");
8686
+ function statusEmotionTag(name) {
8687
+ return {
8688
+ name,
8689
+ emotionId: STATUS_EMOTION_ID,
8690
+ backgroundId: STATUS_EMOTION_BG_ID
8691
+ };
8692
+ }
8693
+ __name(statusEmotionTag, "statusEmotionTag");
8694
+ var EYE_TAG = {
8695
+ name: ACK_REACTION_NAME,
8696
+ emotionId: ACK_EMOTION_ID,
8697
+ backgroundId: ACK_EMOTION_BG_ID
8698
+ };
8699
+ var DONE_TAG = {
8700
+ name: "\u2705 Done",
8701
+ emotionId: DONE_EMOTION_ID,
8702
+ backgroundId: DONE_EMOTION_BG_ID
8703
+ };
8704
+ var FAILED_TAG = statusEmotionTag("\u274C Failed");
8705
+ var STOPPED_TAG = statusEmotionTag("\u23F9\uFE0F Stopped");
8521
8706
  function collectNonBotMentionIds(data) {
8522
8707
  if (!Array.isArray(data.atUsers) || typeof data.chatbotUserId !== "string") {
8523
8708
  return [];
@@ -8585,6 +8770,7 @@ var DingtalkChannel = class _DingtalkChannel extends ChannelBase {
8585
8770
  }
8586
8771
  client;
8587
8772
  atSender;
8773
+ displayLanguage;
8588
8774
  connectionManager;
8589
8775
  seenMessages = /* @__PURE__ */ new Map();
8590
8776
  mentionTargets = /* @__PURE__ */ new Map();
@@ -8595,8 +8781,11 @@ var DingtalkChannel = class _DingtalkChannel extends ChannelBase {
8595
8781
  /** Map conversationId → latest sessionWebhook URL for sending replies. */
8596
8782
  webhooks = /* @__PURE__ */ new Map();
8597
8783
  activeReactionKeys = /* @__PURE__ */ new Set();
8784
+ reactionStates = /* @__PURE__ */ new Map();
8598
8785
  /** sessionId → reaction keys, so a dead session's reactions can be recalled. */
8599
8786
  sessionReactionKeys = /* @__PURE__ */ new Map();
8787
+ /** Settles when the reaction cleanup queued by disconnect() has run. */
8788
+ disconnectDrain;
8600
8789
  /**
8601
8790
  * Real inbound message ids (insertion-ordered, size-capped). Unlike the
8602
8791
  * TTL-swept seenMessages dedup map, entries survive long queue waits, so a
@@ -8636,6 +8825,7 @@ var DingtalkChannel = class _DingtalkChannel extends ChannelBase {
8636
8825
  constructor(name, config, bridge, options) {
8637
8826
  super(name, config, bridge, options);
8638
8827
  this.atSender = config["atSender"] === true;
8828
+ this.displayLanguage = options?.displayLanguage;
8639
8829
  if (!this.config.instructions) {
8640
8830
  this.config.instructions = [
8641
8831
  "## DingTalk Channel",
@@ -8679,6 +8869,7 @@ var DingtalkChannel = class _DingtalkChannel extends ChannelBase {
8679
8869
  client: this.interactiveCardClient,
8680
8870
  cancelRun: /* @__PURE__ */ __name((sessionId, runId) => this.requestPromptRunCancellation(sessionId, runId), "cancelRun"),
8681
8871
  ...config.model ? { model: config.model } : {},
8872
+ ...options?.displayLanguage ? { language: options.displayLanguage } : {},
8682
8873
  onError: /* @__PURE__ */ __name((operation, error) => {
8683
8874
  process.stderr.write(`[DingTalk:${this.name}] ${operation} failed: ${sanitizeLogText(String(error), 300)}
8684
8875
  `);
@@ -8701,6 +8892,7 @@ var DingtalkChannel = class _DingtalkChannel extends ChannelBase {
8701
8892
  this.interactionPresenter = new DingtalkInteractionPresenter({
8702
8893
  statusCards: this.statusCardController,
8703
8894
  questionCards: this.questionCardController,
8895
+ ...options?.displayLanguage ? { language: options.displayLanguage } : {},
8704
8896
  ...config.blockStreaming !== "on" ? {
8705
8897
  sendFallback: /* @__PURE__ */ __name((chatId, text, sessionId, sourceLabel) => this.sendFallbackReply(chatId, text, sessionId, sourceLabel), "sendFallback")
8706
8898
  } : {}
@@ -9351,14 +9543,14 @@ var DingtalkChannel = class _DingtalkChannel extends ChannelBase {
9351
9543
  getAccessToken() {
9352
9544
  return this.client.getConfig().access_token;
9353
9545
  }
9354
- async emotionApi(endpoint, msgId, conversationId) {
9546
+ async emotionApi(endpoint, msgId, conversationId, tag) {
9355
9547
  const robotCode = this.config.clientId;
9356
9548
  if (!robotCode || !msgId || !conversationId)
9357
- return;
9549
+ return false;
9358
9550
  try {
9359
9551
  const token = this.config.clientSecret ? await this.getProactiveToken() : this.getAccessToken();
9360
9552
  if (!token)
9361
- return;
9553
+ return false;
9362
9554
  for (let attempt = 0; attempt < EMOTION_MAX_ATTEMPTS; attempt++) {
9363
9555
  const resp = await fetch(`${EMOTION_API}/${endpoint}`, {
9364
9556
  method: "POST",
@@ -9371,17 +9563,18 @@ var DingtalkChannel = class _DingtalkChannel extends ChannelBase {
9371
9563
  openMsgId: msgId,
9372
9564
  openConversationId: conversationId,
9373
9565
  emotionType: 2,
9374
- emotionName: ACK_REACTION_NAME,
9566
+ emotionName: tag.name,
9375
9567
  textEmotion: {
9376
- emotionId: ACK_EMOTION_ID,
9377
- emotionName: ACK_REACTION_NAME,
9378
- text: ACK_REACTION_NAME,
9379
- backgroundId: ACK_EMOTION_BG_ID
9568
+ emotionId: tag.emotionId,
9569
+ emotionName: tag.name,
9570
+ text: tag.name,
9571
+ backgroundId: tag.backgroundId
9380
9572
  }
9381
- })
9573
+ }),
9574
+ signal: AbortSignal.timeout(EMOTION_FETCH_TIMEOUT_MS)
9382
9575
  });
9383
9576
  if (resp.ok)
9384
- return;
9577
+ return true;
9385
9578
  const isTransient = resp.status === 429 || resp.status >= 500;
9386
9579
  if (isTransient && attempt < EMOTION_MAX_ATTEMPTS - 1) {
9387
9580
  await resp.body?.cancel();
@@ -9391,25 +9584,31 @@ var DingtalkChannel = class _DingtalkChannel extends ChannelBase {
9391
9584
  const detail = sanitizeLogText(await resp.text().catch(() => ""), 500);
9392
9585
  process.stderr.write(`[DingTalk:${this.name}] emotion/${endpoint} failed after ${attempt + 1}/${EMOTION_MAX_ATTEMPTS} attempts: ${resp.status} ${detail}
9393
9586
  `);
9394
- return;
9587
+ return false;
9395
9588
  }
9396
9589
  } catch {
9397
9590
  }
9591
+ return false;
9398
9592
  }
9399
- async attachReaction(msgId, conversationId) {
9400
- await this.emotionApi("reply", msgId, conversationId);
9593
+ async attachReaction(msgId, conversationId, tag = EYE_TAG) {
9594
+ return this.emotionApi("reply", msgId, conversationId, tag);
9401
9595
  }
9402
- async recallReaction(msgId, conversationId) {
9403
- await this.emotionApi("recall", msgId, conversationId);
9596
+ async recallReaction(msgId, conversationId, tag = EYE_TAG) {
9597
+ return this.emotionApi("recall", msgId, conversationId, tag);
9404
9598
  }
9405
9599
  disconnect() {
9406
9600
  if (this.dedupTimer) {
9407
9601
  clearInterval(this.dedupTimer);
9408
9602
  }
9603
+ const reactionStates = [...this.reactionStates.values()];
9604
+ for (const state of reactionStates) {
9605
+ this.finishReaction(state.chatId, state.messageId, state.sessionId);
9606
+ }
9409
9607
  this.statusCardController?.dispose();
9410
9608
  this.drainBackgroundResponseAggregations();
9411
9609
  this.activeReactionKeys.clear();
9412
9610
  this.sessionReactionKeys.clear();
9611
+ this.reactionStates.clear();
9413
9612
  if (this.connectionManager) {
9414
9613
  this.connectionManager.stop();
9415
9614
  } else {
@@ -9417,6 +9616,10 @@ var DingtalkChannel = class _DingtalkChannel extends ChannelBase {
9417
9616
  }
9418
9617
  process.stderr.write(`[DingTalk:${this.name}] Disconnected.
9419
9618
  `);
9619
+ this.disconnectDrain = Promise.allSettled(reactionStates.map((state) => state.tail)).then(() => void 0);
9620
+ }
9621
+ waitForDisconnect() {
9622
+ return this.disconnectDrain ?? Promise.resolve();
9420
9623
  }
9421
9624
  /** Stable API targets are conversation or user IDs, never webhook URLs. */
9422
9625
  isStableTargetId(chatId) {
@@ -9425,6 +9628,111 @@ var DingtalkChannel = class _DingtalkChannel extends ChannelBase {
9425
9628
  reactionKey(messageId, conversationId) {
9426
9629
  return `${conversationId}:${messageId}`;
9427
9630
  }
9631
+ forgetReactionState(state) {
9632
+ this.activeReactionKeys.delete(state.key);
9633
+ if (this.reactionStates.get(state.key) === state) {
9634
+ this.reactionStates.delete(state.key);
9635
+ }
9636
+ if (!state.sessionId)
9637
+ return;
9638
+ const keys = this.sessionReactionKeys.get(state.sessionId);
9639
+ keys?.delete(state.key);
9640
+ if (keys?.size === 0)
9641
+ this.sessionReactionKeys.delete(state.sessionId);
9642
+ }
9643
+ enqueueReaction(state, operation) {
9644
+ state.tail = state.tail.then(operation).catch((err) => {
9645
+ this.logReactionFailure("lifecycle tag update", err);
9646
+ });
9647
+ }
9648
+ scheduleReactionDrain(state) {
9649
+ if (state.drainScheduled)
9650
+ return;
9651
+ state.drainScheduled = true;
9652
+ this.enqueueReaction(state, async () => {
9653
+ try {
9654
+ await this.drainReactionState(state);
9655
+ } finally {
9656
+ state.drainScheduled = false;
9657
+ if (this.reactionStates.get(state.key) === state && (state.finishing ? !state.finishBlocked : this.activeReactionKeys.has(state.key) && state.desiredStatusTag && state.desiredStatusTag.name !== state.statusTag?.name)) {
9658
+ this.scheduleReactionDrain(state);
9659
+ }
9660
+ }
9661
+ });
9662
+ }
9663
+ async drainReactionState(state) {
9664
+ while (true) {
9665
+ if (state.finishing) {
9666
+ await this.finishReactionState(state);
9667
+ return;
9668
+ }
9669
+ if (this.reactionStates.get(state.key) !== state || !this.activeReactionKeys.has(state.key)) {
9670
+ return;
9671
+ }
9672
+ const desired = state.desiredStatusTag;
9673
+ if (!desired || desired.name === state.statusTag?.name)
9674
+ return;
9675
+ const latched = state.failedTransition;
9676
+ if (state.statusTag) {
9677
+ const from = state.statusTag.name;
9678
+ if (latched && latched.from === from && latched.to === desired.name) {
9679
+ state.desiredStatusTag = state.statusTag;
9680
+ return;
9681
+ }
9682
+ const revision2 = state.revision;
9683
+ if (await this.recallReaction(state.messageId, state.chatId, state.statusTag) === false) {
9684
+ state.failedTransition = { from, to: desired.name };
9685
+ if (state.revision !== revision2)
9686
+ continue;
9687
+ state.desiredStatusTag = state.statusTag;
9688
+ return;
9689
+ }
9690
+ state.failedTransition = void 0;
9691
+ state.statusTag = void 0;
9692
+ continue;
9693
+ }
9694
+ if (latched && latched.from === void 0 && latched.to === desired.name) {
9695
+ state.desiredStatusTag = void 0;
9696
+ return;
9697
+ }
9698
+ const revision = state.revision;
9699
+ if (await this.attachReaction(state.messageId, state.chatId, desired) === false) {
9700
+ state.failedTransition = { from: void 0, to: desired.name };
9701
+ if (state.revision !== revision)
9702
+ continue;
9703
+ state.desiredStatusTag = void 0;
9704
+ return;
9705
+ }
9706
+ state.failedTransition = void 0;
9707
+ state.statusTag = desired;
9708
+ }
9709
+ }
9710
+ async finishReactionState(state) {
9711
+ let statusCleared = true;
9712
+ if (state.statusTag) {
9713
+ statusCleared = await this.recallReaction(state.messageId, state.chatId, state.statusTag) !== false;
9714
+ if (statusCleared)
9715
+ state.statusTag = void 0;
9716
+ }
9717
+ const eyeCleared = !state.eyeAttached || await this.recallReaction(state.messageId, state.chatId, EYE_TAG) !== false;
9718
+ if (eyeCleared)
9719
+ state.eyeAttached = false;
9720
+ let terminalAttached = true;
9721
+ if (state.terminalTag && statusCleared && eyeCleared) {
9722
+ terminalAttached = await this.attachReaction(state.messageId, state.chatId, state.terminalTag) !== false;
9723
+ }
9724
+ if (!statusCleared || !eyeCleared || !terminalAttached) {
9725
+ state.finishAttempts = (state.finishAttempts ?? 0) + 1;
9726
+ if (state.finishAttempts >= EMOTION_FINISH_MAX_ATTEMPTS) {
9727
+ this.logReactionFailure("reaction cleanup", `abandoned after ${state.finishAttempts} attempts`);
9728
+ this.forgetReactionState(state);
9729
+ return;
9730
+ }
9731
+ state.finishBlocked = true;
9732
+ return;
9733
+ }
9734
+ this.forgetReactionState(state);
9735
+ }
9428
9736
  rememberInboundMessageId(msgId) {
9429
9737
  this.inboundMessageIds.delete(msgId);
9430
9738
  this.inboundMessageIds.add(msgId);
@@ -9447,6 +9755,19 @@ var DingtalkChannel = class _DingtalkChannel extends ChannelBase {
9447
9755
  if (this.activeReactionKeys.has(key))
9448
9756
  return;
9449
9757
  this.activeReactionKeys.add(key);
9758
+ const state = {
9759
+ key,
9760
+ messageId,
9761
+ chatId,
9762
+ ...sessionId ? { sessionId } : {},
9763
+ desiredStatusTag: this.phaseReactionTag("thinking"),
9764
+ finishing: false,
9765
+ drainScheduled: false,
9766
+ eyeAttached: false,
9767
+ revision: 0,
9768
+ tail: Promise.resolve()
9769
+ };
9770
+ this.reactionStates.set(key, state);
9450
9771
  if (sessionId) {
9451
9772
  let keys = this.sessionReactionKeys.get(sessionId);
9452
9773
  if (!keys) {
@@ -9455,34 +9776,68 @@ var DingtalkChannel = class _DingtalkChannel extends ChannelBase {
9455
9776
  }
9456
9777
  keys.set(key, { messageId, chatId });
9457
9778
  }
9458
- this.attachReaction(messageId, chatId).then(() => {
9459
- if (!this.activeReactionKeys.has(key)) {
9460
- void this.recallReaction(messageId, chatId).catch((err) => {
9461
- this.logReactionFailure("late reaction recall", err);
9462
- });
9779
+ this.enqueueReaction(state, async () => {
9780
+ try {
9781
+ if (await this.attachReaction(messageId, chatId, EYE_TAG) === false) {
9782
+ this.forgetReactionState(state);
9783
+ return;
9784
+ }
9785
+ state.eyeAttached = true;
9786
+ this.scheduleReactionDrain(state);
9787
+ } catch (err) {
9788
+ this.forgetReactionState(state);
9789
+ this.logReactionFailure("reaction attach", err);
9463
9790
  }
9464
- }).catch((err) => {
9465
- this.activeReactionKeys.delete(key);
9466
- this.logReactionFailure("reaction attach", err);
9467
9791
  });
9468
9792
  }
9469
- stopReaction(chatId, messageId, sessionId) {
9793
+ replaceStatusReaction(chatId, messageId, tag) {
9794
+ if (!messageId)
9795
+ return;
9796
+ const state = this.reactionStates.get(this.reactionKey(messageId, chatId));
9797
+ if (!state || !this.activeReactionKeys.has(state.key))
9798
+ return;
9799
+ state.desiredStatusTag = tag;
9800
+ state.revision++;
9801
+ this.scheduleReactionDrain(state);
9802
+ }
9803
+ phaseReactionTag(phase) {
9804
+ return statusEmotionTag(presentationPhaseLabel(phase, this.displayLanguage));
9805
+ }
9806
+ terminalReactionTag(type) {
9807
+ if (!isChinesePresentationLanguage(this.displayLanguage)) {
9808
+ return type === "completed" ? DONE_TAG : type === "failed" ? FAILED_TAG : STOPPED_TAG;
9809
+ }
9810
+ if (type === "completed") {
9811
+ return { ...DONE_TAG, name: "\u2705 \u5DF2\u5B8C\u6210" };
9812
+ }
9813
+ return statusEmotionTag(type === "failed" ? "\u274C \u5931\u8D25" : "\u23F9\uFE0F \u5DF2\u505C\u6B62");
9814
+ }
9815
+ finishReaction(chatId, messageId, sessionId, terminalTag) {
9470
9816
  if (!messageId || !this.isStableTargetId(chatId))
9471
9817
  return;
9472
9818
  const key = this.reactionKey(messageId, chatId);
9473
- if (sessionId) {
9474
- const keys = this.sessionReactionKeys.get(sessionId);
9475
- if (keys) {
9476
- keys.delete(key);
9477
- if (keys.size === 0)
9478
- this.sessionReactionKeys.delete(sessionId);
9479
- }
9819
+ const state = this.reactionStates.get(key);
9820
+ if (!state)
9821
+ return;
9822
+ if (state.finishing) {
9823
+ if (!state.finishBlocked)
9824
+ return;
9825
+ state.finishBlocked = false;
9826
+ if (terminalTag)
9827
+ state.terminalTag = terminalTag;
9828
+ this.scheduleReactionDrain(state);
9829
+ return;
9480
9830
  }
9481
9831
  if (!this.activeReactionKeys.delete(key))
9482
9832
  return;
9483
- this.recallReaction(messageId, chatId).catch((err) => {
9484
- this.logReactionFailure("reaction recall", err);
9485
- });
9833
+ state.finishing = true;
9834
+ state.desiredStatusTag = void 0;
9835
+ state.terminalTag = terminalTag;
9836
+ state.revision++;
9837
+ this.scheduleReactionDrain(state);
9838
+ }
9839
+ stopReaction(chatId, messageId, sessionId) {
9840
+ this.finishReaction(chatId, messageId, sessionId);
9486
9841
  }
9487
9842
  /** Recall reactions left behind when a session dies without terminal lifecycle events. */
9488
9843
  onSessionDied(sessionId) {
@@ -9511,16 +9866,32 @@ var DingtalkChannel = class _DingtalkChannel extends ChannelBase {
9511
9866
  const keys = this.sessionReactionKeys.get(sessionId);
9512
9867
  if (keys) {
9513
9868
  this.sessionReactionKeys.delete(sessionId);
9514
- for (const [key, { messageId, chatId }] of keys) {
9515
- if (this.activeReactionKeys.delete(key)) {
9516
- void this.recallReaction(messageId, chatId).catch((err) => {
9517
- this.logReactionFailure("session-death reaction recall", err);
9518
- });
9519
- }
9869
+ for (const { messageId, chatId } of keys.values()) {
9870
+ this.finishReaction(chatId, messageId, sessionId);
9520
9871
  }
9521
9872
  }
9522
9873
  super.onSessionDied(sessionId);
9523
9874
  }
9875
+ /**
9876
+ * A crashed standalone bridge never settles its in-flight turns, so their
9877
+ * transient tags and ticking status cards would otherwise assert a live
9878
+ * turn forever. Finish the tags without a terminal result and terminalize
9879
+ * the cards as interrupted. Session state stays: crash recovery restores
9880
+ * the sessions on a fresh bridge.
9881
+ */
9882
+ onBridgeDisconnected() {
9883
+ for (const [sessionId, keys] of this.sessionReactionKeys) {
9884
+ this.sessionReactionKeys.delete(sessionId);
9885
+ for (const { messageId, chatId } of keys.values()) {
9886
+ this.finishReaction(chatId, messageId, sessionId);
9887
+ }
9888
+ }
9889
+ for (const [sessionId, runId] of this.cardRunBySession) {
9890
+ this.cardRunBySession.delete(sessionId);
9891
+ this.interactionPresenter?.terminalizeRun(runId, "cancelled");
9892
+ this.cardRuns.delete(runId);
9893
+ }
9894
+ }
9524
9895
  onSessionRetiring(sessionId) {
9525
9896
  this.drainBackgroundResponseAggregations(sessionId);
9526
9897
  }
@@ -9539,10 +9910,18 @@ var DingtalkChannel = class _DingtalkChannel extends ChannelBase {
9539
9910
  }
9540
9911
  return;
9541
9912
  }
9913
+ const presentationPhase = lifecyclePresentationPhase(event);
9914
+ if (event.runId && presentationPhase) {
9915
+ this.interactionPresenter?.updateStatusCardPhase(event.runId, presentationPhase);
9916
+ }
9917
+ if (presentationPhase) {
9918
+ this.replaceStatusReaction(event.chatId, event.messageId, this.phaseReactionTag(presentationPhase));
9919
+ return;
9920
+ }
9542
9921
  if (isTerminalTaskLifecycleType(event.type)) {
9543
9922
  if (event.messageId)
9544
9923
  this.mentionTargets.delete(event.messageId);
9545
- this.stopReaction(event.chatId, event.messageId, event.sessionId);
9924
+ this.finishReaction(event.chatId, event.messageId, event.sessionId, this.terminalReactionTag(event.type));
9546
9925
  if (event.runId) {
9547
9926
  this.deleteFileProjectorsForRun(event.runId);
9548
9927
  if (event.type === "failed") {