@qwen-code/qwen-code 0.19.3 → 0.19.4

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 (305) hide show
  1. package/bundled/loop/SKILL.md +22 -3
  2. package/bundled/loop/SKILL.test.ts +20 -0
  3. package/bundled/loop/autonomous-loop.test.ts +59 -0
  4. package/bundled/loop/autonomous-loop.ts +102 -0
  5. package/bundled/loop/loop-task-file.test.ts +1064 -0
  6. package/bundled/loop/loop-task-file.ts +404 -0
  7. package/bundled/loop/loop-tick-resolver.test.ts +906 -0
  8. package/bundled/loop/loop-tick-resolver.ts +416 -0
  9. package/bundled/qc-helper/SKILL.md +12 -5
  10. package/bundled/qc-helper/docs/configuration/auth.md +1 -1
  11. package/bundled/qc-helper/docs/configuration/settings.md +40 -26
  12. package/bundled/qc-helper/docs/features/approval-mode.md +3 -0
  13. package/bundled/qc-helper/docs/features/auto-mode.md +40 -0
  14. package/bundled/qc-helper/docs/features/channels/overview.md +81 -18
  15. package/bundled/qc-helper/docs/features/channels/plugins.md +1 -1
  16. package/bundled/qc-helper/docs/features/code-review.md +17 -61
  17. package/bundled/qc-helper/docs/features/commands.md +6 -6
  18. package/bundled/qc-helper/docs/features/hooks.md +6 -1
  19. package/bundled/qc-helper/docs/features/mcp.md +3 -1
  20. package/bundled/qc-helper/docs/features/memory.md +1 -1
  21. package/bundled/qc-helper/docs/features/scheduled-tasks.md +10 -0
  22. package/bundled/qc-helper/docs/features/status-line.md +3 -3
  23. package/bundled/qc-helper/docs/ide-integration/ide-integration.md +4 -4
  24. package/bundled/qc-helper/docs/qwen-serve.md +19 -0
  25. package/bundled/qc-helper/docs/support/troubleshooting.md +6 -0
  26. package/bundled/review/DESIGN.md +21 -26
  27. package/bundled/review/SKILL.md +45 -129
  28. package/chunks/MaxSizedBox-ERTNFI22.js +68 -0
  29. package/chunks/{StandaloneSessionPicker-Z52JTYST.js → StandaloneSessionPicker-Y5NGRLRY.js} +48 -42
  30. package/chunks/{acpAgent-7RZUOWOM.js → acpAgent-UMN6OYTR.js} +1319 -361
  31. package/chunks/{agent-4FG7WTHJ.js → agent-56DZU4ZU.js} +30 -25
  32. package/chunks/agent-headless-SR7N2IJG.js +61 -0
  33. package/chunks/{anthropicContentGenerator-PFITVL7Y.js → anthropicContentGenerator-5OZFO6WQ.js} +11 -8
  34. package/chunks/{artifact-tool-D2X7G3C3.js → artifact-tool-JVZMHA4B.js} +3 -3
  35. package/chunks/{askUserQuestion-UGETICJQ.js → askUserQuestion-CMJZ2F3D.js} +2 -2
  36. package/chunks/bridge-AUHNFOUS.js +72 -0
  37. package/chunks/{ca-IUFWESZL.js → ca-RYOETBUW.js} +9 -9
  38. package/chunks/channel-worker-supervisor-A74FV522.js +308 -0
  39. package/chunks/{chunk-T4T2FNV4.js → chunk-2X2JUE47.js} +2 -2
  40. package/chunks/{chunk-BX5YO7UW.js → chunk-4VZH35PN.js} +540 -370
  41. package/chunks/{chunk-M2U5NM24.js → chunk-54YZOP7P.js} +309 -72
  42. package/chunks/chunk-5P5XGNYH.js +93 -0
  43. package/chunks/{chunk-QWFNTRH4.js → chunk-6AQR7732.js} +1 -1
  44. package/chunks/{chunk-HZT4UCFB.js → chunk-6CIIP6OE.js} +4 -4
  45. package/chunks/{chunk-ADCIHOQZ.js → chunk-6TLY5W3B.js} +16 -8
  46. package/chunks/{chunk-BXSHL2SF.js → chunk-73H73ASU.js} +1 -1
  47. package/chunks/{chunk-3TV3HUWZ.js → chunk-75X2VLSH.js} +60 -30
  48. package/chunks/{chunk-6V4NZFUS.js → chunk-7KPI4LAI.js} +5 -5
  49. package/chunks/{chunk-PDE7CSDS.js → chunk-7VPC7D7O.js} +2 -2
  50. package/chunks/chunk-AHNXYU4O.js +24 -0
  51. package/chunks/{chunk-UX4SGCGN.js → chunk-AVQDCKNF.js} +96 -22
  52. package/chunks/{chunk-HYCC3XM3.js → chunk-B236XPGF.js} +1 -1
  53. package/chunks/{chunk-N4EJFBN5.js → chunk-B7KGXIPZ.js} +419 -262
  54. package/chunks/{chunk-YAINVQ3Q.js → chunk-BFG6OZN7.js} +17392 -16335
  55. package/chunks/{chunk-5DWXLGOM.js → chunk-BJBWRCSK.js} +1 -1
  56. package/chunks/{chunk-BTLJ2MF5.js → chunk-BNJLLAQ7.js} +3 -3
  57. package/chunks/{chunk-UYT3MWEB.js → chunk-BQNJBEUA.js} +16 -2
  58. package/chunks/{chunk-SKQZZVAV.js → chunk-BZHLWC6T.js} +2 -2
  59. package/chunks/{chunk-HPZTOP4I.js → chunk-C2IHHGBZ.js} +131 -21
  60. package/chunks/chunk-CG7SVARK.js +367 -0
  61. package/chunks/{chunk-CNLEDYE3.js → chunk-CS5XYDBO.js} +5 -5
  62. package/chunks/{chunk-O75BHFQW.js → chunk-CUGEBAKG.js} +2 -2
  63. package/chunks/{chunk-U3KSMM7G.js → chunk-D5KISTLW.js} +339 -383
  64. package/chunks/{chunk-STUWFKGD.js → chunk-DQ74W65K.js} +431 -535
  65. package/chunks/{chunk-VVLOGDB6.js → chunk-DX3TKXNT.js} +2 -2
  66. package/chunks/chunk-E5A7LHNN.js +51 -0
  67. package/chunks/{chunk-3PJXIDKI.js → chunk-E6US47KI.js} +3 -27
  68. package/chunks/chunk-EDAGQADF.js +21 -0
  69. package/chunks/{chunk-QBZ22PQX.js → chunk-EWALXUAD.js} +3 -1
  70. package/chunks/{chunk-4QK3O43S.js → chunk-FNLXLI4I.js} +4 -4
  71. package/chunks/{chunk-I2LYBGNI.js → chunk-FYKX6XOT.js} +1 -1
  72. package/chunks/{chunk-QLDPRILK.js → chunk-G7OQ3RFJ.js} +3 -3
  73. package/chunks/{chunk-R2BXK7SX.js → chunk-GHOTR7HL.js} +6 -1
  74. package/chunks/{chunk-L7OKCI7T.js → chunk-GICCHL2Q.js} +15 -1
  75. package/chunks/{chunk-KMGMKW5Q.js → chunk-GLPV75ES.js} +9 -3
  76. package/chunks/{chunk-LD2XBG6Z.js → chunk-GO6LNQXT.js} +1 -39
  77. package/chunks/chunk-HI55Z6PR.js +3523 -0
  78. package/chunks/{chunk-QNKBEJO2.js → chunk-HJDF3ZVU.js} +2776 -1289
  79. package/chunks/{chunk-JJXWTVSK.js → chunk-HRZB5CSC.js} +34 -1
  80. package/chunks/{chunk-I4H7PRWQ.js → chunk-HTWHAN44.js} +1 -1
  81. package/chunks/{chunk-EJYJYJZ2.js → chunk-IRJWHZWU.js} +3 -70
  82. package/chunks/{chunk-CKQA6AWF.js → chunk-J3F7X3LW.js} +1 -1
  83. package/chunks/{chunk-QI7GOGJR.js → chunk-KKQWC6WS.js} +1 -1
  84. package/chunks/{chunk-VBZ452JT.js → chunk-KVPFPC4J.js} +494 -114
  85. package/chunks/{chunk-NDOC6M5S.js → chunk-L7QPM2YD.js} +2 -2
  86. package/chunks/{chunk-SLNKLLEO.js → chunk-L7VH7HQA.js} +12 -8
  87. package/chunks/{chunk-BVSVIN45.js → chunk-LKWAVAB5.js} +3 -3
  88. package/chunks/{chunk-ZP6UKOPB.js → chunk-LWGLBVWA.js} +1 -1
  89. package/chunks/{chunk-SBBN4BWR.js → chunk-MEQWZGK5.js} +1 -1
  90. package/chunks/{chunk-FKAVULLM.js → chunk-MKHC4BYZ.js} +58 -10
  91. package/chunks/{chunk-UFLGERMB.js → chunk-MNDTD5E5.js} +178 -124
  92. package/chunks/{chunk-RD6YJJJ6.js → chunk-MOUXUCXQ.js} +1 -1
  93. package/chunks/{chunk-EDMZZFDU.js → chunk-MVZXZWGT.js} +905 -795
  94. package/chunks/chunk-MX2YXRER.js +44 -0
  95. package/chunks/{chunk-JVHEVCAU.js → chunk-ND25GXEU.js} +23 -6
  96. package/chunks/chunk-NIOPRZNN.js +27 -0
  97. package/chunks/{chunk-DDMOU62Q.js → chunk-NPQWQYU6.js} +1 -1
  98. package/chunks/{chunk-PR32FRT6.js → chunk-OAFUMTWW.js} +3 -3
  99. package/chunks/chunk-OJCECIJA.js +238 -0
  100. package/chunks/{chunk-GGBIN5K7.js → chunk-PIYV6COW.js} +1 -1
  101. package/chunks/{chunk-CF6BB3LT.js → chunk-PPFWEV7G.js} +10 -1
  102. package/chunks/{chunk-4LUZAKMK.js → chunk-Q7VHIRDD.js} +1 -1
  103. package/chunks/{chunk-ODLIHNOY.js → chunk-QAFQLTXG.js} +1 -1
  104. package/chunks/{chunk-Y6YMRS3U.js → chunk-QMIND2AS.js} +3 -3
  105. package/chunks/{chunk-XJYUPHRC.js → chunk-QOMAHFYI.js} +3 -3
  106. package/chunks/{chunk-J37FGIOA.js → chunk-QXPI7FEC.js} +38 -4
  107. package/chunks/chunk-RM3PGSGL.js +66 -0
  108. package/chunks/chunk-RNBYOUGV.js +42 -0
  109. package/chunks/chunk-S5EQPDTM.js +91 -0
  110. package/chunks/chunk-SEZC2725.js +36 -0
  111. package/chunks/{chunk-FNJ7BDPH.js → chunk-SFN4TEHY.js} +10 -7
  112. package/chunks/{chunk-O2VBQ3Y2.js → chunk-SJBIFVD2.js} +2 -2
  113. package/chunks/chunk-SYCJMSIJ.js +82 -0
  114. package/chunks/{chunk-JE5FVRPC.js → chunk-T22H4V4R.js} +48 -23
  115. package/chunks/{chunk-3227DZO4.js → chunk-T42ACHFI.js} +1 -1
  116. package/chunks/{chunk-UO5GVXQE.js → chunk-TENOUWY2.js} +3 -3
  117. package/chunks/{chunk-JOLIREYR.js → chunk-TOAUDIS7.js} +1 -1
  118. package/chunks/{chunk-J7FA27RO.js → chunk-TTFNVEO5.js} +3 -3
  119. package/chunks/{chunk-S7AKE7HL.js → chunk-UANCYOOQ.js} +63 -9
  120. package/chunks/{chunk-BUUQ5HPX.js → chunk-UQFP2FEF.js} +1 -1
  121. package/chunks/{chunk-R5OP2ATH.js → chunk-UQYOMM6J.js} +11 -11
  122. package/chunks/{chunk-J33ZR6OJ.js → chunk-UT5JU5DJ.js} +16 -16
  123. package/chunks/{chunk-QE6KJYLT.js → chunk-VKGG724L.js} +122 -25
  124. package/chunks/{chunk-SMXULRAN.js → chunk-VXGPYF7U.js} +1 -1
  125. package/chunks/{chunk-MNF6S5PR.js → chunk-W2ZOAX7F.js} +4 -4
  126. package/chunks/{chunk-GT2FGICD.js → chunk-W6X4FGWX.js} +1 -1
  127. package/chunks/{chunk-SMYQZVZ3.js → chunk-XCUFHOAD.js} +1 -1
  128. package/chunks/{chunk-K5XU6E4T.js → chunk-XKSCTXPK.js} +2 -2
  129. package/chunks/{chunk-FXKVLFFY.js → chunk-YBDZ63KI.js} +3 -3
  130. package/chunks/{chunk-BKXBARJZ.js → chunk-YPCPZSZB.js} +1 -1
  131. package/chunks/chunk-YTFBURQD.js +313 -0
  132. package/chunks/{chunk-NL4C3H6C.js → chunk-YXK4GPYO.js} +1 -1
  133. package/chunks/{chunk-F3ZYSEY6.js → chunk-ZJP5T7IA.js} +3 -3
  134. package/chunks/{chunk-RYLJU2DY.js → chunk-ZN5T4BHI.js} +1 -1
  135. package/chunks/{chunk-RRFZXMYP.js → chunk-ZXCVPMIK.js} +553 -138
  136. package/chunks/{computer-use-JGB36FDW.js → computer-use-VWN5HH6A.js} +33 -28
  137. package/chunks/contextCommand-DFFG5KDJ.js +66 -0
  138. package/chunks/{cron-create-SKEY55RG.js → cron-create-CSSWJ67I.js} +4 -4
  139. package/chunks/{cron-delete-I3NAT32Z.js → cron-delete-E56CFQ7A.js} +4 -4
  140. package/chunks/{cron-list-6XRRL6TH.js → cron-list-BKSINY6Y.js} +4 -4
  141. package/chunks/daemon-5T6IHWJV.js +8430 -0
  142. package/chunks/daemon-status-provider-V5UY7O7J.js +70 -0
  143. package/chunks/{de-EOW5PVHF.js → de-HB5NJXGB.js} +9 -9
  144. package/chunks/{dist-NHEYYB2B.js → dist-2HDL5SHQ.js} +2 -2
  145. package/chunks/{dist-663NZ6MI.js → dist-B7SSDVWT.js} +116 -11
  146. package/chunks/{dist-PQPZ5Q4N.js → dist-BL3SL665.js} +20 -9
  147. package/chunks/{dist-J37VXPLD.js → dist-TAVAGZU6.js} +40 -15
  148. package/chunks/{dist-LB6OGPVM.js → dist-XBOVZ3R5.js} +26 -5
  149. package/chunks/{earlyInputCapture-44RISVVJ.js → earlyInputCapture-VVYU4FDO.js} +31 -26
  150. package/chunks/{edit-NN6GM5DT.js → edit-F35PTMBA.js} +35 -29
  151. package/chunks/{en-HPWEJBTR.js → en-FZREZFPO.js} +30 -10
  152. package/chunks/{enter-worktree-PB3O2C7D.js → enter-worktree-3DIW7EGJ.js} +30 -25
  153. package/chunks/{enterPlanMode-YQFNNSUA.js → enterPlanMode-QNXT77KP.js} +40 -25
  154. package/chunks/{errors-LS7XU5DZ.js → errors-M53YG76R.js} +32 -27
  155. package/chunks/{exit-worktree-E2FTNSBK.js → exit-worktree-BSDWNWHZ.js} +30 -25
  156. package/chunks/{exitPlanMode-GLYK2BUB.js → exitPlanMode-EL7AY327.js} +54 -33
  157. package/chunks/{fast-path-WQ6M7LI7.js → fast-path-DUCSMUFW.js} +30 -13
  158. package/chunks/{fast-path-settings-OAGU3X5H.js → fast-path-settings-UQLRFDQP.js} +2 -2
  159. package/chunks/{fr-BN5NKSAC.js → fr-XY3NQFCM.js} +9 -9
  160. package/chunks/{gemini-2YFLVA2M.js → gemini-F3IERB37.js} +80 -67
  161. package/chunks/{geminiContentGenerator-XV6SV6CD.js → geminiContentGenerator-6OULAKFQ.js} +4 -4
  162. package/chunks/{glob-2H6CDDMK.js → glob-ZMLFTD4T.js} +30 -25
  163. package/chunks/{grep-VXIUXM3C.js → grep-H5X66EI7.js} +30 -25
  164. package/chunks/initializer-LEOT2OLH.js +66 -0
  165. package/chunks/{ja-7DEUB2TS.js → ja-J7YAG7SA.js} +9 -9
  166. package/chunks/{keychain-token-storage-YLMDLKXT.js → keychain-token-storage-GPAKRDKQ.js} +2 -2
  167. package/chunks/list-M3DKXML6.js +70 -0
  168. package/chunks/loadedSettingsAdapter-OKMQFGGG.js +65 -0
  169. package/chunks/{loop-wakeup-CITGGQHA.js → loop-wakeup-FPBAVVPR.js} +5 -5
  170. package/chunks/{ls-R5WP4BGZ.js → ls-UGWQXPTY.js} +4 -4
  171. package/chunks/{lsp-GSICJMMW.js → lsp-24WV7NXB.js} +2 -2
  172. package/chunks/{monitor-HKLRS2HQ.js → monitor-ARL5P45R.js} +32 -26
  173. package/chunks/nonInteractiveCli-NUVLF3YR.js +108 -0
  174. package/chunks/{notebook-edit-Y6SKSGTT.js → notebook-edit-ANTZ2DDY.js} +31 -26
  175. package/chunks/{openaiContentGenerator-J7G2FYJT.js → openaiContentGenerator-TFGMKGHN.js} +15 -13
  176. package/chunks/pidfile-AWTL4C63.js +72 -0
  177. package/chunks/{pt-TNZRNLQB.js → pt-6RTAA6SS.js} +9 -9
  178. package/chunks/{qwenContentGenerator-5XIEM5GV.js → qwenContentGenerator-6QWAYTWS.js} +32 -27
  179. package/chunks/{qwenOAuth2-AG3PFFLZ.js → qwenOAuth2-LWLA6MQG.js} +5 -4
  180. package/chunks/{read-file-J7D552ZJ.js → read-file-EJY73XQ3.js} +11 -10
  181. package/chunks/{read-mcp-resource-DQQW7H7T.js → read-mcp-resource-NCBTPP7X.js} +2 -2
  182. package/chunks/ripGrep-HC4SA6CQ.js +59 -0
  183. package/chunks/{ru-NIAUBKCN.js → ru-AUBGJ2C4.js} +9 -9
  184. package/chunks/{run-qwen-serve-SGEEVMXD.js → run-qwen-serve-AGLZ642J.js} +454 -94
  185. package/chunks/{scheduler-7CQI3S4Q.js → scheduler-TURO7NGY.js} +30 -25
  186. package/chunks/{send-message-EE4TWKVU.js → send-message-3S2NYS3O.js} +6 -4
  187. package/chunks/serve-5DAMOIDW.js +70 -0
  188. package/chunks/{server-4QMUWXPW.js → server-4AGEK2HC.js} +4098 -1173
  189. package/chunks/{session-NRO7UFOY.js → session-7ZOQUC4Y.js} +204 -64
  190. package/chunks/{settings-SGWRDQSC.js → settings-DR4V6L5Y.js} +34 -29
  191. package/chunks/{shell-62ANGIHL.js → shell-H5WFKUXH.js} +30 -25
  192. package/chunks/{skill-VWAQAWW6.js → skill-ANHU5ZCR.js} +13 -12
  193. package/chunks/spawnChannel-VN5LJV7Z.js +68 -0
  194. package/chunks/{src-KUV5J5Q2.js → src-OVZLTVVM.js} +114 -30
  195. package/chunks/{startInteractiveUI-6EYJN3JV.js → startInteractiveUI-OA22V32P.js} +15970 -15430
  196. package/chunks/{syntheticOutput-T5YHQ6S2.js → syntheticOutput-SV7GBHZ5.js} +3 -3
  197. package/chunks/{task-create-BLY7RHXX.js → task-create-W2H2UJCH.js} +8 -7
  198. package/chunks/{task-list-3QUYNVYR.js → task-list-THBOPV4G.js} +7 -6
  199. package/chunks/{task-stop-U4RATK2V.js → task-stop-33FVCNCJ.js} +2 -2
  200. package/chunks/{task-update-U54O7KJX.js → task-update-LVFQLXEI.js} +8 -7
  201. package/chunks/{team-create-LPOGCPM7.js → team-create-OYL5CAQO.js} +30 -25
  202. package/chunks/{team-delete-LKBYPASD.js → team-delete-NTUQ25UY.js} +7 -6
  203. package/chunks/theme-manager-XCMPF2SI.js +63 -0
  204. package/chunks/{todoWrite-OYXKTVYN.js → todoWrite-SEPO2RI3.js} +4 -4
  205. package/chunks/{tool-search-YPUFJ3ZQ.js → tool-search-YXW55X6Z.js} +36 -11
  206. package/chunks/{trustedFolders-5B24TMEA.js → trustedFolders-TEPGM5YL.js} +31 -26
  207. package/chunks/{validateNonInterActiveAuth-BTDTYOVT.js → validateNonInterActiveAuth-OQIS7WUE.js} +65 -55
  208. package/chunks/{web-fetch-EEB5LZYU.js → web-fetch-OE7LHURA.js} +5 -4
  209. package/chunks/{workflow-LAWIW5LI.js → workflow-RTUWORAP.js} +67 -39
  210. package/chunks/workspace-providers-status-DM2XANVB.js +67 -0
  211. package/chunks/workspace-service-VKBI2KZD.js +77 -0
  212. package/chunks/{write-file-PCV226DJ.js → write-file-WGALQ53L.js} +35 -30
  213. package/chunks/{zh-TW-TR3XYGE5.js → zh-TW-6GIKXEAN.js} +30 -10
  214. package/chunks/{zh-5EUYXASN.js → zh-V3B4TFWL.js} +30 -10
  215. package/cli.js +6 -6
  216. package/locales/ca.js +13 -13
  217. package/locales/de.js +13 -13
  218. package/locales/en.js +49 -15
  219. package/locales/fr.js +13 -14
  220. package/locales/ja.js +13 -14
  221. package/locales/pt.js +13 -13
  222. package/locales/ru.js +13 -13
  223. package/locales/zh-TW.js +47 -14
  224. package/locales/zh.js +47 -14
  225. package/node_modules/@qwen-code/audio-capture/package.json +1 -1
  226. package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-arm64/@qwen-code+audio-capture.node +0 -0
  227. package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-x64/@qwen-code+audio-capture.node +0 -0
  228. package/node_modules/@qwen-code/audio-capture/prebuilds/win32-x64/@qwen-code+audio-capture.node +0 -0
  229. package/package.json +15 -6
  230. package/patches/chrome-devtools-mcp+1.4.0.patch +31 -0
  231. package/postinstall.js +50 -0
  232. package/web-shell/assets/{arc-DA7r8Ueo.js → arc-Det5Ccum.js} +1 -1
  233. package/web-shell/assets/{architectureDiagram-3BPJPVTR-ZDUxPtZ2.js → architectureDiagram-3BPJPVTR-DqNWVFpl.js} +1 -1
  234. package/web-shell/assets/{blockDiagram-GPEHLZMM-vrtOf1kJ.js → blockDiagram-GPEHLZMM-CYl7tYBi.js} +1 -1
  235. package/web-shell/assets/{c4Diagram-AAUBKEIU-BHFjzIi4.js → c4Diagram-AAUBKEIU-DaAEi0NQ.js} +1 -1
  236. package/web-shell/assets/channel-Bm0bFauD.js +1 -0
  237. package/web-shell/assets/{chunk-2J33WTMH-mdeQVz59.js → chunk-2J33WTMH-Df2CDEE2.js} +1 -1
  238. package/web-shell/assets/{chunk-4BX2VUAB-BkKMlwBX.js → chunk-4BX2VUAB-DNBFcyL2.js} +1 -1
  239. package/web-shell/assets/{chunk-55IACEB6-B7bnXNfu.js → chunk-55IACEB6-BKjF-0HI.js} +1 -1
  240. package/web-shell/assets/{chunk-727SXJPM-DGz8Mm6i.js → chunk-727SXJPM-DYwAwfIM.js} +1 -1
  241. package/web-shell/assets/{chunk-AQP2D5EJ-BQAydUNk.js → chunk-AQP2D5EJ-C6FswLqy.js} +1 -1
  242. package/web-shell/assets/{chunk-FMBD7UC4-GHr2LN_p.js → chunk-FMBD7UC4-DRWAcZSY.js} +1 -1
  243. package/web-shell/assets/{chunk-ND2GUHAM-7R91lnUx.js → chunk-ND2GUHAM-AoL16mNR.js} +1 -1
  244. package/web-shell/assets/{chunk-QZHKN3VN-aTJD3lSQ.js → chunk-QZHKN3VN-a8PtLMck.js} +1 -1
  245. package/web-shell/assets/classDiagram-4FO5ZUOK--NgUfb55.js +1 -0
  246. package/web-shell/assets/classDiagram-v2-Q7XG4LA2--NgUfb55.js +1 -0
  247. package/web-shell/assets/{cose-bilkent-S5V4N54A-BTf8t1RL.js → cose-bilkent-S5V4N54A-C4Aeu5qf.js} +1 -1
  248. package/web-shell/assets/{dagre-BM42HDAG-_sgp3WuA.js → dagre-BM42HDAG-BOulamjo.js} +1 -1
  249. package/web-shell/assets/{diagram-2AECGRRQ-CROtRy1w.js → diagram-2AECGRRQ-D1wt2ykO.js} +1 -1
  250. package/web-shell/assets/{diagram-5GNKFQAL-BqGRzwSc.js → diagram-5GNKFQAL-BRseus-O.js} +1 -1
  251. package/web-shell/assets/{diagram-KO2AKTUF-CMrcEtA7.js → diagram-KO2AKTUF-XSMkNzpZ.js} +1 -1
  252. package/web-shell/assets/{diagram-LMA3HP47-BRydGNW5.js → diagram-LMA3HP47-21KNLqoi.js} +1 -1
  253. package/web-shell/assets/{diagram-OG6HWLK6-D0ilgNjV.js → diagram-OG6HWLK6-DnUI8F5G.js} +1 -1
  254. package/web-shell/assets/{erDiagram-TEJ5UH35-2lnQeJUM.js → erDiagram-TEJ5UH35-BVSOMuM2.js} +1 -1
  255. package/web-shell/assets/{flowDiagram-I6XJVG4X-C_ZMdQiC.js → flowDiagram-I6XJVG4X-fYtDPJsW.js} +1 -1
  256. package/web-shell/assets/{ganttDiagram-6RSMTGT7-Dw9V_Ny0.js → ganttDiagram-6RSMTGT7-CmRXosW_.js} +1 -1
  257. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-HDXI-F1B.js → gitGraphDiagram-PVQCEYII-DPrmySxO.js} +1 -1
  258. package/web-shell/assets/index-BpKnmyFV.js +717 -0
  259. package/web-shell/assets/index-fLrtxpOG.css +5 -0
  260. package/web-shell/assets/{infoDiagram-5YYISTIA-CuB8Ebua.js → infoDiagram-5YYISTIA-x3VbEuCV.js} +1 -1
  261. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-D_tyhVwh.js → ishikawaDiagram-YF4QCWOH-SmitHRMC.js} +1 -1
  262. package/web-shell/assets/{journeyDiagram-JHISSGLW-CgCwJQNU.js → journeyDiagram-JHISSGLW-BxvA551S.js} +1 -1
  263. package/web-shell/assets/{kanban-definition-UN3LZRKU-PZUtcbPx.js → kanban-definition-UN3LZRKU-DNHC16jY.js} +1 -1
  264. package/web-shell/assets/{linear-CZqRdJIU.js → linear-CQ6irBL9.js} +1 -1
  265. package/web-shell/assets/{mermaid.core-CPW_4UEF.js → mermaid.core-DtB6NO1e.js} +72 -72
  266. package/web-shell/assets/{mindmap-definition-RKZ34NQL-D_Y75ID7.js → mindmap-definition-RKZ34NQL-QKMAgV2v.js} +1 -1
  267. package/web-shell/assets/{pieDiagram-4H26LBE5-Q4dTyLeF.js → pieDiagram-4H26LBE5-bvb6dGn6.js} +1 -1
  268. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-ckw329Ft.js → quadrantDiagram-W4KKPZXB-DLgdlG4D.js} +1 -1
  269. package/web-shell/assets/{requirementDiagram-4Y6WPE33-DbVDm4It.js → requirementDiagram-4Y6WPE33-2M9YH4GF.js} +1 -1
  270. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-CHuZ_ecH.js → sankeyDiagram-5OEKKPKP-DzwfclTH.js} +1 -1
  271. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-DU2YSpq-.js → sequenceDiagram-3UESZ5HK-BvPmTuy2.js} +1 -1
  272. package/web-shell/assets/{stateDiagram-AJRCARHV-CA9PEBUo.js → stateDiagram-AJRCARHV-BjwUmrJF.js} +1 -1
  273. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-C4L8zXeL.js +1 -0
  274. package/web-shell/assets/{timeline-definition-PNZ67QCA-Bhlo4WVc.js → timeline-definition-PNZ67QCA-CXzS6qqz.js} +1 -1
  275. package/web-shell/assets/{vennDiagram-CIIHVFJN-6xtPLsyl.js → vennDiagram-CIIHVFJN-yRSolF5B.js} +1 -1
  276. package/web-shell/assets/{wardley-L42UT6IY-3eozmXPf.js → wardley-L42UT6IY-ClLJjHPG.js} +1 -1
  277. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-BOn6hKss.js → wardleyDiagram-YWT4CUSO-VIa6t2p2.js} +1 -1
  278. package/web-shell/assets/{xychartDiagram-2RQKCTM6-BsP4-I_y.js → xychartDiagram-2RQKCTM6-CtmrkezW.js} +1 -1
  279. package/web-shell/index.html +18 -2
  280. package/chunks/MaxSizedBox-QNF3EIGU.js +0 -63
  281. package/chunks/agent-headless-RQ5BTX3G.js +0 -56
  282. package/chunks/bridge-JL2PMCIW.js +0 -66
  283. package/chunks/chunk-5GOVVXEV.js +0 -73
  284. package/chunks/chunk-BC3C4F3Q.js +0 -40
  285. package/chunks/chunk-BW4KCQFD.js +0 -1103
  286. package/chunks/chunk-RKIZXJMB.js +0 -13
  287. package/chunks/contextCommand-WYU6OQ2F.js +0 -61
  288. package/chunks/daemon-status-provider-HH2EC5FI.js +0 -65
  289. package/chunks/headlessSafetyWarnings-TBE35GJ4.js +0 -55
  290. package/chunks/initializer-2Y7SLOKV.js +0 -61
  291. package/chunks/list-ZAFHZ7OS.js +0 -65
  292. package/chunks/loadedSettingsAdapter-6KJXD6M3.js +0 -60
  293. package/chunks/nonInteractiveCli-5W4GIZQM.js +0 -96
  294. package/chunks/ripGrep-IEIFIWP4.js +0 -54
  295. package/chunks/serve-V6GVZR6U.js +0 -65
  296. package/chunks/spawnChannel-3VHW5EPY.js +0 -63
  297. package/chunks/theme-manager-LYLGAERF.js +0 -58
  298. package/chunks/workspace-providers-status-PIAFVYHA.js +0 -62
  299. package/chunks/workspace-service-YAIOD4HG.js +0 -71
  300. package/web-shell/assets/channel-iRo68q4Q.js +0 -1
  301. package/web-shell/assets/classDiagram-4FO5ZUOK-iHF24a8X.js +0 -1
  302. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-iHF24a8X.js +0 -1
  303. package/web-shell/assets/index-CHmzAWys.css +0 -5
  304. package/web-shell/assets/index-w6GTOHh1.js +0 -713
  305. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-t1LRI0oY.js +0 -1
