@machina.ai/cell-cli 1.22.5-rc1 → 1.25.0-rc3

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 (723) hide show
  1. package/dist/package.json +5 -4
  2. package/dist/src/commands/extensions/configure.d.ts +13 -0
  3. package/dist/src/commands/extensions/configure.js +131 -0
  4. package/dist/src/commands/extensions/configure.js.map +1 -0
  5. package/dist/src/commands/extensions/configure.test.d.ts +1 -0
  6. package/dist/src/commands/extensions/configure.test.js +197 -0
  7. package/dist/src/commands/extensions/configure.test.js.map +1 -0
  8. package/dist/src/commands/extensions/disable.test.js.map +1 -1
  9. package/dist/src/commands/extensions/enable.test.js.map +1 -1
  10. package/dist/src/commands/extensions/install.js +7 -31
  11. package/dist/src/commands/extensions/install.js.map +1 -1
  12. package/dist/src/commands/extensions/install.test.js +21 -3
  13. package/dist/src/commands/extensions/install.test.js.map +1 -1
  14. package/dist/src/commands/extensions/link.test.js.map +1 -1
  15. package/dist/src/commands/extensions/uninstall.test.js.map +1 -1
  16. package/dist/src/commands/extensions/utils.d.ts +2 -1
  17. package/dist/src/commands/extensions/utils.js +5 -1
  18. package/dist/src/commands/extensions/utils.js.map +1 -1
  19. package/dist/src/commands/extensions/validate.js +1 -1
  20. package/dist/src/commands/extensions/validate.js.map +1 -1
  21. package/dist/src/commands/extensions/validate.test.js +1 -1
  22. package/dist/src/commands/extensions/validate.test.js.map +1 -1
  23. package/dist/src/commands/extensions.js +2 -2
  24. package/dist/src/commands/extensions.js.map +1 -1
  25. package/dist/src/commands/hooks/migrate.js +1 -1
  26. package/dist/src/commands/hooks/migrate.js.map +1 -1
  27. package/dist/src/commands/hooks/migrate.test.js +1 -1
  28. package/dist/src/commands/hooks/migrate.test.js.map +1 -1
  29. package/dist/src/commands/mcp/add.test.js +1 -1
  30. package/dist/src/commands/mcp/add.test.js.map +1 -1
  31. package/dist/src/commands/mcp/list.js +7 -1
  32. package/dist/src/commands/mcp/list.js.map +1 -1
  33. package/dist/src/commands/skills/disable.d.ts +14 -0
  34. package/dist/src/commands/skills/disable.js +45 -0
  35. package/dist/src/commands/skills/disable.js.map +1 -0
  36. package/dist/src/commands/skills/disable.test.d.ts +6 -0
  37. package/dist/src/commands/skills/disable.test.js +80 -0
  38. package/dist/src/commands/skills/disable.test.js.map +1 -0
  39. package/dist/src/commands/skills/enable.d.ts +12 -0
  40. package/dist/src/commands/skills/enable.js +35 -0
  41. package/dist/src/commands/skills/enable.js.map +1 -0
  42. package/dist/src/commands/skills/enable.test.d.ts +6 -0
  43. package/dist/src/commands/skills/enable.test.js +107 -0
  44. package/dist/src/commands/skills/enable.test.js.map +1 -0
  45. package/dist/src/commands/skills/install.d.ts +14 -0
  46. package/dist/src/commands/skills/install.js +61 -0
  47. package/dist/src/commands/skills/install.js.map +1 -0
  48. package/dist/src/commands/skills/install.test.d.ts +6 -0
  49. package/dist/src/commands/skills/install.test.js +57 -0
  50. package/dist/src/commands/skills/install.test.js.map +1 -0
  51. package/dist/src/commands/skills/list.d.ts +10 -0
  52. package/dist/src/commands/skills/list.js +60 -0
  53. package/dist/src/commands/skills/list.js.map +1 -0
  54. package/dist/src/commands/skills/list.test.d.ts +6 -0
  55. package/dist/src/commands/skills/list.test.js +136 -0
  56. package/dist/src/commands/skills/list.test.js.map +1 -0
  57. package/dist/src/commands/skills/uninstall.d.ts +13 -0
  58. package/dist/src/commands/skills/uninstall.js +56 -0
  59. package/dist/src/commands/skills/uninstall.js.map +1 -0
  60. package/dist/src/commands/skills/uninstall.test.d.ts +6 -0
  61. package/dist/src/commands/skills/uninstall.test.js +61 -0
  62. package/dist/src/commands/skills/uninstall.test.js.map +1 -0
  63. package/dist/src/commands/{extensions/settings.d.ts → skills.d.ts} +2 -2
  64. package/dist/src/commands/skills.js +30 -0
  65. package/dist/src/commands/skills.js.map +1 -0
  66. package/dist/src/commands/skills.test.d.ts +6 -0
  67. package/dist/src/commands/skills.test.js +49 -0
  68. package/dist/src/commands/skills.test.js.map +1 -0
  69. package/dist/src/config/config.d.ts +10 -3
  70. package/dist/src/config/config.js +91 -31
  71. package/dist/src/config/config.js.map +1 -1
  72. package/dist/src/config/config.test.js +224 -13
  73. package/dist/src/config/config.test.js.map +1 -1
  74. package/dist/src/config/extension-manager-agents.test.d.ts +6 -0
  75. package/dist/src/config/extension-manager-agents.test.js +115 -0
  76. package/dist/src/config/extension-manager-agents.test.js.map +1 -0
  77. package/dist/src/config/extension-manager-scope.test.js +164 -0
  78. package/dist/src/config/extension-manager-scope.test.js.map +1 -0
  79. package/dist/src/config/extension-manager-skills.test.js +150 -0
  80. package/dist/src/config/extension-manager-skills.test.js.map +1 -0
  81. package/dist/src/config/extension-manager.d.ts +6 -1
  82. package/dist/src/config/extension-manager.js +157 -34
  83. package/dist/src/config/extension-manager.js.map +1 -1
  84. package/dist/src/config/extension.test.js +98 -16
  85. package/dist/src/config/extension.test.js.map +1 -1
  86. package/dist/src/config/extensions/consent.d.ts +5 -3
  87. package/dist/src/config/extensions/consent.js +30 -7
  88. package/dist/src/config/extensions/consent.js.map +1 -1
  89. package/dist/src/config/extensions/consent.test.js +97 -3
  90. package/dist/src/config/extensions/consent.test.js.map +1 -1
  91. package/dist/src/config/extensions/extensionSettings.d.ts +5 -3
  92. package/dist/src/config/extensions/extensionSettings.js +32 -12
  93. package/dist/src/config/extensions/extensionSettings.js.map +1 -1
  94. package/dist/src/config/extensions/extensionSettings.test.js +8 -8
  95. package/dist/src/config/extensions/extensionSettings.test.js.map +1 -1
  96. package/dist/src/config/extensions/extensionUpdates.test.js +231 -0
  97. package/dist/src/config/extensions/extensionUpdates.test.js.map +1 -0
  98. package/dist/src/config/extensions/github.js +1 -1
  99. package/dist/src/config/extensions/github.js.map +1 -1
  100. package/dist/src/config/extensions/github.test.js +2 -2
  101. package/dist/src/config/extensions/github.test.js.map +1 -1
  102. package/dist/src/config/extensions/storage.js +2 -2
  103. package/dist/src/config/extensions/storage.js.map +1 -1
  104. package/dist/src/config/extensions/update.js +1 -1
  105. package/dist/src/config/extensions/update.js.map +1 -1
  106. package/dist/src/config/extensions/update.test.js +8 -8
  107. package/dist/src/config/extensions/update.test.js.map +1 -1
  108. package/dist/src/config/keyBindings.d.ts +14 -2
  109. package/dist/src/config/keyBindings.js +89 -11
  110. package/dist/src/config/keyBindings.js.map +1 -1
  111. package/dist/src/config/policy-engine.integration.test.js +13 -1
  112. package/dist/src/config/policy-engine.integration.test.js.map +1 -1
  113. package/dist/src/config/settings-validation.js +1 -1
  114. package/dist/src/config/settings-validation.js.map +1 -1
  115. package/dist/src/config/settings-validation.test.js +49 -1
  116. package/dist/src/config/settings-validation.test.js.map +1 -1
  117. package/dist/src/config/settings.d.ts +9 -7
  118. package/dist/src/config/settings.js +127 -250
  119. package/dist/src/config/settings.js.map +1 -1
  120. package/dist/src/config/settings.test.js +245 -594
  121. package/dist/src/config/settings.test.js.map +1 -1
  122. package/dist/src/config/settingsSchema.d.ts +284 -33
  123. package/dist/src/config/settingsSchema.js +328 -31
  124. package/dist/src/config/settingsSchema.js.map +1 -1
  125. package/dist/src/config/settingsSchema.test.js +17 -9
  126. package/dist/src/config/settingsSchema.test.js.map +1 -1
  127. package/dist/src/config/settings_repro.test.js +1 -1
  128. package/dist/src/config/settings_repro.test.js.map +1 -1
  129. package/dist/src/config/settings_validation_warning.test.d.ts +6 -0
  130. package/dist/src/config/settings_validation_warning.test.js +123 -0
  131. package/dist/src/config/settings_validation_warning.test.js.map +1 -0
  132. package/dist/src/config/trustedFolders.d.ts +1 -0
  133. package/dist/src/config/trustedFolders.js +18 -4
  134. package/dist/src/config/trustedFolders.js.map +1 -1
  135. package/dist/src/config/trustedFolders.test.js +45 -0
  136. package/dist/src/config/trustedFolders.test.js.map +1 -1
  137. package/dist/src/gemini.js +117 -85
  138. package/dist/src/gemini.js.map +1 -1
  139. package/dist/src/gemini.test.js +72 -95
  140. package/dist/src/gemini.test.js.map +1 -1
  141. package/dist/src/gemini_cleanup.test.js +6 -0
  142. package/dist/src/gemini_cleanup.test.js.map +1 -1
  143. package/dist/src/generated/git-commit.d.ts +3 -3
  144. package/dist/src/generated/git-commit.js +3 -3
  145. package/dist/src/nonInteractiveCli.js +54 -1
  146. package/dist/src/nonInteractiveCli.js.map +1 -1
  147. package/dist/src/nonInteractiveCli.test.js +94 -11
  148. package/dist/src/nonInteractiveCli.test.js.map +1 -1
  149. package/dist/src/services/BuiltinCommandLoader.d.ts +1 -1
  150. package/dist/src/services/BuiltinCommandLoader.js +65 -9
  151. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  152. package/dist/src/services/BuiltinCommandLoader.test.js +67 -13
  153. package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -1
  154. package/dist/src/services/FileCommandLoader.js +6 -6
  155. package/dist/src/services/FileCommandLoader.js.map +1 -1
  156. package/dist/src/services/prompt-processors/shellProcessor.js +13 -11
  157. package/dist/src/services/prompt-processors/shellProcessor.js.map +1 -1
  158. package/dist/src/services/prompt-processors/shellProcessor.test.js +93 -61
  159. package/dist/src/services/prompt-processors/shellProcessor.test.js.map +1 -1
  160. package/dist/src/test-utils/render.js +4 -2
  161. package/dist/src/test-utils/render.js.map +1 -1
  162. package/dist/src/ui/App.test.js +2 -2
  163. package/dist/src/ui/App.test.js.map +1 -1
  164. package/dist/src/ui/AppContainer.js +158 -77
  165. package/dist/src/ui/AppContainer.js.map +1 -1
  166. package/dist/src/ui/AppContainer.test.js +230 -41
  167. package/dist/src/ui/AppContainer.test.js.map +1 -1
  168. package/dist/src/ui/IdeIntegrationNudge.test.js +18 -7
  169. package/dist/src/ui/IdeIntegrationNudge.test.js.map +1 -1
  170. package/dist/src/ui/auth/AuthDialog.d.ts +4 -1
  171. package/dist/src/ui/auth/AuthDialog.js +8 -2
  172. package/dist/src/ui/auth/AuthDialog.js.map +1 -1
  173. package/dist/src/ui/auth/AuthDialog.test.js +17 -0
  174. package/dist/src/ui/auth/AuthDialog.test.js.map +1 -1
  175. package/dist/src/ui/auth/AuthInProgress.test.js +16 -6
  176. package/dist/src/ui/auth/AuthInProgress.test.js.map +1 -1
  177. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.d.ts +10 -0
  178. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.js +27 -0
  179. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.js.map +1 -0
  180. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.d.ts +6 -0
  181. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.js +68 -0
  182. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.js.map +1 -0
  183. package/dist/src/ui/commands/aboutCommand.js +1 -1
  184. package/dist/src/ui/commands/aboutCommand.js.map +1 -1
  185. package/dist/src/ui/commands/aboutCommand.test.js +4 -4
  186. package/dist/src/ui/commands/aboutCommand.test.js.map +1 -1
  187. package/dist/src/ui/commands/agentsCommand.d.ts +7 -0
  188. package/dist/src/ui/commands/agentsCommand.js +79 -0
  189. package/dist/src/ui/commands/agentsCommand.js.map +1 -0
  190. package/dist/src/ui/commands/agentsCommand.test.d.ts +6 -0
  191. package/dist/src/ui/commands/agentsCommand.test.js +91 -0
  192. package/dist/src/ui/commands/agentsCommand.test.js.map +1 -0
  193. package/dist/src/ui/commands/authCommand.js +30 -3
  194. package/dist/src/ui/commands/authCommand.js.map +1 -1
  195. package/dist/src/ui/commands/authCommand.test.js +72 -4
  196. package/dist/src/ui/commands/authCommand.test.js.map +1 -1
  197. package/dist/src/ui/commands/bugCommand.js +36 -4
  198. package/dist/src/ui/commands/bugCommand.js.map +1 -1
  199. package/dist/src/ui/commands/bugCommand.test.js +83 -2
  200. package/dist/src/ui/commands/bugCommand.test.js.map +1 -1
  201. package/dist/src/ui/commands/chatCommand.d.ts +1 -2
  202. package/dist/src/ui/commands/chatCommand.js +50 -50
  203. package/dist/src/ui/commands/chatCommand.js.map +1 -1
  204. package/dist/src/ui/commands/chatCommand.test.js +84 -58
  205. package/dist/src/ui/commands/chatCommand.test.js.map +1 -1
  206. package/dist/src/ui/commands/clearCommand.js +12 -8
  207. package/dist/src/ui/commands/clearCommand.js.map +1 -1
  208. package/dist/src/ui/commands/clearCommand.test.js +4 -0
  209. package/dist/src/ui/commands/clearCommand.test.js.map +1 -1
  210. package/dist/src/ui/commands/copyCommand.js +1 -1
  211. package/dist/src/ui/commands/copyCommand.js.map +1 -1
  212. package/dist/src/ui/commands/directoryCommand.js +27 -10
  213. package/dist/src/ui/commands/directoryCommand.js.map +1 -1
  214. package/dist/src/ui/commands/directoryCommand.test.js +47 -11
  215. package/dist/src/ui/commands/directoryCommand.test.js.map +1 -1
  216. package/dist/src/ui/commands/extensionsCommand.js +193 -24
  217. package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
  218. package/dist/src/ui/commands/extensionsCommand.test.js +217 -27
  219. package/dist/src/ui/commands/extensionsCommand.test.js.map +1 -1
  220. package/dist/src/ui/commands/helpCommand.js +1 -1
  221. package/dist/src/ui/commands/helpCommand.js.map +1 -1
  222. package/dist/src/ui/commands/helpCommand.test.js +1 -1
  223. package/dist/src/ui/commands/helpCommand.test.js.map +1 -1
  224. package/dist/src/ui/commands/hooksCommand.js +155 -20
  225. package/dist/src/ui/commands/hooksCommand.js.map +1 -1
  226. package/dist/src/ui/commands/hooksCommand.test.js +196 -17
  227. package/dist/src/ui/commands/hooksCommand.test.js.map +1 -1
  228. package/dist/src/ui/commands/mcpCommand.js +7 -7
  229. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  230. package/dist/src/ui/commands/mcpCommand.test.js +14 -6
  231. package/dist/src/ui/commands/mcpCommand.test.js.map +1 -1
  232. package/dist/src/ui/commands/memoryCommand.js +19 -33
  233. package/dist/src/ui/commands/memoryCommand.js.map +1 -1
  234. package/dist/src/ui/commands/memoryCommand.test.js +112 -16
  235. package/dist/src/ui/commands/memoryCommand.test.js.map +1 -1
  236. package/dist/src/ui/commands/restoreCommand.js +1 -1
  237. package/dist/src/ui/commands/restoreCommand.js.map +1 -1
  238. package/dist/src/ui/commands/skillsCommand.d.ts +7 -0
  239. package/dist/src/ui/commands/skillsCommand.js +235 -0
  240. package/dist/src/ui/commands/skillsCommand.js.map +1 -0
  241. package/dist/src/ui/commands/skillsCommand.test.d.ts +6 -0
  242. package/dist/src/ui/commands/skillsCommand.test.js +405 -0
  243. package/dist/src/ui/commands/skillsCommand.test.js.map +1 -0
  244. package/dist/src/ui/commands/statsCommand.js +4 -4
  245. package/dist/src/ui/commands/statsCommand.js.map +1 -1
  246. package/dist/src/ui/commands/statsCommand.test.js +4 -4
  247. package/dist/src/ui/commands/statsCommand.test.js.map +1 -1
  248. package/dist/src/ui/commands/toolsCommand.js +2 -2
  249. package/dist/src/ui/commands/toolsCommand.js.map +1 -1
  250. package/dist/src/ui/commands/toolsCommand.test.js +2 -2
  251. package/dist/src/ui/commands/toolsCommand.test.js.map +1 -1
  252. package/dist/src/ui/commands/types.d.ts +15 -2
  253. package/dist/src/ui/commands/types.js +1 -0
  254. package/dist/src/ui/commands/types.js.map +1 -1
  255. package/dist/src/ui/components/AsciiArt.d.ts +6 -6
  256. package/dist/src/ui/components/AsciiArt.js +6 -6
  257. package/dist/src/ui/components/Composer.js +7 -7
  258. package/dist/src/ui/components/Composer.js.map +1 -1
  259. package/dist/src/ui/components/Composer.test.js +23 -4
  260. package/dist/src/ui/components/Composer.test.js.map +1 -1
  261. package/dist/src/ui/components/ContextSummaryDisplay.d.ts +1 -0
  262. package/dist/src/ui/components/ContextSummaryDisplay.js +12 -5
  263. package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
  264. package/dist/src/ui/components/ContextSummaryDisplay.test.js +56 -25
  265. package/dist/src/ui/components/ContextSummaryDisplay.test.js.map +1 -1
  266. package/dist/src/ui/components/DialogManager.js +2 -2
  267. package/dist/src/ui/components/DialogManager.js.map +1 -1
  268. package/dist/src/ui/components/EditorSettingsDialog.js +2 -1
  269. package/dist/src/ui/components/EditorSettingsDialog.js.map +1 -1
  270. package/dist/src/ui/components/EditorSettingsDialog.test.js +3 -2
  271. package/dist/src/ui/components/EditorSettingsDialog.test.js.map +1 -1
  272. package/dist/src/ui/components/FolderTrustDialog.js +20 -15
  273. package/dist/src/ui/components/FolderTrustDialog.js.map +1 -1
  274. package/dist/src/ui/components/FolderTrustDialog.test.js +12 -2
  275. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
  276. package/dist/src/ui/components/Footer.js +4 -4
  277. package/dist/src/ui/components/Footer.js.map +1 -1
  278. package/dist/src/ui/components/Help.js +1 -1
  279. package/dist/src/ui/components/Help.js.map +1 -1
  280. package/dist/src/ui/components/HistoryItemDisplay.js +3 -1
  281. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  282. package/dist/src/ui/components/HistoryItemDisplay.test.js +21 -0
  283. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -1
  284. package/dist/src/ui/components/HookStatusDisplay.d.ts +12 -0
  285. package/dist/src/ui/components/HookStatusDisplay.js +20 -0
  286. package/dist/src/ui/components/HookStatusDisplay.js.map +1 -0
  287. package/dist/src/ui/components/HookStatusDisplay.test.d.ts +6 -0
  288. package/dist/src/ui/components/HookStatusDisplay.test.js +51 -0
  289. package/dist/src/ui/components/HookStatusDisplay.test.js.map +1 -0
  290. package/dist/src/ui/components/IdeTrustChangeDialog.js +2 -1
  291. package/dist/src/ui/components/IdeTrustChangeDialog.js.map +1 -1
  292. package/dist/src/ui/components/IdeTrustChangeDialog.test.js +4 -3
  293. package/dist/src/ui/components/IdeTrustChangeDialog.test.js.map +1 -1
  294. package/dist/src/ui/components/InputPrompt.js +54 -24
  295. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  296. package/dist/src/ui/components/InputPrompt.test.js +172 -7
  297. package/dist/src/ui/components/InputPrompt.test.js.map +1 -1
  298. package/dist/src/ui/components/LogoutConfirmationDialog.d.ts +15 -0
  299. package/dist/src/ui/components/LogoutConfirmationDialog.js +37 -0
  300. package/dist/src/ui/components/LogoutConfirmationDialog.js.map +1 -0
  301. package/dist/src/ui/components/LogoutConfirmationDialog.test.d.ts +6 -0
  302. package/dist/src/ui/components/LogoutConfirmationDialog.test.js +59 -0
  303. package/dist/src/ui/components/LogoutConfirmationDialog.test.js.map +1 -0
  304. package/dist/src/ui/components/MainContent.js +12 -10
  305. package/dist/src/ui/components/MainContent.js.map +1 -1
  306. package/dist/src/ui/components/MainContent.test.js +19 -9
  307. package/dist/src/ui/components/MainContent.test.js.map +1 -1
  308. package/dist/src/ui/components/ModelDialog.js +7 -3
  309. package/dist/src/ui/components/ModelDialog.js.map +1 -1
  310. package/dist/src/ui/components/ModelDialog.test.js +16 -2
  311. package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
  312. package/dist/src/ui/components/ModelStatsDisplay.js +68 -14
  313. package/dist/src/ui/components/ModelStatsDisplay.js.map +1 -1
  314. package/dist/src/ui/components/ModelStatsDisplay.test.js +53 -2
  315. package/dist/src/ui/components/ModelStatsDisplay.test.js.map +1 -1
  316. package/dist/src/ui/components/MultiFolderTrustDialog.d.ts +2 -2
  317. package/dist/src/ui/components/MultiFolderTrustDialog.js +2 -2
  318. package/dist/src/ui/components/MultiFolderTrustDialog.js.map +1 -1
  319. package/dist/src/ui/components/MultiFolderTrustDialog.test.js +9 -9
  320. package/dist/src/ui/components/MultiFolderTrustDialog.test.js.map +1 -1
  321. package/dist/src/ui/components/Notifications.js +3 -4
  322. package/dist/src/ui/components/Notifications.js.map +1 -1
  323. package/dist/src/ui/components/Notifications.test.js +1 -0
  324. package/dist/src/ui/components/Notifications.test.js.map +1 -1
  325. package/dist/src/ui/components/ProQuotaDialog.d.ts +1 -3
  326. package/dist/src/ui/components/ProQuotaDialog.js +3 -21
  327. package/dist/src/ui/components/ProQuotaDialog.js.map +1 -1
  328. package/dist/src/ui/components/ProQuotaDialog.test.js +25 -10
  329. package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -1
  330. package/dist/src/ui/components/SettingsDialog.js +36 -16
  331. package/dist/src/ui/components/SettingsDialog.js.map +1 -1
  332. package/dist/src/ui/components/SettingsDialog.test.js +20 -3
  333. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  334. package/dist/src/ui/components/StatusDisplay.d.ts +11 -0
  335. package/dist/src/ui/components/StatusDisplay.js +40 -0
  336. package/dist/src/ui/components/StatusDisplay.js.map +1 -0
  337. package/dist/src/ui/components/StatusDisplay.test.d.ts +6 -0
  338. package/dist/src/ui/components/StatusDisplay.test.js +144 -0
  339. package/dist/src/ui/components/StatusDisplay.test.js.map +1 -0
  340. package/dist/src/ui/components/StickyHeader.d.ts +2 -0
  341. package/dist/src/ui/components/StickyHeader.js +1 -1
  342. package/dist/src/ui/components/StickyHeader.js.map +1 -1
  343. package/dist/src/ui/components/SuggestionsDisplay.js +7 -2
  344. package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
  345. package/dist/src/ui/components/Table.d.ts +21 -0
  346. package/dist/src/ui/components/Table.js +7 -0
  347. package/dist/src/ui/components/Table.js.map +1 -0
  348. package/dist/src/ui/components/Table.test.d.ts +6 -0
  349. package/dist/src/ui/components/Table.test.js +53 -0
  350. package/dist/src/ui/components/Table.test.js.map +1 -0
  351. package/dist/src/ui/components/ThemeDialog.js +63 -17
  352. package/dist/src/ui/components/ThemeDialog.js.map +1 -1
  353. package/dist/src/ui/components/ThemeDialog.test.js +66 -1
  354. package/dist/src/ui/components/ThemeDialog.test.js.map +1 -1
  355. package/dist/src/ui/components/messages/DiffRenderer.js +5 -13
  356. package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
  357. package/dist/src/ui/components/messages/DiffRenderer.test.js +26 -17
  358. package/dist/src/ui/components/messages/DiffRenderer.test.js.map +1 -1
  359. package/dist/src/ui/components/messages/ShellToolMessage.js +8 -5
  360. package/dist/src/ui/components/messages/ShellToolMessage.js.map +1 -1
  361. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +1 -5
  362. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  363. package/dist/src/ui/components/messages/ToolMessage.js +6 -2
  364. package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
  365. package/dist/src/ui/components/messages/ToolMessage.test.js +1 -0
  366. package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -1
  367. package/dist/src/ui/components/messages/ToolResultDisplay.js +22 -16
  368. package/dist/src/ui/components/messages/ToolResultDisplay.js.map +1 -1
  369. package/dist/src/ui/components/messages/ToolResultDisplay.test.js +36 -18
  370. package/dist/src/ui/components/messages/ToolResultDisplay.test.js.map +1 -1
  371. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.d.ts +6 -0
  372. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js +134 -0
  373. package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js.map +1 -0
  374. package/dist/src/ui/components/shared/MaxSizedBox.d.ts +2 -38
  375. package/dist/src/ui/components/shared/MaxSizedBox.js +34 -418
  376. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
  377. package/dist/src/ui/components/shared/MaxSizedBox.test.js +48 -133
  378. package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +1 -1
  379. package/dist/src/ui/components/shared/RadioButtonSelect.d.ts +4 -1
  380. package/dist/src/ui/components/shared/RadioButtonSelect.js +11 -10
  381. package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
  382. package/dist/src/ui/components/shared/text-buffer.d.ts +40 -4
  383. package/dist/src/ui/components/shared/text-buffer.js +234 -64
  384. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  385. package/dist/src/ui/components/shared/text-buffer.test.js +147 -1
  386. package/dist/src/ui/components/shared/text-buffer.test.js.map +1 -1
  387. package/dist/src/ui/components/shared/vim-buffer-actions.test.js +3 -0
  388. package/dist/src/ui/components/shared/vim-buffer-actions.test.js.map +1 -1
  389. package/dist/src/ui/components/views/AgentsStatus.d.ts +13 -0
  390. package/dist/src/ui/components/views/AgentsStatus.js +23 -0
  391. package/dist/src/ui/components/views/AgentsStatus.js.map +1 -0
  392. package/dist/src/ui/components/views/ExtensionsList.js +3 -2
  393. package/dist/src/ui/components/views/ExtensionsList.js.map +1 -1
  394. package/dist/src/ui/components/views/ExtensionsList.test.js +37 -0
  395. package/dist/src/ui/components/views/ExtensionsList.test.js.map +1 -1
  396. package/dist/src/ui/components/views/HooksList.d.ts +2 -0
  397. package/dist/src/ui/components/views/HooksList.js +12 -7
  398. package/dist/src/ui/components/views/HooksList.js.map +1 -1
  399. package/dist/src/ui/components/views/McpStatus.js +7 -2
  400. package/dist/src/ui/components/views/McpStatus.js.map +1 -1
  401. package/dist/src/ui/components/views/McpStatus.test.js +10 -0
  402. package/dist/src/ui/components/views/McpStatus.test.js.map +1 -1
  403. package/dist/src/ui/components/views/SkillsList.d.ts +13 -0
  404. package/dist/src/ui/components/views/SkillsList.js +17 -0
  405. package/dist/src/ui/components/views/SkillsList.js.map +1 -0
  406. package/dist/src/ui/components/views/SkillsList.test.d.ts +6 -0
  407. package/dist/src/ui/components/views/SkillsList.test.js +97 -0
  408. package/dist/src/ui/components/views/SkillsList.test.js.map +1 -0
  409. package/dist/src/ui/constants/tips.js +1 -4
  410. package/dist/src/ui/constants/tips.js.map +1 -1
  411. package/dist/src/ui/constants.d.ts +4 -3
  412. package/dist/src/ui/constants.js +5 -6
  413. package/dist/src/ui/constants.js.map +1 -1
  414. package/dist/src/ui/contexts/KeypressContext.d.ts +1 -0
  415. package/dist/src/ui/contexts/KeypressContext.js +84 -6
  416. package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
  417. package/dist/src/ui/contexts/KeypressContext.test.js +130 -9
  418. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
  419. package/dist/src/ui/contexts/UIActionsContext.d.ts +3 -0
  420. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
  421. package/dist/src/ui/contexts/UIStateContext.d.ts +5 -1
  422. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  423. package/dist/src/ui/contexts/VimModeContext.js +1 -1
  424. package/dist/src/ui/contexts/VimModeContext.js.map +1 -1
  425. package/dist/src/ui/hooks/atCommandProcessor.js +17 -3
  426. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  427. package/dist/src/ui/hooks/atCommandProcessor.test.js +9 -3
  428. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
  429. package/dist/src/ui/hooks/atCommandProcessor_agents.test.d.ts +6 -0
  430. package/dist/src/ui/hooks/atCommandProcessor_agents.test.js +183 -0
  431. package/dist/src/ui/hooks/atCommandProcessor_agents.test.js.map +1 -0
  432. package/dist/src/ui/hooks/slashCommandProcessor.js +18 -7
  433. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  434. package/dist/src/ui/hooks/slashCommandProcessor.test.js +2 -3
  435. package/dist/src/ui/hooks/slashCommandProcessor.test.js.map +1 -1
  436. package/dist/src/ui/hooks/useAtCompletion.js +31 -0
  437. package/dist/src/ui/hooks/useAtCompletion.js.map +1 -1
  438. package/dist/src/ui/hooks/useAtCompletion_agents.test.d.ts +6 -0
  439. package/dist/src/ui/hooks/useAtCompletion_agents.test.js +85 -0
  440. package/dist/src/ui/hooks/useAtCompletion_agents.test.js.map +1 -0
  441. package/dist/src/ui/hooks/useAutoAcceptIndicator.d.ts +2 -1
  442. package/dist/src/ui/hooks/useAutoAcceptIndicator.js +5 -4
  443. package/dist/src/ui/hooks/useAutoAcceptIndicator.js.map +1 -1
  444. package/dist/src/ui/hooks/useCommandCompletion.d.ts +1 -0
  445. package/dist/src/ui/hooks/useCommandCompletion.js +13 -8
  446. package/dist/src/ui/hooks/useCommandCompletion.js.map +1 -1
  447. package/dist/src/ui/hooks/useCommandCompletion.test.js +88 -2
  448. package/dist/src/ui/hooks/useCommandCompletion.test.js.map +1 -1
  449. package/dist/src/ui/hooks/useExtensionUpdates.js +5 -7
  450. package/dist/src/ui/hooks/useExtensionUpdates.js.map +1 -1
  451. package/dist/src/ui/hooks/useExtensionUpdates.test.js +20 -4
  452. package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +1 -1
  453. package/dist/src/ui/hooks/useFolderTrust.js +14 -19
  454. package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
  455. package/dist/src/ui/hooks/useFolderTrust.test.js +31 -23
  456. package/dist/src/ui/hooks/useFolderTrust.test.js.map +1 -1
  457. package/dist/src/ui/hooks/useGeminiStream.d.ts +2 -1
  458. package/dist/src/ui/hooks/useGeminiStream.js +84 -16
  459. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  460. package/dist/src/ui/hooks/useGeminiStream.test.js +290 -10
  461. package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
  462. package/dist/src/ui/hooks/useHistoryManager.d.ts +1 -1
  463. package/dist/src/ui/hooks/useHistoryManager.js +1 -1
  464. package/dist/src/ui/hooks/useHistoryManager.js.map +1 -1
  465. package/dist/src/ui/hooks/useHistoryManager.test.js +16 -0
  466. package/dist/src/ui/hooks/useHistoryManager.test.js.map +1 -1
  467. package/dist/src/ui/hooks/useHookDisplayState.d.ts +7 -0
  468. package/dist/src/ui/hooks/useHookDisplayState.js +83 -0
  469. package/dist/src/ui/hooks/useHookDisplayState.js.map +1 -0
  470. package/dist/src/ui/hooks/useHookDisplayState.test.d.ts +6 -0
  471. package/dist/src/ui/hooks/useHookDisplayState.test.js +180 -0
  472. package/dist/src/ui/hooks/useHookDisplayState.test.js.map +1 -0
  473. package/dist/src/ui/hooks/useIncludeDirsTrust.js +4 -4
  474. package/dist/src/ui/hooks/useIncludeDirsTrust.js.map +1 -1
  475. package/dist/src/ui/hooks/useIncludeDirsTrust.test.js +2 -2
  476. package/dist/src/ui/hooks/useIncludeDirsTrust.test.js.map +1 -1
  477. package/dist/src/ui/hooks/useKittyKeyboardProtocol.js +2 -2
  478. package/dist/src/ui/hooks/useKittyKeyboardProtocol.js.map +1 -1
  479. package/dist/src/ui/hooks/useLoadingIndicator.d.ts +2 -1
  480. package/dist/src/ui/hooks/useLoadingIndicator.js +7 -3
  481. package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
  482. package/dist/src/ui/hooks/useLoadingIndicator.test.js +14 -4
  483. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
  484. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js +10 -3
  485. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js.map +1 -1
  486. package/dist/src/ui/hooks/usePhraseCycler.d.ts +1 -1
  487. package/dist/src/ui/hooks/usePhraseCycler.js +2 -2
  488. package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
  489. package/dist/src/ui/hooks/usePromptCompletion.js +0 -2
  490. package/dist/src/ui/hooks/usePromptCompletion.js.map +1 -1
  491. package/dist/src/ui/hooks/useQuotaAndFallback.js +11 -9
  492. package/dist/src/ui/hooks/useQuotaAndFallback.js.map +1 -1
  493. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +22 -16
  494. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -1
  495. package/dist/src/ui/hooks/useReactToolScheduler.d.ts +1 -1
  496. package/dist/src/ui/hooks/useReactToolScheduler.js +1 -1
  497. package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
  498. package/dist/src/ui/hooks/useRewind.d.ts +14 -0
  499. package/dist/src/ui/hooks/useRewind.js +31 -0
  500. package/dist/src/ui/hooks/useRewind.js.map +1 -0
  501. package/dist/src/ui/hooks/useRewind.test.d.ts +6 -0
  502. package/dist/src/ui/hooks/useRewind.test.js +100 -0
  503. package/dist/src/ui/hooks/useRewind.test.js.map +1 -0
  504. package/dist/src/ui/hooks/useSelectionList.js +2 -1
  505. package/dist/src/ui/hooks/useSelectionList.js.map +1 -1
  506. package/dist/src/ui/hooks/useSessionBrowser.js +3 -3
  507. package/dist/src/ui/hooks/useSessionBrowser.js.map +1 -1
  508. package/dist/src/ui/hooks/useSessionBrowser.test.js +4 -10
  509. package/dist/src/ui/hooks/useSessionBrowser.test.js.map +1 -1
  510. package/dist/src/ui/hooks/useShellHistory.js +3 -3
  511. package/dist/src/ui/hooks/useShellHistory.js.map +1 -1
  512. package/dist/src/ui/hooks/useSlashCompletion.js +26 -11
  513. package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
  514. package/dist/src/ui/hooks/useSlashCompletion.test.js +115 -5
  515. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
  516. package/dist/src/ui/hooks/useToolScheduler.test.js +73 -50
  517. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  518. package/dist/src/ui/hooks/vim.test.js +7 -0
  519. package/dist/src/ui/hooks/vim.test.js.map +1 -1
  520. package/dist/src/ui/keyMatchers.test.js +79 -53
  521. package/dist/src/ui/keyMatchers.test.js.map +1 -1
  522. package/dist/src/ui/themes/ansi-light.js +1 -1
  523. package/dist/src/ui/themes/ansi-light.js.map +1 -1
  524. package/dist/src/ui/themes/ansi.js +1 -1
  525. package/dist/src/ui/themes/ansi.js.map +1 -1
  526. package/dist/src/ui/themes/color-utils.d.ts +1 -0
  527. package/dist/src/ui/themes/color-utils.js +13 -0
  528. package/dist/src/ui/themes/color-utils.js.map +1 -1
  529. package/dist/src/ui/themes/color-utils.test.js +20 -1
  530. package/dist/src/ui/themes/color-utils.test.js.map +1 -1
  531. package/dist/src/ui/themes/shades-of-purple.js +1 -1
  532. package/dist/src/ui/themes/shades-of-purple.js.map +1 -1
  533. package/dist/src/ui/themes/theme-manager.d.ts +5 -0
  534. package/dist/src/ui/themes/theme-manager.js +9 -3
  535. package/dist/src/ui/themes/theme-manager.js.map +1 -1
  536. package/dist/src/ui/themes/theme-manager.test.js +7 -0
  537. package/dist/src/ui/themes/theme-manager.test.js.map +1 -1
  538. package/dist/src/ui/themes/theme.d.ts +12 -0
  539. package/dist/src/ui/themes/theme.js +34 -4
  540. package/dist/src/ui/themes/theme.js.map +1 -1
  541. package/dist/src/ui/themes/theme.test.js +23 -0
  542. package/dist/src/ui/themes/theme.test.js.map +1 -1
  543. package/dist/src/ui/types.d.ts +23 -4
  544. package/dist/src/ui/types.js +4 -0
  545. package/dist/src/ui/types.js.map +1 -1
  546. package/dist/src/ui/utils/CodeColorizer.js +2 -2
  547. package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
  548. package/dist/src/ui/utils/CodeColorizer.test.js +1 -1
  549. package/dist/src/ui/utils/CodeColorizer.test.js.map +1 -1
  550. package/dist/src/ui/utils/ConsolePatcher.js +1 -0
  551. package/dist/src/ui/utils/ConsolePatcher.js.map +1 -1
  552. package/dist/src/ui/utils/InlineMarkdownRenderer.js +2 -1
  553. package/dist/src/ui/utils/InlineMarkdownRenderer.js.map +1 -1
  554. package/dist/src/ui/utils/MarkdownDisplay.test.js +1 -1
  555. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -1
  556. package/dist/src/ui/utils/clipboardUtils.d.ts +2 -2
  557. package/dist/src/ui/utils/clipboardUtils.js +50 -4
  558. package/dist/src/ui/utils/clipboardUtils.js.map +1 -1
  559. package/dist/src/ui/utils/clipboardUtils.test.js +12 -12
  560. package/dist/src/ui/utils/clipboardUtils.test.js.map +1 -1
  561. package/dist/src/ui/utils/clipboardUtils.windows.test.d.ts +6 -0
  562. package/dist/src/ui/utils/clipboardUtils.windows.test.js +52 -0
  563. package/dist/src/ui/utils/clipboardUtils.windows.test.js.map +1 -0
  564. package/dist/src/ui/utils/commandUtils.js +13 -10
  565. package/dist/src/ui/utils/commandUtils.js.map +1 -1
  566. package/dist/src/ui/utils/commandUtils.test.js +39 -2
  567. package/dist/src/ui/utils/commandUtils.test.js.map +1 -1
  568. package/dist/src/ui/utils/directoryUtils.d.ts +8 -0
  569. package/dist/src/ui/utils/directoryUtils.js +95 -3
  570. package/dist/src/ui/utils/directoryUtils.js.map +1 -1
  571. package/dist/src/ui/utils/directoryUtils.test.js +193 -3
  572. package/dist/src/ui/utils/directoryUtils.test.js.map +1 -1
  573. package/dist/src/ui/utils/highlight.d.ts +3 -2
  574. package/dist/src/ui/utils/highlight.js +46 -36
  575. package/dist/src/ui/utils/highlight.js.map +1 -1
  576. package/dist/src/ui/utils/highlight.test.js +75 -0
  577. package/dist/src/ui/utils/highlight.test.js.map +1 -1
  578. package/dist/src/ui/utils/historyExportUtils.d.ts +21 -0
  579. package/dist/src/ui/utils/historyExportUtils.js +59 -0
  580. package/dist/src/ui/utils/historyExportUtils.js.map +1 -0
  581. package/dist/src/ui/utils/rewindFileOps.d.ts +47 -0
  582. package/dist/src/ui/utils/rewindFileOps.js +190 -0
  583. package/dist/src/ui/utils/rewindFileOps.js.map +1 -0
  584. package/dist/src/ui/utils/rewindFileOps.test.d.ts +6 -0
  585. package/dist/src/ui/utils/rewindFileOps.test.js +375 -0
  586. package/dist/src/ui/utils/rewindFileOps.test.js.map +1 -0
  587. package/dist/src/ui/utils/terminalCapabilityManager.d.ts +41 -0
  588. package/dist/src/ui/utils/terminalCapabilityManager.js +209 -0
  589. package/dist/src/ui/utils/terminalCapabilityManager.js.map +1 -0
  590. package/dist/src/ui/utils/terminalCapabilityManager.test.d.ts +6 -0
  591. package/dist/src/ui/utils/terminalCapabilityManager.test.js +221 -0
  592. package/dist/src/ui/utils/terminalCapabilityManager.test.js.map +1 -0
  593. package/dist/src/ui/utils/terminalSetup.d.ts +1 -1
  594. package/dist/src/ui/utils/terminalSetup.js +21 -6
  595. package/dist/src/ui/utils/terminalSetup.js.map +1 -1
  596. package/dist/src/ui/utils/terminalSetup.test.js +11 -2
  597. package/dist/src/ui/utils/terminalSetup.test.js.map +1 -1
  598. package/dist/src/ui/utils/textUtils.js +9 -1
  599. package/dist/src/ui/utils/textUtils.js.map +1 -1
  600. package/dist/src/ui/utils/textUtils.test.js +12 -1
  601. package/dist/src/ui/utils/textUtils.test.js.map +1 -1
  602. package/dist/src/ui/utils/ui-sizing.js +1 -1
  603. package/dist/src/ui/utils/ui-sizing.js.map +1 -1
  604. package/dist/src/ui/utils/ui-sizing.test.js +2 -2
  605. package/dist/src/ui/utils/ui-sizing.test.js.map +1 -1
  606. package/dist/src/utils/activityLogger.d.ts +47 -0
  607. package/dist/src/utils/activityLogger.js +297 -0
  608. package/dist/src/utils/activityLogger.js.map +1 -0
  609. package/dist/src/utils/cleanup.d.ts +5 -0
  610. package/dist/src/utils/cleanup.js +17 -0
  611. package/dist/src/utils/cleanup.js.map +1 -1
  612. package/dist/src/utils/cleanup.test.js +21 -31
  613. package/dist/src/utils/cleanup.test.js.map +1 -1
  614. package/dist/src/utils/errors.js +9 -10
  615. package/dist/src/utils/errors.js.map +1 -1
  616. package/dist/src/utils/errors.test.js +95 -37
  617. package/dist/src/utils/errors.test.js.map +1 -1
  618. package/dist/src/utils/handleAutoUpdate.test.js +2 -2
  619. package/dist/src/utils/processUtils.d.ts +1 -1
  620. package/dist/src/utils/processUtils.js +1 -1
  621. package/dist/src/utils/processUtils.js.map +1 -1
  622. package/dist/src/utils/readStdin.js +7 -0
  623. package/dist/src/utils/readStdin.js.map +1 -1
  624. package/dist/src/utils/readStdin.test.js +4 -0
  625. package/dist/src/utils/readStdin.test.js.map +1 -1
  626. package/dist/src/utils/readStdin_safety.test.d.ts +6 -0
  627. package/dist/src/utils/readStdin_safety.test.js +68 -0
  628. package/dist/src/utils/readStdin_safety.test.js.map +1 -0
  629. package/dist/src/utils/relaunch.js +3 -1
  630. package/dist/src/utils/relaunch.js.map +1 -1
  631. package/dist/src/utils/relaunch.test.js +13 -7
  632. package/dist/src/utils/relaunch.test.js.map +1 -1
  633. package/dist/src/utils/resolvePath.js +3 -3
  634. package/dist/src/utils/resolvePath.js.map +1 -1
  635. package/dist/src/utils/resolvePath.test.js +3 -0
  636. package/dist/src/utils/resolvePath.test.js.map +1 -1
  637. package/dist/src/utils/sandbox.js +27 -17
  638. package/dist/src/utils/sandbox.js.map +1 -1
  639. package/dist/src/utils/sandbox.test.js +17 -5
  640. package/dist/src/utils/sandbox.test.js.map +1 -1
  641. package/dist/src/utils/sessionCleanup.integration.test.js +2 -2
  642. package/dist/src/utils/sessionCleanup.integration.test.js.map +1 -1
  643. package/dist/src/utils/sessionCleanup.js +16 -4
  644. package/dist/src/utils/sessionCleanup.js.map +1 -1
  645. package/dist/src/utils/sessionCleanup.test.js +18 -68
  646. package/dist/src/utils/sessionCleanup.test.js.map +1 -1
  647. package/dist/src/utils/sessionUtils.d.ts +20 -0
  648. package/dist/src/utils/sessionUtils.js +32 -4
  649. package/dist/src/utils/sessionUtils.js.map +1 -1
  650. package/dist/src/utils/sessionUtils.test.js +3 -3
  651. package/dist/src/utils/sessionUtils.test.js.map +1 -1
  652. package/dist/src/utils/sessions.js +9 -9
  653. package/dist/src/utils/sessions.js.map +1 -1
  654. package/dist/src/utils/sessions.test.js +38 -41
  655. package/dist/src/utils/sessions.test.js.map +1 -1
  656. package/dist/src/utils/settingsUtils.js +0 -5
  657. package/dist/src/utils/settingsUtils.js.map +1 -1
  658. package/dist/src/utils/skillSettings.d.ts +33 -0
  659. package/dist/src/utils/skillSettings.js +101 -0
  660. package/dist/src/utils/skillSettings.js.map +1 -0
  661. package/dist/src/utils/skillUtils.d.ts +29 -0
  662. package/dist/src/utils/skillUtils.js +144 -0
  663. package/dist/src/utils/skillUtils.js.map +1 -0
  664. package/dist/src/utils/skillUtils.test.d.ts +6 -0
  665. package/dist/src/utils/skillUtils.test.js +57 -0
  666. package/dist/src/utils/skillUtils.test.js.map +1 -0
  667. package/dist/src/utils/terminalTheme.d.ts +15 -0
  668. package/dist/src/utils/terminalTheme.js +50 -0
  669. package/dist/src/utils/terminalTheme.js.map +1 -0
  670. package/dist/src/utils/userStartupWarnings.d.ts +2 -1
  671. package/dist/src/utils/userStartupWarnings.js +17 -7
  672. package/dist/src/utils/userStartupWarnings.js.map +1 -1
  673. package/dist/src/utils/userStartupWarnings.test.js +37 -6
  674. package/dist/src/utils/userStartupWarnings.test.js.map +1 -1
  675. package/dist/src/utils/windowTitle.d.ts +13 -4
  676. package/dist/src/utils/windowTitle.js +65 -7
  677. package/dist/src/utils/windowTitle.js.map +1 -1
  678. package/dist/src/utils/windowTitle.test.js +183 -40
  679. package/dist/src/utils/windowTitle.test.js.map +1 -1
  680. package/dist/src/validateNonInterActiveAuth.d.ts +1 -1
  681. package/dist/src/validateNonInterActiveAuth.js +1 -2
  682. package/dist/src/validateNonInterActiveAuth.js.map +1 -1
  683. package/dist/src/zed-integration/fileSystemService.d.ts +3 -3
  684. package/dist/src/zed-integration/fileSystemService.js +5 -7
  685. package/dist/src/zed-integration/fileSystemService.js.map +1 -1
  686. package/dist/src/zed-integration/fileSystemService.test.js +11 -13
  687. package/dist/src/zed-integration/fileSystemService.test.js.map +1 -1
  688. package/dist/src/zed-integration/zedIntegration.d.ts +5 -5
  689. package/dist/src/zed-integration/zedIntegration.js +42 -21
  690. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  691. package/dist/src/zed-integration/zedIntegration.test.js +29 -18
  692. package/dist/src/zed-integration/zedIntegration.test.js.map +1 -1
  693. package/dist/tsconfig.tsbuildinfo +1 -1
  694. package/package.json +5 -4
  695. package/dist/src/commands/extensions/settings.js +0 -111
  696. package/dist/src/commands/extensions/settings.js.map +0 -1
  697. package/dist/src/ui/hooks/useBracketedPaste.d.ts +0 -12
  698. package/dist/src/ui/hooks/useBracketedPaste.js +0 -31
  699. package/dist/src/ui/hooks/useBracketedPaste.js.map +0 -1
  700. package/dist/src/ui/utils/bracketedPaste.d.ts +0 -7
  701. package/dist/src/ui/utils/bracketedPaste.js +0 -15
  702. package/dist/src/ui/utils/bracketedPaste.js.map +0 -1
  703. package/dist/src/ui/utils/kittyProtocolDetector.d.ts +0 -17
  704. package/dist/src/ui/utils/kittyProtocolDetector.js +0 -111
  705. package/dist/src/ui/utils/kittyProtocolDetector.js.map +0 -1
  706. package/dist/src/ui/utils/kittyProtocolDetector.test.js +0 -113
  707. package/dist/src/ui/utils/kittyProtocolDetector.test.js.map +0 -1
  708. package/dist/src/zed-integration/acp.d.ts +0 -41
  709. package/dist/src/zed-integration/acp.js +0 -72
  710. package/dist/src/zed-integration/acp.js.map +0 -1
  711. package/dist/src/zed-integration/acp.test.js +0 -214
  712. package/dist/src/zed-integration/acp.test.js.map +0 -1
  713. package/dist/src/zed-integration/connection.d.ts +0 -28
  714. package/dist/src/zed-integration/connection.js +0 -165
  715. package/dist/src/zed-integration/connection.js.map +0 -1
  716. package/dist/src/zed-integration/connection.test.js +0 -175
  717. package/dist/src/zed-integration/connection.test.js.map +0 -1
  718. package/dist/src/zed-integration/schema.d.ts +0 -11792
  719. package/dist/src/zed-integration/schema.js +0 -311
  720. package/dist/src/zed-integration/schema.js.map +0 -1
  721. /package/dist/src/{ui/utils/kittyProtocolDetector.test.d.ts → config/extension-manager-scope.test.d.ts} +0 -0
  722. /package/dist/src/{zed-integration/acp.test.d.ts → config/extension-manager-skills.test.d.ts} +0 -0
  723. /package/dist/src/{zed-integration/connection.test.d.ts → config/extensions/extensionUpdates.test.d.ts} +0 -0
