@google/gemini-cli 0.26.0-preview.4 → 0.27.0-nightly.20260126.cb772a5b7

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 (461) hide show
  1. package/README.md +18 -1
  2. package/dist/google-gemini-cli-0.27.0-nightly.20260121.97aac696f.tgz +0 -0
  3. package/dist/package.json +3 -4
  4. package/dist/src/commands/extensions.js +4 -1
  5. package/dist/src/commands/extensions.js.map +1 -1
  6. package/dist/src/commands/hooks.js +4 -1
  7. package/dist/src/commands/hooks.js.map +1 -1
  8. package/dist/src/commands/mcp/enableDisable.d.ts +13 -0
  9. package/dist/src/commands/mcp/enableDisable.js +122 -0
  10. package/dist/src/commands/mcp/enableDisable.js.map +1 -0
  11. package/dist/src/commands/mcp/list.d.ts +2 -0
  12. package/dist/src/commands/mcp/list.js +1 -1
  13. package/dist/src/commands/mcp/list.js.map +1 -1
  14. package/dist/src/commands/mcp.js +7 -1
  15. package/dist/src/commands/mcp.js.map +1 -1
  16. package/dist/src/commands/mcp.test.js +3 -1
  17. package/dist/src/commands/mcp.test.js.map +1 -1
  18. package/dist/src/commands/skills.js +4 -1
  19. package/dist/src/commands/skills.js.map +1 -1
  20. package/dist/src/config/config.d.ts +4 -0
  21. package/dist/src/config/config.js +41 -20
  22. package/dist/src/config/config.js.map +1 -1
  23. package/dist/src/config/config.test.js +181 -15
  24. package/dist/src/config/config.test.js.map +1 -1
  25. package/dist/src/config/keyBindings.d.ts +8 -5
  26. package/dist/src/config/keyBindings.js +38 -32
  27. package/dist/src/config/keyBindings.js.map +1 -1
  28. package/dist/src/config/keyBindings.test.js +8 -5
  29. package/dist/src/config/keyBindings.test.js.map +1 -1
  30. package/dist/src/config/mcp/index.d.ts +6 -0
  31. package/dist/src/config/mcp/index.js +7 -0
  32. package/dist/src/config/mcp/index.js.map +1 -0
  33. package/dist/src/config/mcp/mcpServerEnablement.d.ts +145 -0
  34. package/dist/src/config/mcp/mcpServerEnablement.js +254 -0
  35. package/dist/src/config/mcp/mcpServerEnablement.js.map +1 -0
  36. package/dist/src/config/mcp/mcpServerEnablement.test.js +147 -0
  37. package/dist/src/config/mcp/mcpServerEnablement.test.js.map +1 -0
  38. package/dist/src/config/sandboxConfig.test.js +11 -5
  39. package/dist/src/config/sandboxConfig.test.js.map +1 -1
  40. package/dist/src/config/settings.js +76 -0
  41. package/dist/src/config/settings.js.map +1 -1
  42. package/dist/src/config/settings.test.js +44 -0
  43. package/dist/src/config/settings.test.js.map +1 -1
  44. package/dist/src/config/settingsSchema.d.ts +21 -78
  45. package/dist/src/config/settingsSchema.js +21 -79
  46. package/dist/src/config/settingsSchema.js.map +1 -1
  47. package/dist/src/config/settingsSchema.test.js +1 -1
  48. package/dist/src/config/settingsSchema.test.js.map +1 -1
  49. package/dist/src/config/settings_repro.test.js +6 -2
  50. package/dist/src/config/settings_repro.test.js.map +1 -1
  51. package/dist/src/gemini.js +12 -7
  52. package/dist/src/gemini.js.map +1 -1
  53. package/dist/src/gemini.test.js +140 -10
  54. package/dist/src/gemini.test.js.map +1 -1
  55. package/dist/src/generated/git-commit.d.ts +2 -2
  56. package/dist/src/generated/git-commit.js +2 -2
  57. package/dist/src/generated/git-commit.js.map +1 -1
  58. package/dist/src/nonInteractiveCli.js +11 -3
  59. package/dist/src/nonInteractiveCli.js.map +1 -1
  60. package/dist/src/nonInteractiveCli.test.js +193 -3
  61. package/dist/src/nonInteractiveCli.test.js.map +1 -1
  62. package/dist/src/nonInteractiveCliCommands.js +6 -1
  63. package/dist/src/nonInteractiveCliCommands.js.map +1 -1
  64. package/dist/src/services/BuiltinCommandLoader.js +2 -0
  65. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  66. package/dist/src/services/FileCommandLoader.js +12 -4
  67. package/dist/src/services/FileCommandLoader.js.map +1 -1
  68. package/dist/src/services/FileCommandLoader.test.js +56 -0
  69. package/dist/src/services/FileCommandLoader.test.js.map +1 -1
  70. package/dist/src/test-utils/mockCommandContext.js +2 -0
  71. package/dist/src/test-utils/mockCommandContext.js.map +1 -1
  72. package/dist/src/test-utils/persistentStateFake.d.ts +26 -0
  73. package/dist/src/test-utils/persistentStateFake.js +39 -0
  74. package/dist/src/test-utils/persistentStateFake.js.map +1 -0
  75. package/dist/src/test-utils/render.d.ts +10 -1
  76. package/dist/src/test-utils/render.js +45 -16
  77. package/dist/src/test-utils/render.js.map +1 -1
  78. package/dist/src/ui/App.test.js +96 -38
  79. package/dist/src/ui/App.test.js.map +1 -1
  80. package/dist/src/ui/AppContainer.js +78 -18
  81. package/dist/src/ui/AppContainer.js.map +1 -1
  82. package/dist/src/ui/AppContainer.test.js +185 -19
  83. package/dist/src/ui/AppContainer.test.js.map +1 -1
  84. package/dist/src/ui/auth/ApiAuthDialog.test.js +5 -5
  85. package/dist/src/ui/auth/ApiAuthDialog.test.js.map +1 -1
  86. package/dist/src/ui/auth/AuthDialog.test.js +13 -9
  87. package/dist/src/ui/auth/AuthDialog.test.js.map +1 -1
  88. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.js +6 -6
  89. package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.js.map +1 -1
  90. package/dist/src/ui/commands/aboutCommand.js +2 -0
  91. package/dist/src/ui/commands/aboutCommand.js.map +1 -1
  92. package/dist/src/ui/commands/aboutCommand.test.js +12 -0
  93. package/dist/src/ui/commands/aboutCommand.test.js.map +1 -1
  94. package/dist/src/ui/commands/agentsCommand.js +75 -4
  95. package/dist/src/ui/commands/agentsCommand.js.map +1 -1
  96. package/dist/src/ui/commands/agentsCommand.test.js +114 -0
  97. package/dist/src/ui/commands/agentsCommand.test.js.map +1 -1
  98. package/dist/src/ui/commands/directoryCommand.js +53 -49
  99. package/dist/src/ui/commands/directoryCommand.js.map +1 -1
  100. package/dist/src/ui/commands/directoryCommand.test.js +79 -23
  101. package/dist/src/ui/commands/directoryCommand.test.js.map +1 -1
  102. package/dist/src/ui/commands/initCommand.test.js +8 -4
  103. package/dist/src/ui/commands/initCommand.test.js.map +1 -1
  104. package/dist/src/ui/commands/mcpCommand.js +136 -5
  105. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  106. package/dist/src/ui/commands/policiesCommand.js +33 -20
  107. package/dist/src/ui/commands/policiesCommand.js.map +1 -1
  108. package/dist/src/ui/commands/policiesCommand.test.js +7 -4
  109. package/dist/src/ui/commands/policiesCommand.test.js.map +1 -1
  110. package/dist/src/ui/commands/rewindCommand.d.ts +7 -0
  111. package/dist/src/ui/commands/rewindCommand.js +132 -0
  112. package/dist/src/ui/commands/rewindCommand.js.map +1 -0
  113. package/dist/src/ui/commands/rewindCommand.test.js +242 -0
  114. package/dist/src/ui/commands/rewindCommand.test.js.map +1 -0
  115. package/dist/src/ui/commands/skillsCommand.js +6 -4
  116. package/dist/src/ui/commands/skillsCommand.js.map +1 -1
  117. package/dist/src/ui/commands/skillsCommand.test.js +17 -3
  118. package/dist/src/ui/commands/skillsCommand.test.js.map +1 -1
  119. package/dist/src/ui/commands/types.d.ts +5 -3
  120. package/dist/src/ui/commands/types.js.map +1 -1
  121. package/dist/src/ui/components/AboutBox.d.ts +1 -0
  122. package/dist/src/ui/components/AboutBox.js +5 -1
  123. package/dist/src/ui/components/AboutBox.js.map +1 -1
  124. package/dist/src/ui/components/AboutBox.test.js +8 -2
  125. package/dist/src/ui/components/AboutBox.test.js.map +1 -1
  126. package/dist/src/ui/components/AgentConfigDialog.d.ts +18 -0
  127. package/dist/src/ui/components/AgentConfigDialog.js +296 -0
  128. package/dist/src/ui/components/AgentConfigDialog.js.map +1 -0
  129. package/dist/src/ui/components/AgentConfigDialog.test.js +241 -0
  130. package/dist/src/ui/components/AgentConfigDialog.test.js.map +1 -0
  131. package/dist/src/ui/components/AlternateBufferQuittingDisplay.js +9 -2
  132. package/dist/src/ui/components/AlternateBufferQuittingDisplay.js.map +1 -1
  133. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js +54 -25
  134. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js.map +1 -1
  135. package/dist/src/ui/components/AppHeader.js +4 -1
  136. package/dist/src/ui/components/AppHeader.js.map +1 -1
  137. package/dist/src/ui/components/AppHeader.test.js +95 -22
  138. package/dist/src/ui/components/AppHeader.test.js.map +1 -1
  139. package/dist/src/ui/components/{AutoAcceptIndicator.d.ts → ApprovalModeIndicator.d.ts} +2 -2
  140. package/dist/src/ui/components/{AutoAcceptIndicator.js → ApprovalModeIndicator.js} +8 -3
  141. package/dist/src/ui/components/ApprovalModeIndicator.js.map +1 -0
  142. package/dist/src/ui/components/ApprovalModeIndicator.test.d.ts +6 -0
  143. package/dist/src/ui/components/{AutoAcceptIndicator.test.js → ApprovalModeIndicator.test.js} +13 -7
  144. package/dist/src/ui/components/ApprovalModeIndicator.test.js.map +1 -0
  145. package/dist/src/ui/components/AskUserDialog.d.ts +39 -0
  146. package/dist/src/ui/components/AskUserDialog.js +618 -0
  147. package/dist/src/ui/components/AskUserDialog.js.map +1 -0
  148. package/dist/src/ui/components/AskUserDialog.test.d.ts +6 -0
  149. package/dist/src/ui/components/AskUserDialog.test.js +598 -0
  150. package/dist/src/ui/components/AskUserDialog.test.js.map +1 -0
  151. package/dist/src/ui/components/Composer.d.ts +3 -1
  152. package/dist/src/ui/components/Composer.js +5 -5
  153. package/dist/src/ui/components/Composer.js.map +1 -1
  154. package/dist/src/ui/components/Composer.test.js +6 -6
  155. package/dist/src/ui/components/Composer.test.js.map +1 -1
  156. package/dist/src/ui/components/ConfigInitDisplay.js +3 -4
  157. package/dist/src/ui/components/ConfigInitDisplay.js.map +1 -1
  158. package/dist/src/ui/components/ConfigInitDisplay.test.js +13 -29
  159. package/dist/src/ui/components/ConfigInitDisplay.test.js.map +1 -1
  160. package/dist/src/ui/components/ContextUsageDisplay.test.js +7 -3
  161. package/dist/src/ui/components/ContextUsageDisplay.test.js.map +1 -1
  162. package/dist/src/ui/components/DialogManager.js +13 -0
  163. package/dist/src/ui/components/DialogManager.js.map +1 -1
  164. package/dist/src/ui/components/DialogManager.test.js +24 -0
  165. package/dist/src/ui/components/DialogManager.test.js.map +1 -1
  166. package/dist/src/ui/components/FolderTrustDialog.test.js +3 -1
  167. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
  168. package/dist/src/ui/components/Footer.test.js +7 -0
  169. package/dist/src/ui/components/Footer.test.js.map +1 -1
  170. package/dist/src/ui/components/Help.js +5 -2
  171. package/dist/src/ui/components/Help.js.map +1 -1
  172. package/dist/src/ui/components/HistoryItemDisplay.js +1 -1
  173. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  174. package/dist/src/ui/components/InputPrompt.js +32 -20
  175. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  176. package/dist/src/ui/components/InputPrompt.test.js +75 -1
  177. package/dist/src/ui/components/InputPrompt.test.js.map +1 -1
  178. package/dist/src/ui/components/MultiFolderTrustDialog.js +2 -1
  179. package/dist/src/ui/components/MultiFolderTrustDialog.js.map +1 -1
  180. package/dist/src/ui/components/MultiFolderTrustDialog.test.js +12 -10
  181. package/dist/src/ui/components/MultiFolderTrustDialog.test.js.map +1 -1
  182. package/dist/src/ui/components/Notifications.js +14 -20
  183. package/dist/src/ui/components/Notifications.js.map +1 -1
  184. package/dist/src/ui/components/Notifications.test.js +45 -35
  185. package/dist/src/ui/components/Notifications.test.js.map +1 -1
  186. package/dist/src/ui/components/RewindViewer.d.ts +1 -1
  187. package/dist/src/ui/components/RewindViewer.js +65 -17
  188. package/dist/src/ui/components/RewindViewer.js.map +1 -1
  189. package/dist/src/ui/components/RewindViewer.test.js +5 -3
  190. package/dist/src/ui/components/RewindViewer.test.js.map +1 -1
  191. package/dist/src/ui/components/SessionBrowser.js +3 -2
  192. package/dist/src/ui/components/SessionBrowser.js.map +1 -1
  193. package/dist/src/ui/components/SessionBrowser.test.js +10 -3
  194. package/dist/src/ui/components/SessionBrowser.test.js.map +1 -1
  195. package/dist/src/ui/components/SettingsDialog.d.ts +1 -1
  196. package/dist/src/ui/components/SettingsDialog.js +266 -516
  197. package/dist/src/ui/components/SettingsDialog.js.map +1 -1
  198. package/dist/src/ui/components/SettingsDialog.test.js +2 -2
  199. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  200. package/dist/src/ui/components/ShellInputPrompt.test.js +17 -8
  201. package/dist/src/ui/components/ShellInputPrompt.test.js.map +1 -1
  202. package/dist/src/ui/components/SuggestionsDisplay.d.ts +1 -1
  203. package/dist/src/ui/components/SuggestionsDisplay.js +4 -3
  204. package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
  205. package/dist/src/ui/components/ToolConfirmationQueue.d.ts +12 -0
  206. package/dist/src/ui/components/ToolConfirmationQueue.js +30 -0
  207. package/dist/src/ui/components/ToolConfirmationQueue.js.map +1 -0
  208. package/dist/src/ui/components/ToolConfirmationQueue.test.d.ts +6 -0
  209. package/dist/src/ui/components/ToolConfirmationQueue.test.js +71 -0
  210. package/dist/src/ui/components/ToolConfirmationQueue.test.js.map +1 -0
  211. package/dist/src/ui/components/messages/RedirectionConfirmation.test.js +2 -4
  212. package/dist/src/ui/components/messages/RedirectionConfirmation.test.js.map +1 -1
  213. package/dist/src/ui/components/messages/ShellToolMessage.js +6 -41
  214. package/dist/src/ui/components/messages/ShellToolMessage.js.map +1 -1
  215. package/dist/src/ui/components/messages/ToolConfirmationMessage.d.ts +3 -2
  216. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +61 -76
  217. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  218. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +20 -7
  219. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -1
  220. package/dist/src/ui/components/messages/ToolGroupMessage.js +34 -18
  221. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  222. package/dist/src/ui/components/messages/ToolGroupMessage.test.js +209 -24
  223. package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -1
  224. package/dist/src/ui/components/messages/ToolMessage.d.ts +1 -1
  225. package/dist/src/ui/components/messages/ToolMessage.js +7 -29
  226. package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
  227. package/dist/src/ui/components/messages/ToolMessageFocusHint.test.d.ts +6 -0
  228. package/dist/src/ui/components/messages/ToolMessageFocusHint.test.js +89 -0
  229. package/dist/src/ui/components/messages/ToolMessageFocusHint.test.js.map +1 -0
  230. package/dist/src/ui/components/messages/ToolShared.d.ts +26 -0
  231. package/dist/src/ui/components/messages/ToolShared.js +59 -6
  232. package/dist/src/ui/components/messages/ToolShared.js.map +1 -1
  233. package/dist/src/ui/components/shared/BaseSelectionList.d.ts +3 -1
  234. package/dist/src/ui/components/shared/BaseSelectionList.js +4 -2
  235. package/dist/src/ui/components/shared/BaseSelectionList.js.map +1 -1
  236. package/dist/src/ui/components/shared/BaseSelectionList.test.js +1 -0
  237. package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +1 -1
  238. package/dist/src/ui/components/shared/BaseSettingsDialog.d.ts +72 -0
  239. package/dist/src/ui/components/shared/BaseSettingsDialog.js +293 -0
  240. package/dist/src/ui/components/shared/BaseSettingsDialog.js.map +1 -0
  241. package/dist/src/ui/components/shared/BaseSettingsDialog.test.d.ts +6 -0
  242. package/dist/src/ui/components/shared/BaseSettingsDialog.test.js +434 -0
  243. package/dist/src/ui/components/shared/BaseSettingsDialog.test.js.map +1 -0
  244. package/dist/src/ui/components/shared/ExpandableText.d.ts +17 -0
  245. package/dist/src/ui/components/{PrepareLabel.js → shared/ExpandableText.js} +30 -15
  246. package/dist/src/ui/components/shared/ExpandableText.js.map +1 -0
  247. package/dist/src/ui/components/shared/ExpandableText.test.d.ts +6 -0
  248. package/dist/src/ui/components/{PrepareLabel.test.js → shared/ExpandableText.test.js} +22 -11
  249. package/dist/src/ui/components/shared/ExpandableText.test.js.map +1 -0
  250. package/dist/src/ui/components/shared/TabHeader.d.ts +51 -0
  251. package/dist/src/ui/components/shared/TabHeader.js +42 -0
  252. package/dist/src/ui/components/shared/TabHeader.js.map +1 -0
  253. package/dist/src/ui/components/shared/TabHeader.test.d.ts +6 -0
  254. package/dist/src/ui/components/shared/TabHeader.test.js +106 -0
  255. package/dist/src/ui/components/shared/TabHeader.test.js.map +1 -0
  256. package/dist/src/ui/components/shared/TextInput.test.js +32 -24
  257. package/dist/src/ui/components/shared/TextInput.test.js.map +1 -1
  258. package/dist/src/ui/components/shared/text-buffer.d.ts +13 -0
  259. package/dist/src/ui/components/shared/text-buffer.js +173 -14
  260. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  261. package/dist/src/ui/components/shared/text-buffer.test.js +256 -44
  262. package/dist/src/ui/components/shared/text-buffer.test.js.map +1 -1
  263. package/dist/src/ui/components/shared/vim-buffer-actions.test.js +4 -1
  264. package/dist/src/ui/components/shared/vim-buffer-actions.test.js.map +1 -1
  265. package/dist/src/ui/components/views/McpStatus.d.ts +1 -0
  266. package/dist/src/ui/components/views/McpStatus.js +30 -18
  267. package/dist/src/ui/components/views/McpStatus.js.map +1 -1
  268. package/dist/src/ui/components/views/McpStatus.test.js +7 -0
  269. package/dist/src/ui/components/views/McpStatus.test.js.map +1 -1
  270. package/dist/src/ui/constants/tips.js +2 -2
  271. package/dist/src/ui/constants/tips.js.map +1 -1
  272. package/dist/src/ui/constants.d.ts +1 -0
  273. package/dist/src/ui/constants.js +1 -0
  274. package/dist/src/ui/constants.js.map +1 -1
  275. package/dist/src/ui/contexts/KeypressContext.d.ts +3 -2
  276. package/dist/src/ui/contexts/KeypressContext.js +33 -25
  277. package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
  278. package/dist/src/ui/contexts/KeypressContext.test.js +151 -41
  279. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
  280. package/dist/src/ui/contexts/MouseContext.test.js +8 -8
  281. package/dist/src/ui/contexts/MouseContext.test.js.map +1 -1
  282. package/dist/src/ui/contexts/ToolActionsContext.d.ts +20 -0
  283. package/dist/src/ui/contexts/ToolActionsContext.js +74 -0
  284. package/dist/src/ui/contexts/ToolActionsContext.js.map +1 -0
  285. package/dist/src/ui/contexts/ToolActionsContext.test.d.ts +6 -0
  286. package/dist/src/ui/contexts/ToolActionsContext.test.js +135 -0
  287. package/dist/src/ui/contexts/ToolActionsContext.test.js.map +1 -0
  288. package/dist/src/ui/contexts/UIActionsContext.d.ts +3 -1
  289. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
  290. package/dist/src/ui/contexts/UIStateContext.d.ts +6 -2
  291. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  292. package/dist/src/ui/hooks/atCommandProcessor.js +19 -4
  293. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  294. package/dist/src/ui/hooks/keyToAnsi.js +1 -1
  295. package/dist/src/ui/hooks/keyToAnsi.js.map +1 -1
  296. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +3 -1
  297. package/dist/src/ui/hooks/slashCommandProcessor.js +24 -7
  298. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  299. package/dist/src/ui/hooks/slashCommandProcessor.test.js +126 -30
  300. package/dist/src/ui/hooks/slashCommandProcessor.test.js.map +1 -1
  301. package/dist/src/ui/hooks/toolMapping.js +8 -11
  302. package/dist/src/ui/hooks/toolMapping.js.map +1 -1
  303. package/dist/src/ui/hooks/toolMapping.test.js +27 -6
  304. package/dist/src/ui/hooks/toolMapping.test.js.map +1 -1
  305. package/dist/src/ui/hooks/{useAutoAcceptIndicator.d.ts → useApprovalModeIndicator.d.ts} +2 -2
  306. package/dist/src/ui/hooks/{useAutoAcceptIndicator.js → useApprovalModeIndicator.js} +25 -11
  307. package/dist/src/ui/hooks/useApprovalModeIndicator.js.map +1 -0
  308. package/dist/src/ui/hooks/useApprovalModeIndicator.test.d.ts +6 -0
  309. package/dist/src/ui/hooks/{useAutoAcceptIndicator.test.js → useApprovalModeIndicator.test.js} +56 -31
  310. package/dist/src/ui/hooks/useApprovalModeIndicator.test.js.map +1 -0
  311. package/dist/src/ui/hooks/useConfirmingTool.d.ts +16 -0
  312. package/dist/src/ui/hooks/useConfirmingTool.js +39 -0
  313. package/dist/src/ui/hooks/useConfirmingTool.js.map +1 -0
  314. package/dist/src/ui/hooks/useGeminiStream.d.ts +1 -1
  315. package/dist/src/ui/hooks/useGeminiStream.js +20 -8
  316. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  317. package/dist/src/ui/hooks/useGeminiStream.test.js +79 -19
  318. package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
  319. package/dist/src/ui/hooks/useIncludeDirsTrust.d.ts +1 -1
  320. package/dist/src/ui/hooks/useIncludeDirsTrust.js +9 -20
  321. package/dist/src/ui/hooks/useIncludeDirsTrust.js.map +1 -1
  322. package/dist/src/ui/hooks/useIncludeDirsTrust.test.js +33 -12
  323. package/dist/src/ui/hooks/useIncludeDirsTrust.test.js.map +1 -1
  324. package/dist/src/ui/hooks/useKeypress.test.js +10 -3
  325. package/dist/src/ui/hooks/useKeypress.test.js.map +1 -1
  326. package/dist/src/ui/hooks/useLoadingIndicator.d.ts +7 -1
  327. package/dist/src/ui/hooks/useLoadingIndicator.js +3 -3
  328. package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
  329. package/dist/src/ui/hooks/useLoadingIndicator.test.js +17 -9
  330. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
  331. package/dist/src/ui/hooks/usePhraseCycler.d.ts +2 -2
  332. package/dist/src/ui/hooks/usePhraseCycler.js +4 -14
  333. package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
  334. package/dist/src/ui/hooks/usePhraseCycler.test.js +13 -42
  335. package/dist/src/ui/hooks/usePhraseCycler.test.js.map +1 -1
  336. package/dist/src/ui/hooks/useSelectionList.d.ts +4 -1
  337. package/dist/src/ui/hooks/useSelectionList.js +51 -13
  338. package/dist/src/ui/hooks/useSelectionList.js.map +1 -1
  339. package/dist/src/ui/hooks/useSelectionList.test.js +35 -3
  340. package/dist/src/ui/hooks/useSelectionList.test.js.map +1 -1
  341. package/dist/src/ui/hooks/useSessionResume.test.js +3 -2
  342. package/dist/src/ui/hooks/useSessionResume.test.js.map +1 -1
  343. package/dist/src/ui/hooks/useShellInactivityStatus.d.ts +26 -0
  344. package/dist/src/ui/hooks/useShellInactivityStatus.js +46 -0
  345. package/dist/src/ui/hooks/useShellInactivityStatus.js.map +1 -0
  346. package/dist/src/ui/hooks/useShellInactivityStatus.test.d.ts +6 -0
  347. package/dist/src/ui/hooks/useShellInactivityStatus.test.js +84 -0
  348. package/dist/src/ui/hooks/useShellInactivityStatus.test.js.map +1 -0
  349. package/dist/src/ui/hooks/useTabbedNavigation.d.ts +53 -0
  350. package/dist/src/ui/hooks/useTabbedNavigation.js +150 -0
  351. package/dist/src/ui/hooks/useTabbedNavigation.js.map +1 -0
  352. package/dist/src/ui/hooks/useTabbedNavigation.test.d.ts +6 -0
  353. package/dist/src/ui/hooks/useTabbedNavigation.test.js +187 -0
  354. package/dist/src/ui/hooks/useTabbedNavigation.test.js.map +1 -0
  355. package/dist/src/ui/hooks/useTips.d.ts +10 -0
  356. package/dist/src/ui/hooks/useTips.js +18 -0
  357. package/dist/src/ui/hooks/useTips.js.map +1 -0
  358. package/dist/src/ui/hooks/useTips.test.d.ts +6 -0
  359. package/dist/src/ui/hooks/useTips.test.js +33 -0
  360. package/dist/src/ui/hooks/useTips.test.js.map +1 -0
  361. package/dist/src/ui/hooks/useToolExecutionScheduler.d.ts +30 -0
  362. package/dist/src/ui/hooks/useToolExecutionScheduler.js +113 -0
  363. package/dist/src/ui/hooks/useToolExecutionScheduler.js.map +1 -0
  364. package/dist/src/ui/hooks/useToolExecutionScheduler.test.d.ts +6 -0
  365. package/dist/src/ui/hooks/useToolExecutionScheduler.test.js +296 -0
  366. package/dist/src/ui/hooks/useToolExecutionScheduler.test.js.map +1 -0
  367. package/dist/src/ui/hooks/useToolScheduler.d.ts +29 -0
  368. package/dist/src/ui/hooks/useToolScheduler.js +30 -0
  369. package/dist/src/ui/hooks/useToolScheduler.js.map +1 -0
  370. package/dist/src/ui/hooks/useToolScheduler.test.js +1 -1
  371. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  372. package/dist/src/ui/hooks/useToolSchedulerFacade.test.d.ts +6 -0
  373. package/dist/src/ui/hooks/useToolSchedulerFacade.test.js +45 -0
  374. package/dist/src/ui/hooks/useToolSchedulerFacade.test.js.map +1 -0
  375. package/dist/src/ui/hooks/useTurnActivityMonitor.d.ts +16 -0
  376. package/dist/src/ui/hooks/useTurnActivityMonitor.js +49 -0
  377. package/dist/src/ui/hooks/useTurnActivityMonitor.js.map +1 -0
  378. package/dist/src/ui/hooks/useTurnActivityMonitor.test.d.ts +6 -0
  379. package/dist/src/ui/hooks/useTurnActivityMonitor.test.js +97 -0
  380. package/dist/src/ui/hooks/useTurnActivityMonitor.test.js.map +1 -0
  381. package/dist/src/ui/hooks/vim.js +5 -3
  382. package/dist/src/ui/hooks/vim.js.map +1 -1
  383. package/dist/src/ui/hooks/vim.test.js +4 -2
  384. package/dist/src/ui/hooks/vim.test.js.map +1 -1
  385. package/dist/src/ui/keyMatchers.js +5 -13
  386. package/dist/src/ui/keyMatchers.js.map +1 -1
  387. package/dist/src/ui/keyMatchers.test.js +23 -20
  388. package/dist/src/ui/keyMatchers.test.js.map +1 -1
  389. package/dist/src/ui/layouts/DefaultAppLayout.js +10 -2
  390. package/dist/src/ui/layouts/DefaultAppLayout.js.map +1 -1
  391. package/dist/src/ui/noninteractive/nonInteractiveUi.js +1 -0
  392. package/dist/src/ui/noninteractive/nonInteractiveUi.js.map +1 -1
  393. package/dist/src/ui/types.d.ts +11 -3
  394. package/dist/src/ui/types.js.map +1 -1
  395. package/dist/src/ui/utils/clipboardUtils.d.ts +4 -4
  396. package/dist/src/ui/utils/clipboardUtils.js +198 -12
  397. package/dist/src/ui/utils/clipboardUtils.js.map +1 -1
  398. package/dist/src/ui/utils/clipboardUtils.test.js +219 -47
  399. package/dist/src/ui/utils/clipboardUtils.test.js.map +1 -1
  400. package/dist/src/ui/utils/clipboardUtils.windows.test.js +3 -0
  401. package/dist/src/ui/utils/clipboardUtils.windows.test.js.map +1 -1
  402. package/dist/src/ui/utils/commandUtils.test.js +11 -3
  403. package/dist/src/ui/utils/commandUtils.test.js.map +1 -1
  404. package/dist/src/ui/utils/directoryUtils.d.ts +10 -0
  405. package/dist/src/ui/utils/directoryUtils.js +12 -0
  406. package/dist/src/ui/utils/directoryUtils.js.map +1 -1
  407. package/dist/src/ui/utils/directoryUtils.test.js +8 -4
  408. package/dist/src/ui/utils/directoryUtils.test.js.map +1 -1
  409. package/dist/src/ui/utils/formatters.d.ts +1 -1
  410. package/dist/src/ui/utils/formatters.js +2 -3
  411. package/dist/src/ui/utils/formatters.js.map +1 -1
  412. package/dist/src/ui/utils/highlight.d.ts +2 -2
  413. package/dist/src/ui/utils/highlight.js +9 -3
  414. package/dist/src/ui/utils/highlight.js.map +1 -1
  415. package/dist/src/ui/utils/highlight.test.js +3 -0
  416. package/dist/src/ui/utils/highlight.test.js.map +1 -1
  417. package/dist/src/ui/utils/terminalCapabilityManager.d.ts +1 -2
  418. package/dist/src/ui/utils/terminalCapabilityManager.js +2 -8
  419. package/dist/src/ui/utils/terminalCapabilityManager.js.map +1 -1
  420. package/dist/src/ui/utils/terminalCapabilityManager.test.js +2 -3
  421. package/dist/src/ui/utils/terminalCapabilityManager.test.js.map +1 -1
  422. package/dist/src/ui/utils/terminalSetup.test.js +5 -3
  423. package/dist/src/ui/utils/terminalSetup.test.js.map +1 -1
  424. package/dist/src/ui/utils/textUtils.d.ts +5 -0
  425. package/dist/src/ui/utils/textUtils.js +14 -0
  426. package/dist/src/ui/utils/textUtils.js.map +1 -1
  427. package/dist/src/ui/utils/textUtils.test.js +19 -1
  428. package/dist/src/ui/utils/textUtils.test.js.map +1 -1
  429. package/dist/src/utils/cleanup.js +15 -0
  430. package/dist/src/utils/cleanup.js.map +1 -1
  431. package/dist/src/utils/events.d.ts +1 -6
  432. package/dist/src/utils/events.js +0 -2
  433. package/dist/src/utils/events.js.map +1 -1
  434. package/dist/src/utils/events.test.js +4 -4
  435. package/dist/src/utils/events.test.js.map +1 -1
  436. package/dist/src/utils/handleAutoUpdate.test.js +3 -0
  437. package/dist/src/utils/handleAutoUpdate.test.js.map +1 -1
  438. package/dist/src/utils/installationInfo.js +4 -2
  439. package/dist/src/utils/installationInfo.js.map +1 -1
  440. package/dist/src/utils/persistentState.d.ts +2 -0
  441. package/dist/src/utils/persistentState.js.map +1 -1
  442. package/dist/src/utils/windowTitle.d.ts +2 -1
  443. package/dist/src/utils/windowTitle.js +8 -1
  444. package/dist/src/utils/windowTitle.js.map +1 -1
  445. package/dist/src/utils/windowTitle.test.js +25 -1
  446. package/dist/src/utils/windowTitle.test.js.map +1 -1
  447. package/dist/src/zed-integration/zedIntegration.js +26 -5
  448. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  449. package/dist/tsconfig.tsbuildinfo +1 -1
  450. package/package.json +4 -5
  451. package/dist/google-gemini-cli-0.26.0-preview.3.tgz +0 -0
  452. package/dist/src/ui/components/AutoAcceptIndicator.js.map +0 -1
  453. package/dist/src/ui/components/AutoAcceptIndicator.test.js.map +0 -1
  454. package/dist/src/ui/components/PrepareLabel.d.ts +0 -15
  455. package/dist/src/ui/components/PrepareLabel.js.map +0 -1
  456. package/dist/src/ui/components/PrepareLabel.test.js.map +0 -1
  457. package/dist/src/ui/hooks/useAutoAcceptIndicator.js.map +0 -1
  458. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js.map +0 -1
  459. /package/dist/src/{ui/components/AutoAcceptIndicator.test.d.ts → config/mcp/mcpServerEnablement.test.d.ts} +0 -0
  460. /package/dist/src/ui/{components/PrepareLabel.test.d.ts → commands/rewindCommand.test.d.ts} +0 -0
  461. /package/dist/src/ui/{hooks/useAutoAcceptIndicator.test.d.ts → components/AgentConfigDialog.test.d.ts} +0 -0
