@machina.ai/cell-cli 1.0.13-rc8 → 1.0.17-rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/dist/package.json +7 -4
  2. package/dist/src/config/config.d.ts +5 -2
  3. package/dist/src/config/config.js +57 -39
  4. package/dist/src/config/config.js.map +1 -1
  5. package/dist/src/config/extension.d.ts +1 -0
  6. package/dist/src/config/extension.js +4 -0
  7. package/dist/src/config/extension.js.map +1 -1
  8. package/dist/src/config/settings.d.ts +17 -1
  9. package/dist/src/config/settings.js +88 -23
  10. package/dist/src/config/settings.js.map +1 -1
  11. package/dist/src/gemini.d.ts +3 -0
  12. package/dist/src/gemini.js +53 -32
  13. package/dist/src/gemini.js.map +1 -1
  14. package/dist/src/generated/git-commit.d.ts +1 -1
  15. package/dist/src/generated/git-commit.js +2 -2
  16. package/dist/src/generated/git-commit.js.map +1 -1
  17. package/dist/src/nonInteractiveCli.js +15 -40
  18. package/dist/src/nonInteractiveCli.js.map +1 -1
  19. package/dist/src/patches/is-in-ci.d.ts +7 -0
  20. package/dist/src/patches/is-in-ci.js +15 -0
  21. package/dist/src/patches/is-in-ci.js.map +1 -0
  22. package/dist/src/services/BuiltinCommandLoader.js +9 -0
  23. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  24. package/dist/src/services/CommandService.d.ts +8 -4
  25. package/dist/src/services/CommandService.js +24 -8
  26. package/dist/src/services/CommandService.js.map +1 -1
  27. package/dist/src/services/FileCommandLoader.d.ts +15 -3
  28. package/dist/src/services/FileCommandLoader.js +113 -38
  29. package/dist/src/services/FileCommandLoader.js.map +1 -1
  30. package/dist/src/services/McpPromptLoader.d.ts +25 -0
  31. package/dist/src/services/McpPromptLoader.js +192 -0
  32. package/dist/src/services/McpPromptLoader.js.map +1 -0
  33. package/dist/src/services/prompt-processors/argumentProcessor.d.ts +21 -0
  34. package/dist/src/services/prompt-processors/argumentProcessor.js +28 -0
  35. package/dist/src/services/prompt-processors/argumentProcessor.js.map +1 -0
  36. package/dist/src/services/prompt-processors/shellProcessor.d.ts +32 -0
  37. package/dist/src/services/prompt-processors/shellProcessor.js +77 -0
  38. package/dist/src/services/prompt-processors/shellProcessor.js.map +1 -0
  39. package/dist/src/services/prompt-processors/types.d.ts +38 -0
  40. package/dist/src/services/prompt-processors/types.js +14 -0
  41. package/dist/src/services/prompt-processors/types.js.map +1 -0
  42. package/dist/src/ui/App.js +105 -52
  43. package/dist/src/ui/App.js.map +1 -1
  44. package/dist/src/ui/colors.js +6 -0
  45. package/dist/src/ui/colors.js.map +1 -1
  46. package/dist/src/ui/commands/chatCommand.js +45 -2
  47. package/dist/src/ui/commands/chatCommand.js.map +1 -1
  48. package/dist/src/ui/commands/directoryCommand.d.ts +8 -0
  49. package/dist/src/ui/commands/directoryCommand.js +136 -0
  50. package/dist/src/ui/commands/directoryCommand.js.map +1 -0
  51. package/dist/src/ui/commands/helpCommand.js +7 -6
  52. package/dist/src/ui/commands/helpCommand.js.map +1 -1
  53. package/dist/src/ui/commands/ideCommand.js +113 -111
  54. package/dist/src/ui/commands/ideCommand.js.map +1 -1
  55. package/dist/src/ui/commands/initCommand.d.ts +7 -0
  56. package/dist/src/ui/commands/initCommand.js +76 -0
  57. package/dist/src/ui/commands/initCommand.js.map +1 -0
  58. package/dist/src/ui/commands/mcpCommand.js +240 -26
  59. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  60. package/dist/src/ui/commands/memoryCommand.js +9 -4
  61. package/dist/src/ui/commands/memoryCommand.js.map +1 -1
  62. package/dist/src/ui/commands/setupGithubCommand.d.ts +7 -0
  63. package/dist/src/ui/commands/setupGithubCommand.js +48 -0
  64. package/dist/src/ui/commands/setupGithubCommand.js.map +1 -0
  65. package/dist/src/ui/commands/types.d.ts +30 -3
  66. package/dist/src/ui/commands/types.js +1 -0
  67. package/dist/src/ui/commands/types.js.map +1 -1
  68. package/dist/src/ui/commands/vimCommand.d.ts +7 -0
  69. package/dist/src/ui/commands/vimCommand.js +23 -0
  70. package/dist/src/ui/commands/vimCommand.js.map +1 -0
  71. package/dist/src/ui/components/AsciiArt.d.ts +2 -2
  72. package/dist/src/ui/components/AsciiArt.js +2 -2
  73. package/dist/src/ui/components/ContextSummaryDisplay.d.ts +2 -2
  74. package/dist/src/ui/components/ContextSummaryDisplay.js +12 -12
  75. package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
  76. package/dist/src/ui/components/DebugProfiler.d.ts +6 -0
  77. package/dist/src/ui/components/DebugProfiler.js +26 -0
  78. package/dist/src/ui/components/DebugProfiler.js.map +1 -0
  79. package/dist/src/ui/components/Footer.d.ts +1 -0
  80. package/dist/src/ui/components/Footer.js +4 -3
  81. package/dist/src/ui/components/Footer.js.map +1 -1
  82. package/dist/src/ui/components/Header.js +1 -1
  83. package/dist/src/ui/components/Header.js.map +1 -1
  84. package/dist/src/ui/components/Help.js +2 -2
  85. package/dist/src/ui/components/Help.js.map +1 -1
  86. package/dist/src/ui/components/HistoryItemDisplay.d.ts +2 -0
  87. package/dist/src/ui/components/HistoryItemDisplay.js +2 -1
  88. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  89. package/dist/src/ui/components/IDEContextDetailDisplay.d.ts +12 -0
  90. package/dist/src/ui/components/IDEContextDetailDisplay.js +12 -0
  91. package/dist/src/ui/components/IDEContextDetailDisplay.js.map +1 -0
  92. package/dist/src/ui/components/InputPrompt.d.ts +2 -0
  93. package/dist/src/ui/components/InputPrompt.js +92 -102
  94. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  95. package/dist/src/ui/components/PrepareLabel.d.ts +15 -0
  96. package/dist/src/ui/components/PrepareLabel.js +16 -0
  97. package/dist/src/ui/components/PrepareLabel.js.map +1 -0
  98. package/dist/src/ui/components/ShellConfirmationDialog.d.ts +15 -0
  99. package/dist/src/ui/components/ShellConfirmationDialog.js +44 -0
  100. package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -0
  101. package/dist/src/ui/components/SuggestionsDisplay.d.ts +1 -0
  102. package/dist/src/ui/components/SuggestionsDisplay.js +3 -3
  103. package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
  104. package/dist/src/ui/components/ThemeDialog.js +10 -5
  105. package/dist/src/ui/components/ThemeDialog.js.map +1 -1
  106. package/dist/src/ui/components/Tips.js +1 -1
  107. package/dist/src/ui/components/Tips.js.map +1 -1
  108. package/dist/src/ui/components/messages/DiffRenderer.js +12 -11
  109. package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
  110. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +19 -7
  111. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  112. package/dist/src/ui/components/messages/UserMessage.js +4 -1
  113. package/dist/src/ui/components/messages/UserMessage.js.map +1 -1
  114. package/dist/src/ui/components/shared/text-buffer.d.ts +273 -3
  115. package/dist/src/ui/components/shared/text-buffer.js +420 -79
  116. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  117. package/dist/src/ui/components/shared/vim-buffer-actions.d.ts +72 -0
  118. package/dist/src/ui/components/shared/vim-buffer-actions.js +565 -0
  119. package/dist/src/ui/components/shared/vim-buffer-actions.js.map +1 -0
  120. package/dist/src/ui/contexts/VimModeContext.d.ts +19 -0
  121. package/dist/src/ui/contexts/VimModeContext.js +48 -0
  122. package/dist/src/ui/contexts/VimModeContext.js.map +1 -0
  123. package/dist/src/ui/editors/editorSettingsManager.js +6 -13
  124. package/dist/src/ui/editors/editorSettingsManager.js.map +1 -1
  125. package/dist/src/ui/hooks/atCommandProcessor.js +67 -50
  126. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  127. package/dist/src/ui/hooks/shellCommandProcessor.d.ts +1 -0
  128. package/dist/src/ui/hooks/shellCommandProcessor.js +139 -196
  129. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
  130. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +7 -3
  131. package/dist/src/ui/hooks/slashCommandProcessor.js +203 -120
  132. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  133. package/dist/src/ui/hooks/useCommandCompletion.d.ts +24 -0
  134. package/dist/src/ui/hooks/useCommandCompletion.js +453 -0
  135. package/dist/src/ui/hooks/useCommandCompletion.js.map +1 -0
  136. package/dist/src/ui/hooks/useCompletion.d.ts +5 -3
  137. package/dist/src/ui/hooks/useCompletion.js +7 -312
  138. package/dist/src/ui/hooks/useCompletion.js.map +1 -1
  139. package/dist/src/ui/hooks/useConsoleMessages.js +53 -37
  140. package/dist/src/ui/hooks/useConsoleMessages.js.map +1 -1
  141. package/dist/src/ui/hooks/useGeminiStream.d.ts +1 -1
  142. package/dist/src/ui/hooks/useGeminiStream.js +6 -5
  143. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  144. package/dist/src/ui/hooks/useInputHistory.d.ts +1 -1
  145. package/dist/src/ui/hooks/useKeypress.js +5 -2
  146. package/dist/src/ui/hooks/useKeypress.js.map +1 -1
  147. package/dist/src/ui/hooks/usePhraseCycler.js +1 -0
  148. package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
  149. package/dist/src/ui/hooks/useReactToolScheduler.js +0 -1
  150. package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
  151. package/dist/src/ui/hooks/useReverseSearchCompletion.d.ts +19 -0
  152. package/dist/src/ui/hooks/useReverseSearchCompletion.js +54 -0
  153. package/dist/src/ui/hooks/useReverseSearchCompletion.js.map +1 -0
  154. package/dist/src/ui/hooks/useShellHistory.d.ts +4 -2
  155. package/dist/src/ui/hooks/useShellHistory.js +30 -7
  156. package/dist/src/ui/hooks/useShellHistory.js.map +1 -1
  157. package/dist/src/ui/hooks/vim.d.ts +28 -0
  158. package/dist/src/ui/hooks/vim.js +630 -0
  159. package/dist/src/ui/hooks/vim.js.map +1 -0
  160. package/dist/src/ui/themes/ansi-light.js +2 -0
  161. package/dist/src/ui/themes/ansi-light.js.map +1 -1
  162. package/dist/src/ui/themes/ansi.js +2 -0
  163. package/dist/src/ui/themes/ansi.js.map +1 -1
  164. package/dist/src/ui/themes/atom-one-dark.js +2 -0
  165. package/dist/src/ui/themes/atom-one-dark.js.map +1 -1
  166. package/dist/src/ui/themes/ayu-light.js +3 -1
  167. package/dist/src/ui/themes/ayu-light.js.map +1 -1
  168. package/dist/src/ui/themes/ayu.js +3 -1
  169. package/dist/src/ui/themes/ayu.js.map +1 -1
  170. package/dist/src/ui/themes/dracula.js +2 -0
  171. package/dist/src/ui/themes/dracula.js.map +1 -1
  172. package/dist/src/ui/themes/github-dark.js +2 -0
  173. package/dist/src/ui/themes/github-dark.js.map +1 -1
  174. package/dist/src/ui/themes/github-light.js +2 -0
  175. package/dist/src/ui/themes/github-light.js.map +1 -1
  176. package/dist/src/ui/themes/googlecode.js +2 -0
  177. package/dist/src/ui/themes/googlecode.js.map +1 -1
  178. package/dist/src/ui/themes/no-color.js +2 -0
  179. package/dist/src/ui/themes/no-color.js.map +1 -1
  180. package/dist/src/ui/themes/shades-of-purple.js +2 -0
  181. package/dist/src/ui/themes/shades-of-purple.js.map +1 -1
  182. package/dist/src/ui/themes/theme-manager.js +10 -1
  183. package/dist/src/ui/themes/theme-manager.js.map +1 -1
  184. package/dist/src/ui/themes/theme.d.ts +3 -0
  185. package/dist/src/ui/themes/theme.js +28 -3
  186. package/dist/src/ui/themes/theme.js.map +1 -1
  187. package/dist/src/ui/themes/xcode.js +2 -0
  188. package/dist/src/ui/themes/xcode.js.map +1 -1
  189. package/dist/src/ui/types.d.ts +10 -1
  190. package/dist/src/ui/types.js +1 -0
  191. package/dist/src/ui/types.js.map +1 -1
  192. package/dist/src/ui/utils/CodeColorizer.d.ts +1 -0
  193. package/dist/src/ui/utils/CodeColorizer.js +17 -5
  194. package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
  195. package/dist/src/ui/utils/textUtils.d.ts +0 -8
  196. package/dist/src/ui/utils/textUtils.js +0 -22
  197. package/dist/src/ui/utils/textUtils.js.map +1 -1
  198. package/dist/src/ui/utils/updateCheck.d.ts +7 -1
  199. package/dist/src/ui/utils/updateCheck.js +46 -8
  200. package/dist/src/ui/utils/updateCheck.js.map +1 -1
  201. package/dist/src/utils/events.d.ts +11 -0
  202. package/dist/src/utils/events.js +13 -0
  203. package/dist/src/utils/events.js.map +1 -0
  204. package/dist/src/utils/gitUtils.d.ts +10 -0
  205. package/dist/src/utils/gitUtils.js +24 -0
  206. package/dist/src/utils/gitUtils.js.map +1 -0
  207. package/dist/src/utils/handleAutoUpdate.d.ts +11 -0
  208. package/dist/src/utils/handleAutoUpdate.js +101 -0
  209. package/dist/src/utils/handleAutoUpdate.js.map +1 -0
  210. package/dist/src/utils/installationInfo.d.ts +23 -0
  211. package/dist/src/utils/installationInfo.js +154 -0
  212. package/dist/src/utils/installationInfo.js.map +1 -0
  213. package/dist/src/utils/resolvePath.d.ts +6 -0
  214. package/dist/src/utils/resolvePath.js +21 -0
  215. package/dist/src/utils/resolvePath.js.map +1 -0
  216. package/dist/src/utils/sandbox-macos-permissive-closed.sb +6 -0
  217. package/dist/src/utils/sandbox-macos-permissive-open.sb +6 -0
  218. package/dist/src/utils/sandbox-macos-permissive-proxied.sb +6 -0
  219. package/dist/src/utils/sandbox-macos-restrictive-closed.sb +6 -0
  220. package/dist/src/utils/sandbox-macos-restrictive-open.sb +6 -0
  221. package/dist/src/utils/sandbox-macos-restrictive-proxied.sb +6 -0
  222. package/dist/src/utils/sandbox.d.ts +2 -2
  223. package/dist/src/utils/sandbox.js +39 -11
  224. package/dist/src/utils/sandbox.js.map +1 -1
  225. package/dist/src/utils/spawnWrapper.d.ts +7 -0
  226. package/dist/src/utils/spawnWrapper.js +8 -0
  227. package/dist/src/utils/spawnWrapper.js.map +1 -0
  228. package/dist/src/utils/updateEventEmitter.d.ts +11 -0
  229. package/dist/src/utils/updateEventEmitter.js +12 -0
  230. package/dist/src/utils/updateEventEmitter.js.map +1 -0
  231. package/dist/src/validateNonInterActiveAuth.d.ts +7 -0
  232. package/dist/src/validateNonInterActiveAuth.js +37 -0
  233. package/dist/src/validateNonInterActiveAuth.js.map +1 -0
  234. package/dist/tsconfig.tsbuildinfo +1 -1
  235. package/package.json +7 -4