@@ -7,12 +7,13 @@ import { spawnSync } from 'node:child_process';
7
7
  import fs from 'node:fs';
8
8
  import os from 'node:os';
9
9
  import pathMod from 'node:path';
10
+ import * as path from 'node:path';
10
11
  import { useState, useCallback, useEffect, useMemo, useReducer } from 'react';
11
- import { coreEvents, CoreEvent } from '@google/gemini-cli-core';
12
+ import { coreEvents, CoreEvent, debugLogger, unescapePath, getEditorCommand, isGuiEditor, } from '@google/gemini-cli-core';
12
13
  import { toCodePoints, cpLen, cpSlice, stripUnsafeCharacters, getCachedStringWidth, } from '../../utils/textUtils.js';
13
14
  import { parsePastedPaths } from '../../utils/clipboardUtils.js';
15
+ import { keyMatchers, Command } from '../../keyMatchers.js';
14
16
  import { handleVimAction } from './vim-buffer-actions.js';
15
- import { enableSupportedProtocol } from '../../utils/kittyProtocolDetector.js';
16
17
  // Helper functions for line-based word navigation
17
18
  export const isWordCharStrict = (char) => /[\w\p{L}\p{N}]/u.test(char); // Matches a single character that is any Unicode letter, any Unicode number, or an underscore
