@google/gemini-cli 0.0.3-preview.4 → 0.0.3

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 (599) hide show
  1. package/LICENSE +2 -2
  2. package/README.md +12 -2
  3. package/dist/package.json +6 -7
  4. package/dist/src/commands/extensions/disable.d.ts +1 -1
  5. package/dist/src/commands/extensions/disable.js +3 -3
  6. package/dist/src/commands/extensions/disable.js.map +1 -1
  7. package/dist/src/commands/extensions/enable.d.ts +1 -1
  8. package/dist/src/commands/extensions/enable.js +6 -8
  9. package/dist/src/commands/extensions/enable.js.map +1 -1
  10. package/dist/src/commands/extensions/examples/context/GEMINI.md +8 -0
  11. package/dist/src/commands/extensions/examples/context/gemini-extension.json +5 -0
  12. package/dist/src/commands/extensions/examples/custom-commands/commands/fs/grep-code.toml +6 -0
  13. package/dist/src/commands/extensions/examples/custom-commands/gemini-extension.json +4 -0
  14. package/dist/src/commands/extensions/examples/exclude-tools/gemini-extension.json +5 -0
  15. package/dist/src/commands/extensions/examples/mcp-server/example.js +46 -0
  16. package/dist/src/commands/extensions/examples/mcp-server/example.js.map +1 -0
  17. package/dist/src/commands/extensions/examples/mcp-server/example.ts +60 -0
  18. package/dist/src/commands/extensions/examples/mcp-server/gemini-extension.json +10 -0
  19. package/dist/src/commands/extensions/install.d.ts +1 -0
  20. package/dist/src/commands/extensions/install.js +41 -12
  21. package/dist/src/commands/extensions/install.js.map +1 -1
  22. package/dist/src/commands/extensions/install.test.js +79 -3
  23. package/dist/src/commands/extensions/install.test.js.map +1 -1
  24. package/dist/src/commands/extensions/link.d.ts +12 -0
  25. package/dist/src/commands/extensions/link.js +37 -0
  26. package/dist/src/commands/extensions/link.js.map +1 -0
  27. package/dist/src/commands/extensions/new.d.ts +7 -0
  28. package/dist/src/commands/extensions/new.js +70 -0
  29. package/dist/src/commands/extensions/new.js.map +1 -0
  30. package/dist/src/commands/extensions/new.test.d.ts +6 -0
  31. package/dist/src/commands/extensions/new.test.js +50 -0
  32. package/dist/src/commands/extensions/new.test.js.map +1 -0
  33. package/dist/src/commands/extensions/uninstall.js +1 -1
  34. package/dist/src/commands/extensions/uninstall.js.map +1 -1
  35. package/dist/src/commands/extensions/update.d.ts +2 -1
  36. package/dist/src/commands/extensions/update.js +46 -15
  37. package/dist/src/commands/extensions/update.js.map +1 -1
  38. package/dist/src/commands/extensions.js +4 -0
  39. package/dist/src/commands/extensions.js.map +1 -1
  40. package/dist/src/commands/mcp/add.js +1 -1
  41. package/dist/src/commands/mcp/add.js.map +1 -1
  42. package/dist/src/commands/mcp/list.js +2 -2
  43. package/dist/src/commands/mcp/list.js.map +1 -1
  44. package/dist/src/commands/mcp/remove.js +1 -1
  45. package/dist/src/commands/mcp/remove.js.map +1 -1
  46. package/dist/src/config/auth.d.ts +1 -1
  47. package/dist/src/config/auth.js +4 -4
  48. package/dist/src/config/auth.js.map +1 -1
  49. package/dist/src/config/auth.test.js +15 -7
  50. package/dist/src/config/auth.test.js.map +1 -1
  51. package/dist/src/config/config.d.ts +4 -1
  52. package/dist/src/config/config.js +57 -23
  53. package/dist/src/config/config.js.map +1 -1
  54. package/dist/src/config/extension.d.ts +20 -13
  55. package/dist/src/config/extension.js +261 -109
  56. package/dist/src/config/extension.js.map +1 -1
  57. package/dist/src/config/extensions/extensionEnablement.d.ts +30 -0
  58. package/dist/src/config/extensions/extensionEnablement.js +113 -0
  59. package/dist/src/config/extensions/extensionEnablement.js.map +1 -0
  60. package/dist/src/config/extensions/extensionEnablement.test.d.ts +6 -0
  61. package/dist/src/config/extensions/extensionEnablement.test.js +116 -0
  62. package/dist/src/config/extensions/extensionEnablement.test.js.map +1 -0
  63. package/dist/src/config/extensions/github.d.ts +25 -0
  64. package/dist/src/config/extensions/github.js +258 -0
  65. package/dist/src/config/extensions/github.js.map +1 -0
  66. package/dist/src/config/extensions/github.test.d.ts +6 -0
  67. package/dist/src/config/extensions/github.test.js +232 -0
  68. package/dist/src/config/extensions/github.test.js.map +1 -0
  69. package/dist/src/config/extensions/variableSchema.d.ts +8 -0
  70. package/dist/src/config/extensions/variableSchema.js +4 -0
  71. package/dist/src/config/extensions/variableSchema.js.map +1 -1
  72. package/dist/src/config/keyBindings.d.ts +5 -1
  73. package/dist/src/config/keyBindings.js +14 -25
  74. package/dist/src/config/keyBindings.js.map +1 -1
  75. package/dist/src/config/policy-engine.integration.test.d.ts +6 -0
  76. package/dist/src/config/policy-engine.integration.test.js +270 -0
  77. package/dist/src/config/policy-engine.integration.test.js.map +1 -0
  78. package/dist/src/config/policy.d.ts +8 -0
  79. package/dist/src/config/policy.js +150 -0
  80. package/dist/src/config/policy.js.map +1 -0
  81. package/dist/src/config/policy.test.d.ts +6 -0
  82. package/dist/src/config/policy.test.js +336 -0
  83. package/dist/src/config/policy.test.js.map +1 -0
  84. package/dist/src/config/settings.d.ts +8 -5
  85. package/dist/src/config/settings.js +148 -251
  86. package/dist/src/config/settings.js.map +1 -1
  87. package/dist/src/config/settingsSchema.d.ts +232 -23
  88. package/dist/src/config/settingsSchema.js +222 -20
  89. package/dist/src/config/settingsSchema.js.map +1 -1
  90. package/dist/src/config/settingsSchema.test.js +68 -55
  91. package/dist/src/config/settingsSchema.test.js.map +1 -1
  92. package/dist/src/config/trustedFolders.d.ts +13 -3
  93. package/dist/src/config/trustedFolders.js +66 -42
  94. package/dist/src/config/trustedFolders.js.map +1 -1
  95. package/dist/src/config/trustedFolders.test.js +107 -12
  96. package/dist/src/config/trustedFolders.test.js.map +1 -1
  97. package/dist/src/core/auth.d.ts +13 -0
  98. package/dist/src/core/auth.js +27 -0
  99. package/dist/src/core/auth.js.map +1 -0
  100. package/dist/src/core/initializer.d.ts +21 -0
  101. package/dist/src/core/initializer.js +33 -0
  102. package/dist/src/core/initializer.js.map +1 -0
  103. package/dist/src/core/theme.d.ts +12 -0
  104. package/dist/src/core/theme.js +20 -0
  105. package/dist/src/core/theme.js.map +1 -0
  106. package/dist/src/gemini.d.ts +2 -1
  107. package/dist/src/gemini.js +96 -51
  108. package/dist/src/gemini.js.map +1 -1
  109. package/dist/src/gemini.test.js +113 -42
  110. package/dist/src/gemini.test.js.map +1 -1
  111. package/dist/src/generated/git-commit.d.ts +2 -2
  112. package/dist/src/generated/git-commit.js +2 -2
  113. package/dist/src/generated/git-commit.js.map +1 -1
  114. package/dist/src/nonInteractiveCli.js +87 -71
  115. package/dist/src/nonInteractiveCli.js.map +1 -1
  116. package/dist/src/services/BuiltinCommandLoader.js +1 -1
  117. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  118. package/dist/src/services/BuiltinCommandLoader.test.js +16 -17
  119. package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -1
  120. package/dist/src/services/FileCommandLoader.d.ts +2 -0
  121. package/dist/src/services/FileCommandLoader.js +7 -0
  122. package/dist/src/services/FileCommandLoader.js.map +1 -1
  123. package/dist/src/services/McpPromptLoader.js +43 -8
  124. package/dist/src/services/McpPromptLoader.js.map +1 -1
  125. package/dist/src/services/McpPromptLoader.test.js +228 -1
  126. package/dist/src/services/McpPromptLoader.test.js.map +1 -1
  127. package/dist/src/services/prompt-processors/shellProcessor.js +8 -1
  128. package/dist/src/services/prompt-processors/shellProcessor.js.map +1 -1
  129. package/dist/src/ui/App.d.ts +1 -10
  130. package/dist/src/ui/App.js +13 -667
  131. package/dist/src/ui/App.js.map +1 -1
  132. package/dist/src/ui/AppContainer.d.ts +17 -0
  133. package/dist/src/ui/AppContainer.js +879 -0
  134. package/dist/src/ui/AppContainer.js.map +1 -0
  135. package/dist/src/ui/AppContainer.test.d.ts +6 -0
  136. package/dist/src/ui/AppContainer.test.js +414 -0
  137. package/dist/src/ui/AppContainer.test.js.map +1 -0
  138. package/dist/src/ui/IdeIntegrationNudge.d.ts +2 -2
  139. package/dist/src/ui/IdeIntegrationNudge.js +3 -3
  140. package/dist/src/ui/IdeIntegrationNudge.js.map +1 -1
  141. package/dist/src/ui/auth/AuthDialog.d.ts +18 -0
  142. package/dist/src/ui/auth/AuthDialog.js +99 -0
  143. package/dist/src/ui/auth/AuthDialog.js.map +1 -0
  144. package/dist/src/ui/auth/AuthDialog.test.d.ts +6 -0
  145. package/dist/src/ui/auth/AuthDialog.test.js +184 -0
  146. package/dist/src/ui/auth/AuthDialog.test.js.map +1 -0
  147. package/dist/src/ui/{components → auth}/AuthInProgress.js +2 -2
  148. package/dist/src/ui/auth/AuthInProgress.js.map +1 -0
  149. package/dist/src/ui/auth/useAuth.d.ts +15 -0
  150. package/dist/src/ui/auth/useAuth.js +73 -0
  151. package/dist/src/ui/auth/useAuth.js.map +1 -0
  152. package/dist/src/ui/commands/aboutCommand.js +9 -3
  153. package/dist/src/ui/commands/aboutCommand.js.map +1 -1
  154. package/dist/src/ui/commands/bugCommand.js +9 -4
  155. package/dist/src/ui/commands/bugCommand.js.map +1 -1
  156. package/dist/src/ui/commands/chatCommand.d.ts +2 -0
  157. package/dist/src/ui/commands/chatCommand.js +82 -3
  158. package/dist/src/ui/commands/chatCommand.js.map +1 -1
  159. package/dist/src/ui/commands/clearCommand.js +1 -1
  160. package/dist/src/ui/commands/clearCommand.js.map +1 -1
  161. package/dist/src/ui/commands/corgiCommand.js +1 -0
  162. package/dist/src/ui/commands/corgiCommand.js.map +1 -1
  163. package/dist/src/ui/commands/directoryCommand.js +1 -1
  164. package/dist/src/ui/commands/directoryCommand.js.map +1 -1
  165. package/dist/src/ui/commands/extensionsCommand.js +70 -16
  166. package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
  167. package/dist/src/ui/commands/ideCommand.d.ts +1 -2
  168. package/dist/src/ui/commands/ideCommand.js +19 -10
  169. package/dist/src/ui/commands/ideCommand.js.map +1 -1
  170. package/dist/src/ui/commands/mcpCommand.js +14 -5
  171. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  172. package/dist/src/ui/commands/memoryCommand.js +1 -1
  173. package/dist/src/ui/commands/memoryCommand.js.map +1 -1
  174. package/dist/src/ui/commands/types.d.ts +5 -1
  175. package/dist/src/ui/commands/types.js +0 -1
  176. package/dist/src/ui/commands/types.js.map +1 -1
  177. package/dist/src/ui/components/AboutBox.js +2 -2
  178. package/dist/src/ui/components/AboutBox.js.map +1 -1
  179. package/dist/src/ui/components/AnsiOutput.d.ts +13 -0
  180. package/dist/src/ui/components/AnsiOutput.js +12 -0
  181. package/dist/src/ui/components/AnsiOutput.js.map +1 -0
  182. package/dist/src/ui/components/AnsiOutput.test.d.ts +6 -0
  183. package/dist/src/ui/components/AnsiOutput.test.js +97 -0
  184. package/dist/src/ui/components/AnsiOutput.test.js.map +1 -0
  185. package/dist/src/ui/components/AppHeader.d.ts +10 -0
  186. package/dist/src/ui/components/AppHeader.js +22 -0
  187. package/dist/src/ui/components/AppHeader.js.map +1 -0
  188. package/dist/src/ui/components/AutoAcceptIndicator.js +4 -4
  189. package/dist/src/ui/components/AutoAcceptIndicator.js.map +1 -1
  190. package/dist/src/ui/components/Composer.d.ts +6 -0
  191. package/dist/src/ui/components/Composer.js +73 -0
  192. package/dist/src/ui/components/Composer.js.map +1 -0
  193. package/dist/src/ui/components/Composer.test.d.ts +6 -0
  194. package/dist/src/ui/components/Composer.test.js +337 -0
  195. package/dist/src/ui/components/Composer.test.js.map +1 -0
  196. package/dist/src/ui/components/ConfigInitDisplay.d.ts +6 -0
  197. package/dist/src/ui/components/ConfigInitDisplay.js +38 -0
  198. package/dist/src/ui/components/ConfigInitDisplay.js.map +1 -0
  199. package/dist/src/ui/components/ConsoleSummaryDisplay.js +2 -2
  200. package/dist/src/ui/components/ConsoleSummaryDisplay.js.map +1 -1
  201. package/dist/src/ui/components/ContextSummaryDisplay.js +3 -3
  202. package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
  203. package/dist/src/ui/components/ContextUsageDisplay.js +2 -2
  204. package/dist/src/ui/components/ContextUsageDisplay.js.map +1 -1
  205. package/dist/src/ui/components/DebugProfiler.js +2 -2
  206. package/dist/src/ui/components/DebugProfiler.js.map +1 -1
  207. package/dist/src/ui/components/DetailedMessagesDisplay.js +7 -7
  208. package/dist/src/ui/components/DetailedMessagesDisplay.js.map +1 -1
  209. package/dist/src/ui/components/DialogManager.d.ts +6 -0
  210. package/dist/src/ui/components/DialogManager.js +85 -0
  211. package/dist/src/ui/components/DialogManager.js.map +1 -0
  212. package/dist/src/ui/components/EditorSettingsDialog.js +5 -5
  213. package/dist/src/ui/components/EditorSettingsDialog.js.map +1 -1
  214. package/dist/src/ui/components/FolderTrustDialog.js +19 -9
  215. package/dist/src/ui/components/FolderTrustDialog.js.map +1 -1
  216. package/dist/src/ui/components/FolderTrustDialog.test.js +35 -10
  217. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
  218. package/dist/src/ui/components/Footer.d.ts +4 -2
  219. package/dist/src/ui/components/Footer.js +8 -3
  220. package/dist/src/ui/components/Footer.js.map +1 -1
  221. package/dist/src/ui/components/GeminiRespondingSpinner.d.ts +5 -0
  222. package/dist/src/ui/components/GeminiRespondingSpinner.js +7 -2
  223. package/dist/src/ui/components/GeminiRespondingSpinner.js.map +1 -1
  224. package/dist/src/ui/components/Header.js +2 -2
  225. package/dist/src/ui/components/Header.js.map +1 -1
  226. package/dist/src/ui/components/Help.d.ts +1 -1
  227. package/dist/src/ui/components/Help.js +9 -6
  228. package/dist/src/ui/components/Help.js.map +1 -1
  229. package/dist/src/ui/components/Help.test.d.ts +6 -0
  230. package/dist/src/ui/components/Help.test.js +57 -0
  231. package/dist/src/ui/components/Help.test.js.map +1 -0
  232. package/dist/src/ui/components/HistoryItemDisplay.d.ts +2 -2
  233. package/dist/src/ui/components/HistoryItemDisplay.js +3 -1
  234. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  235. package/dist/src/ui/components/InputPrompt.d.ts +9 -0
  236. package/dist/src/ui/components/InputPrompt.js +180 -42
  237. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  238. package/dist/src/ui/components/LoadingIndicator.js +2 -2
  239. package/dist/src/ui/components/LoadingIndicator.js.map +1 -1
  240. package/dist/src/ui/components/LoopDetectionConfirmation.d.ts +13 -0
  241. package/dist/src/ui/components/LoopDetectionConfirmation.js +35 -0
  242. package/dist/src/ui/components/LoopDetectionConfirmation.js.map +1 -0
  243. package/dist/src/ui/components/LoopDetectionConfirmation.test.d.ts +6 -0
  244. package/dist/src/ui/components/LoopDetectionConfirmation.test.js +25 -0
  245. package/dist/src/ui/components/LoopDetectionConfirmation.test.js.map +1 -0
  246. package/dist/src/ui/components/MainContent.d.ts +6 -0
  247. package/dist/src/ui/components/MainContent.js +23 -0
  248. package/dist/src/ui/components/MainContent.js.map +1 -0
  249. package/dist/src/ui/components/MemoryUsageDisplay.js +6 -4
  250. package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -1
  251. package/dist/src/ui/components/ModelStatsDisplay.js +7 -7
  252. package/dist/src/ui/components/ModelStatsDisplay.js.map +1 -1
  253. package/dist/src/ui/components/Notifications.d.ts +6 -0
  254. package/dist/src/ui/components/Notifications.js +23 -0
  255. package/dist/src/ui/components/Notifications.js.map +1 -0
  256. package/dist/src/ui/components/PrepareLabel.d.ts +5 -5
  257. package/dist/src/ui/components/PrepareLabel.js +67 -11
  258. package/dist/src/ui/components/PrepareLabel.js.map +1 -1
  259. package/dist/src/ui/components/PrepareLabel.test.d.ts +6 -0
  260. package/dist/src/ui/components/PrepareLabel.test.js +71 -0
  261. package/dist/src/ui/components/PrepareLabel.test.js.map +1 -0
  262. package/dist/src/ui/components/ProQuotaDialog.d.ts +13 -0
  263. package/dist/src/ui/components/ProQuotaDialog.js +21 -0
  264. package/dist/src/ui/components/ProQuotaDialog.js.map +1 -0
  265. package/dist/src/ui/components/ProQuotaDialog.test.d.ts +6 -0
  266. package/dist/src/ui/components/ProQuotaDialog.test.js +56 -0
  267. package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -0
  268. package/dist/src/ui/components/QueuedMessageDisplay.d.ts +9 -0
  269. package/dist/src/ui/components/QueuedMessageDisplay.js +20 -0
  270. package/dist/src/ui/components/QueuedMessageDisplay.js.map +1 -0
  271. package/dist/src/ui/components/QueuedMessageDisplay.test.d.ts +6 -0
  272. package/dist/src/ui/components/QueuedMessageDisplay.test.js +56 -0
  273. package/dist/src/ui/components/QueuedMessageDisplay.test.js.map +1 -0
  274. package/dist/src/ui/components/QuittingDisplay.d.ts +6 -0
  275. package/dist/src/ui/components/QuittingDisplay.js +20 -0
  276. package/dist/src/ui/components/QuittingDisplay.js.map +1 -0
  277. package/dist/src/ui/components/SettingsDialog.d.ts +2 -1
  278. package/dist/src/ui/components/SettingsDialog.js +93 -22
  279. package/dist/src/ui/components/SettingsDialog.js.map +1 -1
  280. package/dist/src/ui/components/SettingsDialog.test.js +436 -80
  281. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  282. package/dist/src/ui/components/ShellConfirmationDialog.js +2 -2
  283. package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -1
  284. package/dist/src/ui/components/ShellInputPrompt.d.ts +11 -0
  285. package/dist/src/ui/components/ShellInputPrompt.js +36 -0
  286. package/dist/src/ui/components/ShellInputPrompt.js.map +1 -0
  287. package/dist/src/ui/components/ShellModeIndicator.js +2 -2
  288. package/dist/src/ui/components/ShellModeIndicator.js.map +1 -1
  289. package/dist/src/ui/components/ShowMoreLines.js +2 -2
  290. package/dist/src/ui/components/ShowMoreLines.js.map +1 -1
  291. package/dist/src/ui/components/StatsDisplay.js +6 -6
  292. package/dist/src/ui/components/StatsDisplay.js.map +1 -1
  293. package/dist/src/ui/components/SuggestionsDisplay.d.ts +7 -2
  294. package/dist/src/ui/components/SuggestionsDisplay.js +17 -17
  295. package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
  296. package/dist/src/ui/components/ThemeDialog.js +12 -29
  297. package/dist/src/ui/components/ThemeDialog.js.map +1 -1
  298. package/dist/src/ui/components/ThemeDialog.test.d.ts +6 -0
  299. package/dist/src/ui/components/ThemeDialog.test.js +75 -0
  300. package/dist/src/ui/components/ThemeDialog.test.js.map +1 -0
  301. package/dist/src/ui/components/Tips.js +2 -2
  302. package/dist/src/ui/components/Tips.js.map +1 -1
  303. package/dist/src/ui/components/ToolStatsDisplay.js +4 -4
  304. package/dist/src/ui/components/ToolStatsDisplay.js.map +1 -1
  305. package/dist/src/ui/components/UpdateNotification.js +2 -2
  306. package/dist/src/ui/components/UpdateNotification.js.map +1 -1
  307. package/dist/src/ui/components/WorkspaceMigrationDialog.js +4 -4
  308. package/dist/src/ui/components/WorkspaceMigrationDialog.js.map +1 -1
  309. package/dist/src/ui/components/messages/CompressionMessage.d.ts +1 -2
  310. package/dist/src/ui/components/messages/CompressionMessage.js +37 -8
  311. package/dist/src/ui/components/messages/CompressionMessage.js.map +1 -1
  312. package/dist/src/ui/components/messages/CompressionMessage.test.d.ts +6 -0
  313. package/dist/src/ui/components/messages/CompressionMessage.test.js +160 -0
  314. package/dist/src/ui/components/messages/CompressionMessage.test.js.map +1 -0
  315. package/dist/src/ui/components/messages/DiffRenderer.d.ts +2 -1
  316. package/dist/src/ui/components/messages/DiffRenderer.js +14 -22
  317. package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
  318. package/dist/src/ui/components/messages/ErrorMessage.js +2 -2
  319. package/dist/src/ui/components/messages/ErrorMessage.js.map +1 -1
  320. package/dist/src/ui/components/messages/GeminiMessage.js +2 -2
  321. package/dist/src/ui/components/messages/GeminiMessage.js.map +1 -1
  322. package/dist/src/ui/components/messages/InfoMessage.js +2 -2
  323. package/dist/src/ui/components/messages/InfoMessage.js.map +1 -1
  324. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +33 -21
  325. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  326. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +0 -8
  327. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -1
  328. package/dist/src/ui/components/messages/ToolGroupMessage.d.ts +3 -2
  329. package/dist/src/ui/components/messages/ToolGroupMessage.js +17 -9
  330. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  331. package/dist/src/ui/components/messages/ToolGroupMessage.test.js +17 -15
  332. package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -1
  333. package/dist/src/ui/components/messages/ToolMessage.d.ts +4 -0
  334. package/dist/src/ui/components/messages/ToolMessage.js +24 -10
  335. package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
  336. package/dist/src/ui/components/messages/ToolMessage.test.js +33 -1
  337. package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -1
  338. package/dist/src/ui/components/messages/UserMessage.js +3 -3
  339. package/dist/src/ui/components/messages/UserMessage.js.map +1 -1
  340. package/dist/src/ui/components/messages/UserShellMessage.js +2 -2
  341. package/dist/src/ui/components/messages/UserShellMessage.js.map +1 -1
  342. package/dist/src/ui/components/messages/WarningMessage.d.ts +11 -0
  343. package/dist/src/ui/components/messages/WarningMessage.js +10 -0
  344. package/dist/src/ui/components/messages/WarningMessage.js.map +1 -0
  345. package/dist/src/ui/components/shared/EnumSelector.d.ts +18 -0
  346. package/dist/src/ui/components/shared/EnumSelector.js +44 -0
  347. package/dist/src/ui/components/shared/EnumSelector.js.map +1 -0
  348. package/dist/src/ui/components/shared/EnumSelector.test.d.ts +6 -0
  349. package/dist/src/ui/components/shared/EnumSelector.test.js +70 -0
  350. package/dist/src/ui/components/shared/EnumSelector.test.js.map +1 -0
  351. package/dist/src/ui/components/shared/MaxSizedBox.js +2 -2
  352. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
  353. package/dist/src/ui/components/shared/RadioButtonSelect.js +12 -12
  354. package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
  355. package/dist/src/ui/components/shared/ScopeSelector.d.ts +19 -0
  356. package/dist/src/ui/components/shared/ScopeSelector.js +11 -0
  357. package/dist/src/ui/components/shared/ScopeSelector.js.map +1 -0
  358. package/dist/src/ui/components/shared/text-buffer.d.ts +25 -2
  359. package/dist/src/ui/components/shared/text-buffer.js +296 -187
  360. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  361. package/dist/src/ui/components/views/ExtensionsList.d.ts +6 -0
  362. package/dist/src/ui/components/views/ExtensionsList.js +47 -0
  363. package/dist/src/ui/components/views/ExtensionsList.js.map +1 -0
  364. package/dist/src/ui/components/views/ExtensionsList.test.d.ts +6 -0
  365. package/dist/src/ui/components/views/ExtensionsList.test.js +97 -0
  366. package/dist/src/ui/components/views/ExtensionsList.test.js.map +1 -0
  367. package/dist/src/ui/constants.d.ts +1 -0
  368. package/dist/src/ui/constants.js +1 -0
  369. package/dist/src/ui/constants.js.map +1 -1
  370. package/dist/src/ui/contexts/AppContext.d.ts +11 -0
  371. package/dist/src/ui/contexts/AppContext.js +15 -0
  372. package/dist/src/ui/contexts/AppContext.js.map +1 -0
  373. package/dist/src/ui/contexts/ConfigContext.d.ts +9 -0
  374. package/dist/src/ui/contexts/ConfigContext.js +16 -0
  375. package/dist/src/ui/contexts/ConfigContext.js.map +1 -0
  376. package/dist/src/ui/contexts/FocusContext.d.ts +7 -0
  377. package/dist/src/ui/contexts/FocusContext.js +9 -0
  378. package/dist/src/ui/contexts/FocusContext.js.map +1 -0
  379. package/dist/src/ui/contexts/KeypressContext.d.ts +3 -0
  380. package/dist/src/ui/contexts/KeypressContext.js +306 -44
  381. package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
  382. package/dist/src/ui/contexts/KeypressContext.test.js +288 -2
  383. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
  384. package/dist/src/ui/contexts/SessionContext.d.ts +6 -0
  385. package/dist/src/ui/contexts/SessionContext.js +107 -5
  386. package/dist/src/ui/contexts/SessionContext.js.map +1 -1
  387. package/dist/src/ui/contexts/UIActionsContext.d.ts +36 -0
  388. package/dist/src/ui/contexts/UIActionsContext.js +20 -0
  389. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -0
  390. package/dist/src/ui/contexts/UIStateContext.d.ts +95 -0
  391. package/dist/src/ui/contexts/UIStateContext.js +15 -0
  392. package/dist/src/ui/contexts/UIStateContext.js.map +1 -0
  393. package/dist/src/ui/hooks/atCommandProcessor.test.js +7 -5
  394. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
  395. package/dist/src/ui/hooks/keyToAnsi.d.ts +15 -0
  396. package/dist/src/ui/hooks/keyToAnsi.js +67 -0
  397. package/dist/src/ui/hooks/keyToAnsi.js.map +1 -0
  398. package/dist/src/ui/hooks/shellCommandProcessor.d.ts +2 -1
  399. package/dist/src/ui/hooks/shellCommandProcessor.js +60 -15
  400. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
  401. package/dist/src/ui/hooks/shellCommandProcessor.test.js +196 -17
  402. package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +1 -1
  403. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +15 -2
  404. package/dist/src/ui/hooks/slashCommandProcessor.js +36 -73
  405. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  406. package/dist/src/ui/hooks/useAutoAcceptIndicator.d.ts +3 -2
  407. package/dist/src/ui/hooks/useAutoAcceptIndicator.js +9 -5
  408. package/dist/src/ui/hooks/useAutoAcceptIndicator.js.map +1 -1
  409. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js +69 -0
  410. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js.map +1 -1
  411. package/dist/src/ui/hooks/useFolderTrust.d.ts +1 -1
  412. package/dist/src/ui/hooks/useFolderTrust.js +12 -11
  413. package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
  414. package/dist/src/ui/hooks/useGeminiStream.d.ts +13 -2
  415. package/dist/src/ui/hooks/useGeminiStream.js +150 -60
  416. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  417. package/dist/src/ui/hooks/useGitBranchName.js +15 -18
  418. package/dist/src/ui/hooks/useGitBranchName.js.map +1 -1
  419. package/dist/src/ui/hooks/useGitBranchName.test.js +49 -53
  420. package/dist/src/ui/hooks/useGitBranchName.test.js.map +1 -1
  421. package/dist/src/ui/hooks/useIdeTrustListener.d.ts +14 -0
  422. package/dist/src/ui/hooks/useIdeTrustListener.js +39 -0
  423. package/dist/src/ui/hooks/useIdeTrustListener.js.map +1 -0
  424. package/dist/src/ui/hooks/useInputHistoryStore.d.ts +19 -0
  425. package/dist/src/ui/hooks/useInputHistoryStore.js +81 -0
  426. package/dist/src/ui/hooks/useInputHistoryStore.js.map +1 -0
  427. package/dist/src/ui/hooks/useInputHistoryStore.test.d.ts +6 -0
  428. package/dist/src/ui/hooks/useInputHistoryStore.test.js +234 -0
  429. package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +1 -0
  430. package/dist/src/ui/hooks/useLoadingIndicator.d.ts +1 -1
  431. package/dist/src/ui/hooks/useLoadingIndicator.js +2 -2
  432. package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
  433. package/dist/src/ui/hooks/useLoadingIndicator.test.js +2 -2
  434. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
  435. package/dist/src/ui/hooks/useMemoryMonitor.d.ts +13 -0
  436. package/dist/src/ui/hooks/useMemoryMonitor.js +28 -0
  437. package/dist/src/ui/hooks/useMemoryMonitor.js.map +1 -0
  438. package/dist/src/ui/hooks/useMemoryMonitor.test.d.ts +6 -0
  439. package/dist/src/ui/hooks/useMemoryMonitor.test.js +57 -0
  440. package/dist/src/ui/hooks/useMemoryMonitor.test.js.map +1 -0
  441. package/dist/src/ui/hooks/useMessageQueue.d.ts +2 -1
  442. package/dist/src/ui/hooks/useMessageQueue.js +5 -3
  443. package/dist/src/ui/hooks/useMessageQueue.js.map +1 -1
  444. package/dist/src/ui/hooks/useMessageQueue.test.js +9 -0
  445. package/dist/src/ui/hooks/useMessageQueue.test.js.map +1 -1
  446. package/dist/src/ui/hooks/usePhraseCycler.d.ts +1 -1
  447. package/dist/src/ui/hooks/usePhraseCycler.js +11 -8
  448. package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
  449. package/dist/src/ui/hooks/usePrivacySettings.d.ts +1 -1
  450. package/dist/src/ui/hooks/usePrivacySettings.js +8 -13
  451. package/dist/src/ui/hooks/usePrivacySettings.js.map +1 -1
  452. package/dist/src/ui/hooks/usePrivacySettings.test.js +33 -97
  453. package/dist/src/ui/hooks/usePrivacySettings.test.js.map +1 -1
  454. package/dist/src/ui/hooks/useQuotaAndFallback.d.ts +21 -0
  455. package/dist/src/ui/hooks/useQuotaAndFallback.js +122 -0
  456. package/dist/src/ui/hooks/useQuotaAndFallback.js.map +1 -0
  457. package/dist/src/ui/hooks/useQuotaAndFallback.test.d.ts +6 -0
  458. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +267 -0
  459. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -0
  460. package/dist/src/ui/hooks/useReactToolScheduler.d.ts +3 -2
  461. package/dist/src/ui/hooks/useReactToolScheduler.js +23 -17
  462. package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
  463. package/dist/src/ui/hooks/useReverseSearchCompletion.d.ts +1 -1
  464. package/dist/src/ui/hooks/useReverseSearchCompletion.js +67 -20
  465. package/dist/src/ui/hooks/useReverseSearchCompletion.js.map +1 -1
  466. package/dist/src/ui/hooks/useSlashCompletion.d.ts +1 -1
  467. package/dist/src/ui/hooks/useSlashCompletion.js +276 -67
  468. package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
  469. package/dist/src/ui/hooks/useSlashCompletion.test.d.ts +4 -1
  470. package/dist/src/ui/hooks/useSlashCompletion.test.js +357 -65
  471. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
  472. package/dist/src/ui/hooks/useStateAndRef.d.ts +1 -1
  473. package/dist/src/ui/hooks/useStateAndRef.js +2 -2
  474. package/dist/src/ui/hooks/useStateAndRef.js.map +1 -1
  475. package/dist/src/ui/hooks/useThemeCommand.d.ts +1 -1
  476. package/dist/src/ui/hooks/useThemeCommand.js +3 -14
  477. package/dist/src/ui/hooks/useThemeCommand.js.map +1 -1
  478. package/dist/src/ui/hooks/useToolScheduler.test.js +66 -61
  479. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  480. package/dist/src/ui/hooks/useWorkspaceMigration.js +2 -1
  481. package/dist/src/ui/hooks/useWorkspaceMigration.js.map +1 -1
  482. package/dist/src/ui/keyMatchers.test.js +17 -0
  483. package/dist/src/ui/keyMatchers.test.js.map +1 -1
  484. package/dist/src/ui/privacy/CloudFreePrivacyNotice.js +5 -5
  485. package/dist/src/ui/privacy/CloudFreePrivacyNotice.js.map +1 -1
  486. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.js +2 -2
  487. package/dist/src/ui/privacy/CloudPaidPrivacyNotice.js.map +1 -1
  488. package/dist/src/ui/privacy/GeminiPrivacyNotice.js +2 -2
  489. package/dist/src/ui/privacy/GeminiPrivacyNotice.js.map +1 -1
  490. package/dist/src/ui/state/extensions.d.ts +14 -0
  491. package/dist/src/ui/state/extensions.js +16 -0
  492. package/dist/src/ui/state/extensions.js.map +1 -0
  493. package/dist/src/ui/themes/ayu.js +1 -1
  494. package/dist/src/ui/themes/dracula.js +2 -2
  495. package/dist/src/ui/themes/github-dark.js +1 -1
  496. package/dist/src/ui/themes/theme.js +17 -17
  497. package/dist/src/ui/themes/theme.js.map +1 -1
  498. package/dist/src/ui/types.d.ts +34 -3
  499. package/dist/src/ui/types.js +12 -0
  500. package/dist/src/ui/types.js.map +1 -1
  501. package/dist/src/ui/utils/CodeColorizer.js +3 -2
  502. package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
  503. package/dist/src/ui/utils/InlineMarkdownRenderer.js +7 -7
  504. package/dist/src/ui/utils/InlineMarkdownRenderer.js.map +1 -1
  505. package/dist/src/ui/utils/MarkdownDisplay.js +10 -10
  506. package/dist/src/ui/utils/MarkdownDisplay.js.map +1 -1
  507. package/dist/src/ui/utils/MarkdownDisplay.test.js +6 -2
  508. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -1
  509. package/dist/src/ui/utils/TableRenderer.js +4 -4
  510. package/dist/src/ui/utils/TableRenderer.js.map +1 -1
  511. package/dist/src/ui/utils/clipboardUtils.js +5 -6
  512. package/dist/src/ui/utils/clipboardUtils.js.map +1 -1
  513. package/dist/src/ui/utils/displayUtils.js +4 -4
  514. package/dist/src/ui/utils/displayUtils.js.map +1 -1
  515. package/dist/src/ui/utils/highlight.d.ts +11 -0
  516. package/dist/src/ui/utils/highlight.js +78 -0
  517. package/dist/src/ui/utils/highlight.js.map +1 -0
  518. package/dist/src/ui/utils/highlight.test.d.ts +6 -0
  519. package/dist/src/ui/utils/highlight.test.js +120 -0
  520. package/dist/src/ui/utils/highlight.test.js.map +1 -0
  521. package/dist/src/ui/utils/kittyProtocolDetector.js +39 -29
  522. package/dist/src/ui/utils/kittyProtocolDetector.js.map +1 -1
  523. package/dist/src/ui/utils/platformConstants.d.ts +24 -1
  524. package/dist/src/ui/utils/platformConstants.js +26 -1
  525. package/dist/src/ui/utils/platformConstants.js.map +1 -1
  526. package/dist/src/ui/utils/textUtils.d.ts +9 -0
  527. package/dist/src/ui/utils/textUtils.js +52 -3
  528. package/dist/src/ui/utils/textUtils.js.map +1 -1
  529. package/dist/src/utils/commands.d.ts +20 -0
  530. package/dist/src/utils/commands.js +53 -0
  531. package/dist/src/utils/commands.js.map +1 -0
  532. package/dist/src/utils/commands.test.d.ts +6 -0
  533. package/dist/src/utils/commands.test.js +115 -0
  534. package/dist/src/utils/commands.test.js.map +1 -0
  535. package/dist/src/utils/commentJson.d.ts +9 -0
  536. package/dist/src/utils/commentJson.js +48 -0
  537. package/dist/src/utils/commentJson.js.map +1 -0
  538. package/dist/src/utils/commentJson.test.d.ts +6 -0
  539. package/dist/src/utils/commentJson.test.js +146 -0
  540. package/dist/src/utils/commentJson.test.js.map +1 -0
  541. package/dist/src/utils/deepMerge.d.ts +10 -0
  542. package/dist/src/utils/deepMerge.js +58 -0
  543. package/dist/src/utils/deepMerge.js.map +1 -0
  544. package/dist/src/utils/deepMerge.test.d.ts +6 -0
  545. package/dist/src/utils/deepMerge.test.js +143 -0
  546. package/dist/src/utils/deepMerge.test.js.map +1 -0
  547. package/dist/src/utils/envVarResolver.d.ts +39 -0
  548. package/dist/src/utils/envVarResolver.js +97 -0
  549. package/dist/src/utils/envVarResolver.js.map +1 -0
  550. package/dist/src/utils/envVarResolver.test.d.ts +6 -0
  551. package/dist/src/utils/envVarResolver.test.js +221 -0
  552. package/dist/src/utils/envVarResolver.test.js.map +1 -0
  553. package/dist/src/utils/errors.d.ts +21 -0
  554. package/dist/src/utils/errors.js +93 -0
  555. package/dist/src/utils/errors.js.map +1 -1
  556. package/dist/src/utils/errors.test.d.ts +6 -0
  557. package/dist/src/utils/errors.test.js +303 -0
  558. package/dist/src/utils/errors.test.js.map +1 -0
  559. package/dist/src/utils/events.d.ts +2 -1
  560. package/dist/src/utils/events.js +1 -0
  561. package/dist/src/utils/events.js.map +1 -1
  562. package/dist/src/utils/processUtils.d.ts +13 -0
  563. package/dist/src/utils/processUtils.js +18 -0
  564. package/dist/src/utils/processUtils.js.map +1 -0
  565. package/dist/src/utils/processUtils.test.d.ts +6 -0
  566. package/dist/src/utils/processUtils.test.js +20 -0
  567. package/dist/src/utils/processUtils.test.js.map +1 -0
  568. package/dist/src/utils/sandbox.d.ts +1 -1
  569. package/dist/src/utils/sandbox.js +19 -8
  570. package/dist/src/utils/sandbox.js.map +1 -1
  571. package/dist/src/utils/settingsUtils.d.ts +16 -6
  572. package/dist/src/utils/settingsUtils.js +35 -25
  573. package/dist/src/utils/settingsUtils.js.map +1 -1
  574. package/dist/src/utils/settingsUtils.test.js +455 -158
  575. package/dist/src/utils/settingsUtils.test.js.map +1 -1
  576. package/dist/src/utils/userStartupWarnings.d.ts +1 -1
  577. package/dist/src/utils/userStartupWarnings.js +1 -1
  578. package/dist/src/utils/userStartupWarnings.js.map +1 -1
  579. package/dist/src/validateNonInterActiveAuth.d.ts +2 -1
  580. package/dist/src/validateNonInterActiveAuth.js +33 -12
  581. package/dist/src/validateNonInterActiveAuth.js.map +1 -1
  582. package/dist/src/zed-integration/schema.d.ts +578 -578
  583. package/dist/src/zed-integration/zedIntegration.js +17 -12
  584. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  585. package/dist/tsconfig.tsbuildinfo +1 -1
  586. package/npm-shrinkwrap.json +17168 -0
  587. package/package.json +7 -8
  588. package/dist/google-gemini-cli-0.3.0-preview.3.tgz +0 -0
  589. package/dist/src/ui/components/AuthDialog.d.ts +0 -16
  590. package/dist/src/ui/components/AuthDialog.js +0 -92
  591. package/dist/src/ui/components/AuthDialog.js.map +0 -1
  592. package/dist/src/ui/components/AuthDialog.test.js +0 -276
  593. package/dist/src/ui/components/AuthDialog.test.js.map +0 -1
  594. package/dist/src/ui/components/AuthInProgress.js.map +0 -1
  595. package/dist/src/ui/hooks/useAuthCommand.d.ts +0 -14
  596. package/dist/src/ui/hooks/useAuthCommand.js +0 -66
  597. package/dist/src/ui/hooks/useAuthCommand.js.map +0 -1
  598. /package/dist/src/{ui/components/AuthDialog.test.d.ts → commands/extensions/examples/mcp-server/example.d.ts} +0 -0
  599. /package/dist/src/ui/{components → auth}/AuthInProgress.d.ts +0 -0
