@machina.ai/cell-cli 1.4.0-rc2 → 1.6.1-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 (492) hide show
  1. package/dist/package.json +12 -8
  2. package/dist/src/commands/extensions/disable.d.ts +2 -3
  3. package/dist/src/commands/extensions/disable.js +20 -6
  4. package/dist/src/commands/extensions/disable.js.map +1 -1
  5. package/dist/src/commands/extensions/enable.d.ts +2 -3
  6. package/dist/src/commands/extensions/enable.js +20 -9
  7. package/dist/src/commands/extensions/enable.js.map +1 -1
  8. package/dist/src/commands/extensions/install.d.ts +2 -0
  9. package/dist/src/commands/extensions/install.js +20 -4
  10. package/dist/src/commands/extensions/install.js.map +1 -1
  11. package/dist/src/commands/extensions/install.test.js +80 -3
  12. package/dist/src/commands/extensions/install.test.js.map +1 -1
  13. package/dist/src/commands/extensions/link.js +1 -1
  14. package/dist/src/commands/extensions/link.js.map +1 -1
  15. package/dist/src/commands/extensions/uninstall.js +1 -1
  16. package/dist/src/commands/extensions/uninstall.js.map +1 -1
  17. package/dist/src/commands/extensions/update.js +42 -11
  18. package/dist/src/commands/extensions/update.js.map +1 -1
  19. package/dist/src/config/config.d.ts +2 -1
  20. package/dist/src/config/config.js +33 -16
  21. package/dist/src/config/config.js.map +1 -1
  22. package/dist/src/config/extension.d.ts +10 -14
  23. package/dist/src/config/extension.js +160 -145
  24. package/dist/src/config/extension.js.map +1 -1
  25. package/dist/src/config/extensions/extensionEnablement.d.ts +44 -0
  26. package/dist/src/config/extensions/extensionEnablement.js +161 -0
  27. package/dist/src/config/extensions/extensionEnablement.js.map +1 -0
  28. package/dist/src/config/extensions/extensionEnablement.test.js +261 -0
  29. package/dist/src/config/extensions/extensionEnablement.test.js.map +1 -0
  30. package/dist/src/config/extensions/github.d.ts +29 -0
  31. package/dist/src/config/extensions/github.js +306 -0
  32. package/dist/src/config/extensions/github.js.map +1 -0
  33. package/dist/src/config/extensions/github.test.d.ts +6 -0
  34. package/dist/src/config/extensions/github.test.js +267 -0
  35. package/dist/src/config/extensions/github.test.js.map +1 -0
  36. package/dist/src/config/extensions/update.d.ts +20 -0
  37. package/dist/src/config/extensions/update.js +94 -0
  38. package/dist/src/config/extensions/update.js.map +1 -0
  39. package/dist/src/config/extensions/update.test.d.ts +6 -0
  40. package/dist/src/config/extensions/update.test.js +324 -0
  41. package/dist/src/config/extensions/update.test.js.map +1 -0
  42. package/dist/src/config/extensions/variableSchema.d.ts +8 -0
  43. package/dist/src/config/extensions/variableSchema.js +4 -0
  44. package/dist/src/config/extensions/variableSchema.js.map +1 -1
  45. package/dist/src/config/keyBindings.d.ts +4 -1
  46. package/dist/src/config/keyBindings.js +8 -0
  47. package/dist/src/config/keyBindings.js.map +1 -1
  48. package/dist/src/config/settings.d.ts +3 -0
  49. package/dist/src/config/settings.js +58 -18
  50. package/dist/src/config/settings.js.map +1 -1
  51. package/dist/src/config/settingsSchema.d.ts +121 -12
  52. package/dist/src/config/settingsSchema.js +112 -9
  53. package/dist/src/config/settingsSchema.js.map +1 -1
  54. package/dist/src/config/settingsSchema.test.js +68 -55
  55. package/dist/src/config/settingsSchema.test.js.map +1 -1
  56. package/dist/src/config/trustedFolders.d.ts +1 -1
  57. package/dist/src/config/trustedFolders.js +9 -4
  58. package/dist/src/config/trustedFolders.js.map +1 -1
  59. package/dist/src/config/trustedFolders.test.js +41 -25
  60. package/dist/src/config/trustedFolders.test.js.map +1 -1
  61. package/dist/src/core/auth.d.ts +13 -0
  62. package/dist/src/core/auth.js +27 -0
  63. package/dist/src/core/auth.js.map +1 -0
  64. package/dist/src/core/initializer.d.ts +21 -0
  65. package/dist/src/core/initializer.js +33 -0
  66. package/dist/src/core/initializer.js.map +1 -0
  67. package/dist/src/core/theme.d.ts +12 -0
  68. package/dist/src/core/theme.js +20 -0
  69. package/dist/src/core/theme.js.map +1 -0
  70. package/dist/src/gemini.d.ts +2 -1
  71. package/dist/src/gemini.js +110 -69
  72. package/dist/src/gemini.js.map +1 -1
  73. package/dist/src/gemini.test.js +124 -14
  74. package/dist/src/gemini.test.js.map +1 -1
  75. package/dist/src/generated/git-commit.d.ts +2 -2
  76. package/dist/src/generated/git-commit.js +2 -2
  77. package/dist/src/generated/git-commit.js.map +1 -1
  78. package/dist/src/nonInteractiveCli.js +87 -71
  79. package/dist/src/nonInteractiveCli.js.map +1 -1
  80. package/dist/src/services/BuiltinCommandLoader.test.js +16 -17
  81. package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -1
  82. package/dist/src/services/FeedbackService.d.ts +21 -0
  83. package/dist/src/services/FeedbackService.js +124 -0
  84. package/dist/src/services/FeedbackService.js.map +1 -0
  85. package/dist/src/services/McpPromptLoader.js +43 -8
  86. package/dist/src/services/McpPromptLoader.js.map +1 -1
  87. package/dist/src/services/McpPromptLoader.test.js +228 -1
  88. package/dist/src/services/McpPromptLoader.test.js.map +1 -1
  89. package/dist/src/services/prompt-processors/shellProcessor.js +8 -1
  90. package/dist/src/services/prompt-processors/shellProcessor.js.map +1 -1
  91. package/dist/src/test-utils/createExtension.d.ts +15 -0
  92. package/dist/src/test-utils/createExtension.js +25 -0
  93. package/dist/src/test-utils/createExtension.js.map +1 -0
  94. package/dist/src/test-utils/mockCommandContext.js +2 -0
  95. package/dist/src/test-utils/mockCommandContext.js.map +1 -1
  96. package/dist/src/ui/App.d.ts +1 -10
  97. package/dist/src/ui/App.js +17 -729
  98. package/dist/src/ui/App.js.map +1 -1
  99. package/dist/src/ui/AppContainer.d.ts +17 -0
  100. package/dist/src/ui/AppContainer.js +905 -0
  101. package/dist/src/ui/AppContainer.js.map +1 -0
  102. package/dist/src/ui/AppContainer.test.d.ts +6 -0
  103. package/dist/src/ui/AppContainer.test.js +422 -0
  104. package/dist/src/ui/AppContainer.test.js.map +1 -0
  105. package/dist/src/ui/IdeIntegrationNudge.js +2 -1
  106. package/dist/src/ui/IdeIntegrationNudge.js.map +1 -1
  107. package/dist/src/ui/auth/AuthDialog.d.ts +18 -0
  108. package/dist/src/ui/auth/AuthDialog.js +81 -0
  109. package/dist/src/ui/auth/AuthDialog.js.map +1 -0
  110. package/dist/src/ui/auth/AuthDialog.test.d.ts +6 -0
  111. package/dist/src/ui/auth/AuthDialog.test.js +176 -0
  112. package/dist/src/ui/auth/AuthDialog.test.js.map +1 -0
  113. package/dist/src/ui/{components → auth}/AuthInProgress.js +2 -2
  114. package/dist/src/ui/auth/AuthInProgress.js.map +1 -0
  115. package/dist/src/ui/auth/useAuth.d.ts +15 -0
  116. package/dist/src/ui/auth/useAuth.js +73 -0
  117. package/dist/src/ui/auth/useAuth.js.map +1 -0
  118. package/dist/src/ui/commands/chatCommand.d.ts +2 -0
  119. package/dist/src/ui/commands/chatCommand.js +82 -3
  120. package/dist/src/ui/commands/chatCommand.js.map +1 -1
  121. package/dist/src/ui/commands/corgiCommand.js +1 -0
  122. package/dist/src/ui/commands/corgiCommand.js.map +1 -1
  123. package/dist/src/ui/commands/extensionsCommand.js +86 -16
  124. package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
  125. package/dist/src/ui/commands/ideCommand.js +2 -2
  126. package/dist/src/ui/commands/ideCommand.js.map +1 -1
  127. package/dist/src/ui/commands/mcpCommand.js +1 -1
  128. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  129. package/dist/src/ui/commands/types.d.ts +5 -1
  130. package/dist/src/ui/commands/types.js +0 -1
  131. package/dist/src/ui/commands/types.js.map +1 -1
  132. package/dist/src/ui/components/AboutBox.js +2 -2
  133. package/dist/src/ui/components/AboutBox.js.map +1 -1
  134. package/dist/src/ui/components/AnsiOutput.d.ts +13 -0
  135. package/dist/src/ui/components/AnsiOutput.js +12 -0
  136. package/dist/src/ui/components/AnsiOutput.js.map +1 -0
  137. package/dist/src/ui/components/AnsiOutput.test.d.ts +6 -0
  138. package/dist/src/ui/components/AnsiOutput.test.js +97 -0
  139. package/dist/src/ui/components/AnsiOutput.test.js.map +1 -0
  140. package/dist/src/ui/components/AppHeader.d.ts +10 -0
  141. package/dist/src/ui/components/AppHeader.js +22 -0
  142. package/dist/src/ui/components/AppHeader.js.map +1 -0
  143. package/dist/src/ui/components/AsciiArt.d.ts +3 -3
  144. package/dist/src/ui/components/AsciiArt.js +3 -3
  145. package/dist/src/ui/components/AutoAcceptIndicator.js +4 -4
  146. package/dist/src/ui/components/AutoAcceptIndicator.js.map +1 -1
  147. package/dist/src/ui/components/Composer.d.ts +6 -0
  148. package/dist/src/ui/components/Composer.js +74 -0
  149. package/dist/src/ui/components/Composer.js.map +1 -0
  150. package/dist/src/ui/components/Composer.test.d.ts +6 -0
  151. package/dist/src/ui/components/Composer.test.js +340 -0
  152. package/dist/src/ui/components/Composer.test.js.map +1 -0
  153. package/dist/src/ui/components/ConfigInitDisplay.d.ts +6 -0
  154. package/dist/src/ui/components/ConfigInitDisplay.js +38 -0
  155. package/dist/src/ui/components/ConfigInitDisplay.js.map +1 -0
  156. package/dist/src/ui/components/ConsoleSummaryDisplay.js +2 -2
  157. package/dist/src/ui/components/ConsoleSummaryDisplay.js.map +1 -1
  158. package/dist/src/ui/components/ContextSummaryDisplay.js +3 -3
  159. package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
  160. package/dist/src/ui/components/ContextUsageDisplay.js +2 -2
  161. package/dist/src/ui/components/ContextUsageDisplay.js.map +1 -1
  162. package/dist/src/ui/components/DebugProfiler.js +2 -2
  163. package/dist/src/ui/components/DebugProfiler.js.map +1 -1
  164. package/dist/src/ui/components/DetailedMessagesDisplay.js +7 -7
  165. package/dist/src/ui/components/DetailedMessagesDisplay.js.map +1 -1
  166. package/dist/src/ui/components/DialogManager.d.ts +6 -0
  167. package/dist/src/ui/components/DialogManager.js +85 -0
  168. package/dist/src/ui/components/DialogManager.js.map +1 -0
  169. package/dist/src/ui/components/EditorSettingsDialog.js +5 -5
  170. package/dist/src/ui/components/EditorSettingsDialog.js.map +1 -1
  171. package/dist/src/ui/components/FolderTrustDialog.js +16 -8
  172. package/dist/src/ui/components/FolderTrustDialog.js.map +1 -1
  173. package/dist/src/ui/components/FolderTrustDialog.test.js +18 -8
  174. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
  175. package/dist/src/ui/components/Footer.d.ts +1 -2
  176. package/dist/src/ui/components/Footer.js +6 -2
  177. package/dist/src/ui/components/Footer.js.map +1 -1
  178. package/dist/src/ui/components/GeminiRespondingSpinner.d.ts +5 -0
  179. package/dist/src/ui/components/GeminiRespondingSpinner.js +7 -2
  180. package/dist/src/ui/components/GeminiRespondingSpinner.js.map +1 -1
  181. package/dist/src/ui/components/Header.js +2 -2
  182. package/dist/src/ui/components/Header.js.map +1 -1
  183. package/dist/src/ui/components/Help.d.ts +1 -1
  184. package/dist/src/ui/components/Help.js +9 -6
  185. package/dist/src/ui/components/Help.js.map +1 -1
  186. package/dist/src/ui/components/Help.test.d.ts +6 -0
  187. package/dist/src/ui/components/Help.test.js +57 -0
  188. package/dist/src/ui/components/Help.test.js.map +1 -0
  189. package/dist/src/ui/components/HistoryItemDisplay.d.ts +2 -2
  190. package/dist/src/ui/components/HistoryItemDisplay.js +2 -1
  191. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  192. package/dist/src/ui/components/InputPrompt.d.ts +3 -0
  193. package/dist/src/ui/components/InputPrompt.js +122 -22
  194. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  195. package/dist/src/ui/components/LoadingIndicator.js +2 -2
  196. package/dist/src/ui/components/LoadingIndicator.js.map +1 -1
  197. package/dist/src/ui/components/LoopDetectionConfirmation.d.ts +13 -0
  198. package/dist/src/ui/components/LoopDetectionConfirmation.js +35 -0
  199. package/dist/src/ui/components/LoopDetectionConfirmation.js.map +1 -0
  200. package/dist/src/ui/components/LoopDetectionConfirmation.test.d.ts +6 -0
  201. package/dist/src/ui/components/LoopDetectionConfirmation.test.js +25 -0
  202. package/dist/src/ui/components/LoopDetectionConfirmation.test.js.map +1 -0
  203. package/dist/src/ui/components/MainContent.d.ts +6 -0
  204. package/dist/src/ui/components/MainContent.js +23 -0
  205. package/dist/src/ui/components/MainContent.js.map +1 -0
  206. package/dist/src/ui/components/MemoryUsageDisplay.js +6 -4
  207. package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -1
  208. package/dist/src/ui/components/ModelStatsDisplay.js +7 -7
  209. package/dist/src/ui/components/ModelStatsDisplay.js.map +1 -1
  210. package/dist/src/ui/components/Notifications.d.ts +6 -0
  211. package/dist/src/ui/components/Notifications.js +23 -0
  212. package/dist/src/ui/components/Notifications.js.map +1 -0
  213. package/dist/src/ui/components/PrepareLabel.d.ts +5 -5
  214. package/dist/src/ui/components/PrepareLabel.js +67 -11
  215. package/dist/src/ui/components/PrepareLabel.js.map +1 -1
  216. package/dist/src/ui/components/PrepareLabel.test.d.ts +6 -0
  217. package/dist/src/ui/components/PrepareLabel.test.js +71 -0
  218. package/dist/src/ui/components/PrepareLabel.test.js.map +1 -0
  219. package/dist/src/ui/components/ProQuotaDialog.d.ts +2 -2
  220. package/dist/src/ui/components/ProQuotaDialog.js +3 -3
  221. package/dist/src/ui/components/ProQuotaDialog.js.map +1 -1
  222. package/dist/src/ui/components/ProQuotaDialog.test.js +3 -3
  223. package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -1
  224. package/dist/src/ui/components/QuittingDisplay.d.ts +6 -0
  225. package/dist/src/ui/components/QuittingDisplay.js +20 -0
  226. package/dist/src/ui/components/QuittingDisplay.js.map +1 -0
  227. package/dist/src/ui/components/RatingWidget.d.ts +14 -0
  228. package/dist/src/ui/components/RatingWidget.js +56 -0
  229. package/dist/src/ui/components/RatingWidget.js.map +1 -0
  230. package/dist/src/ui/components/SessionSummaryDisplay.d.ts +4 -0
  231. package/dist/src/ui/components/SessionSummaryDisplay.js +1 -1
  232. package/dist/src/ui/components/SessionSummaryDisplay.js.map +1 -1
  233. package/dist/src/ui/components/SettingsDialog.d.ts +2 -1
  234. package/dist/src/ui/components/SettingsDialog.js +93 -22
  235. package/dist/src/ui/components/SettingsDialog.js.map +1 -1
  236. package/dist/src/ui/components/SettingsDialog.test.js +435 -79
  237. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  238. package/dist/src/ui/components/ShellConfirmationDialog.js +2 -2
  239. package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -1
  240. package/dist/src/ui/components/ShellInputPrompt.d.ts +11 -0
  241. package/dist/src/ui/components/ShellInputPrompt.js +36 -0
  242. package/dist/src/ui/components/ShellInputPrompt.js.map +1 -0
  243. package/dist/src/ui/components/ShellModeIndicator.js +2 -2
  244. package/dist/src/ui/components/ShellModeIndicator.js.map +1 -1
  245. package/dist/src/ui/components/ShowMoreLines.js +2 -2
  246. package/dist/src/ui/components/ShowMoreLines.js.map +1 -1
  247. package/dist/src/ui/components/StatsDisplay.d.ts +4 -0
  248. package/dist/src/ui/components/StatsDisplay.js +10 -7
  249. package/dist/src/ui/components/StatsDisplay.js.map +1 -1
  250. package/dist/src/ui/components/SuggestionsDisplay.d.ts +7 -2
  251. package/dist/src/ui/components/SuggestionsDisplay.js +17 -17
  252. package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
  253. package/dist/src/ui/components/ThemeDialog.js +12 -29
  254. package/dist/src/ui/components/ThemeDialog.js.map +1 -1
  255. package/dist/src/ui/components/ThemeDialog.test.d.ts +6 -0
  256. package/dist/src/ui/components/ThemeDialog.test.js +75 -0
  257. package/dist/src/ui/components/ThemeDialog.test.js.map +1 -0
  258. package/dist/src/ui/components/Tips.js +2 -2
  259. package/dist/src/ui/components/Tips.js.map +1 -1
  260. package/dist/src/ui/components/ToolStatsDisplay.js +4 -4
  261. package/dist/src/ui/components/ToolStatsDisplay.js.map +1 -1
  262. package/dist/src/ui/components/UpdateNotification.js +2 -2
  263. package/dist/src/ui/components/UpdateNotification.js.map +1 -1
  264. package/dist/src/ui/components/WorkspaceMigrationDialog.js +4 -4
  265. package/dist/src/ui/components/WorkspaceMigrationDialog.js.map +1 -1
  266. package/dist/src/ui/components/messages/CompressionMessage.d.ts +1 -2
  267. package/dist/src/ui/components/messages/CompressionMessage.js +37 -8
  268. package/dist/src/ui/components/messages/CompressionMessage.js.map +1 -1
  269. package/dist/src/ui/components/messages/CompressionMessage.test.d.ts +6 -0
  270. package/dist/src/ui/components/messages/CompressionMessage.test.js +160 -0
  271. package/dist/src/ui/components/messages/CompressionMessage.test.js.map +1 -0
  272. package/dist/src/ui/components/messages/DiffRenderer.d.ts +2 -1
  273. package/dist/src/ui/components/messages/DiffRenderer.js +14 -22
  274. package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
  275. package/dist/src/ui/components/messages/ErrorMessage.js +2 -2
  276. package/dist/src/ui/components/messages/ErrorMessage.js.map +1 -1
  277. package/dist/src/ui/components/messages/GeminiMessage.js +2 -2
  278. package/dist/src/ui/components/messages/GeminiMessage.js.map +1 -1
  279. package/dist/src/ui/components/messages/InfoMessage.js +2 -2
  280. package/dist/src/ui/components/messages/InfoMessage.js.map +1 -1
  281. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +31 -19
  282. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  283. package/dist/src/ui/components/messages/ToolGroupMessage.d.ts +3 -2
  284. package/dist/src/ui/components/messages/ToolGroupMessage.js +17 -9
  285. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  286. package/dist/src/ui/components/messages/ToolGroupMessage.test.js +17 -15
  287. package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -1
  288. package/dist/src/ui/components/messages/ToolMessage.d.ts +4 -0
  289. package/dist/src/ui/components/messages/ToolMessage.js +24 -10
  290. package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
  291. package/dist/src/ui/components/messages/ToolMessage.test.js +33 -1
  292. package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -1
  293. package/dist/src/ui/components/messages/UserMessage.js +3 -3
  294. package/dist/src/ui/components/messages/UserMessage.js.map +1 -1
  295. package/dist/src/ui/components/messages/UserShellMessage.js +2 -2
  296. package/dist/src/ui/components/messages/UserShellMessage.js.map +1 -1
  297. package/dist/src/ui/components/shared/EnumSelector.d.ts +18 -0
  298. package/dist/src/ui/components/shared/EnumSelector.js +44 -0
  299. package/dist/src/ui/components/shared/EnumSelector.js.map +1 -0
  300. package/dist/src/ui/components/shared/EnumSelector.test.d.ts +6 -0
  301. package/dist/src/ui/components/shared/EnumSelector.test.js +70 -0
  302. package/dist/src/ui/components/shared/EnumSelector.test.js.map +1 -0
  303. package/dist/src/ui/components/shared/MaxSizedBox.js +2 -2
  304. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
  305. package/dist/src/ui/components/shared/RadioButtonSelect.js +12 -12
  306. package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
  307. package/dist/src/ui/components/shared/ScopeSelector.d.ts +19 -0
  308. package/dist/src/ui/components/shared/ScopeSelector.js +11 -0
  309. package/dist/src/ui/components/shared/ScopeSelector.js.map +1 -0
  310. package/dist/src/ui/components/shared/text-buffer.d.ts +19 -2
  311. package/dist/src/ui/components/shared/text-buffer.js +191 -133
  312. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  313. package/dist/src/ui/components/views/ExtensionsList.d.ts +6 -0
  314. package/dist/src/ui/components/views/ExtensionsList.js +47 -0
  315. package/dist/src/ui/components/views/ExtensionsList.js.map +1 -0
  316. package/dist/src/ui/components/views/ExtensionsList.test.d.ts +6 -0
  317. package/dist/src/ui/components/views/ExtensionsList.test.js +97 -0
  318. package/dist/src/ui/components/views/ExtensionsList.test.js.map +1 -0
  319. package/dist/src/ui/constants.d.ts +1 -0
  320. package/dist/src/ui/constants.js +1 -0
  321. package/dist/src/ui/constants.js.map +1 -1
  322. package/dist/src/ui/contexts/AppContext.d.ts +11 -0
  323. package/dist/src/ui/contexts/AppContext.js +15 -0
  324. package/dist/src/ui/contexts/AppContext.js.map +1 -0
  325. package/dist/src/ui/contexts/ConfigContext.d.ts +9 -0
  326. package/dist/src/ui/contexts/ConfigContext.js +16 -0
  327. package/dist/src/ui/contexts/ConfigContext.js.map +1 -0
  328. package/dist/src/ui/contexts/KeypressContext.d.ts +3 -0
  329. package/dist/src/ui/contexts/KeypressContext.js +51 -2
  330. package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
  331. package/dist/src/ui/contexts/KeypressContext.test.js +173 -1
  332. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
  333. package/dist/src/ui/contexts/UIActionsContext.d.ts +36 -0
  334. package/dist/src/ui/contexts/UIActionsContext.js +20 -0
  335. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -0
  336. package/dist/src/ui/contexts/UIStateContext.d.ts +103 -0
  337. package/dist/src/ui/contexts/UIStateContext.js +15 -0
  338. package/dist/src/ui/contexts/UIStateContext.js.map +1 -0
  339. package/dist/src/ui/hooks/atCommandProcessor.test.js +7 -5
  340. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
  341. package/dist/src/ui/hooks/keyToAnsi.d.ts +15 -0
  342. package/dist/src/ui/hooks/keyToAnsi.js +67 -0
  343. package/dist/src/ui/hooks/keyToAnsi.js.map +1 -0
  344. package/dist/src/ui/hooks/shellCommandProcessor.d.ts +2 -1
  345. package/dist/src/ui/hooks/shellCommandProcessor.js +60 -15
  346. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
  347. package/dist/src/ui/hooks/shellCommandProcessor.test.js +196 -17
  348. package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +1 -1
  349. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +16 -2
  350. package/dist/src/ui/hooks/slashCommandProcessor.js +28 -70
  351. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  352. package/dist/src/ui/hooks/useAutoAcceptIndicator.d.ts +3 -2
  353. package/dist/src/ui/hooks/useAutoAcceptIndicator.js +9 -5
  354. package/dist/src/ui/hooks/useAutoAcceptIndicator.js.map +1 -1
  355. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js +69 -0
  356. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js.map +1 -1
  357. package/dist/src/ui/hooks/useExtensionUpdates.d.ts +12 -0
  358. package/dist/src/ui/hooks/useExtensionUpdates.js +64 -0
  359. package/dist/src/ui/hooks/useExtensionUpdates.js.map +1 -0
  360. package/dist/src/ui/hooks/useExtensionUpdates.test.d.ts +6 -0
  361. package/dist/src/ui/hooks/useExtensionUpdates.test.js +162 -0
  362. package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +1 -0
  363. package/dist/src/ui/hooks/useFolderTrust.d.ts +1 -1
  364. package/dist/src/ui/hooks/useFolderTrust.js +12 -13
  365. package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
  366. package/dist/src/ui/hooks/useGeminiStream.d.ts +11 -1
  367. package/dist/src/ui/hooks/useGeminiStream.js +124 -59
  368. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  369. package/dist/src/ui/hooks/useGitBranchName.js +15 -18
  370. package/dist/src/ui/hooks/useGitBranchName.js.map +1 -1
  371. package/dist/src/ui/hooks/useGitBranchName.test.js +49 -53
  372. package/dist/src/ui/hooks/useGitBranchName.test.js.map +1 -1
  373. package/dist/src/ui/hooks/useIdeTrustListener.js +2 -2
  374. package/dist/src/ui/hooks/useIdeTrustListener.js.map +1 -1
  375. package/dist/src/ui/hooks/useMessageQueue.d.ts +2 -1
  376. package/dist/src/ui/hooks/useMessageQueue.js +5 -3
  377. package/dist/src/ui/hooks/useMessageQueue.js.map +1 -1
  378. package/dist/src/ui/hooks/useMessageQueue.test.js +9 -0
  379. package/dist/src/ui/hooks/useMessageQueue.test.js.map +1 -1
  380. package/dist/src/ui/hooks/useQuotaAndFallback.d.ts +21 -0
  381. package/dist/src/ui/hooks/useQuotaAndFallback.js +122 -0
  382. package/dist/src/ui/hooks/useQuotaAndFallback.js.map +1 -0
  383. package/dist/src/ui/hooks/useQuotaAndFallback.test.d.ts +6 -0
  384. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +267 -0
  385. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -0
  386. package/dist/src/ui/hooks/useReactToolScheduler.d.ts +3 -2
  387. package/dist/src/ui/hooks/useReactToolScheduler.js +23 -17
  388. package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
  389. package/dist/src/ui/hooks/useReverseSearchCompletion.d.ts +1 -1
  390. package/dist/src/ui/hooks/useReverseSearchCompletion.js +67 -20
  391. package/dist/src/ui/hooks/useReverseSearchCompletion.js.map +1 -1
  392. package/dist/src/ui/hooks/useSlashCompletion.d.ts +1 -1
  393. package/dist/src/ui/hooks/useSlashCompletion.js +16 -3
  394. package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
  395. package/dist/src/ui/hooks/useSlashCompletion.test.js +169 -270
  396. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
  397. package/dist/src/ui/hooks/useThemeCommand.d.ts +1 -1
  398. package/dist/src/ui/hooks/useThemeCommand.js +3 -14
  399. package/dist/src/ui/hooks/useThemeCommand.js.map +1 -1
  400. package/dist/src/ui/hooks/useToolScheduler.test.js +12 -5
  401. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  402. package/dist/src/ui/keyMatchers.test.js +8 -0
  403. package/dist/src/ui/keyMatchers.test.js.map +1 -1
  404. package/dist/src/ui/privacy/CloudFreePrivacyNotice.js +8 -8
  405. package/dist/src/ui/privacy/CloudFreePrivacyNotice.js.map +1 -1
  406. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.js +2 -2
  407. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.js.map +1 -1
  408. package/dist/src/ui/privacy/GeminiPrivacyNotice.js +2 -2
  409. package/dist/src/ui/privacy/GeminiPrivacyNotice.js.map +1 -1
  410. package/dist/src/ui/state/extensions.d.ts +15 -0
  411. package/dist/src/ui/state/extensions.js +17 -0
  412. package/dist/src/ui/state/extensions.js.map +1 -0
  413. package/dist/src/ui/themes/ayu.js +1 -1
  414. package/dist/src/ui/themes/dracula.js +2 -2
  415. package/dist/src/ui/themes/github-dark.js +1 -1
  416. package/dist/src/ui/themes/theme.js +17 -17
  417. package/dist/src/ui/themes/theme.js.map +1 -1
  418. package/dist/src/ui/types.d.ts +29 -3
  419. package/dist/src/ui/types.js +11 -0
  420. package/dist/src/ui/types.js.map +1 -1
  421. package/dist/src/ui/utils/CodeColorizer.js +3 -2
  422. package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
  423. package/dist/src/ui/utils/InlineMarkdownRenderer.js +7 -7
  424. package/dist/src/ui/utils/InlineMarkdownRenderer.js.map +1 -1
  425. package/dist/src/ui/utils/MarkdownDisplay.js +10 -10
  426. package/dist/src/ui/utils/MarkdownDisplay.js.map +1 -1
  427. package/dist/src/ui/utils/MarkdownDisplay.test.js +6 -2
  428. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -1
  429. package/dist/src/ui/utils/TableRenderer.js +4 -4
  430. package/dist/src/ui/utils/TableRenderer.js.map +1 -1
  431. package/dist/src/ui/utils/clipboardUtils.js +5 -6
  432. package/dist/src/ui/utils/clipboardUtils.js.map +1 -1
  433. package/dist/src/ui/utils/displayUtils.js +4 -4
  434. package/dist/src/ui/utils/displayUtils.js.map +1 -1
  435. package/dist/src/ui/utils/highlight.d.ts +1 -1
  436. package/dist/src/ui/utils/highlight.js +15 -6
  437. package/dist/src/ui/utils/highlight.js.map +1 -1
  438. package/dist/src/ui/utils/highlight.test.js +56 -29
  439. package/dist/src/ui/utils/highlight.test.js.map +1 -1
  440. package/dist/src/ui/utils/kittyProtocolDetector.js +39 -29
  441. package/dist/src/ui/utils/kittyProtocolDetector.js.map +1 -1
  442. package/dist/src/ui/utils/textUtils.d.ts +9 -0
  443. package/dist/src/ui/utils/textUtils.js +52 -3
  444. package/dist/src/ui/utils/textUtils.js.map +1 -1
  445. package/dist/src/utils/commands.d.ts +20 -0
  446. package/dist/src/utils/commands.js +53 -0
  447. package/dist/src/utils/commands.js.map +1 -0
  448. package/dist/src/utils/commands.test.d.ts +6 -0
  449. package/dist/src/utils/commands.test.js +115 -0
  450. package/dist/src/utils/commands.test.js.map +1 -0
  451. package/dist/src/utils/commentJson.d.ts +9 -0
  452. package/dist/src/utils/commentJson.js +48 -0
  453. package/dist/src/utils/commentJson.js.map +1 -0
  454. package/dist/src/utils/commentJson.test.d.ts +6 -0
  455. package/dist/src/utils/commentJson.test.js +146 -0
  456. package/dist/src/utils/commentJson.test.js.map +1 -0
  457. package/dist/src/utils/errors.d.ts +21 -0
  458. package/dist/src/utils/errors.js +93 -0
  459. package/dist/src/utils/errors.js.map +1 -1
  460. package/dist/src/utils/errors.test.d.ts +6 -0
  461. package/dist/src/utils/errors.test.js +303 -0
  462. package/dist/src/utils/errors.test.js.map +1 -0
  463. package/dist/src/utils/processUtils.d.ts +13 -0
  464. package/dist/src/utils/processUtils.js +18 -0
  465. package/dist/src/utils/processUtils.js.map +1 -0
  466. package/dist/src/utils/processUtils.test.d.ts +6 -0
  467. package/dist/src/utils/processUtils.test.js +20 -0
  468. package/dist/src/utils/processUtils.test.js.map +1 -0
  469. package/dist/src/utils/sandbox.d.ts +1 -1
  470. package/dist/src/utils/sandbox.js +19 -8
  471. package/dist/src/utils/sandbox.js.map +1 -1
  472. package/dist/src/utils/settingsUtils.d.ts +16 -6
  473. package/dist/src/utils/settingsUtils.js +35 -25
  474. package/dist/src/utils/settingsUtils.js.map +1 -1
  475. package/dist/src/utils/settingsUtils.test.js +455 -158
  476. package/dist/src/utils/settingsUtils.test.js.map +1 -1
  477. package/dist/src/zed-integration/schema.d.ts +596 -596
  478. package/dist/src/zed-integration/zedIntegration.js +10 -7
  479. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  480. package/dist/tsconfig.tsbuildinfo +1 -1
  481. package/package.json +13 -9
  482. package/dist/src/ui/components/AuthDialog.d.ts +0 -16
  483. package/dist/src/ui/components/AuthDialog.js +0 -62
  484. package/dist/src/ui/components/AuthDialog.js.map +0 -1
  485. package/dist/src/ui/components/AuthDialog.test.js +0 -175
  486. package/dist/src/ui/components/AuthDialog.test.js.map +0 -1
  487. package/dist/src/ui/components/AuthInProgress.js.map +0 -1
  488. package/dist/src/ui/hooks/useAuthCommand.d.ts +0 -15
  489. package/dist/src/ui/hooks/useAuthCommand.js +0 -68
  490. package/dist/src/ui/hooks/useAuthCommand.js.map +0 -1
  491. /package/dist/src/{ui/components/AuthDialog.test.d.ts → config/extensions/extensionEnablement.test.d.ts} +0 -0
  492. /package/dist/src/ui/{components → auth}/AuthInProgress.d.ts +0 -0