18
19
  export const isWhitespace = (char) => /\s/.test(char);
@@ -484,24 +485,136 @@ export function logicalPosToOffset(lines, row, col) {
484
485
  }
485
486
  return offset;
486
487
  }
488
+ export const imagePathRegex = /@((?:\\.|[^\s\r\n\\])+?\.(?:png|jpg|jpeg|gif|webp|svg|bmp))\b/gi;
489
+ export function getTransformedImagePath(filePath) {
490
+ const raw = filePath;
491
+ // Ignore leading @ when stripping directories, but keep it for simple '@file.png'
492
+ const withoutAt = raw.startsWith('@') ? raw.slice(1) : raw;
493
+ // Unescape the path to handle escaped spaces and other characters
494
+ const unescaped = unescapePath(withoutAt);
495
+ // Find last directory separator, supporting both POSIX and Windows styles
496
+ const lastSepIndex = Math.max(unescaped.lastIndexOf('/'), unescaped.lastIndexOf('\\'));
497
+ // If we saw a separator, take the segment after it; otherwise fall back to the unescaped string
498
+ const fileName = lastSepIndex >= 0 ? unescaped.slice(lastSepIndex + 1) : unescaped;
499
+ const extension = path.extname(fileName);
500
+ const baseName = path.basename(fileName, extension);
501
+ const maxBaseLength = 10;
502
+ const truncatedBase = baseName.length > maxBaseLength
503
+ ? `...${baseName.slice(-maxBaseLength)}`
504
+ : baseName;
505
+ return `[Image ${truncatedBase}${extension}]`;
506
+ }
507
+ export function calculateTransformationsForLine(line) {
508
+ const transformations = [];
509
+ let match;
510
+ // Reset regex state to ensure clean matching from start of line
511
+ imagePathRegex.lastIndex = 0;
512
+ while ((match = imagePathRegex.exec(line)) !== null) {
513
+ const logicalText = match[0];
514
+ const logStart = cpLen(line.substring(0, match.index));
515
+ const logEnd = logStart + cpLen(logicalText);
516
+ transformations.push({
517
+ logStart,
518
+ logEnd,
519
+ logicalText,
520
+ collapsedText: getTransformedImagePath(logicalText),
521
+ });
522
+ }
523
+ return transformations;
524
+ }
525
+ export function calculateTransformations(lines) {
526
+ return lines.map((ln) => calculateTransformationsForLine(ln));
527
+ }
528
+ export function getTransformUnderCursor(row, col, spansByLine) {
529
+ const spans = spansByLine[row];
530
+ if (!spans || spans.length === 0)
531
+ return null;
532
+ for (const span of spans) {
533
+ if (col >= span.logStart && col <= span.logEnd) {
534
+ return span;
535
+ }
536
+ if (col < span.logStart)
537
+ break;
538
+ }
539
+ return null;
540
+ }
541
+ export function calculateTransformedLine(logLine, logIndex, logicalCursor, transformations) {
542
+ let transformedLine = '';
543
+ const transformedToLogMap = [];
544
+ let lastLogPos = 0;
545
+ const cursorIsOnThisLine = logIndex === logicalCursor[0];
546
+ const cursorCol = logicalCursor[1];
547
+ for (const transform of transformations) {
548
+ const textBeforeTransformation = cpSlice(logLine, lastLogPos, transform.logStart);
549
+ transformedLine += textBeforeTransformation;
550
+ for (let i = 0; i < cpLen(textBeforeTransformation); i++) {
551
+ transformedToLogMap.push(lastLogPos + i);
552
+ }
553
+ const isExpanded = cursorIsOnThisLine &&
554
+ cursorCol >= transform.logStart &&
555
+ cursorCol <= transform.logEnd;
556
+ const transformedText = isExpanded
557
+ ? transform.logicalText
558
+ : transform.collapsedText;
559
+ transformedLine += transformedText;
560
+ // Map transformed characters back to logical characters
561
+ const transformedLen = cpLen(transformedText);
562
+ if (isExpanded) {
563
+ for (let i = 0; i < transformedLen; i++) {
564
+ transformedToLogMap.push(transform.logStart + i);
565
+ }
566
+ }
567
+ else {
568
+ // Collapsed: distribute transformed positions monotonically across the raw span.
569
+ // This preserves ordering across wrapped slices so logicalToVisualMap has
570
+ // increasing startColInLogical and visual cursor mapping remains consistent.
571
+ const logicalLength = Math.max(0, transform.logEnd - transform.logStart);
572
+ for (let i = 0; i < transformedLen; i++) {
573
+ // Map the i-th transformed code point into [logStart, logEnd)
574
+ const transformationToLogicalOffset = logicalLength === 0
575
+ ? 0
576
+ : Math.floor((i * logicalLength) / transformedLen);
577
+ const transformationToLogicalIndex = transform.logStart +
578
+ Math.min(transformationToLogicalOffset, Math.max(logicalLength - 1, 0));
579
+ transformedToLogMap.push(transformationToLogicalIndex);
580
+ }
581
+ }
582
+ lastLogPos = transform.logEnd;
583
+ }
584
+ // Append text after last transform
585
+ const remainingUntransformedText = cpSlice(logLine, lastLogPos);
586
+ transformedLine += remainingUntransformedText;
587
+ for (let i = 0; i < cpLen(remainingUntransformedText); i++) {
588
+ transformedToLogMap.push(lastLogPos + i);
589
+ }
590
+ // For a cursor at the very end of the transformed line
591
+ transformedToLogMap.push(cpLen(logLine));
592
+ return { transformedLine, transformedToLogMap };
593
+ }
487
594
  // Calculates the visual wrapping of lines and the mapping between logical and visual coordinates.
