@machina.ai/cell-cli 1.11.0-rc1 → 1.13.0-rc1

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 (538) hide show
  1. package/dist/package.json +12 -10
  2. package/dist/src/commands/extensions/disable.d.ts +1 -1
  3. package/dist/src/commands/extensions/disable.js +15 -7
  4. package/dist/src/commands/extensions/disable.js.map +1 -1
  5. package/dist/src/commands/extensions/enable.d.ts +1 -1
  6. package/dist/src/commands/extensions/enable.js +15 -7
  7. package/dist/src/commands/extensions/enable.js.map +1 -1
  8. package/dist/src/commands/extensions/install.js +14 -3
  9. package/dist/src/commands/extensions/install.js.map +1 -1
  10. package/dist/src/commands/extensions/install.test.js +39 -19
  11. package/dist/src/commands/extensions/install.test.js.map +1 -1
  12. package/dist/src/commands/extensions/link.js +14 -3
  13. package/dist/src/commands/extensions/link.js.map +1 -1
  14. package/dist/src/commands/extensions/list.js +13 -4
  15. package/dist/src/commands/extensions/list.js.map +1 -1
  16. package/dist/src/commands/extensions/uninstall.js +13 -2
  17. package/dist/src/commands/extensions/uninstall.js.map +1 -1
  18. package/dist/src/commands/extensions/update.js +18 -13
  19. package/dist/src/commands/extensions/update.js.map +1 -1
  20. package/dist/src/commands/extensions/validate.d.ts +12 -0
  21. package/dist/src/commands/extensions/validate.js +83 -0
  22. package/dist/src/commands/extensions/validate.js.map +1 -0
  23. package/dist/src/commands/extensions/validate.test.js +93 -0
  24. package/dist/src/commands/extensions/validate.test.js.map +1 -0
  25. package/dist/src/commands/extensions.js +3 -0
  26. package/dist/src/commands/extensions.js.map +1 -1
  27. package/dist/src/commands/mcp/add.test.js +3 -0
  28. package/dist/src/commands/mcp/add.test.js.map +1 -1
  29. package/dist/src/commands/mcp/list.js +10 -3
  30. package/dist/src/commands/mcp/list.js.map +1 -1
  31. package/dist/src/commands/mcp/list.test.js +37 -27
  32. package/dist/src/commands/mcp/list.test.js.map +1 -1
  33. package/dist/src/config/auth.js +0 -5
  34. package/dist/src/config/auth.js.map +1 -1
  35. package/dist/src/config/config.d.ts +6 -3
  36. package/dist/src/config/config.js +65 -80
  37. package/dist/src/config/config.js.map +1 -1
  38. package/dist/src/config/config.test.js +235 -212
  39. package/dist/src/config/config.test.js.map +1 -1
  40. package/dist/src/config/extension-manager.d.ts +63 -0
  41. package/dist/src/config/extension-manager.js +450 -0
  42. package/dist/src/config/extension-manager.js.map +1 -0
  43. package/dist/src/config/extension.d.ts +4 -51
  44. package/dist/src/config/extension.js +1 -535
  45. package/dist/src/config/extension.js.map +1 -1
  46. package/dist/src/config/extension.test.js +525 -201
  47. package/dist/src/config/extension.test.js.map +1 -1
  48. package/dist/src/config/extensions/consent.d.ts +38 -0
  49. package/dist/src/config/extensions/consent.js +123 -0
  50. package/dist/src/config/extensions/consent.js.map +1 -0
  51. package/dist/src/config/extensions/extensionEnablement.d.ts +1 -1
  52. package/dist/src/config/extensions/extensionEnablement.js +4 -3
  53. package/dist/src/config/extensions/extensionEnablement.js.map +1 -1
  54. package/dist/src/config/extensions/extensionEnablement.test.js +10 -10
  55. package/dist/src/config/extensions/extensionEnablement.test.js.map +1 -1
  56. package/dist/src/config/extensions/extensionSettings.d.ts +15 -0
  57. package/dist/src/config/extensions/extensionSettings.js +113 -0
  58. package/dist/src/config/extensions/extensionSettings.js.map +1 -0
  59. package/dist/src/config/extensions/extensionSettings.test.d.ts +6 -0
  60. package/dist/src/config/extensions/extensionSettings.test.js +254 -0
  61. package/dist/src/config/extensions/extensionSettings.test.js.map +1 -0
  62. package/dist/src/config/extensions/github.d.ts +2 -2
  63. package/dist/src/config/extensions/github.js +5 -10
  64. package/dist/src/config/extensions/github.js.map +1 -1
  65. package/dist/src/config/extensions/github.test.js +153 -167
  66. package/dist/src/config/extensions/github.test.js.map +1 -1
  67. package/dist/src/config/extensions/github_fetch.d.ts +1 -1
  68. package/dist/src/config/extensions/github_fetch.js +13 -1
  69. package/dist/src/config/extensions/github_fetch.js.map +1 -1
  70. package/dist/src/config/extensions/github_fetch.test.d.ts +6 -0
  71. package/dist/src/config/extensions/github_fetch.test.js +169 -0
  72. package/dist/src/config/extensions/github_fetch.test.js.map +1 -0
  73. package/dist/src/config/extensions/storage.d.ts +14 -0
  74. package/dist/src/config/extensions/storage.js +32 -0
  75. package/dist/src/config/extensions/storage.js.map +1 -0
  76. package/dist/src/config/extensions/update.d.ts +4 -4
  77. package/dist/src/config/extensions/update.js +39 -39
  78. package/dist/src/config/extensions/update.js.map +1 -1
  79. package/dist/src/config/extensions/update.test.js +72 -74
  80. package/dist/src/config/extensions/update.test.js.map +1 -1
  81. package/dist/src/config/extensions/variableSchema.d.ts +0 -6
  82. package/dist/src/config/extensions/variableSchema.js.map +1 -1
  83. package/dist/src/config/extensions/variables.d.ts +4 -0
  84. package/dist/src/config/extensions/variables.js +6 -0
  85. package/dist/src/config/extensions/variables.js.map +1 -1
  86. package/dist/src/config/keyBindings.d.ts +3 -0
  87. package/dist/src/config/keyBindings.js +30 -8
  88. package/dist/src/config/keyBindings.js.map +1 -1
  89. package/dist/src/config/keyBindings.test.js +17 -0
  90. package/dist/src/config/keyBindings.test.js.map +1 -1
  91. package/dist/src/config/policies/read-only.toml +56 -0
  92. package/dist/src/config/policies/write.toml +63 -0
  93. package/dist/src/config/policies/yolo.toml +31 -0
  94. package/dist/src/config/policy-engine.integration.test.js +41 -38
  95. package/dist/src/config/policy-engine.integration.test.js.map +1 -1
  96. package/dist/src/config/policy.d.ts +2 -2
  97. package/dist/src/config/policy.js +10 -148
  98. package/dist/src/config/policy.js.map +1 -1
  99. package/dist/src/config/sandboxConfig.d.ts +1 -1
  100. package/dist/src/config/sandboxConfig.js +6 -3
  101. package/dist/src/config/sandboxConfig.js.map +1 -1
  102. package/dist/src/config/settings.d.ts +2 -1
  103. package/dist/src/config/settings.js +58 -18
  104. package/dist/src/config/settings.js.map +1 -1
  105. package/dist/src/config/settings.test.js +128 -69
  106. package/dist/src/config/settings.test.js.map +1 -1
  107. package/dist/src/config/settingsSchema.d.ts +170 -28
  108. package/dist/src/config/settingsSchema.js +418 -27
  109. package/dist/src/config/settingsSchema.js.map +1 -1
  110. package/dist/src/config/settingsSchema.test.js +42 -1
  111. package/dist/src/config/settingsSchema.test.js.map +1 -1
  112. package/dist/src/config/trustedFolders.d.ts +1 -1
  113. package/dist/src/config/trustedFolders.js +4 -2
  114. package/dist/src/config/trustedFolders.js.map +1 -1
  115. package/dist/src/core/initializer.js +2 -1
  116. package/dist/src/core/initializer.js.map +1 -1
  117. package/dist/src/gemini.d.ts +1 -1
  118. package/dist/src/gemini.js +46 -16
  119. package/dist/src/gemini.js.map +1 -1
  120. package/dist/src/gemini.test.js +88 -30
  121. package/dist/src/gemini.test.js.map +1 -1
  122. package/dist/src/generated/git-commit.d.ts +2 -2
  123. package/dist/src/generated/git-commit.js +2 -2
  124. package/dist/src/nonInteractiveCli.d.ts +9 -1
  125. package/dist/src/nonInteractiveCli.js +114 -7
  126. package/dist/src/nonInteractiveCli.js.map +1 -1
  127. package/dist/src/nonInteractiveCli.test.js +355 -112
  128. package/dist/src/nonInteractiveCli.test.js.map +1 -1
  129. package/dist/src/services/BuiltinCommandLoader.js +4 -0
  130. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  131. package/dist/src/services/BuiltinCommandLoader.test.js +22 -0
  132. package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -1
  133. package/dist/src/services/FeedbackService.js +2 -2
  134. package/dist/src/services/FeedbackService.js.map +1 -1
  135. package/dist/src/services/McpPromptLoader.js +2 -2
  136. package/dist/src/services/McpPromptLoader.js.map +1 -1
  137. package/dist/src/services/McpPromptLoader.test.js +4 -2
  138. package/dist/src/services/McpPromptLoader.test.js.map +1 -1
  139. package/dist/src/test-utils/async.d.ts +9 -0
  140. package/dist/src/test-utils/async.js +29 -0
  141. package/dist/src/test-utils/async.js.map +1 -0
  142. package/dist/src/test-utils/createExtension.d.ts +3 -1
  143. package/dist/src/test-utils/createExtension.js +3 -3
  144. package/dist/src/test-utils/createExtension.js.map +1 -1
  145. package/dist/src/test-utils/render.d.ts +16 -2
  146. package/dist/src/test-utils/render.js +66 -4
  147. package/dist/src/test-utils/render.js.map +1 -1
  148. package/dist/src/test-utils/render.test.d.ts +6 -0
  149. package/dist/src/test-utils/render.test.js +79 -0
  150. package/dist/src/test-utils/render.test.js.map +1 -0
  151. package/dist/src/ui/App.test.js +1 -1
  152. package/dist/src/ui/App.test.js.map +1 -1
  153. package/dist/src/ui/AppContainer.js +181 -65
  154. package/dist/src/ui/AppContainer.js.map +1 -1
  155. package/dist/src/ui/AppContainer.test.js +505 -147
  156. package/dist/src/ui/AppContainer.test.js.map +1 -1
  157. package/dist/src/ui/IdeIntegrationNudge.js +1 -1
  158. package/dist/src/ui/IdeIntegrationNudge.js.map +1 -1
  159. package/dist/src/ui/auth/ApiAuthDialog.d.ts +14 -0
  160. package/dist/src/ui/auth/ApiAuthDialog.js +26 -0
  161. package/dist/src/ui/auth/ApiAuthDialog.js.map +1 -0
  162. package/dist/src/ui/auth/ApiAuthDialog.test.d.ts +6 -0
  163. package/dist/src/ui/auth/ApiAuthDialog.test.js +91 -0
  164. package/dist/src/ui/auth/ApiAuthDialog.test.js.map +1 -0
  165. package/dist/src/ui/auth/AuthDialog.js +7 -3
  166. package/dist/src/ui/auth/AuthDialog.js.map +1 -1
  167. package/dist/src/ui/auth/useAuth.d.ts +2 -0
  168. package/dist/src/ui/auth/useAuth.js +31 -2
  169. package/dist/src/ui/auth/useAuth.js.map +1 -1
  170. package/dist/src/ui/colors.js +3 -0
  171. package/dist/src/ui/colors.js.map +1 -1
  172. package/dist/src/ui/commands/directoryCommand.js +1 -1
  173. package/dist/src/ui/commands/directoryCommand.js.map +1 -1
  174. package/dist/src/ui/commands/extensionsCommand.js +64 -11
  175. package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
  176. package/dist/src/ui/commands/extensionsCommand.test.js +72 -1
  177. package/dist/src/ui/commands/extensionsCommand.test.js.map +1 -1
  178. package/dist/src/ui/commands/mcpCommand.js +14 -14
  179. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  180. package/dist/src/ui/commands/mcpCommand.test.js +4 -0
  181. package/dist/src/ui/commands/mcpCommand.test.js.map +1 -1
  182. package/dist/src/ui/commands/memoryCommand.js +1 -1
  183. package/dist/src/ui/commands/memoryCommand.js.map +1 -1
  184. package/dist/src/ui/commands/memoryCommand.test.js +3 -1
  185. package/dist/src/ui/commands/memoryCommand.test.js.map +1 -1
  186. package/dist/src/ui/commands/policiesCommand.d.ts +7 -0
  187. package/dist/src/ui/commands/policiesCommand.js +59 -0
  188. package/dist/src/ui/commands/policiesCommand.js.map +1 -0
  189. package/dist/src/ui/commands/policiesCommand.test.d.ts +6 -0
  190. package/dist/src/ui/commands/policiesCommand.test.js +83 -0
  191. package/dist/src/ui/commands/policiesCommand.test.js.map +1 -0
  192. package/dist/src/ui/components/AnsiOutput.test.js +1 -1
  193. package/dist/src/ui/components/AnsiOutput.test.js.map +1 -1
  194. package/dist/src/ui/components/AsciiArt.d.ts +3 -3
  195. package/dist/src/ui/components/AsciiArt.js +3 -3
  196. package/dist/src/ui/components/Composer.js +1 -1
  197. package/dist/src/ui/components/Composer.js.map +1 -1
  198. package/dist/src/ui/components/Composer.test.js +5 -2
  199. package/dist/src/ui/components/Composer.test.js.map +1 -1
  200. package/dist/src/ui/components/ConfigInitDisplay.js +4 -6
  201. package/dist/src/ui/components/ConfigInitDisplay.js.map +1 -1
  202. package/dist/src/ui/components/ConsentPrompt.test.js +18 -8
  203. package/dist/src/ui/components/ConsentPrompt.test.js.map +1 -1
  204. package/dist/src/ui/components/ConsoleSummaryDisplay.js +1 -1
  205. package/dist/src/ui/components/ConsoleSummaryDisplay.js.map +1 -1
  206. package/dist/src/ui/components/ContextSummaryDisplay.test.js +11 -6
  207. package/dist/src/ui/components/ContextSummaryDisplay.test.js.map +1 -1
  208. package/dist/src/ui/components/DetailedMessagesDisplay.js +1 -1
  209. package/dist/src/ui/components/DetailedMessagesDisplay.js.map +1 -1
  210. package/dist/src/ui/components/DialogManager.js +4 -0
  211. package/dist/src/ui/components/DialogManager.js.map +1 -1
  212. package/dist/src/ui/components/FolderTrustDialog.test.js +2 -1
  213. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
  214. package/dist/src/ui/components/Footer.js +4 -3
  215. package/dist/src/ui/components/Footer.js.map +1 -1
  216. package/dist/src/ui/components/Footer.test.js +83 -0
  217. package/dist/src/ui/components/Footer.test.js.map +1 -1
  218. package/dist/src/ui/components/Header.test.js +13 -5
  219. package/dist/src/ui/components/Header.test.js.map +1 -1
  220. package/dist/src/ui/components/Help.test.js +5 -4
  221. package/dist/src/ui/components/Help.test.js.map +1 -1
  222. package/dist/src/ui/components/HistoryItemDisplay.js +1 -1
  223. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  224. package/dist/src/ui/components/InputPrompt.js +27 -8
  225. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  226. package/dist/src/ui/components/InputPrompt.test.js +776 -727
  227. package/dist/src/ui/components/InputPrompt.test.js.map +1 -1
  228. package/dist/src/ui/components/LoadingIndicator.js +2 -2
  229. package/dist/src/ui/components/LoadingIndicator.js.map +1 -1
  230. package/dist/src/ui/components/LoadingIndicator.test.js +28 -15
  231. package/dist/src/ui/components/LoadingIndicator.test.js.map +1 -1
  232. package/dist/src/ui/components/LoopDetectionConfirmation.js +1 -1
  233. package/dist/src/ui/components/LoopDetectionConfirmation.js.map +1 -1
  234. package/dist/src/ui/components/LoopDetectionConfirmation.test.js +2 -2
  235. package/dist/src/ui/components/LoopDetectionConfirmation.test.js.map +1 -1
  236. package/dist/src/ui/components/MainContent.js +15 -4
  237. package/dist/src/ui/components/MainContent.js.map +1 -1
  238. package/dist/src/ui/components/ModelDialog.js +1 -1
  239. package/dist/src/ui/components/ModelDialog.js.map +1 -1
  240. package/dist/src/ui/components/ModelDialog.test.js +23 -13
  241. package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
  242. package/dist/src/ui/components/ModelStatsDisplay.test.js +1 -1
  243. package/dist/src/ui/components/ModelStatsDisplay.test.js.map +1 -1
  244. package/dist/src/ui/components/Notifications.js +38 -5
  245. package/dist/src/ui/components/Notifications.js.map +1 -1
  246. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js +2 -2
  247. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js.map +1 -1
  248. package/dist/src/ui/components/PrepareLabel.test.js +14 -8
  249. package/dist/src/ui/components/PrepareLabel.test.js.map +1 -1
  250. package/dist/src/ui/components/ProQuotaDialog.test.js +14 -6
  251. package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -1
  252. package/dist/src/ui/components/QueuedMessageDisplay.test.js +11 -6
  253. package/dist/src/ui/components/QueuedMessageDisplay.test.js.map +1 -1
  254. package/dist/src/ui/components/SessionSummaryDisplay.test.js +1 -1
  255. package/dist/src/ui/components/SessionSummaryDisplay.test.js.map +1 -1
  256. package/dist/src/ui/components/SettingsDialog.js +32 -25
  257. package/dist/src/ui/components/SettingsDialog.js.map +1 -1
  258. package/dist/src/ui/components/SettingsDialog.test.js +428 -532
  259. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  260. package/dist/src/ui/components/ShellConfirmationDialog.js +1 -1
  261. package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -1
  262. package/dist/src/ui/components/ShellConfirmationDialog.test.js +2 -2
  263. package/dist/src/ui/components/ShellConfirmationDialog.test.js.map +1 -1
  264. package/dist/src/ui/components/StatsDisplay.test.js +1 -1
  265. package/dist/src/ui/components/StatsDisplay.test.js.map +1 -1
  266. package/dist/src/ui/components/SuggestionsDisplay.js +1 -1
  267. package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
  268. package/dist/src/ui/components/ThemeDialog.test.js +2 -2
  269. package/dist/src/ui/components/ThemeDialog.test.js.map +1 -1
  270. package/dist/src/ui/components/ToolStatsDisplay.test.js +1 -1
  271. package/dist/src/ui/components/ToolStatsDisplay.test.js.map +1 -1
  272. package/dist/src/ui/components/messages/CompressionMessage.test.js +25 -17
  273. package/dist/src/ui/components/messages/CompressionMessage.test.js.map +1 -1
  274. package/dist/src/ui/components/messages/DiffRenderer.test.js +1 -1
  275. package/dist/src/ui/components/messages/DiffRenderer.test.js.map +1 -1
  276. package/dist/src/ui/components/messages/InfoMessage.js +1 -1
  277. package/dist/src/ui/components/messages/InfoMessage.js.map +1 -1
  278. package/dist/src/ui/components/messages/Todo.js +27 -5
  279. package/dist/src/ui/components/messages/Todo.js.map +1 -1
  280. package/dist/src/ui/components/messages/Todo.test.js +20 -8
  281. package/dist/src/ui/components/messages/Todo.test.js.map +1 -1
  282. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +1 -1
  283. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  284. package/dist/src/ui/components/messages/ToolGroupMessage.test.js +29 -15
  285. package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -1
  286. package/dist/src/ui/components/messages/WarningMessage.js +2 -2
  287. package/dist/src/ui/components/messages/WarningMessage.js.map +1 -1
  288. package/dist/src/ui/components/shared/BaseSelectionList.test.js +1 -1
  289. package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +1 -1
  290. package/dist/src/ui/components/shared/MaxSizedBox.test.js +43 -22
  291. package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +1 -1
  292. package/dist/src/ui/components/shared/TextInput.d.ts +15 -0
  293. package/dist/src/ui/components/shared/TextInput.js +38 -0
  294. package/dist/src/ui/components/shared/TextInput.js.map +1 -0
  295. package/dist/src/ui/components/shared/TextInput.test.d.ts +6 -0
  296. package/dist/src/ui/components/shared/TextInput.test.js +242 -0
  297. package/dist/src/ui/components/shared/TextInput.test.js.map +1 -0
  298. package/dist/src/ui/components/shared/text-buffer.d.ts +9 -2
  299. package/dist/src/ui/components/shared/text-buffer.js +51 -13
  300. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  301. package/dist/src/ui/components/shared/text-buffer.test.js +385 -202
  302. package/dist/src/ui/components/shared/text-buffer.test.js.map +1 -1
  303. package/dist/src/ui/components/views/ChatList.test.js +7 -4
  304. package/dist/src/ui/components/views/ChatList.test.js.map +1 -1
  305. package/dist/src/ui/components/views/ExtensionsList.d.ts +7 -1
  306. package/dist/src/ui/components/views/ExtensionsList.js +9 -11
  307. package/dist/src/ui/components/views/ExtensionsList.js.map +1 -1
  308. package/dist/src/ui/components/views/ExtensionsList.test.js +43 -22
  309. package/dist/src/ui/components/views/ExtensionsList.test.js.map +1 -1
  310. package/dist/src/ui/components/views/McpStatus.test.js +23 -12
  311. package/dist/src/ui/components/views/McpStatus.test.js.map +1 -1
  312. package/dist/src/ui/contexts/KeypressContext.d.ts +3 -2
  313. package/dist/src/ui/contexts/KeypressContext.js +610 -540
  314. package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
  315. package/dist/src/ui/contexts/KeypressContext.test.js +438 -718
  316. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
  317. package/dist/src/ui/contexts/MouseContext.d.ts +21 -0
  318. package/dist/src/ui/contexts/MouseContext.js +89 -0
  319. package/dist/src/ui/contexts/MouseContext.js.map +1 -0
  320. package/dist/src/ui/contexts/MouseContext.test.d.ts +6 -0
  321. package/dist/src/ui/contexts/MouseContext.test.js +164 -0
  322. package/dist/src/ui/contexts/MouseContext.test.js.map +1 -0
  323. package/dist/src/ui/contexts/SessionContext.test.js +35 -17
  324. package/dist/src/ui/contexts/SessionContext.test.js.map +1 -1
  325. package/dist/src/ui/contexts/UIActionsContext.d.ts +2 -0
  326. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
  327. package/dist/src/ui/contexts/UIStateContext.d.ts +2 -0
  328. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  329. package/dist/src/ui/hooks/atCommandProcessor.js +31 -9
  330. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  331. package/dist/src/ui/hooks/atCommandProcessor.test.js +163 -64
  332. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
  333. package/dist/src/ui/hooks/shellCommandProcessor.test.js +64 -35
  334. package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +1 -1
  335. package/dist/src/ui/hooks/slashCommandProcessor.test.js +193 -165
  336. package/dist/src/ui/hooks/slashCommandProcessor.test.js.map +1 -1
  337. package/dist/src/ui/hooks/useAtCompletion.test.js +16 -5
  338. package/dist/src/ui/hooks/useAtCompletion.test.js.map +1 -1
  339. package/dist/src/ui/hooks/useAutoAcceptIndicator.js +10 -0
  340. package/dist/src/ui/hooks/useAutoAcceptIndicator.js.map +1 -1
  341. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js +32 -1
  342. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js.map +1 -1
  343. package/dist/src/ui/hooks/useCommandCompletion.test.js +66 -64
  344. package/dist/src/ui/hooks/useCommandCompletion.test.js.map +1 -1
  345. package/dist/src/ui/hooks/useConsoleMessages.test.js +26 -9
  346. package/dist/src/ui/hooks/useConsoleMessages.test.js.map +1 -1
  347. package/dist/src/ui/hooks/useEditorSettings.test.js +40 -34
  348. package/dist/src/ui/hooks/useEditorSettings.test.js.map +1 -1
  349. package/dist/src/ui/hooks/useExtensionUpdates.d.ts +14 -5
  350. package/dist/src/ui/hooks/useExtensionUpdates.js +18 -13
  351. package/dist/src/ui/hooks/useExtensionUpdates.js.map +1 -1
  352. package/dist/src/ui/hooks/useExtensionUpdates.test.js +49 -44
  353. package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +1 -1
  354. package/dist/src/ui/hooks/useFlickerDetector.test.js +9 -5
  355. package/dist/src/ui/hooks/useFlickerDetector.test.js.map +1 -1
  356. package/dist/src/ui/hooks/useFocus.test.js +25 -9
  357. package/dist/src/ui/hooks/useFocus.test.js.map +1 -1
  358. package/dist/src/ui/hooks/useFolderTrust.test.js +46 -22
  359. package/dist/src/ui/hooks/useFolderTrust.test.js.map +1 -1
  360. package/dist/src/ui/hooks/useGeminiStream.js +56 -19
  361. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  362. package/dist/src/ui/hooks/useGeminiStream.test.js +260 -411
  363. package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
  364. package/dist/src/ui/hooks/useGitBranchName.js +4 -0
  365. package/dist/src/ui/hooks/useGitBranchName.js.map +1 -1
  366. package/dist/src/ui/hooks/useGitBranchName.test.js +46 -34
  367. package/dist/src/ui/hooks/useGitBranchName.test.js.map +1 -1
  368. package/dist/src/ui/hooks/useHistoryManager.test.js +2 -1
  369. package/dist/src/ui/hooks/useHistoryManager.test.js.map +1 -1
  370. package/dist/src/ui/hooks/useIdeTrustListener.test.js +40 -9
  371. package/dist/src/ui/hooks/useIdeTrustListener.test.js.map +1 -1
  372. package/dist/src/ui/hooks/useInputHistory.test.js +2 -1
  373. package/dist/src/ui/hooks/useInputHistory.test.js.map +1 -1
  374. package/dist/src/ui/hooks/useInputHistoryStore.test.js +2 -1
  375. package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +1 -1
  376. package/dist/src/ui/hooks/useKeypress.test.js +103 -114
  377. package/dist/src/ui/hooks/useKeypress.test.js.map +1 -1
  378. package/dist/src/ui/hooks/useLoadingIndicator.test.js +24 -6
  379. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
  380. package/dist/src/ui/hooks/useMemoryMonitor.test.js +10 -5
  381. package/dist/src/ui/hooks/useMemoryMonitor.test.js.map +1 -1
  382. package/dist/src/ui/hooks/useMessageQueue.test.js +62 -45
  383. package/dist/src/ui/hooks/useMessageQueue.test.js.map +1 -1
  384. package/dist/src/ui/hooks/useModelCommand.test.js +21 -11
  385. package/dist/src/ui/hooks/useModelCommand.test.js.map +1 -1
  386. package/dist/src/ui/hooks/useMouse.d.ts +17 -0
  387. package/dist/src/ui/hooks/useMouse.js +27 -0
  388. package/dist/src/ui/hooks/useMouse.js.map +1 -0
  389. package/dist/src/ui/hooks/useMouse.test.d.ts +6 -0
  390. package/dist/src/ui/hooks/useMouse.test.js +57 -0
  391. package/dist/src/ui/hooks/useMouse.test.js.map +1 -0
  392. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js +2 -2
  393. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js.map +1 -1
  394. package/dist/src/ui/hooks/usePhraseCycler.js +1 -1
  395. package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
  396. package/dist/src/ui/hooks/usePhraseCycler.test.js +109 -106
  397. package/dist/src/ui/hooks/usePhraseCycler.test.js.map +1 -1
  398. package/dist/src/ui/hooks/usePrivacySettings.test.js +26 -6
  399. package/dist/src/ui/hooks/usePrivacySettings.test.js.map +1 -1
  400. package/dist/src/ui/hooks/usePromptCompletion.js +2 -2
  401. package/dist/src/ui/hooks/usePromptCompletion.js.map +1 -1
  402. package/dist/src/ui/hooks/useQuotaAndFallback.js +13 -14
  403. package/dist/src/ui/hooks/useQuotaAndFallback.js.map +1 -1
  404. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +55 -48
  405. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -1
  406. package/dist/src/ui/hooks/useReactToolScheduler.d.ts +8 -1
  407. package/dist/src/ui/hooks/useReactToolScheduler.js +59 -34
  408. package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
  409. package/dist/src/ui/hooks/useReactToolScheduler.test.d.ts +6 -0
  410. package/dist/src/ui/hooks/useReactToolScheduler.test.js +65 -0
  411. package/dist/src/ui/hooks/useReactToolScheduler.test.js.map +1 -0
  412. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js +2 -2
  413. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js.map +1 -1
  414. package/dist/src/ui/hooks/useSelectionList.js +5 -4
  415. package/dist/src/ui/hooks/useSelectionList.js.map +1 -1
  416. package/dist/src/ui/hooks/useSelectionList.test.js +272 -183
  417. package/dist/src/ui/hooks/useSelectionList.test.js.map +1 -1
  418. package/dist/src/ui/hooks/useShellHistory.test.js +52 -20
  419. package/dist/src/ui/hooks/useShellHistory.test.js.map +1 -1
  420. package/dist/src/ui/hooks/useSlashCompletion.js +18 -7
  421. package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
  422. package/dist/src/ui/hooks/useSlashCompletion.test.js +275 -137
  423. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
  424. package/dist/src/ui/hooks/useTimer.test.js +43 -14
  425. package/dist/src/ui/hooks/useTimer.test.js.map +1 -1
  426. package/dist/src/ui/hooks/useToolScheduler.test.js +226 -242
  427. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  428. package/dist/src/ui/hooks/vim.test.js +235 -355
  429. package/dist/src/ui/hooks/vim.test.js.map +1 -1
  430. package/dist/src/ui/keyMatchers.test.js +30 -3
  431. package/dist/src/ui/keyMatchers.test.js.map +1 -1
  432. package/dist/src/ui/state/extensions.d.ts +1 -0
  433. package/dist/src/ui/state/extensions.js +1 -0
  434. package/dist/src/ui/state/extensions.js.map +1 -1
  435. package/dist/src/ui/themes/ansi-light.js +1 -0
  436. package/dist/src/ui/themes/ansi-light.js.map +1 -1
  437. package/dist/src/ui/themes/ansi.js +1 -0
  438. package/dist/src/ui/themes/ansi.js.map +1 -1
  439. package/dist/src/ui/themes/atom-one-dark.js +2 -0
  440. package/dist/src/ui/themes/atom-one-dark.js.map +1 -1
  441. package/dist/src/ui/themes/ayu-light.js +2 -0
  442. package/dist/src/ui/themes/ayu-light.js.map +1 -1
  443. package/dist/src/ui/themes/ayu.js +2 -0
  444. package/dist/src/ui/themes/ayu.js.map +1 -1
  445. package/dist/src/ui/themes/color-utils.d.ts +1 -0
  446. package/dist/src/ui/themes/color-utils.js +6 -0
  447. package/dist/src/ui/themes/color-utils.js.map +1 -1
  448. package/dist/src/ui/themes/color-utils.test.js +13 -1
  449. package/dist/src/ui/themes/color-utils.test.js.map +1 -1
  450. package/dist/src/ui/themes/dracula.js +2 -0
  451. package/dist/src/ui/themes/dracula.js.map +1 -1
  452. package/dist/src/ui/themes/github-dark.js +2 -0
  453. package/dist/src/ui/themes/github-dark.js.map +1 -1
  454. package/dist/src/ui/themes/github-light.js +2 -0
  455. package/dist/src/ui/themes/github-light.js.map +1 -1
  456. package/dist/src/ui/themes/googlecode.js +2 -0
  457. package/dist/src/ui/themes/googlecode.js.map +1 -1
  458. package/dist/src/ui/themes/no-color.js +3 -0
  459. package/dist/src/ui/themes/no-color.js.map +1 -1
  460. package/dist/src/ui/themes/semantic-tokens.d.ts +2 -0
  461. package/dist/src/ui/themes/semantic-tokens.js +6 -0
  462. package/dist/src/ui/themes/semantic-tokens.js.map +1 -1
  463. package/dist/src/ui/themes/shades-of-purple.js +2 -0
  464. package/dist/src/ui/themes/shades-of-purple.js.map +1 -1
  465. package/dist/src/ui/themes/theme.d.ts +3 -0
  466. package/dist/src/ui/themes/theme.js +14 -3
  467. package/dist/src/ui/themes/theme.js.map +1 -1
  468. package/dist/src/ui/themes/theme.test.js +67 -1
  469. package/dist/src/ui/themes/theme.test.js.map +1 -1
  470. package/dist/src/ui/themes/xcode.js +2 -0
  471. package/dist/src/ui/themes/xcode.js.map +1 -1
  472. package/dist/src/ui/types.d.ts +3 -1
  473. package/dist/src/ui/types.js +2 -0
  474. package/dist/src/ui/types.js.map +1 -1
  475. package/dist/src/ui/utils/CodeColorizer.js +2 -1
  476. package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
  477. package/dist/src/ui/utils/InlineMarkdownRenderer.d.ts +1 -0
  478. package/dist/src/ui/utils/InlineMarkdownRenderer.js +11 -10
  479. package/dist/src/ui/utils/InlineMarkdownRenderer.js.map +1 -1
  480. package/dist/src/ui/utils/MarkdownDisplay.js +11 -9
  481. package/dist/src/ui/utils/MarkdownDisplay.js.map +1 -1
  482. package/dist/src/ui/utils/clipboardUtils.js +2 -2
  483. package/dist/src/ui/utils/clipboardUtils.js.map +1 -1
  484. package/dist/src/ui/utils/input.d.ts +17 -0
  485. package/dist/src/ui/utils/input.js +51 -0
  486. package/dist/src/ui/utils/input.js.map +1 -0
  487. package/dist/src/ui/utils/input.test.d.ts +6 -0
  488. package/dist/src/ui/utils/input.test.js +44 -0
  489. package/dist/src/ui/utils/input.test.js.map +1 -0
  490. package/dist/src/ui/utils/kittyProtocolDetector.js +13 -4
  491. package/dist/src/ui/utils/kittyProtocolDetector.js.map +1 -1
  492. package/dist/src/ui/utils/mouse.d.ts +31 -0
  493. package/dist/src/ui/utils/mouse.js +164 -0
  494. package/dist/src/ui/utils/mouse.js.map +1 -0
  495. package/dist/src/ui/utils/mouse.test.d.ts +6 -0
  496. package/dist/src/ui/utils/mouse.test.js +131 -0
  497. package/dist/src/ui/utils/mouse.test.js.map +1 -0
  498. package/dist/src/ui/utils/textOutput.d.ts +25 -0
  499. package/dist/src/ui/utils/textOutput.js +49 -0
  500. package/dist/src/ui/utils/textOutput.js.map +1 -0
  501. package/dist/src/ui/utils/textOutput.test.d.ts +6 -0
  502. package/dist/src/ui/utils/textOutput.test.js +79 -0
  503. package/dist/src/ui/utils/textOutput.test.js.map +1 -0
  504. package/dist/src/ui/utils/updateCheck.d.ts +7 -1
  505. package/dist/src/ui/utils/updateCheck.js +33 -29
  506. package/dist/src/ui/utils/updateCheck.js.map +1 -1
  507. package/dist/src/ui/utils/updateCheck.test.js +24 -50
  508. package/dist/src/ui/utils/updateCheck.test.js.map +1 -1
  509. package/dist/src/utils/commentJson.js +2 -2
  510. package/dist/src/utils/commentJson.js.map +1 -1
  511. package/dist/src/utils/commentJson.test.js +7 -6
  512. package/dist/src/utils/commentJson.test.js.map +1 -1
  513. package/dist/src/utils/envVarResolver.d.ts +2 -2
  514. package/dist/src/utils/envVarResolver.js +10 -7
  515. package/dist/src/utils/envVarResolver.js.map +1 -1
  516. package/dist/src/utils/events.d.ts +11 -2
  517. package/dist/src/utils/events.js +1 -0
  518. package/dist/src/utils/events.js.map +1 -1
  519. package/dist/src/utils/handleAutoUpdate.js +9 -3
  520. package/dist/src/utils/handleAutoUpdate.js.map +1 -1
  521. package/dist/src/utils/sandbox.js +16 -18
  522. package/dist/src/utils/sandbox.js.map +1 -1
  523. package/dist/src/utils/version.js +6 -2
  524. package/dist/src/utils/version.js.map +1 -1
  525. package/dist/src/zed-integration/acp.js +2 -1
  526. package/dist/src/zed-integration/acp.js.map +1 -1
  527. package/dist/src/zed-integration/schema.d.ts +4 -4
  528. package/dist/src/zed-integration/zedIntegration.d.ts +2 -2
  529. package/dist/src/zed-integration/zedIntegration.js +12 -19
  530. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  531. package/dist/tsconfig.tsbuildinfo +1 -1
  532. package/package.json +14 -14
  533. package/dist/src/config/policy.test.js +0 -360
  534. package/dist/src/config/policy.test.js.map +0 -1
  535. package/dist/src/utils/package.d.ts +0 -12
  536. package/dist/src/utils/package.js +0 -24
  537. package/dist/src/utils/package.js.map +0 -1
  538. /package/dist/src/{config/policy.test.d.ts → commands/extensions/validate.test.d.ts} +0 -0
