@qwen-code/qwen-code 0.19.7 → 0.19.8

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 (228) hide show
  1. package/bundled/qc-helper/docs/features/channels/overview.md +15 -8
  2. package/bundled/qc-helper/docs/features/channels/plugins.md +1 -0
  3. package/bundled/qc-helper/docs/features/hooks.md +36 -34
  4. package/bundled/qc-helper/docs/features/memory.md +1 -1
  5. package/bundled/qc-helper/docs/qwen-serve.md +17 -10
  6. package/bundled/review/SKILL.md +6 -2
  7. package/chunks/{MaxSizedBox-XY5LIO5O.js → MaxSizedBox-5DT2SD7B.js} +7 -7
  8. package/chunks/{StandaloneSessionPicker-APISIRJZ.js → StandaloneSessionPicker-EYRGH6PJ.js} +23 -21
  9. package/chunks/{acpAgent-MMOSC2YA.js → acpAgent-GRFTTRHW.js} +74 -69
  10. package/chunks/{agent-TKIBLLQT.js → agent-H2DGKS77.js} +4 -4
  11. package/chunks/{agent-headless-VLX4C7KX.js → agent-headless-KFMFIT6J.js} +4 -4
  12. package/chunks/{anthropicContentGenerator-AKYPSZIV.js → anthropicContentGenerator-CPF22MA7.js} +28 -1
  13. package/chunks/{bridge-BCU73DZO.js → bridge-NA3ZQQKJ.js} +11 -10
  14. package/chunks/{ca-HCMB2I54.js → ca-MKD32FQL.js} +26 -1
  15. package/chunks/{channel-worker-supervisor-CRCVYQIE.js → channel-worker-supervisor-NZQUOEFJ.js} +3 -3
  16. package/chunks/{chunk-B4U2M63D.js → chunk-27BHARDE.js} +8 -8
  17. package/chunks/{chunk-OWVIH4HY.js → chunk-2EM7ECZD.js} +251 -71
  18. package/chunks/{chunk-YEGT55NW.js → chunk-3GNOQZDC.js} +1562 -1025
  19. package/chunks/{chunk-G7ZG7CA6.js → chunk-3UP777ZS.js} +8 -7
  20. package/chunks/{chunk-VEB3NYSO.js → chunk-5MBO76SL.js} +5 -0
  21. package/chunks/{chunk-ALZ75L2X.js → chunk-6VK6FIMQ.js} +1 -1
  22. package/chunks/{chunk-SD4N3QJ2.js → chunk-A5JOJ77H.js} +35 -14
  23. package/chunks/{chunk-NZEGNV4V.js → chunk-AYNCLGTW.js} +5 -5
  24. package/chunks/{chunk-AJBEAUIS.js → chunk-BOBOCR5H.js} +4 -3
  25. package/chunks/chunk-BOBRZZKD.js +468 -0
  26. package/chunks/{chunk-GMOWQOQQ.js → chunk-BUZ6HGL4.js} +5 -5
  27. package/chunks/{chunk-PRDFOIZF.js → chunk-BVYU3ZTI.js} +2 -2
  28. package/chunks/{chunk-TBAZMRW3.js → chunk-CD6USWHZ.js} +1 -1
  29. package/chunks/{chunk-YDSYD7UI.js → chunk-CHB5SLZZ.js} +2 -2
  30. package/chunks/{chunk-FRFFNYUY.js → chunk-DCZWC4PF.js} +2 -2
  31. package/chunks/{chunk-XSAFNANZ.js → chunk-DHOLNQLC.js} +11 -11
  32. package/chunks/{chunk-MIG5SQNL.js → chunk-DICGXFAI.js} +1 -1
  33. package/chunks/{chunk-4ZJIPVPB.js → chunk-DIWVZ3VM.js} +8 -8
  34. package/chunks/{chunk-VQWAZSXN.js → chunk-E7EMCSUG.js} +1 -1
  35. package/chunks/{chunk-Q6OEPOOC.js → chunk-EEN2TKST.js} +1 -1
  36. package/chunks/{chunk-DNV4FSN5.js → chunk-FBET5XZ2.js} +6 -4
  37. package/chunks/{chunk-QZF5U5KA.js → chunk-FQNC62B2.js} +4 -4
  38. package/chunks/{chunk-B34OV7K2.js → chunk-GGQQA4JW.js} +13 -0
  39. package/chunks/chunk-GLE2YUPU.js +34 -0
  40. package/chunks/{chunk-X265R5C6.js → chunk-GN3F6PIU.js} +1 -1
  41. package/chunks/{chunk-FTFXDZYI.js → chunk-GSHQYYIV.js} +45 -9
  42. package/chunks/{chunk-MJI36HER.js → chunk-HDOH3QYE.js} +1 -1
  43. package/chunks/{chunk-CISB3IQF.js → chunk-I6WGFJJ3.js} +63 -4
  44. package/chunks/{chunk-2NPS2UDH.js → chunk-IBY3Q3HG.js} +390 -9
  45. package/chunks/{chunk-LEIJKM7Q.js → chunk-J7RCB6N5.js} +1 -1
  46. package/chunks/{chunk-4UCTWSTP.js → chunk-JCH35JB3.js} +1 -1
  47. package/chunks/{chunk-CNSF3WO5.js → chunk-JPALE3PA.js} +3 -3
  48. package/chunks/{chunk-P7I3D7FM.js → chunk-JRQ7EVGE.js} +1 -1
  49. package/chunks/{chunk-24XYI5EI.js → chunk-JZHIQJOE.js} +3 -3
  50. package/chunks/{chunk-7JGISHHZ.js → chunk-L46XKEGM.js} +14 -153
  51. package/chunks/{chunk-HJ3GX3Y3.js → chunk-L4AMBVQG.js} +9 -9
  52. package/chunks/{chunk-JF7DFPQ5.js → chunk-LAXNEOBG.js} +1 -1
  53. package/chunks/{chunk-STAZRKOT.js → chunk-M7S4GK5Z.js} +66 -445
  54. package/chunks/{chunk-4RQIB5UZ.js → chunk-O2YT7VB4.js} +0 -34
  55. package/chunks/{chunk-QAKFYMJI.js → chunk-O33TBKDC.js} +10 -10
  56. package/chunks/chunk-O7FIRWJV.js +168 -0
  57. package/chunks/{chunk-4KJ2BPIT.js → chunk-OACJLMLD.js} +2 -38
  58. package/chunks/{chunk-6BN7NZ5Z.js → chunk-ON3JA3RU.js} +2 -2
  59. package/chunks/{chunk-IUE7YWC3.js → chunk-OQXDAMKY.js} +3 -3
  60. package/chunks/{chunk-DGHJTO2K.js → chunk-P3XEEI3X.js} +1 -1
  61. package/chunks/{chunk-U4FRHCLA.js → chunk-PMFULMLX.js} +296 -81
  62. package/chunks/{chunk-XISQIIT7.js → chunk-PUVCVELY.js} +1 -1
  63. package/chunks/{chunk-PUQLHSQ2.js → chunk-RMLZAUWH.js} +4 -4
  64. package/chunks/{chunk-JD33UY7E.js → chunk-SQ2UATK7.js} +14 -8
  65. package/chunks/{chunk-4O344UEE.js → chunk-TI3BWD4D.js} +1 -1
  66. package/chunks/{chunk-AIY5UTFI.js → chunk-TSPB77TG.js} +57 -35
  67. package/chunks/{chunk-XPJH4PKR.js → chunk-UX6OTBVD.js} +1 -1
  68. package/chunks/{chunk-GD236YPV.js → chunk-UXEW557D.js} +1 -1
  69. package/chunks/chunk-V35MD7KN.js +13 -0
  70. package/chunks/{chunk-RYFZCUJO.js → chunk-VGGOPZUL.js} +6 -5
  71. package/chunks/{chunk-65CFHNSE.js → chunk-WF4FAXDL.js} +2 -2
  72. package/chunks/{chunk-ME3YSROJ.js → chunk-WHJQ3JUS.js} +20 -8
  73. package/chunks/{chunk-BWVQN2HV.js → chunk-WQTHLB5T.js} +3 -3
  74. package/chunks/chunk-XNXVCNAT.js +88 -0
  75. package/chunks/{chunk-TDGF35EN.js → chunk-XOHNA2S6.js} +1 -1
  76. package/chunks/{chunk-GL5TV7B5.js → chunk-XYR5RUA5.js} +14 -5
  77. package/chunks/{chunk-I4A4K72C.js → chunk-YDOXPLYL.js} +244 -47
  78. package/chunks/{chunk-AFOLR6YL.js → chunk-YHKAK72D.js} +11 -11
  79. package/chunks/{chunk-RFIL6REB.js → chunk-YKZIAK7C.js} +119 -29
  80. package/chunks/chunk-Z3I3QJK3.js +47 -0
  81. package/chunks/{chunk-ADZG46HR.js → chunk-ZE6E424U.js} +1 -1
  82. package/chunks/chunk-ZL5HN75Q.js +61 -0
  83. package/chunks/{computer-use-X4KUU3NM.js → computer-use-WMY3UOBX.js} +4 -4
  84. package/chunks/{contextCommand-LAYJZF7H.js → contextCommand-LXFZRP4L.js} +6 -6
  85. package/chunks/{daemon-F3I2RXP6.js → daemon-WPAENEBW.js} +48 -0
  86. package/chunks/{daemon-status-provider-XSAFKVDS.js → daemon-status-provider-GJRXY5EN.js} +15 -13
  87. package/chunks/{de-PLLFDERI.js → de-ZFPPQVSF.js} +26 -1
  88. package/chunks/{dist-IMFFBMAT.js → dist-BEXOZXLQ.js} +1 -1
  89. package/chunks/{dist-OT7G2WNM.js → dist-E6UANPIM.js} +1 -1
  90. package/chunks/{dist-FQ5WRJPL.js → dist-H2AEJCZ5.js} +2 -2
  91. package/chunks/{dist-YTRKAVUB.js → dist-O2IRTRPP.js} +1 -1
  92. package/chunks/{dist-573HNSVO.js → dist-SCFLLYMK.js} +1 -1
  93. package/chunks/{dist-PKFTNUHO.js → dist-Z34QPAQW.js} +1 -1
  94. package/chunks/{earlyInputCapture-AERYYGXE.js → earlyInputCapture-KNOYZ4MJ.js} +4 -4
  95. package/chunks/{edit-WZTZDGCI.js → edit-OTYWAXGP.js} +5 -5
  96. package/chunks/{en-GA2RMXY5.js → en-N4EPZAQI.js} +26 -1
  97. package/chunks/{enter-worktree-DEPXBJEL.js → enter-worktree-HNYBDVCX.js} +4 -4
  98. package/chunks/{enterPlanMode-JFGXZHHJ.js → enterPlanMode-CJCNGT63.js} +4 -4
  99. package/chunks/environment-ATFTYMLZ.js +88 -0
  100. package/chunks/{errors-GMZL4QV7.js → errors-A54HAADA.js} +6 -6
  101. package/chunks/{exit-worktree-Y7XBK3VV.js → exit-worktree-DUUKOE3X.js} +4 -4
  102. package/chunks/{exitPlanMode-WQQER65F.js → exitPlanMode-AMMSXOAJ.js} +4 -4
  103. package/chunks/{fast-path-W2U6XDNO.js → fast-path-OV6NIP3K.js} +12 -3
  104. package/chunks/{fast-path-settings-RCRXH2JG.js → fast-path-settings-7RIFI3PK.js} +3 -2
  105. package/chunks/{fr-GWNQG4XH.js → fr-5WWMY53B.js} +26 -1
  106. package/chunks/{gemini-T4WX6SRW.js → gemini-NQ3WWBKB.js} +431 -135
  107. package/chunks/{geminiContentGenerator-MKQACXEJ.js → geminiContentGenerator-CDUNEJQE.js} +1 -1
  108. package/chunks/{glob-4KKSHZDF.js → glob-ROV3YS4R.js} +4 -4
  109. package/chunks/{grep-GHRYXSLZ.js → grep-NRITKDCD.js} +4 -4
  110. package/chunks/{handleAutoUpdate-HN7ZOSXY.js → handleAutoUpdate-CEZJAARW.js} +6 -6
  111. package/chunks/{initializer-SRN3IM42.js → initializer-BRFJKRRX.js} +11 -9
  112. package/chunks/{ja-2HOTA47X.js → ja-CUHZOLEJ.js} +26 -1
  113. package/chunks/{list-INTVXUPA.js → list-KVHF7O4X.js} +13 -11
  114. package/chunks/{loadedSettingsAdapter-QVHHQPGM.js → loadedSettingsAdapter-LL5PSFKX.js} +11 -9
  115. package/chunks/{ls-L654WOAT.js → ls-7MFU2QYW.js} +1 -1
  116. package/chunks/{lsp-M35KE54Y.js → lsp-XHDTPTGV.js} +2 -4
  117. package/chunks/{mcp-7V4T46RG.js → mcp-3GCXRTOQ.js} +11 -9
  118. package/chunks/{monitor-464OY2UE.js → monitor-FL2ZO33W.js} +4 -4
  119. package/chunks/{nonInteractiveCli-LJEEODU2.js → nonInteractiveCli-PTQI3DV6.js} +44 -41
  120. package/chunks/{notebook-edit-BLJYCNDO.js → notebook-edit-6PULTHL5.js} +5 -5
  121. package/chunks/{openaiContentGenerator-PFF6HYB2.js → openaiContentGenerator-YE42PKCY.js} +3 -3
  122. package/chunks/{pidfile-LIBUENIV.js → pidfile-NZYSCFRK.js} +4 -4
  123. package/chunks/{pt-2THT3YHA.js → pt-OLYN42DS.js} +26 -1
  124. package/chunks/{qwenContentGenerator-SUUHZ6CR.js → qwenContentGenerator-NX2E7PB7.js} +5 -5
  125. package/chunks/{read-file-L7TBQVX7.js → read-file-33XGP5HF.js} +2 -2
  126. package/chunks/{record-artifact-PP3LKHTS.js → record-artifact-SQ2OKRJW.js} +3 -3
  127. package/chunks/{ripGrep-CKKX3GRB.js → ripGrep-QWZLGTAN.js} +4 -4
  128. package/chunks/{ru-Z67YJHBG.js → ru-LDM3GWVQ.js} +26 -1
  129. package/chunks/{run-qwen-serve-5OKADVLE.js → run-qwen-serve-JK2DL7PI.js} +596 -143
  130. package/chunks/{scheduler-ZRW3AIDU.js → scheduler-O4IGVZKK.js} +4 -4
  131. package/chunks/{send-message-OA6MV4EU.js → send-message-76GT3JMC.js} +1 -1
  132. package/chunks/{serve-36WS32W6.js → serve-JTMIGANH.js} +13 -10
  133. package/chunks/{server-M372UENX.js → server-SGNPKX2O.js} +667 -243
  134. package/chunks/{session-F5KSNP2N.js → session-5BNM25EZ.js} +45 -42
  135. package/chunks/{settings-WFLNS3WT.js → settings-3MI4XXP6.js} +20 -16
  136. package/chunks/{shell-DEDSWN56.js → shell-YJKBE67T.js} +4 -4
  137. package/chunks/{skill-A2TL2NPC.js → skill-I22QK5XS.js} +2 -2
  138. package/chunks/{spawnChannel-RQHUWTCL.js → spawnChannel-UNV6W4DU.js} +6 -6
  139. package/chunks/{src-XKZMNHXS.js → src-BBQSM46M.js} +8 -4
  140. package/chunks/{startInteractiveUI-REKSTOHU.js → startInteractiveUI-JII36UGN.js} +619 -288
  141. package/chunks/{task-create-RPFZNB4B.js → task-create-WCHTB435.js} +2 -2
  142. package/chunks/{task-update-5WUG5MVQ.js → task-update-XYWMHJGJ.js} +2 -2
  143. package/chunks/{team-create-TBQVWAG7.js → team-create-A7NUU5AQ.js} +4 -4
  144. package/chunks/{team-plan-approval-FZPGUSHJ.js → team-plan-approval-TOQRJ2KI.js} +4 -4
  145. package/chunks/{theme-manager-DQZVNSOC.js → theme-manager-WZ4RRMMB.js} +4 -4
  146. package/chunks/{tool-search-FDQ3SLNJ.js → tool-search-SZ4EFS2T.js} +3 -3
  147. package/chunks/total-session-admission-ULXJWXFV.js +72 -0
  148. package/chunks/{trustedFolders-Z475EIHL.js → trustedFolders-LAZZPZ3D.js} +5 -5
  149. package/chunks/{updateCheck-E2ZX7RL7.js → updateCheck-KONLM73X.js} +5 -5
  150. package/chunks/{validateNonInterActiveAuth-O4ECBHQL.js → validateNonInterActiveAuth-MPKSRCXD.js} +41 -38
  151. package/chunks/{version-CEDD6ZZR.js → version-NO2XSNNP.js} +1 -1
  152. package/chunks/{workflow-CQQ4J4I6.js → workflow-WO2H6NRI.js} +5 -5
  153. package/chunks/{workspace-providers-status-MVYXMYDG.js → workspace-providers-status-3W7E7DFW.js} +14 -11
  154. package/chunks/workspace-registry-SXJZNN3O.js +74 -0
  155. package/chunks/{workspace-service-OMBR6ZLG.js → workspace-service-CZRQZ4Q4.js} +17 -15
  156. package/chunks/{workspace-skills-status-IMMQ7CAY.js → workspace-skills-status-K7WFREPD.js} +12 -10
  157. package/chunks/{write-file-VWGY7AJP.js → write-file-PX2Z7IBE.js} +5 -5
  158. package/chunks/{zh-7XVVRTDH.js → zh-J4F6QWQV.js} +26 -1
  159. package/chunks/{zh-TW-DPH554OG.js → zh-TW-XVDWOLSW.js} +26 -1
  160. package/cli.js +11 -11
  161. package/locales/ca.js +30 -0
  162. package/locales/de.js +30 -0
  163. package/locales/en.js +30 -0
  164. package/locales/fr.js +30 -0
  165. package/locales/ja.js +30 -0
  166. package/locales/pt.js +30 -0
  167. package/locales/ru.js +30 -0
  168. package/locales/zh-TW.js +30 -0
  169. package/locales/zh.js +30 -0
  170. package/node_modules/@qwen-code/audio-capture/package.json +1 -1
  171. package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-arm64/@qwen-code+audio-capture.node +0 -0
  172. package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-x64/@qwen-code+audio-capture.node +0 -0
  173. package/node_modules/@qwen-code/audio-capture/prebuilds/win32-x64/@qwen-code+audio-capture.node +0 -0
  174. package/package.json +3 -3
  175. package/web-shell/assets/{arc-C7hjaa7g.js → arc-BWyoJpY2.js} +1 -1
  176. package/web-shell/assets/{architectureDiagram-3BPJPVTR-pm9KtMZY.js → architectureDiagram-3BPJPVTR-BT0mGrz2.js} +1 -1
  177. package/web-shell/assets/{blockDiagram-GPEHLZMM-CApElKsU.js → blockDiagram-GPEHLZMM-BLgUWvyf.js} +1 -1
  178. package/web-shell/assets/{c4Diagram-AAUBKEIU-BeDe0-9N.js → c4Diagram-AAUBKEIU-DYx9M7oU.js} +1 -1
  179. package/web-shell/assets/channel-wmPUGHtg.js +1 -0
  180. package/web-shell/assets/{chunk-2J33WTMH-DJEkmLdl.js → chunk-2J33WTMH-CfMHWbuZ.js} +1 -1
  181. package/web-shell/assets/{chunk-4BX2VUAB-DXX8gdpe.js → chunk-4BX2VUAB-B1URoqEV.js} +1 -1
  182. package/web-shell/assets/{chunk-55IACEB6-DORmk1kQ.js → chunk-55IACEB6-DAIaM4QF.js} +1 -1
  183. package/web-shell/assets/{chunk-727SXJPM-DWmO4mCZ.js → chunk-727SXJPM-B2X34knw.js} +1 -1
  184. package/web-shell/assets/{chunk-AQP2D5EJ-C7LRaYw2.js → chunk-AQP2D5EJ-Cif-zLTQ.js} +1 -1
  185. package/web-shell/assets/{chunk-FMBD7UC4-CCdXgyC5.js → chunk-FMBD7UC4-H18WCXdY.js} +1 -1
  186. package/web-shell/assets/{chunk-ND2GUHAM-SyL_xvWc.js → chunk-ND2GUHAM-YFtetHi0.js} +1 -1
  187. package/web-shell/assets/{chunk-QZHKN3VN-BzOuCKxa.js → chunk-QZHKN3VN-By2hiH3r.js} +1 -1
  188. package/web-shell/assets/classDiagram-4FO5ZUOK-BA2ljEjW.js +1 -0
  189. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BA2ljEjW.js +1 -0
  190. package/web-shell/assets/{cose-bilkent-S5V4N54A-BMPWyDKc.js → cose-bilkent-S5V4N54A-VrcnnLZu.js} +1 -1
  191. package/web-shell/assets/{dagre-BM42HDAG-B_GnPWik.js → dagre-BM42HDAG-CGo-IaVV.js} +1 -1
  192. package/web-shell/assets/{diagram-2AECGRRQ-fJqMc3S_.js → diagram-2AECGRRQ-Dl4QjzIB.js} +1 -1
  193. package/web-shell/assets/{diagram-5GNKFQAL-ximV3O9D.js → diagram-5GNKFQAL-qMLmsO0u.js} +1 -1
  194. package/web-shell/assets/{diagram-KO2AKTUF-2vVyjzqw.js → diagram-KO2AKTUF-CHlmuxPI.js} +1 -1
  195. package/web-shell/assets/{diagram-LMA3HP47-Dckcx1sT.js → diagram-LMA3HP47-BUwU3GwT.js} +1 -1
  196. package/web-shell/assets/{diagram-OG6HWLK6-BAVv47ga.js → diagram-OG6HWLK6-HEhwPDUM.js} +1 -1
  197. package/web-shell/assets/{erDiagram-TEJ5UH35-Bn3nf5J0.js → erDiagram-TEJ5UH35-1n0llBmM.js} +1 -1
  198. package/web-shell/assets/{flowDiagram-I6XJVG4X-BIbGF9JT.js → flowDiagram-I6XJVG4X-BN74uMnt.js} +1 -1
  199. package/web-shell/assets/{ganttDiagram-6RSMTGT7-CDbhb3AH.js → ganttDiagram-6RSMTGT7-BoOq78i3.js} +1 -1
  200. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-CbKG1a_w.js → gitGraphDiagram-PVQCEYII-CN8b00c8.js} +1 -1
  201. package/web-shell/assets/index-CNwoO1Cn.js +783 -0
  202. package/web-shell/assets/index-CWQ0z6kZ.css +5 -0
  203. package/web-shell/assets/{infoDiagram-5YYISTIA-DUFxTy8m.js → infoDiagram-5YYISTIA-CCurnIna.js} +1 -1
  204. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-D69hrBG8.js → ishikawaDiagram-YF4QCWOH-AwuRqdUP.js} +1 -1
  205. package/web-shell/assets/{journeyDiagram-JHISSGLW-DsvEw51Y.js → journeyDiagram-JHISSGLW-B7IICk-E.js} +1 -1
  206. package/web-shell/assets/{kanban-definition-UN3LZRKU-lFFjZEYd.js → kanban-definition-UN3LZRKU-BYF0OKhx.js} +1 -1
  207. package/web-shell/assets/{linear-Bo5bWzvo.js → linear-GWWguGfD.js} +1 -1
  208. package/web-shell/assets/{mermaid.core-C_HKMJx5.js → mermaid.core-JqtkxvCl.js} +5 -5
  209. package/web-shell/assets/{mindmap-definition-RKZ34NQL-DlV-NUTs.js → mindmap-definition-RKZ34NQL-B0MmHsZ6.js} +1 -1
  210. package/web-shell/assets/{pieDiagram-4H26LBE5-B2e6FH2a.js → pieDiagram-4H26LBE5-DhImUZLQ.js} +1 -1
  211. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-D75kSk-b.js → quadrantDiagram-W4KKPZXB-DGeSC3DT.js} +1 -1
  212. package/web-shell/assets/{requirementDiagram-4Y6WPE33-CQ6xakhM.js → requirementDiagram-4Y6WPE33-DkspY6Re.js} +1 -1
  213. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-J_XTKrcY.js → sankeyDiagram-5OEKKPKP-CaOofS2x.js} +1 -1
  214. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-D7jTcBtf.js → sequenceDiagram-3UESZ5HK-DFQ_kFnN.js} +1 -1
  215. package/web-shell/assets/{stateDiagram-AJRCARHV-CrlM_OT3.js → stateDiagram-AJRCARHV-D3snw0Tz.js} +1 -1
  216. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-BbSm_9d0.js +1 -0
  217. package/web-shell/assets/{timeline-definition-PNZ67QCA-5oZi76Ef.js → timeline-definition-PNZ67QCA-l4zH8nLM.js} +1 -1
  218. package/web-shell/assets/{vennDiagram-CIIHVFJN-DO5YptPK.js → vennDiagram-CIIHVFJN-BnRlA98M.js} +1 -1
  219. package/web-shell/assets/{wardley-L42UT6IY-4t1eJDvM.js → wardley-L42UT6IY-BS0xUdmd.js} +1 -1
  220. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-DKZc661S.js → wardleyDiagram-YWT4CUSO-DKGBUWyQ.js} +1 -1
  221. package/web-shell/assets/{xychartDiagram-2RQKCTM6-su9hp08G.js → xychartDiagram-2RQKCTM6-DVb2HuOB.js} +1 -1
  222. package/web-shell/index.html +2 -2
  223. package/web-shell/assets/channel-BNf1dW-j.js +0 -1
  224. package/web-shell/assets/classDiagram-4FO5ZUOK-uOIGlzgi.js +0 -1
  225. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-uOIGlzgi.js +0 -1
  226. package/web-shell/assets/index-CnE2ur2L.js +0 -779
  227. package/web-shell/assets/index-hSKXrlSE.css +0 -5
  228. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-Bs4TK_84.js +0 -1
