@google/gemini-cli 0.1.1 → 0.1.3-rc.1

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 (391) hide show
  1. package/README.md +7 -6
  2. package/dist/.last_build +0 -0
  3. package/dist/google-gemini-cli-0.1.3.tgz +0 -0
  4. package/dist/index.d.ts +7 -0
  5. package/dist/index.js +20 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/package.json +74 -0
  8. package/dist/src/config/auth.d.ts +6 -0
  9. package/dist/src/config/auth.js +38 -0
  10. package/dist/src/config/auth.js.map +1 -0
  11. package/dist/src/config/config.d.ts +14 -0
  12. package/dist/src/config/config.js +225 -0
  13. package/dist/src/config/config.js.map +1 -0
  14. package/dist/src/config/extension.d.ts +19 -0
  15. package/dist/src/config/extension.js +81 -0
  16. package/dist/src/config/extension.js.map +1 -0
  17. package/dist/src/config/sandboxConfig.d.ts +13 -0
  18. package/dist/src/config/sandboxConfig.js +75 -0
  19. package/dist/src/config/sandboxConfig.js.map +1 -0
  20. package/dist/src/config/settings.d.ts +69 -0
  21. package/dist/src/config/settings.js +165 -0
  22. package/dist/src/config/settings.js.map +1 -0
  23. package/dist/src/gemini.d.ts +6 -0
  24. package/dist/src/gemini.js +212 -0
  25. package/dist/src/gemini.js.map +1 -0
  26. package/dist/src/gemini.test.d.ts +6 -0
  27. package/dist/src/gemini.test.js +122 -0
  28. package/dist/src/gemini.test.js.map +1 -0
  29. package/dist/src/generated/git-commit.d.ts +6 -0
  30. package/dist/src/generated/git-commit.js +9 -0
  31. package/dist/src/generated/git-commit.js.map +1 -0
  32. package/dist/src/nonInteractiveCli.d.ts +7 -0
  33. package/dist/src/nonInteractiveCli.js +112 -0
  34. package/dist/src/nonInteractiveCli.js.map +1 -0
  35. package/dist/src/ui/App.d.ts +14 -0
  36. package/dist/src/ui/App.js +398 -0
  37. package/dist/src/ui/App.js.map +1 -0
  38. package/dist/src/ui/App.test.d.ts +6 -0
  39. package/dist/src/ui/App.test.js +280 -0
  40. package/dist/src/ui/App.test.js.map +1 -0
  41. package/dist/src/ui/colors.d.ts +7 -0
  42. package/dist/src/ui/colors.js +48 -0
  43. package/dist/src/ui/colors.js.map +1 -0
  44. package/dist/src/ui/components/AboutBox.d.ts +14 -0
  45. package/dist/src/ui/components/AboutBox.js +6 -0
  46. package/dist/src/ui/components/AboutBox.js.map +1 -0
  47. package/dist/src/ui/components/AsciiArt.d.ts +7 -0
  48. package/dist/src/ui/components/AsciiArt.js +26 -0
  49. package/dist/src/ui/components/AsciiArt.js.map +1 -0
  50. package/dist/src/ui/components/AuthDialog.d.ts +15 -0
  51. package/dist/src/ui/components/AuthDialog.js +67 -0
  52. package/dist/src/ui/components/AuthDialog.js.map +1 -0
  53. package/dist/src/ui/components/AuthDialog.test.d.ts +6 -0
  54. package/dist/src/ui/components/AuthDialog.test.js +69 -0
  55. package/dist/src/ui/components/AuthDialog.test.js.map +1 -0
  56. package/dist/src/ui/components/AuthInProgress.d.ts +11 -0
  57. package/dist/src/ui/components/AuthInProgress.js +27 -0
  58. package/dist/src/ui/components/AuthInProgress.js.map +1 -0
  59. package/dist/src/ui/components/AutoAcceptIndicator.d.ts +12 -0
  60. package/dist/src/ui/components/AutoAcceptIndicator.js +26 -0
  61. package/dist/src/ui/components/AutoAcceptIndicator.js.map +1 -0
  62. package/dist/src/ui/components/ConsolePatcher.d.ts +12 -0
  63. package/dist/src/ui/components/ConsolePatcher.js +40 -0
  64. package/dist/src/ui/components/ConsolePatcher.js.map +1 -0
  65. package/dist/src/ui/components/ConsoleSummaryDisplay.d.ts +11 -0
  66. package/dist/src/ui/components/ConsoleSummaryDisplay.js +11 -0
  67. package/dist/src/ui/components/ConsoleSummaryDisplay.js.map +1 -0
  68. package/dist/src/ui/components/ContextSummaryDisplay.d.ts +15 -0
  69. package/dist/src/ui/components/ContextSummaryDisplay.js +41 -0
  70. package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -0
  71. package/dist/src/ui/components/DetailedMessagesDisplay.d.ts +14 -0
  72. package/dist/src/ui/components/DetailedMessagesDisplay.js +34 -0
  73. package/dist/src/ui/components/DetailedMessagesDisplay.js.map +1 -0
  74. package/dist/src/ui/components/EditorSettingsDialog.d.ts +15 -0
  75. package/dist/src/ui/components/EditorSettingsDialog.js +73 -0
  76. package/dist/src/ui/components/EditorSettingsDialog.js.map +1 -0
  77. package/dist/src/ui/components/Footer.d.ts +22 -0
  78. package/dist/src/ui/components/Footer.js +13 -0
  79. package/dist/src/ui/components/Footer.js.map +1 -0
  80. package/dist/src/ui/components/GeminiRespondingSpinner.d.ts +17 -0
  81. package/dist/src/ui/components/GeminiRespondingSpinner.js +16 -0
  82. package/dist/src/ui/components/GeminiRespondingSpinner.js.map +1 -0
  83. package/dist/src/ui/components/Header.d.ts +12 -0
  84. package/dist/src/ui/components/Header.js +20 -0
  85. package/dist/src/ui/components/Header.js.map +1 -0
  86. package/dist/src/ui/components/Help.d.ts +12 -0
  87. package/dist/src/ui/components/Help.js +7 -0
  88. package/dist/src/ui/components/Help.js.map +1 -0
  89. package/dist/src/ui/components/HistoryItemDisplay.d.ts +18 -0
  90. package/dist/src/ui/components/HistoryItemDisplay.js +15 -0
  91. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -0
  92. package/dist/src/ui/components/HistoryItemDisplay.test.d.ts +6 -0
  93. package/dist/src/ui/components/HistoryItemDisplay.test.js +85 -0
  94. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -0
  95. package/dist/src/ui/components/InputPrompt.d.ts +24 -0
  96. package/dist/src/ui/components/InputPrompt.js +313 -0
  97. package/dist/src/ui/components/InputPrompt.js.map +1 -0
  98. package/dist/src/ui/components/InputPrompt.test.d.ts +6 -0
  99. package/dist/src/ui/components/InputPrompt.test.js +154 -0
  100. package/dist/src/ui/components/InputPrompt.test.js.map +1 -0
  101. package/dist/src/ui/components/LoadingIndicator.d.ts +15 -0
  102. package/dist/src/ui/components/LoadingIndicator.js +19 -0
  103. package/dist/src/ui/components/LoadingIndicator.js.map +1 -0
  104. package/dist/src/ui/components/LoadingIndicator.test.d.ts +6 -0
  105. package/dist/src/ui/components/LoadingIndicator.test.js +141 -0
  106. package/dist/src/ui/components/LoadingIndicator.test.js.map +1 -0
  107. package/dist/src/ui/components/MemoryUsageDisplay.d.ts +7 -0
  108. package/dist/src/ui/components/MemoryUsageDisplay.js +27 -0
  109. package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -0
  110. package/dist/src/ui/components/SessionSummaryDisplay.d.ts +13 -0
  111. package/dist/src/ui/components/SessionSummaryDisplay.js +20 -0
  112. package/dist/src/ui/components/SessionSummaryDisplay.js.map +1 -0
  113. package/dist/src/ui/components/SessionSummaryDisplay.test.d.ts +6 -0
  114. package/dist/src/ui/components/SessionSummaryDisplay.test.js +41 -0
  115. package/dist/src/ui/components/SessionSummaryDisplay.test.js.map +1 -0
  116. package/dist/src/ui/components/ShellModeIndicator.d.ts +7 -0
  117. package/dist/src/ui/components/ShellModeIndicator.js +5 -0
  118. package/dist/src/ui/components/ShellModeIndicator.js.map +1 -0
  119. package/dist/src/ui/components/ShowMoreLines.d.ts +10 -0
  120. package/dist/src/ui/components/ShowMoreLines.js +24 -0
  121. package/dist/src/ui/components/ShowMoreLines.js.map +1 -0
  122. package/dist/src/ui/components/Stats.d.ts +39 -0
  123. package/dist/src/ui/components/Stats.js +23 -0
  124. package/dist/src/ui/components/Stats.js.map +1 -0
  125. package/dist/src/ui/components/Stats.test.d.ts +6 -0
  126. package/dist/src/ui/components/Stats.test.js +57 -0
  127. package/dist/src/ui/components/Stats.test.js.map +1 -0
  128. package/dist/src/ui/components/StatsDisplay.d.ts +14 -0
  129. package/dist/src/ui/components/StatsDisplay.js +28 -0
  130. package/dist/src/ui/components/StatsDisplay.js.map +1 -0
  131. package/dist/src/ui/components/StatsDisplay.test.d.ts +6 -0
  132. package/dist/src/ui/components/StatsDisplay.test.js +51 -0
  133. package/dist/src/ui/components/StatsDisplay.test.js.map +1 -0
  134. package/dist/src/ui/components/SuggestionsDisplay.d.ts +21 -0
  135. package/dist/src/ui/components/SuggestionsDisplay.js +32 -0
  136. package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -0
  137. package/dist/src/ui/components/ThemeDialog.d.ts +19 -0
  138. package/dist/src/ui/components/ThemeDialog.js +126 -0
  139. package/dist/src/ui/components/ThemeDialog.js.map +1 -0
  140. package/dist/src/ui/components/Tips.d.ts +12 -0
  141. package/dist/src/ui/components/Tips.js +8 -0
  142. package/dist/src/ui/components/Tips.js.map +1 -0
  143. package/dist/src/ui/components/UpdateNotification.d.ts +10 -0
  144. package/dist/src/ui/components/UpdateNotification.js +10 -0
  145. package/dist/src/ui/components/UpdateNotification.js.map +1 -0
  146. package/dist/src/ui/components/messages/CompressionMessage.d.ts +11 -0
  147. package/dist/src/ui/components/messages/CompressionMessage.js +16 -0
  148. package/dist/src/ui/components/messages/CompressionMessage.js.map +1 -0
  149. package/dist/src/ui/components/messages/DiffRenderer.d.ts +15 -0
  150. package/dist/src/ui/components/messages/DiffRenderer.js +212 -0
  151. package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -0
  152. package/dist/src/ui/components/messages/DiffRenderer.test.d.ts +6 -0
  153. package/dist/src/ui/components/messages/DiffRenderer.test.js +239 -0
  154. package/dist/src/ui/components/messages/DiffRenderer.test.js.map +1 -0
  155. package/dist/src/ui/components/messages/ErrorMessage.d.ts +11 -0
  156. package/dist/src/ui/components/messages/ErrorMessage.js +9 -0
  157. package/dist/src/ui/components/messages/ErrorMessage.js.map +1 -0
  158. package/dist/src/ui/components/messages/GeminiMessage.d.ts +14 -0
  159. package/dist/src/ui/components/messages/GeminiMessage.js +10 -0
  160. package/dist/src/ui/components/messages/GeminiMessage.js.map +1 -0
  161. package/dist/src/ui/components/messages/GeminiMessageContent.d.ts +14 -0
  162. package/dist/src/ui/components/messages/GeminiMessageContent.js +15 -0
  163. package/dist/src/ui/components/messages/GeminiMessageContent.js.map +1 -0
  164. package/dist/src/ui/components/messages/InfoMessage.d.ts +11 -0
  165. package/dist/src/ui/components/messages/InfoMessage.js +9 -0
  166. package/dist/src/ui/components/messages/InfoMessage.js.map +1 -0
  167. package/dist/src/ui/components/messages/ToolConfirmationMessage.d.ts +15 -0
  168. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +111 -0
  169. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -0
  170. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.d.ts +6 -0
  171. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +37 -0
  172. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -0
  173. package/dist/src/ui/components/messages/ToolGroupMessage.d.ts +18 -0
  174. package/dist/src/ui/components/messages/ToolGroupMessage.js +53 -0
  175. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -0
  176. package/dist/src/ui/components/messages/ToolMessage.d.ts +15 -0
  177. package/dist/src/ui/components/messages/ToolMessage.js +61 -0
  178. package/dist/src/ui/components/messages/ToolMessage.js.map +1 -0
  179. package/dist/src/ui/components/messages/ToolMessage.test.d.ts +6 -0
  180. package/dist/src/ui/components/messages/ToolMessage.test.js +116 -0
  181. package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -0
  182. package/dist/src/ui/components/messages/UserMessage.d.ts +11 -0
  183. package/dist/src/ui/components/messages/UserMessage.js +9 -0
  184. package/dist/src/ui/components/messages/UserMessage.js.map +1 -0
  185. package/dist/src/ui/components/messages/UserShellMessage.d.ts +11 -0
  186. package/dist/src/ui/components/messages/UserShellMessage.js +9 -0
  187. package/dist/src/ui/components/messages/UserShellMessage.js.map +1 -0
  188. package/dist/src/ui/components/shared/MaxSizedBox.d.ts +61 -0
  189. package/dist/src/ui/components/shared/MaxSizedBox.js +383 -0
  190. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -0
  191. package/dist/src/ui/components/shared/MaxSizedBox.test.d.ts +6 -0
  192. package/dist/src/ui/components/shared/MaxSizedBox.test.js +134 -0
  193. package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +1 -0
  194. package/dist/src/ui/components/shared/RadioButtonSelect.d.ts +41 -0
  195. package/dist/src/ui/components/shared/RadioButtonSelect.js +52 -0
  196. package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -0
  197. package/dist/src/ui/components/shared/text-buffer.d.ts +121 -0
  198. package/dist/src/ui/components/shared/text-buffer.js +1147 -0
  199. package/dist/src/ui/components/shared/text-buffer.js.map +1 -0
  200. package/dist/src/ui/constants.d.ts +8 -0
  201. package/dist/src/ui/constants.js +12 -0
  202. package/dist/src/ui/constants.js.map +1 -0
  203. package/dist/src/ui/contexts/OverflowContext.d.ts +19 -0
  204. package/dist/src/ui/contexts/OverflowContext.js +43 -0
  205. package/dist/src/ui/contexts/OverflowContext.js.map +1 -0
  206. package/dist/src/ui/contexts/SessionContext.d.ts +35 -0
  207. package/dist/src/ui/contexts/SessionContext.js +132 -0
  208. package/dist/src/ui/contexts/SessionContext.js.map +1 -0
  209. package/dist/src/ui/contexts/SessionContext.test.d.ts +6 -0
  210. package/dist/src/ui/contexts/SessionContext.test.js +151 -0
  211. package/dist/src/ui/contexts/SessionContext.test.js.map +1 -0
  212. package/dist/src/ui/contexts/StreamingContext.d.ts +9 -0
  213. package/dist/src/ui/contexts/StreamingContext.js +15 -0
  214. package/dist/src/ui/contexts/StreamingContext.js.map +1 -0
  215. package/dist/src/ui/editors/editorSettingsManager.d.ts +19 -0
  216. package/dist/src/ui/editors/editorSettingsManager.js +50 -0
  217. package/dist/src/ui/editors/editorSettingsManager.js.map +1 -0
  218. package/dist/src/ui/hooks/atCommandProcessor.d.ts +31 -0
  219. package/dist/src/ui/hooks/atCommandProcessor.js +312 -0
  220. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -0
  221. package/dist/src/ui/hooks/shellCommandProcessor.d.ts +16 -0
  222. package/dist/src/ui/hooks/shellCommandProcessor.js +261 -0
  223. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -0
  224. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +31 -0
  225. package/dist/src/ui/hooks/slashCommandProcessor.js +922 -0
  226. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -0
  227. package/dist/src/ui/hooks/useAuthCommand.d.ts +15 -0
  228. package/dist/src/ui/hooks/useAuthCommand.js +65 -0
  229. package/dist/src/ui/hooks/useAuthCommand.js.map +1 -0
  230. package/dist/src/ui/hooks/useAutoAcceptIndicator.d.ts +10 -0
  231. package/dist/src/ui/hooks/useAutoAcceptIndicator.js +37 -0
  232. package/dist/src/ui/hooks/useAutoAcceptIndicator.js.map +1 -0
  233. package/dist/src/ui/hooks/useCompletion.d.ts +21 -0
  234. package/dist/src/ui/hooks/useCompletion.js +321 -0
  235. package/dist/src/ui/hooks/useCompletion.js.map +1 -0
  236. package/dist/src/ui/hooks/useConsoleMessages.d.ts +12 -0
  237. package/dist/src/ui/hooks/useConsoleMessages.js +59 -0
  238. package/dist/src/ui/hooks/useConsoleMessages.js.map +1 -0
  239. package/dist/src/ui/hooks/useEditorSettings.d.ts +16 -0
  240. package/dist/src/ui/hooks/useEditorSettings.js +43 -0
  241. package/dist/src/ui/hooks/useEditorSettings.js.map +1 -0
  242. package/dist/src/ui/hooks/useGeminiStream.d.ts +23 -0
  243. package/dist/src/ui/hooks/useGeminiStream.js +552 -0
  244. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -0
  245. package/dist/src/ui/hooks/useGeminiStream.test.d.ts +6 -0
  246. package/dist/src/ui/hooks/useGeminiStream.test.js +823 -0
  247. package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -0
  248. package/dist/src/ui/hooks/useGitBranchName.d.ts +6 -0
  249. package/dist/src/ui/hooks/useGitBranchName.js +61 -0
  250. package/dist/src/ui/hooks/useGitBranchName.js.map +1 -0
  251. package/dist/src/ui/hooks/useHistoryManager.d.ts +22 -0
  252. package/dist/src/ui/hooks/useHistoryManager.js +72 -0
  253. package/dist/src/ui/hooks/useHistoryManager.js.map +1 -0
  254. package/dist/src/ui/hooks/useInputHistory.d.ts +19 -0
  255. package/dist/src/ui/hooks/useInputHistory.js +84 -0
  256. package/dist/src/ui/hooks/useInputHistory.js.map +1 -0
  257. package/dist/src/ui/hooks/useLoadingIndicator.d.ts +10 -0
  258. package/dist/src/ui/hooks/useLoadingIndicator.js +44 -0
  259. package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -0
  260. package/dist/src/ui/hooks/useLogger.d.ts +10 -0
  261. package/dist/src/ui/hooks/useLogger.js +29 -0
  262. package/dist/src/ui/hooks/useLogger.js.map +1 -0
  263. package/dist/src/ui/hooks/usePhraseCycler.d.ts +14 -0
  264. package/dist/src/ui/hooks/usePhraseCycler.js +189 -0
  265. package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -0
  266. package/dist/src/ui/hooks/useReactToolScheduler.d.ts +33 -0
  267. package/dist/src/ui/hooks/useReactToolScheduler.js +186 -0
  268. package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -0
  269. package/dist/src/ui/hooks/useRefreshMemoryCommand.d.ts +6 -0
  270. package/dist/src/ui/hooks/useRefreshMemoryCommand.js +7 -0
  271. package/dist/src/ui/hooks/useRefreshMemoryCommand.js.map +1 -0
  272. package/dist/src/ui/hooks/useShellHistory.d.ts +11 -0
  273. package/dist/src/ui/hooks/useShellHistory.js +89 -0
  274. package/dist/src/ui/hooks/useShellHistory.js.map +1 -0
  275. package/dist/src/ui/hooks/useShowMemoryCommand.d.ts +9 -0
  276. package/dist/src/ui/hooks/useShowMemoryCommand.js +58 -0
  277. package/dist/src/ui/hooks/useShowMemoryCommand.js.map +1 -0
  278. package/dist/src/ui/hooks/useStateAndRef.d.ts +7 -0
  279. package/dist/src/ui/hooks/useStateAndRef.js +26 -0
  280. package/dist/src/ui/hooks/useStateAndRef.js.map +1 -0
  281. package/dist/src/ui/hooks/useTerminalSize.d.ts +9 -0
  282. package/dist/src/ui/hooks/useTerminalSize.js +27 -0
  283. package/dist/src/ui/hooks/useTerminalSize.js.map +1 -0
  284. package/dist/src/ui/hooks/useThemeCommand.d.ts +15 -0
  285. package/dist/src/ui/hooks/useThemeCommand.js +78 -0
  286. package/dist/src/ui/hooks/useThemeCommand.js.map +1 -0
  287. package/dist/src/ui/hooks/useTimer.d.ts +12 -0
  288. package/dist/src/ui/hooks/useTimer.js +58 -0
  289. package/dist/src/ui/hooks/useTimer.js.map +1 -0
  290. package/dist/src/ui/themes/ansi-light.d.ts +7 -0
  291. package/dist/src/ui/themes/ansi-light.js +139 -0
  292. package/dist/src/ui/themes/ansi-light.js.map +1 -0
  293. package/dist/src/ui/themes/ansi.d.ts +7 -0
  294. package/dist/src/ui/themes/ansi.js +149 -0
  295. package/dist/src/ui/themes/ansi.js.map +1 -0
  296. package/dist/src/ui/themes/atom-one-dark.d.ts +7 -0
  297. package/dist/src/ui/themes/atom-one-dark.js +136 -0
  298. package/dist/src/ui/themes/atom-one-dark.js.map +1 -0
  299. package/dist/src/ui/themes/ayu-light.d.ts +7 -0
  300. package/dist/src/ui/themes/ayu-light.js +128 -0
  301. package/dist/src/ui/themes/ayu-light.js.map +1 -0
  302. package/dist/src/ui/themes/ayu.d.ts +7 -0
  303. package/dist/src/ui/themes/ayu.js +102 -0
  304. package/dist/src/ui/themes/ayu.js.map +1 -0
  305. package/dist/src/ui/themes/default-light.d.ts +7 -0
  306. package/dist/src/ui/themes/default-light.js +100 -0
  307. package/dist/src/ui/themes/default-light.js.map +1 -0
  308. package/dist/src/ui/themes/default.d.ts +7 -0
  309. package/dist/src/ui/themes/default.js +143 -0
  310. package/dist/src/ui/themes/default.js.map +1 -0
  311. package/dist/src/ui/themes/dracula.d.ts +7 -0
  312. package/dist/src/ui/themes/dracula.js +113 -0
  313. package/dist/src/ui/themes/dracula.js.map +1 -0
  314. package/dist/src/ui/themes/github-dark.d.ts +7 -0
  315. package/dist/src/ui/themes/github-dark.js +136 -0
  316. package/dist/src/ui/themes/github-dark.js.map +1 -0
  317. package/dist/src/ui/themes/github-light.d.ts +7 -0
  318. package/dist/src/ui/themes/github-light.js +138 -0
  319. package/dist/src/ui/themes/github-light.js.map +1 -0
  320. package/dist/src/ui/themes/googlecode.d.ts +7 -0
  321. package/dist/src/ui/themes/googlecode.js +135 -0
  322. package/dist/src/ui/themes/googlecode.js.map +1 -0
  323. package/dist/src/ui/themes/no-color.d.ts +7 -0
  324. package/dist/src/ui/themes/no-color.js +84 -0
  325. package/dist/src/ui/themes/no-color.js.map +1 -0
  326. package/dist/src/ui/themes/theme-manager.d.ts +33 -0
  327. package/dist/src/ui/themes/theme-manager.js +107 -0
  328. package/dist/src/ui/themes/theme-manager.js.map +1 -0
  329. package/dist/src/ui/themes/theme.d.ts +67 -0
  330. package/dist/src/ui/themes/theme.js +304 -0
  331. package/dist/src/ui/themes/theme.js.map +1 -0
  332. package/dist/src/ui/themes/xcode.d.ts +7 -0
  333. package/dist/src/ui/themes/xcode.js +143 -0
  334. package/dist/src/ui/themes/xcode.js.map +1 -0
  335. package/dist/src/ui/types.d.ts +149 -0
  336. package/dist/src/ui/types.js +41 -0
  337. package/dist/src/ui/types.js.map +1 -0
  338. package/dist/src/ui/utils/CodeColorizer.d.ts +14 -0
  339. package/dist/src/ui/utils/CodeColorizer.js +97 -0
  340. package/dist/src/ui/utils/CodeColorizer.js.map +1 -0
  341. package/dist/src/ui/utils/MarkdownDisplay.d.ts +14 -0
  342. package/dist/src/ui/utils/MarkdownDisplay.js +221 -0
  343. package/dist/src/ui/utils/MarkdownDisplay.js.map +1 -0
  344. package/dist/src/ui/utils/commandUtils.d.ts +22 -0
  345. package/dist/src/ui/utils/commandUtils.js +25 -0
  346. package/dist/src/ui/utils/commandUtils.js.map +1 -0
  347. package/dist/src/ui/utils/errorParsing.d.ts +15 -0
  348. package/dist/src/ui/utils/errorParsing.js +80 -0
  349. package/dist/src/ui/utils/errorParsing.js.map +1 -0
  350. package/dist/src/ui/utils/formatters.d.ts +13 -0
  351. package/dist/src/ui/utils/formatters.js +56 -0
  352. package/dist/src/ui/utils/formatters.js.map +1 -0
  353. package/dist/src/ui/utils/markdownUtilities.d.ts +6 -0
  354. package/dist/src/ui/utils/markdownUtilities.js +110 -0
  355. package/dist/src/ui/utils/markdownUtilities.js.map +1 -0
  356. package/dist/src/ui/utils/textUtils.d.ts +22 -0
  357. package/dist/src/ui/utils/textUtils.js +58 -0
  358. package/dist/src/ui/utils/textUtils.js.map +1 -0
  359. package/dist/src/ui/utils/updateCheck.d.ts +6 -0
  360. package/dist/src/ui/utils/updateCheck.js +34 -0
  361. package/dist/src/ui/utils/updateCheck.js.map +1 -0
  362. package/dist/src/utils/cleanup.d.ts +6 -0
  363. package/dist/src/utils/cleanup.js +19 -0
  364. package/dist/src/utils/cleanup.js.map +1 -0
  365. package/dist/src/utils/package.d.ts +12 -0
  366. package/dist/src/utils/package.js +24 -0
  367. package/dist/src/utils/package.js.map +1 -0
  368. package/dist/src/utils/readStdin.d.ts +6 -0
  369. package/dist/src/utils/readStdin.js +34 -0
  370. package/dist/src/utils/readStdin.js.map +1 -0
  371. package/dist/src/utils/sandbox.d.ts +7 -0
  372. package/dist/src/utils/sandbox.js +680 -0
  373. package/dist/src/utils/sandbox.js.map +1 -0
  374. package/dist/src/utils/startupWarnings.d.ts +6 -0
  375. package/dist/src/utils/startupWarnings.js +40 -0
  376. package/dist/src/utils/startupWarnings.js.map +1 -0
  377. package/dist/src/utils/version.d.ts +6 -0
  378. package/dist/src/utils/version.js +11 -0
  379. package/dist/src/utils/version.js.map +1 -0
  380. package/dist/tsconfig.tsbuildinfo +1 -0
  381. package/package.json +60 -71
  382. package/LICENSE +0 -202
  383. package/bundle/gemini.js +0 -257368
  384. package/bundle/shell.json +0 -18
  385. package/bundle/shell.md +0 -16
  386. /package/{bundle → dist/src/utils}/sandbox-macos-permissive-closed.sb +0 -0
  387. /package/{bundle → dist/src/utils}/sandbox-macos-permissive-open.sb +0 -0
  388. /package/{bundle → dist/src/utils}/sandbox-macos-permissive-proxied.sb +0 -0
  389. /package/{bundle → dist/src/utils}/sandbox-macos-restrictive-closed.sb +0 -0
  390. /package/{bundle → dist/src/utils}/sandbox-macos-restrictive-open.sb +0 -0
  391. /package/{bundle → dist/src/utils}/sandbox-macos-restrictive-proxied.sb +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useConsoleMessages.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useConsoleMessages.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AASjE,MAAM,UAAU,kBAAkB;IAChC,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CACpD,EAAE,CACH,CAAC;IACF,MAAM,eAAe,GAAG,MAAM,CAAuB,EAAE,CAAC,CAAC;IACzD,MAAM,sBAAsB,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAE3D,MAAM,mBAAmB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC3C,IAAI,eAAe,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO;QACT,CAAC;QAED,kBAAkB,CAAC,CAAC,YAAY,EAAE,EAAE;YAClC,MAAM,WAAW,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC;YACtC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,EAAE;gBAChD,IACE,WAAW,CAAC,MAAM,GAAG,CAAC;oBACtB,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI;oBAC/D,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,KAAK,aAAa,CAAC,OAAO,EACrE,CAAC;oBACD,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK;wBACvC,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACzD,CAAC;qBAAM,CAAC;oBACN,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC,CAAC,CAAC;YACH,OAAO,WAAW,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,eAAe,CAAC,OAAO,GAAG,EAAE,CAAC;QAC7B,sBAAsB,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,wBAAwB;IACjE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,uBAAuB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/C,IAAI,sBAAsB,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC5C,sBAAsB,CAAC,OAAO,GAAG,UAAU,CACzC,mBAAmB,EACnB,CAAC,CACmB,CAAC;QACzB,CAAC;IACH,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAE1B,MAAM,gBAAgB,GAAG,WAAW,CAClC,CAAC,OAA2B,EAAE,EAAE;QAC9B,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,uBAAuB,EAAE,CAAC;IAC5B,CAAC,EACD,CAAC,uBAAuB,CAAC,CAC1B,CAAC;IAEF,MAAM,oBAAoB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5C,kBAAkB,CAAC,EAAE,CAAC,CAAC;QACvB,IAAI,sBAAsB,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC5C,YAAY,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;YAC7C,sBAAsB,CAAC,OAAO,GAAG,IAAI,CAAC;QACxC,CAAC;QACD,eAAe,CAAC,OAAO,GAAG,EAAE,CAAC;IAC/B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CACP,GAAG,EAAE;IACH,qBAAqB;IACrB,GAAG,EAAE;QACH,IAAI,sBAAsB,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC5C,YAAY,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,EACH,EAAE,CACH,CAAC;IAEF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,CAAC;AACrE,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { LoadedSettings, SettingScope } from '../../config/settings.js';