@@ -0,0 +1,434 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * @license
4
+ * Copyright 2025 Google LLC
5
+ * SPDX-License-Identifier: Apache-2.0
6
+ */
7
+ import { render } from '../../../test-utils/render.js';
8
+ import { waitFor } from '../../../test-utils/async.js';
9
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
10
+ import { act } from 'react';
11
+ import { Text } from 'ink';
12
+ import { BaseSettingsDialog, } from './BaseSettingsDialog.js';
13
+ import { KeypressProvider } from '../../contexts/KeypressContext.js';
14
+ import { SettingScope } from '../../../config/settings.js';
15
+ vi.mock('../../contexts/UIStateContext.js', () => ({
16
+ useUIState: () => ({
17
+ mainAreaWidth: 100,
18
+ }),
19
+ }));
20
+ var TerminalKeys;
21
+ (function (TerminalKeys) {
22
+ TerminalKeys["ENTER"] = "\r";
23
+ TerminalKeys["TAB"] = "\t";
24
+ TerminalKeys["UP_ARROW"] = "\u001B[A";
25
+ TerminalKeys["DOWN_ARROW"] = "\u001B[B";
26
+ TerminalKeys["LEFT_ARROW"] = "\u001B[D";
27
+ TerminalKeys["RIGHT_ARROW"] = "\u001B[C";
28
+ TerminalKeys["ESCAPE"] = "\u001B";
29
+ TerminalKeys["BACKSPACE"] = "\b";
30
+ TerminalKeys["CTRL_L"] = "\f";
31
+ })(TerminalKeys || (TerminalKeys = {}));
32
+ const createMockItems = () => [
33
+ {
34
+ key: 'boolean-setting',
35
+ label: 'Boolean Setting',
36
+ description: 'A boolean setting for testing',
37
+ displayValue: 'true',
38
+ rawValue: true,
39
+ type: 'boolean',
40
+ },
41
+ {
42
+ key: 'string-setting',
43
+ label: 'String Setting',
44
+ description: 'A string setting for testing',
45
+ displayValue: 'test-value',
46
+ rawValue: 'test-value',
47
+ type: 'string',
48
+ },
49
+ {
50
+ key: 'number-setting',
51
+ label: 'Number Setting',
52
+ description: 'A number setting for testing',
53
+ displayValue: '42',
54
+ rawValue: 42,
55
+ type: 'number',
56
+ },
57
+ {
58
+ key: 'enum-setting',
59
+ label: 'Enum Setting',
60
+ description: 'An enum setting for testing',
61
+ displayValue: 'option-a',
62
+ rawValue: 'option-a',
63
+ type: 'enum',
64
+ },
65
+ ];
66
+ describe('BaseSettingsDialog', () => {
67
+ let mockOnItemToggle;
68
+ let mockOnEditCommit;
69
+ let mockOnItemClear;
70
+ let mockOnClose;
71
+ let mockOnScopeChange;
72
+ beforeEach(() => {
73
+ vi.clearAllMocks();
74
+ mockOnItemToggle = vi.fn();
75
+ mockOnEditCommit = vi.fn();
76
+ mockOnItemClear = vi.fn();
77
+ mockOnClose = vi.fn();
78
+ mockOnScopeChange = vi.fn();
79
+ });
80
+ const renderDialog = (props = {}) => {
81
+ const defaultProps = {
82
+ title: 'Test Settings',
83
+ items: createMockItems(),
84
+ selectedScope: SettingScope.User,
85
+ maxItemsToShow: 8,
86
+ onItemToggle: mockOnItemToggle,
87
+ onEditCommit: mockOnEditCommit,
88
+ onItemClear: mockOnItemClear,
89
+ onClose: mockOnClose,
90
+ ...props,
91
+ };
92
+ return render(_jsx(KeypressProvider, { children: _jsx(BaseSettingsDialog, { ...defaultProps }) }));
93
+ };
94
+ describe('rendering', () => {
95
+ it('should render the dialog with title', () => {
96
+ const { lastFrame } = renderDialog();
97
+ expect(lastFrame()).toContain('Test Settings');
98
+ });
99
+ it('should render all items', () => {
100
+ const { lastFrame } = renderDialog();
101
+ const frame = lastFrame();
102
+ expect(frame).toContain('Boolean Setting');
103
+ expect(frame).toContain('String Setting');
104
+ expect(frame).toContain('Number Setting');
105
+ expect(frame).toContain('Enum Setting');
106
+ });
107
+ it('should render help text with Ctrl+L for reset', () => {
108
+ const { lastFrame } = renderDialog();
109
+ const frame = lastFrame();
110
+ expect(frame).toContain('Use Enter to select');
111
+ expect(frame).toContain('Ctrl+L to reset');
112
+ expect(frame).toContain('Tab to change focus');
113
+ expect(frame).toContain('Esc to close');
114
+ });
115
+ it('should render scope selector when showScopeSelector is true', () => {
116
+ const { lastFrame } = renderDialog({
117
+ showScopeSelector: true,
118
+ onScopeChange: mockOnScopeChange,
119
+ });
120
+ expect(lastFrame()).toContain('Apply To');
121
+ });
122
+ it('should not render scope selector when showScopeSelector is false', () => {
123
+ const { lastFrame } = renderDialog({
124
+ showScopeSelector: false,
125
+ });
126
+ expect(lastFrame()).not.toContain('Apply To');
127
+ });
128
+ it('should render footer content when provided', () => {
129
+ const { lastFrame } = renderDialog({
130
+ footerContent: _jsx(Text, { children: "Custom Footer" }),
131
+ });
132
+ expect(lastFrame()).toContain('Custom Footer');
133
+ });
134
+ });
135
+ describe('keyboard navigation', () => {
136
+ it('should close dialog on Escape', async () => {
137
+ const { stdin } = renderDialog();
138
+ await act(async () => {
139
+ stdin.write(TerminalKeys.ESCAPE);
140
+ });
141
+ await waitFor(() => {
142
+ expect(mockOnClose).toHaveBeenCalled();
143
+ });
144
+ });
145
+ it('should navigate down with arrow key', async () => {
146
+ const { lastFrame, stdin } = renderDialog();
147
+ // Initially first item is active (indicated by bullet point)
148
+ const initialFrame = lastFrame();
149
+ expect(initialFrame).toContain('Boolean Setting');
150
+ // Press down arrow
151
+ await act(async () => {
152
+ stdin.write(TerminalKeys.DOWN_ARROW);
153
+ });
154
+ // Navigation should move to next item
155
+ await waitFor(() => {
156
+ const frame = lastFrame();
157
+ // The active indicator should now be on a different row
158
+ expect(frame).toContain('String Setting');
159
+ });
160
+ });
161
+ it('should navigate up with arrow key', async () => {
162
+ const { stdin } = renderDialog();
163
+ // Press down then up
164
+ await act(async () => {
165
+ stdin.write(TerminalKeys.DOWN_ARROW);
166
+ });
167
+ await act(async () => {
168
+ stdin.write(TerminalKeys.UP_ARROW);
169
+ });
170
+ // Should be back at first item
171
+ await waitFor(() => {
172
+ // First item should be active again
173
+ expect(mockOnClose).not.toHaveBeenCalled();
174
+ });
175
+ });
176
+ it('should wrap around when navigating past last item', async () => {
177
+ const items = createMockItems().slice(0, 2); // Only 2 items
178
+ const { stdin } = renderDialog({ items });
179
+ // Press down twice to go past the last item
180
+ await act(async () => {
181
+ stdin.write(TerminalKeys.DOWN_ARROW);
182
+ stdin.write(TerminalKeys.DOWN_ARROW);
183
+ });
184
+ // Should wrap to first item - verify no crash
185
+ await waitFor(() => {
186
+ expect(mockOnClose).not.toHaveBeenCalled();
187
+ });
188
+ });
189
+ it('should wrap around when navigating before first item', async () => {
190
+ const { stdin } = renderDialog();
191
+ // Press up at first item
192
+ await act(async () => {
193
+ stdin.write(TerminalKeys.UP_ARROW);
194
+ });
195
+ // Should wrap to last item - verify no crash
196
+ await waitFor(() => {
197
+ expect(mockOnClose).not.toHaveBeenCalled();
198
+ });
199
+ });
200
+ it('should switch focus with Tab when scope selector is shown', async () => {
201
+ const { lastFrame, stdin } = renderDialog({
202
+ showScopeSelector: true,
203
+ onScopeChange: mockOnScopeChange,
204
+ });
205
+ // Initially settings section is focused (indicated by >)
206
+ expect(lastFrame()).toContain('> Test Settings');
207
+ // Press Tab to switch to scope selector
208
+ await act(async () => {
209
+ stdin.write(TerminalKeys.TAB);
210
+ });
211
+ await waitFor(() => {
212
+ expect(lastFrame()).toContain('> Apply To');
213
+ });
214
+ });
215
+ });
216
+ describe('item interactions', () => {
217
+ it('should call onItemToggle for boolean items on Enter', async () => {
218
+ const { stdin } = renderDialog();
219
+ // Press Enter on first item (boolean)
220
+ await act(async () => {
221
+ stdin.write(TerminalKeys.ENTER);
222
+ });
223
+ await waitFor(() => {
224
+ expect(mockOnItemToggle).toHaveBeenCalledWith('boolean-setting', expect.objectContaining({ type: 'boolean' }));
225
+ });
226
+ });
227
+ it('should call onItemToggle for enum items on Enter', async () => {
228
+ const items = createMockItems();
229
+ // Move enum to first position
230
+ const enumItem = items.find((i) => i.type === 'enum');
231
+ const { stdin } = renderDialog({ items: [enumItem] });
232
+ // Press Enter on enum item
233
+ await act(async () => {
234
+ stdin.write(TerminalKeys.ENTER);
235
+ });
236
+ await waitFor(() => {
237
+ expect(mockOnItemToggle).toHaveBeenCalledWith('enum-setting', expect.objectContaining({ type: 'enum' }));
238
+ });
239
+ });
240
+ it('should enter edit mode for string items on Enter', async () => {
241
+ const items = createMockItems();
242
+ const stringItem = items.find((i) => i.type === 'string');
243
+ const { lastFrame, stdin } = renderDialog({ items: [stringItem] });
244
+ // Press Enter to start editing
245
+ await act(async () => {
246
+ stdin.write(TerminalKeys.ENTER);
247
+ });
248
+ // Should show the edit buffer with cursor
249
+ await waitFor(() => {
250
+ const frame = lastFrame();
251
+ // In edit mode, the value should be displayed (possibly with cursor)
252
+ expect(frame).toContain('test-value');
253
+ });
254
+ });
255
+ it('should enter edit mode for number items on Enter', async () => {
256
+ const items = createMockItems();
257
+ const numberItem = items.find((i) => i.type === 'number');
258
+ const { lastFrame, stdin } = renderDialog({ items: [numberItem] });
259
+ // Press Enter to start editing
260
+ await act(async () => {
261
+ stdin.write(TerminalKeys.ENTER);
262
+ });
263
+ // Should show the edit buffer
264
+ await waitFor(() => {
265
+ const frame = lastFrame();
266
+ expect(frame).toContain('42');
267
+ });
268
+ });
269
+ it('should call onItemClear on Ctrl+L', async () => {
270
+ const { stdin } = renderDialog();
271
+ // Press Ctrl+L to reset
272
+ await act(async () => {
273
+ stdin.write(TerminalKeys.CTRL_L);
274
+ });
275
+ await waitFor(() => {
276
+ expect(mockOnItemClear).toHaveBeenCalledWith('boolean-setting', expect.objectContaining({ type: 'boolean' }));
277
+ });
278
+ });
279
+ });
280
+ describe('edit mode', () => {
281
+ it('should commit edit on Enter', async () => {
282
+ const items = createMockItems();
283
+ const stringItem = items.find((i) => i.type === 'string');
284
+ const { stdin } = renderDialog({ items: [stringItem] });
285
+ // Enter edit mode
286
+ await act(async () => {
287
+ stdin.write(TerminalKeys.ENTER);
288
+ });
289
+ // Type some characters
290
+ await act(async () => {
291
+ stdin.write('x');
292
+ });
293
+ // Commit with Enter
294
+ await act(async () => {
295
+ stdin.write(TerminalKeys.ENTER);
296
+ });
297
+ await waitFor(() => {
298
+ expect(mockOnEditCommit).toHaveBeenCalledWith('string-setting', 'test-valuex', expect.objectContaining({ type: 'string' }));
299
+ });
300
+ });
301
+ it('should commit edit on Escape', async () => {
302
+ const items = createMockItems();
303
+ const stringItem = items.find((i) => i.type === 'string');
304
+ const { stdin } = renderDialog({ items: [stringItem] });
305
+ // Enter edit mode
306
+ await act(async () => {
307
+ stdin.write(TerminalKeys.ENTER);
308
+ });
309
+ // Commit with Escape
310
+ await act(async () => {
311
+ stdin.write(TerminalKeys.ESCAPE);
312
+ });
313
+ await waitFor(() => {
314
+ expect(mockOnEditCommit).toHaveBeenCalled();
315
+ });
316
+ });
317
+ it('should commit edit and navigate on Down arrow', async () => {
318
+ const items = createMockItems();
319
+ const stringItem = items.find((i) => i.type === 'string');
320
+ const numberItem = items.find((i) => i.type === 'number');
321
+ const { stdin } = renderDialog({ items: [stringItem, numberItem] });
322
+ // Enter edit mode
323
+ await act(async () => {
324
+ stdin.write(TerminalKeys.ENTER);
325
+ });
326
+ // Press Down to commit and navigate
327
+ await act(async () => {
328
+ stdin.write(TerminalKeys.DOWN_ARROW);
329
+ });
330
+ await waitFor(() => {
331
+ expect(mockOnEditCommit).toHaveBeenCalled();
332
+ });
333
+ });
334
+ it('should commit edit and navigate on Up arrow', async () => {
335
+ const items = createMockItems();
336
+ const stringItem = items.find((i) => i.type === 'string');
337
+ const numberItem = items.find((i) => i.type === 'number');
338
+ const { stdin } = renderDialog({ items: [stringItem, numberItem] });
339
+ // Navigate to second item
340
+ await act(async () => {
341
+ stdin.write(TerminalKeys.DOWN_ARROW);
342
+ });
343
+ // Enter edit mode
344
+ await act(async () => {
345
+ stdin.write(TerminalKeys.ENTER);
346
+ });
347
+ // Press Up to commit and navigate
348
+ await act(async () => {
349
+ stdin.write(TerminalKeys.UP_ARROW);
350
+ });
351
+ await waitFor(() => {
352
+ expect(mockOnEditCommit).toHaveBeenCalled();
353
+ });
354
+ });
355
+ it('should allow number input for number fields', async () => {
356
+ const items = createMockItems();
357
+ const numberItem = items.find((i) => i.type === 'number');
358
+ const { stdin } = renderDialog({ items: [numberItem] });
359
+ // Enter edit mode
360
+ await act(async () => {
361
+ stdin.write(TerminalKeys.ENTER);
362
+ });
363
+ // Type numbers one at a time
364
+ await act(async () => {
365
+ stdin.write('1');
366
+ });
367
+ await act(async () => {
368
+ stdin.write('2');
369
+ });
370
+ await act(async () => {
371
+ stdin.write('3');
372
+ });
373
+ // Commit
374
+ await act(async () => {
375
+ stdin.write(TerminalKeys.ENTER);
376
+ });
377
+ await waitFor(() => {
378
+ expect(mockOnEditCommit).toHaveBeenCalledWith('number-setting', '42123', expect.objectContaining({ type: 'number' }));
379
+ });
380
+ });
381
+ it('should support quick number entry for number fields', async () => {
382
+ const items = createMockItems();
383
+ const numberItem = items.find((i) => i.type === 'number');
384
+ const { stdin } = renderDialog({ items: [numberItem] });
385
+ // Type a number directly (without Enter first)
386
+ await act(async () => {
387
+ stdin.write('5');
388
+ });
389
+ // Should start editing with that number
390
+ await waitFor(() => {
391
+ // Commit to verify
392
+ act(() => {
393
+ stdin.write(TerminalKeys.ENTER);
394
+ });
395
+ });
396
+ await waitFor(() => {
397
+ expect(mockOnEditCommit).toHaveBeenCalledWith('number-setting', '5', expect.objectContaining({ type: 'number' }));
398
+ });
399
+ });
400
+ });
401
+ describe('custom key handling', () => {
402
+ it('should call onKeyPress and respect its return value', async () => {
403
+ const customKeyHandler = vi.fn().mockReturnValue(true);
404
+ const { stdin } = renderDialog({
405
+ onKeyPress: customKeyHandler,
406
+ });
407
+ // Press a key
408
+ await act(async () => {
409
+ stdin.write('r');
410
+ });
411
+ await waitFor(() => {
412
+ expect(customKeyHandler).toHaveBeenCalled();
413
+ });
414
+ // Since handler returned true, default behavior should be blocked
415
+ expect(mockOnClose).not.toHaveBeenCalled();
416
+ });
417
+ });
418
+ describe('focus management', () => {
419
+ it('should keep focus on settings when scope selector is hidden', async () => {
420
+ const { lastFrame, stdin } = renderDialog({
421
+ showScopeSelector: false,
422
+ });
423
+ // Press Tab - should not crash and focus should stay on settings
424
+ await act(async () => {
425
+ stdin.write(TerminalKeys.TAB);
426
+ });
427
+ await waitFor(() => {
428
+ // Should still show settings as focused
429
+ expect(lastFrame()).toContain('> Test Settings');
430
+ });
431
+ });
432
+ });
433
+ });
434
+ //# sourceMappingURL=BaseSettingsDialog.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseSettingsDialog.test.js","sourceRoot":"","sources":["../../../../../src/ui/components/shared/BaseSettingsDialog.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import React from 'react';
7
+ export declare const MAX_WIDTH = 150;
8
+ export interface ExpandableTextProps {
9
+ label: string;
10
+ matchedIndex?: number;
11
+ userInput?: string;
12
+ textColor?: string;
13
+ isExpanded?: boolean;
14
+ maxWidth?: number;
15
+ maxLines?: number;
16
+ }
17
+ export declare const ExpandableText: React.NamedExoticComponent<ExpandableTextProps>;
@@ -1,25 +1,40 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /**
3
3
  * @license
4
- * Copyright 2025 Google LLC
4
+ * Copyright 2026 Google LLC
5
5
  * SPDX-License-Identifier: Apache-2.0
6
6
  */