@@ -2,13 +2,13 @@
2
2
  "use strict";
3
3
  import {
4
4
  require_undici
5
- } from "./chunk-M2U5NM24.js";
5
+ } from "./chunk-54YZOP7P.js";
6
6
  import {
7
7
  writeStderrLine
8
8
  } from "./chunk-Y6Z2O3WR.js";
9
9
  import {
10
10
  createDebugLogger
11
- } from "./chunk-UX4SGCGN.js";
11
+ } from "./chunk-AVQDCKNF.js";
12
12
  import {
13
13
  init_esbuild_shims
14
14
  } from "./chunk-A4BMJM77.js";
@@ -6,20 +6,20 @@ import {
6
6
  parseAcpBaseModelId,
7
7
  resolveCliGenerationConfig,
8
8
  sanitizeProviderBaseUrl
9
- } from "./chunk-UYT3MWEB.js";
10
- import {
11
- loadSettings
12
- } from "./chunk-FKAVULLM.js";
9
+ } from "./chunk-BQNJBEUA.js";
13
10
  import {
14
11
  STATUS_SCHEMA_VERSION
15
- } from "./chunk-L7OKCI7T.js";
12
+ } from "./chunk-GICCHL2Q.js";
13
+ import {
14
+ loadSettings
15
+ } from "./chunk-MKHC4BYZ.js";
16
16
  import {
17
17
  ModelsConfig,
18
18
  resolveProviderProtocol
19
- } from "./chunk-YAINVQ3Q.js";
19
+ } from "./chunk-BFG6OZN7.js";
20
20
  import {
21
21
  tokenLimit
22
- } from "./chunk-U3KSMM7G.js";
22
+ } from "./chunk-YTFBURQD.js";
23
23
  import {
24
24
  init_esbuild_shims
25
25
  } from "./chunk-A4BMJM77.js";