@@ -1,11 +1,68 @@
1
1
  // Force strict mode and setup for ESM
2
2
  "use strict";
3
+ import {
4
+ DualOutputContext,
5
+ useDualOutput,
6
+ useGeminiStream
7
+ } from "./chunk-L4AMBVQG.js";
8
+ import {
9
+ MAX_SUGGESTIONS_TO_SHOW,
10
+ MAX_WIDTH,
11
+ SuggestionsDisplay,
12
+ buildMcpResourceRef,
13
+ buildMcpServerRef,
14
+ getExtensionSuggestions,
15
+ matchMcpServerPrefix
16
+ } from "./chunk-RMLZAUWH.js";
3
17
  import {
4
18
  StreamJsonOutputAdapter
5
- } from "./chunk-YDSYD7UI.js";
19
+ } from "./chunk-CHB5SLZZ.js";
20
+ import {
21
+ BuiltinCommandLoader,
22
+ BundledSkillLoader,
23
+ CommandService,
24
+ DISPLAY_HOOK_EVENTS,
25
+ FileCommandLoader,
26
+ MAX_STACKED_SKILLS,
27
+ McpPromptLoader,
28
+ SavedWorkflowLoader,
29
+ SkillCommandLoader,
30
+ addConfigToMatcherGroup,
31
+ appendUserPromptExpansionAdditionalContext,
32
+ createEmptyHookEventInfo,
33
+ findMidInputSlashCommand,
34
+ findSlashCommandTokens,
35
+ formatApprovalModeDescription,
36
+ formatApprovalModeName,
37
+ formatUserPromptExpansionBlockedMessage,
38
+ getAllConfigs,
39
+ getBestSlashCommandMatch,
40
+ getTranslatedSourceDisplayMap,
41
+ hasBlockingBackgroundWork,
42
+ hasSlashCommandPathSeparator,
43
+ isBtwCommand,
44
+ isMidInputCompletableCommand,
45
+ isSlashCommand,
46
+ parseSlashCommand,
47
+ parseStackedSlashCommands,
48
+ refreshExtensionContentRuntime,
49
+ resetBackgroundStateForSessionSwitch,
50
+ restoreGoalFromHistory,
51
+ serializeUserPromptExpansionPrompt,
52
+ supportsMatchers,
53
+ useAutoAcceptIndicator
54
+ } from "./chunk-2EM7ECZD.js";
55
+ import "./chunk-WQTHLB5T.js";
6
56
  import {
7
57
  startPostRenderPrefetches
8
- } from "./chunk-SD4N3QJ2.js";
58
+ } from "./chunk-A5JOJ77H.js";
59
+ import {
60
+ EXTENSION_RELOAD_FAILED_REASON,
61
+ ExtensionRefreshState,
62
+ appEvents,
63
+ loadHierarchicalGeminiMemory
64
+ } from "./chunk-YDOXPLYL.js";
65
+ import "./chunk-JPALE3PA.js";
9
66
  import {
10
67
  AboutBox,
11
68
  BaseSelectionList,
@@ -73,76 +130,13 @@ import {
73
130
  useTextBuffer,
74
131
  useUIActions,
75
132
  useUIState
76
- } from "./chunk-AIY5UTFI.js";
77
- import {
78
- relaunchApp
79
- } from "./chunk-LEIJKM7Q.js";
80
- import {
81
- MaxSizedBox,
82
- OverflowProvider,
83
- useOverflowState
84
- } from "./chunk-6BN7NZ5Z.js";
85
- import {
86
- stopAndGetCapturedInput
87
- } from "./chunk-CSOTA7KX.js";
88
- import {
89
- DualOutputContext,
90
- useDualOutput,
91
- useGeminiStream
92
- } from "./chunk-HJ3GX3Y3.js";
93
- import {
94
- MAX_SUGGESTIONS_TO_SHOW,
95
- MAX_WIDTH,
96
- SuggestionsDisplay,
97
- buildMcpResourceRef,
98
- buildMcpServerRef,
99
- getExtensionSuggestions,
100
- matchMcpServerPrefix
101
- } from "./chunk-PUQLHSQ2.js";
102
- import {
103
- BuiltinCommandLoader,
104
- BundledSkillLoader,
105
- CommandService,
106
- DISPLAY_HOOK_EVENTS,
107
- FileCommandLoader,
108
- MAX_STACKED_SKILLS,
109
- McpPromptLoader,
110
- SavedWorkflowLoader,
111
- SkillCommandLoader,
112
- addConfigToMatcherGroup,
113
- appendUserPromptExpansionAdditionalContext,
114
- createEmptyHookEventInfo,
115
- findMidInputSlashCommand,
116
- findSlashCommandTokens,
117
- formatApprovalModeDescription,
118
- formatApprovalModeName,
119
- formatUserPromptExpansionBlockedMessage,
120
- getAllConfigs,
121
- getBestSlashCommandMatch,
122
- getTranslatedSourceDisplayMap,
123
- hasBlockingBackgroundWork,
124
- hasSlashCommandPathSeparator,
125
- isBtwCommand,
126
- isMidInputCompletableCommand,
127
- isSlashCommand,
128
- parseSlashCommand,
129
- parseStackedSlashCommands,
130
- resetBackgroundStateForSessionSwitch,
131
- restoreGoalFromHistory,
132
- serializeUserPromptExpansionPrompt,
133
- supportsMatchers,
134
- useAutoAcceptIndicator
135
- } from "./chunk-OWVIH4HY.js";
136
- import {
137
- appEvents,
138
- loadHierarchicalGeminiMemory
139
- } from "./chunk-I4A4K72C.js";
133
+ } from "./chunk-TSPB77TG.js";
140
134
  import {
141
135
  SessionStatsProvider,
142
136
  getCommandDisplayName,
143
137
  getCommandSourceBadge,
144
138
  useSessionStats
145
- } from "./chunk-FTFXDZYI.js";
139
+ } from "./chunk-GSHQYYIV.js";
146
140
  import {
147
141
  Colors,
148
142
  SettingsContext,
@@ -151,7 +145,7 @@ import {
151
145
  useMouseEvents,
152
146
  useSettings,
153
147
  useTerminalSize
154
- } from "./chunk-65CFHNSE.js";
148
+ } from "./chunk-WF4FAXDL.js";
155
149
  import {
156
150
  BEL,
157
151
  KeypressProvider,
@@ -174,7 +168,17 @@ import {
174
168
  useKeypressContext,
175
169
  wrapForMultiplexer,
176
170
  writeOsc52
177
- } from "./chunk-B4U2M63D.js";
171
+ } from "./chunk-27BHARDE.js";
172
+ import "./chunk-UIDXQNMV.js";
173
+ import {
174
+ relaunchApp
175
+ } from "./chunk-J7RCB6N5.js";
176
+ import "./chunk-MRO43B25.js";
177
+ import {
178
+ MaxSizedBox,
179
+ OverflowProvider,
180
+ useOverflowState
181
+ } from "./chunk-ON3JA3RU.js";
178
182
  import {
179
183
  theme
180
184
  } from "./chunk-IFEWJXFS.js";