@@ -3,13 +3,9 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { useState, useEffect, useCallback } from 'react';
7
- import * as fs from 'fs/promises';
8
- import * as path from 'path';
9
- import { glob } from 'glob';
10
- import { isNodeError, escapePath, unescapePath, getErrorMessage, DEFAULT_FILE_FILTERING_OPTIONS, } from '@machina.ai/cell-cli-core';
6
+ import { useState, useCallback } from 'react';
11
7
  import { MAX_SUGGESTIONS_TO_SHOW, } from '../components/SuggestionsDisplay.js';
12
- export function useCompletion(query, cwd, isActive, slashCommands, commandContext, config) {
8
+ export function useCompletion() {
13
9
  const [suggestions, setSuggestions] = useState([]);
14
10
  const [activeSuggestionIndex, setActiveSuggestionIndex] = useState(-1);
15
11
  const [visibleStartIndex, setVisibleStartIndex] = useState(0);
@@ -71,311 +67,6 @@ export function useCompletion(query, cwd, isActive, slashCommands, commandContex
71
67
  return newActiveIndex;
72
68
  });
73
69
  }, [suggestions.length]);
74
- useEffect(() => {
75
- if (!isActive) {
76
- resetCompletionState();
77
- return;
78
- }
79
- const trimmedQuery = query.trimStart();
80
- if (trimmedQuery.startsWith('/')) {
81
- // Always reset perfect match at the beginning of processing.
82
- setIsPerfectMatch(false);
83
- const fullPath = trimmedQuery.substring(1);
84
- const hasTrailingSpace = trimmedQuery.endsWith(' ');
85
- // Get all non-empty parts of the command.
86
- const rawParts = fullPath.split(/\s+/).filter((p) => p);
87
- let commandPathParts = rawParts;
88
- let partial = '';
89
- // If there's no trailing space, the last part is potentially a partial segment.
90
- // We tentatively separate it.
91
- if (!hasTrailingSpace && rawParts.length > 0) {
92
- partial = rawParts[rawParts.length - 1];
93
- commandPathParts = rawParts.slice(0, -1);
94
- }
95
- // Traverse the Command Tree using the tentative completed path
96
- let currentLevel = slashCommands;
97
- let leafCommand = null;
98
- for (const part of commandPathParts) {
99
- if (!currentLevel) {
100
- leafCommand = null;
101
- currentLevel = [];
102
- break;
103
- }
104
- const found = currentLevel.find((cmd) => cmd.name === part || cmd.altNames?.includes(part));
105
- if (found) {
106
- leafCommand = found;
107
- currentLevel = found.subCommands;
108
- }
109
- else {
110
- leafCommand = null;
111
- currentLevel = [];
112
- break;
113
- }
114
- }
115
- // Handle the Ambiguous Case
116
- if (!hasTrailingSpace && currentLevel) {
117
- const exactMatchAsParent = currentLevel.find((cmd) => (cmd.name === partial || cmd.altNames?.includes(partial)) &&
118
- cmd.subCommands);
119
- if (exactMatchAsParent) {
120
- // It's a perfect match for a parent command. Override our initial guess.
121
- // Treat it as a completed command path.
122
- leafCommand = exactMatchAsParent;
123
- currentLevel = exactMatchAsParent.subCommands;
124
- partial = ''; // We now want to suggest ALL of its sub-commands.
125
- }
126
- }
127
- // Check for perfect, executable match
128
- if (!hasTrailingSpace) {
129
- if (leafCommand && partial === '' && leafCommand.action) {
130
- // Case: /command<enter> - command has action, no sub-commands were suggested
131
- setIsPerfectMatch(true);
132
- }
133
- else if (currentLevel) {
134
- // Case: /command subcommand<enter>
135
- const perfectMatch = currentLevel.find((cmd) => (cmd.name === partial || cmd.altNames?.includes(partial)) &&
136
- cmd.action);
137
- if (perfectMatch) {
138
- setIsPerfectMatch(true);
139
- }
140
- }
141
- }
142
- const depth = commandPathParts.length;
143
- // Provide Suggestions based on the now-corrected context
144
- // Argument Completion
145
- if (leafCommand?.completion &&
146
- (hasTrailingSpace ||
147
- (rawParts.length > depth && depth > 0 && partial !== ''))) {
148
- const fetchAndSetSuggestions = async () => {
149
- setIsLoadingSuggestions(true);
150
- const argString = rawParts.slice(depth).join(' ');
151
- const results = (await leafCommand.completion(commandContext, argString)) || [];
152
- const finalSuggestions = results.map((s) => ({ label: s, value: s }));
153
- setSuggestions(finalSuggestions);
154
- setShowSuggestions(finalSuggestions.length > 0);
155
- setActiveSuggestionIndex(finalSuggestions.length > 0 ? 0 : -1);
156
- setIsLoadingSuggestions(false);
157
- };
158
- fetchAndSetSuggestions();
159
- return;
160
- }
161
- // Command/Sub-command Completion
162
- const commandsToSearch = currentLevel || [];
163
- if (commandsToSearch.length > 0) {
164
- let potentialSuggestions = commandsToSearch.filter((cmd) => cmd.description &&
165
- (cmd.name.startsWith(partial) ||
166
- cmd.altNames?.some((alt) => alt.startsWith(partial))));
167
- // If a user's input is an exact match and it is a leaf command,
168
- // enter should submit immediately.
169
- if (potentialSuggestions.length > 0 && !hasTrailingSpace) {
170
- const perfectMatch = potentialSuggestions.find((s) => s.name === partial || s.altNames?.includes(partial));
171
- if (perfectMatch && perfectMatch.action) {
172
- potentialSuggestions = [];
173
- }
174
- }
175
- const finalSuggestions = potentialSuggestions.map((cmd) => ({
176
- label: cmd.name,
177
- value: cmd.name,
178
- description: cmd.description,
179
- }));
180
- setSuggestions(finalSuggestions);
181
- setShowSuggestions(finalSuggestions.length > 0);
182
- setActiveSuggestionIndex(finalSuggestions.length > 0 ? 0 : -1);
183
- setIsLoadingSuggestions(false);
184
- return;
185
- }
186
- // If we fall through, no suggestions are available.
187
- resetCompletionState();
188
- return;
189
- }
190
- // Handle At Command Completion
191
- const atIndex = query.lastIndexOf('@');
192
- if (atIndex === -1) {
193
- resetCompletionState();
194
- return;
195
- }
196
- const partialPath = query.substring(atIndex + 1);
197
- const lastSlashIndex = partialPath.lastIndexOf('/');
198
- const baseDirRelative = lastSlashIndex === -1
199
- ? '.'
200
- : partialPath.substring(0, lastSlashIndex + 1);
201
- const prefix = unescapePath(lastSlashIndex === -1
202
- ? partialPath
203
- : partialPath.substring(lastSlashIndex + 1));
204
- const baseDirAbsolute = path.resolve(cwd, baseDirRelative);
205
- let isMounted = true;
206
- const findFilesRecursively = async (startDir, searchPrefix, fileDiscovery, filterOptions, currentRelativePath = '', depth = 0, maxDepth = 10, // Limit recursion depth
207
- maxResults = 50) => {
208
- if (depth > maxDepth) {
209
- return [];
210
- }
211
- const lowerSearchPrefix = searchPrefix.toLowerCase();
212
- let foundSuggestions = [];
213
- try {
214
- const entries = await fs.readdir(startDir, { withFileTypes: true });
215
- for (const entry of entries) {
216
- if (foundSuggestions.length >= maxResults)
217
- break;
218
- const entryPathRelative = path.join(currentRelativePath, entry.name);
219
- const entryPathFromRoot = path.relative(cwd, path.join(startDir, entry.name));
220
- // Conditionally ignore dotfiles
221
- if (!searchPrefix.startsWith('.') && entry.name.startsWith('.')) {
222
- continue;
223
- }
224
- // Check if this entry should be ignored by filtering options
225
- if (fileDiscovery &&
226
- fileDiscovery.shouldIgnoreFile(entryPathFromRoot, filterOptions)) {
227
- continue;
228
- }
229
- if (entry.name.toLowerCase().startsWith(lowerSearchPrefix)) {
230
- foundSuggestions.push({
231
- label: entryPathRelative + (entry.isDirectory() ? '/' : ''),
232
- value: escapePath(entryPathRelative + (entry.isDirectory() ? '/' : '')),
233
- });
234
- }
235
- if (entry.isDirectory() &&
236
- entry.name !== 'node_modules' &&
237
- !entry.name.startsWith('.')) {
238
- if (foundSuggestions.length < maxResults) {
239
- foundSuggestions = foundSuggestions.concat(await findFilesRecursively(path.join(startDir, entry.name), searchPrefix, // Pass original searchPrefix for recursive calls
240
- fileDiscovery, filterOptions, entryPathRelative, depth + 1, maxDepth, maxResults - foundSuggestions.length));
241
- }
242
- }
243
- }
244
- }
245
- catch (_err) {
246
- // Ignore errors like permission denied or ENOENT during recursive search
247
- }
248
- return foundSuggestions.slice(0, maxResults);
249
- };
250
- const findFilesWithGlob = async (searchPrefix, fileDiscoveryService, filterOptions, maxResults = 50) => {
251
- const globPattern = `**/${searchPrefix}*`;
252
- const files = await glob(globPattern, {
253
- cwd,
254
- dot: searchPrefix.startsWith('.'),
255
- nocase: true,
256
- });
257
- const suggestions = files
258
- .map((file) => {
259
- const relativePath = path.relative(cwd, file);
260
- return {
261
- label: relativePath,
262
- value: escapePath(relativePath),
263
- };
264
- })
265
- .filter((s) => {
266
- if (fileDiscoveryService) {
267
- return !fileDiscoveryService.shouldIgnoreFile(s.label, filterOptions); // relative path
268
- }
269
- return true;
270
- })
271
- .slice(0, maxResults);
272
- return suggestions;
273
- };
274
- const fetchSuggestions = async () => {
275
- setIsLoadingSuggestions(true);
276
- let fetchedSuggestions = [];
277
- const fileDiscoveryService = config ? config.getFileService() : null;
278
- const enableRecursiveSearch = config?.getEnableRecursiveFileSearch() ?? true;
279
- const filterOptions = config?.getFileFilteringOptions() ?? DEFAULT_FILE_FILTERING_OPTIONS;
280
- try {
281
- // If there's no slash, or it's the root, do a recursive search from cwd
282
- if (partialPath.indexOf('/') === -1 &&
283
- prefix &&
284
- enableRecursiveSearch) {
285
- if (fileDiscoveryService) {
286
- fetchedSuggestions = await findFilesWithGlob(prefix, fileDiscoveryService, filterOptions);
287
- }
288
- else {
289
- fetchedSuggestions = await findFilesRecursively(cwd, prefix, fileDiscoveryService, filterOptions);
290
- }
291
- }
292
- else {
293
- // Original behavior: list files in the specific directory
294
- const lowerPrefix = prefix.toLowerCase();
295
- const entries = await fs.readdir(baseDirAbsolute, {
296
- withFileTypes: true,
297
- });
298
- // Filter entries using git-aware filtering
299
- const filteredEntries = [];
300
- for (const entry of entries) {
301
- // Conditionally ignore dotfiles
302
- if (!prefix.startsWith('.') && entry.name.startsWith('.')) {
303
- continue;
304
- }
305
- if (!entry.name.toLowerCase().startsWith(lowerPrefix))
306
- continue;
307
- const relativePath = path.relative(cwd, path.join(baseDirAbsolute, entry.name));
308
- if (fileDiscoveryService &&
309
- fileDiscoveryService.shouldIgnoreFile(relativePath, filterOptions)) {
310
- continue;
311
- }
312
- filteredEntries.push(entry);
313
- }
314
- fetchedSuggestions = filteredEntries.map((entry) => {
315
- const label = entry.isDirectory() ? entry.name + '/' : entry.name;
316
- return {
317
- label,
318
- value: escapePath(label), // Value for completion should be just the name part
319
- };
320
- });
321
- }
322
- // Sort by depth, then directories first, then alphabetically
323
- fetchedSuggestions.sort((a, b) => {
324
- const depthA = (a.label.match(/\//g) || []).length;
325
- const depthB = (b.label.match(/\//g) || []).length;
326
- if (depthA !== depthB) {
327
- return depthA - depthB;
328
- }
329
- const aIsDir = a.label.endsWith('/');
330
- const bIsDir = b.label.endsWith('/');
331
- if (aIsDir && !bIsDir)
332
- return -1;
333
- if (!aIsDir && bIsDir)
334
- return 1;
335
- // exclude extension when comparing
336
- const filenameA = a.label.substring(0, a.label.length - path.extname(a.label).length);
337
- const filenameB = b.label.substring(0, b.label.length - path.extname(b.label).length);
338
- return (filenameA.localeCompare(filenameB) || a.label.localeCompare(b.label));
339
- });
340
- if (isMounted) {
341
- setSuggestions(fetchedSuggestions);
342
- setShowSuggestions(fetchedSuggestions.length > 0);
343
- setActiveSuggestionIndex(fetchedSuggestions.length > 0 ? 0 : -1);
344
- setVisibleStartIndex(0);
345
- }
346
- }
347
- catch (error) {
348
- if (isNodeError(error) && error.code === 'ENOENT') {
349
- if (isMounted) {
350
- setSuggestions([]);
351
- setShowSuggestions(false);
352
- }
353
- }
354
- else {
355
- console.error(`Error fetching completion suggestions for ${partialPath}: ${getErrorMessage(error)}`);
356
- if (isMounted) {
357
- resetCompletionState();
358
- }
359
- }
360
- }
361
- if (isMounted) {
362
- setIsLoadingSuggestions(false);
363
- }
364
- };
365
- const debounceTimeout = setTimeout(fetchSuggestions, 100);
366
- return () => {
367
- isMounted = false;
368
- clearTimeout(debounceTimeout);
369
- };
370
- }, [
371
- query,
372
- cwd,
373
- isActive,
374
- resetCompletionState,
375
- slashCommands,
376
- commandContext,
377
- config,
378
- ]);
379
70
  return {
380
71
  suggestions,
381
72
  activeSuggestionIndex,
@@ -383,8 +74,12 @@ export function useCompletion(query, cwd, isActive, slashCommands, commandContex
383
74
  showSuggestions,
384
75
  isLoadingSuggestions,
385
76
  isPerfectMatch,
386
- setActiveSuggestionIndex,
77
+ setSuggestions,
387
78
  setShowSuggestions,
79
+ setActiveSuggestionIndex,
80
+ setVisibleStartIndex,
81
+ setIsLoadingSuggestions,
82
+ setIsPerfectMatch,
388
83
  resetCompletionState,
389
84
  navigateUp,
390
85
  navigateDown,
@@ -1 +1 @@
1
- {"version":3,"file":"useCompletion.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useCompletion.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useCompletion.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useCompletion.ts"],"names":[],"mappings":"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"}
@@ -3,56 +3,72 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { useCallback, useEffect, useRef, useState } from 'react';
7
- export function useConsoleMessages() {
8
- const [consoleMessages, setConsoleMessages] = useState([]);
9
- const messageQueueRef = useRef([]);
10
- const messageQueueTimeoutRef = useRef(null);
11
- const processMessageQueue = useCallback(() => {
12
- if (messageQueueRef.current.length === 0) {
13
- return;
14
- }
15
- const newMessagesToAdd = messageQueueRef.current;
16
- messageQueueRef.current = [];
17
- setConsoleMessages((prevMessages) => {
18
- const newMessages = [...prevMessages];
19
- newMessagesToAdd.forEach((queuedMessage) => {
20
- if (newMessages.length > 0 &&
21
- newMessages[newMessages.length - 1].type === queuedMessage.type &&
22
- newMessages[newMessages.length - 1].content === queuedMessage.content) {
23
- newMessages[newMessages.length - 1].count =
24
- (newMessages[newMessages.length - 1].count || 1) + 1;
6
+ import { useCallback, useEffect, useReducer, useRef, useTransition, } from 'react';
7
+ function consoleMessagesReducer(state, action) {
8
+ switch (action.type) {
9
+ case 'ADD_MESSAGES': {
10
+ const newMessages = [...state];
11
+ for (const queuedMessage of action.payload) {
12
+ const lastMessage = newMessages[newMessages.length - 1];
13
+ if (lastMessage &&
14
+ lastMessage.type === queuedMessage.type &&
15
+ lastMessage.content === queuedMessage.content) {
16
+ // Create a new object for the last message to ensure React detects
17
+ // the change, preventing mutation of the existing state object.
18
+ newMessages[newMessages.length - 1] = {
19
+ ...lastMessage,
20
+ count: lastMessage.count + 1,
21
+ };
25
22
  }
26
23
  else {
27
24
  newMessages.push({ ...queuedMessage, count: 1 });
28
25
  }
29
- });
26
+ }
30
27
  return newMessages;
31
- });
32
- messageQueueTimeoutRef.current = null; // Allow next scheduling
33
- }, []);
34
- const scheduleQueueProcessing = useCallback(() => {
35
- if (messageQueueTimeoutRef.current === null) {
36
- messageQueueTimeoutRef.current = setTimeout(processMessageQueue, 0);
37
28
  }
38
- }, [processMessageQueue]);
29
+ case 'CLEAR':
30
+ return [];
31
+ default:
32
+ return state;
33
+ }
34
+ }
35
+ export function useConsoleMessages() {
36
+ const [consoleMessages, dispatch] = useReducer(consoleMessagesReducer, []);
37
+ const messageQueueRef = useRef([]);
38
+ const timeoutRef = useRef(null);
39
+ const [, startTransition] = useTransition();
40
+ const processQueue = useCallback(() => {
41
+ if (messageQueueRef.current.length > 0) {
42
+ const messagesToProcess = messageQueueRef.current;
43
+ messageQueueRef.current = [];
44
+ startTransition(() => {
45
+ dispatch({ type: 'ADD_MESSAGES', payload: messagesToProcess });
46
+ });
47
+ }
48
+ timeoutRef.current = null;
49
+ }, []);
39
50
  const handleNewMessage = useCallback((message) => {
40
51
  messageQueueRef.current.push(message);
41
- scheduleQueueProcessing();
42
- }, [scheduleQueueProcessing]);
52
+ if (!timeoutRef.current) {
53
+ // Batch updates using a timeout. 16ms is a reasonable delay to batch
54
+ // rapid-fire messages without noticeable lag.
55
+ timeoutRef.current = setTimeout(processQueue, 16);
56
+ }
57
+ }, [processQueue]);
43
58
  const clearConsoleMessages = useCallback(() => {
44
- setConsoleMessages([]);
45
- if (messageQueueTimeoutRef.current !== null) {
46
- clearTimeout(messageQueueTimeoutRef.current);
47
- messageQueueTimeoutRef.current = null;
59
+ if (timeoutRef.current) {
60
+ clearTimeout(timeoutRef.current);
61
+ timeoutRef.current = null;
48
62
  }
49
63
  messageQueueRef.current = [];
64
+ startTransition(() => {
65
+ dispatch({ type: 'CLEAR' });
66
+ });
50
67
  }, []);
51
- useEffect(() =>
52
68
  // Cleanup on unmount
53
- () => {
54
- if (messageQueueTimeoutRef.current !== null) {
55
- clearTimeout(messageQueueTimeoutRef.current);
69
+ useEffect(() => () => {
70
+ if (timeoutRef.current) {
71
+ clearTimeout(timeoutRef.current);
56
72
  }
57
73
  }, []);
58
74
  return { consoleMessages, handleNewMessage, clearConsoleMessages };
@@ -1 +1 @@
1
- {"version":3,"file":"useConsoleMessages.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useConsoleMessages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useConsoleMessages.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useConsoleMessages.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,7 @@ export declare function mergePartListUnions(list: PartListUnion[]): PartListUnio
12
12
  * Manages the Gemini stream, including user input, command processing,
13
13
  * API interaction, and tool call lifecycle.
14
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<SlashCommandProcessorResult | false>, shellModeActive: boolean, getPreferredEditor: () => EditorType | undefined, onAuthError: () => void, performMemoryRefresh: () => Promise<void>, modelSwitchedFromQuotaError: boolean, setModelSwitchedFromQuotaError: React.Dispatch<React.SetStateAction<boolean>>) => {
15
+ export declare const useGeminiStream: (geminiClient: GeminiClient, history: HistoryItem[], addItem: UseHistoryManagerReturn["addItem"], config: Config, onDebugMessage: (message: string) => void, handleSlashCommand: (cmd: PartListUnion) => Promise<SlashCommandProcessorResult | false>, shellModeActive: boolean, getPreferredEditor: () => EditorType | undefined, onAuthError: () => void, performMemoryRefresh: () => Promise<void>, modelSwitchedFromQuotaError: boolean, setModelSwitchedFromQuotaError: React.Dispatch<React.SetStateAction<boolean>>) => {
16
16
  streamingState: StreamingState;
17
17
  submitQuery: (query: PartListUnion, options?: {
18
18
  isContinuation: boolean;
@@ -41,7 +41,7 @@ var StreamProcessingStatus;
41
41
  * Manages the Gemini stream, including user input, command processing,
42
42
  * API interaction, and tool call lifecycle.
43
43
  */
44
- export const useGeminiStream = (geminiClient, history, addItem, setShowHelp, config, onDebugMessage, handleSlashCommand, shellModeActive, getPreferredEditor, onAuthError, performMemoryRefresh, modelSwitchedFromQuotaError, setModelSwitchedFromQuotaError) => {
44
+ export const useGeminiStream = (geminiClient, history, addItem, config, onDebugMessage, handleSlashCommand, shellModeActive, getPreferredEditor, onAuthError, performMemoryRefresh, modelSwitchedFromQuotaError, setModelSwitchedFromQuotaError) => {
45
45
  const [initError, setInitError] = useState(null);
46
46
  const abortControllerRef = useRef(null);
47
47
  const turnCancelledRef = useRef(false);
@@ -266,7 +266,8 @@ export const useGeminiStream = (geminiClient, history, addItem, setShowHelp, con
266
266
  }
267
267
  addItem({ type: MessageType.INFO, text: 'User cancelled the request.' }, userMessageTimestamp);
268
268
  setIsResponding(false);
269
- }, [addItem, pendingHistoryItemRef, setPendingHistoryItem]);
269
+ setThought(null); // Reset thought when user cancels
270
+ }, [addItem, pendingHistoryItemRef, setPendingHistoryItem, setThought]);
270
271
  const handleErrorEvent = useCallback((eventValue, userMessageTimestamp) => {
271
272
  if (pendingHistoryItemRef.current) {
272
273
  addItem(pendingHistoryItemRef.current, userMessageTimestamp);
@@ -276,7 +277,8 @@ export const useGeminiStream = (geminiClient, history, addItem, setShowHelp, con
276
277
  type: MessageType.ERROR,
277
278
  text: parseAndFormatApiError(eventValue.error, config.getContentGeneratorConfig()?.authType, undefined, config.getModel(), DEFAULT_GEMINI_FLASH_MODEL),
278
279
  }, userMessageTimestamp);
279
- }, [addItem, pendingHistoryItemRef, setPendingHistoryItem, config]);
280
+ setThought(null); // Reset thought when there's an error
281
+ }, [addItem, pendingHistoryItemRef, setPendingHistoryItem, config, setThought]);
280
282
  const handleFinishedEvent = useCallback((event, userMessageTimestamp) => {
281
283
  const finishReason = event.value;
282
284
  const finishReasonMessages = {
@@ -384,7 +386,6 @@ export const useGeminiStream = (geminiClient, history, addItem, setShowHelp, con
384
386
  !options?.isContinuation)
385
387
  return;
386
388
  const userMessageTimestamp = Date.now();
387
- setShowHelp(false);
388
389
  // Reset quota error flag when starting a new query (not a continuation)
389
390
  if (!options?.isContinuation) {
390
391
  setModelSwitchedFromQuotaError(false);
@@ -402,6 +403,7 @@ export const useGeminiStream = (geminiClient, history, addItem, setShowHelp, con
402
403
  }
403
404
  if (!options?.isContinuation) {
404
405
  startNewPrompt();
406
+ setThought(null); // Reset thought when starting a new prompt
405
407
  }
406
408
  setIsResponding(true);
407
409
  setInitError(null);
@@ -436,7 +438,6 @@ export const useGeminiStream = (geminiClient, history, addItem, setShowHelp, con
436
438
  }
437
439
  }, [
438
440
  streamingState,
439
- setShowHelp,
440
441
  setModelSwitchedFromQuotaError,
441
442
  prepareQueryForGemini,
442
443
  processGeminiStreamEvents,