488
595
  // This is an expensive operation and should be memoized.
489
- function calculateLayout(logicalLines, viewportWidth) {
596
+ function calculateLayout(logicalLines, viewportWidth, logicalCursor) {
490
597
  const visualLines = [];
491
598
  const logicalToVisualMap = [];
492
599
  const visualToLogicalMap = [];
600
+ const transformedToLogicalMaps = [];
601
+ const visualToTransformedMap = [];
493
602
  logicalLines.forEach((logLine, logIndex) => {
494
603
  logicalToVisualMap[logIndex] = [];
495
- if (logLine.length === 0) {
604
+ const transformations = calculateTransformationsForLine(logLine);
605
+ const { transformedLine, transformedToLogMap } = calculateTransformedLine(logLine, logIndex, logicalCursor, transformations);
606
+ transformedToLogicalMaps[logIndex] = transformedToLogMap;
607
+ if (transformedLine.length === 0) {
496
608
  // Handle empty logical line
497
609
  logicalToVisualMap[logIndex].push([visualLines.length, 0]);
498
610
  visualToLogicalMap.push([logIndex, 0]);
611
+ visualToTransformedMap.push(0);
499
612
  visualLines.push('');
500
613
  }
501
614
  else {
502
615
  // Non-empty logical line
503
616
  let currentPosInLogLine = 0; // Tracks position within the current logical line (code point index)
504
- const codePointsInLogLine = toCodePoints(logLine);
617
+ const codePointsInLogLine = toCodePoints(transformedLine);
505
618
  while (currentPosInLogLine < codePointsInLogLine.length) {
506
619
  let currentChunk = '';
507
620
  let currentChunkVisualWidth = 0;
@@ -571,11 +684,13 @@ function calculateLayout(logicalLines, viewportWidth) {
571
684
  currentChunk = codePointsInLogLine[currentPosInLogLine];
572
685
  numCodePointsInChunk = 1;
573
686
  }
687
+ const logicalStartCol = transformedToLogMap[currentPosInLogLine] ?? 0;
574
688
  logicalToVisualMap[logIndex].push([
575
689
  visualLines.length,
576
- currentPosInLogLine,
690
+ logicalStartCol,
577
691
  ]);
578
- visualToLogicalMap.push([logIndex, currentPosInLogLine]);
692
+ visualToLogicalMap.push([logIndex, logicalStartCol]);
693
+ visualToTransformedMap.push(currentPosInLogLine);
579
694
  visualLines.push(currentChunk);
580
695
  const logicalStartOfThisChunk = currentPosInLogLine;
581
696
  currentPosInLogLine += numCodePointsInChunk;
@@ -600,18 +715,21 @@ function calculateLayout(logicalLines, viewportWidth) {
600
715
  logicalToVisualMap[0] = [];
601
716
  logicalToVisualMap[0].push([0, 0]);
602
717
  visualToLogicalMap.push([0, 0]);
718
+ visualToTransformedMap.push(0);
603
719
  }
604
720
  }
605
721
  return {
606
722
  visualLines,
607
723
  logicalToVisualMap,
608
724
  visualToLogicalMap,
725
+ transformedToLogicalMaps,
726
+ visualToTransformedMap,
609
727
  };
610
728
  }
611
729
  // Calculates the visual cursor position based on a pre-calculated layout.
612
730
  // This is a lightweight operation.
613
731
  function calculateVisualCursorFromLayout(layout, logicalCursor) {
614
- const { logicalToVisualMap, visualLines } = layout;
732
+ const { logicalToVisualMap, visualLines, transformedToLogicalMaps } = layout;
615
733
  const [logicalRow, logicalCol] = logicalCursor;
616
734
  const segmentsForLogicalLine = logicalToVisualMap[logicalRow];
617
735
  if (!segmentsForLogicalLine || segmentsForLogicalLine.length === 0) {
@@ -636,9 +754,26 @@ function calculateVisualCursorFromLayout(layout, logicalCursor) {
636
754
  }
637
755
  }
638
756
  const [visualRow, startColInLogical] = segmentsForLogicalLine[targetSegmentIndex];
639
- const visualCol = logicalCol - startColInLogical;
640
- // The visual column should not exceed the length of the visual line.
641
- const clampedVisualCol = Math.min(visualCol, cpLen(visualLines[visualRow] ?? ''));
757
+ // Find the coordinates in transformed space in order to conver to visual
758
+ const transformedToLogicalMap = transformedToLogicalMaps[logicalRow] ?? [];
759
+ let transformedCol = 0;
760
+ for (let i = 0; i < transformedToLogicalMap.length; i++) {
761
+ if (transformedToLogicalMap[i] > logicalCol) {
762
+ transformedCol = Math.max(0, i - 1);
763
+ break;
764
+ }
765
+ if (i === transformedToLogicalMap.length - 1) {
766
+ transformedCol = transformedToLogicalMap.length - 1;
767
+ }
768
+ }
769
+ let startColInTransformed = 0;
770
+ while (startColInTransformed < transformedToLogicalMap.length &&
771
+ transformedToLogicalMap[startColInTransformed] < startColInLogical) {
772
+ startColInTransformed++;
773
+ }
774
+ const clampedTransformedCol = Math.min(transformedCol, Math.max(0, transformedToLogicalMap.length - 1));
775
+ const visualCol = clampedTransformedCol - startColInTransformed;
776
+ const clampedVisualCol = Math.min(Math.max(visualCol, 0), cpLen(visualLines[visualRow] ?? ''));
642
777
  return [visualRow, clampedVisualCol];
643
778
  }
644
779
  const historyLimit = 100;
@@ -828,16 +963,25 @@ function textBufferReducerLogic(state, action, options = {}) {
828
963
  break;
829
964
  default: {
830
965
  const exhaustiveCheck = dir;
831
- console.error(`Unknown visual movement direction: ${exhaustiveCheck}`);
966
+ debugLogger.error(`Unknown visual movement direction: ${exhaustiveCheck}`);
832
967
  return state;
833
968
  }
834
969
  }
835
970
  if (visualToLogicalMap[newVisualRow]) {
836
- const [logRow, logStartCol] = visualToLogicalMap[newVisualRow];
971
+ const [logRow, logicalStartCol] = visualToLogicalMap[newVisualRow];
972
+ const transformedToLogicalMap = visualLayout.transformedToLogicalMaps?.[logRow] ?? [];
973
+ let transformedStartCol = 0;
974
+ while (transformedStartCol < transformedToLogicalMap.length &&
975
+ transformedToLogicalMap[transformedStartCol] < logicalStartCol) {
976
+ transformedStartCol++;
977
+ }
978
+ const clampedTransformedCol = Math.min(transformedStartCol + newVisualCol, Math.max(0, transformedToLogicalMap.length - 1));
979
+ const newLogicalCol = transformedToLogicalMap[clampedTransformedCol] ??
980
+ cpLen(lines[logRow] ?? '');
837
981
  return {
838
982
  ...state,
839
983
  cursorRow: logRow,
840
- cursorCol: clamp(logStartCol + newVisualCol, 0, cpLen(lines[logRow] ?? '')),
984
+ cursorCol: newLogicalCol,
841
985
  preferredCol: newPreferredCol,
842
986
  };
843
987
  }
@@ -1117,32 +1261,51 @@ function textBufferReducerLogic(state, action, options = {}) {
1117
1261
  return handleVimAction(state, action);
1118
1262
  default: {
1119
1263
  const exhaustiveCheck = action;
1120
- console.error(`Unknown action encountered: ${exhaustiveCheck}`);
1264
+ debugLogger.error(`Unknown action encountered: ${exhaustiveCheck}`);
1121
1265
  return state;
1122
1266
  }
1123
1267
  }
1124
1268
  }
1125
1269
  export function textBufferReducer(state, action, options = {}) {
1126
1270
  const newState = textBufferReducerLogic(state, action, options);
1271
+ const newTransformedLines = newState.lines !== state.lines
1272
+ ? calculateTransformations(newState.lines)
1273
+ : state.transformationsByLine;
1274
+ const oldTransform = getTransformUnderCursor(state.cursorRow, state.cursorCol, state.transformationsByLine);
1275
+ const newTransform = getTransformUnderCursor(newState.cursorRow, newState.cursorCol, newTransformedLines);
1276
+ const oldInside = oldTransform !== null;
1277
+ const newInside = newTransform !== null;
1278
+ const movedBetweenTransforms = oldTransform !== newTransform &&
1279
+ (oldTransform !== null || newTransform !== null);
1127
1280
  if (newState.lines !== state.lines ||
1128
- newState.viewportWidth !== state.viewportWidth) {
1281
+ newState.viewportWidth !== state.viewportWidth ||
1282
+ oldInside !== newInside ||
1283
+ movedBetweenTransforms) {
1284
+ const shouldResetPreferred = oldInside !== newInside || movedBetweenTransforms;
1129
1285
  return {
1130
1286
  ...newState,
1131
- visualLayout: calculateLayout(newState.lines, newState.viewportWidth),
1287
+ preferredCol: shouldResetPreferred ? null : newState.preferredCol,
1288
+ visualLayout: calculateLayout(newState.lines, newState.viewportWidth, [
1289
+ newState.cursorRow,
1290
+ newState.cursorCol,
1291
+ ]),
1292
+ transformationsByLine: newTransformedLines,
1132
1293
  };
1133
1294
  }
1134
1295
  return newState;
1135
1296
  }
1136
1297
  // --- End of reducer logic ---
1137
- export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewport, stdin, setRawMode, onChange, isValidPath, shellModeActive = false, inputFilter, singleLine = false, }) {
1298
+ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewport, stdin, setRawMode, onChange, isValidPath, shellModeActive = false, inputFilter, singleLine = false, getPreferredEditor, }) {
1138
1299
  const initialState = useMemo(() => {
1139
1300
  const lines = initialText.split('\n');
1140
1301
  const [initialCursorRow, initialCursorCol] = calculateInitialCursorPosition(lines.length === 0 ? [''] : lines, initialCursorOffset);
1141
- const visualLayout = calculateLayout(lines.length === 0 ? [''] : lines, viewport.width);
1302
+ const transformationsByLine = calculateTransformations(lines.length === 0 ? [''] : lines);
1303
+ const visualLayout = calculateLayout(lines.length === 0 ? [''] : lines, viewport.width, [initialCursorRow, initialCursorCol]);
1142
1304
  return {
1143
1305
  lines: lines.length === 0 ? [''] : lines,
1144
1306
  cursorRow: initialCursorRow,
1145
1307
  cursorCol: initialCursorCol,
1308
+ transformationsByLine,
1146
1309
  preferredCol: null,
1147
1310
  undoStack: [],
1148
1311
  redoStack: [],
@@ -1154,10 +1317,10 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1154
1317
  };
1155
1318
  }, [initialText, initialCursorOffset, viewport.width, viewport.height]);
1156
1319
  const [state, dispatch] = useReducer((s, a) => textBufferReducer(s, a, { inputFilter, singleLine }), initialState);
1157
- const { lines, cursorRow, cursorCol, preferredCol, selectionAnchor, visualLayout, } = state;
1320
+ const { lines, cursorRow, cursorCol, preferredCol, selectionAnchor, visualLayout, transformationsByLine, } = state;
1158
1321
  const text = useMemo(() => lines.join('\n'), [lines]);
1159
1322
  const visualCursor = useMemo(() => calculateVisualCursorFromLayout(visualLayout, [cursorRow, cursorCol]), [visualLayout, cursorRow, cursorCol]);
1160
- const { visualLines, visualToLogicalMap } = visualLayout;
1323
+ const { visualLines, visualToLogicalMap, transformedToLogicalMaps, visualToTransformedMap, } = visualLayout;
1161
1324
  const [visualScrollRow, setVisualScrollRow] = useState(0);
1162
1325
  useEffect(() => {
1163
1326
  if (onChange) {
@@ -1360,19 +1523,32 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1360
1523
  const vimEscapeInsertMode = useCallback(() => {
1361
1524
  dispatch({ type: 'vim_escape_insert_mode' });
1362
1525
  }, []);
1363
- const openInExternalEditor = useCallback(async (opts = {}) => {
1364
- const editor = opts.editor ??
1365
- process.env['VISUAL'] ??
1366
- process.env['EDITOR'] ??
1367
- (process.platform === 'win32' ? 'notepad' : 'vi');
1526
+ const openInExternalEditor = useCallback(async () => {
1368
1527
  const tmpDir = fs.mkdtempSync(pathMod.join(os.tmpdir(), 'gemini-edit-'));
1369
1528
  const filePath = pathMod.join(tmpDir, 'buffer.txt');
1370
1529
  fs.writeFileSync(filePath, text, 'utf8');
1530
+ let command = undefined;
1531
+ const args = [filePath];
1532
+ const preferredEditorType = getPreferredEditor?.();
1533
+ if (!command && preferredEditorType) {
1534
+ command = getEditorCommand(preferredEditorType);
1535
+ if (isGuiEditor(preferredEditorType)) {
1536
+ args.unshift('--wait');
1537
+ }
1538
+ }
1539
+ if (!command) {
1540
+ command =
1541
+ (process.env['VISUAL'] ??
1542
+ process.env['EDITOR'] ??
1543
+ process.platform === 'win32')
1544
+ ? 'notepad'
1545
+ : 'vi';
1546
+ }
1371
1547
  dispatch({ type: 'create_undo_snapshot' });
1372
1548
  const wasRaw = stdin?.isRaw ?? false;
1373
1549
  try {
1374
1550
  setRawMode?.(false);
1375
- const { status, error } = spawnSync(editor, [filePath], {
1551
+ const { status, error } = spawnSync(command, args, {
1376
1552
  stdio: 'inherit',
1377
1553
  });
1378
1554
  if (error)
@@ -1384,10 +1560,9 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1384
1560
  dispatch({ type: 'set_text', payload: newText, pushToUndo: false });
1385
1561
  }
1386
1562
  catch (err) {
1387
- console.error('[useTextBuffer] external editor error', err);
1563
+ coreEvents.emitFeedback('error', '[useTextBuffer] external editor error', err);
1388
1564
  }
1389
1565
  finally {
1390
- enableSupportedProtocol();
1391
1566
  coreEvents.emit(CoreEvent.ExternalEditorClosed);
1392
1567
  if (wasRaw)
1393
1568
  setRawMode?.(true);
@@ -1404,7 +1579,7 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1404
1579
  /* ignore */
1405
1580
  }
1406
1581
  }
1407
- }, [text, stdin, setRawMode]);
1582
+ }, [text, stdin, setRawMode, getPreferredEditor]);
1408
1583
  const handleInput = useCallback((key) => {
1409
1584
  const { sequence: input } = key;
1410
1585
  if (key.paste) {
@@ -1420,50 +1595,33 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1420
1595
  input === '\\r') // VSCode terminal represents shift + enter this way
1421
1596
  )
1422
1597
  newline();
1423
- else if (key.name === 'left' && !key.meta && !key.ctrl)
1598
+ else if (keyMatchers[Command.MOVE_LEFT](key))
1424
1599
  move('left');
1425
- else if (key.ctrl && key.name === 'b')
1426
- move('left');
1427
- else if (key.name === 'right' && !key.meta && !key.ctrl)
1428
- move('right');
1429
- else if (key.ctrl && key.name === 'f')
1600
+ else if (keyMatchers[Command.MOVE_RIGHT](key))
1430
1601
  move('right');
1431
1602
  else if (key.name === 'up')
1432
1603
  move('up');
1433
1604
  else if (key.name === 'down')
1434
1605
  move('down');
1435
- else if ((key.ctrl || key.meta) && key.name === 'left')
1436
- move('wordLeft');
1437
- else if (key.meta && key.name === 'b')
1606
+ else if (keyMatchers[Command.MOVE_WORD_LEFT](key))
1438
1607
  move('wordLeft');
1439
- else if ((key.ctrl || key.meta) && key.name === 'right')
1608
+ else if (keyMatchers[Command.MOVE_WORD_RIGHT](key))
1440
1609
  move('wordRight');
1441
- else if (key.meta && key.name === 'f')
1442
- move('wordRight');
1443
- else if (key.name === 'home')
1444
- move('home');
1445
- else if (key.ctrl && key.name === 'a')
1610
+ else if (keyMatchers[Command.HOME](key))
1446
1611
  move('home');
1447
- else if (key.name === 'end')
1612
+ else if (keyMatchers[Command.END](key))
1448
1613
  move('end');
1449
- else if (key.ctrl && key.name === 'e')
1450
- move('end');
1451
- else if (key.ctrl && key.name === 'w')
1452
- deleteWordLeft();
1453
- else if ((key.meta || key.ctrl) &&
1454
- (key.name === 'backspace' || input === '\x7f'))
1614
+ else if (keyMatchers[Command.DELETE_WORD_BACKWARD](key))
1455
1615
  deleteWordLeft();
1456
- else if ((key.meta || key.ctrl) && key.name === 'delete')
1616
+ else if (keyMatchers[Command.DELETE_WORD_FORWARD](key))
1457
1617
  deleteWordRight();
1458
- else if (key.name === 'backspace' ||
1459
- input === '\x7f' ||
1460
- (key.ctrl && key.name === 'h'))
1618
+ else if (keyMatchers[Command.DELETE_CHAR_LEFT](key))
1461
1619
  backspace();
1462
- else if (key.name === 'delete' || (key.ctrl && key.name === 'd'))
1620
+ else if (keyMatchers[Command.DELETE_CHAR_RIGHT](key))
1463
1621
  del();
1464
- else if (key.ctrl && !key.shift && key.name === 'z')
1622
+ else if (keyMatchers[Command.UNDO](key))
1465
1623
  undo();
1466
- else if (key.ctrl && key.shift && key.name === 'z')
1624
+ else if (keyMatchers[Command.REDO](key))
1467
1625
  redo();
1468
1626
  else if (key.insertable) {
1469
1627
  insert(input, { paste: key.paste });
@@ -1496,12 +1654,16 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1496
1654
  dispatch({ type: 'move_to_offset', payload: { offset } });
1497
1655
  }, []);
1498
1656
  const moveToVisualPosition = useCallback((visRow, visCol) => {
1499
- const { visualLines, visualToLogicalMap } = visualLayout;
1657
+ const { visualLines, visualToLogicalMap, transformedToLogicalMaps, visualToTransformedMap, } = visualLayout;
1500
1658
  // Clamp visRow to valid range
1501
1659
  const clampedVisRow = Math.max(0, Math.min(visRow, visualLines.length - 1));
1502
1660
  const visualLine = visualLines[clampedVisRow] || '';
1503
1661
  if (visualToLogicalMap[clampedVisRow]) {
1504
- const [logRow, logStartCol] = visualToLogicalMap[clampedVisRow];
1662
+ const [logRow] = visualToLogicalMap[clampedVisRow];
1663
+ const transformedToLogicalMap = transformedToLogicalMaps?.[logRow] ?? [];
1664
+ // Where does this visual line begin within the transformed line?
1665
+ const startColInTransformed = visualToTransformedMap?.[clampedVisRow] ?? 0;
1666
+ // Handle wide characters: convert visual X position to character offset
1505
1667
  const codePoints = toCodePoints(visualLine);
1506
1668
  let currentVisX = 0;
1507
1669
  let charOffset = 0;
@@ -1520,8 +1682,10 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1520
1682
  }
1521
1683
  // Clamp charOffset to length
1522
1684
  charOffset = Math.min(charOffset, codePoints.length);
1685
+ // Map character offset through transformations to get logical position
1686
+ const transformedCol = Math.min(startColInTransformed + charOffset, Math.max(0, transformedToLogicalMap.length - 1));
1523
1687
  const newCursorRow = logRow;
1524
- const newCursorCol = logStartCol + charOffset;
1688
+ const newCursorCol = transformedToLogicalMap[transformedCol] ?? cpLen(lines[logRow] ?? '');
1525
1689
  dispatch({
1526
1690
  type: 'set_cursor',
1527
1691
  payload: {
@@ -1531,7 +1695,7 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1531
1695
  },
1532
1696
  });
1533
1697
  }
1534
- }, [visualLayout]);
1698
+ }, [visualLayout, lines]);
1535
1699
  const getOffset = useCallback(() => logicalPosToOffset(lines, cursorRow, cursorCol), [lines, cursorRow, cursorCol]);
1536
1700
  const returnValue = useMemo(() => ({
1537
1701
  lines,
@@ -1544,6 +1708,9 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1544
1708
  visualCursor,
1545
1709
  visualScrollRow,
1546
1710
  visualToLogicalMap,
1711
+ transformedToLogicalMaps,
1712
+ visualToTransformedMap,
1713
+ transformationsByLine,
1547
1714
  setText,
1548
1715
  insert,
1549
1716
  newline,
@@ -1607,6 +1774,10 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1607
1774
  renderedVisualLines,
1608
1775
  visualCursor,
1609
1776
  visualScrollRow,
1777
+ visualToLogicalMap,
1778
+ transformedToLogicalMaps,
1779
+ visualToTransformedMap,
1780
+ transformationsByLine,
1610
1781
  setText,
1611
1782
  insert,
1612
1783
  newline,
@@ -1658,7 +1829,6 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1658
1829
  vimMoveToLastLine,
1659
1830
  vimMoveToLine,
1660
1831
  vimEscapeInsertMode,
1661
- visualToLogicalMap,
1662
1832
  ]);
1663
1833
  return returnValue;
1664
1834
  }