@@ -70,7 +70,7 @@ function buildWorkspaceProvidersStatus(workspaceCwd, acpChannelLive, options) {
70
70
  settings.modelProviders,
71
71
  settings.providerProtocol
72
72
  );
73
- for (const model of modelsConfig.getAllConfiguredModels()) {
73
+ for (const model of modelsConfig.getAllConfiguredModels().filter(isMainSelectableModel)) {
74
74
  if (model.isRuntimeModel) continue;
75
75
  const authType = String(model.authType);
76
76
  let provider = providers.get(authType);
@@ -149,6 +149,10 @@ function buildWorkspaceProvidersStatus(workspaceCwd, acpChannelLive, options) {
149
149
  }
150
150
  }
151
151
  __name(buildWorkspaceProvidersStatus, "buildWorkspaceProvidersStatus");
152
+ function isMainSelectableModel(model) {
153
+ return model.fastOnly !== true && model.voiceOnly !== true;
154
+ }
155
+ __name(isMainSelectableModel, "isMainSelectableModel");
152
156
  function matchesCurrentModel(currentModelId, baseModelId, acpModelId) {
153
157
  return currentModelId === baseModelId || currentModelId === acpModelId;
154
158
  }
@@ -7,14 +7,14 @@ import {
7
7
  TEAMMATE_COLORS,
8
8
  TEAMS_DIR,
9
9
  TEAM_CONFIG_FILENAME
10
- } from "./chunk-LD2XBG6Z.js";
10
+ } from "./chunk-E5A7LHNN.js";
11
11
  import {
12
12
  atomicWriteJSON
13
- } from "./chunk-3227DZO4.js";
13
+ } from "./chunk-T42ACHFI.js";
14
14
  import {
15
15
  Storage,
16
16
  isNodeError
17
- } from "./chunk-UX4SGCGN.js";
17
+ } from "./chunk-AVQDCKNF.js";
18
18
  import {
19
19
  init_esbuild_shims
20
20
  } from "./chunk-A4BMJM77.js";
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
  import {
4
4
  createDebugLogger
5
- } from "./chunk-UX4SGCGN.js";
5
+ } from "./chunk-AVQDCKNF.js";
6
6
  import {
7
7
  init_esbuild_shims
8
8
  } from "./chunk-A4BMJM77.js";
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-OFEVLU4C.js";
6
6
  import {
7
7
  SchemaValidator
8
- } from "./chunk-BX5YO7UW.js";
8
+ } from "./chunk-4VZH35PN.js";
9
9
  import {
10
10
  init_esbuild_shims
11
11
  } from "./chunk-A4BMJM77.js";
