@qwen-code/qwen-code 0.21.4 → 0.21.5

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 (242) hide show
  1. package/bundled/qc-helper/docs/configuration/model-providers.md +8 -7
  2. package/bundled/qc-helper/docs/configuration/settings.md +1 -1
  3. package/bundled/qc-helper/docs/features/code-review.md +2 -0
  4. package/bundled/qc-helper/docs/features/mcp.md +11 -3
  5. package/bundled/review/SKILL.md +32 -1
  6. package/chunks/{MaxSizedBox-5XDFQHTQ.js → MaxSizedBox-2MWU5JYB.js} +16 -16
  7. package/chunks/{StandaloneSessionPicker-DLADA54K.js → StandaloneSessionPicker-B6MI5NTB.js} +30 -30
  8. package/chunks/{acpAgent-MVEFZSBS.js → acpAgent-MRPYN6FH.js} +674 -290
  9. package/chunks/{agent-RB6LCRZX.js → agent-NAOXNW4I.js} +16 -16
  10. package/chunks/{agent-headless-272ZACJV.js → agent-headless-L4PPVFKW.js} +16 -16
  11. package/chunks/{artifact-tool-TBOYEKTY.js → artifact-tool-RROCCJDA.js} +1 -1
  12. package/chunks/{askUserQuestion-23Y5WZFJ.js → askUserQuestion-2EPPBPUZ.js} +1 -1
  13. package/chunks/{bridge-GXUXFSHK.js → bridge-LHXGYNCO.js} +17 -17
  14. package/chunks/{channel-settings-store-5UA2SABE.js → channel-settings-store-QB54TLYE.js} +21 -21
  15. package/chunks/{chunk-PWCQRLM5.js → chunk-2AGOQ7QO.js} +1 -1
  16. package/chunks/{chunk-XSOAW7FC.js → chunk-2JBETW4S.js} +5 -5
  17. package/chunks/{chunk-O4IWFYUW.js → chunk-3GOCVBYR.js} +4 -4
  18. package/chunks/{chunk-3PHUGFPH.js → chunk-3H5RFLTS.js} +1 -1
  19. package/chunks/{chunk-OOPFAIWP.js → chunk-3P4GP4S2.js} +1 -1
  20. package/chunks/{chunk-YXEVDA66.js → chunk-4LLUH3A7.js} +19 -18
  21. package/chunks/{chunk-ZRQY5BBS.js → chunk-4NEBUDWS.js} +10 -10
  22. package/chunks/{chunk-C5YFS6VR.js → chunk-4NNR24EP.js} +4 -4
  23. package/chunks/{chunk-RL2NPV5E.js → chunk-4O6HLCOF.js} +1 -1
  24. package/chunks/{chunk-AFJSRJTO.js → chunk-5HWAJ4BK.js} +1 -1
  25. package/chunks/{chunk-O2ZYHG33.js → chunk-5L6CQ4ZU.js} +131 -67
  26. package/chunks/{chunk-AWTLFUVN.js → chunk-5XNO4AW7.js} +13 -13
  27. package/chunks/{chunk-LLMGP5IC.js → chunk-6WBWIPBF.js} +2 -2
  28. package/chunks/{chunk-4CTV3FZH.js → chunk-7M2RLFNX.js} +23 -19
  29. package/chunks/{chunk-X6QNZOTC.js → chunk-7MFQLOHZ.js} +1 -1
  30. package/chunks/{chunk-DZPOYHBT.js → chunk-7W5KOBYU.js} +1 -1
  31. package/chunks/{chunk-SBBHZ3YT.js → chunk-AEWOKOJY.js} +1 -1
  32. package/chunks/{chunk-2CCUHZP5.js → chunk-B2RBYP7Z.js} +2 -2
  33. package/chunks/{chunk-URVJ4AZC.js → chunk-B3EBIZUY.js} +1 -1
  34. package/chunks/{chunk-GDREW3U5.js → chunk-BWLUCN35.js} +1 -1
  35. package/chunks/{chunk-DJA7YBLJ.js → chunk-C6ARWPCG.js} +2 -2
  36. package/chunks/{chunk-RNKGMZEW.js → chunk-CAX76R46.js} +1 -1
  37. package/chunks/{chunk-CFDR3GNL.js → chunk-D7D7RXIJ.js} +11 -0
  38. package/chunks/{chunk-PCVMRBLN.js → chunk-D7QAZ5DF.js} +1 -1
  39. package/chunks/{chunk-THLV7YGY.js → chunk-EXHQZBVJ.js} +2 -2
  40. package/chunks/{chunk-DOCBJIBL.js → chunk-FEUXV3DC.js} +1 -1
  41. package/chunks/{chunk-QZQ72YF6.js → chunk-G2UXFO2B.js} +1 -1
  42. package/chunks/{chunk-QXTGHZCX.js → chunk-GBY3ODW7.js} +3 -3
  43. package/chunks/{chunk-LPLMUGIM.js → chunk-GEP54CHX.js} +5 -5
  44. package/chunks/{chunk-2T3RYG4L.js → chunk-GP4IMBX5.js} +420 -94
  45. package/chunks/{chunk-XPAY4EMH.js → chunk-IK3RYLAD.js} +3 -3
  46. package/chunks/{chunk-I32URQI7.js → chunk-IWGMDSC3.js} +5 -5
  47. package/chunks/{chunk-WDLQGFWP.js → chunk-IWYXZAGT.js} +27 -27
  48. package/chunks/{chunk-HBCKZF2A.js → chunk-IZ2CMEYO.js} +1 -1
  49. package/chunks/{chunk-PQEIKQXN.js → chunk-J7I2BZHS.js} +4 -3
  50. package/chunks/{chunk-PQ5JFCNL.js → chunk-JDNWIXHJ.js} +3 -3
  51. package/chunks/{chunk-KHSJSMFS.js → chunk-K2ETEWG6.js} +1 -1
  52. package/chunks/{chunk-FV4TUUDE.js → chunk-K64OI7S7.js} +1 -1
  53. package/chunks/{chunk-C6FU76AA.js → chunk-K6VEL5KP.js} +1 -1
  54. package/chunks/{chunk-B3EBXISV.js → chunk-KH2BIJ4H.js} +3 -3
  55. package/chunks/{chunk-G7XXKQYS.js → chunk-LKRMNRSN.js} +27 -1
  56. package/chunks/{chunk-G6KI6B5L.js → chunk-LMNM37OE.js} +1 -1
  57. package/chunks/{chunk-SV5X2EUV.js → chunk-LSYVASZS.js} +1 -1
  58. package/chunks/{chunk-4PZ7SPD5.js → chunk-LYPXNRBX.js} +1 -1
  59. package/chunks/{chunk-HFVW54NL.js → chunk-MBEMTXQT.js} +9 -2
  60. package/chunks/{chunk-RPYYTL7E.js → chunk-MGSSJT27.js} +2 -2
  61. package/chunks/{chunk-M2L4TMH3.js → chunk-N3RERU5N.js} +3 -3
  62. package/chunks/{chunk-HI4YGRJD.js → chunk-NLQIEY6W.js} +3 -3
  63. package/chunks/{chunk-UATJZOAJ.js → chunk-OGAARVN7.js} +3 -3
  64. package/chunks/{chunk-6KQUOXT5.js → chunk-OIGB253L.js} +6 -6
  65. package/chunks/{chunk-EIAPOG76.js → chunk-P3SLTSNY.js} +3 -3
  66. package/chunks/{chunk-BC4LTKEG.js → chunk-Q2V4AOQL.js} +1 -1
  67. package/chunks/{chunk-KB6VSG2U.js → chunk-RM3F46UT.js} +6 -6
  68. package/chunks/{chunk-6ME3PVMM.js → chunk-SJMCYCUQ.js} +5 -5
  69. package/chunks/{chunk-2JN5V3I7.js → chunk-SQTA6PAY.js} +1 -1
  70. package/chunks/{chunk-2ON2O4MD.js → chunk-SVIEVA3L.js} +3 -3
  71. package/chunks/{chunk-FPPVCCAH.js → chunk-TCOJPG2P.js} +1 -1
  72. package/chunks/{chunk-BOWKLLWA.js → chunk-TJ56V3AR.js} +2 -2
  73. package/chunks/{chunk-A7PONO5G.js → chunk-URJHXOSO.js} +2 -2
  74. package/chunks/{chunk-EJXATV5R.js → chunk-VJPF6GF2.js} +2 -2
  75. package/chunks/{chunk-5XGI4IPK.js → chunk-VOA2UPZM.js} +3 -3
  76. package/chunks/{chunk-XGA6XHH3.js → chunk-WTM5QONI.js} +3 -3
  77. package/chunks/{chunk-IMGNGOGC.js → chunk-WU5NBSLD.js} +3 -3
  78. package/chunks/{chunk-7UXI6P72.js → chunk-WVAESIM6.js} +2 -2
  79. package/chunks/{chunk-TXZDRD36.js → chunk-XD2PNH3K.js} +5 -5
  80. package/chunks/{chunk-E2SYUEIA.js → chunk-YLL3SC5S.js} +743 -312
  81. package/chunks/{chunk-M6RNMBUO.js → chunk-YMUZQ3MQ.js} +4 -4
  82. package/chunks/{chunk-DHNFB7NC.js → chunk-YO4JI7B4.js} +5 -5
  83. package/chunks/{chunk-VA5NLVPT.js → chunk-Z7JILXGX.js} +1 -1
  84. package/chunks/{chunk-P5UJMCVS.js → chunk-ZLGPHA34.js} +4 -4
  85. package/chunks/{chunk-JDJ7SC4E.js → chunk-ZPGMDT4S.js} +237 -106
  86. package/chunks/{chunk-UEJESCS7.js → chunk-ZPPP6VCL.js} +1 -1
  87. package/chunks/{computer-use-MDOMIVTL.js → computer-use-XDOGP2KA.js} +16 -16
  88. package/chunks/{contextCommand-FCK3CB37.js → contextCommand-N3LQDCYJ.js} +18 -18
  89. package/chunks/{core-runtime-UHRHHU2O.js → core-runtime-STAFP45W.js} +16 -16
  90. package/chunks/{create-sub-session-MIXUVLWW.js → create-sub-session-2B3JENWD.js} +16 -16
  91. package/chunks/{create-sub-session-J32WC64U.js → create-sub-session-6EWLAZD5.js} +1 -1
  92. package/chunks/{cron-create-HMFSHIAR.js → cron-create-CCRIULJE.js} +1 -1
  93. package/chunks/{cron-delete-ZJFHOX57.js → cron-delete-FCFW6BGP.js} +1 -1
  94. package/chunks/{cron-list-ZEX2NBMN.js → cron-list-QDBVCHRF.js} +1 -1
  95. package/chunks/{daemon-status-provider-6LC7LUNR.js → daemon-status-provider-PPAH3ATF.js} +21 -21
  96. package/chunks/{daemon-trust-policy-Y36HGRAM.js → daemon-trust-policy-X6XL3MB4.js} +21 -21
  97. package/chunks/{daemon-trust-policy-monitor-ROTBBDOH.js → daemon-trust-policy-monitor-M5LBL2HD.js} +21 -21
  98. package/chunks/{deferred-core-runtime-ZQ4JIAJD.js → deferred-core-runtime-O54YPTBU.js} +16 -16
  99. package/chunks/{display-image-2WOG27DY.js → display-image-GUJA352B.js} +2 -2
  100. package/chunks/{earlyInputCapture-GPRUNXTP.js → earlyInputCapture-CBIT2RGT.js} +16 -16
  101. package/chunks/{edit-YK3UP6D2.js → edit-KW2TOC6A.js} +17 -17
  102. package/chunks/{enter-worktree-QMVQW7UG.js → enter-worktree-YL34NEU5.js} +16 -16
  103. package/chunks/{enterPlanMode-TZAYQ5MP.js → enterPlanMode-JFJTDASQ.js} +16 -16
  104. package/chunks/{environment-3UQURCZG.js → environment-IATU5GXG.js} +18 -18
  105. package/chunks/{errors-VBIMTNNI.js → errors-SAVRDE7Q.js} +18 -18
  106. package/chunks/{exit-worktree-4EC7LBBC.js → exit-worktree-5M43QPBB.js} +16 -16
  107. package/chunks/{exitPlanMode-K5Y3REU2.js → exitPlanMode-W4EICZ4N.js} +16 -16
  108. package/chunks/{fast-path-KS6IE7YR.js → fast-path-YQJPIKMP.js} +2 -2
  109. package/chunks/{gemini-LTUCUOJH.js → gemini-FUF5SSPR.js} +47 -47
  110. package/chunks/{geminiContentGenerator-M3HJTHKR.js → geminiContentGenerator-LLLZBOUG.js} +1 -1
  111. package/chunks/{glob-SKUYGTF2.js → glob-LJFFMN4D.js} +16 -16
  112. package/chunks/{goal-tools-SPQ5M6D3.js → goal-tools-3AZKX5WQ.js} +2 -18
  113. package/chunks/{grep-SQ7RD7SV.js → grep-Q64EAM73.js} +16 -16
  114. package/chunks/{handleAutoUpdate-OK7OX23A.js → handleAutoUpdate-QBMPRTSQ.js} +20 -20
  115. package/chunks/{i18n-P77YBKY4.js → i18n-LDUW5DMN.js} +17 -17
  116. package/chunks/{image-gen-2ZWPS42A.js → image-gen-G7RLG3KR.js} +2 -2
  117. package/chunks/{initializer-PIOYXVW7.js → initializer-74A7DMMD.js} +21 -21
  118. package/chunks/{installationInfo-IWMM6DPV.js → installationInfo-OFDYLDFD.js} +17 -17
  119. package/chunks/{list-3DCR4TRI.js → list-JA2EWRHJ.js} +24 -24
  120. package/chunks/{list-agents-TWEGRJWO.js → list-agents-GC4BRET7.js} +1 -1
  121. package/chunks/{loadedSettingsAdapter-EJC6CU5N.js → loadedSettingsAdapter-2GNJOQ3L.js} +21 -21
  122. package/chunks/{loggingContentGenerator-2JEFU25T.js → loggingContentGenerator-B6B5EGB3.js} +8 -8
  123. package/chunks/{loop-wakeup-6LLEOQYV.js → loop-wakeup-SQQSBMEY.js} +2 -2
  124. package/chunks/{ls-H5WX22VK.js → ls-63CC3NNX.js} +1 -1
  125. package/chunks/{lsp-G6FXYEIS.js → lsp-P6NVJVNT.js} +1 -1
  126. package/chunks/{managed-npm-update-EGVQPSBR.js → managed-npm-update-4YZHLUER.js} +17 -17
  127. package/chunks/{mcp-KFFH2MBV.js → mcp-LLK5YJVH.js} +21 -21
  128. package/chunks/{monitor-6Y3NDMTI.js → monitor-NYJPAWVP.js} +16 -16
  129. package/chunks/{nonInteractiveCli-426IQDPE.js → nonInteractiveCli-HZBBBDJD.js} +45 -45
  130. package/chunks/{notebook-edit-373IQQLE.js → notebook-edit-LLM6UXFX.js} +17 -17
  131. package/chunks/{openaiContentGenerator-PGFSOMIQ.js → openaiContentGenerator-2AEXDN55.js} +8 -8
  132. package/chunks/{pidfile-Y4INDMHG.js → pidfile-3JUWX7G2.js} +16 -16
  133. package/chunks/{processUtils-6BCPCJZW.js → processUtils-JLLRVZHT.js} +2 -2
  134. package/chunks/{qwenContentGenerator-QC3KSHSX.js → qwenContentGenerator-2FESCF27.js} +17 -17
  135. package/chunks/{qwenOAuth2-IOAXKJ3L.js → qwenOAuth2-2KKPYA5J.js} +1 -1
  136. package/chunks/{read-file-2T54FYZV.js → read-file-5GVXLY74.js} +6 -6
  137. package/chunks/{read-mcp-resource-DRZSI3HE.js → read-mcp-resource-RTSSEER5.js} +1 -1
  138. package/chunks/{record-artifact-IPIRWMFY.js → record-artifact-L3BAHQFN.js} +2 -2
  139. package/chunks/{resumeHistoryUtils-O62RDCZ3.js → resumeHistoryUtils-Z4OFBXPM.js} +19 -19
  140. package/chunks/{ripGrep-3H72KY7S.js → ripGrep-TKOJTIAB.js} +16 -16
  141. package/chunks/{run-qwen-serve-3AIDNNHO.js → run-qwen-serve-K5W6MM6M.js} +27 -27
  142. package/chunks/{runtime-AZ4EHHFV.js → runtime-IADXMRCY.js} +22 -22
  143. package/chunks/{scheduler-L4UUCU4Z.js → scheduler-T7AV37LD.js} +16 -16
  144. package/chunks/{sdk-exporters-http-IKNWQJNV.js → sdk-exporters-http-IL2346MJ.js} +6 -2
  145. package/chunks/{sdk-impl-7CUUMQDB.js → sdk-impl-SYKGVWOZ.js} +2 -2
  146. package/chunks/{send-message-LHJLVWFD.js → send-message-TL6FIMMN.js} +3 -3
  147. package/chunks/{serve-CLXGSYOE.js → serve-ROEGMS3I.js} +21 -21
  148. package/chunks/{server-MEAE3WMM.js → server-NGXMRODI.js} +40 -40
  149. package/chunks/{session-OSLD2LT5.js → session-RCDLDJA4.js} +46 -46
  150. package/chunks/{settings-ILWAOKA4.js → settings-E6H3AURD.js} +20 -20
  151. package/chunks/{shell-RT5DBH6B.js → shell-RHGGJ6BE.js} +16 -16
  152. package/chunks/{skill-LVGA3ATZ.js → skill-GQ7PBS25.js} +7 -7
  153. package/chunks/{skill-settings-WTZE7EPE.js → skill-settings-E2F7OCBL.js} +20 -20
  154. package/chunks/{spawnChannel-BOBS7DVM.js → spawnChannel-Q2IQBHME.js} +16 -16
  155. package/chunks/{standalone-update-Y5JB4S2K.js → standalone-update-NYYZEHLD.js} +18 -18
  156. package/chunks/{startInteractiveUI-ZV25CD2S.js → startInteractiveUI-IX6I3Y2Z.js} +62 -59
  157. package/chunks/{syntheticOutput-EYL7DWO7.js → syntheticOutput-BN7E626U.js} +2 -2
  158. package/chunks/{task-create-4ALZMGP5.js → task-create-2X4UP4F3.js} +4 -4
  159. package/chunks/{task-list-6CVQPORX.js → task-list-WOLJPZ64.js} +1 -1
  160. package/chunks/{task-stop-Y5ZTFVRX.js → task-stop-TNXRNAL2.js} +1 -1
  161. package/chunks/{task-update-IKCEEWJ6.js → task-update-VDUSN36E.js} +4 -4
  162. package/chunks/{team-create-ZVPQIXCP.js → team-create-UTRVUEDA.js} +16 -16
  163. package/chunks/{team-delete-CE7DC53R.js → team-delete-D2VMSDOT.js} +1 -1
  164. package/chunks/{team-plan-approval-5UHUBY3W.js → team-plan-approval-YZNB4U5U.js} +16 -16
  165. package/chunks/{terminal-image-renderer-NWC2RALG.js → terminal-image-renderer-QRSCS2BE.js} +17 -17
  166. package/chunks/{theme-manager-5KICSBOB.js → theme-manager-EKZBY34I.js} +16 -16
  167. package/chunks/{todoWrite-FTZWQRZH.js → todoWrite-MHWHO5UO.js} +1 -1
  168. package/chunks/{tool-search-2AOU77H4.js → tool-search-N2R7LVMC.js} +8 -8
  169. package/chunks/{total-session-admission-FR7RMHVL.js → total-session-admission-HBIYARPO.js} +17 -17
  170. package/chunks/{trustedFolders-V7UUPQXO.js → trustedFolders-ZQLYRCSY.js} +17 -17
  171. package/chunks/{update-relaunch-TBWRMQD6.js → update-relaunch-PJWXMPCR.js} +5 -5
  172. package/chunks/{updateCheck-42SPCLH7.js → updateCheck-ZXRCGY66.js} +19 -19
  173. package/chunks/{useAutoAcceptIndicator-4C2KM345.js → useAutoAcceptIndicator-ZYQW5SGJ.js} +22 -22
  174. package/chunks/{validateNonInterActiveAuth-UVFRXV3Z.js → validateNonInterActiveAuth-M7J7OTRH.js} +42 -42
  175. package/chunks/{version-HKTV6TPN.js → version-2AOHMPK3.js} +1 -1
  176. package/chunks/{web-fetch-ZRXSV5AN.js → web-fetch-DS34CJ3R.js} +6 -6
  177. package/chunks/{web-search-WOLV3L6T.js → web-search-ITFPD7V4.js} +4 -4
  178. package/chunks/{workflow-F63ES3OB.js → workflow-LZQ4PGNS.js} +17 -17
  179. package/chunks/{workspace-providers-status-PJMGMYMC.js → workspace-providers-status-ZPTLKOBM.js} +23 -23
  180. package/chunks/{workspace-registration-store-LNBOX5TJ.js → workspace-registration-store-OTFKSGG7.js} +1 -1
  181. package/chunks/{workspace-registry-4PR7VDQ3.js → workspace-registry-YZ3OXPHP.js} +17 -17
  182. package/chunks/{workspace-service-PVI3VUNQ.js → workspace-service-OCZXOOSQ.js} +24 -24
  183. package/chunks/{workspace-skills-status-2Q5ZISO6.js → workspace-skills-status-K2ALGUCD.js} +21 -21
  184. package/chunks/{workspace-trust-reconciler-NOILUH3C.js → workspace-trust-reconciler-KMRZISJP.js} +22 -22
  185. package/chunks/{write-file-MOM4JDHG.js → write-file-AWBI4GJS.js} +16 -16
  186. package/chunks/{zoom-image-E3VHRCFU.js → zoom-image-NHKN6F77.js} +6 -6
  187. package/cli.js +12 -12
  188. package/package.json +3 -3
  189. package/web-shell/assets/{arc-GpdmhIxr.js → arc-Dpg66jw7.js} +1 -1
  190. package/web-shell/assets/{architectureDiagram-3BPJPVTR-C-LhCgH_.js → architectureDiagram-3BPJPVTR-BJ4FIBxN.js} +1 -1
  191. package/web-shell/assets/{blockDiagram-GPEHLZMM-CzNdTCm-.js → blockDiagram-GPEHLZMM-VXmYdtYT.js} +1 -1
  192. package/web-shell/assets/{c4Diagram-AAUBKEIU-Ce7hbrRM.js → c4Diagram-AAUBKEIU-BNLDb8FE.js} +1 -1
  193. package/web-shell/assets/channel-Bd9wOnaA.js +1 -0
  194. package/web-shell/assets/{chunk-2J33WTMH-BBSEn1PK.js → chunk-2J33WTMH-DR5yHxr0.js} +1 -1
  195. package/web-shell/assets/{chunk-4BX2VUAB-_llgjfe5.js → chunk-4BX2VUAB-Czkq8UZU.js} +1 -1
  196. package/web-shell/assets/{chunk-55IACEB6-9fJZ_oZE.js → chunk-55IACEB6-DugUgM6s.js} +1 -1
  197. package/web-shell/assets/{chunk-727SXJPM-DgEzQWOu.js → chunk-727SXJPM-Dw6quA1K.js} +1 -1
  198. package/web-shell/assets/{chunk-AQP2D5EJ-B4RthUTc.js → chunk-AQP2D5EJ-BoVYOTTz.js} +1 -1
  199. package/web-shell/assets/{chunk-FMBD7UC4-CDI-emMW.js → chunk-FMBD7UC4--Amcse-j.js} +1 -1
  200. package/web-shell/assets/{chunk-ND2GUHAM-jM2-yOd8.js → chunk-ND2GUHAM-ajaEYAC8.js} +1 -1
  201. package/web-shell/assets/{chunk-QZHKN3VN-XGZHlKPF.js → chunk-QZHKN3VN-CUNDZ7im.js} +1 -1
  202. package/web-shell/assets/classDiagram-4FO5ZUOK-XhCT8FE3.js +1 -0
  203. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-XhCT8FE3.js +1 -0
  204. package/web-shell/assets/{cose-bilkent-S5V4N54A-90nbW1xQ.js → cose-bilkent-S5V4N54A-BnfkD-m1.js} +1 -1
  205. package/web-shell/assets/{dagre-BM42HDAG-BtzlyqZ9.js → dagre-BM42HDAG-BuUdFk7Z.js} +1 -1
  206. package/web-shell/assets/{diagram-2AECGRRQ-DAaqGWaH.js → diagram-2AECGRRQ-B2ZXxoab.js} +1 -1
  207. package/web-shell/assets/{diagram-5GNKFQAL-CxlzSIFa.js → diagram-5GNKFQAL-BsgOICzM.js} +1 -1
  208. package/web-shell/assets/{diagram-KO2AKTUF-8kj-1H6u.js → diagram-KO2AKTUF-DTTjG6U-.js} +1 -1
  209. package/web-shell/assets/{diagram-LMA3HP47-6NhjFwRF.js → diagram-LMA3HP47-temLf1x7.js} +1 -1
  210. package/web-shell/assets/{diagram-OG6HWLK6-Bn9kvInz.js → diagram-OG6HWLK6-CRFjScs2.js} +1 -1
  211. package/web-shell/assets/{erDiagram-TEJ5UH35-CaRoGsAt.js → erDiagram-TEJ5UH35-D4oaY-rQ.js} +1 -1
  212. package/web-shell/assets/{flowDiagram-I6XJVG4X-TkLweHdf.js → flowDiagram-I6XJVG4X-BqG8B49b.js} +1 -1
  213. package/web-shell/assets/{ganttDiagram-6RSMTGT7-ruwhCKBl.js → ganttDiagram-6RSMTGT7-DffQBdd5.js} +1 -1
  214. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-DNI_PxoU.js → gitGraphDiagram-PVQCEYII-CMDPfseF.js} +1 -1
  215. package/web-shell/assets/{index-T4KluHvu.js → index-2F4RsNzd.js} +322 -322
  216. package/web-shell/assets/index-CaucmEO_.css +5 -0
  217. package/web-shell/assets/{index-p1gz-sxE.js → index-qTQR_smP.js} +1 -1
  218. package/web-shell/assets/{infoDiagram-5YYISTIA-DarXq1-A.js → infoDiagram-5YYISTIA-Cn3T83MA.js} +1 -1
  219. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-GxDaDlT0.js → ishikawaDiagram-YF4QCWOH-ijFs7e25.js} +1 -1
  220. package/web-shell/assets/{journeyDiagram-JHISSGLW-mDEoGBzY.js → journeyDiagram-JHISSGLW-CINTv8VB.js} +1 -1
  221. package/web-shell/assets/{kanban-definition-UN3LZRKU-Ds0t-Mup.js → kanban-definition-UN3LZRKU-CMGRZCxx.js} +1 -1
  222. package/web-shell/assets/{linear-05nJ0xZ7.js → linear-Co-2_37d.js} +1 -1
  223. package/web-shell/assets/{mermaid.core-Bua24ThM.js → mermaid.core-DijbyaN5.js} +5 -5
  224. package/web-shell/assets/{mindmap-definition-RKZ34NQL-D_zRdvUS.js → mindmap-definition-RKZ34NQL-k_sDYDPZ.js} +1 -1
  225. package/web-shell/assets/{pieDiagram-4H26LBE5-DZHr1x16.js → pieDiagram-4H26LBE5-CG-oz8V3.js} +1 -1
  226. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-HA06Wf0h.js → quadrantDiagram-W4KKPZXB-Baq7HIG2.js} +1 -1
  227. package/web-shell/assets/{requirementDiagram-4Y6WPE33-DH3urmJf.js → requirementDiagram-4Y6WPE33-CDM3ZvBt.js} +1 -1
  228. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-C4xgz0TT.js → sankeyDiagram-5OEKKPKP-C2dJbWKN.js} +1 -1
  229. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-DAUoZWgv.js → sequenceDiagram-3UESZ5HK-Cf1_h59p.js} +1 -1
  230. package/web-shell/assets/{stateDiagram-AJRCARHV-v7NzXy4l.js → stateDiagram-AJRCARHV-CI5clUEc.js} +1 -1
  231. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-BDc8asKD.js +1 -0
  232. package/web-shell/assets/{timeline-definition-PNZ67QCA-B3GTYR2W.js → timeline-definition-PNZ67QCA-B2O8cAZX.js} +1 -1
  233. package/web-shell/assets/{vennDiagram-CIIHVFJN-BWHjSPAq.js → vennDiagram-CIIHVFJN-BLsJ_h9s.js} +1 -1
  234. package/web-shell/assets/{wardley-L42UT6IY-m9r6IUBC.js → wardley-L42UT6IY-BlPU4FTA.js} +1 -1
  235. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-kT0FkVfK.js → wardleyDiagram-YWT4CUSO-D_U-RdU4.js} +1 -1
  236. package/web-shell/assets/{xychartDiagram-2RQKCTM6-CYRm10z5.js → xychartDiagram-2RQKCTM6-BynXGSTl.js} +1 -1
  237. package/web-shell/index.html +2 -2
  238. package/web-shell/assets/channel-95y6Rcp3.js +0 -1
  239. package/web-shell/assets/classDiagram-4FO5ZUOK-pfzVkmjQ.js +0 -1
  240. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-pfzVkmjQ.js +0 -1
  241. package/web-shell/assets/index-WxSvj2tI.css +0 -5
  242. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-CtdFexEf.js +0 -1