@@ -1,676 +1,22 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /**
3
3
  * @license
4
4
  * Copyright 2025 Google LLC
5
5
  * SPDX-License-Identifier: Apache-2.0
6
6
  */
7
- import { useCallback, useEffect, useMemo, useState, useRef } from 'react';
8
- import { Box, measureElement, Static, Text, useStdin, useStdout, } from 'ink';
9
- import { StreamingState, MessageType, ToolCallStatus, } from './types.js';
10
- import { useTerminalSize } from './hooks/useTerminalSize.js';
11
- import { useGeminiStream } from './hooks/useGeminiStream.js';
12
- import { useLoadingIndicator } from './hooks/useLoadingIndicator.js';
13
- import { useThemeCommand } from './hooks/useThemeCommand.js';
14
- import { useAuthCommand } from './hooks/useAuthCommand.js';
15
- import { useFolderTrust } from './hooks/useFolderTrust.js';
16
- import { useEditorSettings } from './hooks/useEditorSettings.js';
17
- import { useSlashCommandProcessor } from './hooks/slashCommandProcessor.js';
18
- import { useAutoAcceptIndicator } from './hooks/useAutoAcceptIndicator.js';
19
- import { useMessageQueue } from './hooks/useMessageQueue.js';
20
- import { useConsoleMessages } from './hooks/useConsoleMessages.js';
21
- import { Header } from './components/Header.js';
22
- import { LoadingIndicator } from './components/LoadingIndicator.js';
23
- import { AutoAcceptIndicator } from './components/AutoAcceptIndicator.js';
24
- import { ShellModeIndicator } from './components/ShellModeIndicator.js';
25
- import { InputPrompt } from './components/InputPrompt.js';
26
- import { Footer } from './components/Footer.js';
27
- import { ThemeDialog } from './components/ThemeDialog.js';
28
- import { AuthDialog } from './components/AuthDialog.js';
29
- import { AuthInProgress } from './components/AuthInProgress.js';
30
- import { EditorSettingsDialog } from './components/EditorSettingsDialog.js';
31
- import { FolderTrustDialog } from './components/FolderTrustDialog.js';
32
- import { ShellConfirmationDialog } from './components/ShellConfirmationDialog.js';
33
- import { RadioButtonSelect } from './components/shared/RadioButtonSelect.js';
34
- import { Colors } from './colors.js';
35
- import { loadHierarchicalGeminiMemory } from '../config/config.js';
36
- import { SettingScope } from '../config/settings.js';
37
- import { Tips } from './components/Tips.js';
38
- import { ConsolePatcher } from './utils/ConsolePatcher.js';
39
- import { registerCleanup } from '../utils/cleanup.js';
40
- import { DetailedMessagesDisplay } from './components/DetailedMessagesDisplay.js';
41
- import { HistoryItemDisplay } from './components/HistoryItemDisplay.js';
42
- import { ContextSummaryDisplay } from './components/ContextSummaryDisplay.js';
43
- import { useHistory } from './hooks/useHistoryManager.js';
44
- import process from 'node:process';
45
- import { ApprovalMode, getAllGeminiMdFilenames, isEditorAvailable, getErrorMessage, AuthType, logFlashFallback, FlashFallbackEvent, ideContext, isProQuotaExceededError, isGenericQuotaExceededError, UserTierId, } from '@google/gemini-cli-core';
46
- import { IdeIntegrationNudge } from './IdeIntegrationNudge.js';
47
- import { validateAuthMethod } from '../config/auth.js';
48
- import { useLogger } from './hooks/useLogger.js';
7
+ import { Box } from 'ink';
49
8
  import { StreamingContext } from './contexts/StreamingContext.js';