@@ -6,7 +6,7 @@ import {
6
6
  getLanguageNameFromLocale,
7
7
  getLanguageSettingsOptions,
8
8
  t
9
- } from "./chunk-R5OP2ATH.js";
9
+ } from "./chunk-UQYOMM6J.js";
10
10
  import {
11
11
  DEFAULT_DARK_THEME_NAME,
12
12
  DEFAULT_LIGHT_THEME_NAME
@@ -25,11 +25,11 @@ import {
25
25
  getSystemDefaultsPath,
26
26
  getSystemSettingsPath,
27
27
  resolveEnvVarsInObject
28
- } from "./chunk-CF6BB3LT.js";
28
+ } from "./chunk-PPFWEV7G.js";
29
29
  import {
30
30
  isWorkspaceTrusted,
31
31
  updateSettingsFilePreservingFormat
32
- } from "./chunk-F3ZYSEY6.js";
32
+ } from "./chunk-ZJP5T7IA.js";
33
33
  import {
34
34
  require_strip_json_comments
35
35
  } from "./chunk-QYUE6W3T.js";
@@ -40,24 +40,24 @@ import {
40
40
  DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES,
41
41
  DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD,
42
42
  stripRuntimeSnapshotPrefix
43
- } from "./chunk-YAINVQ3Q.js";
43
+ } from "./chunk-BFG6OZN7.js";
44
44
  import {
45
45
  require_main
46
46
  } from "./chunk-SKAZWEV5.js";