@@ -8,17 +8,18 @@ import {
8
8
  } from "./chunk-E4WHKETF.js";
9
9
  import {
10
10
  STRUCTURED_OUTPUT_REDACTED_ARGS
11
- } from "./chunk-UEJESCS7.js";
11
+ } from "./chunk-ZPPP6VCL.js";
12
12
  import {
13
13
  BaseDeclarativeTool,
14
14
  BaseToolInvocation,
15
15
  SchemaValidator,
16
+ StructuredToolError,
16
17
  ToolDisplayNames,
17
18
  ToolNames
18
- } from "./chunk-CFDR3GNL.js";
19
+ } from "./chunk-D7D7RXIJ.js";
19
20
  import {
20
21
  DEFAULT_QWEN_MODEL
21
- } from "./chunk-TXZDRD36.js";
22
+ } from "./chunk-XD2PNH3K.js";
22
23
  import {
23
24
  estimateTextTokens,
24
25
  generateLegacyMcpToolName,
@@ -52,8 +53,9 @@ import {
52
53
  recordModelSlashCommand,
53
54
  recordSubagentExecutionMetrics,
54
55
  recordTokenUsageMetrics,
55
- recordToolCallMetrics
56
- } from "./chunk-O2ZYHG33.js";
56
+ recordToolCallMetrics,
57
+ recordToolExecutionMetrics
58
+ } from "./chunk-5L6CQ4ZU.js";
57
59
  import {
58
60
  require_src,
59
61
  safeJsonStringify
@@ -102,7 +104,7 @@ import {
102
104
  EVENT_WORKFLOW_KEYWORD,
103
105
  EVENT_WORKFLOW_RUN,
104
106
  SERVICE_NAME
105
- } from "./chunk-G7XXKQYS.js";
107
+ } from "./chunk-LKRMNRSN.js";
106
108
  import {
107
109
  Storage,
108
110
  createDebugLogger,
@@ -11224,12 +11226,14 @@ var QwenLogger = class _QwenLogger {
11224
11226
  `tool_call#${event.function_name}`,
11225
11227
  {
11226
11228
  properties: {
11229
+ call_id: event.call_id,
11227
11230
  prompt_id: event.prompt_id,
11228
11231
  response_id: event.response_id,
11229
11232
  tool_name: event.function_name,
11230
- permission: event.decision,
11231
11233
  status: event.status,
11234
+ execution_status: event.execution_status,
11232
11235
  tool_type: event.tool_type,
11236
+ permission: event.decision,
11233
11237
  success: event.success ? 1 : 0,
11234
11238
  duration_ms: event.duration_ms,
11235
11239
  error_type: event.error_type,
@@ -12718,6 +12722,32 @@ function recordUiTelemetryEventToChat(config, uiEvent) {
12718
12722
  config.getChatRecordingService()?.recordUiTelemetryEvent(uiEvent);
12719
12723
  }
12720
12724
  __name(recordUiTelemetryEventToChat, "recordUiTelemetryEventToChat");
12725
+ function normalizeToolCallEvent(event) {
12726
+ const functionName = event.function_name ?? "";
12727
+ const normalized = {
12728
+ ...event,
12729
+ function_name: functionName.trim().length > 0 ? functionName : "unknown_tool",
12730
+ success: event.status === "success",
12731
+ execution_status: event.execution_status ?? "unknown"
12732
+ };
12733
+ if (event.status === "error") {
12734
+ normalized.error_type = event.error_type?.trim() || "unknown" /* UNKNOWN */;
12735
+ } else {
12736
+ delete normalized.error;
12737
+ delete normalized.error_type;
12738
+ }
12739
+ return normalized;
12740
+ }
12741
+ __name(normalizeToolCallEvent, "normalizeToolCallEvent");
12742
+ var debugLogger5 = createDebugLogger("TELEMETRY_SINK");
12743
+ function runToolTelemetrySink(sink) {
12744
+ try {
12745
+ sink();
12746
+ } catch (e) {
12747
+ debugLogger5.debug("Telemetry sink failed (best-effort):", e);
12748
+ }
12749
+ }
12750
+ __name(runToolTelemetrySink, "runToolTelemetrySink");
12721
12751
  function logStartSession(config, event) {
12722
12752
  QwenLogger.getInstance(config)?.logStartSessionEvent(event);
12723
12753
  if (!isTelemetrySdkInitialized()) return;
@@ -12796,17 +12826,6 @@ function logUserRetry(config, event) {
12796
12826
  logger.emit(logRecord);
12797
12827
  }
12798
12828
  __name(logUserRetry, "logUserRetry");
12799
- function normalizeToolCallEvent(event) {
12800
- const isError = event.status === "error";
12801
- return {
12802
- ...event,
12803
- function_name: event.function_name.trim().length > 0 ? event.function_name : "unknown_tool",
12804
- success: event.status === "success",
12805
- error: isError ? event.error : void 0,
12806
- error_type: isError ? event.error_type?.trim() ? event.error_type : "unknown" /* UNKNOWN */ : void 0
12807
- };
12808
- }
12809
- __name(normalizeToolCallEvent, "normalizeToolCallEvent");
12810
12829
  function logToolCall(config, event) {
12811
12830
  const normalizedEvent = normalizeToolCallEvent(event);
12812
12831
  const uiEvent = {
@@ -12814,37 +12833,53 @@ function logToolCall(config, event) {
12814
12833
  "event.name": EVENT_TOOL_CALL,
12815
12834
  "event.timestamp": (/* @__PURE__ */ new Date()).toISOString()
12816
12835
  };
12817
- uiTelemetryService.addEvent(uiEvent, config.getSessionId());
12818
- if (!isInternalPromptId(normalizedEvent.prompt_id)) {
12819
- recordUiTelemetryEventToChat(config, uiEvent);
12820
- }
12821
- QwenLogger.getInstance(config)?.logToolCallEvent(normalizedEvent);
12836
+ runToolTelemetrySink(() => {
12837
+ uiTelemetryService.addEvent(uiEvent, config.getSessionId());
12838
+ });
12839
+ runToolTelemetrySink(() => {
12840
+ if (!isInternalPromptId(normalizedEvent.prompt_id)) {
12841
+ recordUiTelemetryEventToChat(config, uiEvent);
12842
+ }
12843
+ });
12844
+ runToolTelemetrySink(() => {
12845
+ QwenLogger.getInstance(config)?.logToolCallEvent(normalizedEvent);
12846
+ });
12822
12847
  if (!isTelemetrySdkInitialized()) return;
12823
- const attributes = {
12824
- ...getCommonAttributes(config),
12825
- ...normalizedEvent,
12826
- "event.name": EVENT_TOOL_CALL,
12827
- "event.timestamp": (/* @__PURE__ */ new Date()).toISOString(),
12828
- function_args: safeJsonStringify(normalizedEvent.function_args, 2)
12829
- };
12830
- if (normalizedEvent.error) {
12831
- attributes["error.message"] = normalizedEvent.error;
12832
- }
12833
- if (normalizedEvent.error_type) {
12834
- attributes["error.type"] = normalizedEvent.error_type;
12835
- }
12836
- const logger = import_api_logs.logs.getLogger(SERVICE_NAME);
12837
- const logRecord = {
12838
- body: `Tool call: ${normalizedEvent.function_name}${normalizedEvent.decision ? `. Decision: ${normalizedEvent.decision}` : ""}. Success: ${normalizedEvent.success}. Duration: ${normalizedEvent.duration_ms}ms.`,
12839
- attributes
12840
- };
12841
- logger.emit(logRecord);
12842
- recordToolCallMetrics(config, normalizedEvent.duration_ms, {
12843
- function_name: normalizedEvent.function_name,
12844
- status: normalizedEvent.status,
12845
- success: normalizedEvent.success,
12846
- decision: normalizedEvent.decision,
12847
- tool_type: normalizedEvent.tool_type
12848
+ runToolTelemetrySink(() => {
12849
+ const attributes = {
12850
+ ...getCommonAttributes(config),
12851
+ ...normalizedEvent,
12852
+ "event.name": EVENT_TOOL_CALL,
12853
+ "event.timestamp": (/* @__PURE__ */ new Date()).toISOString(),
12854
+ function_args: safeJsonStringify(normalizedEvent.function_args, 2)
12855
+ };
12856
+ if (normalizedEvent.error) {
12857
+ attributes["error.message"] = normalizedEvent.error;
12858
+ }
12859
+ if (normalizedEvent.error_type) {
12860
+ attributes["error.type"] = normalizedEvent.error_type;
12861
+ }
12862
+ const logger = import_api_logs.logs.getLogger(SERVICE_NAME);
12863
+ const logRecord = {
12864
+ body: `Tool call: ${normalizedEvent.function_name}${normalizedEvent.decision ? `. Decision: ${normalizedEvent.decision}` : ""}. Success: ${normalizedEvent.success}. Duration: ${normalizedEvent.duration_ms}ms.`,
12865
+ attributes
12866
+ };
12867
+ logger.emit(logRecord);
12868
+ });
12869
+ runToolTelemetrySink(() => {
12870
+ recordToolCallMetrics(config, normalizedEvent.duration_ms, {
12871
+ function_name: normalizedEvent.function_name,
12872
+ status: normalizedEvent.status,
12873
+ success: normalizedEvent.success,
12874
+ decision: normalizedEvent.decision,
12875
+ tool_type: normalizedEvent.tool_type
12876
+ });
12877
+ });
12878
+ runToolTelemetrySink(() => {
12879
+ recordToolExecutionMetrics(config, {
12880
+ execution_status: normalizedEvent.execution_status,
12881
+ tool_type: normalizedEvent.tool_type
12882
+ });
12848
12883
  });
12849
12884
  }
12850
12885
  __name(logToolCall, "logToolCall");
@@ -13749,7 +13784,7 @@ init_esbuild_shims();
13749
13784
  import * as fs6 from "node:fs/promises";
13750
13785
  import * as path7 from "node:path";
13751
13786
  import * as crypto from "node:crypto";
13752
- var debugLogger5 = createDebugLogger("TRUNCATION");
13787
+ var debugLogger6 = createDebugLogger("TRUNCATION");
13753
13788
  var PREVIEW_SIZE_CHARS = 2e3;
13754
13789
  var MAX_FILE_SIZE_BYTES = 50 * 1024 * 1024;
13755
13790
  var MAX_SESSION_BYTES = 500 * 1024 * 1024;
@@ -13836,7 +13871,7 @@ ${truncatedContent}`;
13836
13871
  outputFile
13837
13872
  };
13838
13873
  } catch (error) {
13839
- debugLogger5.warn(
13874
+ debugLogger6.warn(
13840
13875
  `Failed to save truncated output to ${outputFile}:`,
13841
13876
  error
13842
13877
  );
@@ -13947,7 +13982,7 @@ __name(normalizeToolResultCallId, "normalizeToolResultCallId");
13947
13982
  async function persistAndTruncateToolResult(callId, toolName, content, config) {
13948
13983
  const byteSize = Buffer.byteLength(content, "utf-8");
13949
13984
  if (byteSize > MAX_FILE_SIZE_BYTES) {
13950
- debugLogger5.warn(
13985
+ debugLogger6.warn(
13951
13986
  `Tool result for ${toolName} exceeds ${MAX_FILE_SIZE_BYTES} bytes (${byteSize}), skipping disk persistence`
13952
13987
  );
13953
13988
  return {
@@ -13957,7 +13992,7 @@ async function persistAndTruncateToolResult(callId, toolName, content, config) {
13957
13992
  }
13958
13993
  const budgetUsed = config.getToolResultBytesWritten();
13959
13994
  if (budgetUsed + byteSize > MAX_SESSION_BYTES) {
13960
- debugLogger5.warn(
13995
+ debugLogger6.warn(
13961
13996
  `Session tool result budget exhausted (${budgetUsed} + ${byteSize} > ${MAX_SESSION_BYTES}), skipping disk persistence`
13962
13997
  );
13963
13998
  return {
@@ -13968,7 +14003,7 @@ async function persistAndTruncateToolResult(callId, toolName, content, config) {
13968
14003
  config.trackToolResultBytes(byteSize);
13969
14004
  const safeCallId = normalizeToolResultCallId(callId);
13970
14005
  if (!safeCallId) {
13971
- debugLogger5.warn(
14006
+ debugLogger6.warn(
13972
14007
  `Invalid callId for disk persistence: ${JSON.stringify(callId)}`
13973
14008
  );
13974
14009
  config.trackToolResultBytes(-byteSize);
@@ -13993,7 +14028,7 @@ async function persistAndTruncateToolResult(callId, toolName, content, config) {
13993
14028
  bytesWritten: byteSize
13994
14029
  };
13995
14030
  } catch (error) {
13996
- debugLogger5.warn("Failed to persist tool result:", error);
14031
+ debugLogger6.warn("Failed to persist tool result:", error);
13997
14032
  try {
13998
14033
  const fallback = await truncateAndSaveToFile(
13999
14034
  content,
@@ -14013,7 +14048,7 @@ async function persistAndTruncateToolResult(callId, toolName, content, config) {
14013
14048
  return { content: fallback.content, bytesWritten: 0 };
14014
14049
  } catch (fallbackError) {
14015
14050
  config.trackToolResultBytes(-byteSize);
14016
- debugLogger5.warn("Fallback truncation also failed:", fallbackError);
14051
+ debugLogger6.warn("Fallback truncation also failed:", fallbackError);
14017
14052
  return {
14018
14053
  content: buildStub(content, byteSize, "(disk persistence unavailable)"),
14019
14054
  bytesWritten: 0
@@ -14206,7 +14241,7 @@ function collectText(parts) {
14206
14241
  __name(collectText, "collectText");
14207
14242
 
14208
14243
  // packages/core/src/tools/mcp-tool.ts
14209
- var debugLogger6 = createDebugLogger("MCP_TOOL");
14244
+ var debugLogger7 = createDebugLogger("MCP_TOOL");
14210
14245
  var MCP_CONNECTION_ERROR_PATTERNS = [
14211
14246
  /ECONNREFUSED/i,
14212
14247
  /ENOTFOUND/i,
@@ -14217,6 +14252,51 @@ var MCP_CONNECTION_ERROR_PATTERNS = [
14217
14252
  /disconnected/i,
14218
14253
  /transport closed/i
14219
14254
  ];
14255
+ var MCP_REQUEST_TIMEOUT_CODE = -32001;
14256
+ function isMcpRequestTimeout(error) {
14257
+ return typeof error === "object" && error !== null && "code" in error && error.code === MCP_REQUEST_TIMEOUT_CODE;
14258
+ }
14259
+ __name(isMcpRequestTimeout, "isMcpRequestTimeout");
14260
+ function isExecutionTimeoutFailure(error, serverName, signal) {
14261
+ if (signal.aborted) return false;
14262
+ if (!isMcpRequestTimeout(error)) return false;
14263
+ const statuses = getAllMCPServerStatuses();
14264
+ return !(statuses.has(serverName) && statuses.get(serverName) === "disconnected" /* DISCONNECTED */);
14265
+ }
14266
+ __name(isExecutionTimeoutFailure, "isExecutionTimeoutFailure");
14267
+ var PARENT_ABORT_OUTCOME = Symbol("parent_abort_outcome");
14268
+ function createToolCallAbortError() {
14269
+ return Object.assign(new Error("Tool call aborted"), { name: "AbortError" });
14270
+ }
14271
+ __name(createToolCallAbortError, "createToolCallAbortError");
14272
+ function isParentAbortOutcome(value) {
14273
+ return typeof value === "object" && value !== null && PARENT_ABORT_OUTCOME in value;
14274
+ }
14275
+ __name(isParentAbortOutcome, "isParentAbortOutcome");
14276
+ function createParentAbortRace(signal, forwardAbort) {
14277
+ let onAbort;
14278
+ const promise = new Promise((resolve) => {
14279
+ onAbort = /* @__PURE__ */ __name(() => {
14280
+ const reason = createToolCallAbortError();
14281
+ resolve({ [PARENT_ABORT_OUTCOME]: true, reason });
14282
+ forwardAbort?.(reason);
14283
+ }, "onAbort");
14284
+ if (signal.aborted) {
14285
+ onAbort();
14286
+ } else {
14287
+ signal.addEventListener("abort", onAbort, { once: true });
14288
+ }
14289
+ });
14290
+ return {
14291
+ promise,
14292
+ dispose: /* @__PURE__ */ __name(() => {
14293
+ if (onAbort) {
14294
+ signal.removeEventListener("abort", onAbort);
14295
+ }
14296
+ }, "dispose")
14297
+ };
14298
+ }
14299
+ __name(createParentAbortRace, "createParentAbortRace");
14220
14300
  var DiscoveredMCPToolInvocation = class _DiscoveredMCPToolInvocation extends BaseToolInvocation {
14221
14301
  constructor(mcpTool, serverName, serverToolName, displayName, registeredToolName, permissionAliases, trust, params = {}, cliConfig, mcpClient, mcpTimeout, mcpToolIdleTimeoutMs, annotations, allowInvocationContext = false, retryCount = 0) {
14222
14302
  super(params);
@@ -14239,6 +14319,7 @@ var DiscoveredMCPToolInvocation = class _DiscoveredMCPToolInvocation extends Bas
14239
14319
  __name(this, "DiscoveredMCPToolInvocation");
14240
14320
  }
14241
14321
  static MAX_RECONNECT_RETRIES = 3;
14322
+ static UNSAFE_REPLAY_ERROR_MESSAGE = "MCP tool execution may have completed before the connection failed. Automatic replay was skipped because the call could not be verified as safe to replay. Do not retry automatically; verify the outcome before trying again.";
14242
14323
  /**
14243
14324
  * MCP tool default permission based on trust:
14244
14325
  * - trust: true in a trusted folder → 'allow' (server explicitly trusted by user config)
@@ -14286,33 +14367,42 @@ var DiscoveredMCPToolInvocation = class _DiscoveredMCPToolInvocation extends Bas
14286
14367
  return null;
14287
14368
  }
14288
14369
  try {
14289
- debugLogger6.info(
14370
+ debugLogger7.info(
14290
14371
  `Attempting to reconnect MCP server '${this.serverName}'...`
14291
14372
  );
14292
14373
  const toolRegistry = this.cliConfig.getToolRegistry();
14293
14374
  await toolRegistry.discoverToolsForServer(this.serverName);
14294
14375
  const newTool = await toolRegistry.ensureTool(this.registeredToolName);
14295
14376
  if (newTool instanceof DiscoveredMCPTool) {
14296
- debugLogger6.info(
14377
+ debugLogger7.info(
14297
14378
  `Successfully reconnected to MCP server '${this.serverName}'`
14298
14379
  );
14299
14380
  return newTool;
14300
14381
  }
14301
14382
  return null;
14302
14383
  } catch (error) {
14303
- debugLogger6.error(
14384
+ debugLogger7.error(
14304
14385
  `Failed to reconnect MCP server '${this.serverName}': ${error}`
14305
14386
  );
14306
14387
  return null;
14307
14388
  }
14308
14389
  }
14309
14390
  async handleReconnectOnError(error, signal, updateOutput) {
14310
- debugLogger6.error(`MCP server error '${this.serverName}': ${error}`);
14391
+ debugLogger7.error(`MCP server error '${this.serverName}': ${error}`);
14392
+ if (signal.aborted) {
14393
+ throw error;
14394
+ }
14311
14395
  if (!this.shouldAttemptReconnect(error)) {
14312
14396
  throw error;
14313
14397
  }
14398
+ if (!this.cliConfig) {
14399
+ throw error;
14400
+ }
14401
+ if (!this.canSafelyReplay()) {
14402
+ throw new Error(_DiscoveredMCPToolInvocation.UNSAFE_REPLAY_ERROR_MESSAGE);
14403
+ }
14314
14404
  if (this.retryCount < _DiscoveredMCPToolInvocation.MAX_RECONNECT_RETRIES) {
14315
- debugLogger6.info(
14405
+ debugLogger7.info(
14316
14406
  `Reconnection attempt ${this.retryCount + 1}/${_DiscoveredMCPToolInvocation.MAX_RECONNECT_RETRIES} for MCP server '${this.serverName}'`
14317
14407
  );
14318
14408
  const newTool = await this.attemptReconnect();
@@ -14324,25 +14414,39 @@ var DiscoveredMCPToolInvocation = class _DiscoveredMCPToolInvocation extends Bas
14324
14414
  this.displayName,
14325
14415
  newTool.name,
14326
14416
  newTool.permissionAliases,
14327
- this.trust,
14417
+ newTool.trust,
14328
14418
  this.params,
14329
14419
  this.cliConfig,
14330
14420
  newTool["mcpClient"],
14331
14421
  this.mcpTimeout,
14332
14422
  this.mcpToolIdleTimeoutMs,
14333
- this.annotations,
14423
+ newTool.annotations,
14334
14424
  newTool["allowInvocationContext"] === true,
14335
14425
  this.retryCount + 1
14336
14426
  );
14427
+ if (!newInvocation.canSafelyReplay()) {
14428
+ throw new Error(
14429
+ _DiscoveredMCPToolInvocation.UNSAFE_REPLAY_ERROR_MESSAGE
14430
+ );
14431
+ }
14337
14432
  return newInvocation.execute(signal, updateOutput);
14338
14433
  }
14339
14434
  } else if (this.retryCount >= _DiscoveredMCPToolInvocation.MAX_RECONNECT_RETRIES) {
14340
- debugLogger6.error(
14435
+ debugLogger7.error(
14341
14436
  `Max reconnection attempts (${_DiscoveredMCPToolInvocation.MAX_RECONNECT_RETRIES}) reached for MCP server '${this.serverName}'`
14342
14437
  );
14343
14438
  }
14344
14439
  throw error;
14345
14440
  }
14441
+ canSafelyReplay() {
14442
+ if (this.trust !== true || this.cliConfig?.isTrustedFolder() !== true || !this.annotations) {
14443
+ return false;
14444
+ }
14445
+ if (this.annotations.readOnlyHint === true && (this.annotations.destructiveHint === true || this.annotations.idempotentHint === false)) {
14446
+ return false;
14447
+ }
14448
+ return this.annotations.idempotentHint === true || this.annotations.readOnlyHint === true;
14449
+ }
14346
14450
  shouldAttemptReconnect(error) {
14347
14451
  if (isAbortError(error)) {
14348
14452
  return false;
@@ -14368,10 +14472,18 @@ var DiscoveredMCPToolInvocation = class _DiscoveredMCPToolInvocation extends Bas
14368
14472
  * MCP tool calls (e.g., browser automation).
14369
14473
  */
14370
14474
  async executeWithDirectClient(signal, updateOutput) {
14475
+ if (signal.aborted) {
14476
+ throw createToolCallAbortError();
14477
+ }
14371
14478
  const idleTimeoutController = new AbortController();
14479
+ const parentAbortController = new AbortController();
14480
+ const parentAbortRace = createParentAbortRace(signal, (reason) => {
14481
+ parentAbortController.abort(reason);
14482
+ });
14372
14483
  let idleTimeoutId;
14484
+ let idleTimeoutWon = false;
14373
14485
  const combinedSignal = AbortSignal.any([
14374
- signal,
14486
+ parentAbortController.signal,
14375
14487
  idleTimeoutController.signal
14376
14488
  ]);
14377
14489
  const resetIdleTimeout = /* @__PURE__ */ __name(() => {
@@ -14380,6 +14492,10 @@ var DiscoveredMCPToolInvocation = class _DiscoveredMCPToolInvocation extends Bas
14380
14492
  }
14381
14493
  if (this.mcpToolIdleTimeoutMs && this.mcpToolIdleTimeoutMs > 0) {
14382
14494
  const timer = setTimeout(() => {
14495
+ if (signal.aborted) {
14496
+ return;
14497
+ }
14498
+ idleTimeoutWon = true;
14383
14499
  const error = new Error(
14384
14500
  `MCP tool '${this.serverToolName}' on server '${this.serverName}' did not respond within ${this.mcpToolIdleTimeoutMs}ms idle timeout`
14385
14501
  );
@@ -14393,7 +14509,7 @@ var DiscoveredMCPToolInvocation = class _DiscoveredMCPToolInvocation extends Bas
14393
14509
  try {
14394
14510
  resetIdleTimeout();
14395
14511
  const invocationContext = this.allowInvocationContext ? getInvocationContext() : void 0;
14396
- const callToolResult = await this.mcpClient.callTool(
14512
+ const callPromise = this.mcpClient.callTool(
14397
14513
  {
14398
14514
  name: this.serverToolName,
14399
14515
  arguments: this.params,
@@ -14421,6 +14537,14 @@ var DiscoveredMCPToolInvocation = class _DiscoveredMCPToolInvocation extends Bas
14421
14537
  signal: combinedSignal
14422
14538
  }
14423
14539
  );
14540
+ const outcome = await Promise.race([
14541
+ callPromise,
14542
+ parentAbortRace.promise
14543
+ ]);
14544
+ if (isParentAbortOutcome(outcome)) {
14545
+ throw outcome.reason;
14546
+ }
14547
+ const callToolResult = outcome;
14424
14548
  const rawResponseParts = wrapMcpCallToolResultAsParts(
14425
14549
  this.serverToolName,
14426
14550
  callToolResult
@@ -14442,11 +14566,18 @@ var DiscoveredMCPToolInvocation = class _DiscoveredMCPToolInvocation extends Bas
14442
14566
  persistedOutputFiles: truncated.persistedOutputFiles
14443
14567
  };
14444
14568
  } catch (error) {
14569
+ if (idleTimeoutWon || isExecutionTimeoutFailure(error, this.serverName, signal)) {
14570
+ throw new StructuredToolError(
14571
+ getErrorMessage(error),
14572
+ "execution_timeout" /* EXECUTION_TIMEOUT */
14573
+ );
14574
+ }
14445
14575
  return this.handleReconnectOnError(error, signal, updateOutput);
14446
14576
  } finally {
14447
14577
  if (idleTimeoutId) {
14448
14578
  clearTimeout(idleTimeoutId);
14449
14579
  }
14580
+ parentAbortRace.dispose();
14450
14581
  }
14451
14582
  }
14452
14583
  /**
@@ -14454,38 +14585,26 @@ var DiscoveredMCPToolInvocation = class _DiscoveredMCPToolInvocation extends Bas
14454
14585
  * This path does NOT support progress notifications.
14455
14586
  */
14456
14587
  async executeWithCallableTool(signal) {
14588
+ if (signal.aborted) {
14589
+ throw createToolCallAbortError();
14590
+ }
14457
14591
  const functionCalls = [
14458
14592
  {
14459
14593
  name: this.serverToolName,
14460
14594
  args: this.params
14461
14595
  }
14462
14596
  ];
14597
+ const parentAbortRace = createParentAbortRace(signal);
14463
14598
  try {
14464
- const rawResponseParts = await new Promise((resolve, reject) => {
14465
- if (signal.aborted) {
14466
- const error = new Error("Tool call aborted");
14467
- error.name = "AbortError";
14468
- reject(error);
14469
- return;
14470
- }
14471
- const onAbort = /* @__PURE__ */ __name(() => {
14472
- cleanup();
14473
- const error = new Error("Tool call aborted");
14474
- error.name = "AbortError";
14475
- reject(error);
14476
- }, "onAbort");
14477
- const cleanup = /* @__PURE__ */ __name(() => {
14478
- signal.removeEventListener("abort", onAbort);
14479
- }, "cleanup");
14480
- signal.addEventListener("abort", onAbort, { once: true });
14481
- this.mcpTool.callTool(functionCalls).then((res) => {
14482
- cleanup();
14483
- resolve(res);
14484
- }).catch((err) => {
14485
- cleanup();
14486
- reject(err);
14487
- });
14488
- });
14599
+ const callPromise = this.mcpTool.callTool(functionCalls);
14600
+ const outcome = await Promise.race([
14601
+ callPromise,
14602
+ parentAbortRace.promise
14603
+ ]);
14604
+ if (isParentAbortOutcome(outcome)) {
14605
+ throw outcome.reason;
14606
+ }
14607
+ const rawResponseParts = outcome;
14489
14608
  if (this.isMCPToolError(rawResponseParts)) {
14490
14609
  return await this.buildMcpToolError(rawResponseParts, functionCalls[0]);
14491
14610
  }
@@ -14500,7 +14619,15 @@ var DiscoveredMCPToolInvocation = class _DiscoveredMCPToolInvocation extends Bas
14500
14619
  persistedOutputFiles: truncated.persistedOutputFiles
14501
14620
  };
14502
14621
  } catch (error) {
14622
+ if (isExecutionTimeoutFailure(error, this.serverName, signal)) {
14623
+ throw new StructuredToolError(
14624
+ getErrorMessage(error),
14625
+ "execution_timeout" /* EXECUTION_TIMEOUT */
14626
+ );
14627
+ }
14503
14628
  return this.handleReconnectOnError(error, signal);
14629
+ } finally {
14630
+ parentAbortRace.dispose();
14504
14631
  }
14505
14632
  }
14506
14633
  async buildMcpToolError(rawResponseParts, functionCall) {
@@ -14931,10 +15058,12 @@ var ToolCallEvent = class {
14931
15058
  }
14932
15059
  "event.name";
14933
15060
  "event.timestamp";
15061
+ call_id;
14934
15062
  function_name;
14935
15063
  function_args;
14936
15064
  duration_ms;
14937
15065
  status;
15066
+ execution_status;
14938
15067
  success;
14939
15068
  // Keep for backward compatibility
14940
15069
  decision;
@@ -14950,10 +15079,12 @@ var ToolCallEvent = class {
14950
15079
  constructor(call) {
14951
15080
  this["event.name"] = "tool_call";
14952
15081
  this["event.timestamp"] = (/* @__PURE__ */ new Date()).toISOString();
15082
+ this.call_id = call.request.callId;
14953
15083
  this.function_name = call.request.name;
14954
15084
  this.function_args = call.request.name === ToolNames.STRUCTURED_OUTPUT ? { ...STRUCTURED_OUTPUT_REDACTED_ARGS } : call.request.args;
14955
15085
  this.duration_ms = call.durationMs ?? 0;
14956
15086
  this.status = call.status;
15087
+ this.execution_status = call.response.executionStatus;
14957
15088
  this.success = call.status === "success";
14958
15089
  this.decision = call.outcome ? getDecisionFromOutcome(call.outcome) : void 0;
14959
15090
  this.error = call.response.error?.message;
@@ -16154,7 +16285,7 @@ async function runSideQuery(config, options) {
16154
16285
  __name(runSideQuery, "runSideQuery");
16155
16286
 
16156
16287
  // packages/core/src/services/visionBridge/vision-bridge-service.ts
16157
- var debugLogger7 = createDebugLogger("VISION_BRIDGE");
16288
+ var debugLogger8 = createDebugLogger("VISION_BRIDGE");
16158
16289
  var turnImageCounts = /* @__PURE__ */ new WeakMap();
16159
16290
  var BRIDGE_MAX_OUTPUT_TOKENS = 2048;
16160
16291
  var VISION_BRIDGE_TIMEOUT_MS = 3e4;
@@ -16424,7 +16555,7 @@ async function runVisionBridge(params) {
16424
16555
  try {
16425
16556
  timeoutSignal = AbortSignal.timeout(timeoutMs);
16426
16557
  combinedSignal = AbortSignal.any([signal, timeoutSignal]);
16427
- debugLogger7.debug(`calling ${modelId} for ${toConvert.length} image(s)`);
16558
+ debugLogger8.debug(`calling ${modelId} for ${toConvert.length} image(s)`);
16428
16559
  const { text } = await runSideQuery(config, {
16429
16560
  contents: requestContents,
16430
16561
  abortSignal: combinedSignal,
@@ -16443,7 +16574,7 @@ async function runVisionBridge(params) {
16443
16574
  });
16444
16575
  const description = stripThinkTags(text ?? "");
16445
16576
  if (description.length === 0) {
16446
- debugLogger7.warn(`${modelId} returned an empty description`);
16577
+ debugLogger8.warn(`${modelId} returned an empty description`);
16447
16578
  return failure(
16448
16579
  "the vision model returned no description",
16449
16580
  parts,
@@ -16451,7 +16582,7 @@ async function runVisionBridge(params) {
16451
16582
  { modelId, ...egress }
16452
16583
  );
16453
16584
  }
16454
- debugLogger7.debug(
16585
+ debugLogger8.debug(
16455
16586
  `vision bridge transcription via ${modelId} (${description.length} chars)`
16456
16587
  );
16457
16588
  return {
@@ -16477,7 +16608,7 @@ async function runVisionBridge(params) {
16477
16608
  };
16478
16609
  } catch (error) {
16479
16610
  if (signal.aborted) {
16480
- debugLogger7.debug(`conversion cancelled via ${modelId}`);
16611
+ debugLogger8.debug(`conversion cancelled via ${modelId}`);
16481
16612
  return {
16482
16613
  applied: false,
16483
16614
  status: "skipped",
@@ -16489,13 +16620,13 @@ async function runVisionBridge(params) {
16489
16620
  }
16490
16621
  const timedOut = !!combinedSignal?.aborted && !!timeoutSignal?.aborted;
16491
16622
  if (timedOut && attempt < VISION_BRIDGE_MAX_ATTEMPTS) {
16492
- debugLogger7.warn(
16623
+ debugLogger8.warn(
16493
16624
  `conversion attempt ${attempt} via ${modelId} timed out after ${timeoutMs}ms; retrying`
16494
16625
  );
16495
16626
  continue;
16496
16627
  }
16497
16628
  const reason = timedOut ? `timed out after ${timeoutMs}ms (${VISION_BRIDGE_MAX_ATTEMPTS} attempts)` : error instanceof Error ? error.message : String(error);
16498
- debugLogger7.warn(`conversion failed via ${modelId}: ${reason}`);
16629
+ debugLogger8.warn(`conversion failed via ${modelId}: ${reason}`);
16499
16630
  return failure(reason, parts, omittedCount, {
16500
16631
  modelId,
16501
16632
  // The timeout message is safe to show; an arbitrary provider error is not
@@ -16510,7 +16641,7 @@ async function runVisionBridge(params) {
16510
16641
  __name(runVisionBridge, "runVisionBridge");
16511
16642
 
16512
16643
  // packages/core/src/tools/read-file.ts
16513
- var debugLogger8 = createDebugLogger("READ_FILE_CACHE");
16644
+ var debugLogger9 = createDebugLogger("READ_FILE_CACHE");
16514
16645
  var ReadFileToolInvocation = class extends BaseToolInvocation {
16515
16646
  constructor(config, params) {
16516
16647
  super(params);
@@ -16562,7 +16693,7 @@ var ReadFileToolInvocation = class extends BaseToolInvocation {
16562
16693
  try {
16563
16694
  stats = await fs7.stat(absPath);
16564
16695
  } catch (err) {
16565
- debugLogger8.debug("stat-failed", {
16696
+ debugLogger9.debug("stat-failed", {
16566
16697
  path: absPath,
16567
16698
  code: err.code
16568
16699
  });
@@ -16572,10 +16703,10 @@ var ReadFileToolInvocation = class extends BaseToolInvocation {
16572
16703
  if (status.state === "fresh" && status.entry.lastReadAt !== void 0 && status.entry.lastReadWasFull && status.entry.lastReadCacheable && // Only quote-back if that read is still in history (issue
16573
16704
  // #4239: idle microcompaction flips this off when it blanks it).
16574
16705
  status.entry.readResidentInHistory && (status.entry.lastWriteAt === void 0 || status.entry.lastReadAt > status.entry.lastWriteAt)) {
16575
- debugLogger8.debug("hit", { path: absPath });
16706
+ debugLogger9.debug("hit", { path: absPath });
16576
16707
  return this.unchangedResult(absPath);
16577
16708
  }
16578
- debugLogger8.debug("miss", { path: absPath, state: status.state });
16709
+ debugLogger9.debug("miss", { path: absPath, state: status.state });
16579
16710
  }
16580
16711
  const prepareForVisionBridge = shouldRunVisionBridge(this.config);
16581
16712
  let result = await processSingleFileContent(
@@ -16660,7 +16791,7 @@ ${result.llmContent}`;
16660
16791
  if (!candidate) return result;
16661
16792
  const { imageParts } = splitImageParts(result.llmContent);
16662
16793
  if (imageParts.length === 0 || !hasImageParts(imageParts)) {
16663
- debugLogger8.debug("pdf vision bridge candidate contained no images");
16794
+ debugLogger9.debug("pdf vision bridge candidate contained no images");
16664
16795
  return this.restorePdfFallback(result, "Vision bridge could not run.");
16665
16796
  }
16666
16797
  const sourceContext = {
@@ -16681,7 +16812,7 @@ ${result.llmContent}`;
16681
16812
  const notice = formatVisionBridgeNotice(bridgeResult);
16682
16813
  if (bridgeResult.status === "ok" && bridgeResult.applied && bridgeResult.parts != null) {
16683
16814
  if (bridgeResult.convertedCount !== imageParts.length || bridgeResult.omittedCount !== 0) {
16684
- debugLogger8.debug("pdf vision bridge omitted candidate pages");
16815
+ debugLogger9.debug("pdf vision bridge omitted candidate pages");
16685
16816
  return this.restorePdfFallback(
16686
16817
  result,
16687
16818
  `${notice} The transcription was discarded because the bridge did not transcribe every rendered PDF page.`
@@ -16691,7 +16822,7 @@ ${result.llmContent}`;
16691
16822
  if (bridgedParts.some(
16692
16823
  (part) => part.inlineData != null || part.fileData != null
16693
16824
  )) {
16694
- debugLogger8.debug("pdf vision bridge returned media data");
16825
+ debugLogger9.debug("pdf vision bridge returned media data");
16695
16826
  return this.restorePdfFallback(
16696
16827
  result,
16697
16828
  `${notice} The transcription was discarded because the bridge returned an unsafe media payload.`
@@ -16725,7 +16856,7 @@ ${result.llmContent}`;
16725
16856
  );
16726
16857
  } catch (error) {
16727
16858
  signal.throwIfAborted();
16728
- debugLogger8.debug(
16859
+ debugLogger9.debug(
16729
16860
  `pdf vision bridge failed before replacement: ${String(error instanceof Error ? error.message : error)}`
16730
16861
  );
16731
16862
  return this.restorePdfFallback(