@@ -4,7 +4,9 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { describe, it, expect, vi, beforeEach } from 'vitest';
7
- import { renderHook, act } from '@testing-library/react';
7
+ import { act } from 'react';
8
+ import { renderHook } from '../../test-utils/render.js';
9
+ import { waitFor } from '../../test-utils/async.js';
8
10
  import { useVim } from './vim.js';
9
11
  import { textBufferReducer } from '../components/shared/text-buffer.js';
10
12
  // Mock the VimModeContext
@@ -1006,23 +1008,32 @@ describe('useVim hook', () => {
1006
1008
  });
1007
1009
  });
1008
1010
  describe('Shell command pass-through', () => {
1009
- it('should pass through ctrl+r in INSERT mode', () => {
1011
+ it('should pass through ctrl+r in INSERT mode', async () => {
1010
1012
  mockVimContext.vimMode = 'INSERT';
1011
1013
  const { result } = renderVimHook();
1014
+ await waitFor(() => {
1015
+ expect(result.current.mode).toBe('INSERT');
1016
+ });
1012
1017
  const handled = result.current.handleInput(createKey({ name: 'r', ctrl: true }));
1013
1018
  expect(handled).toBe(false);
1014
1019
  });
1015
- it('should pass through ! in INSERT mode when buffer is empty', () => {
1020
+ it('should pass through ! in INSERT mode when buffer is empty', async () => {
1016
1021
  mockVimContext.vimMode = 'INSERT';
1017
1022
  const emptyBuffer = createMockBuffer('');
1018
1023
  const { result } = renderVimHook(emptyBuffer);
1024
+ await waitFor(() => {
1025
+ expect(result.current.mode).toBe('INSERT');
1026
+ });
1019
1027
  const handled = result.current.handleInput(createKey({ sequence: '!' }));
1020
1028
  expect(handled).toBe(false);
1021
1029
  });
1022
- it('should handle ! as input in INSERT mode when buffer is not empty', () => {
1030
+ it('should handle ! as input in INSERT mode when buffer is not empty', async () => {
1023
1031
  mockVimContext.vimMode = 'INSERT';
1024
1032
  const nonEmptyBuffer = createMockBuffer('not empty');
1025
1033
  const { result } = renderVimHook(nonEmptyBuffer);
1034
+ await waitFor(() => {
1035
+ expect(result.current.mode).toBe('INSERT');
1036
+ });
1026
1037
  const key = createKey({ sequence: '!', name: '!' });
1027
1038
  act(() => {
1028
1039
  result.current.handleInput(key);
@@ -1032,357 +1043,226 @@ describe('useVim hook', () => {
1032
1043
  });
1033
1044
  // Line operations (dd, cc) are tested in text-buffer.test.ts
1034
1045
  describe('Reducer-based integration tests', () => {
1035
- describe('de (delete word end)', () => {
1036
- it('should delete from cursor to end of current word', () => {
1037
- const initialState = createMockTextBufferState({
1038
- lines: ['hello world test'],
1039
- cursorRow: 0,
1040
- cursorCol: 1, // cursor on 'e' in "hello"
1041
- preferredCol: null,
1042
- undoStack: [],
1043
- redoStack: [],
1044
- clipboard: null,
1045
- selectionAnchor: null,
1046
- });
1047
- const result = textBufferReducer(initialState, {
1048
- type: 'vim_delete_word_end',
1049
- payload: { count: 1 },
1050
- });
1051
- // Should delete "ello" (from cursor to end of word), leaving "h world test"
1052
- expect(result.lines).toEqual(['h world test']);
1053
- expect(result.cursorRow).toBe(0);
1054
- expect(result.cursorCol).toBe(1);
1055
- });
1056
- it('should delete multiple word ends with count', () => {
1057
- const initialState = createMockTextBufferState({
1058
- lines: ['hello world test more'],
1059
- cursorRow: 0,
1060
- cursorCol: 1, // cursor on 'e' in "hello"
1061
- preferredCol: null,
1062
- undoStack: [],
1063
- redoStack: [],
1064
- clipboard: null,
1065
- selectionAnchor: null,
1066
- });
1067
- const result = textBufferReducer(initialState, {
1068
- type: 'vim_delete_word_end',
1069
- payload: { count: 2 },
1070
- });
1071
- // Should delete "ello world" (to end of second word), leaving "h test more"
1072
- expect(result.lines).toEqual(['h test more']);
1073
- expect(result.cursorRow).toBe(0);
1074
- expect(result.cursorCol).toBe(1);
1075
- });
1076
- });
1077
- describe('db (delete word backward)', () => {
1078
- it('should delete from cursor to start of previous word', () => {
1079
- const initialState = createMockTextBufferState({
1080
- lines: ['hello world test'],
1081
- cursorRow: 0,
1082
- cursorCol: 11, // cursor on 't' in "test"
1083
- preferredCol: null,
1084
- undoStack: [],
1085
- redoStack: [],
1086
- clipboard: null,
1087
- selectionAnchor: null,
1088
- });
1089
- const result = textBufferReducer(initialState, {
1090
- type: 'vim_delete_word_backward',
1091
- payload: { count: 1 },
1092
- });
1093
- // Should delete "world" (previous word only), leaving "hello test"
1094
- expect(result.lines).toEqual(['hello test']);
1095
- expect(result.cursorRow).toBe(0);
1096
- expect(result.cursorCol).toBe(6);
1097
- });
1098
- it('should delete multiple words backward with count', () => {
1099
- const initialState = createMockTextBufferState({
1100
- lines: ['hello world test more'],
1101
- cursorRow: 0,
1102
- cursorCol: 17, // cursor on 'm' in "more"
1103
- preferredCol: null,
1104
- undoStack: [],
1105
- redoStack: [],
1106
- clipboard: null,
1107
- selectionAnchor: null,
1108
- });
1109
- const result = textBufferReducer(initialState, {
1110
- type: 'vim_delete_word_backward',
1111
- payload: { count: 2 },
1112
- });
1113
- // Should delete "world test " (two words backward), leaving "hello more"
1114
- expect(result.lines).toEqual(['hello more']);
1115
- expect(result.cursorRow).toBe(0);
1116
- expect(result.cursorCol).toBe(6);
1117
- });
1118
- });
1119
- describe('cw (change word forward)', () => {
1120
- it('should delete from cursor to start of next word', () => {
1121
- const initialState = createMockTextBufferState({
1122
- lines: ['hello world test'],
1123
- cursorRow: 0,
1124
- cursorCol: 0, // cursor on 'h' in "hello"
1125
- preferredCol: null,
1126
- undoStack: [],
1127
- redoStack: [],
1128
- clipboard: null,
1129
- selectionAnchor: null,
1130
- });
1131
- const result = textBufferReducer(initialState, {
1132
- type: 'vim_change_word_forward',
1133
- payload: { count: 1 },
1134
- });
1135
- // Should delete "hello " (word + space), leaving "world test"
1136
- expect(result.lines).toEqual(['world test']);
1137
- expect(result.cursorRow).toBe(0);
1138
- expect(result.cursorCol).toBe(0);
1139
- });
1140
- it('should change multiple words with count', () => {
1141
- const initialState = createMockTextBufferState({
1142
- lines: ['hello world test more'],
1143
- cursorRow: 0,
1144
- cursorCol: 0,
1145
- preferredCol: null,
1146
- undoStack: [],
1147
- redoStack: [],
1148
- clipboard: null,
1149
- selectionAnchor: null,
1150
- });
1151
- const result = textBufferReducer(initialState, {
1152
- type: 'vim_change_word_forward',
1153
- payload: { count: 2 },
1154
- });
1155
- // Should delete "hello world " (two words), leaving "test more"
1156
- expect(result.lines).toEqual(['test more']);
1157
- expect(result.cursorRow).toBe(0);
1158
- expect(result.cursorCol).toBe(0);
1159
- });
1160
- });
1161
- describe('ce (change word end)', () => {
1162
- it('should change from cursor to end of current word', () => {
1163
- const initialState = createMockTextBufferState({
1164
- lines: ['hello world test'],
1165
- cursorRow: 0,
1166
- cursorCol: 1, // cursor on 'e' in "hello"
1167
- preferredCol: null,
1168
- undoStack: [],
1169
- redoStack: [],
1170
- clipboard: null,
1171
- selectionAnchor: null,
1172
- });
1173
- const result = textBufferReducer(initialState, {
1174
- type: 'vim_change_word_end',
1175
- payload: { count: 1 },
1176
- });
1177
- // Should delete "ello" (from cursor to end of word), leaving "h world test"
1178
- expect(result.lines).toEqual(['h world test']);
1179
- expect(result.cursorRow).toBe(0);
1180
- expect(result.cursorCol).toBe(1);
1181
- });
1182
- it('should change multiple word ends with count', () => {
1183
- const initialState = createMockTextBufferState({
1184
- lines: ['hello world test'],
1185
- cursorRow: 0,
1186
- cursorCol: 1, // cursor on 'e' in "hello"
1187
- preferredCol: null,
1188
- undoStack: [],
1189
- redoStack: [],
1190
- clipboard: null,
1191
- selectionAnchor: null,
1192
- });
1193
- const result = textBufferReducer(initialState, {
1194
- type: 'vim_change_word_end',
1195
- payload: { count: 2 },
1196
- });
1197
- // Should delete "ello world" (to end of second word), leaving "h test"
1198
- expect(result.lines).toEqual(['h test']);
1199
- expect(result.cursorRow).toBe(0);
1200
- expect(result.cursorCol).toBe(1);
1201
- });
1202
- });
1203
- describe('cb (change word backward)', () => {
1204
- it('should change from cursor to start of previous word', () => {
1205
- const initialState = createMockTextBufferState({
1206
- lines: ['hello world test'],
1207
- cursorRow: 0,
1208
- cursorCol: 11, // cursor on 't' in "test"
1209
- preferredCol: null,
1210
- undoStack: [],
1211
- redoStack: [],
1212
- clipboard: null,
1213
- selectionAnchor: null,
1214
- });
1215
- const result = textBufferReducer(initialState, {
1216
- type: 'vim_change_word_backward',
1217
- payload: { count: 1 },
1218
- });
1219
- // Should delete "world" (previous word only), leaving "hello test"
1220
- expect(result.lines).toEqual(['hello test']);
1221
- expect(result.cursorRow).toBe(0);
1222
- expect(result.cursorCol).toBe(6);
1223
- });
1224
- });
1225
- describe('cc (change line)', () => {
1226
- it('should clear the line and place cursor at the start', () => {
1227
- const initialState = createMockTextBufferState({
1228
- lines: [' hello world'],
1229
- cursorRow: 0,
1230
- cursorCol: 5, // cursor on 'o'
1231
- preferredCol: null,
1232
- undoStack: [],
1233
- redoStack: [],
1234
- clipboard: null,
1235
- selectionAnchor: null,
1236
- });
1237
- const result = textBufferReducer(initialState, {
1238
- type: 'vim_change_line',
1239
- payload: { count: 1 },
1240
- });
1241
- expect(result.lines).toEqual(['']);
1242
- expect(result.cursorRow).toBe(0);
1243
- expect(result.cursorCol).toBe(0);
1244
- });
1245
- });
1246
- describe('dd (delete line)', () => {
1247
- it('should delete the current line', () => {
1248
- const initialState = createMockTextBufferState({
1249
- lines: ['line1', 'line2', 'line3'],
1250
- cursorRow: 1,
1251
- cursorCol: 2,
1252
- preferredCol: null,
1253
- undoStack: [],
1254
- redoStack: [],
1255
- clipboard: null,
1256
- selectionAnchor: null,
1257
- });
1258
- const result = textBufferReducer(initialState, {
1259
- type: 'vim_delete_line',
1260
- payload: { count: 1 },
1261
- });
1262
- expect(result.lines).toEqual(['line1', 'line3']);
1263
- expect(result.cursorRow).toBe(1);
1264
- expect(result.cursorCol).toBe(0);
1265
- });
1266
- it('should delete multiple lines with count', () => {
1267
- const initialState = createMockTextBufferState({
1268
- lines: ['line1', 'line2', 'line3', 'line4'],
1269
- cursorRow: 1,
1270
- cursorCol: 2,
1271
- preferredCol: null,
1272
- undoStack: [],
1273
- redoStack: [],
1274
- clipboard: null,
1275
- selectionAnchor: null,
1276
- });
1277
- const result = textBufferReducer(initialState, {
1278
- type: 'vim_delete_line',
1279
- payload: { count: 2 },
1280
- });
1281
- // Should delete lines 1 and 2
1282
- expect(result.lines).toEqual(['line1', 'line4']);
1283
- expect(result.cursorRow).toBe(1);
1284
- expect(result.cursorCol).toBe(0);
1285
- });
1286
- it('should handle deleting last line', () => {
1287
- const initialState = createMockTextBufferState({
1288
- lines: ['only line'],
1289
- cursorRow: 0,
1290
- cursorCol: 3,
1291
- preferredCol: null,
1292
- undoStack: [],
1293
- redoStack: [],
1294
- clipboard: null,
1295
- selectionAnchor: null,
1296
- });
1297
- const result = textBufferReducer(initialState, {
1298
- type: 'vim_delete_line',
1299
- payload: { count: 1 },
1300
- });
1301
- // Should leave an empty line when deleting the only line
1302
- expect(result.lines).toEqual(['']);
1303
- expect(result.cursorRow).toBe(0);
1304
- expect(result.cursorCol).toBe(0);
1305
- });
1306
- });
1307
- describe('D (delete to end of line)', () => {
1308
- it('should delete from cursor to end of line', () => {
1309
- const initialState = createMockTextBufferState({
1310
- lines: ['hello world test'],
1311
- cursorRow: 0,
1312
- cursorCol: 6, // cursor on 'w' in "world"
1313
- preferredCol: null,
1314
- undoStack: [],
1315
- redoStack: [],
1316
- clipboard: null,
1317
- selectionAnchor: null,
1318
- });
1319
- const result = textBufferReducer(initialState, {
1320
- type: 'vim_delete_to_end_of_line',
1321
- });
1322
- // Should delete "world test", leaving "hello "
1323
- expect(result.lines).toEqual(['hello ']);
1324
- expect(result.cursorRow).toBe(0);
1325
- expect(result.cursorCol).toBe(6);
1326
- });
1327
- it('should handle D at end of line', () => {
1328
- const initialState = createMockTextBufferState({
1329
- lines: ['hello world'],
1330
- cursorRow: 0,
1331
- cursorCol: 11, // cursor at end
1332
- preferredCol: null,
1333
- undoStack: [],
1334
- redoStack: [],
1335
- clipboard: null,
1336
- selectionAnchor: null,
1337
- });
1338
- const result = textBufferReducer(initialState, {
1339
- type: 'vim_delete_to_end_of_line',
1340
- });
1341
- // Should not change anything when at end of line
1342
- expect(result.lines).toEqual(['hello world']);
1343
- expect(result.cursorRow).toBe(0);
1344
- expect(result.cursorCol).toBe(11);
1345
- });
1346
- });
1347
- describe('C (change to end of line)', () => {
1348
- it('should change from cursor to end of line', () => {
1349
- const initialState = createMockTextBufferState({
1350
- lines: ['hello world test'],
1351
- cursorRow: 0,
1352
- cursorCol: 6, // cursor on 'w' in "world"
1353
- preferredCol: null,
1354
- undoStack: [],
1355
- redoStack: [],
1356
- clipboard: null,
1357
- selectionAnchor: null,
1358
- });
1359
- const result = textBufferReducer(initialState, {
1360
- type: 'vim_change_to_end_of_line',
1361
- });
1362
- // Should delete "world test", leaving "hello "
1363
- expect(result.lines).toEqual(['hello ']);
1364
- expect(result.cursorRow).toBe(0);
1365
- expect(result.cursorCol).toBe(6);
1366
- });
1367
- it('should handle C at beginning of line', () => {
1368
- const initialState = createMockTextBufferState({
1369
- lines: ['hello world'],
1370
- cursorRow: 0,
1371
- cursorCol: 0,
1372
- preferredCol: null,
1373
- undoStack: [],
1374
- redoStack: [],
1375
- clipboard: null,
1376
- selectionAnchor: null,
1377
- });
1378
- const result = textBufferReducer(initialState, {
1379
- type: 'vim_change_to_end_of_line',
1380
- });
1381
- // Should delete entire line content
1382
- expect(result.lines).toEqual(['']);
1383
- expect(result.cursorRow).toBe(0);
1384
- expect(result.cursorCol).toBe(0);
1385
- });
1046
+ const testCases = [
1047
+ {
1048
+ command: 'de',
1049
+ desc: 'delete from cursor to end of current word',
1050
+ lines: ['hello world test'],
1051
+ cursorRow: 0,
1052
+ cursorCol: 1,
1053
+ actionType: 'vim_delete_word_end',
1054
+ count: 1,
1055
+ expectedLines: ['h world test'],
1056
+ expectedCursorRow: 0,
1057
+ expectedCursorCol: 1,
1058
+ },
1059
+ {
1060
+ command: 'de',
1061
+ desc: 'delete multiple word ends with count',
1062
+ lines: ['hello world test more'],
1063
+ cursorRow: 0,
1064
+ cursorCol: 1,
1065
+ actionType: 'vim_delete_word_end',
1066
+ count: 2,
1067
+ expectedLines: ['h test more'],
1068
+ expectedCursorRow: 0,
1069
+ expectedCursorCol: 1,
1070
+ },
1071
+ {
1072
+ command: 'db',
1073
+ desc: 'delete from cursor to start of previous word',
1074
+ lines: ['hello world test'],
1075
+ cursorRow: 0,
1076
+ cursorCol: 11,
1077
+ actionType: 'vim_delete_word_backward',
1078
+ count: 1,
1079
+ expectedLines: ['hello test'],
1080
+ expectedCursorRow: 0,
1081
+ expectedCursorCol: 6,
1082
+ },
1083
+ {
1084
+ command: 'db',
1085
+ desc: 'delete multiple words backward with count',
1086
+ lines: ['hello world test more'],
1087
+ cursorRow: 0,
1088
+ cursorCol: 17,
1089
+ actionType: 'vim_delete_word_backward',
1090
+ count: 2,
1091
+ expectedLines: ['hello more'],
1092
+ expectedCursorRow: 0,
1093
+ expectedCursorCol: 6,
1094
+ },
1095
+ {
1096
+ command: 'cw',
1097
+ desc: 'delete from cursor to start of next word',
1098
+ lines: ['hello world test'],
1099
+ cursorRow: 0,
1100
+ cursorCol: 0,
1101
+ actionType: 'vim_change_word_forward',
1102
+ count: 1,
1103
+ expectedLines: ['world test'],
1104
+ expectedCursorRow: 0,
1105
+ expectedCursorCol: 0,
1106
+ },
1107
+ {
1108
+ command: 'cw',
1109
+ desc: 'change multiple words with count',
1110
+ lines: ['hello world test more'],
1111
+ cursorRow: 0,
1112
+ cursorCol: 0,
1113
+ actionType: 'vim_change_word_forward',
1114
+ count: 2,
1115
+ expectedLines: ['test more'],
1116
+ expectedCursorRow: 0,
1117
+ expectedCursorCol: 0,
1118
+ },
1119
+ {
1120
+ command: 'ce',
1121
+ desc: 'change from cursor to end of current word',
1122
+ lines: ['hello world test'],
1123
+ cursorRow: 0,
1124
+ cursorCol: 1,
1125
+ actionType: 'vim_change_word_end',
1126
+ count: 1,
1127
+ expectedLines: ['h world test'],
1128
+ expectedCursorRow: 0,
1129
+ expectedCursorCol: 1,
1130
+ },
1131
+ {
1132
+ command: 'ce',
1133
+ desc: 'change multiple word ends with count',
1134
+ lines: ['hello world test'],
1135
+ cursorRow: 0,
1136
+ cursorCol: 1,
1137
+ actionType: 'vim_change_word_end',
1138
+ count: 2,
1139
+ expectedLines: ['h test'],
1140
+ expectedCursorRow: 0,
1141
+ expectedCursorCol: 1,
1142
+ },
1143
+ {
1144
+ command: 'cb',
1145
+ desc: 'change from cursor to start of previous word',
1146
+ lines: ['hello world test'],
1147
+ cursorRow: 0,
1148
+ cursorCol: 11,
1149
+ actionType: 'vim_change_word_backward',
1150
+ count: 1,
1151
+ expectedLines: ['hello test'],
1152
+ expectedCursorRow: 0,
1153
+ expectedCursorCol: 6,
1154
+ },
1155
+ {
1156
+ command: 'cc',
1157
+ desc: 'clear the line and place cursor at the start',
1158
+ lines: [' hello world'],
1159
+ cursorRow: 0,
1160
+ cursorCol: 5,
1161
+ actionType: 'vim_change_line',
1162
+ count: 1,
1163
+ expectedLines: [''],
1164
+ expectedCursorRow: 0,
1165
+ expectedCursorCol: 0,
1166
+ },
1167
+ {
1168
+ command: 'dd',
1169
+ desc: 'delete the current line',
1170
+ lines: ['line1', 'line2', 'line3'],
1171
+ cursorRow: 1,
1172
+ cursorCol: 2,
1173
+ actionType: 'vim_delete_line',
1174
+ count: 1,
1175
+ expectedLines: ['line1', 'line3'],
1176
+ expectedCursorRow: 1,
1177
+ expectedCursorCol: 0,
1178
+ },
1179
+ {
1180
+ command: 'dd',
1181
+ desc: 'delete multiple lines with count',
1182
+ lines: ['line1', 'line2', 'line3', 'line4'],
1183
+ cursorRow: 1,
1184
+ cursorCol: 2,
1185
+ actionType: 'vim_delete_line',
1186
+ count: 2,
1187
+ expectedLines: ['line1', 'line4'],
1188
+ expectedCursorRow: 1,
1189
+ expectedCursorCol: 0,
1190
+ },
1191
+ {
1192
+ command: 'dd',
1193
+ desc: 'handle deleting last line',
1194
+ lines: ['only line'],
1195
+ cursorRow: 0,
1196
+ cursorCol: 3,
1197
+ actionType: 'vim_delete_line',
1198
+ count: 1,
1199
+ expectedLines: [''],
1200
+ expectedCursorRow: 0,
1201
+ expectedCursorCol: 0,
1202
+ },
1203
+ {
1204
+ command: 'D',
1205
+ desc: 'delete from cursor to end of line',
1206
+ lines: ['hello world test'],
1207
+ cursorRow: 0,
1208
+ cursorCol: 6,
1209
+ actionType: 'vim_delete_to_end_of_line',
1210
+ expectedLines: ['hello '],
1211
+ expectedCursorRow: 0,
1212
+ expectedCursorCol: 6,
1213
+ },
1214
+ {
1215
+ command: 'D',
1216
+ desc: 'handle D at end of line',
1217
+ lines: ['hello world'],
1218
+ cursorRow: 0,
1219
+ cursorCol: 11,
1220
+ actionType: 'vim_delete_to_end_of_line',
1221
+ expectedLines: ['hello world'],
1222
+ expectedCursorRow: 0,
1223
+ expectedCursorCol: 11,
1224
+ },
1225
+ {
1226
+ command: 'C',
1227
+ desc: 'change from cursor to end of line',
1228
+ lines: ['hello world test'],
1229
+ cursorRow: 0,
1230
+ cursorCol: 6,
1231
+ actionType: 'vim_change_to_end_of_line',
1232
+ expectedLines: ['hello '],
1233
+ expectedCursorRow: 0,
1234
+ expectedCursorCol: 6,
1235
+ },
1236
+ {
1237
+ command: 'C',
1238
+ desc: 'handle C at beginning of line',
1239
+ lines: ['hello world'],
1240
+ cursorRow: 0,
1241
+ cursorCol: 0,
1242
+ actionType: 'vim_change_to_end_of_line',
1243
+ expectedLines: [''],
1244
+ expectedCursorRow: 0,
1245
+ expectedCursorCol: 0,
1246
+ },
1247
+ ];
1248
+ it.each(testCases)('$command: should $desc', ({ lines, cursorRow, cursorCol, actionType, count, expectedLines, expectedCursorRow, expectedCursorCol, }) => {
1249
+ const initialState = createMockTextBufferState({
1250
+ lines,
1251
+ cursorRow,
1252
+ cursorCol,
1253
+ preferredCol: null,
1254
+ undoStack: [],
1255
+ redoStack: [],
1256
+ clipboard: null,
1257
+ selectionAnchor: null,
1258
+ });
1259
+ const action = (count
1260
+ ? { type: actionType, payload: { count } }
1261
+ : { type: actionType });
1262
+ const result = textBufferReducer(initialState, action);
1263
+ expect(result.lines).toEqual(expectedLines);
1264
+ expect(result.cursorRow).toBe(expectedCursorRow);
1265
+ expect(result.cursorCol).toBe(expectedCursorCol);
1386
1266
  });
1387
1267
  });
1388
1268
  });