7
7
  import React from 'react';
8
8
  import { Text } from 'ink';
9
- import { theme } from '../semantic-colors.js';
10
- export const MAX_WIDTH = 150; // Maximum width for the text that is shown
11
- const _PrepareLabel = ({ label, matchedIndex, userInput, textColor, isExpanded = false, }) => {
9
+ import { theme } from '../../semantic-colors.js';
10
+ export const MAX_WIDTH = 150;
11
+ const _ExpandableText = ({ label, matchedIndex, userInput = '', textColor = theme.text.primary, isExpanded = false, maxWidth = MAX_WIDTH, maxLines, }) => {
12
12
  const hasMatch = matchedIndex !== undefined &&
13
13
  matchedIndex >= 0 &&
14
14
  matchedIndex < label.length &&
15
15
  userInput.length > 0;
16
16
  // Render the plain label if there's no match
17
17
  if (!hasMatch) {
18
- const display = isExpanded
19
- ? label
20
- : label.length > MAX_WIDTH
21
- ? label.slice(0, MAX_WIDTH) + '...'
22
- : label;
18
+ let display = label;
19
+ if (!isExpanded) {
20
+ if (maxLines !== undefined) {
21
+ const lines = label.split('\n');
22
+ // 1. Truncate by logical lines
23
+ let truncated = lines.slice(0, maxLines).join('\n');
24
+ const hasMoreLines = lines.length > maxLines;
25
+ // 2. Truncate by characters (visual approximation) to prevent massive wrapping
26
+ if (truncated.length > maxWidth) {
27
+ truncated = truncated.slice(0, maxWidth) + '...';
28
+ }
29
+ else if (hasMoreLines) {
30
+ truncated += '...';
31
+ }
32
+ display = truncated;
33
+ }
34
+ else if (label.length > maxWidth) {
35
+ display = label.slice(0, maxWidth) + '...';
36
+ }
37
+ }
23
38
  return (_jsx(Text, { wrap: "wrap", color: textColor, children: display }));
24
39
  }
25
40
  const matchLength = userInput.length;
@@ -27,18 +42,18 @@ const _PrepareLabel = ({ label, matchedIndex, userInput, textColor, isExpanded =
27
42
  let match = '';
28
43
  let after = '';
29
44
  // Case 1: Show the full string if it's expanded or already fits
30
- if (isExpanded || label.length <= MAX_WIDTH) {
45
+ if (isExpanded || label.length <= maxWidth) {
31
46
  before = label.slice(0, matchedIndex);
32
47
  match = label.slice(matchedIndex, matchedIndex + matchLength);
33
48
  after = label.slice(matchedIndex + matchLength);
34
49
  }
35
50
  // Case 2: The match itself is too long, so we only show a truncated portion of the match
36
- else if (matchLength >= MAX_WIDTH) {
37
- match = label.slice(matchedIndex, matchedIndex + MAX_WIDTH - 1) + '...';
51
+ else if (matchLength >= maxWidth) {
52
+ match = label.slice(matchedIndex, matchedIndex + maxWidth - 1) + '...';
38
53
  }
39
54
  // Case 3: Truncate the string to create a window around the match
40
55
  else {
41
- const contextSpace = MAX_WIDTH - matchLength;
56
+ const contextSpace = maxWidth - matchLength;
42
57
  const beforeSpace = Math.floor(contextSpace / 2);
43
58
  const afterSpace = Math.ceil(contextSpace / 2);
44
59
  let start = matchedIndex - beforeSpace;
@@ -68,5 +83,5 @@ const _PrepareLabel = ({ label, matchedIndex, userInput, textColor, isExpanded =
68
83
  ? match.split(/(\s+)/).map((part, index) => (_jsx(Text, { color: theme.background.primary, backgroundColor: theme.text.primary, children: part }, `match-${index}`)))
69
84
  : null, after] }));
70
85
  };
71
- export const PrepareLabel = React.memo(_PrepareLabel);
72
- //# sourceMappingURL=PrepareLabel.js.map
86
+ export const ExpandableText = React.memo(_ExpandableText);
87
+ //# sourceMappingURL=ExpandableText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpandableText.js","sourceRoot":"","sources":["../../../../../src/ui/components/shared/ExpandableText.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -1,23 +1,23 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  /**
3
3
  * @license
4
- * Copyright 2025 Google LLC
4
+ * Copyright 2026 Google LLC
5
5
  * SPDX-License-Identifier: Apache-2.0
6
6
  */
7
7
  import { describe, it, expect } from 'vitest';
8
- import { render } from '../../test-utils/render.js';
9
- import { PrepareLabel, MAX_WIDTH } from './PrepareLabel.js';
10
- describe('PrepareLabel', () => {
8
+ import { render } from '../../../test-utils/render.js';
9
+ import { ExpandableText, MAX_WIDTH } from './ExpandableText.js';
10
+ describe('ExpandableText', () => {
11
11
  const color = 'white';
12
12
  const flat = (s) => (s ?? '').replace(/\n/g, '');
13
13
  it('renders plain label when no match (short label)', () => {
14
- const { lastFrame, unmount } = render(_jsx(PrepareLabel, { label: "simple command", userInput: "", matchedIndex: undefined, textColor: color, isExpanded: false }));
14
+ const { lastFrame, unmount } = render(_jsx(ExpandableText, { label: "simple command", userInput: "", matchedIndex: undefined, textColor: color, isExpanded: false }));
15
15
  expect(lastFrame()).toMatchSnapshot();
16
16
  unmount();
17
17
  });
18
18
  it('truncates long label when collapsed and no match', () => {
19
19
  const long = 'x'.repeat(MAX_WIDTH + 25);
20
- const { lastFrame, unmount } = render(_jsx(PrepareLabel, { label: long, userInput: "", textColor: color, isExpanded: false }));
20
+ const { lastFrame, unmount } = render(_jsx(ExpandableText, { label: long, userInput: "", textColor: color, isExpanded: false }));
21
21
  const out = lastFrame();
22
22
  const f = flat(out);
23
23
  expect(f.endsWith('...')).toBe(true);
@@ -27,7 +27,7 @@ describe('PrepareLabel', () => {
27
27
  });
28
28
  it('shows full long label when expanded and no match', () => {
29
29
  const long = 'y'.repeat(MAX_WIDTH + 25);
30
- const { lastFrame, unmount } = render(_jsx(PrepareLabel, { label: long, userInput: "", textColor: color, isExpanded: true }));
30
+ const { lastFrame, unmount } = render(_jsx(ExpandableText, { label: long, userInput: "", textColor: color, isExpanded: true }));
31
31
  const out = lastFrame();
32
32
  const f = flat(out);
33
33
  expect(f.length).toBe(long.length);
@@ -38,7 +38,7 @@ describe('PrepareLabel', () => {
38
38
  const label = 'run: git commit -m "feat: add search"';
39
39
  const userInput = 'commit';
40
40
  const matchedIndex = label.indexOf(userInput);
41
- const { lastFrame, unmount } = render(_jsx(PrepareLabel, { label: label, userInput: userInput, matchedIndex: matchedIndex, textColor: color, isExpanded: true }), 100);
41
+ const { lastFrame, unmount } = render(_jsx(ExpandableText, { label: label, userInput: userInput, matchedIndex: matchedIndex, textColor: color, isExpanded: true }), 100);
42
42
  expect(lastFrame()).toMatchSnapshot();
43
43
  unmount();
44
44
  });
@@ -48,7 +48,7 @@ describe('PrepareLabel', () => {
48
48
  const suffix = '/and/then/some/more/components/'.repeat(3);
49
49
  const label = prefix + core + suffix;
50
50
  const matchedIndex = prefix.length;
51
- const { lastFrame, unmount } = render(_jsx(PrepareLabel, { label: label, userInput: core, matchedIndex: matchedIndex, textColor: color, isExpanded: false }), 100);
51
+ const { lastFrame, unmount } = render(_jsx(ExpandableText, { label: label, userInput: core, matchedIndex: matchedIndex, textColor: color, isExpanded: false }), 100);
52
52
  const out = lastFrame();
53
53
  const f = flat(out);
54
54
  expect(f.includes(core)).toBe(true);
@@ -63,7 +63,7 @@ describe('PrepareLabel', () => {
63
63
  const suffix = ' in this text';
64
64
  const label = prefix + core + suffix;
65
65
  const matchedIndex = prefix.length;
66
- const { lastFrame, unmount } = render(_jsx(PrepareLabel, { label: label, userInput: core, matchedIndex: matchedIndex, textColor: color, isExpanded: false }));
66
+ const { lastFrame, unmount } = render(_jsx(ExpandableText, { label: label, userInput: core, matchedIndex: matchedIndex, textColor: color, isExpanded: false }));
67
67
  const out = lastFrame();
68
68
  const f = flat(out);
69
69
  expect(f.includes('...')).toBe(true);
@@ -73,5 +73,16 @@ describe('PrepareLabel', () => {
73
73
  expect(out).toMatchSnapshot();
74
74
  unmount();
75
75
  });
76
+ it('respects custom maxWidth', () => {
77
+ const customWidth = 50;
78
+ const long = 'z'.repeat(100);
79
+ const { lastFrame, unmount } = render(_jsx(ExpandableText, { label: long, userInput: "", textColor: color, isExpanded: false, maxWidth: customWidth }));
80
+ const out = lastFrame();
81
+ const f = flat(out);
82
+ expect(f.endsWith('...')).toBe(true);
83
+ expect(f.length).toBe(customWidth + 3);
84
+ expect(out).toMatchSnapshot();
85
+ unmount();
86
+ });
76
87
  });
77
- //# sourceMappingURL=PrepareLabel.test.js.map
88
+ //# sourceMappingURL=ExpandableText.test.js.map