47
47
  import {
48
48
  DEFAULT_QWEN_CUSTOM_IGNORE_FILE_NAMES
49
- } from "./chunk-JOLIREYR.js";
49
+ } from "./chunk-TOAUDIS7.js";
50
50
  import {
51
51
  DEFAULT_SENSITIVE_SPAN_ATTRIBUTE_MAX_LENGTH,
52
52
  SENSITIVE_SPAN_ATTRIBUTE_MAX_LENGTH_LIMIT
53
- } from "./chunk-QNKBEJO2.js";
53
+ } from "./chunk-HJDF3ZVU.js";
54
54
  import {
55
55
  FatalConfigError,
56
56
  QWEN_DIR,
57
57
  Storage,
58
58
  createDebugLogger,
59
59
  getErrorMessage
60
- } from "./chunk-UX4SGCGN.js";
60
+ } from "./chunk-AVQDCKNF.js";
61
61
  import {
62
62
  init_esbuild_shims
63
63
  } from "./chunk-A4BMJM77.js";
@@ -689,6 +689,15 @@ var SETTINGS_SCHEMA = {
689
689
  default: false,
690
690
  description: "Whether to collapse history by default when resuming a session.",
691
691
  showInDialog: false
692
+ },
693
+ collapsePreviewCount: {
694
+ type: "number",
695
+ label: "Collapse Preview Count",
696
+ category: "UI",
697
+ requiresRestart: false,
698
+ default: 0,
699
+ description: "Number of most recent user turns to keep visible when collapsing history on resume. 0 collapses all restored history by default; -1 shows all restored history.",
700
+ showInDialog: false
692
701
  }
693
702
  }
694
703
  },