50
- import { SessionStatsProvider, useSessionStats, } from './contexts/SessionContext.js';
51
- import { useGitBranchName } from './hooks/useGitBranchName.js';
52
- import { useFocus } from './hooks/useFocus.js';
53
- import { useBracketedPaste } from './hooks/useBracketedPaste.js';
54
- import { useTextBuffer } from './components/shared/text-buffer.js';
55
- import { useVimMode, VimModeProvider } from './contexts/VimModeContext.js';
56
- import { useVim } from './hooks/vim.js';
57
- import { useKeypress } from './hooks/useKeypress.js';
58
- import { KeypressProvider } from './contexts/KeypressContext.js';
59
- import { useKittyKeyboardProtocol } from './hooks/useKittyKeyboardProtocol.js';
60
- import { keyMatchers, Command } from './keyMatchers.js';
61
- import * as fs from 'node:fs';
62
- import { UpdateNotification } from './components/UpdateNotification.js';
63
- import ansiEscapes from 'ansi-escapes';
64
- import { OverflowProvider } from './contexts/OverflowContext.js';
65
- import { ShowMoreLines } from './components/ShowMoreLines.js';
66
- import { PrivacyNotice } from './privacy/PrivacyNotice.js';
67
- import { useSettingsCommand } from './hooks/useSettingsCommand.js';
68
- import { SettingsDialog } from './components/SettingsDialog.js';
69
- import { setUpdateHandler } from '../utils/handleAutoUpdate.js';
70
- import { appEvents, AppEvent } from '../utils/events.js';
71
- import { isNarrowWidth } from './utils/isNarrowWidth.js';
72
- import { useWorkspaceMigration } from './hooks/useWorkspaceMigration.js';
73
- import { WorkspaceMigrationDialog } from './components/WorkspaceMigrationDialog.js';
74
- const CTRL_EXIT_PROMPT_DURATION_MS = 1000;
75
- // Maximum number of queued messages to display in UI to prevent performance issues
76
- const MAX_DISPLAYED_QUEUED_MESSAGES = 3;
77
- function isToolExecuting(pendingHistoryItems) {
78
- return pendingHistoryItems.some((item) => {
79
- if (item && item.type === 'tool_group') {
80
- return item.tools.some((tool) => ToolCallStatus.Executing === tool.status);
81
- }
82
- return false;
83
- });
84
- }
85
- export const AppWrapper = (props) => {
86
- const kittyProtocolStatus = useKittyKeyboardProtocol();
87
- return (_jsx(KeypressProvider, { kittyProtocolEnabled: kittyProtocolStatus.enabled, config: props.config, debugKeystrokeLogging: props.settings.merged.general?.debugKeystrokeLogging, children: _jsx(SessionStatsProvider, { children: _jsx(VimModeProvider, { settings: props.settings, children: _jsx(App, { ...props }) }) }) }));
88
- };
89
- const App = ({ config, settings, startupWarnings = [], version }) => {
90
- const isFocused = useFocus();
91
- useBracketedPaste();
92
- const [updateInfo, setUpdateInfo] = useState(null);
93
- const { stdout } = useStdout();
94
- const nightly = version.includes('nightly');
95
- const { history, addItem, clearItems, loadHistory } = useHistory();
96
- const [idePromptAnswered, setIdePromptAnswered] = useState(false);
97
- const currentIDE = config.getIdeClient().getCurrentIde();
98
- useEffect(() => {
99
- registerCleanup(() => config.getIdeClient().disconnect());
100
- }, [config]);
101
- const shouldShowIdePrompt = currentIDE &&
102
- !config.getIdeMode() &&
103
- !settings.merged.ide?.hasSeenNudge &&
104
- !idePromptAnswered;
105
- useEffect(() => {
106
- const cleanup = setUpdateHandler(addItem, setUpdateInfo);
107
- return cleanup;
108
- }, [addItem]);
109
- const { consoleMessages, handleNewMessage, clearConsoleMessages: clearConsoleMessagesState, } = useConsoleMessages();
110
- useEffect(() => {
111
- const consolePatcher = new ConsolePatcher({
112
- onNewMessage: handleNewMessage,
113
- debugMode: config.getDebugMode(),
114
- });
115
- consolePatcher.patch();
116
- registerCleanup(consolePatcher.cleanup);
117
- }, [handleNewMessage, config]);
118
- const { stats: sessionStats } = useSessionStats();
119
- const [staticNeedsRefresh, setStaticNeedsRefresh] = useState(false);
120
- const [staticKey, setStaticKey] = useState(0);
121
- const refreshStatic = useCallback(() => {
122
- stdout.write(ansiEscapes.clearTerminal);
123
- setStaticKey((prev) => prev + 1);
124
- }, [setStaticKey, stdout]);
125
- const [geminiMdFileCount, setGeminiMdFileCount] = useState(0);
126
- const [debugMessage, setDebugMessage] = useState('');
127
- const [themeError, setThemeError] = useState(null);
128
- const [authError, setAuthError] = useState(null);
129
- const [editorError, setEditorError] = useState(null);
130
- const [footerHeight, setFooterHeight] = useState(0);
131
- const [corgiMode, setCorgiMode] = useState(false);
132
- const [isTrustedFolderState, setIsTrustedFolder] = useState(config.isTrustedFolder());
133
- const [currentModel, setCurrentModel] = useState(config.getModel());
134
- const [shellModeActive, setShellModeActive] = useState(false);
135
- const [showErrorDetails, setShowErrorDetails] = useState(false);
136
- const [showToolDescriptions, setShowToolDescriptions] = useState(false);
137
- const [ctrlCPressedOnce, setCtrlCPressedOnce] = useState(false);
138
- const [quittingMessages, setQuittingMessages] = useState(null);
139
- const ctrlCTimerRef = useRef(null);
140
- const [ctrlDPressedOnce, setCtrlDPressedOnce] = useState(false);
141
- const ctrlDTimerRef = useRef(null);
142
- const [constrainHeight, setConstrainHeight] = useState(true);
143
- const [showPrivacyNotice, setShowPrivacyNotice] = useState(false);
144
- const [modelSwitchedFromQuotaError, setModelSwitchedFromQuotaError] = useState(false);
145
- const [userTier, setUserTier] = useState(undefined);
146
- const [ideContextState, setIdeContextState] = useState();
147
- const [showEscapePrompt, setShowEscapePrompt] = useState(false);
148
- const [isProcessing, setIsProcessing] = useState(false);
149
- const { showWorkspaceMigrationDialog, workspaceExtensions, onWorkspaceMigrationDialogOpen, onWorkspaceMigrationDialogClose, } = useWorkspaceMigration(settings);
150
- useEffect(() => {
151
- const unsubscribe = ideContext.subscribeToIdeContext(setIdeContextState);
152
- // Set the initial value
153
- setIdeContextState(ideContext.getIdeContext());
154
- return unsubscribe;
155
- }, []);
156
- useEffect(() => {
157
- const openDebugConsole = () => {
158
- setShowErrorDetails(true);
159
- setConstrainHeight(false); // Make sure the user sees the full message.
160
- };
161
- appEvents.on(AppEvent.OpenDebugConsole, openDebugConsole);
162
- const logErrorHandler = (errorMessage) => {
163
- handleNewMessage({
164
- type: 'error',
165
- content: String(errorMessage),
166
- count: 1,
167
- });
168
- };
169
- appEvents.on(AppEvent.LogError, logErrorHandler);
170
- return () => {
171
- appEvents.off(AppEvent.OpenDebugConsole, openDebugConsole);
172
- appEvents.off(AppEvent.LogError, logErrorHandler);
173
- };
174
- }, [handleNewMessage]);
175
- const openPrivacyNotice = useCallback(() => {
176
- setShowPrivacyNotice(true);
177
- }, []);
178
- const handleEscapePromptChange = useCallback((showPrompt) => {
179
- setShowEscapePrompt(showPrompt);
180
- }, []);
181
- const initialPromptSubmitted = useRef(false);
182
- const errorCount = useMemo(() => consoleMessages
183
- .filter((msg) => msg.type === 'error')
184
- .reduce((total, msg) => total + msg.count, 0), [consoleMessages]);
185
- const { isThemeDialogOpen, openThemeDialog, handleThemeSelect, handleThemeHighlight, } = useThemeCommand(settings, setThemeError, addItem);
186
- const { isSettingsDialogOpen, openSettingsDialog, closeSettingsDialog } = useSettingsCommand();
187
- const { isFolderTrustDialogOpen, handleFolderTrustSelect, isRestarting } = useFolderTrust(settings, setIsTrustedFolder);
188
- const { isAuthDialogOpen, openAuthDialog, handleAuthSelect, isAuthenticating, cancelAuthentication, } = useAuthCommand(settings, setAuthError, config);
189
- useEffect(() => {
190
- if (settings.merged.security?.auth?.selectedType &&
191
- !settings.merged.security?.auth?.useExternal) {
192
- const error = validateAuthMethod(settings.merged.security.auth.selectedType);
193
- if (error) {
194
- setAuthError(error);
195
- openAuthDialog();
196
- }
197
- }
198
- }, [
199
- settings.merged.security?.auth?.selectedType,
200
- settings.merged.security?.auth?.useExternal,
201
- openAuthDialog,
202
- setAuthError,
203
- ]);
204
- // Sync user tier from config when authentication changes
205
- useEffect(() => {
206
- // Only sync when not currently authenticating
207
- if (!isAuthenticating) {
208
- setUserTier(config.getGeminiClient()?.getUserTier());
209
- }
210
- }, [config, isAuthenticating]);
211
- const { isEditorDialogOpen, openEditorDialog, handleEditorSelect, exitEditorDialog, } = useEditorSettings(settings, setEditorError, addItem);
212
- const toggleCorgiMode = useCallback(() => {
213
- setCorgiMode((prev) => !prev);
214
- }, []);
215
- const performMemoryRefresh = useCallback(async () => {
216
- addItem({
217
- type: MessageType.INFO,
218
- text: 'Refreshing hierarchical memory (GEMINI.md or other context files)...',
219
- }, Date.now());
220
- try {
221
- const { memoryContent, fileCount } = await loadHierarchicalGeminiMemory(process.cwd(), settings.merged.context?.loadMemoryFromIncludeDirectories
222
- ? config.getWorkspaceContext().getDirectories()
223
- : [], config.getDebugMode(), config.getFileService(), settings.merged, config.getExtensionContextFilePaths(), settings.merged.context?.importFormat || 'tree', // Use setting or default to 'tree'
224
- config.getFileFilteringOptions());
225
- config.setUserMemory(memoryContent);
226
- config.setGeminiMdFileCount(fileCount);
227
- setGeminiMdFileCount(fileCount);
228
- addItem({
229
- type: MessageType.INFO,
230
- text: `Memory refreshed successfully. ${memoryContent.length > 0 ? `Loaded ${memoryContent.length} characters from ${fileCount} file(s).` : 'No memory content found.'}`,
231
- }, Date.now());
232
- if (config.getDebugMode()) {
233
- console.log(`[DEBUG] Refreshed memory content in config: ${memoryContent.substring(0, 200)}...`);
234
- }
235
- }
236
- catch (error) {
237
- const errorMessage = getErrorMessage(error);
238
- addItem({
239
- type: MessageType.ERROR,
240
- text: `Error refreshing memory: ${errorMessage}`,
241
- }, Date.now());
242
- console.error('Error refreshing memory:', error);
243
- }
244
- }, [config, addItem, settings.merged]);
245
- // Watch for model changes (e.g., from Flash fallback)
246
- useEffect(() => {
247
- const checkModelChange = () => {
248
- const configModel = config.getModel();
249
- if (configModel !== currentModel) {
250
- setCurrentModel(configModel);
251
- }
252
- };
253
- // Check immediately and then periodically
254
- checkModelChange();
255
- const interval = setInterval(checkModelChange, 1000); // Check every second
256
- return () => clearInterval(interval);
257
- }, [config, currentModel]);
258
- // Set up Flash fallback handler
259
- useEffect(() => {
260
- const flashFallbackHandler = async (currentModel, fallbackModel, error) => {
261
- let message;
262
- if (config.getContentGeneratorConfig().authType ===
263
- AuthType.LOGIN_WITH_GOOGLE) {
264
- // Use actual user tier if available; otherwise, default to FREE tier behavior (safe default)
265
- const isPaidTier = userTier === UserTierId.LEGACY || userTier === UserTierId.STANDARD;
266
- // Check if this is a Pro quota exceeded error
267
- if (error && isProQuotaExceededError(error)) {
268
- if (isPaidTier) {
269
- message = `⚡ You have reached your daily ${currentModel} quota limit.
270
- ⚡ Automatically switching from ${currentModel} to ${fallbackModel} for the remainder of this session.
271
- ⚡ To continue accessing the ${currentModel} model today, consider using /auth to switch to using a paid API key from AI Studio at https://aistudio.google.com/apikey`;
272
- }
273
- else {
274
- message = `⚡ You have reached your daily ${currentModel} quota limit.
275
- ⚡ Automatically switching from ${currentModel} to ${fallbackModel} for the remainder of this session.
276
- ⚡ To increase your limits, upgrade to a Gemini Code Assist Standard or Enterprise plan with higher limits at https://goo.gle/set-up-gemini-code-assist
277
- ⚡ Or you can utilize a Gemini API Key. See: https://goo.gle/gemini-cli-docs-auth#gemini-api-key
278
- ⚡ You can switch authentication methods by typing /auth`;
279
- }
280
- }
281
- else if (error && isGenericQuotaExceededError(error)) {
282
- if (isPaidTier) {
283
- message = `⚡ You have reached your daily quota limit.
284
- ⚡ Automatically switching from ${currentModel} to ${fallbackModel} for the remainder of this session.
285
- ⚡ To continue accessing the ${currentModel} model today, consider using /auth to switch to using a paid API key from AI Studio at https://aistudio.google.com/apikey`;
286
- }
287
- else {
288
- message = `⚡ You have reached your daily quota limit.
289
- ⚡ Automatically switching from ${currentModel} to ${fallbackModel} for the remainder of this session.
290
- ⚡ To increase your limits, upgrade to a Gemini Code Assist Standard or Enterprise plan with higher limits at https://goo.gle/set-up-gemini-code-assist
291
- ⚡ Or you can utilize a Gemini API Key. See: https://goo.gle/gemini-cli-docs-auth#gemini-api-key
292
- ⚡ You can switch authentication methods by typing /auth`;
293
- }
294
- }
295
- else {
296
- if (isPaidTier) {
297
- // Default fallback message for other cases (like consecutive 429s)
298
- message = `⚡ Automatically switching from ${currentModel} to ${fallbackModel} for faster responses for the remainder of this session.
299
- ⚡ Possible reasons for this are that you have received multiple consecutive capacity errors or you have reached your daily ${currentModel} quota limit
300
- ⚡ To continue accessing the ${currentModel} model today, consider using /auth to switch to using a paid API key from AI Studio at https://aistudio.google.com/apikey`;
301
- }
302
- else {
303
- // Default fallback message for other cases (like consecutive 429s)
304
- message = `⚡ Automatically switching from ${currentModel} to ${fallbackModel} for faster responses for the remainder of this session.
305
- ⚡ Possible reasons for this are that you have received multiple consecutive capacity errors or you have reached your daily ${currentModel} quota limit
306
- ⚡ To increase your limits, upgrade to a Gemini Code Assist Standard or Enterprise plan with higher limits at https://goo.gle/set-up-gemini-code-assist
307
- ⚡ Or you can utilize a Gemini API Key. See: https://goo.gle/gemini-cli-docs-auth#gemini-api-key
308
- ⚡ You can switch authentication methods by typing /auth`;
309
- }
310
- }
311
- // Add message to UI history
312
- addItem({
313
- type: MessageType.INFO,
314
- text: message,
315
- }, Date.now());
316
- // Set the flag to prevent tool continuation
317
- setModelSwitchedFromQuotaError(true);
318
- // Set global quota error flag to prevent Flash model calls
319
- config.setQuotaErrorOccurred(true);
320
- }
321
- // Switch model for future use but return false to stop current retry
322
- config.setModel(fallbackModel);
323
- config.setFallbackMode(true);
324
- logFlashFallback(config, new FlashFallbackEvent(config.getContentGeneratorConfig().authType));
325
- return false; // Don't continue with current prompt
326
- };
327
- config.setFlashFallbackHandler(flashFallbackHandler);
328
- }, [config, addItem, userTier]);
329
- // Terminal and UI setup
330
- const { rows: terminalHeight, columns: terminalWidth } = useTerminalSize();
331
- const isNarrow = isNarrowWidth(terminalWidth);
332
- const { stdin, setRawMode } = useStdin();
333
- const isInitialMount = useRef(true);
334
- const widthFraction = 0.9;
335
- const inputWidth = Math.max(20, Math.floor(terminalWidth * widthFraction) - 3);
336
- const suggestionsWidth = Math.max(20, Math.floor(terminalWidth * 0.8));
337
- // Utility callbacks
338
- const isValidPath = useCallback((filePath) => {
339
- try {
340
- return fs.existsSync(filePath) && fs.statSync(filePath).isFile();
341
- }
342
- catch (_e) {
343
- return false;
344
- }
345
- }, []);
346
- const getPreferredEditor = useCallback(() => {
347
- const editorType = settings.merged.general?.preferredEditor;
348
- const isValidEditor = isEditorAvailable(editorType);
349
- if (!isValidEditor) {
350
- openEditorDialog();
351
- return;
352
- }
353
- return editorType;
354
- }, [settings, openEditorDialog]);
355
- const onAuthError = useCallback(() => {
356
- setAuthError('reauth required');
357
- openAuthDialog();
358
- }, [openAuthDialog, setAuthError]);
359
- // Core hooks and processors
360
- const { vimEnabled: vimModeEnabled, vimMode, toggleVimEnabled, } = useVimMode();
361
- const { handleSlashCommand, slashCommands, pendingHistoryItems: pendingSlashCommandHistoryItems, commandContext, shellConfirmationRequest, confirmationRequest, } = useSlashCommandProcessor(config, settings, addItem, clearItems, loadHistory, refreshStatic, setDebugMessage, openThemeDialog, openAuthDialog, openEditorDialog, toggleCorgiMode, setQuittingMessages, openPrivacyNotice, openSettingsDialog, toggleVimEnabled, setIsProcessing, setGeminiMdFileCount);
362
- const buffer = useTextBuffer({
363
- initialText: '',
364
- viewport: { height: 10, width: inputWidth },
365
- stdin,
366
- setRawMode,
367
- isValidPath,
368
- shellModeActive,
369
- });
370
- const [userMessages, setUserMessages] = useState([]);
371
- // Stable reference for cancel handler to avoid circular dependency
372
- const cancelHandlerRef = useRef(() => { });
373
- const { streamingState, submitQuery, initError, pendingHistoryItems: pendingGeminiHistoryItems, thought, cancelOngoingRequest, } = useGeminiStream(config.getGeminiClient(), history, addItem, config, setDebugMessage, handleSlashCommand, shellModeActive, getPreferredEditor, onAuthError, performMemoryRefresh, modelSwitchedFromQuotaError, setModelSwitchedFromQuotaError, refreshStatic, () => cancelHandlerRef.current());
374
- const pendingHistoryItems = useMemo(() => [...pendingSlashCommandHistoryItems, ...pendingGeminiHistoryItems], [pendingSlashCommandHistoryItems, pendingGeminiHistoryItems]);
375
- // Message queue for handling input during streaming
376
- const { messageQueue, addMessage, clearQueue, getQueuedMessagesText } = useMessageQueue({
377
- streamingState,
378
- submitQuery,
379
- });
380
- // Update the cancel handler with message queue support
381
- cancelHandlerRef.current = useCallback(() => {
382
- if (isToolExecuting(pendingHistoryItems)) {
383
- buffer.setText(''); // Just clear the prompt
384
- return;
385
- }
386
- const lastUserMessage = userMessages.at(-1);
387
- let textToSet = lastUserMessage || '';
388
- // Append queued messages if any exist
389
- const queuedText = getQueuedMessagesText();
390
- if (queuedText) {
391
- textToSet = textToSet ? `${textToSet}\n\n${queuedText}` : queuedText;
392
- clearQueue();
393
- }
394
- if (textToSet) {
395
- buffer.setText(textToSet);
396
- }
397
- }, [
398
- buffer,
399
- userMessages,
400
- getQueuedMessagesText,
401
- clearQueue,
402
- pendingHistoryItems,
403
- ]);
404
- // Input handling - queue messages for processing
405
- const handleFinalSubmit = useCallback((submittedValue) => {
406
- addMessage(submittedValue);
407
- }, [addMessage]);
408
- const handleIdePromptComplete = useCallback((result) => {
409
- if (result.userSelection === 'yes') {
410
- if (result.isExtensionPreInstalled) {
411
- handleSlashCommand('/ide enable');
412
- }
413
- else {
414
- handleSlashCommand('/ide install');
415
- }
416
- settings.setValue(SettingScope.User, 'hasSeenIdeIntegrationNudge', true);
417
- }
418
- else if (result.userSelection === 'dismiss') {
419
- settings.setValue(SettingScope.User, 'hasSeenIdeIntegrationNudge', true);
420
- }
421
- setIdePromptAnswered(true);
422
- }, [handleSlashCommand, settings]);
423
- const { handleInput: vimHandleInput } = useVim(buffer, handleFinalSubmit);
424
- const { elapsedTime, currentLoadingPhrase } = useLoadingIndicator(streamingState);
425
- const showAutoAcceptIndicator = useAutoAcceptIndicator({ config, addItem });
426
- const handleExit = useCallback((pressedOnce, setPressedOnce, timerRef) => {
427
- if (pressedOnce) {
428
- if (timerRef.current) {
429
- clearTimeout(timerRef.current);
430
- }
431
- // Directly invoke the central command handler.
432
- handleSlashCommand('/quit');
433
- }
434
- else {
435
- setPressedOnce(true);
436
- timerRef.current = setTimeout(() => {
437
- setPressedOnce(false);
438
- timerRef.current = null;
439
- }, CTRL_EXIT_PROMPT_DURATION_MS);
440
- }
441
- }, [handleSlashCommand]);
442
- const handleGlobalKeypress = useCallback((key) => {
443
- // Debug log keystrokes if enabled
444
- if (settings.merged.general?.debugKeystrokeLogging) {
445
- console.log('[DEBUG] Keystroke:', JSON.stringify(key));
446
- }
447
- let enteringConstrainHeightMode = false;
448
- if (!constrainHeight) {
449
- enteringConstrainHeightMode = true;
450
- setConstrainHeight(true);
451
- }
452
- if (keyMatchers[Command.SHOW_ERROR_DETAILS](key)) {
453
- setShowErrorDetails((prev) => !prev);
454
- }
455
- else if (keyMatchers[Command.TOGGLE_TOOL_DESCRIPTIONS](key)) {
456
- const newValue = !showToolDescriptions;
457
- setShowToolDescriptions(newValue);
458
- const mcpServers = config.getMcpServers();
459
- if (Object.keys(mcpServers || {}).length > 0) {
460
- handleSlashCommand(newValue ? '/mcp desc' : '/mcp nodesc');
461
- }
462
- }
463
- else if (keyMatchers[Command.TOGGLE_IDE_CONTEXT_DETAIL](key) &&
464
- config.getIdeMode() &&
465
- ideContextState) {
466
- // Show IDE status when in IDE mode and context is available.
467
- handleSlashCommand('/ide status');
468
- }
469
- else if (keyMatchers[Command.QUIT](key)) {
470
- // When authenticating, let AuthInProgress component handle Ctrl+C.
471
- if (isAuthenticating) {
472
- return;
473
- }
474
- if (!ctrlCPressedOnce) {
475
- cancelOngoingRequest?.();
476
- }
477
- handleExit(ctrlCPressedOnce, setCtrlCPressedOnce, ctrlCTimerRef);
478
- }
479
- else if (keyMatchers[Command.EXIT](key)) {
480
- if (buffer.text.length > 0) {
481
- return;
482
- }
483
- handleExit(ctrlDPressedOnce, setCtrlDPressedOnce, ctrlDTimerRef);
484
- }
485
- else if (keyMatchers[Command.SHOW_MORE_LINES](key) &&
486
- !enteringConstrainHeightMode) {
487
- setConstrainHeight(false);
488
- }
489
- }, [
490
- constrainHeight,
491
- setConstrainHeight,
492
- setShowErrorDetails,
493
- showToolDescriptions,
494
- setShowToolDescriptions,
495
- config,
496
- ideContextState,
497
- handleExit,
498
- ctrlCPressedOnce,
499
- setCtrlCPressedOnce,
500
- ctrlCTimerRef,
501
- buffer.text.length,
502
- ctrlDPressedOnce,
503
- setCtrlDPressedOnce,
504
- ctrlDTimerRef,
505
- handleSlashCommand,
506
- isAuthenticating,
507
- cancelOngoingRequest,
508
- settings.merged.general?.debugKeystrokeLogging,
509
- ]);
510
- useKeypress(handleGlobalKeypress, {
511
- isActive: true,
512
- });
513
- useEffect(() => {
514
- if (config) {
515
- setGeminiMdFileCount(config.getGeminiMdFileCount());
516
- }
517
- }, [config, config.getGeminiMdFileCount]);
518
- const logger = useLogger(config.storage);
519
- useEffect(() => {
520
- const fetchUserMessages = async () => {
521
- const pastMessagesRaw = (await logger?.getPreviousUserMessages()) || []; // Newest first
522
- const currentSessionUserMessages = history
523
- .filter((item) => item.type === 'user' &&
524
- typeof item.text === 'string' &&
525
- item.text.trim() !== '')
526
- .map((item) => item.text)
527
- .reverse(); // Newest first, to match pastMessagesRaw sorting
528
- // Combine, with current session messages being more recent
529
- const combinedMessages = [
530
- ...currentSessionUserMessages,
531
- ...pastMessagesRaw,
532
- ];
533
- // Deduplicate consecutive identical messages from the combined list (still newest first)
534
- const deduplicatedMessages = [];
535
- if (combinedMessages.length > 0) {
536
- deduplicatedMessages.push(combinedMessages[0]); // Add the newest one unconditionally
537
- for (let i = 1; i < combinedMessages.length; i++) {
538
- if (combinedMessages[i] !== combinedMessages[i - 1]) {
539
- deduplicatedMessages.push(combinedMessages[i]);
540
- }
541
- }
542
- }
543
- // Reverse to oldest first for useInputHistory
544
- setUserMessages(deduplicatedMessages.reverse());
545
- };
546
- fetchUserMessages();
547
- }, [history, logger]);
548
- const isInputActive = (streamingState === StreamingState.Idle ||
549
- streamingState === StreamingState.Responding) &&
550
- !initError &&
551
- !isProcessing;
552
- const handleClearScreen = useCallback(() => {
553
- clearItems();
554
- clearConsoleMessagesState();
555
- console.clear();
556
- refreshStatic();
557
- }, [clearItems, clearConsoleMessagesState, refreshStatic]);
558
- const mainControlsRef = useRef(null);
559
- const pendingHistoryItemRef = useRef(null);
560
- useEffect(() => {
561
- if (mainControlsRef.current) {
562
- const fullFooterMeasurement = measureElement(mainControlsRef.current);
563
- setFooterHeight(fullFooterMeasurement.height);
564
- }
565
- }, [terminalHeight, consoleMessages, showErrorDetails]);
566
- const staticExtraHeight = /* margins and padding */ 3;
567
- const availableTerminalHeight = useMemo(() => terminalHeight - footerHeight - staticExtraHeight, [terminalHeight, footerHeight]);
568
- useEffect(() => {
569
- // skip refreshing Static during first mount
570
- if (isInitialMount.current) {
571
- isInitialMount.current = false;
572
- return;
573
- }
574
- // debounce so it doesn't fire up too often during resize
575
- const handler = setTimeout(() => {
576
- setStaticNeedsRefresh(false);
577
- refreshStatic();
578
- }, 300);
579
- return () => {
580
- clearTimeout(handler);
581
- };
582
- }, [terminalWidth, terminalHeight, refreshStatic]);
583
- useEffect(() => {
584
- if (streamingState === StreamingState.Idle && staticNeedsRefresh) {
585
- setStaticNeedsRefresh(false);
586
- refreshStatic();
587
- }
588
- }, [streamingState, refreshStatic, staticNeedsRefresh]);
589
- const filteredConsoleMessages = useMemo(() => {
590
- if (config.getDebugMode()) {
591
- return consoleMessages;
592
- }
593
- return consoleMessages.filter((msg) => msg.type !== 'debug');
594
- }, [consoleMessages, config]);
595
- const branchName = useGitBranchName(config.getTargetDir());
596
- const contextFileNames = useMemo(() => {
597
- const fromSettings = settings.merged.context?.fileName;
598
- if (fromSettings) {
599
- return Array.isArray(fromSettings) ? fromSettings : [fromSettings];
600
- }
601
- return getAllGeminiMdFilenames();
602
- }, [settings.merged.context?.fileName]);
603
- const initialPrompt = useMemo(() => config.getQuestion(), [config]);
604
- const geminiClient = config.getGeminiClient();
605
- useEffect(() => {
606
- if (initialPrompt &&
607
- !initialPromptSubmitted.current &&
608
- !isAuthenticating &&
609
- !isAuthDialogOpen &&
610
- !isThemeDialogOpen &&
611
- !isEditorDialogOpen &&
612
- !showPrivacyNotice &&
613
- geminiClient?.isInitialized?.()) {
614
- submitQuery(initialPrompt);
615
- initialPromptSubmitted.current = true;
616
- }
617
- }, [
618
- initialPrompt,
619
- submitQuery,
620
- isAuthenticating,
621
- isAuthDialogOpen,
622
- isThemeDialogOpen,
623
- isEditorDialogOpen,
624
- showPrivacyNotice,
625
- geminiClient,
626
- ]);
627
- if (quittingMessages) {
628
- return (_jsx(Box, { flexDirection: "column", marginBottom: 1, children: quittingMessages.map((item) => (_jsx(HistoryItemDisplay, { availableTerminalHeight: constrainHeight ? availableTerminalHeight : undefined, terminalWidth: terminalWidth, item: item, isPending: false, config: config }, item.id))) }));
9
+ import { Notifications } from './components/Notifications.js';
10
+ import { MainContent } from './components/MainContent.js';
11
+ import { DialogManager } from './components/DialogManager.js';
12
+ import { Composer } from './components/Composer.js';
13
+ import { useUIState } from './contexts/UIStateContext.js';
14
+ import { QuittingDisplay } from './components/QuittingDisplay.js';
15
+ export const App = () => {
16
+ const uiState = useUIState();
17
+ if (uiState.quittingMessages) {
18
+ return _jsx(QuittingDisplay, {});
629
19
  }
630
- const mainAreaWidth = Math.floor(terminalWidth * 0.9);
631
- const debugConsoleMaxHeight = Math.floor(Math.max(terminalHeight * 0.2, 5));
632
- // Arbitrary threshold to ensure that items in the static area are large
633
- // enough but not too large to make the terminal hard to use.
634
- const staticAreaMaxItemHeight = Math.max(terminalHeight * 4, 100);
635
- const placeholder = vimModeEnabled
636
- ? " Press 'i' for INSERT mode and 'Esc' for NORMAL mode."
637
- : ' Type your message or @path/to/file';
638
- return (_jsx(StreamingContext.Provider, { value: streamingState, children: _jsxs(Box, { flexDirection: "column", width: "90%", children: [_jsx(Static, { items: [
639
- _jsxs(Box, { flexDirection: "column", children: [!(settings.merged.ui?.hideBanner || config.getScreenReader()) && _jsx(Header, { version: version, nightly: nightly }), !(settings.merged.ui?.hideTips || config.getScreenReader()) && (_jsx(Tips, { config: config }))] }, "header"),
640
- ...history.map((h) => (_jsx(HistoryItemDisplay, { terminalWidth: mainAreaWidth, availableTerminalHeight: staticAreaMaxItemHeight, item: h, isPending: false, config: config, commands: slashCommands }, h.id))),
641
- ], children: (item) => item }, staticKey), _jsx(OverflowProvider, { children: _jsxs(Box, { ref: pendingHistoryItemRef, flexDirection: "column", children: [pendingHistoryItems.map((item, i) => (_jsx(HistoryItemDisplay, { availableTerminalHeight: constrainHeight ? availableTerminalHeight : undefined, terminalWidth: mainAreaWidth,
642
- // TODO(taehykim): It seems like references to ids aren't necessary in
643
- // HistoryItemDisplay. Refactor later. Use a fake id for now.
644
- item: { ...item, id: 0 }, isPending: true, config: config, isFocused: !isEditorDialogOpen }, i))), _jsx(ShowMoreLines, { constrainHeight: constrainHeight })] }) }), _jsxs(Box, { flexDirection: "column", ref: mainControlsRef, children: [updateInfo && _jsx(UpdateNotification, { message: updateInfo.message }), startupWarnings.length > 0 && (_jsx(Box, { borderStyle: "round", borderColor: Colors.AccentYellow, paddingX: 1, marginY: 1, flexDirection: "column", children: startupWarnings.map((warning, index) => (_jsx(Text, { color: Colors.AccentYellow, children: warning }, index))) })), showWorkspaceMigrationDialog ? (_jsx(WorkspaceMigrationDialog, { workspaceExtensions: workspaceExtensions, onOpen: onWorkspaceMigrationDialogOpen, onClose: onWorkspaceMigrationDialogClose })) : shouldShowIdePrompt && currentIDE ? (_jsx(IdeIntegrationNudge, { ide: currentIDE, onComplete: handleIdePromptComplete })) : isFolderTrustDialogOpen ? (_jsx(FolderTrustDialog, { onSelect: handleFolderTrustSelect, isRestarting: isRestarting })) : shellConfirmationRequest ? (_jsx(ShellConfirmationDialog, { request: shellConfirmationRequest })) : confirmationRequest ? (_jsxs(Box, { flexDirection: "column", children: [confirmationRequest.prompt, _jsx(Box, { paddingY: 1, children: _jsx(RadioButtonSelect, { isFocused: !!confirmationRequest, items: [
645
- { label: 'Yes', value: true },
646
- { label: 'No', value: false },
647
- ], onSelect: (value) => {
648
- confirmationRequest.onConfirm(value);
649
- } }) })] })) : isThemeDialogOpen ? (_jsxs(Box, { flexDirection: "column", children: [themeError && (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: Colors.AccentRed, children: themeError }) })), _jsx(ThemeDialog, { onSelect: handleThemeSelect, onHighlight: handleThemeHighlight, settings: settings, availableTerminalHeight: constrainHeight
650
- ? terminalHeight - staticExtraHeight
651
- : undefined, terminalWidth: mainAreaWidth })] })) : isSettingsDialogOpen ? (_jsx(Box, { flexDirection: "column", children: _jsx(SettingsDialog, { settings: settings, onSelect: () => closeSettingsDialog(), onRestartRequest: () => process.exit(0) }) })) : isAuthenticating ? (_jsxs(_Fragment, { children: [_jsx(AuthInProgress, { onTimeout: () => {
652
- setAuthError('Authentication timed out. Please try again.');
653
- cancelAuthentication();
654
- openAuthDialog();
655
- } }), showErrorDetails && (_jsx(OverflowProvider, { children: _jsxs(Box, { flexDirection: "column", children: [_jsx(DetailedMessagesDisplay, { messages: filteredConsoleMessages, maxHeight: constrainHeight ? debugConsoleMaxHeight : undefined, width: inputWidth }), _jsx(ShowMoreLines, { constrainHeight: constrainHeight })] }) }))] })) : isAuthDialogOpen ? (_jsx(Box, { flexDirection: "column", children: _jsx(AuthDialog, { onSelect: handleAuthSelect, settings: settings, initialErrorMessage: authError }) })) : isEditorDialogOpen ? (_jsxs(Box, { flexDirection: "column", children: [editorError && (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: Colors.AccentRed, children: editorError }) })), _jsx(EditorSettingsDialog, { onSelect: handleEditorSelect, settings: settings, onExit: exitEditorDialog })] })) : showPrivacyNotice ? (_jsx(PrivacyNotice, { onExit: () => setShowPrivacyNotice(false), config: config })) : (_jsxs(_Fragment, { children: [_jsx(LoadingIndicator, { thought: streamingState === StreamingState.WaitingForConfirmation ||
656
- config.getAccessibility()?.disableLoadingPhrases ||
657
- config.getScreenReader()
658
- ? undefined
659
- : thought, currentLoadingPhrase: config.getAccessibility()?.disableLoadingPhrases ||
660
- config.getScreenReader()
661
- ? undefined
662
- : currentLoadingPhrase, elapsedTime: elapsedTime }), messageQueue.length > 0 && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [messageQueue
663
- .slice(0, MAX_DISPLAYED_QUEUED_MESSAGES)
664
- .map((message, index) => {
665
- // Ensure multi-line messages are collapsed for the preview.
666
- // Replace all whitespace (including newlines) with a single space.
667
- const preview = message.replace(/\s+/g, ' ');
668
- return (
669
- // Ensure the Box takes full width so truncation calculates correctly
670
- _jsx(Box, { paddingLeft: 2, width: "100%", children: _jsx(Text, { dimColor: true, wrap: "truncate", children: preview }) }, index));
671
- }), messageQueue.length > MAX_DISPLAYED_QUEUED_MESSAGES && (_jsx(Box, { paddingLeft: 2, children: _jsxs(Text, { dimColor: true, children: ["... (+", messageQueue.length - MAX_DISPLAYED_QUEUED_MESSAGES, "more)"] }) }))] })), _jsxs(Box, { marginTop: 1, justifyContent: "space-between", width: "100%", flexDirection: isNarrow ? 'column' : 'row', alignItems: isNarrow ? 'flex-start' : 'center', children: [_jsxs(Box, { children: [process.env['GEMINI_SYSTEM_MD'] && (_jsx(Text, { color: Colors.AccentRed, children: "|\u2310\u25A0_\u25A0| " })), ctrlCPressedOnce ? (_jsx(Text, { color: Colors.AccentYellow, children: "Press Ctrl+C again to exit." })) : ctrlDPressedOnce ? (_jsx(Text, { color: Colors.AccentYellow, children: "Press Ctrl+D again to exit." })) : showEscapePrompt ? (_jsx(Text, { color: Colors.Gray, children: "Press Esc again to clear." })) : (_jsx(ContextSummaryDisplay, { ideContext: ideContextState, geminiMdFileCount: geminiMdFileCount, contextFileNames: contextFileNames, mcpServers: config.getMcpServers(), blockedMcpServers: config.getBlockedMcpServers(), showToolDescriptions: showToolDescriptions }))] }), _jsxs(Box, { paddingTop: isNarrow ? 1 : 0, children: [showAutoAcceptIndicator !== ApprovalMode.DEFAULT &&
672
- !shellModeActive && (_jsx(AutoAcceptIndicator, { approvalMode: showAutoAcceptIndicator })), shellModeActive && _jsx(ShellModeIndicator, {})] })] }), showErrorDetails && (_jsx(OverflowProvider, { children: _jsxs(Box, { flexDirection: "column", children: [_jsx(DetailedMessagesDisplay, { messages: filteredConsoleMessages, maxHeight: constrainHeight ? debugConsoleMaxHeight : undefined, width: inputWidth }), _jsx(ShowMoreLines, { constrainHeight: constrainHeight })] }) })), isInputActive && (_jsx(InputPrompt, { buffer: buffer, inputWidth: inputWidth, suggestionsWidth: suggestionsWidth, onSubmit: handleFinalSubmit, userMessages: userMessages, onClearScreen: handleClearScreen, config: config, slashCommands: slashCommands, commandContext: commandContext, shellModeActive: shellModeActive, setShellModeActive: setShellModeActive, onEscapePromptChange: handleEscapePromptChange, focus: isFocused, vimHandleInput: vimHandleInput, placeholder: placeholder }))] })), initError && streamingState !== StreamingState.Responding && (_jsx(Box, { borderStyle: "round", borderColor: Colors.AccentRed, paddingX: 1, marginBottom: 1, children: history.find((item) => item.type === 'error' && item.text?.includes(initError))?.text ? (_jsx(Text, { color: Colors.AccentRed, children: history.find((item) => item.type === 'error' && item.text?.includes(initError))?.text })) : (_jsxs(_Fragment, { children: [_jsxs(Text, { color: Colors.AccentRed, children: ["Initialization Error: ", initError] }), _jsxs(Text, { color: Colors.AccentRed, children: [' ', "Please check API key and configuration."] })] })) })), !settings.merged.ui?.hideFooter && (_jsx(Footer, { model: currentModel, targetDir: config.getTargetDir(), debugMode: config.getDebugMode(), branchName: branchName, debugMessage: debugMessage, corgiMode: corgiMode, errorCount: errorCount, showErrorDetails: showErrorDetails, showMemoryUsage: config.getDebugMode() ||
673
- settings.merged.ui?.showMemoryUsage ||
674
- false, promptTokenCount: sessionStats.lastPromptTokenCount, nightly: nightly, vimMode: vimModeEnabled ? vimMode : undefined, isTrustedFolder: isTrustedFolderState }))] })] }) }));
20
+ return (_jsx(StreamingContext.Provider, { value: uiState.streamingState, children: _jsxs(Box, { flexDirection: "column", width: "90%", children: [_jsx(MainContent, {}), _jsxs(Box, { flexDirection: "column", ref: uiState.mainControlsRef, children: [_jsx(Notifications, {}), uiState.dialogsVisible ? _jsx(DialogManager, {}) : _jsx(Composer, {})] })] }) }));
675
21
  };
676
22
  //# sourceMappingURL=App.js.map