@google/gemini-cli 0.1.12 → 0.1.13-nightly.250727.3e81359c

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 (251) hide show
  1. package/README.md +30 -3
  2. package/dist/google-gemini-cli-0.1.13.tgz +0 -0
  3. package/dist/package.json +6 -4
  4. package/dist/src/acp/acp.d.ts +208 -0
  5. package/dist/src/acp/acp.js +193 -0
  6. package/dist/src/acp/acp.js.map +1 -0
  7. package/dist/src/acp/acpPeer.d.ts +8 -0
  8. package/dist/src/acp/acpPeer.js +537 -0
  9. package/dist/src/acp/acpPeer.js.map +1 -0
  10. package/dist/src/config/config.d.ts +6 -2
  11. package/dist/src/config/config.js +77 -13
  12. package/dist/src/config/config.js.map +1 -1
  13. package/dist/src/config/extension.d.ts +2 -2
  14. package/dist/src/config/extension.js +21 -16
  15. package/dist/src/config/extension.js.map +1 -1
  16. package/dist/src/config/settings.d.ts +15 -2
  17. package/dist/src/config/settings.js +25 -10
  18. package/dist/src/config/settings.js.map +1 -1
  19. package/dist/src/gemini.d.ts +1 -0
  20. package/dist/src/gemini.js +31 -34
  21. package/dist/src/gemini.js.map +1 -1
  22. package/dist/src/generated/git-commit.d.ts +1 -1
  23. package/dist/src/generated/git-commit.js +1 -1
  24. package/dist/src/patches/is-in-ci.d.ts +7 -0
  25. package/dist/src/patches/is-in-ci.js +15 -0
  26. package/dist/src/patches/is-in-ci.js.map +1 -0
  27. package/dist/src/services/BuiltinCommandLoader.d.ts +24 -0
  28. package/dist/src/services/BuiltinCommandLoader.js +72 -0
  29. package/dist/src/services/BuiltinCommandLoader.js.map +1 -0
  30. package/dist/src/services/CommandService.d.ts +43 -5
  31. package/dist/src/services/CommandService.js +61 -19
  32. package/dist/src/services/CommandService.js.map +1 -1
  33. package/dist/src/services/FileCommandLoader.d.ts +37 -0
  34. package/dist/src/services/FileCommandLoader.js +157 -0
  35. package/dist/src/services/FileCommandLoader.js.map +1 -0
  36. package/dist/src/services/McpPromptLoader.d.ts +25 -0
  37. package/dist/src/services/McpPromptLoader.js +192 -0
  38. package/dist/src/services/McpPromptLoader.js.map +1 -0
  39. package/dist/src/services/prompt-processors/argumentProcessor.d.ts +21 -0
  40. package/dist/src/services/prompt-processors/argumentProcessor.js +28 -0
  41. package/dist/src/services/prompt-processors/argumentProcessor.js.map +1 -0
  42. package/dist/src/services/prompt-processors/types.d.ts +34 -0
  43. package/dist/src/services/prompt-processors/types.js +10 -0
  44. package/dist/src/services/prompt-processors/types.js.map +1 -0
  45. package/dist/src/services/types.d.ts +22 -0
  46. package/dist/src/services/types.js +7 -0
  47. package/dist/src/services/types.js.map +1 -0
  48. package/dist/src/ui/App.js +127 -100
  49. package/dist/src/ui/App.js.map +1 -1
  50. package/dist/src/ui/colors.js +6 -0
  51. package/dist/src/ui/colors.js.map +1 -1
  52. package/dist/src/ui/commands/aboutCommand.d.ts +7 -0
  53. package/dist/src/ui/commands/aboutCommand.js +39 -0
  54. package/dist/src/ui/commands/aboutCommand.js.map +1 -0
  55. package/dist/src/ui/commands/authCommand.d.ts +7 -0
  56. package/dist/src/ui/commands/authCommand.js +16 -0
  57. package/dist/src/ui/commands/authCommand.js.map +1 -0
  58. package/dist/src/ui/commands/bugCommand.d.ts +7 -0
  59. package/dist/src/ui/commands/bugCommand.js +63 -0
  60. package/dist/src/ui/commands/bugCommand.js.map +1 -0
  61. package/dist/src/ui/commands/chatCommand.d.ts +7 -0
  62. package/dist/src/ui/commands/chatCommand.js +179 -0
  63. package/dist/src/ui/commands/chatCommand.js.map +1 -0
  64. package/dist/src/ui/commands/clearCommand.js +14 -2
  65. package/dist/src/ui/commands/clearCommand.js.map +1 -1
  66. package/dist/src/ui/commands/compressCommand.d.ts +7 -0
  67. package/dist/src/ui/commands/compressCommand.js +64 -0
  68. package/dist/src/ui/commands/compressCommand.js.map +1 -0
  69. package/dist/src/ui/commands/copyCommand.d.ts +7 -0
  70. package/dist/src/ui/commands/copyCommand.js +59 -0
  71. package/dist/src/ui/commands/copyCommand.js.map +1 -0
  72. package/dist/src/ui/commands/corgiCommand.d.ts +7 -0
  73. package/dist/src/ui/commands/corgiCommand.js +15 -0
  74. package/dist/src/ui/commands/corgiCommand.js.map +1 -0
  75. package/dist/src/ui/commands/docsCommand.d.ts +7 -0
  76. package/dist/src/ui/commands/docsCommand.js +31 -0
  77. package/dist/src/ui/commands/docsCommand.js.map +1 -0
  78. package/dist/src/ui/commands/editorCommand.d.ts +7 -0
  79. package/dist/src/ui/commands/editorCommand.js +16 -0
  80. package/dist/src/ui/commands/editorCommand.js.map +1 -0
  81. package/dist/src/ui/commands/extensionsCommand.d.ts +7 -0
  82. package/dist/src/ui/commands/extensionsCommand.js +31 -0
  83. package/dist/src/ui/commands/extensionsCommand.js.map +1 -0
  84. package/dist/src/ui/commands/helpCommand.js +3 -1
  85. package/dist/src/ui/commands/helpCommand.js.map +1 -1
  86. package/dist/src/ui/commands/ideCommand.d.ts +8 -0
  87. package/dist/src/ui/commands/ideCommand.js +121 -0
  88. package/dist/src/ui/commands/ideCommand.js.map +1 -0
  89. package/dist/src/ui/commands/mcpCommand.d.ts +7 -0
  90. package/dist/src/ui/commands/mcpCommand.js +425 -0
  91. package/dist/src/ui/commands/mcpCommand.js.map +1 -0
  92. package/dist/src/ui/commands/memoryCommand.js +11 -4
  93. package/dist/src/ui/commands/memoryCommand.js.map +1 -1
  94. package/dist/src/ui/commands/privacyCommand.d.ts +7 -0
  95. package/dist/src/ui/commands/privacyCommand.js +16 -0
  96. package/dist/src/ui/commands/privacyCommand.js.map +1 -0
  97. package/dist/src/ui/commands/quitCommand.d.ts +7 -0
  98. package/dist/src/ui/commands/quitCommand.js +34 -0
  99. package/dist/src/ui/commands/quitCommand.js.map +1 -0
  100. package/dist/src/ui/commands/restoreCommand.d.ts +8 -0
  101. package/dist/src/ui/commands/restoreCommand.js +128 -0
  102. package/dist/src/ui/commands/restoreCommand.js.map +1 -0
  103. package/dist/src/ui/commands/statsCommand.d.ts +7 -0
  104. package/dist/src/ui/commands/statsCommand.js +54 -0
  105. package/dist/src/ui/commands/statsCommand.js.map +1 -0
  106. package/dist/src/ui/commands/themeCommand.js +2 -0
  107. package/dist/src/ui/commands/themeCommand.js.map +1 -1
  108. package/dist/src/ui/commands/toolsCommand.d.ts +7 -0
  109. package/dist/src/ui/commands/toolsCommand.js +56 -0
  110. package/dist/src/ui/commands/toolsCommand.js.map +1 -0
  111. package/dist/src/ui/commands/types.d.ts +61 -4
  112. package/dist/src/ui/commands/types.js +6 -1
  113. package/dist/src/ui/commands/types.js.map +1 -1
  114. package/dist/src/ui/commands/vimCommand.d.ts +7 -0
  115. package/dist/src/ui/commands/vimCommand.js +23 -0
  116. package/dist/src/ui/commands/vimCommand.js.map +1 -0
  117. package/dist/src/ui/components/ContextSummaryDisplay.d.ts +6 -1
  118. package/dist/src/ui/components/ContextSummaryDisplay.js +46 -19
  119. package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
  120. package/dist/src/ui/components/Footer.d.ts +1 -0
  121. package/dist/src/ui/components/Footer.js +2 -2
  122. package/dist/src/ui/components/Footer.js.map +1 -1
  123. package/dist/src/ui/components/Header.js +1 -1
  124. package/dist/src/ui/components/Header.js.map +1 -1
  125. package/dist/src/ui/components/Help.d.ts +1 -1
  126. package/dist/src/ui/components/IDEContextDetailDisplay.d.ts +11 -0
  127. package/dist/src/ui/components/IDEContextDetailDisplay.js +19 -0
  128. package/dist/src/ui/components/IDEContextDetailDisplay.js.map +1 -0
  129. package/dist/src/ui/components/InputPrompt.d.ts +3 -1
  130. package/dist/src/ui/components/InputPrompt.js +85 -113
  131. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  132. package/dist/src/ui/components/ThemeDialog.js +51 -25
  133. package/dist/src/ui/components/ThemeDialog.js.map +1 -1
  134. package/dist/src/ui/components/Tips.js +1 -1
  135. package/dist/src/ui/components/Tips.js.map +1 -1
  136. package/dist/src/ui/components/messages/DiffRenderer.d.ts +1 -0
  137. package/dist/src/ui/components/messages/DiffRenderer.js +12 -11
  138. package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
  139. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +5 -4
  140. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  141. package/dist/src/ui/components/messages/ToolGroupMessage.js +3 -1
  142. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  143. package/dist/src/ui/components/shared/MaxSizedBox.js +69 -2
  144. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
  145. package/dist/src/ui/components/shared/RadioButtonSelect.d.ts +3 -1
  146. package/dist/src/ui/components/shared/RadioButtonSelect.js +60 -10
  147. package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
  148. package/dist/src/ui/components/shared/text-buffer.d.ts +273 -3
  149. package/dist/src/ui/components/shared/text-buffer.js +426 -80
  150. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  151. package/dist/src/ui/components/shared/vim-buffer-actions.d.ts +72 -0
  152. package/dist/src/ui/components/shared/vim-buffer-actions.js +565 -0
  153. package/dist/src/ui/components/shared/vim-buffer-actions.js.map +1 -0
  154. package/dist/src/ui/constants.d.ts +1 -0
  155. package/dist/src/ui/constants.js +1 -0
  156. package/dist/src/ui/constants.js.map +1 -1
  157. package/dist/src/ui/contexts/VimModeContext.d.ts +19 -0
  158. package/dist/src/ui/contexts/VimModeContext.js +48 -0
  159. package/dist/src/ui/contexts/VimModeContext.js.map +1 -0
  160. package/dist/src/ui/hooks/atCommandProcessor.js +54 -15
  161. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  162. package/dist/src/ui/hooks/shellCommandProcessor.d.ts +2 -1
  163. package/dist/src/ui/hooks/shellCommandProcessor.js +154 -177
  164. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
  165. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +3 -10
  166. package/dist/src/ui/hooks/slashCommandProcessor.js +121 -879
  167. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  168. package/dist/src/ui/hooks/useAuthCommand.js +2 -1
  169. package/dist/src/ui/hooks/useAuthCommand.js.map +1 -1
  170. package/dist/src/ui/hooks/useCompletion.d.ts +4 -1
  171. package/dist/src/ui/hooks/useCompletion.js +141 -25
  172. package/dist/src/ui/hooks/useCompletion.js.map +1 -1
  173. package/dist/src/ui/hooks/useConsoleMessages.js +53 -37
  174. package/dist/src/ui/hooks/useConsoleMessages.js.map +1 -1
  175. package/dist/src/ui/hooks/useFocus.d.ts +6 -0
  176. package/dist/src/ui/hooks/useFocus.js +41 -0
  177. package/dist/src/ui/hooks/useFocus.js.map +1 -0
  178. package/dist/src/ui/hooks/useGeminiStream.js +74 -11
  179. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  180. package/dist/src/ui/hooks/useInputHistory.d.ts +1 -1
  181. package/dist/src/ui/hooks/useKeypress.js +5 -2
  182. package/dist/src/ui/hooks/useKeypress.js.map +1 -1
  183. package/dist/src/ui/hooks/usePrivacySettings.js +5 -5
  184. package/dist/src/ui/hooks/usePrivacySettings.js.map +1 -1
  185. package/dist/src/ui/hooks/useShellHistory.d.ts +3 -2
  186. package/dist/src/ui/hooks/useShellHistory.js.map +1 -1
  187. package/dist/src/ui/hooks/useThemeCommand.js +24 -23
  188. package/dist/src/ui/hooks/useThemeCommand.js.map +1 -1
  189. package/dist/src/ui/hooks/vim.d.ts +28 -0
  190. package/dist/src/ui/hooks/vim.js +630 -0
  191. package/dist/src/ui/hooks/vim.js.map +1 -0
  192. package/dist/src/ui/themes/ansi-light.js +3 -1
  193. package/dist/src/ui/themes/ansi-light.js.map +1 -1
  194. package/dist/src/ui/themes/ansi.js +2 -0
  195. package/dist/src/ui/themes/ansi.js.map +1 -1
  196. package/dist/src/ui/themes/atom-one-dark.js +2 -0
  197. package/dist/src/ui/themes/atom-one-dark.js.map +1 -1
  198. package/dist/src/ui/themes/ayu-light.js +3 -1
  199. package/dist/src/ui/themes/ayu-light.js.map +1 -1
  200. package/dist/src/ui/themes/ayu.js +3 -1
  201. package/dist/src/ui/themes/ayu.js.map +1 -1
  202. package/dist/src/ui/themes/color-utils.d.ts +21 -0
  203. package/dist/src/ui/themes/color-utils.js +221 -0
  204. package/dist/src/ui/themes/color-utils.js.map +1 -0
  205. package/dist/src/ui/themes/dracula.js +2 -0
  206. package/dist/src/ui/themes/dracula.js.map +1 -1
  207. package/dist/src/ui/themes/github-dark.js +2 -0
  208. package/dist/src/ui/themes/github-dark.js.map +1 -1
  209. package/dist/src/ui/themes/github-light.js +2 -0
  210. package/dist/src/ui/themes/github-light.js.map +1 -1
  211. package/dist/src/ui/themes/googlecode.js +3 -1
  212. package/dist/src/ui/themes/googlecode.js.map +1 -1
  213. package/dist/src/ui/themes/no-color.js +3 -1
  214. package/dist/src/ui/themes/no-color.js.map +1 -1
  215. package/dist/src/ui/themes/shades-of-purple.d.ts +1 -1
  216. package/dist/src/ui/themes/shades-of-purple.js +3 -1
  217. package/dist/src/ui/themes/shades-of-purple.js.map +1 -1
  218. package/dist/src/ui/themes/theme-manager.d.ts +31 -6
  219. package/dist/src/ui/themes/theme-manager.js +113 -34
  220. package/dist/src/ui/themes/theme-manager.js.map +1 -1
  221. package/dist/src/ui/themes/theme.d.ts +23 -3
  222. package/dist/src/ui/themes/theme.js +244 -182
  223. package/dist/src/ui/themes/theme.js.map +1 -1
  224. package/dist/src/ui/themes/xcode.js +3 -1
  225. package/dist/src/ui/themes/xcode.js.map +1 -1
  226. package/dist/src/ui/types.d.ts +9 -1
  227. package/dist/src/ui/utils/CodeColorizer.d.ts +3 -1
  228. package/dist/src/ui/utils/CodeColorizer.js +23 -11
  229. package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
  230. package/dist/src/ui/utils/commandUtils.d.ts +1 -0
  231. package/dist/src/ui/utils/commandUtils.js +47 -0
  232. package/dist/src/ui/utils/commandUtils.js.map +1 -1
  233. package/dist/src/ui/utils/markdownUtilities.js +1 -1
  234. package/dist/src/ui/utils/textUtils.d.ts +0 -8
  235. package/dist/src/ui/utils/textUtils.js +0 -22
  236. package/dist/src/ui/utils/textUtils.js.map +1 -1
  237. package/dist/src/ui/utils/updateCheck.js +4 -0
  238. package/dist/src/ui/utils/updateCheck.js.map +1 -1
  239. package/dist/src/utils/events.d.ts +11 -0
  240. package/dist/src/utils/events.js +13 -0
  241. package/dist/src/utils/events.js.map +1 -0
  242. package/dist/src/utils/sandbox.js +7 -3
  243. package/dist/src/utils/sandbox.js.map +1 -1
  244. package/dist/src/utils/userStartupWarnings.js +22 -1
  245. package/dist/src/utils/userStartupWarnings.js.map +1 -1
  246. package/dist/src/validateNonInterActiveAuth.d.ts +7 -0
  247. package/dist/src/validateNonInterActiveAuth.js +35 -0
  248. package/dist/src/validateNonInterActiveAuth.js.map +1 -0
  249. package/dist/tsconfig.tsbuildinfo +1 -1
  250. package/package.json +7 -5
  251. package/dist/google-gemini-cli-0.1.11.tgz +0 -0