@@ -848,7 +857,7 @@ var SETTINGS_SCHEMA = {
848
857
  category: "UI",
849
858
  requiresRestart: false,
850
859
  default: false,
851
- description: "Render conversation history in an in-app scrollable viewport instead of the terminal scrollback buffer. Recommended if you see flicker, scroll-storm, or interface freeze on long sessions, after Ctrl+O, after Ctrl+E / Ctrl+F (expand), after window resize, or when alt-tabbing back. Scroll with Shift+\u2191/\u2193 (line), PgUp/PgDn (page), Ctrl+Home/End (top/bottom), or the mouse wheel. Does NOT use the host terminal scrollback while enabled; for native text selection, hold Shift (or Option on macOS) while dragging.",
860
+ description: "Render conversation history in an in-app scrollable viewport instead of the terminal scrollback buffer. Recommended if you see flicker, scroll-storm, or interface freeze on long sessions, after Ctrl+O, after Ctrl+E / Ctrl+F (expand), after window resize, or when alt-tabbing back. Scroll with Shift+\u2191/\u2193 (line), PgUp/PgDn (page), Ctrl+Home/End (top/bottom), or the mouse wheel. Also enables mouse interactions: click an option in a menu/dialog to select it, hover to highlight it, and click in the prompt to position the cursor. Does NOT use the host terminal scrollback while enabled; for native text selection, hold Shift (or Option on macOS) while dragging.",
852
861
  showInDialog: true
853
862
  },
854
863
  shellOutputMaxLines: {
@@ -1472,6 +1481,20 @@ var SETTINGS_SCHEMA = {
1472
1481
  showInDialog: true
1473
1482
  }
1474
1483
  }
1484
+ },
1485
+ autoCompactThreshold: {
1486
+ type: "number",
1487
+ label: "Auto-Compact Threshold",
1488
+ category: "Context",
1489
+ requiresRestart: false,
1490
+ default: void 0,
1491
+ description: "Fraction of context window at which auto-compaction triggers (greater than 0, up to 1). Default is 0.7 (70%).",
1492
+ showInDialog: false,
1493
+ jsonSchemaOverride: {
1494
+ type: "number",
1495
+ minimum: 0.01,
1496
+ maximum: 1
1497
+ }
1475
1498
  }
1476
1499
  }
1477
1500
  },
@@ -1750,6 +1773,15 @@ var SETTINGS_SCHEMA = {
1750
1773
  description: "Environment / context lines injected into the classifier system prompt.",
1751
1774
  showInDialog: false,
1752
1775
  mergeStrategy: "union" /* UNION */
1776
+ },
1777
+ classifyAllShell: {
1778
+ type: "boolean",
1779
+ label: "Classify All Shell Commands",
1780
+ category: "Tools",
1781
+ requiresRestart: true,
1782
+ default: false,
1783
+ description: "Route ALL shell commands through the auto-mode classifier, including read-only commands that would otherwise be auto-approved. Provides defense-in-depth for production environments.",
1784
+ showInDialog: false
1753
1785
  }
1754
1786
  }
1755
1787
  }
@@ -2085,7 +2117,7 @@ var SETTINGS_SCHEMA = {
2085
2117
  // restart-required.
2086
2118
  requiresRestart: false,
2087
2119
  default: void 0,
2088
- description: "A list of MCP servers to allow.",
2120
+ description: 'A list of MCP servers to allow. Supports glob patterns (e.g. "*puppeteer*").',
2089
2121
  showInDialog: false,
2090
2122
  mergeStrategy: "concat" /* CONCAT */
2091
2123
  },
@@ -2098,9 +2130,20 @@ var SETTINGS_SCHEMA = {
2098
2130
  // restart-required.
2099
2131
  requiresRestart: false,
2100
2132
  default: void 0,
2101
- description: "A list of MCP servers to exclude.",
2133
+ description: 'A list of MCP servers to exclude. Supports glob patterns (e.g. "*puppeteer*"). Takes precedence over mcp.allowed.',
2102
2134
  showInDialog: false,
2103
2135
  mergeStrategy: "concat" /* CONCAT */
2136
+ },
2137
+ toolIdleTimeoutMs: {
2138
+ type: "number",
2139
+ label: "MCP Tool Idle Timeout (ms)",
2140
+ category: "MCP",
2141
+ requiresRestart: false,
2142
+ default: 3e5,
2143
+ minimum: 1e4,
2144
+ maximum: 36e5,
2145
+ description: "Idle timeout in milliseconds for MCP tool calls. If the MCP server does not produce any response or progress update within this time, the call is aborted. Default: 300000 (5 minutes). Can be overridden via QWEN_CODE_MCP_TOOL_IDLE_TIMEOUT_MS environment variable.",
2146
+ showInDialog: false
2104
2147
  }
2105
2148
  }
2106
2149
  },
@@ -2955,6 +2998,10 @@ function getEffectiveValue(key, settings, mergedSettings) {
2955
2998
  return definition.default;
2956
2999
  }
2957
3000
  __name(getEffectiveValue, "getEffectiveValue");
3001
+ function getAllSettingKeys() {
3002
+ return Object.keys(getFlattenedSchema());
3003
+ }
3004
+ __name(getAllSettingKeys, "getAllSettingKeys");
2958
3005
  var SETTINGS_DIALOG_ORDER = [
2959
3006
  // Workflow Control - most impactful setting
2960
3007
  "tools.approvalMode",
@@ -4859,6 +4906,7 @@ export {
4859
4906
  getNestedValue,
4860
4907
  getNestedProperty,
4861
4908
  getEffectiveValue,
4909
+ getAllSettingKeys,
4862
4910
  validateSettingValue,
4863
4911
  getDialogSettingKeys,
4864
4912
  settingExistsInScope,
@@ -1,27 +1,28 @@
1
1
  // Force strict mode and setup for ESM
2
2
  "use strict";
3
3
  import {
4
- Colors
5
- } from "./chunk-5GOVVXEV.js";
4
+ Colors,
5
+ RowMouseController
6
+ } from "./chunk-CG7SVARK.js";
6
7
  import {
7
8
  theme
8
- } from "./chunk-SMXULRAN.js";
9
+ } from "./chunk-VXGPYF7U.js";
9
10
  import {
10
11
  Box_default,
11
12
  Text,
12
13
  require_jsx_runtime
13
- } from "./chunk-T4T2FNV4.js";
14
+ } from "./chunk-2X2JUE47.js";
14
15
  import {
15
16
  require_react
16
17
  } from "./chunk-KYMBIKIW.js";
17
18
  import {
18
19
  t
19
- } from "./chunk-R5OP2ATH.js";
20
+ } from "./chunk-UQYOMM6J.js";
20
21
  import {
21
22
  readManyFiles,
22
23
  shouldRunVisionBridge,
23
24
  stripTerminalControlSequences
24
- } from "./chunk-YAINVQ3Q.js";
25
+ } from "./chunk-BFG6OZN7.js";
25
26
  import {
26
27
  emptyMcpResourceText,
27
28
  formatMcpResourceContents,
@@ -33,7 +34,7 @@ import {
33
34
  isNodeError,
34
35
  isSubpath,
35
36
  unescapePath
36
- } from "./chunk-UX4SGCGN.js";
37
+ } from "./chunk-AVQDCKNF.js";
37
38
  import {
38
39
  init_esbuild_shims
39
40
  } from "./chunk-A4BMJM77.js";
@@ -44,7 +45,7 @@ import {
44
45
 
45
46
  // packages/cli/src/ui/hooks/atCommandProcessor.ts
46
47
  init_esbuild_shims();
47
- import * as fs from "node:fs/promises";
48
+ import * as fs2 from "node:fs/promises";
48
49
  import * as path from "node:path";
49
50
 
50
51
  // packages/cli/src/ui/hooks/mcpResourceRef.ts
@@ -70,6 +71,7 @@ init_esbuild_shims();
70
71
 
71
72
  // packages/cli/src/ui/components/SuggestionsDisplay.tsx
72
73
  init_esbuild_shims();
74
+ var import_react2 = __toESM(require_react(), 1);
73
75
 
74
76
  // packages/cli/src/ui/components/PrepareLabel.tsx
75
77
  init_esbuild_shims();
@@ -158,8 +160,13 @@ function SuggestionsDisplay({
158
160
  scrollOffset,
159
161
  userInput,
160
162
  mode,
161
- expandedIndex
163
+ expandedIndex,
164
+ onHoverIndex,
165
+ onSelectIndex,
166
+ mouseEnabled
162
167
  }) {
168
+ const containerRef = (0, import_react2.useRef)(null);
169
+ const itemRefs = (0, import_react2.useRef)([]);
163
170
  if (isLoading) {
164
171
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Box_default, { width, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { color: "gray", children: t("Loading suggestions...") }) });
165
172
  }