7
+ import { type HistoryItem } from '../types.js';
8
+ import { EditorType } from '@google/gemini-cli-core';
9
+ interface UseEditorSettingsReturn {
10
+ isEditorDialogOpen: boolean;
11
+ openEditorDialog: () => void;
12
+ handleEditorSelect: (editorType: EditorType | undefined, scope: SettingScope) => void;
13
+ exitEditorDialog: () => void;
14
+ }
15
+ export declare const useEditorSettings: (loadedSettings: LoadedSettings, setEditorError: (error: string | null) => void, addItem: (item: Omit<HistoryItem, "id">, timestamp: number) => void) => UseEditorSettingsReturn;
16
+ export {};
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { useState, useCallback } from 'react';
7
+ import { MessageType } from '../types.js';
8
+ import { allowEditorTypeInSandbox, checkHasEditorType, } from '@google/gemini-cli-core';
9
+ export const useEditorSettings = (loadedSettings, setEditorError, addItem) => {
10
+ const [isEditorDialogOpen, setIsEditorDialogOpen] = useState(false);
11
+ const openEditorDialog = useCallback(() => {
12
+ setIsEditorDialogOpen(true);
13
+ }, []);
14
+ const handleEditorSelect = useCallback((editorType, scope) => {
15
+ if (editorType &&
16
+ (!checkHasEditorType(editorType) ||
17
+ !allowEditorTypeInSandbox(editorType))) {
18
+ return;
19
+ }
20
+ try {
21
+ loadedSettings.setValue(scope, 'preferredEditor', editorType);
22
+ addItem({
23
+ type: MessageType.INFO,
24
+ text: `Editor preference ${editorType ? `set to "${editorType}"` : 'cleared'} in ${scope} settings.`,
25
+ }, Date.now());
26
+ setEditorError(null);
27
+ setIsEditorDialogOpen(false);
28
+ }
29
+ catch (error) {
30
+ setEditorError(`Failed to set editor preference: ${error}`);
31
+ }
32
+ }, [loadedSettings, setEditorError, addItem]);
33
+ const exitEditorDialog = useCallback(() => {
34
+ setIsEditorDialogOpen(false);
35
+ }, []);
36
+ return {
37
+ isEditorDialogOpen,
38
+ openEditorDialog,
39
+ handleEditorSelect,
40
+ exitEditorDialog,
41
+ };
42
+ };
43
+ //# sourceMappingURL=useEditorSettings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEditorSettings.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useEditorSettings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAE9C,OAAO,EAAoB,WAAW,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EACL,wBAAwB,EACxB,kBAAkB,GAEnB,MAAM,yBAAyB,CAAC;AAYjC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,cAA8B,EAC9B,cAA8C,EAC9C,OAAmE,EAC1C,EAAE;IAC3B,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpE,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE;QACxC,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,kBAAkB,GAAG,WAAW,CACpC,CAAC,UAAkC,EAAE,KAAmB,EAAE,EAAE;QAC1D,IACE,UAAU;YACV,CAAC,CAAC,kBAAkB,CAAC,UAAU,CAAC;gBAC9B,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAC,EACxC,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,cAAc,CAAC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,EAAE,UAAU,CAAC,CAAC;YAC9D,OAAO,CACL;gBACE,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,IAAI,EAAE,qBAAqB,UAAU,CAAC,CAAC,CAAC,WAAW,UAAU,GAAG,CAAC,CAAC,CAAC,SAAS,OAAO,KAAK,YAAY;aACrG,EACD,IAAI,CAAC,GAAG,EAAE,CACX,CAAC;YACF,cAAc,CAAC,IAAI,CAAC,CAAC;YACrB,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,cAAc,CAAC,oCAAoC,KAAK,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC,EACD,CAAC,cAAc,EAAE,cAAc,EAAE,OAAO,CAAC,CAC1C,CAAC;IAEF,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE;QACxC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,kBAAkB;QAClB,gBAAgB;QAChB,kBAAkB;QAClB,gBAAgB;KACjB,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { Config, GeminiClient, EditorType, ThoughtSummary } from '@google/gemini-cli-core';
7
+ import { type PartListUnion } from '@google/genai';
8
+ import { StreamingState, HistoryItem, HistoryItemWithoutId } from '../types.js';
9
+ import { UseHistoryManagerReturn } from './useHistoryManager.js';
10
+ export declare function mergePartListUnions(list: PartListUnion[]): PartListUnion;
11
+ /**
12
+ * Manages the Gemini stream, including user input, command processing,
13
+ * API interaction, and tool call lifecycle.
14
+ */
15
+ export declare const useGeminiStream: (geminiClient: GeminiClient, history: HistoryItem[], addItem: UseHistoryManagerReturn["addItem"], setShowHelp: React.Dispatch<React.SetStateAction<boolean>>, config: Config, onDebugMessage: (message: string) => void, handleSlashCommand: (cmd: PartListUnion) => Promise<import("./slashCommandProcessor.js").SlashCommandActionReturn | boolean>, shellModeActive: boolean, getPreferredEditor: () => EditorType | undefined, onAuthError: () => void, performMemoryRefresh: () => Promise<void>) => {
16
+ streamingState: StreamingState;
17
+ submitQuery: (query: PartListUnion, options?: {
18
+ isContinuation: boolean;
19
+ }) => Promise<void>;
20
+ initError: string | null;
21
+ pendingHistoryItems: HistoryItemWithoutId[];
22
+ thought: ThoughtSummary | null;
23
+ };
@@ -0,0 +1,552 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { useState, useRef, useCallback, useEffect, useMemo } from 'react';
7
+ import { useInput } from 'ink';
8
+ import { GeminiEventType as ServerGeminiEventType, getErrorMessage, isNodeError, MessageSenderType, logUserPrompt, GitService, UnauthorizedError, UserPromptEvent, } from '@google/gemini-cli-core';
9
+ import { StreamingState, MessageType, ToolCallStatus, } from '../types.js';
10
+ import { isAtCommand } from '../utils/commandUtils.js';
11
+ import { parseAndFormatApiError } from '../utils/errorParsing.js';
12
+ import { useShellCommandProcessor } from './shellCommandProcessor.js';
13
+ import { handleAtCommand } from './atCommandProcessor.js';
14
+ import { findLastSafeSplitPoint } from '../utils/markdownUtilities.js';
15
+ import { useStateAndRef } from './useStateAndRef.js';
16
+ import { useLogger } from './useLogger.js';
17
+ import { promises as fs } from 'fs';
18
+ import path from 'path';
19
+ import { useReactToolScheduler, mapToDisplay as mapTrackedToolCallsToDisplay, } from './useReactToolScheduler.js';
20
+ import { useSessionStats } from '../contexts/SessionContext.js';
21
+ export function mergePartListUnions(list) {
22
+ const resultParts = [];
23
+ for (const item of list) {
24
+ if (Array.isArray(item)) {
25
+ resultParts.push(...item);
26
+ }
27
+ else {
28
+ resultParts.push(item);
29
+ }
30
+ }
31
+ return resultParts;
32
+ }
33
+ var StreamProcessingStatus;
34
+ (function (StreamProcessingStatus) {
35
+ StreamProcessingStatus[StreamProcessingStatus["Completed"] = 0] = "Completed";
36
+ StreamProcessingStatus[StreamProcessingStatus["UserCancelled"] = 1] = "UserCancelled";
37
+ StreamProcessingStatus[StreamProcessingStatus["Error"] = 2] = "Error";
38
+ })(StreamProcessingStatus || (StreamProcessingStatus = {}));
39
+ /**
40
+ * Manages the Gemini stream, including user input, command processing,
41
+ * API interaction, and tool call lifecycle.
42
+ */
43
+ export const useGeminiStream = (geminiClient, history, addItem, setShowHelp, config, onDebugMessage, handleSlashCommand, shellModeActive, getPreferredEditor, onAuthError, performMemoryRefresh) => {
44
+ const [initError, setInitError] = useState(null);
45
+ const abortControllerRef = useRef(null);
46
+ const turnCancelledRef = useRef(false);
47
+ const [isResponding, setIsResponding] = useState(false);
48
+ const [thought, setThought] = useState(null);
49
+ const [pendingHistoryItemRef, setPendingHistoryItem] = useStateAndRef(null);
50
+ const processedMemoryToolsRef = useRef(new Set());
51
+ const logger = useLogger();
52
+ const { startNewTurn, addUsage } = useSessionStats();
53
+ const gitService = useMemo(() => {
54
+ if (!config.getProjectRoot()) {
55
+ return;
56
+ }
57
+ return new GitService(config.getProjectRoot());
58
+ }, [config]);
59
+ const [toolCalls, scheduleToolCalls, markToolsAsSubmitted] = useReactToolScheduler((completedToolCallsFromScheduler) => {
60
+ // This onComplete is called when ALL scheduled tools for a given batch are done.
61
+ if (completedToolCallsFromScheduler.length > 0) {
62
+ // Add the final state of these tools to the history for display.
63
+ // The new useEffect will handle submitting their responses.
64
+ addItem(mapTrackedToolCallsToDisplay(completedToolCallsFromScheduler), Date.now());
65
+ }
66
+ }, config, setPendingHistoryItem, getPreferredEditor);
67
+ const pendingToolCallGroupDisplay = useMemo(() => toolCalls.length ? mapTrackedToolCallsToDisplay(toolCalls) : undefined, [toolCalls]);
68
+ const onExec = useCallback(async (done) => {
69
+ setIsResponding(true);
70
+ await done;
71
+ setIsResponding(false);
72
+ }, []);
73
+ const { handleShellCommand } = useShellCommandProcessor(addItem, setPendingHistoryItem, onExec, onDebugMessage, config, geminiClient);
74
+ const streamingState = useMemo(() => {
75
+ if (toolCalls.some((tc) => tc.status === 'awaiting_approval')) {
76
+ return StreamingState.WaitingForConfirmation;
77
+ }
78
+ if (isResponding ||
79
+ toolCalls.some((tc) => tc.status === 'executing' ||
80
+ tc.status === 'scheduled' ||
81
+ tc.status === 'validating' ||
82
+ ((tc.status === 'success' ||
83
+ tc.status === 'error' ||
84
+ tc.status === 'cancelled') &&
85
+ !tc
86
+ .responseSubmittedToGemini))) {
87
+ return StreamingState.Responding;
88
+ }
89
+ return StreamingState.Idle;
90
+ }, [isResponding, toolCalls]);
91
+ useInput((_input, key) => {
92
+ if (streamingState === StreamingState.Responding && key.escape) {
93
+ if (turnCancelledRef.current) {
94
+ return;
95
+ }
96
+ turnCancelledRef.current = true;
97
+ abortControllerRef.current?.abort();
98
+ if (pendingHistoryItemRef.current) {
99
+ addItem(pendingHistoryItemRef.current, Date.now());
100
+ }
101
+ addItem({
102
+ type: MessageType.INFO,
103
+ text: 'Request cancelled.',
104
+ }, Date.now());
105
+ setPendingHistoryItem(null);
106
+ setIsResponding(false);
107
+ }
108
+ });
109
+ const prepareQueryForGemini = useCallback(async (query, userMessageTimestamp, abortSignal) => {
110
+ if (turnCancelledRef.current) {
111
+ return { queryToSend: null, shouldProceed: false };
112
+ }
113
+ if (typeof query === 'string' && query.trim().length === 0) {
114
+ return { queryToSend: null, shouldProceed: false };
115
+ }
116
+ let localQueryToSendToGemini = null;
117
+ if (typeof query === 'string') {
118
+ const trimmedQuery = query.trim();
119
+ logUserPrompt(config, new UserPromptEvent(trimmedQuery.length, trimmedQuery));
120
+ onDebugMessage(`User query: '${trimmedQuery}'`);
121
+ await logger?.logMessage(MessageSenderType.USER, trimmedQuery);
122
+ // Handle UI-only commands first
123
+ const slashCommandResult = await handleSlashCommand(trimmedQuery);
124
+ if (typeof slashCommandResult === 'boolean' && slashCommandResult) {
125
+ // Command was handled, and it doesn't require a tool call from here
126
+ return { queryToSend: null, shouldProceed: false };
127
+ }
128
+ else if (typeof slashCommandResult === 'object' &&
129
+ slashCommandResult.shouldScheduleTool) {
130
+ // Slash command wants to schedule a tool call (e.g., /memory add)
131
+ const { toolName, toolArgs } = slashCommandResult;
132
+ if (toolName && toolArgs) {
133
+ const toolCallRequest = {
134
+ callId: `${toolName}-${Date.now()}-${Math.random().toString(16).slice(2)}`,
135
+ name: toolName,
136
+ args: toolArgs,
137
+ isClientInitiated: true,
138
+ };
139
+ scheduleToolCalls([toolCallRequest], abortSignal);
140
+ }
141
+ return { queryToSend: null, shouldProceed: false }; // Handled by scheduling the tool
142
+ }
143
+ if (shellModeActive && handleShellCommand(trimmedQuery, abortSignal)) {
144
+ return { queryToSend: null, shouldProceed: false };
145
+ }
146
+ // Handle @-commands (which might involve tool calls)
147
+ if (isAtCommand(trimmedQuery)) {
148
+ const atCommandResult = await handleAtCommand({
149
+ query: trimmedQuery,
150
+ config,
151
+ addItem,
152
+ onDebugMessage,
153
+ messageId: userMessageTimestamp,
154
+ signal: abortSignal,
155
+ });
156
+ if (!atCommandResult.shouldProceed) {
157
+ return { queryToSend: null, shouldProceed: false };
158
+ }
159
+ localQueryToSendToGemini = atCommandResult.processedQuery;
160
+ }
161
+ else {
162
+ // Normal query for Gemini
163
+ addItem({ type: MessageType.USER, text: trimmedQuery }, userMessageTimestamp);
164
+ localQueryToSendToGemini = trimmedQuery;
165
+ }
166
+ }
167
+ else {
168
+ // It's a function response (PartListUnion that isn't a string)
169
+ localQueryToSendToGemini = query;
170
+ }
171
+ if (localQueryToSendToGemini === null) {
172
+ onDebugMessage('Query processing resulted in null, not sending to Gemini.');
173
+ return { queryToSend: null, shouldProceed: false };
174
+ }
175
+ return { queryToSend: localQueryToSendToGemini, shouldProceed: true };
176
+ }, [
177
+ config,
178
+ addItem,
179
+ onDebugMessage,
180
+ handleShellCommand,
181
+ handleSlashCommand,
182
+ logger,
183
+ shellModeActive,
184
+ scheduleToolCalls,
185
+ ]);
186
+ // --- Stream Event Handlers ---
187
+ const handleContentEvent = useCallback((eventValue, currentGeminiMessageBuffer, userMessageTimestamp) => {
188
+ if (turnCancelledRef.current) {
189
+ // Prevents additional output after a user initiated cancel.
190
+ return '';
191
+ }
192
+ let newGeminiMessageBuffer = currentGeminiMessageBuffer + eventValue;
193
+ if (pendingHistoryItemRef.current?.type !== 'gemini' &&
194
+ pendingHistoryItemRef.current?.type !== 'gemini_content') {
195
+ if (pendingHistoryItemRef.current) {
196
+ addItem(pendingHistoryItemRef.current, userMessageTimestamp);
197
+ }
198
+ setPendingHistoryItem({ type: 'gemini', text: '' });
199
+ newGeminiMessageBuffer = eventValue;
200
+ }
201
+ // Split large messages for better rendering performance. Ideally,
202
+ // we should maximize the amount of output sent to <Static />.
203
+ const splitPoint = findLastSafeSplitPoint(newGeminiMessageBuffer);
204
+ if (splitPoint === newGeminiMessageBuffer.length) {
205
+ // Update the existing message with accumulated content
206
+ setPendingHistoryItem((item) => ({
207
+ type: item?.type,
208
+ text: newGeminiMessageBuffer,
209
+ }));
210
+ }
211
+ else {
212
+ // This indicates that we need to split up this Gemini Message.
213
+ // Splitting a message is primarily a performance consideration. There is a
214
+ // <Static> component at the root of App.tsx which takes care of rendering
215
+ // content statically or dynamically. Everything but the last message is
216
+ // treated as static in order to prevent re-rendering an entire message history
217
+ // multiple times per-second (as streaming occurs). Prior to this change you'd
218
+ // see heavy flickering of the terminal. This ensures that larger messages get
219
+ // broken up so that there are more "statically" rendered.
220
+ const beforeText = newGeminiMessageBuffer.substring(0, splitPoint);
221
+ const afterText = newGeminiMessageBuffer.substring(splitPoint);
222
+ addItem({
223
+ type: pendingHistoryItemRef.current?.type,
224
+ text: beforeText,
225
+ }, userMessageTimestamp);
226
+ setPendingHistoryItem({ type: 'gemini_content', text: afterText });
227
+ newGeminiMessageBuffer = afterText;
228
+ }
229
+ return newGeminiMessageBuffer;
230
+ }, [addItem, pendingHistoryItemRef, setPendingHistoryItem]);
231
+ const handleUserCancelledEvent = useCallback((userMessageTimestamp) => {
232
+ if (turnCancelledRef.current) {
233
+ return;
234
+ }
235
+ if (pendingHistoryItemRef.current) {
236
+ if (pendingHistoryItemRef.current.type === 'tool_group') {
237
+ const updatedTools = pendingHistoryItemRef.current.tools.map((tool) => tool.status === ToolCallStatus.Pending ||
238
+ tool.status === ToolCallStatus.Confirming ||
239
+ tool.status === ToolCallStatus.Executing
240
+ ? { ...tool, status: ToolCallStatus.Canceled }
241
+ : tool);
242
+ const pendingItem = {
243
+ ...pendingHistoryItemRef.current,
244
+ tools: updatedTools,
245
+ };
246
+ addItem(pendingItem, userMessageTimestamp);
247
+ }
248
+ else {
249
+ addItem(pendingHistoryItemRef.current, userMessageTimestamp);
250
+ }
251
+ setPendingHistoryItem(null);
252
+ }
253
+ addItem({ type: MessageType.INFO, text: 'User cancelled the request.' }, userMessageTimestamp);
254
+ setIsResponding(false);
255
+ }, [addItem, pendingHistoryItemRef, setPendingHistoryItem]);
256
+ const handleErrorEvent = useCallback((eventValue, userMessageTimestamp) => {
257
+ if (pendingHistoryItemRef.current) {
258
+ addItem(pendingHistoryItemRef.current, userMessageTimestamp);
259
+ setPendingHistoryItem(null);
260
+ }
261
+ addItem({
262
+ type: MessageType.ERROR,
263
+ text: parseAndFormatApiError(eventValue.error, config.getContentGeneratorConfig().authType),
264
+ }, userMessageTimestamp);
265
+ }, [addItem, pendingHistoryItemRef, setPendingHistoryItem, config]);
266
+ const handleChatCompressionEvent = useCallback((eventValue) => addItem({
267
+ type: 'info',
268
+ text: `IMPORTANT: This conversation approached the input token limit for ${config.getModel()}. ` +
269
+ `A compressed context will be sent for future messages (compressed from: ` +
270
+ `${eventValue?.originalTokenCount ?? 'unknown'} to ` +
271
+ `${eventValue?.newTokenCount ?? 'unknown'} tokens).`,
272
+ }, Date.now()), [addItem, config]);
273
+ const processGeminiStreamEvents = useCallback(async (stream, userMessageTimestamp, signal) => {
274
+ let geminiMessageBuffer = '';
275
+ const toolCallRequests = [];
276
+ for await (const event of stream) {
277
+ switch (event.type) {
278
+ case ServerGeminiEventType.Thought:
279
+ setThought(event.value);
280
+ break;
281
+ case ServerGeminiEventType.Content:
282
+ geminiMessageBuffer = handleContentEvent(event.value, geminiMessageBuffer, userMessageTimestamp);
283
+ break;
284
+ case ServerGeminiEventType.ToolCallRequest:
285
+ toolCallRequests.push(event.value);
286
+ break;
287
+ case ServerGeminiEventType.UserCancelled:
288
+ handleUserCancelledEvent(userMessageTimestamp);
289
+ break;
290
+ case ServerGeminiEventType.Error:
291
+ handleErrorEvent(event.value, userMessageTimestamp);
292
+ break;
293
+ case ServerGeminiEventType.ChatCompressed:
294
+ handleChatCompressionEvent(event.value);
295
+ break;
296
+ case ServerGeminiEventType.UsageMetadata:
297
+ addUsage(event.value);
298
+ break;
299
+ case ServerGeminiEventType.ToolCallConfirmation:
300
+ case ServerGeminiEventType.ToolCallResponse:
301
+ // do nothing
302
+ break;
303
+ default: {
304
+ // enforces exhaustive switch-case
305
+ const unreachable = event;
306
+ return unreachable;
307
+ }
308
+ }
309
+ }
310
+ if (toolCallRequests.length > 0) {
311
+ scheduleToolCalls(toolCallRequests, signal);
312
+ }
313
+ return StreamProcessingStatus.Completed;
314
+ }, [
315
+ handleContentEvent,
316
+ handleUserCancelledEvent,
317
+ handleErrorEvent,
318
+ scheduleToolCalls,
319
+ handleChatCompressionEvent,
320
+ addUsage,
321
+ ]);
322
+ const submitQuery = useCallback(async (query, options) => {
323
+ if ((streamingState === StreamingState.Responding ||
324
+ streamingState === StreamingState.WaitingForConfirmation) &&
325
+ !options?.isContinuation)
326
+ return;
327
+ const userMessageTimestamp = Date.now();
328
+ setShowHelp(false);
329
+ abortControllerRef.current = new AbortController();
330
+ const abortSignal = abortControllerRef.current.signal;
331
+ turnCancelledRef.current = false;
332
+ const { queryToSend, shouldProceed } = await prepareQueryForGemini(query, userMessageTimestamp, abortSignal);
333
+ if (!shouldProceed || queryToSend === null) {
334
+ return;
335
+ }
336
+ if (!options?.isContinuation) {
337
+ startNewTurn();
338
+ }
339
+ setIsResponding(true);
340
+ setInitError(null);
341
+ try {
342
+ const stream = geminiClient.sendMessageStream(queryToSend, abortSignal);
343
+ const processingStatus = await processGeminiStreamEvents(stream, userMessageTimestamp, abortSignal);
344
+ if (processingStatus === StreamProcessingStatus.UserCancelled) {
345
+ return;
346
+ }
347
+ if (pendingHistoryItemRef.current) {
348
+ addItem(pendingHistoryItemRef.current, userMessageTimestamp);
349
+ setPendingHistoryItem(null);
350
+ }
351
+ }
352
+ catch (error) {
353
+ if (error instanceof UnauthorizedError) {
354
+ onAuthError();
355
+ }
356
+ else if (!isNodeError(error) || error.name !== 'AbortError') {
357
+ addItem({
358
+ type: MessageType.ERROR,
359
+ text: parseAndFormatApiError(getErrorMessage(error) || 'Unknown error', config.getContentGeneratorConfig().authType),
360
+ }, userMessageTimestamp);
361
+ }
362
+ }
363
+ finally {
364
+ setIsResponding(false);
365
+ }
366
+ }, [
367
+ streamingState,
368
+ setShowHelp,
369
+ prepareQueryForGemini,
370
+ processGeminiStreamEvents,
371
+ pendingHistoryItemRef,
372
+ addItem,
373
+ setPendingHistoryItem,
374
+ setInitError,
375
+ geminiClient,
376
+ startNewTurn,
377
+ onAuthError,
378
+ config,
379
+ ]);
380
+ /**
381
+ * Automatically submits responses for completed tool calls.
382
+ * This effect runs when `toolCalls` or `isResponding` changes.
383
+ * It ensures that tool responses are sent back to Gemini only when
384
+ * all processing for a given set of tools is finished and Gemini
385
+ * is not already generating a response.
386
+ */
387
+ useEffect(() => {
388
+ const run = async () => {
389
+ if (isResponding) {
390
+ return;
391
+ }
392
+ const completedAndReadyToSubmitTools = toolCalls.filter((tc) => {
393
+ const isTerminalState = tc.status === 'success' ||
394
+ tc.status === 'error' ||
395
+ tc.status === 'cancelled';
396
+ if (isTerminalState) {
397
+ const completedOrCancelledCall = tc;
398
+ return (!completedOrCancelledCall.responseSubmittedToGemini &&
399
+ completedOrCancelledCall.response?.responseParts !== undefined);
400
+ }
401
+ return false;
402
+ });
403
+ // Finalize any client-initiated tools as soon as they are done.
404
+ const clientTools = completedAndReadyToSubmitTools.filter((t) => t.request.isClientInitiated);
405
+ if (clientTools.length > 0) {
406
+ markToolsAsSubmitted(clientTools.map((t) => t.request.callId));
407
+ }
408
+ // Identify new, successful save_memory calls that we haven't processed yet.
409
+ const newSuccessfulMemorySaves = completedAndReadyToSubmitTools.filter((t) => t.request.name === 'save_memory' &&
410
+ t.status === 'success' &&
411
+ !processedMemoryToolsRef.current.has(t.request.callId));
412
+ if (newSuccessfulMemorySaves.length > 0) {
413
+ // Perform the refresh only if there are new ones.
414
+ void performMemoryRefresh();
415
+ // Mark them as processed so we don't do this again on the next render.
416
+ newSuccessfulMemorySaves.forEach((t) => processedMemoryToolsRef.current.add(t.request.callId));
417
+ }
418
+ // Only proceed with submitting to Gemini if ALL tools are complete.
419
+ const allToolsAreComplete = toolCalls.length > 0 &&
420
+ toolCalls.length === completedAndReadyToSubmitTools.length;
421
+ if (!allToolsAreComplete) {
422
+ return;
423
+ }
424
+ const geminiTools = completedAndReadyToSubmitTools.filter((t) => !t.request.isClientInitiated);
425
+ if (geminiTools.length === 0) {
426
+ return;
427
+ }
428
+ // If all the tools were cancelled, don't submit a response to Gemini.
429
+ const allToolsCancelled = geminiTools.every((tc) => tc.status === 'cancelled');
430
+ if (allToolsCancelled) {
431
+ if (geminiClient) {
432
+ // We need to manually add the function responses to the history
433
+ // so the model knows the tools were cancelled.
434
+ const responsesToAdd = geminiTools.flatMap((toolCall) => toolCall.response.responseParts);
435
+ for (const response of responsesToAdd) {
436
+ let parts;
437
+ if (Array.isArray(response)) {
438
+ parts = response;
439
+ }
440
+ else if (typeof response === 'string') {
441
+ parts = [{ text: response }];
442
+ }
443
+ else {
444
+ parts = [response];
445
+ }
446
+ geminiClient.addHistory({
447
+ role: 'user',
448
+ parts,
449
+ });
450
+ }
451
+ }
452
+ const callIdsToMarkAsSubmitted = geminiTools.map((toolCall) => toolCall.request.callId);
453
+ markToolsAsSubmitted(callIdsToMarkAsSubmitted);
454
+ return;
455
+ }
456
+ const responsesToSend = geminiTools.map((toolCall) => toolCall.response.responseParts);
457
+ const callIdsToMarkAsSubmitted = geminiTools.map((toolCall) => toolCall.request.callId);
458
+ markToolsAsSubmitted(callIdsToMarkAsSubmitted);
459
+ submitQuery(mergePartListUnions(responsesToSend), {
460
+ isContinuation: true,
461
+ });
462
+ };
463
+ void run();
464
+ }, [
465
+ toolCalls,
466
+ isResponding,
467
+ submitQuery,
468
+ markToolsAsSubmitted,
469
+ addItem,
470
+ geminiClient,
471
+ performMemoryRefresh,
472
+ ]);
473
+ const pendingHistoryItems = [
474
+ pendingHistoryItemRef.current,
475
+ pendingToolCallGroupDisplay,
476
+ ].filter((i) => i !== undefined && i !== null);
477
+ useEffect(() => {
478
+ const saveRestorableToolCalls = async () => {
479
+ if (!config.getCheckpointingEnabled()) {
480
+ return;
481
+ }
482
+ const restorableToolCalls = toolCalls.filter((toolCall) => (toolCall.request.name === 'replace' ||
483
+ toolCall.request.name === 'write_file') &&
484
+ toolCall.status === 'awaiting_approval');
485
+ if (restorableToolCalls.length > 0) {
486
+ const checkpointDir = config.getProjectTempDir()
487
+ ? path.join(config.getProjectTempDir(), 'checkpoints')
488
+ : undefined;
489
+ if (!checkpointDir) {
490
+ return;
491
+ }
492
+ try {
493
+ await fs.mkdir(checkpointDir, { recursive: true });
494
+ }
495
+ catch (error) {
496
+ if (!isNodeError(error) || error.code !== 'EEXIST') {
497
+ onDebugMessage(`Failed to create checkpoint directory: ${getErrorMessage(error)}`);
498
+ return;
499
+ }
500
+ }
501
+ for (const toolCall of restorableToolCalls) {
502
+ const filePath = toolCall.request.args['file_path'];
503
+ if (!filePath) {
504
+ onDebugMessage(`Skipping restorable tool call due to missing file_path: ${toolCall.request.name}`);
505
+ continue;
506
+ }
507
+ try {
508
+ let commitHash = await gitService?.createFileSnapshot(`Snapshot for ${toolCall.request.name}`);
509
+ if (!commitHash) {
510
+ commitHash = await gitService?.getCurrentCommitHash();
511
+ }
512
+ if (!commitHash) {
513
+ onDebugMessage(`Failed to create snapshot for ${filePath}. Skipping restorable tool call.`);
514
+ continue;
515
+ }
516
+ const timestamp = new Date()
517
+ .toISOString()
518
+ .replace(/:/g, '-')
519
+ .replace(/\./g, '_');
520
+ const toolName = toolCall.request.name;
521
+ const fileName = path.basename(filePath);
522
+ const toolCallWithSnapshotFileName = `${timestamp}-${fileName}-${toolName}.json`;
523
+ const clientHistory = await geminiClient?.getHistory();
524
+ const toolCallWithSnapshotFilePath = path.join(checkpointDir, toolCallWithSnapshotFileName);
525
+ await fs.writeFile(toolCallWithSnapshotFilePath, JSON.stringify({
526
+ history,
527
+ clientHistory,
528
+ toolCall: {
529
+ name: toolCall.request.name,
530
+ args: toolCall.request.args,
531
+ },
532
+ commitHash,
533
+ filePath,
534
+ }, null, 2));
535
+ }
536
+ catch (error) {
537
+ onDebugMessage(`Failed to write restorable tool call file: ${getErrorMessage(error)}`);
538
+ }
539
+ }
540
+ }
541
+ };
542
+ saveRestorableToolCalls();
543
+ }, [toolCalls, config, onDebugMessage, gitService, history, geminiClient]);
544
+ return {
545
+ streamingState,
546
+ submitQuery,
547
+ initError,
548
+ pendingHistoryItems,
549
+ thought,
550
+ };
551
+ };
552
+ //# sourceMappingURL=useGeminiStream.js.map