@@ -24,17 +24,36 @@ import { render } from 'ink-testing-library';
24
24
  import { waitFor } from '@testing-library/react';
25
25
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
26
26
  import { SettingsDialog } from './SettingsDialog.js';
27
- import { LoadedSettings } from '../../config/settings.js';
27
+ import { LoadedSettings, SettingScope } from '../../config/settings.js';
28
28
  import { VimModeProvider } from '../contexts/VimModeContext.js';
29
29
  import { KeypressProvider } from '../contexts/KeypressContext.js';
30
+ import { act } from 'react';
31
+ import { saveModifiedSettings, TEST_ONLY } from '../../utils/settingsUtils.js';
32
+ import { getSettingsSchema, } from '../../config/settingsSchema.js';
30
33
  // Mock the VimModeContext
31
34
  const mockToggleVimEnabled = vi.fn();
32
35
  const mockSetVimMode = vi.fn();
36
+ var TerminalKeys;
37
+ (function (TerminalKeys) {
38
+ TerminalKeys["ENTER"] = "\r";
39
+ TerminalKeys["TAB"] = "\t";
40
+ TerminalKeys["UP_ARROW"] = "\u001B[A";
41
+ TerminalKeys["DOWN_ARROW"] = "\u001B[B";
42
+ TerminalKeys["LEFT_ARROW"] = "\u001B[D";
43
+ TerminalKeys["RIGHT_ARROW"] = "\u001B[C";
44
+ TerminalKeys["ESCAPE"] = "\u001B";
45
+ })(TerminalKeys || (TerminalKeys = {}));
33
46
  const createMockSettings = (userSettings = {}, systemSettings = {}, workspaceSettings = {}) => new LoadedSettings({
34
47
  settings: { ui: { customThemes: {} }, mcpServers: {}, ...systemSettings },
48
+ originalSettings: {
49
+ ui: { customThemes: {} },
50
+ mcpServers: {},
51
+ ...systemSettings,
52
+ },
35
53
  path: '/system/settings.json',
36
54
  }, {
37
55
  settings: {},
56
+ originalSettings: {},
38
57
  path: '/system/system-defaults.json',
39
58
  }, {
40
59
  settings: {
@@ -42,6 +61,11 @@ const createMockSettings = (userSettings = {}, systemSettings = {}, workspaceSet
42
61
  mcpServers: {},
43
62
  ...userSettings,
44
63
  },
64
+ originalSettings: {
65
+ ui: { customThemes: {} },
66
+ mcpServers: {},
67
+ ...userSettings,
68
+ },
45
69
  path: '/user/settings.json',
46
70
  }, {
47
71
  settings: {
@@ -49,28 +73,18 @@ const createMockSettings = (userSettings = {}, systemSettings = {}, workspaceSet
49
73
  mcpServers: {},
50
74
  ...workspaceSettings,
51
75
  },
76
+ originalSettings: {
77
+ ui: { customThemes: {} },
78
+ mcpServers: {},
79
+ ...workspaceSettings,
80
+ },
52
81
  path: '/workspace/settings.json',
53
82
  }, true, new Set());
54
- vi.mock('../contexts/SettingsContext.js', async () => {
55
- const actual = await vi.importActual('../contexts/SettingsContext.js');
56
- let settings = createMockSettings({ 'a.string.setting': 'initial' });
83
+ vi.mock('../../config/settingsSchema.js', async (importOriginal) => {
84
+ const original = await importOriginal();
57
85
  return {
58
- ...actual,
59
- useSettings: () => ({
60
- settings,
61
- setSetting: (key, value) => {
62
- settings = createMockSettings({ [key]: value });
63
- },
64
- getSettingDefinition: (key) => {
65
- if (key === 'a.string.setting') {
66
- return {
67
- type: 'string',
68
- description: 'A string setting',
69
- };
70
- }
71
- return undefined;
72
- },
73
- }),
86
+ ...original,
87
+ getSettingsSchema: vi.fn(original.getSettingsSchema),
74
88
  };
75
89
  });
76
90
  vi.mock('../contexts/VimModeContext.js', async () => {
@@ -114,7 +128,6 @@ vi.mock('../../utils/settingsUtils.js', async () => {
114
128
  describe('SettingsDialog', () => {
115
129
  const wait = (ms = 50) => new Promise((resolve) => setTimeout(resolve, ms));
116
130
  beforeEach(() => {
117
- vi.clearAllMocks();
118
131
  // Reset keypress mock state (variables are commented out)
119
132
  // currentKeypressHandler = null;
120
133
  // isKeypressActive = false;
@@ -123,37 +136,15 @@ describe('SettingsDialog', () => {
123
136
  mockToggleVimEnabled.mockResolvedValue(true);
124
137
  });
125
138
  afterEach(() => {
139
+ TEST_ONLY.clearFlattenedSchema();
140
+ vi.clearAllMocks();
141
+ vi.resetAllMocks();
126
142
  // Reset keypress mock state (variables are commented out)
127
143
  // currentKeypressHandler = null;
128
144
  // isKeypressActive = false;
129
145
  // console.log = originalConsoleLog;
130
146
  // console.error = originalConsoleError;
131
147
  });
132
- const createMockSettings = (userSettings = {}, systemSettings = {}, workspaceSettings = {}) => new LoadedSettings({
133
- settings: {
134
- ui: { customThemes: {} },
135
- mcpServers: {},
136
- ...systemSettings,
137
- },
138
- path: '/system/settings.json',
139
- }, {
140
- settings: {},
141
- path: '/system/system-defaults.json',
142
- }, {
143
- settings: {
144
- ui: { customThemes: {} },
145
- mcpServers: {},
146
- ...userSettings,
147
- },
148
- path: '/user/settings.json',
149
- }, {
150
- settings: {
151
- ui: { customThemes: {} },
152
- mcpServers: {},
153
- ...workspaceSettings,
154
- },
155
- path: '/workspace/settings.json',
156
- }, true, new Set());
157
148
  describe('Initial Rendering', () => {
158
149
  it('should render the settings dialog with default state', () => {
159
150
  const settings = createMockSettings();
@@ -164,6 +155,15 @@ describe('SettingsDialog', () => {
164
155
  expect(output).toContain('Apply To');
165
156
  expect(output).toContain('Use Enter to select, Tab to change focus');
166
157
  });
158
+ it('should accept availableTerminalHeight prop without errors', () => {
159
+ const settings = createMockSettings();
160
+ const onSelect = vi.fn();
161
+ const { lastFrame } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect, availableTerminalHeight: 20 }) }));
162
+ const output = lastFrame();
163
+ // Should still render properly with the height prop
164
+ expect(output).toContain('Settings');
165
+ expect(output).toContain('Use Enter to select');
166
+ });
167
167
  it('should show settings list with default values', () => {
168
168
  const settings = createMockSettings();
169
169
  const onSelect = vi.fn();
@@ -185,10 +185,12 @@ describe('SettingsDialog', () => {
185
185
  it('should navigate down with arrow key', async () => {
186
186
  const settings = createMockSettings();
187
187
  const onSelect = vi.fn();
188
- const { stdin, unmount } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
188
+ const { stdin, unmount, lastFrame } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
189
189
  // Press down arrow
190
- stdin.write('\u001B[B'); // Down arrow
191
- await wait();
190
+ act(() => {
191
+ stdin.write(TerminalKeys.DOWN_ARROW); // Down arrow
192
+ });
193
+ expect(lastFrame()).toContain('● Disable Auto Update');
192
194
  // The active index should have changed (tested indirectly through behavior)
193
195
  unmount();
194
196
  });
@@ -197,9 +199,9 @@ describe('SettingsDialog', () => {
197
199
  const onSelect = vi.fn();
198
200
  const { stdin, unmount } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
199
201
  // First go down, then up
200
- stdin.write('\u001B[B'); // Down arrow
202
+ stdin.write(TerminalKeys.DOWN_ARROW); // Down arrow
201
203
  await wait();
202
- stdin.write('\u001B[A'); // Up arrow
204
+ stdin.write(TerminalKeys.UP_ARROW);
203
205
  await wait();
204
206
  unmount();
205
207
  });
@@ -214,27 +216,128 @@ describe('SettingsDialog', () => {
214
216
  await wait();
215
217
  unmount();
216
218
  });
217
- it('should not navigate beyond bounds', async () => {
219
+ it('wraps around when at the top of the list', async () => {
218
220
  const settings = createMockSettings();
219
221
  const onSelect = vi.fn();
220
- const { stdin, unmount } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
222
+ const { stdin, unmount, lastFrame } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
221
223
  // Try to go up from first item
222
- stdin.write('\u001B[A'); // Up arrow
224
+ act(() => {
225
+ stdin.write(TerminalKeys.UP_ARROW);
226
+ });
223
227
  await wait();
224
- // Should still be on first item
228
+ expect(lastFrame()).toContain('● Folder Trust');
225
229
  unmount();
226
230
  });
227
231
  });
228
232
  describe('Settings Toggling', () => {
229
233
  it('should toggle setting with Enter key', async () => {
234
+ vi.mocked(saveModifiedSettings).mockClear();
230
235
  const settings = createMockSettings();
231
236
  const onSelect = vi.fn();
232
- const { stdin, unmount } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
237
+ const component = (_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
238
+ const { stdin, unmount } = render(component);
233
239
  // Press Enter to toggle current setting
234
- stdin.write('\u000D'); // Enter key
240
+ stdin.write(TerminalKeys.DOWN_ARROW);
235
241
  await wait();
242
+ stdin.write(TerminalKeys.ENTER);
243
+ await wait();
244
+ // Wait for the mock to be called with more generous timeout for Windows
245
+ await waitFor(() => {
246
+ expect(vi.mocked(saveModifiedSettings)).toHaveBeenCalled();
247
+ }, { timeout: 1000 });
248
+ expect(vi.mocked(saveModifiedSettings)).toHaveBeenCalledWith(new Set(['general.disableAutoUpdate']), {
249
+ general: {
250
+ disableAutoUpdate: true,
251
+ },
252
+ }, expect.any(LoadedSettings), SettingScope.User);
236
253
  unmount();
237
254
  });
255
+ describe('enum values', () => {
256
+ let StringEnum;
257
+ (function (StringEnum) {
258
+ StringEnum["FOO"] = "foo";
259
+ StringEnum["BAR"] = "bar";
260
+ StringEnum["BAZ"] = "baz";
261
+ })(StringEnum || (StringEnum = {}));
262
+ const SETTING = {
263
+ type: 'enum',
264
+ label: 'Theme',
265
+ options: [
266
+ {
267
+ label: 'Foo',
268
+ value: StringEnum.FOO,
269
+ },
270
+ {
271
+ label: 'Bar',
272
+ value: StringEnum.BAR,
273
+ },
274
+ {
275
+ label: 'Baz',
276
+ value: StringEnum.BAZ,
277
+ },
278
+ ],
279
+ category: 'UI',
280
+ requiresRestart: false,
281
+ default: StringEnum.BAR,
282
+ description: 'The color theme for the UI.',
283
+ showInDialog: true,
284
+ };
285
+ const FAKE_SCHEMA = {
286
+ ui: {
287
+ showInDialog: false,
288
+ properties: {
289
+ theme: {
290
+ ...SETTING,
291
+ },
292
+ },
293
+ },
294
+ };
295
+ it('toggles enum values with the enter key', async () => {
296
+ vi.mocked(saveModifiedSettings).mockClear();
297
+ vi.mocked(getSettingsSchema).mockReturnValue(FAKE_SCHEMA);
298
+ const settings = createMockSettings();
299
+ const onSelect = vi.fn();
300
+ const component = (_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
301
+ const { stdin, unmount } = render(component);
302
+ // Press Enter to toggle current setting
303
+ stdin.write(TerminalKeys.DOWN_ARROW);
304
+ await wait();
305
+ stdin.write(TerminalKeys.ENTER);
306
+ await wait();
307
+ await waitFor(() => {
308
+ expect(vi.mocked(saveModifiedSettings)).toHaveBeenCalled();
309
+ }, { timeout: 1000 });
310
+ expect(vi.mocked(saveModifiedSettings)).toHaveBeenCalledWith(new Set(['ui.theme']), {
311
+ ui: {
312
+ theme: StringEnum.BAZ,
313
+ },
314
+ }, expect.any(LoadedSettings), SettingScope.User);
315
+ unmount();
316
+ });
317
+ it('loops back when reaching the end of an enum', async () => {
318
+ vi.mocked(saveModifiedSettings).mockClear();
319
+ vi.mocked(getSettingsSchema).mockReturnValue(FAKE_SCHEMA);
320
+ const settings = createMockSettings();
321
+ settings.setValue(SettingScope.User, 'ui.theme', StringEnum.BAZ);
322
+ const onSelect = vi.fn();
323
+ const component = (_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
324
+ const { stdin, unmount } = render(component);
325
+ // Press Enter to toggle current setting
326
+ stdin.write(TerminalKeys.DOWN_ARROW);
327
+ await wait();
328
+ stdin.write(TerminalKeys.ENTER);
329
+ await wait();
330
+ await waitFor(() => {
331
+ expect(vi.mocked(saveModifiedSettings)).toHaveBeenCalled();
332
+ }, { timeout: 1000 });
333
+ expect(vi.mocked(saveModifiedSettings)).toHaveBeenCalledWith(new Set(['ui.theme']), {
334
+ ui: {
335
+ theme: StringEnum.FOO,
336
+ },
337
+ }, expect.any(LoadedSettings), SettingScope.User);
338
+ unmount();
339
+ });
340
+ });
238
341
  it('should toggle setting with Space key', async () => {
239
342
  const settings = createMockSettings();
240
343
  const onSelect = vi.fn();
@@ -250,7 +353,7 @@ describe('SettingsDialog', () => {
250
353
  const { stdin, unmount } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
251
354
  // Navigate to vim mode setting and toggle it
252
355
  // This would require knowing the exact position, so we'll just test that the mock is called
253
- stdin.write('\u000D'); // Enter key
356
+ stdin.write(TerminalKeys.ENTER); // Enter key
254
357
  await wait();
255
358
  // The mock should potentially be called if vim mode was toggled
256
359
  unmount();
@@ -262,7 +365,7 @@ describe('SettingsDialog', () => {
262
365
  const onSelect = vi.fn();
263
366
  const { stdin, unmount } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
264
367
  // Switch to scope focus
265
- stdin.write('\t'); // Tab key
368
+ stdin.write(TerminalKeys.TAB); // Tab key
266
369
  await wait();
267
370
  // Select different scope (numbers 1-3 typically available)
268
371
  stdin.write('2'); // Select second scope option
@@ -329,7 +432,7 @@ describe('SettingsDialog', () => {
329
432
  const onSelect = vi.fn();
330
433
  const { stdin, unmount } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
331
434
  // Switch to scope selector
332
- stdin.write('\t'); // Tab
435
+ stdin.write(TerminalKeys.TAB); // Tab
333
436
  await wait();
334
437
  // Change scope
335
438
  stdin.write('2'); // Select workspace scope
@@ -355,7 +458,7 @@ describe('SettingsDialog', () => {
355
458
  const onSelect = vi.fn();
356
459
  const { stdin, unmount } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
357
460
  // Try to toggle a setting (this might trigger vim mode toggle)
358
- stdin.write('\u000D'); // Enter
461
+ stdin.write(TerminalKeys.ENTER); // Enter
359
462
  await wait();
360
463
  // Should not crash
361
464
  unmount();
@@ -367,12 +470,12 @@ describe('SettingsDialog', () => {
367
470
  const onSelect = vi.fn();
368
471
  const { stdin, unmount } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
369
472
  // Toggle a setting
370
- stdin.write('\u000D'); // Enter
473
+ stdin.write(TerminalKeys.ENTER); // Enter
371
474
  await wait();
372
475
  // Toggle another setting
373
- stdin.write('\u001B[B'); // Down
476
+ stdin.write(TerminalKeys.DOWN_ARROW); // Down
374
477
  await wait();
375
- stdin.write('\u000D'); // Enter
478
+ stdin.write(TerminalKeys.ENTER); // Enter
376
479
  await wait();
377
480
  // Should track multiple modified settings
378
481
  unmount();
@@ -383,7 +486,7 @@ describe('SettingsDialog', () => {
383
486
  const { stdin, unmount } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
384
487
  // Navigate down many times to test scrolling
385
488
  for (let i = 0; i < 10; i++) {
386
- stdin.write('\u001B[B'); // Down arrow
489
+ stdin.write(TerminalKeys.DOWN_ARROW); // Down arrow
387
490
  await wait(10);
388
491
  }
389
492
  unmount();
@@ -396,7 +499,7 @@ describe('SettingsDialog', () => {
396
499
  const { stdin, unmount } = render(_jsx(VimModeProvider, { settings: settings, children: _jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }) }));
397
500
  // Navigate to and toggle vim mode setting
398
501
  // This would require knowing the exact position of vim mode setting
399
- stdin.write('\u000D'); // Enter
502
+ stdin.write(TerminalKeys.ENTER); // Enter
400
503
  await wait();
401
504
  unmount();
402
505
  });
@@ -417,7 +520,7 @@ describe('SettingsDialog', () => {
417
520
  const onSelect = vi.fn();
418
521
  const { stdin, unmount } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
419
522
  // Toggle a non-restart-required setting (like hideTips)
420
- stdin.write('\u000D'); // Enter - toggle current setting
523
+ stdin.write(TerminalKeys.ENTER); // Enter - toggle current setting
421
524
  await wait();
422
525
  // Should save immediately without showing restart prompt
423
526
  unmount();
@@ -469,8 +572,8 @@ describe('SettingsDialog', () => {
469
572
  const { stdin, unmount } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
470
573
  // Rapid navigation
471
574
  for (let i = 0; i < 5; i++) {
472
- stdin.write('\u001B[B'); // Down arrow
473
- stdin.write('\u001B[A'); // Up arrow
575
+ stdin.write(TerminalKeys.DOWN_ARROW);
576
+ stdin.write(TerminalKeys.UP_ARROW);
474
577
  }
475
578
  await wait(100);
476
579
  // Should not crash
@@ -501,9 +604,9 @@ describe('SettingsDialog', () => {
501
604
  const onSelect = vi.fn();
502
605
  const { stdin, unmount } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
503
606
  // Try to navigate when potentially at bounds
504
- stdin.write('\u001B[B'); // Down
607
+ stdin.write(TerminalKeys.DOWN_ARROW);
505
608
  await wait();
506
- stdin.write('\u001B[A'); // Up
609
+ stdin.write(TerminalKeys.UP_ARROW);
507
610
  await wait();
508
611
  unmount();
509
612
  });
@@ -565,17 +668,17 @@ describe('SettingsDialog', () => {
565
668
  const onSelect = vi.fn();
566
669
  const { stdin, unmount } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
567
670
  // Toggle first setting (should require restart)
568
- stdin.write('\u000D'); // Enter
671
+ stdin.write(TerminalKeys.ENTER); // Enter
569
672
  await wait();
570
673
  // Navigate to next setting and toggle it (should not require restart - e.g., vimMode)
571
- stdin.write('\u001B[B'); // Down
674
+ stdin.write(TerminalKeys.DOWN_ARROW); // Down
572
675
  await wait();
573
- stdin.write('\u000D'); // Enter
676
+ stdin.write(TerminalKeys.ENTER); // Enter
574
677
  await wait();
575
678
  // Navigate to another setting and toggle it (should also require restart)
576
- stdin.write('\u001B[B'); // Down
679
+ stdin.write(TerminalKeys.DOWN_ARROW); // Down
577
680
  await wait();
578
- stdin.write('\u000D'); // Enter
681
+ stdin.write(TerminalKeys.ENTER); // Enter
579
682
  await wait();
580
683
  // The test verifies that all changes are preserved and the dialog still works
581
684
  // This tests the fix for the bug where changing one setting would reset all pending changes
@@ -586,13 +689,13 @@ describe('SettingsDialog', () => {
586
689
  const onSelect = vi.fn();
587
690
  const { stdin, unmount } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
588
691
  // Multiple scope changes
589
- stdin.write('\t'); // Tab to scope
692
+ stdin.write(TerminalKeys.TAB); // Tab to scope
590
693
  await wait();
591
694
  stdin.write('2'); // Workspace
592
695
  await wait();
593
- stdin.write('\t'); // Tab to settings
696
+ stdin.write(TerminalKeys.TAB); // Tab to settings
594
697
  await wait();
595
- stdin.write('\t'); // Tab to scope
698
+ stdin.write(TerminalKeys.TAB); // Tab to scope
596
699
  await wait();
597
700
  stdin.write('1'); // User
598
701
  await wait();
@@ -642,5 +745,258 @@ describe('SettingsDialog', () => {
642
745
  unmount();
643
746
  });
644
747
  });
748
+ describe('Snapshot Tests', () => {
749
+ /**
750
+ * Snapshot tests for SettingsDialog component using ink-testing-library.
751
+ * These tests capture the visual output of the component in various states:
752
+ *
753
+ * - Default rendering with no custom settings
754
+ * - Various combinations of boolean settings (enabled/disabled)
755
+ * - Mixed boolean and number settings configurations
756
+ * - Different focus states (settings vs scope selector)
757
+ * - Different scope selections (User, System, Workspace)
758
+ * - Accessibility settings enabled
759
+ * - File filtering configurations
760
+ * - Tools and security settings
761
+ * - All settings disabled state
762
+ *
763
+ * The snapshots help ensure UI consistency and catch unintended visual changes.
764
+ */
765
+ it('should render default state correctly', () => {
766
+ const settings = createMockSettings();
767
+ const onSelect = vi.fn();
768
+ const { lastFrame } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
769
+ expect(lastFrame()).toMatchSnapshot();
770
+ });
771
+ it('should render with various boolean settings enabled', () => {
772
+ const settings = createMockSettings({
773
+ general: {
774
+ vimMode: true,
775
+ disableAutoUpdate: true,
776
+ debugKeystrokeLogging: true,
777
+ enablePromptCompletion: true,
778
+ },
779
+ ui: {
780
+ hideWindowTitle: true,
781
+ hideTips: true,
782
+ showMemoryUsage: true,
783
+ showLineNumbers: true,
784
+ showCitations: true,
785
+ accessibility: {
786
+ disableLoadingPhrases: true,
787
+ screenReader: true,
788
+ },
789
+ },
790
+ ide: {
791
+ enabled: true,
792
+ },
793
+ context: {
794
+ loadMemoryFromIncludeDirectories: true,
795
+ fileFiltering: {
796
+ respectGitIgnore: true,
797
+ respectGeminiIgnore: true,
798
+ enableRecursiveFileSearch: true,
799
+ disableFuzzySearch: false,
800
+ },
801
+ },
802
+ tools: {
803
+ enableInteractiveShell: true,
804
+ autoAccept: true,
805
+ useRipgrep: true,
806
+ },
807
+ security: {
808
+ folderTrust: {
809
+ enabled: true,
810
+ },
811
+ },
812
+ });
813
+ const onSelect = vi.fn();
814
+ const { lastFrame } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
815
+ expect(lastFrame()).toMatchSnapshot();
816
+ });
817
+ it('should render with mixed boolean and number settings', () => {
818
+ const settings = createMockSettings({
819
+ general: {
820
+ vimMode: false,
821
+ disableAutoUpdate: true,
822
+ },
823
+ ui: {
824
+ showMemoryUsage: true,
825
+ hideWindowTitle: false,
826
+ },
827
+ tools: {
828
+ truncateToolOutputThreshold: 50000,
829
+ truncateToolOutputLines: 1000,
830
+ },
831
+ context: {
832
+ discoveryMaxDirs: 500,
833
+ },
834
+ model: {
835
+ maxSessionTurns: 100,
836
+ skipNextSpeakerCheck: false,
837
+ },
838
+ });
839
+ const onSelect = vi.fn();
840
+ const { lastFrame } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
841
+ expect(lastFrame()).toMatchSnapshot();
842
+ });
843
+ it('should render focused on scope selector', () => {
844
+ const settings = createMockSettings();
845
+ const onSelect = vi.fn();
846
+ const { lastFrame, stdin } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
847
+ // Switch focus to scope selector with Tab
848
+ stdin.write('\t');
849
+ expect(lastFrame()).toMatchSnapshot();
850
+ });
851
+ it('should render with different scope selected (System)', () => {
852
+ const settings = createMockSettings({}, // userSettings
853
+ {
854
+ // systemSettings
855
+ general: {
856
+ vimMode: true,
857
+ disableAutoUpdate: false,
858
+ },
859
+ ui: {
860
+ showMemoryUsage: true,
861
+ },
862
+ });
863
+ const onSelect = vi.fn();
864
+ const { lastFrame, stdin } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
865
+ // Switch to scope selector
866
+ stdin.write('\t');
867
+ // Navigate to System scope
868
+ stdin.write('ArrowDown');
869
+ stdin.write('\r'); // Enter to select
870
+ expect(lastFrame()).toMatchSnapshot();
871
+ });
872
+ it('should render with different scope selected (Workspace)', () => {
873
+ const settings = createMockSettings({}, // userSettings
874
+ {}, // systemSettings
875
+ {
876
+ // workspaceSettings
877
+ general: {
878
+ vimMode: false,
879
+ debugKeystrokeLogging: true,
880
+ },
881
+ tools: {
882
+ useRipgrep: true,
883
+ enableInteractiveShell: false,
884
+ },
885
+ });
886
+ const onSelect = vi.fn();
887
+ const { lastFrame, stdin } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
888
+ // Switch to scope selector
889
+ stdin.write('\t');
890
+ // Navigate to Workspace scope (down twice)
891
+ stdin.write('ArrowDown');
892
+ stdin.write('ArrowDown');
893
+ stdin.write('\r'); // Enter to select
894
+ expect(lastFrame()).toMatchSnapshot();
895
+ });
896
+ it('should render with accessibility settings enabled', () => {
897
+ const settings = createMockSettings({
898
+ ui: {
899
+ accessibility: {
900
+ disableLoadingPhrases: true,
901
+ screenReader: true,
902
+ },
903
+ showMemoryUsage: true,
904
+ showLineNumbers: true,
905
+ },
906
+ general: {
907
+ vimMode: true,
908
+ },
909
+ });
910
+ const onSelect = vi.fn();
911
+ const { lastFrame } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
912
+ expect(lastFrame()).toMatchSnapshot();
913
+ });
914
+ it('should render with file filtering settings configured', () => {
915
+ const settings = createMockSettings({
916
+ context: {
917
+ fileFiltering: {
918
+ respectGitIgnore: false,
919
+ respectGeminiIgnore: true,
920
+ enableRecursiveFileSearch: false,
921
+ disableFuzzySearch: true,
922
+ },
923
+ loadMemoryFromIncludeDirectories: true,
924
+ discoveryMaxDirs: 100,
925
+ },
926
+ });
927
+ const onSelect = vi.fn();
928
+ const { lastFrame } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
929
+ expect(lastFrame()).toMatchSnapshot();
930
+ });
931
+ it('should render with tools and security settings', () => {
932
+ const settings = createMockSettings({
933
+ tools: {
934
+ enableInteractiveShell: true,
935
+ autoAccept: false,
936
+ useRipgrep: true,
937
+ truncateToolOutputThreshold: 25000,
938
+ truncateToolOutputLines: 500,
939
+ },
940
+ security: {
941
+ folderTrust: {
942
+ enabled: true,
943
+ },
944
+ },
945
+ model: {
946
+ maxSessionTurns: 50,
947
+ skipNextSpeakerCheck: true,
948
+ },
949
+ });
950
+ const onSelect = vi.fn();
951
+ const { lastFrame } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
952
+ expect(lastFrame()).toMatchSnapshot();
953
+ });
954
+ it('should render with all boolean settings disabled', () => {
955
+ const settings = createMockSettings({
956
+ general: {
957
+ vimMode: false,
958
+ disableAutoUpdate: false,
959
+ debugKeystrokeLogging: false,
960
+ enablePromptCompletion: false,
961
+ },
962
+ ui: {
963
+ hideWindowTitle: false,
964
+ hideTips: false,
965
+ showMemoryUsage: false,
966
+ showLineNumbers: false,
967
+ showCitations: false,
968
+ accessibility: {
969
+ disableLoadingPhrases: false,
970
+ screenReader: false,
971
+ },
972
+ },
973
+ ide: {
974
+ enabled: false,
975
+ },
976
+ context: {
977
+ loadMemoryFromIncludeDirectories: false,
978
+ fileFiltering: {
979
+ respectGitIgnore: false,
980
+ respectGeminiIgnore: false,
981
+ enableRecursiveFileSearch: false,
982
+ disableFuzzySearch: false,
983
+ },
984
+ },
985
+ tools: {
986
+ enableInteractiveShell: false,
987
+ autoAccept: false,
988
+ useRipgrep: false,
989
+ },
990
+ security: {
991
+ folderTrust: {
992
+ enabled: false,
993
+ },
994
+ },
995
+ });
996
+ const onSelect = vi.fn();
997
+ const { lastFrame } = render(_jsx(KeypressProvider, { kittyProtocolEnabled: false, children: _jsx(SettingsDialog, { settings: settings, onSelect: onSelect }) }));
998
+ expect(lastFrame()).toMatchSnapshot();
999
+ });
1000
+ });
645
1001
  });
646
1002
  //# sourceMappingURL=SettingsDialog.test.js.map