@@ -182,7 +189,17 @@ function SuggestionsDisplay({
182
189
  Math.max(...describedLabelLengths),
183
190
  Math.max(contentWidth - MIN_DESCRIPTION_WIDTH - 2, 1)
184
191
  ) : 0;
185
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Box_default, { flexDirection: "column", width, children: [
192
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Box_default, { flexDirection: "column", width, ref: containerRef, children: [
193
+ mouseEnabled && onHoverIndex && onSelectIndex && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
194
+ RowMouseController,
195
+ {
196
+ containerRef,
197
+ itemRefs,
198
+ scrollOffset: startIndex,
199
+ onHoverIndex,
200
+ onSelectIndex
201
+ }
202
+ ),
186
203
  scrollOffset > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { color: theme.text.primary, children: "\u25B2" }),
187
204
  visibleSuggestions.map((suggestion, index) => {
188
205
  const originalIndex = startIndex + index;
@@ -206,37 +223,47 @@ function SuggestionsDisplay({
206
223
  isExpanded
207
224
  }
208
225
  );
209
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Box_default, { flexDirection: "row", children: [
210
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Box_default, { width: ACTIVE_MARKER_WIDTH, flexShrink: 0, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { color: textColor, children: isActive ? "> " : " " }) }),
211
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
212
- Box_default,
213
- {
214
- ...mode === "slash" || suggestion.description ? { width: labelColumnWidth, flexShrink: 0 } : { flexShrink: 1 },
215
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Box_default, { children: [
216
- labelElement,
217
- suggestion.argumentHint && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Text, { color: theme.text.secondary, children: [
218
- " ",
219
- suggestion.argumentHint
220
- ] }),
221
- suggestion.sourceBadge && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Text, { color: textColor, children: [
222
- " ",
223
- suggestion.sourceBadge
224
- ] })
225
- ] })
226
- }
227
- ),
228
- suggestion.description && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
229
- Box_default,
230
- {
231
- width: descriptionColumnWidth,
232
- flexGrow: 1,
233
- flexShrink: 1,
234
- paddingLeft: 2,
235
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { color: textColor, wrap: "truncate-end", children: normalizeDescription(suggestion.description) })
236
- }
237
- ),
238
- isActive && isLong && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Box_default, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { color: Colors.Gray, children: isExpanded ? " \u2190 " : " \u2192 " }) })
239
- ] }, `${suggestion.value}-${originalIndex}`);
226
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
227
+ Box_default,
228
+ {
229
+ flexDirection: "row",
230
+ ref: (node) => {
231
+ itemRefs.current[index] = node;
232
+ },
233
+ children: [
234
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Box_default, { width: ACTIVE_MARKER_WIDTH, flexShrink: 0, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { color: textColor, children: isActive ? "> " : " " }) }),
235
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
236
+ Box_default,
237
+ {
238
+ ...mode === "slash" || suggestion.description ? { width: labelColumnWidth, flexShrink: 0 } : { flexShrink: 1 },
239
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Box_default, { children: [
240
+ labelElement,
241
+ suggestion.argumentHint && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Text, { color: theme.text.secondary, children: [
242
+ " ",
243
+ suggestion.argumentHint
244
+ ] }),
245
+ suggestion.sourceBadge && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Text, { color: textColor, children: [
246
+ " ",
247
+ suggestion.sourceBadge
248
+ ] })
249
+ ] })
250
+ }
251
+ ),
252
+ suggestion.description && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
253
+ Box_default,
254
+ {
255
+ width: descriptionColumnWidth,
256
+ flexGrow: 1,
257
+ flexShrink: 1,
258
+ paddingLeft: 2,
259
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { color: textColor, wrap: "truncate-end", children: normalizeDescription(suggestion.description) })
260
+ }
261
+ ),
262
+ isActive && isLong && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Box_default, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { color: Colors.Gray, children: isExpanded ? " \u2190 " : " \u2192 " }) })
263
+ ]
264
+ },
265
+ `${suggestion.value}-${originalIndex}`
266
+ );
240
267
  }),
241
268
  endIndex < suggestions.length && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text, { color: "gray", children: "\u25BC" }),