@@ -191,46 +195,36 @@ import {
191
195
  use_is_screen_reader_enabled_default,
192
196
  use_stdin_default,
193
197
  use_stdout_default
194
- } from "./chunk-DGHJTO2K.js";
198
+ } from "./chunk-P3XEEI3X.js";
199
+ import {
200
+ stopAndGetCapturedInput
201
+ } from "./chunk-CSOTA7KX.js";
195
202
  import {
196
203
  disableKittyProtocol,
197
204
  isKittyProtocolEnabled,
198
205
  isKittyProtocolSupported
199
206
  } from "./chunk-JZSY4WP3.js";
200
- import "./chunk-BWVQN2HV.js";
201
- import "./chunk-UIDXQNMV.js";
202
- import "./chunk-VQWAZSXN.js";
207
+ import "./chunk-E7EMCSUG.js";
203
208
  import "./chunk-332PWN27.js";
204
209
  import {
205
210
  setUpdateHandler
206
- } from "./chunk-4O344UEE.js";
207
- import "./chunk-ALZ75L2X.js";
211
+ } from "./chunk-TI3BWD4D.js";
212
+ import "./chunk-6VK6FIMQ.js";
208
213
  import "./chunk-SAIILPQ3.js";
209
214
  import {
210
215
  require_react
211
216
  } from "./chunk-KYMBIKIW.js";
212
- import "./chunk-CNSF3WO5.js";
213
217
  import {
214
218
  AUTO_THEME_NAME,
215
219
  DEFAULT_THEME,
216
220
  themeManager
217
221
  } from "./chunk-PC4ZXHU2.js";
218
- import "./chunk-MRO43B25.js";
219
- import {
220
- requestConsentInteractive,
221
- requestConsentOrFail
222
- } from "./chunk-NZEGNV4V.js";
223
- import "./chunk-3GONHQOA.js";
224
- import {
225
- getErrorMessage as getErrorMessage2
226
- } from "./chunk-FRFFNYUY.js";
227
- import "./chunk-TBAZMRW3.js";
228
222
  import {
229
223
  openQwenAsrRealtimeStream,
230
224
  openVoiceStream,
231
225
  openVoiceStreamWithRetry
232
- } from "./chunk-XISQIIT7.js";
233
- import "./chunk-PRDFOIZF.js";
226
+ } from "./chunk-PUVCVELY.js";
227
+ import "./chunk-BVYU3ZTI.js";
234
228
  import {
235
229
  cpLen,
236
230
  cpSlice,
@@ -238,48 +232,62 @@ import {
238
232
  getAsciiArtWidth,
239
233
  getCachedStringWidth,
240
234
  sanitizeFilenameForDisplay,
235
+ sanitizeMultilineForDisplay,
241
236
  stringWidth,
242
237
  stripUnsafeCharacters,
243
238
  toCodePoints,
244
239
  wrapToVisualLines
245
- } from "./chunk-GL5TV7B5.js";
240
+ } from "./chunk-XYR5RUA5.js";
246
241
  import "./chunk-LGFAYIKX.js";
247
242
  import "./chunk-54YZOP7P.js";
243
+ import "./chunk-AHNXYU4O.js";
244
+ import "./chunk-RNBYOUGV.js";
245
+ import "./chunk-WHJQ3JUS.js";
246
+ import "./chunk-BJBWRCSK.js";
247
+ import {
248
+ requestConsentInteractive,
249
+ requestConsentOrFail
250
+ } from "./chunk-AYNCLGTW.js";
251
+ import "./chunk-3GONHQOA.js";
252
+ import {
253
+ getErrorMessage as getErrorMessage2
254
+ } from "./chunk-DCZWC4PF.js";
255
+ import "./chunk-CD6USWHZ.js";
248
256
  import {
249
257
  getExtendedSystemInfo
250
- } from "./chunk-24XYI5EI.js";
258
+ } from "./chunk-JZHIQJOE.js";
251
259
  import {
252
260
  formatDuration,
253
261
  formatRelativeTime,
254
262
  formatTokenCount
255
263
  } from "./chunk-KHDZHZMH.js";
256
- import "./chunk-4ZJIPVPB.js";
264
+ import "./chunk-DIWVZ3VM.js";
257
265
  import {
258
266
  assertVoiceBaseUrlNetworkAllowed,
259
267
  isKeytermEcho,
260
268
  isStreamingVoiceModel,
261
269
  resolveVoiceStreamConfig,
262
270
  transcribeVoiceAudio
263
- } from "./chunk-RYFZCUJO.js";
271
+ } from "./chunk-VGGOPZUL.js";
264
272
  import {
265
273
  formatUnsupportedVoiceModelMessage,
266
274
  isSelectableVoiceModel
267
- } from "./chunk-ADZG46HR.js";
275
+ } from "./chunk-ZE6E424U.js";
268
276
  import "./chunk-E7KNELIZ.js";
269
- import "./chunk-AHNXYU4O.js";
270
- import "./chunk-RNBYOUGV.js";
271
- import "./chunk-ME3YSROJ.js";
272
- import "./chunk-BJBWRCSK.js";
277
+ import "./chunk-3UP777ZS.js";
278
+ import "./chunk-GLE2YUPU.js";
279
+ import "./chunk-ER3BKOLB.js";
273
280
  import {
274
281
  loadMcpApprovals
275
- } from "./chunk-QZF5U5KA.js";
276
- import "./chunk-2NPS2UDH.js";
282
+ } from "./chunk-FQNC62B2.js";
277
283
  import "./chunk-S6RLAIUR.js";
278
284
  import "./chunk-MX2YXRER.js";
285
+ import "./chunk-IBY3Q3HG.js";
286
+ import "./chunk-VRDMOSQS.js";
279
287
  import "./chunk-MZ7BABX3.js";
280
288
  import {
281
289
  createLoadedSettingsAdapter
282
- } from "./chunk-XPJH4PKR.js";
290
+ } from "./chunk-UX6OTBVD.js";
283
291
  import {
284
292
  CORRUPTED_SUFFIX,
285
293
  SettingScope,
@@ -301,28 +309,27 @@ import {
301
309
  settingExistsInScope,
302
310
  validateSettingValue,
303
311
  writeOutputLanguageAndRegisterPath
304
- } from "./chunk-STAZRKOT.js";
312
+ } from "./chunk-M7S4GK5Z.js";
305
313
  import {
306
314
  getCurrentLanguage,
307
315
  localizeToolDisplayName,
308
316
  t,
309
317
  ta
310
- } from "./chunk-QAKFYMJI.js";
318
+ } from "./chunk-O33TBKDC.js";
311
319
  import "./chunk-TLRYABYP.js";
312
- import "./chunk-4RQIB5UZ.js";
313
- import "./chunk-ER3BKOLB.js";
314
- import "./chunk-G7ZG7CA6.js";
315
- import "./chunk-VRDMOSQS.js";
320
+ import "./chunk-BOBRZZKD.js";
321
+ import "./chunk-O2YT7VB4.js";
322
+ import "./chunk-Z3I3QJK3.js";
316
323
  import "./chunk-3RW4AZJV.js";
317
324
  import "./chunk-CJCKDMWO.js";
318
325
  import {
319
326
  getCliVersion
320
- } from "./chunk-GD236YPV.js";
327
+ } from "./chunk-UXEW557D.js";
321
328
  import "./chunk-43W4YSO6.js";
322
329
  import {
323
330
  isWorkspaceTrusted,
324
331
  loadTrustedFolders
325
- } from "./chunk-MIG5SQNL.js";
332
+ } from "./chunk-DICGXFAI.js";
326
333
  import {
327
334
  clearScreen,
328
335
  writeStderrLine
@@ -419,7 +426,7 @@ import {
419
426
  validateWorkflowName,
420
427
  watchRepoBranch,
421
428
  writeRuntimeStatus
422
- } from "./chunk-YEGT55NW.js";
429
+ } from "./chunk-3GNOQZDC.js";
423
430
  import "./chunk-5P5XGNYH.js";
424
431
  import "./chunk-SKAZWEV5.js";
425
432
  import "./chunk-K5PGHDBN.js";
@@ -438,7 +445,7 @@ import "./chunk-LQ7TMOCE.js";
438
445
  import "./chunk-E5A7LHNN.js";
439
446
  import {
440
447
  APPROVAL_MODES
441
- } from "./chunk-VEB3NYSO.js";
448
+ } from "./chunk-5MBO76SL.js";
442
449
  import "./chunk-GO6LNQXT.js";
443
450
  import "./chunk-NQKLOAVJ.js";
444
451
  import {
@@ -471,7 +478,7 @@ import {
471
478
  recordSkillInvocation,
472
479
  removeMCPServerStatus,
473
480
  removeMCPStatusChangeListener
474
- } from "./chunk-GMOWQOQQ.js";
481
+ } from "./chunk-BUZ6HGL4.js";
475
482
  import "./chunk-E6US47KI.js";
476
483
  import "./chunk-UWCTAVOD.js";
477
484
  import {
@@ -481,7 +488,7 @@ import "./chunk-OMX7CUOE.js";
481
488
  import {
482
489
  getAutoMemoryProjectStateDir,
483
490
  getAutoMemoryRoot
484
- } from "./chunk-4KJ2BPIT.js";
491
+ } from "./chunk-OACJLMLD.js";
485
492
  import "./chunk-SUAKHHK7.js";
486
493
  import "./chunk-FEJ2FZ3U.js";
487
494
  import {
@@ -520,16 +527,16 @@ import {
520
527
  shortenPath,
521
528
  tildeifyPath
522
529
  } from "./chunk-22MNNNXE.js";
523
- import "./chunk-MJI36HER.js";
524
- import {
525
- registerCleanup,
526
- runExitCleanup
527
- } from "./chunk-4UCTWSTP.js";
530
+ import "./chunk-HDOH3QYE.js";
528
531
  import {
529
532
  finalizeStartupProfile,
530
533
  profileCheckpoint
531
534
  } from "./chunk-ITOGNELQ.js";
532
535
  import "./chunk-FXGLL2HL.js";
536
+ import {
537
+ registerCleanup,
538
+ runExitCleanup
539
+ } from "./chunk-JCH35JB3.js";
533
540
  import "./chunk-ZERZSAZL.js";
534
541
  import "./chunk-QN5NZ3UQ.js";
535
542
  import "./chunk-BR4QREVK.js";
@@ -3337,22 +3344,31 @@ var MainContent = /* @__PURE__ */ __name(() => {
3337
3344
  `${historyRemountKey}-${uiState.currentModel}`
3338
3345
  ),
3339
3346
  /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(OverflowProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(Box_default, { flexDirection: "column", children: [
3340
- pendingHistoryItemsWithSourceCopyOffsets.map(
3341
- ({ item, sourceCopyIndexOffsets }, i) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3342
- HistoryItemDisplayComponent,
3343
- {
3344
- availableTerminalHeight: uiState.constrainHeight ? availableTerminalHeight : void 0,
3345
- terminalWidth,
3346
- mainAreaWidth,
3347
- item: { ...item, id: 0 },
3348
- isPending: true,
3349
- isFocused: !uiState.isEditorDialogOpen,
3350
- activeShellPtyId: uiState.activePtyId,
3351
- embeddedShellFocused: uiState.embeddedShellFocused,
3352
- sourceCopyIndexOffsets
3353
- },
3354
- i
3355
- )
3347
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3348
+ Box_default,
3349
+ {
3350
+ flexDirection: "column",
3351
+ flexShrink: 0,
3352
+ maxHeight: availableTerminalHeight || void 0,
3353
+ overflow: "hidden",
3354
+ children: pendingHistoryItemsWithSourceCopyOffsets.map(
3355
+ ({ item, sourceCopyIndexOffsets }, i) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
3356
+ HistoryItemDisplayComponent,
3357
+ {
3358
+ availableTerminalHeight: uiState.constrainHeight ? availableTerminalHeight : void 0,
3359
+ terminalWidth,
3360
+ mainAreaWidth,
3361
+ item: { ...item, id: 0 },
3362
+ isPending: true,
3363
+ isFocused: !uiState.isEditorDialogOpen,
3364
+ activeShellPtyId: uiState.activePtyId,
3365
+ embeddedShellFocused: uiState.embeddedShellFocused,
3366
+ sourceCopyIndexOffsets
3367
+ },
3368
+ i
3369
+ )
3370
+ )
3371
+ }
3356
3372
  ),
3357
3373
  /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(ShowMoreLines, { constrainHeight: uiState.constrainHeight })
3358
3374
  ] }) })
@@ -21337,8 +21353,9 @@ function MemoryDialog({ onClose }) {
21337
21353
  "memory.enableAutoSkill",
21338
21354
  newValue
21339
21355
  );
21356
+ config.setAutoSkillEnabled(newValue);
21340
21357
  setAutoSkillOn(newValue);