@@ -0,0 +1,48 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * @license
4
+ * Copyright 2025 Google LLC
5
+ * SPDX-License-Identifier: Apache-2.0
6
+ */
7
+ import { createContext, useCallback, useContext, useEffect, useState, } from 'react';
8
+ import { SettingScope } from '../../config/settings.js';
9
+ const VimModeContext = createContext(undefined);
10
+ export const VimModeProvider = ({ children, settings, }) => {
11
+ const initialVimEnabled = settings.merged.vimMode ?? false;
12
+ const [vimEnabled, setVimEnabled] = useState(initialVimEnabled);
13
+ const [vimMode, setVimMode] = useState(initialVimEnabled ? 'NORMAL' : 'INSERT');
14
+ useEffect(() => {
15
+ // Initialize vimEnabled from settings on mount
16
+ const enabled = settings.merged.vimMode ?? false;
17
+ setVimEnabled(enabled);
18
+ // When vim mode is enabled, always start in NORMAL mode
19
+ if (enabled) {
20
+ setVimMode('NORMAL');
21
+ }
22
+ }, [settings.merged.vimMode]);
23
+ const toggleVimEnabled = useCallback(async () => {
24
+ const newValue = !vimEnabled;
25
+ setVimEnabled(newValue);
26
+ // When enabling vim mode, start in NORMAL mode
27
+ if (newValue) {
28
+ setVimMode('NORMAL');
29
+ }
30
+ await settings.setValue(SettingScope.User, 'vimMode', newValue);
31
+ return newValue;
32
+ }, [vimEnabled, settings]);
33
+ const value = {
34
+ vimEnabled,
35
+ vimMode,
36
+ toggleVimEnabled,
37
+ setVimMode,
38
+ };
39
+ return (_jsx(VimModeContext.Provider, { value: value, children: children }));
40
+ };
41
+ export const useVimMode = () => {
42
+ const context = useContext(VimModeContext);
43
+ if (context === undefined) {
44
+ throw new Error('useVimMode must be used within a VimModeProvider');
45
+ }
46
+ return context;
47
+ };
48
+ //# sourceMappingURL=VimModeContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VimModeContext.js","sourceRoot":"","sources":["../../../../src/ui/contexts/VimModeContext.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EACL,aAAa,EACb,WAAW,EACX,UAAU,EACV,SAAS,EACT,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,EAAkB,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAWxE,MAAM,cAAc,GAAG,aAAa,CAAiC,SAAS,CAAC,CAAC;AAEhF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAC9B,QAAQ,EACR,QAAQ,GAIT,EAAE,EAAE;IACH,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC;IAC3D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IAChE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CACpC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CACxC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,+CAA+C;QAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC;QACjD,aAAa,CAAC,OAAO,CAAC,CAAC;QACvB,wDAAwD;QACxD,IAAI,OAAO,EAAE,CAAC;YACZ,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAE9B,MAAM,gBAAgB,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC9C,MAAM,QAAQ,GAAG,CAAC,UAAU,CAAC;QAC7B,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxB,+CAA+C;QAC/C,IAAI,QAAQ,EAAE,CAAC;YACb,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;QACD,MAAM,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAChE,OAAO,QAAQ,CAAC;IAClB,CAAC,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE3B,MAAM,KAAK,GAAG;QACZ,UAAU;QACV,OAAO;QACP,gBAAgB;QAChB,UAAU;KACX,CAAC;IAEF,OAAO,CACL,KAAC,cAAc,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA2B,CAC5E,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE;IAC7B,MAAM,OAAO,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAC3C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC"}
@@ -85,11 +85,15 @@ export async function handleAtCommand({ query, config, addItem, onDebugMessage,
85
85
  addItem({ type: 'user', text: query }, userMessageTimestamp);
86
86
  // Get centralized file discovery service
87
87
  const fileDiscovery = config.getFileService();
88
- const respectGitIgnore = config.getFileFilteringRespectGitIgnore();
88
+ const respectFileIgnore = config.getFileFilteringOptions();
89
89
  const pathSpecsToRead = [];
90
90
  const atPathToResolvedSpecMap = new Map();
91
91
  const contentLabelsForDisplay = [];
92
- const ignoredPaths = [];
92
+ const ignoredByReason = {
93
+ git: [],
94
+ gemini: [],
95
+ both: [],
96
+ };
93
97
  const toolRegistry = await config.getToolRegistry();
94
98
  const readManyFilesTool = toolRegistry.getTool('read_many_files');
95
99
  const globTool = toolRegistry.getTool('glob');
@@ -116,10 +120,25 @@ export async function handleAtCommand({ query, config, addItem, onDebugMessage,
116
120
  return { processedQuery: null, shouldProceed: false };
117
121
  }
118
122
  // Check if path should be ignored based on filtering options
119
- if (fileDiscovery.shouldIgnoreFile(pathName, { respectGitIgnore })) {
120
- const reason = respectGitIgnore ? 'git-ignored' : 'custom-ignored';
121
- onDebugMessage(`Path ${pathName} is ${reason} and will be skipped.`);
122
- ignoredPaths.push(pathName);
123
+ const gitIgnored = respectFileIgnore.respectGitIgnore &&
124
+ fileDiscovery.shouldIgnoreFile(pathName, {
125
+ respectGitIgnore: true,
126
+ respectGeminiIgnore: false,
127
+ });
128
+ const geminiIgnored = respectFileIgnore.respectGeminiIgnore &&
129
+ fileDiscovery.shouldIgnoreFile(pathName, {
130
+ respectGitIgnore: false,
131
+ respectGeminiIgnore: true,
132
+ });
133
+ if (gitIgnored || geminiIgnored) {
134
+ const reason = gitIgnored && geminiIgnored ? 'both' : gitIgnored ? 'git' : 'gemini';
135
+ ignoredByReason[reason].push(pathName);
136
+ const reasonText = reason === 'both'
137
+ ? 'ignored by both git and gemini'
138
+ : reason === 'git'
139
+ ? 'git-ignored'
140
+ : 'gemini-ignored';
141
+ onDebugMessage(`Path ${pathName} is ${reasonText} and will be skipped.`);
123
142
  continue;
124
143
  }
125
144
  let currentPathSpec = pathName;
@@ -128,13 +147,12 @@ export async function handleAtCommand({ query, config, addItem, onDebugMessage,
128
147
  const absolutePath = path.resolve(config.getTargetDir(), pathName);
129
148
  const stats = await fs.stat(absolutePath);
130
149
  if (stats.isDirectory()) {
131
- currentPathSpec = pathName.endsWith('/')
132
- ? `${pathName}**`
133
- : `${pathName}/**`;
150
+ currentPathSpec =
151
+ pathName + (pathName.endsWith(path.sep) ? `**` : `/**`);
134
152
  onDebugMessage(`Path ${pathName} resolved to directory, using glob: ${currentPathSpec}`);
135
153
  }
136
154
  else {
137
- onDebugMessage(`Path ${pathName} resolved to file: ${currentPathSpec}`);
155
+ onDebugMessage(`Path ${pathName} resolved to file: ${absolutePath}`);
138
156
  }
139
157
  resolvedSuccessfully = true;
140
158
  }
@@ -143,7 +161,10 @@ export async function handleAtCommand({ query, config, addItem, onDebugMessage,
143
161
  if (config.getEnableRecursiveFileSearch() && globTool) {
144
162
  onDebugMessage(`Path ${pathName} not found directly, attempting glob search.`);
145
163
  try {
146
- const globResult = await globTool.execute({ pattern: `**/*${pathName}*`, path: config.getTargetDir() }, signal);
164
+ const globResult = await globTool.execute({
165
+ pattern: `**/*${pathName}*`,
166
+ path: config.getTargetDir(),
167
+ }, signal);
147
168
  if (globResult.llmContent &&
148
169
  typeof globResult.llmContent === 'string' &&
149
170
  !globResult.llmContent.startsWith('No files found') &&
@@ -223,9 +244,23 @@ export async function handleAtCommand({ query, config, addItem, onDebugMessage,
223
244
  }
224
245
  initialQueryText = initialQueryText.trim();
225
246
  // Inform user about ignored paths
226
- if (ignoredPaths.length > 0) {
227
- const ignoreType = respectGitIgnore ? 'git-ignored' : 'custom-ignored';
228
- onDebugMessage(`Ignored ${ignoredPaths.length} ${ignoreType} files: ${ignoredPaths.join(', ')}`);
247
+ const totalIgnored = ignoredByReason.git.length +
248
+ ignoredByReason.gemini.length +
249
+ ignoredByReason.both.length;
250
+ if (totalIgnored > 0) {
251
+ const messages = [];
252
+ if (ignoredByReason.git.length) {
253
+ messages.push(`Git-ignored: ${ignoredByReason.git.join(', ')}`);
254
+ }
255
+ if (ignoredByReason.gemini.length) {
256
+ messages.push(`Gemini-ignored: ${ignoredByReason.gemini.join(', ')}`);
257
+ }
258
+ if (ignoredByReason.both.length) {
259
+ messages.push(`Ignored by both: ${ignoredByReason.both.join(', ')}`);
260
+ }
261
+ const message = `Ignored ${totalIgnored} files:\n${messages.join('\n')}`;
262
+ console.log(message);
263
+ onDebugMessage(message);
229
264
  }
230
265
  // Fallback for lone "@" or completely invalid @-commands resulting in empty initialQueryText
231
266
  if (pathSpecsToRead.length === 0) {
@@ -247,7 +282,11 @@ export async function handleAtCommand({ query, config, addItem, onDebugMessage,
247
282
  const processedQueryParts = [{ text: initialQueryText }];
248
283
  const toolArgs = {
249
284
  paths: pathSpecsToRead,
250
- respect_git_ignore: respectGitIgnore, // Use configuration setting
285
+ file_filtering_options: {
286
+ respect_git_ignore: respectFileIgnore.respectGitIgnore,
287
+ respect_gemini_ignore: respectFileIgnore.respectGeminiIgnore,
288
+ },
289
+ // Use configuration setting
251
290
  };
252
291
  let toolCallDisplay;
253
292
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"atCommandProcessor.js","sourceRoot":"","sources":["../../../../src/ui/hooks/atCommandProcessor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"atCommandProcessor.js","sourceRoot":"","sources":["../../../../src/ui/hooks/atCommandProcessor.ts"],"names":[],"mappings":"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"}
@@ -3,10 +3,11 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import type { HistoryItemWithoutId } from '../types.js';
6
+ import { HistoryItemWithoutId } from '../types.js';
7
7
  import { Config, GeminiClient } from '@google/gemini-cli-core';
8
8
  import { type PartListUnion } from '@google/genai';
9
9
  import { UseHistoryManagerReturn } from './useHistoryManager.js';
10
+ export declare const OUTPUT_UPDATE_INTERVAL_MS = 1000;
10
11
  /**
11
12
  * Hook to process shell commands.
12
13
  * Orchestrates command execution and updates history and agent context.
@@ -3,132 +3,17 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { spawn } from 'child_process';
7
- import { StringDecoder } from 'string_decoder';
6
+ import { ToolCallStatus, } from '../types.js';
8
7
  import { useCallback } from 'react';
8
+ import { isBinary, ShellExecutionService, } from '@google/gemini-cli-core';
9
+ import { SHELL_COMMAND_NAME } from '../constants.js';
9
10
  import { formatMemoryUsage } from '../utils/formatters.js';
10
- import { isBinary } from '../utils/textUtils.js';
11
11
  import crypto from 'crypto';
12
12
  import path from 'path';
13
13
  import os from 'os';
14
14
  import fs from 'fs';
15
- import stripAnsi from 'strip-ansi';
16
- const OUTPUT_UPDATE_INTERVAL_MS = 1000;
15
+ export const OUTPUT_UPDATE_INTERVAL_MS = 1000;
17
16
  const MAX_OUTPUT_LENGTH = 10000;
18
- /**
19
- * Executes a shell command using `spawn`, capturing all output and lifecycle events.
20
- * This is the single, unified implementation for shell execution.
21
- *
22
- * @param commandToExecute The exact command string to run.
23
- * @param cwd The working directory to execute the command in.
24
- * @param abortSignal An AbortSignal to terminate the process.
25
- * @param onOutputChunk A callback for streaming real-time output.
26
- * @param onDebugMessage A callback for logging debug information.
27
- * @returns A promise that resolves with the complete execution result.
28
- */
29
- function executeShellCommand(commandToExecute, cwd, abortSignal, onOutputChunk, onDebugMessage) {
30
- return new Promise((resolve) => {
31
- const isWindows = os.platform() === 'win32';
32
- const shell = isWindows ? 'cmd.exe' : 'bash';
33
- const shellArgs = isWindows
34
- ? ['/c', commandToExecute]
35
- : ['-c', commandToExecute];
36
- const child = spawn(shell, shellArgs, {
37
- cwd,
38
- stdio: ['ignore', 'pipe', 'pipe'],
39
- detached: !isWindows, // Use process groups on non-Windows for robust killing
40
- });
41
- // Use decoders to handle multi-byte characters safely (for streaming output).
42
- const stdoutDecoder = new StringDecoder('utf8');
43
- const stderrDecoder = new StringDecoder('utf8');
44
- let stdout = '';
45
- let stderr = '';
46
- const outputChunks = [];
47
- let error = null;
48
- let exited = false;
49
- let streamToUi = true;
50
- const MAX_SNIFF_SIZE = 4096;
51
- let sniffedBytes = 0;
52
- const handleOutput = (data, stream) => {
53
- outputChunks.push(data);
54
- if (streamToUi && sniffedBytes < MAX_SNIFF_SIZE) {
55
- // Use a limited-size buffer for the check to avoid performance issues.
56
- const sniffBuffer = Buffer.concat(outputChunks.slice(0, 20));
57
- sniffedBytes = sniffBuffer.length;
58
- if (isBinary(sniffBuffer)) {
59
- streamToUi = false;
60
- // Overwrite any garbled text that may have streamed with a clear message.
61
- onOutputChunk('[Binary output detected. Halting stream...]');
62
- }
63
- }
64
- const decodedChunk = stream === 'stdout'
65
- ? stdoutDecoder.write(data)
66
- : stderrDecoder.write(data);
67
- if (stream === 'stdout') {
68
- stdout += stripAnsi(decodedChunk);
69
- }
70
- else {
71
- stderr += stripAnsi(decodedChunk);
72
- }
73
- if (!exited && streamToUi) {
74
- // Send only the new chunk to avoid re-rendering the whole output.
75
- const combinedOutput = stdout + (stderr ? `\n${stderr}` : '');
76
- onOutputChunk(combinedOutput);
77
- }
78
- else if (!exited && !streamToUi) {
79
- // Send progress updates for the binary stream
80
- const totalBytes = outputChunks.reduce((sum, chunk) => sum + chunk.length, 0);
81
- onOutputChunk(`[Receiving binary output... ${formatMemoryUsage(totalBytes)} received]`);
82
- }
83
- };
84
- child.stdout.on('data', (data) => handleOutput(data, 'stdout'));
85
- child.stderr.on('data', (data) => handleOutput(data, 'stderr'));
86
- child.on('error', (err) => {
87
- error = err;
88
- });
89
- const abortHandler = async () => {
90
- if (child.pid && !exited) {
91
- onDebugMessage(`Aborting shell command (PID: ${child.pid})`);
92
- if (isWindows) {
93
- spawn('taskkill', ['/pid', child.pid.toString(), '/f', '/t']);
94
- }
95
- else {
96
- try {
97
- // Kill the entire process group (negative PID).
98
- // SIGTERM first, then SIGKILL if it doesn't die.
99
- process.kill(-child.pid, 'SIGTERM');
100
- await new Promise((res) => setTimeout(res, 200));
101
- if (!exited) {
102
- process.kill(-child.pid, 'SIGKILL');
103
- }
104
- }
105
- catch (_e) {
106
- // Fallback to killing just the main process if group kill fails.
107
- if (!exited)
108
- child.kill('SIGKILL');
109
- }
110
- }
111
- }
112
- };
113
- abortSignal.addEventListener('abort', abortHandler, { once: true });
114
- child.on('exit', (code, signal) => {
115
- exited = true;
116
- abortSignal.removeEventListener('abort', abortHandler);
117
- // Handle any final bytes lingering in the decoders
118
- stdout += stdoutDecoder.end();
119
- stderr += stderrDecoder.end();
120
- const finalBuffer = Buffer.concat(outputChunks);
121
- resolve({
122
- rawOutput: finalBuffer,
123
- output: stdout + (stderr ? `\n${stderr}` : ''),
124
- exitCode: code,
125
- signal,
126
- error,
127
- aborted: abortSignal.aborted,
128
- });
129
- });
130
- });
131
- }
132
17
  function addShellCommandToGeminiHistory(geminiClient, rawQuery, resultText) {
133
18
  const modelContent = resultText.length > MAX_OUTPUT_LENGTH
134
19
  ? resultText.substring(0, MAX_OUTPUT_LENGTH) + '\n... (truncated)'
@@ -160,6 +45,7 @@ export const useShellCommandProcessor = (addItemToHistory, setPendingHistoryItem
160
45
  return false;
161
46
  }
162
47
  const userMessageTimestamp = Date.now();
48
+ const callId = `shell-${userMessageTimestamp}`;
163
49
  addItemToHistory({ type: 'user_shell', text: rawQuery }, userMessageTimestamp);
164
50
  const isWindows = os.platform() === 'win32';
165
51
  const targetDir = config.getTargetDir();
@@ -177,77 +63,168 @@ export const useShellCommandProcessor = (addItemToHistory, setPendingHistoryItem
177
63
  commandToExecute = `{ ${command} }; __code=$?; pwd > "${pwdFilePath}"; exit $__code`;
178
64
  }
179
65
  const execPromise = new Promise((resolve) => {
180
- let lastUpdateTime = 0;
66
+ let lastUpdateTime = Date.now();
67
+ let cumulativeStdout = '';
68
+ let cumulativeStderr = '';
69
+ let isBinaryStream = false;
70
+ let binaryBytesReceived = 0;
71
+ const initialToolDisplay = {
72
+ callId,
73
+ name: SHELL_COMMAND_NAME,
74
+ description: rawQuery,
75
+ status: ToolCallStatus.Executing,
76
+ resultDisplay: '',
77
+ confirmationDetails: undefined,
78
+ };
79
+ setPendingHistoryItem({
80
+ type: 'tool_group',
81
+ tools: [initialToolDisplay],
82
+ });
83
+ let executionPid;
84
+ const abortHandler = () => {
85
+ onDebugMessage(`Aborting shell command (PID: ${executionPid ?? 'unknown'})`);
86
+ };
87
+ abortSignal.addEventListener('abort', abortHandler, { once: true });
181
88
  onDebugMessage(`Executing in ${targetDir}: ${commandToExecute}`);
182
- executeShellCommand(commandToExecute, targetDir, abortSignal, (streamedOutput) => {
183
- // Throttle pending UI updates to avoid excessive re-renders.
184
- if (Date.now() - lastUpdateTime > OUTPUT_UPDATE_INTERVAL_MS) {
185
- setPendingHistoryItem({ type: 'info', text: streamedOutput });
186
- lastUpdateTime = Date.now();
187
- }
188
- }, onDebugMessage)
189
- .then((result) => {
190
- // TODO(abhipatel12) - Consider updating pending item and using timeout to ensure
191
- // there is no jump where intermediate output is skipped.
192
- setPendingHistoryItem(null);
193
- let historyItemType = 'info';
194
- let mainContent;
195
- // The context sent to the model utilizes a text tokenizer which means raw binary data is
196
- // cannot be parsed and understood and thus would only pollute the context window and waste
197
- // tokens.
198
- if (isBinary(result.rawOutput)) {
199
- mainContent =
200
- '[Command produced binary output, which is not shown.]';
201
- }
202
- else {
203
- mainContent =
204
- result.output.trim() || '(Command produced no output)';
205
- }
206
- let finalOutput = mainContent;
207
- if (result.error) {
208
- historyItemType = 'error';
209
- finalOutput = `${result.error.message}\n${finalOutput}`;
210
- }
211
- else if (result.aborted) {
212
- finalOutput = `Command was cancelled.\n${finalOutput}`;
213
- }
214
- else if (result.signal) {
215
- historyItemType = 'error';
216
- finalOutput = `Command terminated by signal: ${result.signal}.\n${finalOutput}`;
217
- }
218
- else if (result.exitCode !== 0) {
219
- historyItemType = 'error';
220
- finalOutput = `Command exited with code ${result.exitCode}.\n${finalOutput}`;
221
- }
222
- if (pwdFilePath && fs.existsSync(pwdFilePath)) {
223
- const finalPwd = fs.readFileSync(pwdFilePath, 'utf8').trim();
224
- if (finalPwd && finalPwd !== targetDir) {
225
- const warning = `WARNING: shell mode is stateless; the directory change to '${finalPwd}' will not persist.`;
226
- finalOutput = `${warning}\n\n${finalOutput}`;
89
+ try {
90
+ const { pid, result } = ShellExecutionService.execute(commandToExecute, targetDir, (event) => {
91
+ switch (event.type) {
92
+ case 'data':
93
+ // Do not process text data if we've already switched to binary mode.
94
+ if (isBinaryStream)
95
+ break;
96
+ if (event.stream === 'stdout') {
97
+ cumulativeStdout += event.chunk;
98
+ }
99
+ else {
100
+ cumulativeStderr += event.chunk;
101
+ }
102
+ break;
103
+ case 'binary_detected':
104
+ isBinaryStream = true;
105
+ break;
106
+ case 'binary_progress':
107
+ isBinaryStream = true;
108
+ binaryBytesReceived = event.bytesReceived;
109
+ break;
110
+ default: {
111
+ throw new Error('An unhandled ShellOutputEvent was found.');
112
+ }
227
113
  }
228
- }
229
- // Add the complete, contextual result to the local UI history.
230
- addItemToHistory({ type: historyItemType, text: finalOutput }, userMessageTimestamp);
231
- // Add the same complete, contextual result to the LLM's history.
232
- addShellCommandToGeminiHistory(geminiClient, rawQuery, finalOutput);
233
- })
234
- .catch((err) => {
114
+ // Compute the display string based on the *current* state.
115
+ let currentDisplayOutput;
116
+ if (isBinaryStream) {
117
+ if (binaryBytesReceived > 0) {
118
+ currentDisplayOutput = `[Receiving binary output... ${formatMemoryUsage(binaryBytesReceived)} received]`;
119
+ }
120
+ else {
121
+ currentDisplayOutput =
122
+ '[Binary output detected. Halting stream...]';
123
+ }
124
+ }
125
+ else {
126
+ currentDisplayOutput =
127
+ cumulativeStdout +
128
+ (cumulativeStderr ? `\n${cumulativeStderr}` : '');
129
+ }
130
+ // Throttle pending UI updates to avoid excessive re-renders.
131
+ if (Date.now() - lastUpdateTime > OUTPUT_UPDATE_INTERVAL_MS) {
132
+ setPendingHistoryItem({
133
+ type: 'tool_group',
134
+ tools: [
135
+ {
136
+ ...initialToolDisplay,
137
+ resultDisplay: currentDisplayOutput,
138
+ },
139
+ ],
140
+ });
141
+ lastUpdateTime = Date.now();
142
+ }
143
+ }, abortSignal);
144
+ executionPid = pid;
145
+ result
146
+ .then((result) => {
147
+ setPendingHistoryItem(null);
148
+ let mainContent;
149
+ if (isBinary(result.rawOutput)) {
150
+ mainContent =
151
+ '[Command produced binary output, which is not shown.]';
152
+ }
153
+ else {
154
+ mainContent =
155
+ result.output.trim() || '(Command produced no output)';
156
+ }
157
+ let finalOutput = mainContent;
158
+ let finalStatus = ToolCallStatus.Success;
159
+ if (result.error) {
160
+ finalStatus = ToolCallStatus.Error;
161
+ finalOutput = `${result.error.message}\n${finalOutput}`;
162
+ }
163
+ else if (result.aborted) {
164
+ finalStatus = ToolCallStatus.Canceled;
165
+ finalOutput = `Command was cancelled.\n${finalOutput}`;
166
+ }
167
+ else if (result.signal) {
168
+ finalStatus = ToolCallStatus.Error;
169
+ finalOutput = `Command terminated by signal: ${result.signal}.\n${finalOutput}`;
170
+ }
171
+ else if (result.exitCode !== 0) {
172
+ finalStatus = ToolCallStatus.Error;
173
+ finalOutput = `Command exited with code ${result.exitCode}.\n${finalOutput}`;
174
+ }
175
+ if (pwdFilePath && fs.existsSync(pwdFilePath)) {
176
+ const finalPwd = fs.readFileSync(pwdFilePath, 'utf8').trim();
177
+ if (finalPwd && finalPwd !== targetDir) {
178
+ const warning = `WARNING: shell mode is stateless; the directory change to '${finalPwd}' will not persist.`;
179
+ finalOutput = `${warning}\n\n${finalOutput}`;
180
+ }
181
+ }
182
+ const finalToolDisplay = {
183
+ ...initialToolDisplay,
184
+ status: finalStatus,
185
+ resultDisplay: finalOutput,
186
+ };
187
+ // Add the complete, contextual result to the local UI history.
188
+ addItemToHistory({
189
+ type: 'tool_group',
190
+ tools: [finalToolDisplay],
191
+ }, userMessageTimestamp);
192
+ // Add the same complete, contextual result to the LLM's history.
193
+ addShellCommandToGeminiHistory(geminiClient, rawQuery, finalOutput);
194
+ })
195
+ .catch((err) => {
196
+ setPendingHistoryItem(null);
197
+ const errorMessage = err instanceof Error ? err.message : String(err);
198
+ addItemToHistory({
199
+ type: 'error',
200
+ text: `An unexpected error occurred: ${errorMessage}`,
201
+ }, userMessageTimestamp);
202
+ })
203
+ .finally(() => {
204
+ abortSignal.removeEventListener('abort', abortHandler);
205
+ if (pwdFilePath && fs.existsSync(pwdFilePath)) {
206
+ fs.unlinkSync(pwdFilePath);
207
+ }
208
+ resolve();
209
+ });
210
+ }
211
+ catch (err) {
212
+ // This block handles synchronous errors from `execute`
235
213
  setPendingHistoryItem(null);
236
214
  const errorMessage = err instanceof Error ? err.message : String(err);
237
215
  addItemToHistory({
238
216
  type: 'error',
239
217
  text: `An unexpected error occurred: ${errorMessage}`,
240
218
  }, userMessageTimestamp);
241
- })
242
- .finally(() => {
219
+ // Perform cleanup here as well
243
220
  if (pwdFilePath && fs.existsSync(pwdFilePath)) {
244
221
  fs.unlinkSync(pwdFilePath);
245
222
  }
246
- resolve();
247
- });
223
+ resolve(); // Resolve the promise to unblock `onExec`
224
+ }
248
225
  });
249
226
  onExec(execPromise);
250
- return true; // Command was initiated
227
+ return true;
251
228
  }, [
252
229
  config,
253
230
  onDebugMessage,