242
269
  suggestions.length > MAX_SUGGESTIONS_TO_SHOW && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Text, { color: "gray", children: [
@@ -250,8 +277,12 @@ function SuggestionsDisplay({
250
277
  }
251
278
  __name(SuggestionsDisplay, "SuggestionsDisplay");
252
279
 
253
- // packages/cli/src/ui/hooks/extension-mention-ref.ts
280
+ // packages/cli/src/utils/extension-mention.ts
281
+ init_esbuild_shims();
282
+ import * as fs from "node:fs/promises";
254
283
  var EXTENSION_REF_PREFIX = "ext:";
284
+ var EXTENSION_CONTEXT_BUDGET = 2e5;
285
+ var EXTENSION_CONTEXT_FILE_CAP = 5e4;
255
286
  function parseExtensionRef(pathName) {
256
287
  if (!pathName.startsWith(EXTENSION_REF_PREFIX)) return null;
257
288
  const name = pathName.slice(EXTENSION_REF_PREFIX.length);
@@ -276,37 +307,12 @@ function sanitizeDisplayText(raw) {
276
307
  return stripped.length > 0 ? stripped : null;
277
308
  }
278
309
  __name(sanitizeDisplayText, "sanitizeDisplayText");
279
- function getExtensionSuggestions(config, pattern) {
280
- if (!config) return [];
281
- if (config.isTrustedFolder?.() === false) return [];
282
- const extensions = config.getActiveExtensions?.() ?? [];
283
- if (extensions.length === 0) return [];
284
- const query = pattern.toLowerCase();
285
- return extensions.map((ext) => ({
286
- ext,
287
- safeLabel: sanitizeDisplayText(ext.displayName || ext.name) || ext.name
288
- })).filter(({ safeLabel, ext }) => {
289
- const label = safeLabel.toLowerCase();
290
- const name = ext.name.toLowerCase();
291
- return label.includes(query) || name.includes(query);
292
- }).sort((a, b) => {
293
- const aName = a.safeLabel.toLowerCase();
294
- const bName = b.safeLabel.toLowerCase();
295
- const aPrefix = aName.startsWith(query) ? 0 : 1;
296
- const bPrefix = bName.startsWith(query) ? 0 : 1;
297
- if (aPrefix !== bPrefix) return aPrefix - bPrefix;
298
- return aName.localeCompare(bName);
299
- }).slice(0, MAX_SUGGESTIONS_TO_SHOW).map(({ ext, safeLabel }) => ({
300
- label: safeLabel,
301
- value: buildExtensionRef(ext.name),
302
- description: ext.config.description ? sanitizeDisplayText(ext.config.description) ?? void 0 : void 0,
303
- sourceBadge: t("Extension"),
304
- isDirectory: false
305
- }));
310
+ function getExtensionDisplayName(extension) {
311
+ return sanitizeDisplayText(extension.displayName || extension.name) || extension.name;
306
312
  }
307
- __name(getExtensionSuggestions, "getExtensionSuggestions");
313
+ __name(getExtensionDisplayName, "getExtensionDisplayName");
308
314
  function buildExtensionContextText(extension) {
309
- const displayName = sanitizeDisplayText(extension.displayName || extension.name) || extension.name;
315
+ const displayName = getExtensionDisplayName(extension);
310
316
  const lines = [];
311
317
  lines.push(
312
318
  `--- Extension: ${displayName} (untrusted third-party content) ---`
@@ -340,6 +346,94 @@ function buildExtensionContextText(extension) {
340
346
  return lines.join("\n");
341
347
  }
342
348
  __name(buildExtensionContextText, "buildExtensionContextText");
349
+ async function buildExtensionMentionContext(extension, options) {
350
+ let contextText = buildExtensionContextText(extension);
351
+ let remainingBudget = options.remainingBudget;
352
+ if (extension.contextFiles.length === 0) {
353
+ return { text: contextText, remainingBudget };
354
+ }
355
+ const fileReads = await Promise.allSettled(
356
+ extension.contextFiles.map(async (contextFilePath) => {
357
+ let realPath;
358
+ let realExtPath;
359
+ try {
360
+ realPath = await fs.realpath(contextFilePath);
361
+ realExtPath = await fs.realpath(extension.path);
362
+ } catch {
363
+ options.onDebugMessage?.(
364
+ `Skipping unreadable context file: ${contextFilePath}`
365
+ );
366
+ return null;
367
+ }
368
+ if (!isSubpath(realExtPath, realPath)) {
369
+ options.onDebugMessage?.(
370
+ `Skipping context file outside extension directory: ${contextFilePath}`
371
+ );
372
+ return null;
373
+ }
374
+ return fs.readFile(realPath, {
375
+ encoding: "utf-8",
376
+ signal: options.signal
377
+ });
378
+ })
379
+ );
380
+ for (let i = 0; i < fileReads.length; i++) {
381
+ const outcome = fileReads[i];
382
+ if (outcome.status === "rejected") {
383
+ options.onDebugMessage?.(
384
+ `Failed to read extension context file ${extension.contextFiles[i]}: ${getErrorMessage(outcome.reason)}`
385
+ );
386
+ continue;
387
+ }
388
+ const content = outcome.value;
389
+ if (!content || !content.trim()) continue;
390
+ if (remainingBudget <= 0) {
391
+ options.onDebugMessage?.(
392
+ "Extension context budget exhausted, skipping remaining files."
393
+ );
394
+ break;
395
+ }
396
+ const cap = Math.min(EXTENSION_CONTEXT_FILE_CAP, remainingBudget);
397
+ const cappedContent = content.length > cap ? content.slice(0, cap) + "\n... (truncated)" : content;
398
+ contextText += `
399
+
400
+ ${cappedContent}`;
401
+ remainingBudget -= cappedContent.length;
402
+ }
403
+ return { text: contextText, remainingBudget };
404
+ }
405
+ __name(buildExtensionMentionContext, "buildExtensionMentionContext");
406
+
407
+ // packages/cli/src/ui/hooks/extension-mention-ref.ts
408
+ function getExtensionSuggestions(config, pattern) {
409
+ if (!config) return [];
410
+ if (config.isTrustedFolder?.() === false) return [];
411
+ const extensions = config.getActiveExtensions?.() ?? [];
412
+ if (extensions.length === 0) return [];
413
+ const query = pattern.toLowerCase();
414
+ return extensions.map((ext) => ({
415
+ ext,
416
+ safeLabel: sanitizeDisplayText(ext.displayName || ext.name) || ext.name
417
+ })).filter(({ safeLabel, ext }) => {
418
+ const label = safeLabel.toLowerCase();
419
+ const name = ext.name.toLowerCase();
420
+ return label.includes(query) || name.includes(query);
421
+ }).sort((a, b) => {
422
+ const aName = a.safeLabel.toLowerCase();
423
+ const bName = b.safeLabel.toLowerCase();
424
+ const aPrefix = aName.startsWith(query) ? 0 : 1;
425
+ const bPrefix = bName.startsWith(query) ? 0 : 1;
426
+ if (aPrefix !== bPrefix) return aPrefix - bPrefix;
427
+ return aName.localeCompare(bName);
428
+ }).slice(0, MAX_SUGGESTIONS_TO_SHOW).map(({ ext, safeLabel }) => ({
429
+ label: safeLabel,
430
+ value: buildExtensionRef(ext.name),
431
+ description: ext.config.description ? sanitizeDisplayText(ext.config.description) ?? void 0 : void 0,
432
+ sourceBadge: t("Extension"),
433
+ isDirectory: false
434
+ }));
435
+ }
436
+ __name(getExtensionSuggestions, "getExtensionSuggestions");
343
437
 
344
438
  // packages/cli/src/ui/hooks/atCommandProcessor.ts
345
439
  function parseAllAtCommands(query) {
@@ -489,7 +583,7 @@ async function resolveAtCommandQuery({
489
583
  let currentPathSpec = pathName;
490
584
  try {
491
585
  const absolutePath = path.resolve(dir, pathName);
492
- const stats = await fs.stat(absolutePath);
586
+ const stats = await fs2.stat(absolutePath);
493
587
  if (stats.isDirectory()) {
494
588
  currentPathSpec = pathName;
495
589
  onDebugMessage(`Path ${pathName} resolved to directory.`);
@@ -615,65 +709,21 @@ ${messages.join("\n")}`;
615
709
  shouldProceed: true
616
710
  };
617
711
  }
618
- const EXTENSION_CONTEXT_BUDGET = 2e5;
619
- const PER_FILE_CAP = 5e4;
620
712
  let extensionContextBudgetRemaining = EXTENSION_CONTEXT_BUDGET;
621
713
  const extensionParts = [];
622
714
  const extensionDisplays = [];
623
715
  const extensionLabels = [];
624
716
  for (let i = 0; i < extensionMentions.length; i++) {
625
717
  const { extension } = extensionMentions[i];
626
- const displayName = sanitizeDisplayText(extension.displayName || extension.name) || extension.name;
718
+ const displayName = getExtensionDisplayName(extension);
627
719
  const callId = `client-extension-${userMessageTimestamp}-${i}`;
628
- let contextText = buildExtensionContextText(extension);
629
- if (extension.contextFiles && extension.contextFiles.length > 0) {
630
- const fileReads = await Promise.allSettled(
631
- extension.contextFiles.map(async (contextFilePath) => {
632
- let realPath;
633
- let realExtPath;
634
- try {
635
- realPath = await fs.realpath(contextFilePath);
636
- realExtPath = await fs.realpath(extension.path);
637
- } catch {
638
- onDebugMessage(
639
- `Skipping unreadable context file: ${contextFilePath}`
640
- );
641
- return null;
642
- }
643
- if (!isSubpath(realExtPath, realPath)) {
644
- onDebugMessage(
645
- `Skipping context file outside extension directory: ${contextFilePath}`
646
- );
647
- return null;
648
- }
649
- return fs.readFile(realPath, { encoding: "utf-8", signal });
650
- })
651
- );
652
- for (let j = 0; j < fileReads.length; j++) {
653
- const outcome = fileReads[j];
654
- if (outcome.status === "rejected") {
655
- onDebugMessage(
656
- `Failed to read extension context file ${extension.contextFiles[j]}: ${getErrorMessage(outcome.reason)}`
657
- );
658
- continue;
659
- }
660
- const content = outcome.value;
661
- if (!content || !content.trim()) continue;
662
- if (extensionContextBudgetRemaining <= 0) {
663
- onDebugMessage(
664
- `Extension context budget exhausted, skipping remaining files.`
665
- );
666
- break;
667
- }
668
- const cap = Math.min(PER_FILE_CAP, extensionContextBudgetRemaining);
669
- const cappedContent = content.length > cap ? content.slice(0, cap) + "\n... (truncated)" : content;
670
- contextText += `
671
-
672
- ${cappedContent}`;
673
- extensionContextBudgetRemaining -= cappedContent.length;
674
- }
675
- }
676
- extensionParts.push({ text: contextText });
720
+ const context = await buildExtensionMentionContext(extension, {
721
+ remainingBudget: extensionContextBudgetRemaining,
722
+ signal,
723
+ onDebugMessage
724
+ });
725
+ extensionContextBudgetRemaining = context.remainingBudget;
726
+ extensionParts.push({ text: context.text });
677
727
  extensionLabels.push(buildExtensionRef(extension.name));
678
728
  extensionDisplays.push({
679
729
  callId,
@@ -797,6 +847,10 @@ export {
797
847
  MAX_WIDTH,
798
848
  MAX_SUGGESTIONS_TO_SHOW,
799
849
  SuggestionsDisplay,
850
+ EXTENSION_CONTEXT_BUDGET,
851
+ parseExtensionRef,
852
+ matchExtensionByRef,
853
+ buildExtensionMentionContext,
800
854
  getExtensionSuggestions,
801
855
  resolveAtCommandQuery,
802
856
  handleAtCommand