21341
- }, [autoSkillOn, loadedSettings]);
21358
+ }, [autoSkillOn, loadedSettings, config]);
21342
21359
  const handleToggleAutoSkillConfirm = (0, import_react72.useCallback)(() => {
21343
21360
  const newValue = !autoSkillConfirmOn;
21344
21361
  loadedSettings.setValue(
@@ -21527,7 +21544,25 @@ __name(MemoryDialog, "MemoryDialog");
21527
21544
  // packages/cli/src/ui/components/SkillReviewDialog.tsx
21528
21545
  init_esbuild_shims();
21529
21546
  var import_react73 = __toESM(require_react(), 1);
21547
+ import { promises as fs10, watch } from "node:fs";
21530
21548
  var import_jsx_runtime96 = __toESM(require_jsx_runtime(), 1);
21549
+ var debugLogger21 = createDebugLogger("SKILL_REVIEW_DIALOG");
21550
+ var PREVIEW_MAX_HEIGHT = 12;
21551
+ var WATCH_DEBOUNCE_MS = 300;
21552
+ var PREVIEW_MAX_BYTES = 64 * 1024;
21553
+ async function readPreviewChunk(filePath) {
21554
+ const handle = await fs10.open(filePath, "r");
21555
+ try {
21556
+ const buf = Buffer.alloc(PREVIEW_MAX_BYTES + 1);
21557
+ const { bytesRead } = await handle.read(buf, 0, PREVIEW_MAX_BYTES + 1, 0);
21558
+ const truncated = bytesRead > PREVIEW_MAX_BYTES;
21559
+ const end = Math.min(bytesRead, PREVIEW_MAX_BYTES);
21560
+ return { text: buf.toString("utf-8", 0, end), truncated };
21561
+ } finally {
21562
+ await handle.close();
21563
+ }
21564
+ }
21565
+ __name(readPreviewChunk, "readPreviewChunk");
21531
21566
  var SkillReviewDialog = /* @__PURE__ */ __name(({
21532
21567
  skills,
21533
21568
  onAccept,
@@ -21537,19 +21572,107 @@ var SkillReviewDialog = /* @__PURE__ */ __name(({
21537
21572
  }) => {
21538
21573
  const [snapshot] = (0, import_react73.useState)(() => skills);
21539
21574
  const [index, setIndex] = (0, import_react73.useState)(0);
21575
+ const [preview, setPreview] = (0, import_react73.useState)({ status: "loading" });
21576
+ const [actionError, setActionError] = (0, import_react73.useState)(null);
21577
+ const [reloadCounter, setReloadCounter] = (0, import_react73.useState)(0);
21578
+ const launchEditor = useLaunchEditor();
21579
+ const settings = useSettings();
21580
+ const config = useConfig();
21581
+ const { columns } = useTerminalSize();
21582
+ const previewWidth = Math.max(20, Math.min(columns - 4, 100) - 6);
21583
+ const current = snapshot[index];
21584
+ const stagedPath = current?.stagedManifestPath;
21585
+ (0, import_react73.useEffect)(() => {
21586
+ setActionError(null);
21587
+ if (!stagedPath) return;
21588
+ let cancelled = false;
21589
+ let watcher;
21590
+ let debounceTimer;
21591
+ setPreview(
21592
+ (prev) => prev.status === "ready" ? prev : { status: "loading" }
21593
+ );
21594
+ readPreviewChunk(stagedPath).then(({ text, truncated }) => {
21595
+ if (cancelled) return;
21596
+ const allLines = sanitizeMultilineForDisplay(
21597
+ text.replace(/\r\n/g, "\n").replace(/\n+$/, "")
21598
+ ).split("\n");
21599
+ const lines = allLines.slice(0, PREVIEW_MAX_HEIGHT);
21600
+ setPreview({
21601
+ status: "ready",
21602
+ path: stagedPath,
21603
+ lines,
21604
+ hiddenLines: allLines.length - lines.length,
21605
+ truncated
21606
+ });
21607
+ try {
21608
+ watcher = watch(stagedPath, () => {
21609
+ if (cancelled) return;
21610
+ clearTimeout(debounceTimer);
21611
+ debounceTimer = setTimeout(() => {
21612
+ if (!cancelled) setReloadCounter((c) => c + 1);
21613
+ }, WATCH_DEBOUNCE_MS);
21614
+ });
21615
+ watcher.on("error", () => {
21616
+ watcher?.close();
21617
+ });
21618
+ } catch {
21619
+ }
21620
+ }).catch((err) => {
21621
+ if (cancelled) return;
21622
+ debugLogger21.warn(`skill preview read failed for ${stagedPath}:`, err);
21623
+ setPreview({ status: "error" });
21624
+ });
21625
+ return () => {
21626
+ cancelled = true;
21627
+ clearTimeout(debounceTimer);
21628
+ watcher?.close();
21629
+ };
21630
+ }, [stagedPath, reloadCounter]);
21631
+ const turnOff = /* @__PURE__ */ __name(() => {
21632
+ try {
21633
+ settings.setValue(
21634
+ "Workspace" /* Workspace */,
21635
+ "memory.enableAutoSkill",
21636
+ false
21637
+ );
21638
+ } catch (err) {
21639
+ setActionError(
21640
+ `Failed to save setting: ${err instanceof Error ? err.message : String(err)}`
21641
+ );
21642
+ return;
21643
+ }
21644
+ config.setAutoSkillEnabled(false);
21645
+ onClose();
21646
+ }, "turnOff");
21647
+ const openInEditor = /* @__PURE__ */ __name(() => {
21648
+ if (!stagedPath) return;
21649
+ setActionError(null);
21650
+ void launchEditor(stagedPath).then(() => {
21651
+ setReloadCounter((c) => c + 1);
21652
+ }).catch((err) => {
21653
+ setActionError(err instanceof Error ? err.message : String(err));
21654
+ });
21655
+ }, "openInEditor");
21540
21656
  useKeypress(
21541
21657
  (key) => {
21542
- if (key.name === "escape") onDismiss();
21658
+ if (key.ctrl || key.meta) return;
21659
+ if (key.name === "escape") {
21660
+ onDismiss();
21661
+ return;
21662
+ }
21663
+ if (key.name === "o") {
21664
+ openInEditor();
21665
+ return;
21666
+ }
21543
21667
  },
21544
21668
  { isActive: true }
21545
21669
  );
21546
21670
  (0, import_react73.useEffect)(() => {
21547
21671
  if (snapshot.length === 0) onClose();
21548
21672
  }, [snapshot.length, onClose]);
21549
- if (index >= snapshot.length) {
21673
+ if (index >= snapshot.length || !current) {
21550
21674
  return null;
21551
21675
  }
21552
- const current = snapshot[index];
21553
21676
  const advance = /* @__PURE__ */ __name(() => {
21554
21677
  if (index + 1 >= snapshot.length) {
21555
21678
  onClose();
@@ -21579,20 +21702,33 @@ var SkillReviewDialog = /* @__PURE__ */ __name(({
21579
21702
  }
21580
21703
  onClose();
21581
21704
  break;
21705
+ case "turnOff":
21706
+ turnOff();
21707
+ break;
21582
21708
  default:
21583
21709
  break;
21584
21710
  }
21585
21711
  }, "handleSelect");
21586
21712
  const options = [
21587
21713
  { label: t("Keep this skill"), value: "keep", key: "keep" },
21588
- { label: t("Discard this skill"), value: "discard", key: "discard" },
21589
- { label: t("Keep all remaining"), value: "keepAll", key: "keepAll" },
21590
- {
21591
- label: t("Discard all remaining"),
21592
- value: "discardAll",
21593
- key: "discardAll"
21594
- }
21714
+ { label: t("Discard this skill"), value: "discard", key: "discard" }
21595
21715
  ];
21716
+ if (snapshot.length - index > 1) {
21717
+ options.push(
21718
+ { label: t("Keep all remaining"), value: "keepAll", key: "keepAll" },
21719
+ {
21720
+ label: t("Discard all remaining"),
21721
+ value: "discardAll",
21722
+ key: "discardAll"
21723
+ }
21724
+ );
21725
+ }
21726
+ options.push({
21727
+ label: t("Turn off auto-generated skills"),
21728
+ value: "turnOff",
21729
+ key: "turnOff"
21730
+ });
21731
+ const visiblePreview = preview.status === "ready" && preview.path !== stagedPath ? { status: "loading" } : preview;
21596
21732
  return /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)(
21597
21733
  Box_default,
21598
21734
  {
@@ -21612,11 +21748,25 @@ var SkillReviewDialog = /* @__PURE__ */ __name(({
21612
21748
  ")"
21613
21749
  ] }),
21614
21750
  /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)(Box_default, { marginTop: 1, flexDirection: "column", children: [
21615
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(Text, { color: theme.text.primary, children: current.name }),
21616
- current.description ? /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(Text, { color: theme.text.secondary, children: current.description }) : null
21751
+ /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(Text, { color: theme.text.primary, children: sanitizeFilenameForDisplay(current.name) }),
21752
+ current.description ? /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(Text, { color: theme.text.secondary, children: sanitizeMultilineForDisplay(current.description) }) : null
21617
21753
  ] }),
21754
+ /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(Box_default, { marginTop: 1, flexDirection: "column", children: visiblePreview.status === "loading" ? /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(Text, { color: theme.text.secondary, children: t("Loading preview\u2026") }) : visiblePreview.status === "error" ? /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(Text, { color: theme.text.secondary, children: t("Preview unavailable") }) : /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)(import_jsx_runtime96.Fragment, { children: [
21755
+ /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
21756
+ MaxSizedBox,
21757
+ {
21758
+ maxHeight: PREVIEW_MAX_HEIGHT,
21759
+ maxWidth: previewWidth,
21760
+ overflowDirection: "bottom",
21761
+ additionalHiddenLinesCount: visiblePreview.hiddenLines,
21762
+ children: visiblePreview.lines.map((line, i) => /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(Box_default, { children: /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(Text, { wrap: "wrap", color: theme.text.secondary, children: line === "" ? " " : line }) }, i))
21763
+ }
21764
+ ),
21765
+ visiblePreview.truncated ? /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(Text, { color: theme.text.secondary, children: t("\u2026 preview truncated (file too large) \u2026") }) : null
21766
+ ] }) }),
21767
+ actionError ? /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(Text, { color: theme.status.error, children: sanitizeMultilineForDisplay(actionError) }) }) : null,
21618
21768
  /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(RadioButtonSelect, { items: options, onSelect: handleSelect, isFocused: true }) }),
21619
- /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(Text, { color: theme.text.secondary, children: t("Esc to decide later") }) })
21769
+ /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(Text, { color: theme.text.secondary, children: t("o open in editor \xB7 Esc decide later") }) })
21620
21770
  ]
21621
21771
  }
21622
21772
  );
@@ -21872,7 +22022,7 @@ __name(useBackgroundTaskView, "useBackgroundTaskView");
21872
22022
 
21873
22023
  // packages/cli/src/ui/contexts/BackgroundTaskViewContext.tsx
21874
22024
  var import_jsx_runtime97 = __toESM(require_jsx_runtime(), 1);
21875
- var debugLogger21 = createDebugLogger("BG_TASK_VIEW");
22025
+ var debugLogger22 = createDebugLogger("BG_TASK_VIEW");
21876
22026
  var BackgroundTaskViewStateContext = (0, import_react75.createContext)(null);
21877
22027
  var BackgroundTaskViewActionsContext = (0, import_react75.createContext)(null);
21878
22028
  var DEFAULT_STATE = {
@@ -21990,7 +22140,7 @@ function BackgroundTaskViewProvider({
21990
22140
  case "dream": {
21991
22141
  const ok = config.getMemoryManager().cancelTask(target.dreamId);
21992
22142
  if (!ok) {
21993
- debugLogger21.warn(
22143
+ debugLogger22.warn(
21994
22144
  `cancelSelected: dream task ${target.dreamId} could not be cancelled (internal state inconsistency \u2014 see MemoryManager.cancelTask warn).`
21995
22145
  );
21996
22146
  }
@@ -23748,7 +23898,7 @@ var LoadingIndicator = /* @__PURE__ */ __name(({
23748
23898
  );
23749
23899
  const showTokens = !isNarrow && outputTokens > 0;
23750
23900
  const tokenArrow = isReceivingContent ? "\u2193" : "\u2191";
23751
- const timeStr = elapsedTime < 60 ? `${elapsedTime}s` : formatDuration(elapsedTime * 1e3);
23901
+ const timeStr = elapsedTime < 60 ? `${elapsedTime.toFixed(1)}s` : formatDuration(elapsedTime * 1e3);
23752
23902
  const tokenStr = showTokens ? ` \xB7 ${tokenArrow} ${formatTokenCount(outputTokens)} tokens` : "";
23753
23903
  const tokenRateStr = showTokens && showResponseTokensPerSecond && isReceivingContent && elapsedTime > 0 ? ` \xB7 ${formatTokensPerSecond(outputTokensSinceTimerStart / elapsedTime)}` : "";
23754
23904
  const cancelAndTimerContent = streamingState !== "waiting_for_confirmation" /* WaitingForConfirmation */ ? t("({{time}}{{tokens}} \xB7 esc to cancel)", {
@@ -23885,10 +24035,10 @@ __name(useInputHistory, "useInputHistory");
23885
24035
  // packages/cli/src/ui/hooks/useShellHistory.ts
23886
24036
  init_esbuild_shims();
23887
24037
  var import_react81 = __toESM(require_react(), 1);
23888
- import * as fs10 from "node:fs/promises";
24038
+ import * as fs11 from "node:fs/promises";
23889
24039
  import * as path5 from "node:path";
23890
24040
  var MAX_HISTORY_LENGTH = 100;
23891
- var debugLogger22 = createDebugLogger("SHELL_HISTORY");
24041
+ var debugLogger23 = createDebugLogger("SHELL_HISTORY");
23892
24042
  async function getHistoryFilePath(projectRoot, configStorage) {
23893
24043
  const storage = configStorage ?? new Storage(projectRoot);
23894
24044
  return storage.getHistoryFilePath();
@@ -23896,13 +24046,13 @@ async function getHistoryFilePath(projectRoot, configStorage) {
23896
24046
  __name(getHistoryFilePath, "getHistoryFilePath");
23897
24047
  async function readHistoryFile(filePath) {
23898
24048
  try {
23899
- const text = await fs10.readFile(filePath, "utf-8");
24049
+ const text = await fs11.readFile(filePath, "utf-8");
23900
24050
  const parsed = parseHistoryFile(text);
23901
24051
  if (parsed) return parsed;
23902
24052
  return parseLegacyHistoryFile(text);
23903
24053
  } catch (err) {
23904
24054
  if (isNodeError(err) && err.code === "ENOENT") return [];
23905
- debugLogger22.error("Error reading history:", err);
24055
+ debugLogger23.error("Error reading history:", err);
23906
24056
  return [];
23907
24057
  }
23908
24058
  }
@@ -23938,10 +24088,10 @@ function parseLegacyHistoryFile(text) {
23938
24088
  __name(parseLegacyHistoryFile, "parseLegacyHistoryFile");
23939
24089
  async function writeHistoryFile(filePath, history) {
23940
24090
  try {
23941
- await fs10.mkdir(path5.dirname(filePath), { recursive: true });
23942
- await fs10.writeFile(filePath, JSON.stringify(history));
24091
+ await fs11.mkdir(path5.dirname(filePath), { recursive: true });
24092
+ await fs11.writeFile(filePath, JSON.stringify(history));
23943
24093
  } catch (error) {
23944
- debugLogger22.error("Error writing shell history:", error);
24094
+ debugLogger23.error("Error writing shell history:", error);
23945
24095
  }
23946
24096
  }
23947
24097
  __name(writeHistoryFile, "writeHistoryFile");
@@ -24534,12 +24684,12 @@ __name(useAtCompletion, "useAtCompletion");
24534
24684
  // packages/cli/src/ui/hooks/useSlashCompletion.ts
24535
24685
  init_esbuild_shims();
24536
24686
  var import_react85 = __toESM(require_react(), 1);
24537
- var debugLogger23 = createDebugLogger("SLASH_COMPLETION");
24687
+ var debugLogger24 = createDebugLogger("SLASH_COMPLETION");
24538
24688
  function logErrorSafely(error, context) {
24539
24689
  if (error instanceof Error) {
24540
- debugLogger23.error(`[${context}]`, error);
24690
+ debugLogger24.error(`[${context}]`, error);
24541
24691
  } else {
24542
- debugLogger23.error(`[${context}] Non-error thrown:`, error);
24692
+ debugLogger24.error(`[${context}] Non-error thrown:`, error);
24543
24693
  }
24544
24694
  }
24545
24695
  __name(logErrorSafely, "logErrorSafely");
@@ -24714,7 +24864,7 @@ function useCommandSuggestions(parserResult, commandContext, getFzfForCommands,
24714
24864
  const fetchAndSetSuggestions = /* @__PURE__ */ __name(async () => {
24715
24865
  if (signal.aborted) return;
24716
24866
  if (!leafCommand?.completion) {
24717
- debugLogger23.warn(
24867
+ debugLogger24.warn(
24718
24868
  "Attempted argument completion without completion function"
24719
24869
  );
24720
24870
  return;
@@ -25669,7 +25819,7 @@ __name(buildSegmentsForVisualSlice, "buildSegmentsForVisualSlice");
25669
25819
 
25670
25820
  // packages/cli/src/ui/components/InputPrompt.tsx
25671
25821
  import * as path8 from "node:path";
25672
- import * as fs11 from "node:fs/promises";
25822
+ import * as fs12 from "node:fs/promises";
25673
25823
 
25674
25824
  // packages/cli/src/ui/contexts/ShellFocusContext.tsx
25675
25825
  init_esbuild_shims();
@@ -26481,6 +26631,7 @@ function getApprovalModeIndicatorColor(approvalMode) {
26481
26631
  case "yolo" /* YOLO */:
26482
26632
  return theme.status.error;
26483
26633
  case "default" /* DEFAULT */:
26634
+ return theme.text.secondary;
26484
26635
  default:
26485
26636
  return void 0;
26486
26637
  }
@@ -26509,7 +26660,7 @@ var VOICE_ERROR_RETRY_DELAY_MS = 2e3;
26509
26660
  var PREVIOUS_STOP_WAIT_TIMEOUT_MS = 5e3;
26510
26661
  var HOLD_FIRST_PRESS_RELEASE_MS = 800;
26511
26662
  var HOLD_REPEAT_RELEASE_MS = 250;
26512
- var debugLogger24 = createDebugLogger("VOICE_INPUT");
26663
+ var debugLogger25 = createDebugLogger("VOICE_INPUT");
26513
26664
  function formatError(error) {
26514
26665
  return error instanceof Error ? error.message : String(error);
26515
26666
  }
@@ -26544,7 +26695,7 @@ function isCancelKey(key) {
26544
26695
  }
26545
26696
  __name(isCancelKey, "isCancelKey");
26546
26697
  function logRecorderStopError(error) {
26547
- debugLogger24.warn("[voice] recorder stop failed:", error);
26698
+ debugLogger25.warn("[voice] recorder stop failed:", error);
26548
26699
  }
26549
26700
  __name(logRecorderStopError, "logRecorderStopError");
26550
26701
  function useVoiceInput({
@@ -27123,7 +27274,7 @@ __name(createArecordRecorder, "createArecordRecorder");
27123
27274
  // packages/cli/src/ui/voice/native-audio-recorder.ts
27124
27275
  init_esbuild_shims();
27125
27276
  var SILENCE_POLL_INTERVAL_MS = 200;
27126
- var debugLogger25 = createDebugLogger("VOICE_NATIVE_RECORDER");
27277
+ var debugLogger26 = createDebugLogger("VOICE_NATIVE_RECORDER");
27127
27278
  var AUDIO_CAPTURE_PACKAGE = "@qwen-code/audio-capture";
27128
27279
  var NativeAudioRecorder = class {
27129
27280
  constructor(loadBackend) {
@@ -27188,7 +27339,7 @@ var NativeAudioRecorder = class {
27188
27339
  }
27189
27340
  } catch (error) {
27190
27341
  this.clearSilencePoll();
27191
- debugLogger25.warn(
27342
+ debugLogger26.warn(
27192
27343
  "[voice] silence detection failed, auto-stopping:",
27193
27344
  error
27194
27345
  );
@@ -27226,7 +27377,7 @@ function explainMissingNativePackage(error) {
27226
27377
  if (!(error instanceof Error) || !isMissingNativePackageError(error)) {
27227
27378
  return error;
27228
27379
  }
27229
- debugLogger25.warn(
27380
+ debugLogger26.warn(
27230
27381
  "[voice] native package missing:",
27231
27382
  error.message,
27232
27383
  error.code
@@ -27387,7 +27538,7 @@ function createSoxRecorder() {
27387
27538
  __name(createSoxRecorder, "createSoxRecorder");
27388
27539
 
27389
27540
  // packages/cli/src/ui/voice/voice-recorder.ts
27390
- var debugLogger26 = createDebugLogger("VOICE_RECORDER");
27541
+ var debugLogger27 = createDebugLogger("VOICE_RECORDER");
27391
27542
  var FallbackVoiceRecorder = class {
27392
27543
  constructor(factories) {
27393
27544
  this.factories = factories;
@@ -27416,7 +27567,7 @@ var FallbackVoiceRecorder = class {
27416
27567
  } catch (error) {
27417
27568
  const message = error instanceof Error ? error.message : String(error);
27418
27569
  errors.push(message);
27419
- debugLogger26.warn(
27570
+ debugLogger27.warn(
27420
27571
  `[voice] recorder backend unavailable, trying fallback: ${message}`
27421
27572
  );
27422
27573
  }
@@ -27439,7 +27590,7 @@ var FallbackVoiceRecorder = class {
27439
27590
  try {
27440
27591
  await this.recorderFor(factory).warmup?.();
27441
27592
  } catch (error) {
27442
- debugLogger26.warn("[voice] recorder warmup failed:", error);
27593
+ debugLogger27.warn("[voice] recorder warmup failed:", error);
27443
27594
  }
27444
27595
  }
27445
27596
  }
@@ -27486,7 +27637,7 @@ init_esbuild_shims();
27486
27637
 
27487
27638
  // packages/cli/src/ui/voice/voice-refine.ts
27488
27639
  init_esbuild_shims();
27489
- var debugLogger27 = createDebugLogger("VOICE_REFINE");
27640
+ var debugLogger28 = createDebugLogger("VOICE_REFINE");
27490
27641
  var REFINE_TIMEOUT_MS = 2500;
27491
27642
  var MAX_GROWTH_FACTOR = 2;
27492
27643
  var REFINE_SYSTEM_INSTRUCTION = [
@@ -27523,22 +27674,22 @@ async function refineVoiceTranscript(config, raw, signal) {
27523
27674
  });
27524
27675
  const refined = text.trim();
27525
27676
  if (!refined) {
27526
- debugLogger27.debug("[voice] refinement returned empty; using raw");
27677
+ debugLogger28.debug("[voice] refinement returned empty; using raw");
27527
27678
  return raw;
27528
27679
  }
27529
27680
  const introducedCommand = refined.startsWith("/") || refined.startsWith("@");
27530
27681
  const ballooned = refined.length > raw.length * MAX_GROWTH_FACTOR;
27531
27682
  if (introducedCommand || ballooned) {
27532
- debugLogger27.warn("[voice] refinement looks unsafe; using raw", {
27683
+ debugLogger28.warn("[voice] refinement looks unsafe; using raw", {
27533
27684
  raw,
27534
27685
  refined
27535
27686
  });
27536
27687
  return raw;
27537
27688
  }
27538
- debugLogger27.debug("[voice] refined transcript", { raw, refined });
27689
+ debugLogger28.debug("[voice] refined transcript", { raw, refined });
27539
27690
  return refined;
27540
27691
  } catch (error) {
27541
- debugLogger27.warn("[voice] refinement failed; using raw transcript:", error);
27692
+ debugLogger28.warn("[voice] refinement failed; using raw transcript:", error);
27542
27693
  return raw;
27543
27694
  } finally {
27544
27695
  clearTimeout(timer);
@@ -27596,7 +27747,7 @@ function classifyPastedImagePaths(pasted) {
27596
27747
  return { imagePaths, allImages };
27597
27748
  }
27598
27749
  __name(classifyPastedImagePaths, "classifyPastedImagePaths");
27599
- var debugLogger28 = createDebugLogger("INPUT_PROMPT");
27750
+ var debugLogger29 = createDebugLogger("INPUT_PROMPT");
27600
27751
  var LARGE_PASTE_CHAR_THRESHOLD = 1e3;
27601
27752
  var LARGE_PASTE_LINE_THRESHOLD = 10;
27602
27753
  var InputPrompt = /* @__PURE__ */ __name(({
@@ -27994,7 +28145,7 @@ ${finalValue.trim()}`;
27994
28145
  }
27995
28146
  }
27996
28147
  } catch (error) {
27997
- debugLogger28.error("Error handling clipboard image:", error);
28148
+ debugLogger29.error("Error handling clipboard image:", error);
27998
28149
  }
27999
28150
  }, []);
28000
28151
  const promotePastedImagePaths = (0, import_react96.useCallback)(
@@ -28005,14 +28156,14 @@ ${finalValue.trim()}`;
28005
28156
  for (const imagePath of imagePaths) {
28006
28157
  const sourcePath = path8.isAbsolute(imagePath) ? imagePath : path8.resolve(cwd3, imagePath);
28007
28158
  try {
28008
- const stats = await fs11.stat(sourcePath);
28159
+ const stats = await fs12.stat(sourcePath);
28009
28160
  if (!stats.isFile()) continue;
28010
- await fs11.mkdir(clipboardDir, { recursive: true });
28161
+ await fs12.mkdir(clipboardDir, { recursive: true });
28011
28162
  const destPath = path8.join(
28012
28163
  clipboardDir,
28013
28164
  `clipboard-${Date.now()}-${attachments2.length}${path8.extname(sourcePath)}`
28014
28165
  );
28015
- await fs11.copyFile(sourcePath, destPath);
28166
+ await fs12.copyFile(sourcePath, destPath);
28016
28167
  attachments2.push({
28017
28168
  id: `${Date.now()}-${attachments2.length}`,
28018
28169
  path: destPath,
@@ -28989,6 +29140,9 @@ var AutoAcceptIndicator = /* @__PURE__ */ __name(({
28989
29140
  subText = cycleText;
28990
29141
  break;
28991
29142
  case "default" /* DEFAULT */:
29143
+ textContent = `\u23F8 ${t("Ask permissions")}`;
29144
+ subText = cycleText;
29145
+ break;
28992
29146
  default:
28993
29147
  break;
28994
29148
  }
@@ -29332,51 +29486,48 @@ function useStatusLine() {
29332
29486
  );
29333
29487
  const doUpdate = (0, import_react99.useCallback)(() => {
29334
29488
  const preset = statusLinePresetRef.current;
29489
+ const cmd = statusLineCommandRef.current;
29490
+ if (!preset && !cmd) {
29491
+ clearPullRequestLookup();
29492
+ setOutput([]);
29493
+ return;
29494
+ }
29495
+ const ui = uiStateRef.current;
29496
+ const cfg = configRef.current;
29497
+ const stats = ui.sessionStats;
29498
+ const m = stats.metrics;
29499
+ const contentGeneratorConfig = cfg.getContentGeneratorConfig();
29500
+ const contextWindowSize = contentGeneratorConfig?.contextWindowSize || 0;
29501
+ const modelDisplayName = ui.currentModel ? cfg.getModelsConfig().getModelDisplayName(ui.currentModel) : cfg.getModelDisplayName();
29502
+ const { totalInputTokens, totalOutputTokens } = aggregateModelTokens(m);
29335
29503
  if (preset) {
29336
29504
  if (activeChildRef.current) {
29337
29505
  activeChildRef.current.kill();
29338
29506
  activeChildRef.current = void 0;
29339
29507
  generationRef.current++;
29340
29508
  }
29341
- const ui2 = uiStateRef.current;
29342
- const cfg2 = configRef.current;
29343
- const stats2 = ui2.sessionStats;
29344
- const m2 = stats2.metrics;
29345
- const currentDir = cfg2.getTargetDir();
29346
- ensurePullRequestNumber(preset, currentDir, ui2.branchName);
29347
- const { totalInputTokens: totalInputTokens2, totalOutputTokens: totalOutputTokens2 } = aggregateModelTokens(m2);
29348
- const contentGeneratorConfig = cfg2.getContentGeneratorConfig();
29349
- const contextWindowSize2 = contentGeneratorConfig?.contextWindowSize || 0;
29509
+ const currentDir = cfg.getTargetDir();
29510
+ ensurePullRequestNumber(preset, currentDir, ui.branchName);
29350
29511
  const data = buildStatusLinePresetData({
29351
- sessionId: stats2.sessionId,
29352
- version: cfg2.getCliVersion(),
29353
- modelDisplayName: cfg2.getModelDisplayName(),
29512
+ sessionId: stats.sessionId,
29513
+ version: cfg.getCliVersion(),
29514
+ modelDisplayName,
29354
29515
  reasoning: contentGeneratorConfig?.reasoning,
29355
29516
  currentDir,
29356
- branch: ui2.branchName,
29517
+ branch: ui.branchName,
29357
29518
  pullRequestNumber: pullRequestNumberRef.current,
29358
- contextWindowSize: contextWindowSize2,
29359
- currentUsage: stats2.lastPromptTokenCount,
29360
- totalInputTokens: totalInputTokens2,
29361
- totalOutputTokens: totalOutputTokens2,
29362
- totalLinesAdded: m2.files.totalLinesAdded,
29363
- totalLinesRemoved: m2.files.totalLinesRemoved,
29364
- streamingState: ui2.streamingState
29519
+ contextWindowSize,
29520
+ currentUsage: stats.lastPromptTokenCount,
29521
+ totalInputTokens,
29522
+ totalOutputTokens,
29523
+ totalLinesAdded: m.files.totalLinesAdded,
29524
+ totalLinesRemoved: m.files.totalLinesRemoved,
29525
+ streamingState: ui.streamingState
29365
29526
  });
29366
29527
  setOutput(buildStatusLinePresetLines(preset, data));
29367
29528
  return;
29368
29529
  }
29369
29530
  clearPullRequestLookup();
29370
- const cmd = statusLineCommandRef.current;
29371
- if (!cmd) {
29372
- setOutput([]);
29373
- return;
29374
- }
29375
- const ui = uiStateRef.current;
29376
- const cfg = configRef.current;
29377
- const stats = ui.sessionStats;
29378
- const m = stats.metrics;
29379
- const contextWindowSize = cfg.getContentGeneratorConfig()?.contextWindowSize || 0;
29380
29531
  const usedPercentage = contextWindowSize > 0 ? Math.min(
29381
29532
  100,
29382
29533
  Math.max(
@@ -29386,12 +29537,11 @@ function useStatusLine() {
29386
29537
  ) / 10
29387
29538
  )
29388
29539
  ) : 0;
29389
- const { totalInputTokens, totalOutputTokens } = aggregateModelTokens(m);
29390
29540
  const input = {
29391
29541
  session_id: stats.sessionId,
29392
29542
  version: cfg.getCliVersion() || "unknown",
29393
29543
  model: {
29394
- display_name: cfg.getModelDisplayName()
29544
+ display_name: modelDisplayName
29395
29545
  },
29396
29546
  context_window: {
29397
29547
  context_window_size: contextWindowSize,
@@ -29756,7 +29906,7 @@ var Footer = /* @__PURE__ */ __name(() => {
29756
29906
  t("IDE connecting... context may be unavailable")
29757
29907
  ] }) : uiState.startupIdeConnectionStatus.state === "failed" ? /* @__PURE__ */ (0, import_jsx_runtime114.jsx)(Text, { color: theme.status.warning, children: t("IDE connection unavailable: {{message}}", {
29758
29908
  message: uiState.startupIdeConnectionStatus.message
29759
- }) }) : showAutoAcceptIndicator !== void 0 && showAutoAcceptIndicator !== "default" /* DEFAULT */ ? /* @__PURE__ */ (0, import_jsx_runtime114.jsx)(AutoAcceptIndicator, { approvalMode: showAutoAcceptIndicator }) : suppressHint ? null : /* @__PURE__ */ (0, import_jsx_runtime114.jsx)(Text, { color: theme.text.secondary, children: t("? for shortcuts") });
29909
+ }) }) : showAutoAcceptIndicator !== void 0 ? /* @__PURE__ */ (0, import_jsx_runtime114.jsx)(AutoAcceptIndicator, { approvalMode: showAutoAcceptIndicator }) : suppressHint ? null : /* @__PURE__ */ (0, import_jsx_runtime114.jsx)(Text, { color: theme.text.secondary, children: t("? for shortcuts") });
29760
29910
  const rightItems = [];
29761
29911
  if (sandboxInfo) {
29762
29912
  rightItems.push({
@@ -30973,7 +31123,7 @@ var AgentFooter = /* @__PURE__ */ __name(({
30973
31123
  contextWindowSize,
30974
31124
  terminalWidth
30975
31125
  }) => {
30976
- const showApproval = approvalMode !== void 0 && approvalMode !== "default" /* DEFAULT */;
31126
+ const showApproval = approvalMode !== void 0;
30977
31127
  const showContext = promptTokenCount > 0 && contextWindowSize !== void 0;
30978
31128
  if (!showApproval && !showContext) {
30979
31129
  return null;
@@ -31446,7 +31596,7 @@ var DefaultAppLayout = /* @__PURE__ */ __name(() => {
31446
31596
  }, "DefaultAppLayout");
31447
31597
 
31448
31598
  // packages/cli/src/ui/App.tsx
31449
- import fs12 from "node:fs";
31599
+ import fs13 from "node:fs";
31450
31600
  var import_jsx_runtime129 = __toESM(require_jsx_runtime(), 1);
31451
31601
  var App = /* @__PURE__ */ __name(() => {
31452
31602
  const uiState = useUIState();
@@ -31463,13 +31613,13 @@ var App = /* @__PURE__ */ __name(() => {
31463
31613
  corruptedPath: settings.corruptedPath,
31464
31614
  wasRecovered: settings.wasRecovered,
31465
31615
  onExit: () => {
31466
- if (settings.corruptedPath && fs12.existsSync(settings.corruptedPath)) {
31616
+ if (settings.corruptedPath && fs13.existsSync(settings.corruptedPath)) {
31467
31617
  try {
31468
31618
  const settingsPath = settings.corruptedPath.slice(
31469
31619
  0,
31470
31620
  -CORRUPTED_SUFFIX.length
31471
31621
  );
31472
- fs12.copyFileSync(settings.corruptedPath, settingsPath);
31622
+ fs13.copyFileSync(settings.corruptedPath, settingsPath);
31473
31623
  } catch (e) {
31474
31624
  writeStderrLine(
31475
31625
  `Failed to restore corrupted file: ${e instanceof Error ? e.message : String(e)}`
@@ -31478,7 +31628,7 @@ var App = /* @__PURE__ */ __name(() => {
31478
31628
  return;
31479
31629
  }
31480
31630
  try {
31481
- fs12.unlinkSync(settings.corruptedPath);
31631
+ fs13.unlinkSync(settings.corruptedPath);
31482
31632
  } catch (e) {
31483
31633
  writeStderrLine(
31484
31634
  `Settings restored, but could not remove ${settings.corruptedPath}: ${e instanceof Error ? e.message : String(e)}`
@@ -31488,9 +31638,9 @@ var App = /* @__PURE__ */ __name(() => {
31488
31638
  process.exit(1);
31489
31639
  },
31490
31640
  onContinue: () => {
31491
- if (settings.corruptedPath && fs12.existsSync(settings.corruptedPath)) {
31641
+ if (settings.corruptedPath && fs13.existsSync(settings.corruptedPath)) {
31492
31642
  try {
31493
- fs12.unlinkSync(settings.corruptedPath);
31643
+ fs13.unlinkSync(settings.corruptedPath);
31494
31644
  } catch (e) {
31495
31645
  writeStderrLine(
31496
31646
  `Could not remove ${settings.corruptedPath}: ${e instanceof Error ? e.message : String(e)}`
@@ -31515,7 +31665,7 @@ var import_react114 = __toESM(require_react(), 1);
31515
31665
  import process12 from "node:process";
31516
31666
  import os4 from "node:os";
31517
31667
  import v8 from "v8";
31518
- var debugLogger29 = createDebugLogger("MEMORY_MONITOR");
31668
+ var debugLogger30 = createDebugLogger("MEMORY_MONITOR");
31519
31669
  var MEMORY_WARNING_THRESHOLD = Math.min(
31520
31670
  7 * 1024 * 1024 * 1024,
31521
31671
  Math.floor(os4.totalmem() * 0.85)
@@ -31537,23 +31687,23 @@ var useMemoryMonitor = /* @__PURE__ */ __name(({
31537
31687
  const rss = memUsage.rss / 1024 / 1024;
31538
31688
  const external = memUsage.external / 1024 / 1024;
31539
31689
  const arrayBuffers = memUsage.arrayBuffers / 1024 / 1024;
31540
- if (debugLogger29.isEnabled()) {
31541
- debugLogger29.debug(
31690
+ if (debugLogger30.isEnabled()) {
31691
+ debugLogger30.debug(
31542
31692
  `[MEMORY_USAGE] heapUsed=${heapUsed.toFixed(1)}MB, heapTotal=${heapTotal.toFixed(1)}MB, rss=${rss.toFixed(1)}MB, external=${external.toFixed(1)}MB, arrayBuffers=${arrayBuffers.toFixed(1)}MB, heapUtilization=${(heapUsed / heapTotal * 100).toFixed(1)}%`
31543
31693
  );
31544
31694
  }
31545
31695
  const now = Date.now();
31546
31696
  if (compactOldItems && memUsage.heapUsed > MEMORY_UI_COMPACT_THRESHOLD() && now - lastCompactRef.current > UI_COMPACT_COOLDOWN_MS) {
31547
31697
  lastCompactRef.current = now;
31548
- if (debugLogger29.isEnabled()) {
31549
- debugLogger29.debug(
31698
+ if (debugLogger30.isEnabled()) {
31699
+ debugLogger30.debug(
31550
31700
  `[UI_COMPACT] heapUsed=${heapUsed.toFixed(1)}MB exceeds ${(MEMORY_UI_COMPACT_THRESHOLD() / 1024 / 1024).toFixed(0)}MB threshold, compacting UI history`
31551
31701
  );
31552
31702
  }
31553
31703
  try {
31554
31704
  compactOldItems();
31555
31705
  } catch (err) {
31556
- debugLogger29.error(
31706
+ debugLogger30.error(
31557
31707
  `[UI_COMPACT] compactOldItems failed: ${err instanceof Error ? err.message : String(err)}`
31558
31708
  );
31559
31709
  }
@@ -31562,7 +31712,7 @@ var useMemoryMonitor = /* @__PURE__ */ __name(({
31562
31712
  const warningIntervalId = setInterval(() => {
31563
31713
  const usage = process12.memoryUsage();
31564
31714
  if (usage.rss > MEMORY_WARNING_THRESHOLD) {
31565
- debugLogger29.warn(
31715
+ debugLogger30.warn(
31566
31716
  `[MEMORY_WARNING] High memory usage detected: ${(usage.rss / (1024 * 1024 * 1024)).toFixed(2)} GB`
31567
31717
  );
31568
31718
  addItem(
@@ -31693,25 +31843,25 @@ var useThemeCommand = /* @__PURE__ */ __name((loadedSettings, setThemeError, add
31693
31843
  // packages/cli/src/ui/hooks/useFeedbackDialog.ts
31694
31844
  init_esbuild_shims();
31695
31845
  var import_react117 = __toESM(require_react(), 1);
31696
- import * as fs13 from "node:fs";
31846
+ import * as fs14 from "node:fs";
31697
31847
  var import_strip_json_comments = __toESM(require_strip_json_comments(), 1);
31698
31848
  var FEEDBACK_SHOW_PROBABILITY = 0.25;
31699
31849
  var MIN_TOOL_CALLS = 10;
31700
31850
  var MIN_USER_MESSAGES = 5;
31701
31851
  var FEEDBACK_COOLDOWN_HOURS = 24;
31702
- var debugLogger30 = createDebugLogger("FEEDBACK_DIALOG");
31852
+ var debugLogger31 = createDebugLogger("FEEDBACK_DIALOG");
31703
31853
  var lastMessageIsAIResponse = /* @__PURE__ */ __name((history) => history.length > 0 && history[history.length - 1].type === "gemini" /* GEMINI */, "lastMessageIsAIResponse");
31704
31854
  var getFeedbackLastShownTimestampFromFile = /* @__PURE__ */ __name(() => {
31705
31855
  try {
31706
31856
  const userSettingsPath = Storage.getGlobalSettingsPath();
31707
- if (fs13.existsSync(userSettingsPath)) {
31708
- const content = fs13.readFileSync(userSettingsPath, "utf-8");
31857
+ if (fs14.existsSync(userSettingsPath)) {
31858
+ const content = fs14.readFileSync(userSettingsPath, "utf-8");
31709
31859
  const settings = JSON.parse((0, import_strip_json_comments.default)(content));
31710
31860
  return settings?.ui?.feedbackLastShownTimestamp ?? 0;
31711
31861
  }
31712
31862
  } catch (error) {
31713
31863
  if (isNodeError(error) && error.code !== "ENOENT") {
31714
- debugLogger30.warn(
31864
+ debugLogger31.warn(
31715
31865
  "Failed to read feedbackLastShownTimestamp from settings file:",
31716
31866
  error
31717
31867
  );
@@ -32472,7 +32622,7 @@ __name(useDeleteCommand, "useDeleteCommand");
32472
32622
  // packages/cli/src/ui/hooks/slashCommandProcessor.ts
32473
32623
  init_esbuild_shims();
32474
32624
  var import_react126 = __toESM(require_react(), 1);
32475
- var debugLogger31 = createDebugLogger("SLASH_COMMAND_PROCESSOR");
32625
+ var debugLogger32 = createDebugLogger("SLASH_COMMAND_PROCESSOR");
32476
32626
  function hasUserPromptExpansionHooks(config) {
32477
32627
  return !!config && !config.getDisableAllHooks?.() && (config.hasHooksForEvent?.("UserPromptExpansion") ?? false);
32478
32628
  }
@@ -32497,11 +32647,19 @@ var SLASH_COMMANDS_SKIP_RECORDING = /* @__PURE__ */ new Set([
32497
32647
  "btw",
32498
32648
  "history"
32499
32649
  ]);
32650
+ var MAX_EXTENSION_CONTENT_REFRESH_PASSES = 5;
32500
32651
  function getSkillCommandName(command) {
32501
32652
  return command.skillDetail?.name ?? command.name;
32502
32653
  }
32503
32654
  __name(getSkillCommandName, "getSkillCommandName");
32504
- var useSlashCommandProcessor = /* @__PURE__ */ __name((config, settings, history, addItem, clearItems, loadHistory, refreshStatic, toggleVimEnabled, isProcessing, setIsProcessing, isIdleRef, setGeminiMdFileCount, actions, extensionsUpdateState, isConfigInitialized, logger, updateItem, setSessionName) => {
32655
+ var useSlashCommandProcessor = /* @__PURE__ */ __name((config, settings, history, addItem, clearItems, loadHistory, refreshStatic, toggleVimEnabled, isProcessing, setIsProcessing, isIdleRef, setGeminiMdFileCount, actions, extensionsUpdateState, isConfigInitialized, logger, updateItem, setSessionName, extensionRefreshState) => {
32656
+ const fallbackExtensionRefreshStateRef = (0, import_react126.useRef)(
32657
+ null
32658
+ );
32659
+ if (!fallbackExtensionRefreshStateRef.current) {
32660
+ fallbackExtensionRefreshStateRef.current = new ExtensionRefreshState();
32661
+ }
32662
+ const activeExtensionRefreshState = extensionRefreshState ?? fallbackExtensionRefreshStateRef.current;
32505
32663
  const historyRef = (0, import_react126.useRef)(history);
32506
32664
  (0, import_react126.useLayoutEffect)(() => {
32507
32665
  historyRef.current = history;
@@ -32511,6 +32669,16 @@ var useSlashCommandProcessor = /* @__PURE__ */ __name((config, settings, history
32511
32669
  const [recentCommands, setRecentCommands] = (0, import_react126.useState)(/* @__PURE__ */ new Map());
32512
32670
  const [reloadTrigger, setReloadTrigger] = (0, import_react126.useState)(0);
32513
32671
  const commandReloadResolversRef = (0, import_react126.useRef)([]);
32672
+ const extensionContentRefreshTimerRef = (0, import_react126.useRef)(null);
32673
+ const extensionContentRefreshRunningRef = (0, import_react126.useRef)(false);
32674
+ const extensionContentRefreshPendingRef = (0, import_react126.useRef)(false);
32675
+ const mountedRef = (0, import_react126.useRef)(true);
32676
+ (0, import_react126.useEffect)(() => {
32677
+ mountedRef.current = true;
32678
+ return () => {
32679
+ mountedRef.current = false;
32680
+ };
32681
+ }, []);
32514
32682
  const resolveCommandReloads = (0, import_react126.useCallback)((completedTrigger) => {
32515
32683
  if (commandReloadResolversRef.current.length === 0) {
32516
32684
  return;
@@ -32540,6 +32708,77 @@ var useSlashCommandProcessor = /* @__PURE__ */ __name((config, settings, history
32540
32708
  });
32541
32709
  });
32542
32710
  }, [config]);
32711
+ const clearPendingExtensionContentRefresh = (0, import_react126.useCallback)(() => {
32712
+ if (!extensionContentRefreshTimerRef.current) {
32713
+ return;
32714
+ }
32715
+ clearTimeout(extensionContentRefreshTimerRef.current);
32716
+ extensionContentRefreshTimerRef.current = null;
32717
+ }, []);
32718
+ const showExtensionContentRefreshError = (0, import_react126.useCallback)(
32719
+ (error) => {
32720
+ if (!mountedRef.current) {
32721
+ return;
32722
+ }
32723
+ addItem(
32724
+ {
32725
+ type: "error" /* ERROR */,
32726
+ text: error instanceof Error ? t(
32727
+ "Failed to refresh extension content: {{message}}. Run /reload-plugins to apply updates.",
32728
+ { message: error.message }
32729
+ ) : t(
32730
+ "Failed to refresh extension content. Run /reload-plugins to apply updates."
32731
+ )
32732
+ },
32733
+ Date.now()
32734
+ );
32735
+ },
32736
+ [addItem]
32737
+ );
32738
+ const runExtensionContentRefresh = (0, import_react126.useCallback)(async () => {
32739
+ if (!config) {
32740
+ return;
32741
+ }
32742
+ if (extensionContentRefreshRunningRef.current) {
32743
+ extensionContentRefreshPendingRef.current = true;
32744
+ return;
32745
+ }
32746
+ extensionContentRefreshRunningRef.current = true;
32747
+ let refreshPasses = 0;
32748
+ try {
32749
+ do {
32750
+ if (refreshPasses >= MAX_EXTENSION_CONTENT_REFRESH_PASSES) {
32751
+ extensionContentRefreshPendingRef.current = false;
32752
+ showExtensionContentRefreshError(
32753
+ new Error("too many extension content changes are still pending")
32754
+ );
32755
+ return;
32756
+ }
32757
+ refreshPasses++;
32758
+ extensionContentRefreshPendingRef.current = false;
32759
+ if (activeExtensionRefreshState.isReloadInProgress()) {
32760
+ return;
32761
+ }
32762
+ if (activeExtensionRefreshState.needsExtensionRefresh()) {
32763
+ return;
32764
+ }
32765
+ await refreshExtensionContentRuntime({
32766
+ config,
32767
+ reloadCommands
32768
+ });
32769
+ } while (extensionContentRefreshPendingRef.current);
32770
+ } catch (error) {
32771
+ extensionContentRefreshPendingRef.current = false;
32772
+ showExtensionContentRefreshError(error);
32773
+ } finally {
32774
+ extensionContentRefreshRunningRef.current = false;
32775
+ }
32776
+ }, [
32777
+ activeExtensionRefreshState,
32778
+ config,
32779
+ reloadCommands,
32780
+ showExtensionContentRefreshError
32781
+ ]);
32543
32782
  const [shellConfirmationRequest, setShellConfirmationRequest] = (0, import_react126.useState)(null);
32544
32783
  const [confirmationRequest, setConfirmationRequest] = (0, import_react126.useState)(null);
32545
32784
  const [sessionShellAllowlist, setSessionShellAllowlist] = (0, import_react126.useState)(
@@ -32652,7 +32891,8 @@ var useSlashCommandProcessor = /* @__PURE__ */ __name((config, settings, history
32652
32891
  services: {
32653
32892
  config,
32654
32893
  settings,
32655
- logger
32894
+ logger,
32895
+ extensionRefreshState: activeExtensionRefreshState
32656
32896
  },
32657
32897
  ui: {
32658
32898
  get history() {
@@ -32714,7 +32954,8 @@ var useSlashCommandProcessor = /* @__PURE__ */ __name((config, settings, history
32714
32954
  reloadCommands,
32715
32955
  setSessionName,
32716
32956
  extensionsUpdateState,
32717
- isIdleRef
32957
+ isIdleRef,
32958
+ activeExtensionRefreshState
32718
32959
  ]
32719
32960
  );
32720
32961
  (0, import_react126.useEffect)(() => {
@@ -32775,6 +33016,79 @@ var useSlashCommandProcessor = /* @__PURE__ */ __name((config, settings, history
32775
33016
  reloadCommands();
32776
33017
  });
32777
33018
  }, [config, isConfigInitialized, reloadCommands]);
33019
+ (0, import_react126.useEffect)(() => {
33020
+ const listener = /* @__PURE__ */ __name((reason) => {
33021
+ clearPendingExtensionContentRefresh();
33022
+ addItem(
33023
+ {
33024
+ type: "info" /* INFO */,
33025
+ text: reason === EXTENSION_RELOAD_FAILED_REASON ? t(
33026
+ "Extension reload did not complete. Run /reload-plugins to try again."
33027
+ ) : t(
33028
+ "Extensions changed on disk. Run /reload-plugins to apply updates."
33029
+ )
33030
+ },
33031
+ Date.now()
33032
+ );
33033
+ }, "listener");
33034
+ activeExtensionRefreshState.on("extension-refresh-needed" /* ExtensionRefreshNeeded */, listener);
33035
+ return () => {
33036
+ activeExtensionRefreshState.off(
33037
+ "extension-refresh-needed" /* ExtensionRefreshNeeded */,
33038
+ listener
33039
+ );
33040
+ };
33041
+ }, [
33042
+ activeExtensionRefreshState,
33043
+ addItem,
33044
+ clearPendingExtensionContentRefresh
33045
+ ]);
33046
+ (0, import_react126.useEffect)(() => {
33047
+ activeExtensionRefreshState.on(
33048
+ "extensions-reload-started" /* ExtensionsReloadStarted */,
33049
+ clearPendingExtensionContentRefresh
33050
+ );
33051
+ activeExtensionRefreshState.on(
33052
+ "extensions-reloaded" /* ExtensionsReloaded */,
33053
+ clearPendingExtensionContentRefresh
33054
+ );
33055
+ return () => {
33056
+ activeExtensionRefreshState.off(
33057
+ "extensions-reload-started" /* ExtensionsReloadStarted */,
33058
+ clearPendingExtensionContentRefresh
33059
+ );
33060
+ activeExtensionRefreshState.off(
33061
+ "extensions-reloaded" /* ExtensionsReloaded */,
33062
+ clearPendingExtensionContentRefresh
33063
+ );
33064
+ };
33065
+ }, [activeExtensionRefreshState, clearPendingExtensionContentRefresh]);
33066
+ (0, import_react126.useEffect)(() => {
33067
+ if (!config) {
33068
+ return;
33069
+ }
33070
+ const listener = /* @__PURE__ */ __name(() => {
33071
+ clearPendingExtensionContentRefresh();
33072
+ extensionContentRefreshTimerRef.current = setTimeout(() => {
33073
+ extensionContentRefreshTimerRef.current = null;
33074
+ void runExtensionContentRefresh();
33075
+ }, 250);
33076
+ }, "listener");
33077
+ activeExtensionRefreshState.on("extension-content-changed" /* ExtensionContentChanged */, listener);
33078
+ return () => {
33079
+ activeExtensionRefreshState.off(
33080
+ "extension-content-changed" /* ExtensionContentChanged */,
33081
+ listener
33082
+ );
33083
+ clearPendingExtensionContentRefresh();
33084
+ extensionContentRefreshPendingRef.current = false;
33085
+ };
33086
+ }, [
33087
+ clearPendingExtensionContentRefresh,
33088
+ config,
33089
+ activeExtensionRefreshState,
33090
+ runExtensionContentRefresh
33091
+ ]);
32778
33092
  (0, import_react126.useEffect)(() => {
32779
33093
  const controller = new AbortController();
32780
33094
  const load = /* @__PURE__ */ __name(async () => {
@@ -32854,7 +33168,7 @@ var useSlashCommandProcessor = /* @__PURE__ */ __name((config, settings, history
32854
33168
  }
32855
33169
  setCommands(commandService.getCommandsForMode("interactive"));
32856
33170
  } catch (error) {
32857
- debugLogger31.error("Failed to load slash commands:", error);
33171
+ debugLogger32.error("Failed to load slash commands:", error);
32858
33172
  } finally {
32859
33173
  if (!controller.signal.aborted) {
32860
33174
  resolveCommandReloads(reloadTrigger);
@@ -33229,7 +33543,7 @@ var useSlashCommandProcessor = /* @__PURE__ */ __name((config, settings, history
33229
33543
  }
33230
33544
  if (invocationItemId !== void 0) {
33231
33545
  invocationSentToModel = true;
33232
- debugLogger31.debug(
33546
+ debugLogger32.debug(
33233
33547
  `Marked slash command invocation as model-sent: /${resolvedCommandPath.join(
33234
33548
  " "
33235
33549
  )}`
@@ -33375,7 +33689,7 @@ ${commandToExecute.subCommands.map((sc) => ` - ${sc.name}: ${sc.description ||
33375
33689
  });
33376
33690
  }
33377
33691
  } catch (recordError) {
33378
- debugLogger31.error(
33692
+ debugLogger32.error(
33379
33693
  "[slashCommand] Failed to record slash command:",
33380
33694
  recordError
33381
33695
  );
@@ -33459,7 +33773,7 @@ function useDoublePress(onDoublePress, onPending) {
33459
33773
  __name(useDoublePress, "useDoublePress");
33460
33774
 
33461
33775
  // packages/cli/src/ui/AppContainer.tsx
33462
- import * as fs16 from "node:fs";
33776
+ import * as fs17 from "node:fs";
33463
33777
  import { basename as basename3 } from "node:path";
33464
33778
 
33465
33779
  // packages/cli/src/utils/windowTitle.ts
@@ -33535,7 +33849,7 @@ var DIGIT_MULTIPLIER = 10;
33535
33849
  var DEFAULT_COUNT = 1;
33536
33850
  var MAX_COUNT = 9999;
33537
33851
  var DIGIT_1_TO_9 = /^[1-9]$/;
33538
- var debugLogger32 = createDebugLogger("VIM_MODE");
33852
+ var debugLogger33 = createDebugLogger("VIM_MODE");
33539
33853
  var CMD_TYPES = {
33540
33854
  DELETE_WORD_FORWARD: "dw",
33541
33855
  DELETE_WORD_BACKWARD: "db",
@@ -33678,7 +33992,7 @@ function readClipboard() {
33678
33992
  }
33679
33993
  return "";
33680
33994
  } catch (e) {
33681
- debugLogger32.warn("readClipboard failed:", e);
33995
+ debugLogger33.warn("readClipboard failed:", e);
33682
33996
  return "";
33683
33997
  }
33684
33998
  }
@@ -33724,7 +34038,7 @@ function writeClipboard(text) {
33724
34038
  const [bin, ...args] = linuxWriteCmd;
33725
34039
  const child = execFile7(bin, args, { timeout: 500 }, (err) => {
33726
34040
  if (err && !writeOsc52(text)) {
33727
- debugLogger32.warn(
34041
+ debugLogger33.warn(
33728
34042
  "writeClipboard: cached tool and OSC 52 both failed"
33729
34043
  );
33730
34044
  }
@@ -33733,11 +34047,11 @@ function writeClipboard(text) {
33733
34047
  child.unref();
33734
34048
  } else {
33735
34049
  if (!writeOsc52(text)) {
33736
- debugLogger32.warn("OSC 52 clipboard write failed - no TTY available");
34050
+ debugLogger33.warn("OSC 52 clipboard write failed - no TTY available");
33737
34051
  }
33738
34052
  }
33739
34053
  } catch (e) {
33740
- debugLogger32.warn("writeClipboard failed:", e);
34054
+ debugLogger33.warn("writeClipboard failed:", e);
33741
34055
  }
33742
34056
  }
33743
34057
  __name(writeClipboard, "writeClipboard");
@@ -34452,7 +34766,7 @@ function useVim(buffer, onSubmit) {
34452
34766
  try {
34453
34767
  normalizedKey = normalizeKey(key);
34454
34768
  } catch (error) {
34455
- debugLogger32.warn("Malformed key input in vim mode:", key, error);
34769
+ debugLogger33.warn("Malformed key input in vim mode:", key, error);
34456
34770
  return false;
34457
34771
  }
34458
34772
  const s = stateRef.current;
@@ -35675,11 +35989,11 @@ var import_react137 = __toESM(require_react(), 1);
35675
35989
 
35676
35990
  // packages/cli/src/services/command-migration-tool.ts
35677
35991
  init_esbuild_shims();
35678
- import { promises as fs14 } from "node:fs";
35992
+ import { promises as fs15 } from "node:fs";
35679
35993
  import path9 from "node:path";
35680
35994
  async function detectTomlCommands(commandDir) {
35681
35995
  try {
35682
- await fs14.access(commandDir);
35996
+ await fs15.access(commandDir);
35683
35997
  } catch {
35684
35998
  return [];
35685
35999
  }
@@ -35705,11 +36019,11 @@ async function migrateTomlCommands(options) {
35705
36019
  for (const relativeFile of tomlFiles) {
35706
36020
  const tomlPath = path9.join(commandDir, relativeFile);
35707
36021
  try {
35708
- const tomlContent = await fs14.readFile(tomlPath, "utf-8");
36022
+ const tomlContent = await fs15.readFile(tomlPath, "utf-8");
35709
36023
  const markdownContent = convertTomlToMarkdown(tomlContent);
35710
36024
  const markdownPath = tomlPath.replace(/\.toml$/, ".md");
35711
36025
  try {
35712
- await fs14.access(markdownPath);
36026
+ await fs15.access(markdownPath);
35713
36027
  throw new Error(
35714
36028
  t("Markdown file already exists: {{filename}}", {
35715
36029
  filename: path9.basename(markdownPath)
@@ -35720,12 +36034,12 @@ async function migrateTomlCommands(options) {
35720
36034
  throw error;
35721
36035
  }
35722
36036
  }
35723
- await fs14.writeFile(markdownPath, markdownContent, "utf-8");
36037
+ await fs15.writeFile(markdownPath, markdownContent, "utf-8");
35724
36038
  if (createBackup) {
35725
36039
  const backupPath = `${tomlPath}.backup`;
35726
- await fs14.rename(tomlPath, backupPath);
36040
+ await fs15.rename(tomlPath, backupPath);
35727
36041
  } else if (deleteOriginal) {
35728
- await fs14.unlink(tomlPath);
36042
+ await fs15.unlink(tomlPath);
35729
36043
  }
35730
36044
  result.convertedFiles.push(relativeFile);
35731
36045
  } catch (error) {
@@ -35776,7 +36090,7 @@ __name(useCommandMigration, "useCommandMigration");
35776
36090
 
35777
36091
  // packages/cli/src/services/notificationService.ts
35778
36092
  init_esbuild_shims();
35779
- var debugLogger33 = createDebugLogger("NOTIFICATION_SERVICE");
36093
+ var debugLogger34 = createDebugLogger("NOTIFICATION_SERVICE");
35780
36094
  var DEFAULT_TITLE = "Qwen Code";
35781
36095
  function sendNotification(opts, terminal, enabled) {
35782
36096
  if (!enabled) {
@@ -35804,7 +36118,7 @@ function sendNotification(opts, terminal, enabled) {
35804
36118
  return "terminal_bell";
35805
36119
  }
35806
36120
  } catch (error) {
35807
- debugLogger33.warn("Failed to send notification:", error);
36121
+ debugLogger34.warn("Failed to send notification:", error);
35808
36122
  return "error";
35809
36123
  }
35810
36124
  }
@@ -35907,7 +36221,7 @@ __name(useGitBranchName, "useGitBranchName");
35907
36221
  // packages/cli/src/ui/hooks/useWorktreeSession.ts
35908
36222
  init_esbuild_shims();
35909
36223
  var import_react140 = __toESM(require_react(), 1);
35910
- import fs15 from "node:fs";
36224
+ import fs16 from "node:fs";
35911
36225
  import fsPromises from "node:fs/promises";
35912
36226
  import path10 from "node:path";
35913
36227
  function useWorktreeSession(config) {
@@ -35932,7 +36246,7 @@ function useWorktreeSession(config) {
35932
36246
  try {
35933
36247
  await fsPromises.mkdir(dirPath, { recursive: true });
35934
36248
  if (cancelled) return;
35935
- watcher = fs15.watch(dirPath, (_eventType, filename) => {
36249
+ watcher = fs16.watch(dirPath, (_eventType, filename) => {
35936
36250
  if (filename === null || filename.toString() === fileName) {
35937
36251
  void safeLoad();
35938
36252
  }
@@ -36945,7 +37259,7 @@ var import_jsx_runtime132 = __toESM(require_jsx_runtime(), 1);
36945
37259
  var MCP_BATCH_FLUSH_MS = 16;
36946
37260
  var STARTUP_PROFILE_FINALIZE_CAP_MS = 35e3;
36947
37261
  var CTRL_EXIT_PROMPT_DURATION_MS = 1e3;
36948
- var debugLogger34 = createDebugLogger("APP_CONTAINER");
37262
+ var debugLogger35 = createDebugLogger("APP_CONTAINER");
36949
37263
  function isRenderModeToggleKey(key) {
36950
37264
  return keyMatchers["toggleRenderMode" /* TOGGLE_RENDER_MODE */](key) || key.name === "m" && key.meta && !key.ctrl && !key.paste;
36951
37265
  }
@@ -37039,10 +37353,18 @@ function mergeStartupWarnings(currentWarnings, nextWarnings) {
37039
37353
  return [.../* @__PURE__ */ new Set([...currentWarnings, ...nextWarnings])];
37040
37354
  }
37041
37355
  __name(mergeStartupWarnings, "mergeStartupWarnings");
37356
+ function shouldAutoOpenSkillReview(args) {
37357
+ return args.pending !== null && args.pending.skills.length > 0 && args.streamingState === "idle" /* Idle */ && !args.isMemoryDialogOpen && args.autoSkillEnabled && !args.dismissedTaskIds.has(args.pending.taskId);
37358
+ }
37359
+ __name(shouldAutoOpenSkillReview, "shouldAutoOpenSkillReview");
37042
37360
  var SHELL_WIDTH_FRACTION = 0.89;
37043
37361
  var SHELL_HEIGHT_PADDING = 10;
37044
37362
  var AppContainer = /* @__PURE__ */ __name((props) => {
37045
37363
  const { settings, config, initializationResult } = props;
37364
+ const extensionRefreshState = (0, import_react157.useMemo)(
37365
+ () => props.extensionRefreshState ?? new ExtensionRefreshState(),
37366
+ [props.extensionRefreshState]
37367
+ );
37046
37368
  const historyManager = useHistory();
37047
37369
  const historyRef = (0, import_react157.useRef)(historyManager.history);
37048
37370
  historyRef.current = historyManager.history;
@@ -37183,7 +37505,7 @@ var AppContainer = /* @__PURE__ */ __name((props) => {
37183
37505
  const staticExtraHeight = 3;
37184
37506
  (0, import_react157.useEffect)(() => {
37185
37507
  void loadLowlight().catch((err) => {
37186
- debugLogger34.warn(
37508
+ debugLogger35.warn(
37187
37509
  `Failed to load lowlight chunk; code blocks will render as plain text: ${err instanceof Error ? err.message : String(err)}`
37188
37510
  );
37189
37511
  });
@@ -37268,9 +37590,9 @@ var AppContainer = /* @__PURE__ */ __name((props) => {
37268
37590
  registerCleanup(async () => {
37269
37591
  try {
37270
37592
  await config.getHookSystem()?.fireSessionEndEvent("prompt_input_exit" /* PromptInputExit */);
37271
- debugLogger34.debug("SessionEnd event completed successfully!!!");
37593
+ debugLogger35.debug("SessionEnd event completed successfully!!!");
37272
37594
  } catch (err) {
37273
- debugLogger34.error(`SessionEnd hook failed: ${err}`);
37595
+ debugLogger35.error(`SessionEnd hook failed: ${err}`);
37274
37596
  }
37275
37597
  });
37276
37598
  registerCleanup(async () => {
@@ -37296,7 +37618,7 @@ var AppContainer = /* @__PURE__ */ __name((props) => {
37296
37618
  flushTimer = null;
37297
37619
  }
37298
37620
  return geminiClient2.setTools().catch((err) => {
37299
- debugLogger34.error(
37621
+ debugLogger35.error(
37300
37622
  `setTools() batch-flush failed: ${err instanceof Error ? err.message : String(err)}`
37301
37623
  );
37302
37624
  });
@@ -37314,7 +37636,7 @@ var AppContainer = /* @__PURE__ */ __name((props) => {
37314
37636
  failureSurfaced = true;
37315
37637
  const failedNames = typeof config.getFailedMcpServerNames === "function" ? config.getFailedMcpServerNames() : [];
37316
37638
  if (failedNames.length > 0) {
37317
- debugLogger34.warn(
37639
+ debugLogger35.warn(
37318
37640
  `MCP server(s) failed to start: ${failedNames.join(", ")}. Continuing with built-in tools and any servers that did connect.`
37319
37641
  );
37320
37642
  }
@@ -37363,7 +37685,7 @@ var AppContainer = /* @__PURE__ */ __name((props) => {
37363
37685
  const staticAreaMaxItemHeight = Math.max(terminalHeight * 4, 100);
37364
37686
  const isValidPath = (0, import_react157.useCallback)((filePath) => {
37365
37687
  try {
37366
- return fs16.existsSync(filePath) && fs16.statSync(filePath).isFile();
37688
+ return fs17.existsSync(filePath) && fs17.statSync(filePath).isFile();
37367
37689
  } catch (_e) {
37368
37690
  return false;
37369
37691
  }
@@ -37629,7 +37951,8 @@ var AppContainer = /* @__PURE__ */ __name((props) => {
37629
37951
  taskId: withPending.id,
37630
37952
  skills: pendingSkills.map((p) => ({
37631
37953
  name: p.name,
37632
- description: p.description
37954
+ description: p.description,
37955
+ stagedManifestPath: p.stagedManifestPath
37633
37956
  }))
37634
37957
  });
37635
37958
  }, "refresh");
@@ -37739,7 +38062,8 @@ var AppContainer = /* @__PURE__ */ __name((props) => {
37739
38062
  isConfigInitialized,
37740
38063
  logger,
37741
38064
  historyManager.updateItem,
37742
- setSessionName
38065
+ setSessionName,
38066
+ extensionRefreshState
37743
38067
  );
37744
38068
  const onDebugMessage = (0, import_react157.useCallback)(
37745
38069
  (message) => {
@@ -37866,7 +38190,7 @@ var AppContainer = /* @__PURE__ */ __name((props) => {
37866
38190
  },
37867
38191
  Date.now()
37868
38192
  );
37869
- debugLogger34.debug(
38193
+ debugLogger35.debug(
37870
38194
  `[DEBUG] Refreshed memory content in config: ${memoryContent.substring(
37871
38195
  0,
37872
38196
  200
@@ -37881,7 +38205,7 @@ var AppContainer = /* @__PURE__ */ __name((props) => {
37881
38205
  },
37882
38206
  Date.now()
37883
38207
  );
37884
- debugLogger34.error("Error refreshing memory:", error);
38208
+ debugLogger35.error("Error refreshing memory:", error);
37885
38209
  }
37886
38210
  }, [config, historyManager, settings.merged]);
37887
38211
  const cancelHandlerRef = (0, import_react157.useRef)(() => {
@@ -37934,10 +38258,16 @@ var AppContainer = /* @__PURE__ */ __name((props) => {
37934
38258
  }
37935
38259
  }, [streamingState]);
37936
38260
  (0, import_react157.useEffect)(() => {
37937
- if (skillReviewPending && skillReviewPending.skills.length > 0 && streamingState === "idle" /* Idle */ && !skillReviewDismissedTaskIdsRef.current.has(skillReviewPending.taskId)) {
38261
+ if (shouldAutoOpenSkillReview({
38262
+ pending: skillReviewPending,
38263
+ streamingState,
38264
+ isMemoryDialogOpen,
38265
+ autoSkillEnabled: config.getAutoSkillEnabled(),
38266
+ dismissedTaskIds: skillReviewDismissedTaskIdsRef.current
38267
+ })) {
37938
38268
  setIsSkillReviewDialogOpen(true);
37939
38269
  }
37940
- }, [skillReviewPending, streamingState]);
38270
+ }, [skillReviewPending, streamingState, isMemoryDialogOpen, config]);
37941
38271
  const tipsDisabled = !!(settings.merged.ui?.hideTips || config.getScreenReader());
37942
38272
  const tipHistory = (0, import_react157.useMemo)(
37943
38273
  () => tipsDisabled ? null : getTipHistory(),
@@ -38262,30 +38592,30 @@ ${buildWorkflowSteeringNotice()}
38262
38592
  ${currentText}` : popped);
38263
38593
  }
38264
38594
  if (!draftWasEmpty) {
38265
- debugLogger34.debug("auto-restore bail: buffer was non-empty");
38595
+ debugLogger35.debug("auto-restore bail: buffer was non-empty");
38266
38596
  return;
38267
38597
  }
38268
38598
  if (popped !== null) {
38269
- debugLogger34.debug(
38599
+ debugLogger35.debug(
38270
38600
  "auto-restore bail: queue had items (drained to buffer)"
38271
38601
  );
38272
38602
  return;
38273
38603
  }
38274
38604
  if (pendingHistoryItems2.some((item) => !isSyntheticHistoryItem(item))) {
38275
- debugLogger34.debug(
38605
+ debugLogger35.debug(
38276
38606
  "auto-restore bail: pending stream item has meaningful content"
38277
38607
  );
38278
38608
  return;
38279
38609
  }
38280
38610
  if (info?.turnProducedMeaningfulContent) {
38281
- debugLogger34.debug(
38611
+ debugLogger35.debug(
38282
38612
  "auto-restore bail: turn produced meaningful content during stream/flush"
38283
38613
  );
38284
38614
  return;
38285
38615
  }
38286
38616
  const cancelledTurnUserItem = info?.lastTurnUserItem;
38287
38617
  if (cancelledTurnUserItem == null) {
38288
- debugLogger34.debug(
38618
+ debugLogger35.debug(
38289
38619
  "auto-restore bail: cancelled turn did not add a user history item"
38290
38620
  );
38291
38621
  return;
@@ -38293,29 +38623,29 @@ ${currentText}` : popped);
38293
38623
  const history = historyRef.current;
38294
38624
  const lastUserIdx = findLastUserItemIndex(history);
38295
38625
  if (lastUserIdx === -1) {
38296
- debugLogger34.debug("auto-restore bail: no user item in history");
38626
+ debugLogger35.debug("auto-restore bail: no user item in history");
38297
38627
  return;
38298
38628
  }
38299
38629
  if (!itemsAfterAreOnlySynthetic(history, lastUserIdx)) {
38300
- debugLogger34.debug(
38630
+ debugLogger35.debug(
38301
38631
  "auto-restore bail: meaningful content committed after last user item"
38302
38632
  );
38303
38633
  return;
38304
38634
  }
38305
38635
  const lastUserItem = history[lastUserIdx];
38306
38636
  if (lastUserItem.type !== "user") {
38307
- debugLogger34.debug(
38637
+ debugLogger35.debug(
38308
38638
  "auto-restore bail: lastUserItem type narrowing failed (unexpected)"
38309
38639
  );
38310
38640
  return;
38311
38641
  }
38312
38642
  if (lastUserItem.id !== cancelledTurnUserItem.id || lastUserItem.text !== cancelledTurnUserItem.text) {
38313
- debugLogger34.debug(
38643
+ debugLogger35.debug(
38314
38644
  "auto-restore bail: lastUserItem identity does not match cancelled-turn user item"
38315
38645
  );
38316
38646
  return;
38317
38647
  }
38318
- debugLogger34.debug(
38648
+ debugLogger35.debug(
38319
38649
  "auto-restore: rewinding cancelled turn and restoring prompt"
38320
38650
  );
38321
38651
  historyManager.truncateToItem(lastUserItem.id);
@@ -38323,7 +38653,7 @@ ${currentText}` : popped);
38323
38653
  buffer.setText(lastUserItem.text);
38324
38654
  geminiClient?.stripOrphanedUserEntriesFromHistory?.();
38325
38655
  void logger?.removeLastUserMessage().catch((err) => {
38326
- debugLogger34.debug("Failed to undo cancelled prompt from log:", err);
38656
+ debugLogger35.debug("Failed to undo cancelled prompt from log:", err);
38327
38657
  });
38328
38658
  },
38329
38659
  [
@@ -39025,7 +39355,7 @@ ${migrationResult.failedFiles.map((f) => ` \u2022 ${f.file}: ${f.error}`).join(
39025
39355
  const handleGlobalKeypress = (0, import_react157.useCallback)(
39026
39356
  (key) => {
39027
39357
  if (settings.merged.general?.debugKeystrokeLogging) {
39028
- debugLogger34.debug("[DEBUG] Keystroke:", JSON.stringify(key));
39358
+ debugLogger35.debug("[DEBUG] Keystroke:", JSON.stringify(key));
39029
39359
  }
39030
39360
  if (thinkingViewerData) {
39031
39361
  if (keyMatchers["quit" /* QUIT */](key) || keyMatchers["exit" /* EXIT */](key)) {
@@ -39157,7 +39487,7 @@ ${migrationResult.failedFiles.map((f) => ` \u2022 ${f.file}: ${f.error}`).join(
39157
39487
  );
39158
39488
  if (promotableShells.length === 1) {
39159
39489
  const executingShell = promotableShells[0];
39160
- debugLogger34.debug(
39490
+ debugLogger35.debug(
39161
39491
  `Ctrl+B promote: matched executing shell tool call ${executingShell.request.callId}`
39162
39492
  );
39163
39493
  executingShell.promoteAbortController.abort({
@@ -39165,7 +39495,7 @@ ${migrationResult.failedFiles.map((f) => ` \u2022 ${f.file}: ${f.error}`).join(
39165
39495
  });
39166
39496
  return;
39167
39497
  }
39168
- debugLogger34.debug(
39498
+ debugLogger35.debug(
39169
39499
  `Ctrl+B promote: expected exactly one executing shell tool call; falling through (streamingState=${streamingState}, pendingToolCalls=${pendingToolCallsRef.current.length}, promotableShells=${promotableShells.length})`
39170
39500
  );
39171
39501
  }
@@ -39977,7 +40307,7 @@ __name(installSynchronizedOutput, "installSynchronizedOutput");
39977
40307
 
39978
40308
  // packages/cli/src/ui/startInteractiveUI.tsx
39979
40309
  var import_jsx_runtime133 = __toESM(require_jsx_runtime(), 1);
39980
- var debugLogger35 = createDebugLogger("STARTUP");
40310
+ var debugLogger36 = createDebugLogger("STARTUP");
39981
40311
  async function startInteractiveUI(config, settings, startupWarnings, workspaceRoot = process.cwd(), initializationResult, options = {}) {
39982
40312
  const version = await getCliVersion();
39983
40313
  setWindowTitle(settings, basename4(workspaceRoot));
@@ -40014,7 +40344,7 @@ async function startInteractiveUI(config, settings, startupWarnings, workspaceRo
40014
40344
  );
40015
40345
  }
40016
40346
  } catch (err) {
40017
- debugLogger35.error("Failed to initialize dual output bridge:", err);
40347
+ debugLogger36.error("Failed to initialize dual output bridge:", err);
40018
40348
  writeStderrLine(
40019
40349
  `Warning: dual output disabled \u2014 ${err instanceof Error ? err.message : String(err)}`
40020
40350
  );
@@ -40025,7 +40355,7 @@ async function startInteractiveUI(config, settings, startupWarnings, workspaceRo
40025
40355
  try {
40026
40356
  remoteInputWatcher = new RemoteInputWatcher(inputFile);
40027
40357
  } catch (err) {
40028
- debugLogger35.error("Failed to initialize remote input watcher:", err);
40358
+ debugLogger36.error("Failed to initialize remote input watcher:", err);
40029
40359
  writeStderrLine(
40030
40360
  `Warning: remote input disabled \u2014 ${err instanceof Error ? err.message : String(err)}`
40031
40361
  );
@@ -40050,7 +40380,8 @@ async function startInteractiveUI(config, settings, startupWarnings, workspaceRo
40050
40380
  settings,
40051
40381
  startupWarnings,
40052
40382
  version,
40053
- initializationResult
40383
+ initializationResult,
40384
+ extensionRefreshState: options.extensionRefreshState
40054
40385
  }
40055
40386
  ) }) }) }) })
40056
40387
  }