@google/gemini-cli-core 0.3.2 → 0.4.0-preview

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 (221) hide show
  1. package/dist/google-gemini-cli-core-0.3.1.tgz +0 -0
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.js +1 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/code_assist/codeAssist.d.ts +2 -0
  6. package/dist/src/code_assist/codeAssist.js +12 -0
  7. package/dist/src/code_assist/codeAssist.js.map +1 -1
  8. package/dist/src/code_assist/converter.d.ts +2 -1
  9. package/dist/src/code_assist/converter.js +1 -1
  10. package/dist/src/code_assist/converter.js.map +1 -1
  11. package/dist/src/code_assist/oauth2.js +64 -27
  12. package/dist/src/code_assist/oauth2.js.map +1 -1
  13. package/dist/src/code_assist/oauth2.test.js +252 -0
  14. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  15. package/dist/src/config/config.d.ts +12 -7
  16. package/dist/src/config/config.js +47 -27
  17. package/dist/src/config/config.js.map +1 -1
  18. package/dist/src/config/config.test.js +65 -41
  19. package/dist/src/config/config.test.js.map +1 -1
  20. package/dist/src/config/models.d.ts +1 -0
  21. package/dist/src/config/models.js +2 -0
  22. package/dist/src/config/models.js.map +1 -1
  23. package/dist/src/core/client.d.ts +6 -2
  24. package/dist/src/core/client.js +22 -11
  25. package/dist/src/core/client.js.map +1 -1
  26. package/dist/src/core/client.test.js +62 -7
  27. package/dist/src/core/client.test.js.map +1 -1
  28. package/dist/src/core/contentGenerator.d.ts +2 -2
  29. package/dist/src/core/coreToolScheduler.test.js +18 -0
  30. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  31. package/dist/src/core/geminiChat.d.ts +30 -1
  32. package/dist/src/core/geminiChat.js +145 -5
  33. package/dist/src/core/geminiChat.js.map +1 -1
  34. package/dist/src/core/geminiChat.test.js +273 -5
  35. package/dist/src/core/geminiChat.test.js.map +1 -1
  36. package/dist/src/core/loggingContentGenerator.js +9 -9
  37. package/dist/src/core/loggingContentGenerator.js.map +1 -1
  38. package/dist/src/core/nonInteractiveToolExecutor.test.js +2 -0
  39. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  40. package/dist/src/core/subagent.js +5 -6
  41. package/dist/src/core/subagent.js.map +1 -1
  42. package/dist/src/core/subagent.test.js +20 -9
  43. package/dist/src/core/subagent.test.js.map +1 -1
  44. package/dist/src/core/turn.d.ts +18 -4
  45. package/dist/src/core/turn.js +43 -9
  46. package/dist/src/core/turn.js.map +1 -1
  47. package/dist/src/core/turn.test.js +329 -89
  48. package/dist/src/core/turn.test.js.map +1 -1
  49. package/dist/src/generated/git-commit.d.ts +2 -2
  50. package/dist/src/generated/git-commit.js +2 -2
  51. package/dist/src/generated/git-commit.js.map +1 -1
  52. package/dist/src/ide/ide-client.d.ts +7 -2
  53. package/dist/src/ide/ide-client.js +33 -13
  54. package/dist/src/ide/ide-client.js.map +1 -1
  55. package/dist/src/ide/ideContext.d.ts +12 -0
  56. package/dist/src/ide/ideContext.js +1 -0
  57. package/dist/src/ide/ideContext.js.map +1 -1
  58. package/dist/src/ide/process-utils.d.ts +1 -0
  59. package/dist/src/ide/process-utils.js +31 -36
  60. package/dist/src/ide/process-utils.js.map +1 -1
  61. package/dist/src/index.d.ts +2 -0
  62. package/dist/src/index.js +3 -0
  63. package/dist/src/index.js.map +1 -1
  64. package/dist/src/mcp/oauth-provider.d.ts +12 -12
  65. package/dist/src/mcp/oauth-provider.js +32 -31
  66. package/dist/src/mcp/oauth-provider.js.map +1 -1
  67. package/dist/src/mcp/oauth-provider.test.js +74 -35
  68. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  69. package/dist/src/mcp/oauth-token-storage.d.ts +8 -8
  70. package/dist/src/mcp/oauth-token-storage.js +8 -8
  71. package/dist/src/mcp/oauth-token-storage.js.map +1 -1
  72. package/dist/src/mcp/oauth-token-storage.test.js +23 -21
  73. package/dist/src/mcp/oauth-token-storage.test.js.map +1 -1
  74. package/dist/src/mcp/token-storage/base-token-storage.d.ts +1 -1
  75. package/dist/src/mcp/token-storage/base-token-storage.js +1 -1
  76. package/dist/src/mcp/token-storage/base-token-storage.js.map +1 -1
  77. package/dist/src/mcp/token-storage/base-token-storage.test.js +1 -1
  78. package/dist/src/mcp/token-storage/base-token-storage.test.js.map +1 -1
  79. package/dist/src/mcp/token-storage/file-token-storage.d.ts +24 -0
  80. package/dist/src/mcp/token-storage/file-token-storage.js +144 -0
  81. package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -0
  82. package/dist/src/mcp/token-storage/file-token-storage.test.d.ts +6 -0
  83. package/dist/src/mcp/token-storage/file-token-storage.test.js +235 -0
  84. package/dist/src/mcp/token-storage/file-token-storage.test.js.map +1 -0
  85. package/dist/src/mcp/token-storage/hybrid-token-storage.d.ts +23 -0
  86. package/dist/src/mcp/token-storage/hybrid-token-storage.js +78 -0
  87. package/dist/src/mcp/token-storage/hybrid-token-storage.js.map +1 -0
  88. package/dist/src/mcp/token-storage/hybrid-token-storage.test.d.ts +6 -0
  89. package/dist/src/mcp/token-storage/hybrid-token-storage.test.js +193 -0
  90. package/dist/src/mcp/token-storage/hybrid-token-storage.test.js.map +1 -0
  91. package/dist/src/mcp/token-storage/keychain-token-storage.d.ts +31 -0
  92. package/dist/src/mcp/token-storage/keychain-token-storage.js +190 -0
  93. package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -0
  94. package/dist/src/mcp/token-storage/keychain-token-storage.test.d.ts +6 -0
  95. package/dist/src/mcp/token-storage/keychain-token-storage.test.js +254 -0
  96. package/dist/src/mcp/token-storage/keychain-token-storage.test.js.map +1 -0
  97. package/dist/src/mcp/token-storage/types.d.ts +4 -0
  98. package/dist/src/mcp/token-storage/types.js +5 -1
  99. package/dist/src/mcp/token-storage/types.js.map +1 -1
  100. package/dist/src/services/chatRecordingService.d.ts +5 -12
  101. package/dist/src/services/chatRecordingService.js +25 -16
  102. package/dist/src/services/chatRecordingService.js.map +1 -1
  103. package/dist/src/services/chatRecordingService.test.js +54 -17
  104. package/dist/src/services/chatRecordingService.test.js.map +1 -1
  105. package/dist/src/services/shellExecutionService.js +5 -5
  106. package/dist/src/services/shellExecutionService.js.map +1 -1
  107. package/dist/src/services/shellExecutionService.test.js +1 -1
  108. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  109. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +12 -18
  110. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  111. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +27 -0
  112. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  113. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +3 -1
  114. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +4 -0
  115. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  116. package/dist/src/telemetry/constants.d.ts +1 -0
  117. package/dist/src/telemetry/constants.js +1 -0
  118. package/dist/src/telemetry/constants.js.map +1 -1
  119. package/dist/src/telemetry/loggers.js +27 -2
  120. package/dist/src/telemetry/loggers.js.map +1 -1
  121. package/dist/src/telemetry/loggers.test.js +39 -3
  122. package/dist/src/telemetry/loggers.test.js.map +1 -1
  123. package/dist/src/telemetry/metrics.d.ts +1 -2
  124. package/dist/src/telemetry/metrics.js +1 -7
  125. package/dist/src/telemetry/metrics.js.map +1 -1
  126. package/dist/src/telemetry/metrics.test.js +5 -25
  127. package/dist/src/telemetry/metrics.test.js.map +1 -1
  128. package/dist/src/telemetry/types.d.ts +1 -3
  129. package/dist/src/telemetry/types.js +3 -5
  130. package/dist/src/telemetry/types.js.map +1 -1
  131. package/dist/src/telemetry/uiTelemetry.js +4 -4
  132. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  133. package/dist/src/telemetry/uiTelemetry.test.js +4 -4
  134. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  135. package/dist/src/test-utils/index.d.ts +6 -0
  136. package/dist/src/test-utils/index.js +7 -0
  137. package/dist/src/test-utils/index.js.map +1 -0
  138. package/dist/src/test-utils/mock-tool.d.ts +41 -0
  139. package/dist/src/test-utils/mock-tool.js +51 -0
  140. package/dist/src/test-utils/mock-tool.js.map +1 -0
  141. package/dist/src/tools/diffOptions.js +21 -13
  142. package/dist/src/tools/diffOptions.js.map +1 -1
  143. package/dist/src/tools/diffOptions.test.js +58 -22
  144. package/dist/src/tools/diffOptions.test.js.map +1 -1
  145. package/dist/src/tools/edit.d.ts +2 -2
  146. package/dist/src/tools/edit.js +30 -40
  147. package/dist/src/tools/edit.js.map +1 -1
  148. package/dist/src/tools/edit.test.js +50 -9
  149. package/dist/src/tools/edit.test.js.map +1 -1
  150. package/dist/src/tools/mcp-client-manager.d.ts +5 -3
  151. package/dist/src/tools/mcp-client-manager.js +30 -5
  152. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  153. package/dist/src/tools/mcp-client-manager.test.js +20 -1
  154. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  155. package/dist/src/tools/mcp-client.d.ts +5 -5
  156. package/dist/src/tools/mcp-client.js +40 -35
  157. package/dist/src/tools/mcp-client.js.map +1 -1
  158. package/dist/src/tools/mcp-client.test.js +3 -3
  159. package/dist/src/tools/mcp-client.test.js.map +1 -1
  160. package/dist/src/tools/mcp-tool.d.ts +3 -2
  161. package/dist/src/tools/mcp-tool.js +9 -9
  162. package/dist/src/tools/mcp-tool.js.map +1 -1
  163. package/dist/src/tools/mcp-tool.test.js +28 -7
  164. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  165. package/dist/src/tools/memoryTool.js +5 -33
  166. package/dist/src/tools/memoryTool.js.map +1 -1
  167. package/dist/src/tools/read-file.js +1 -1
  168. package/dist/src/tools/read-file.js.map +1 -1
  169. package/dist/src/tools/read-many-files.js +1 -1
  170. package/dist/src/tools/read-many-files.js.map +1 -1
  171. package/dist/src/tools/read-many-files.test.js +4 -4
  172. package/dist/src/tools/read-many-files.test.js.map +1 -1
  173. package/dist/src/tools/shell.js +6 -3
  174. package/dist/src/tools/shell.js.map +1 -1
  175. package/dist/src/tools/shell.test.js +3 -3
  176. package/dist/src/tools/shell.test.js.map +1 -1
  177. package/dist/src/tools/smart-edit.d.ts +73 -0
  178. package/dist/src/tools/smart-edit.js +607 -0
  179. package/dist/src/tools/smart-edit.js.map +1 -0
  180. package/dist/src/tools/smart-edit.test.d.ts +6 -0
  181. package/dist/src/tools/smart-edit.test.js +405 -0
  182. package/dist/src/tools/smart-edit.test.js.map +1 -0
  183. package/dist/src/tools/tool-registry.d.ts +2 -1
  184. package/dist/src/tools/tool-registry.js +5 -5
  185. package/dist/src/tools/tool-registry.js.map +1 -1
  186. package/dist/src/tools/tools.d.ts +6 -2
  187. package/dist/src/tools/tools.js.map +1 -1
  188. package/dist/src/tools/web-fetch.js +4 -3
  189. package/dist/src/tools/web-fetch.js.map +1 -1
  190. package/dist/src/tools/web-search.d.ts +1 -1
  191. package/dist/src/tools/web-search.js +3 -1
  192. package/dist/src/tools/web-search.js.map +1 -1
  193. package/dist/src/tools/write-file.js +11 -15
  194. package/dist/src/tools/write-file.js.map +1 -1
  195. package/dist/src/tools/write-file.test.js +5 -9
  196. package/dist/src/tools/write-file.test.js.map +1 -1
  197. package/dist/src/utils/fileUtils.d.ts +19 -3
  198. package/dist/src/utils/fileUtils.js +144 -32
  199. package/dist/src/utils/fileUtils.js.map +1 -1
  200. package/dist/src/utils/fileUtils.test.js +314 -21
  201. package/dist/src/utils/fileUtils.test.js.map +1 -1
  202. package/dist/src/utils/gitIgnoreParser.d.ts +1 -0
  203. package/dist/src/utils/gitIgnoreParser.js +101 -10
  204. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  205. package/dist/src/utils/gitIgnoreParser.test.js +66 -0
  206. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
  207. package/dist/src/utils/ide-trust.d.ts +10 -0
  208. package/dist/src/utils/ide-trust.js +14 -0
  209. package/dist/src/utils/ide-trust.js.map +1 -0
  210. package/dist/src/utils/llm-edit-fixer.d.ts +25 -0
  211. package/dist/src/utils/llm-edit-fixer.js +112 -0
  212. package/dist/src/utils/llm-edit-fixer.js.map +1 -0
  213. package/dist/src/utils/memoryDiscovery.d.ts +5 -4
  214. package/dist/src/utils/memoryDiscovery.js +10 -9
  215. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  216. package/dist/src/utils/memoryDiscovery.test.js +38 -19
  217. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  218. package/dist/src/utils/nextSpeakerChecker.test.js +33 -0
  219. package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -1
  220. package/dist/tsconfig.tsbuildinfo +1 -1
  221. package/package.json +3 -2
@@ -3,13 +3,25 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
+ import { toParts } from '../code_assist/converter.js';
6
7
  import { createUserContent } from '@google/genai';
7
8
  import { retryWithBackoff } from '../utils/retry.js';
8
9
  import { AuthType } from './contentGenerator.js';
9
10
  import { DEFAULT_GEMINI_FLASH_MODEL } from '../config/models.js';
10
11
  import { hasCycleInSchema } from '../tools/tools.js';
11
12
  import { logContentRetry, logContentRetryFailure, logInvalidChunk, } from '../telemetry/loggers.js';
13
+ import { ChatRecordingService } from '../services/chatRecordingService.js';
12
14
  import { ContentRetryEvent, ContentRetryFailureEvent, InvalidChunkEvent, } from '../telemetry/types.js';
15
+ import { isFunctionResponse } from '../utils/messageInspectors.js';
16
+ import { partListUnionToString } from './geminiRequest.js';
17
+ export var StreamEventType;
18
+ (function (StreamEventType) {
19
+ /** A regular content chunk from the API. */
20
+ StreamEventType["CHUNK"] = "chunk";
21
+ /** A signal that a retry is about to happen. The UI should discard any partial
22
+ * content from the attempt that just failed. */
23
+ StreamEventType["RETRY"] = "retry";
24
+ })(StreamEventType || (StreamEventType = {}));
13
25
  const INVALID_CONTENT_RETRY_OPTIONS = {
14
26
  maxAttempts: 3, // 1 initial call + 2 retries
15
27
  initialDelayMs: 500,
@@ -116,12 +128,15 @@ export class GeminiChat {
116
128
  // A promise to represent the current state of the message being sent to the
117
129
  // model.
118
130
  sendPromise = Promise.resolve();
131
+ chatRecordingService;
119
132
  constructor(config, contentGenerator, generationConfig = {}, history = []) {
120
133
  this.config = config;
121
134
  this.contentGenerator = contentGenerator;
122
135
  this.generationConfig = generationConfig;
123
136
  this.history = history;
124
137
  validateHistory(history);
138
+ this.chatRecordingService = new ChatRecordingService(config);
139
+ this.chatRecordingService.initialize();
125
140
  }
126
141
  /**
127
142
  * Handles falling back to Flash model when persistent 429 errors occur for OAuth users.
@@ -185,6 +200,17 @@ export class GeminiChat {
185
200
  async sendMessage(params, prompt_id) {
186
201
  await this.sendPromise;
187
202
  const userContent = createUserContent(params.message);
203
+ // Record user input - capture complete message with all parts (text, files, images, etc.)
204
+ // but skip recording function responses (tool call results) as they should be stored in tool call records
205
+ if (!isFunctionResponse(userContent)) {
206
+ const userMessage = Array.isArray(params.message)
207
+ ? params.message
208
+ : [params.message];
209
+ this.chatRecordingService.recordMessage({
210
+ type: 'user',
211
+ content: userMessage,
212
+ });
213
+ }
188
214
  const requestContents = this.getHistory(true).concat(userContent);
189
215
  let response;
190
216
  try {
@@ -275,6 +301,18 @@ export class GeminiChat {
275
301
  });
276
302
  this.sendPromise = streamDonePromise;
277
303
  const userContent = createUserContent(params.message);
304
+ // Record user input - capture complete message with all parts (text, files, images, etc.)
305
+ // but skip recording function responses (tool call results) as they should be stored in tool call records
306
+ if (!isFunctionResponse(userContent)) {
307
+ const userMessage = Array.isArray(params.message)
308
+ ? params.message
309
+ : [params.message];
310
+ const userMessageContent = partListUnionToString(toParts(userMessage));
311
+ this.chatRecordingService.recordMessage({
312
+ type: 'user',
313
+ content: userMessageContent,
314
+ });
315
+ }
278
316
  // Add user content to history ONCE before any attempts.
279
317
  this.history.push(userContent);
280
318
  const requestContents = this.getHistory(true);
@@ -285,9 +323,12 @@ export class GeminiChat {
285
323
  let lastError = new Error('Request failed after all retries.');
286
324
  for (let attempt = 0; attempt < INVALID_CONTENT_RETRY_OPTIONS.maxAttempts; attempt++) {
287
325
  try {
326
+ if (attempt > 0) {
327
+ yield { type: StreamEventType.RETRY };
328
+ }
288
329
  const stream = await self.makeApiCallAndProcessStream(requestContents, params, prompt_id, userContent);
289
330
  for await (const chunk of stream) {
290
- yield chunk;
331
+ yield { type: StreamEventType.CHUNK, value: chunk };
291
332
  }
292
333
  lastError = null;
293
334
  break;
@@ -426,24 +467,75 @@ export class GeminiChat {
426
467
  }
427
468
  async *processStreamResponse(streamResponse, userInput) {
428
469
  const modelResponseParts = [];
429
- let isStreamInvalid = false;
430
470
  let hasReceivedAnyChunk = false;
471
+ let hasToolCall = false;
472
+ let lastChunk = null;
473
+ let isStreamInvalid = false;
474
+ let firstInvalidChunkEncountered = false;
475
+ let validChunkAfterInvalidEncountered = false;
431
476
  for await (const chunk of streamResponse) {
432
477
  hasReceivedAnyChunk = true;
478
+ lastChunk = chunk;
433
479
  if (isValidResponse(chunk)) {
480
+ if (firstInvalidChunkEncountered) {
481
+ // A valid chunk appeared *after* an invalid one.
482
+ validChunkAfterInvalidEncountered = true;
483
+ }
434
484
  const content = chunk.candidates?.[0]?.content;
435
485
  if (content?.parts) {
486
+ if (content.parts.some((part) => part.thought)) {
487
+ // Record thoughts
488
+ this.recordThoughtFromContent(content);
489
+ }
490
+ if (content.parts.some((part) => part.functionCall)) {
491
+ hasToolCall = true;
492
+ }
493
+ // Always add parts - thoughts will be filtered out later in recordHistory
436
494
  modelResponseParts.push(...content.parts);
437
495
  }
438
496
  }
439
497
  else {
440
498
  logInvalidChunk(this.config, new InvalidChunkEvent('Invalid chunk received from stream.'));
441
499
  isStreamInvalid = true;
500
+ firstInvalidChunkEncountered = true;
442
501
  }
443
- yield chunk;
502
+ // Record token usage if this chunk has usageMetadata
503
+ if (chunk.usageMetadata) {
504
+ this.chatRecordingService.recordMessageTokens(chunk.usageMetadata);
505
+ }
506
+ yield chunk; // Yield every chunk to the UI immediately.
507
+ }
508
+ if (!hasReceivedAnyChunk) {
509
+ throw new EmptyStreamError('Model stream completed without any chunks.');
444
510
  }
445
- if (isStreamInvalid || !hasReceivedAnyChunk) {
446
- throw new EmptyStreamError('Model stream was invalid or completed without valid content.');
511
+ // --- FIX: The entire validation block was restructured for clarity and correctness ---
512
+ // Only apply complex validation if an invalid chunk was actually found.
513
+ if (isStreamInvalid) {
514
+ // Fail immediately if an invalid chunk was not the absolute last chunk.
515
+ if (validChunkAfterInvalidEncountered) {
516
+ throw new EmptyStreamError('Model stream had invalid intermediate chunks without a tool call.');
517
+ }
518
+ if (!hasToolCall) {
519
+ // If the *only* invalid part was the last chunk, we still check its finish reason.
520
+ const finishReason = lastChunk?.candidates?.[0]?.finishReason;
521
+ const isSuccessfulFinish = finishReason === 'STOP' || finishReason === 'MAX_TOKENS';
522
+ if (!isSuccessfulFinish) {
523
+ throw new EmptyStreamError('Model stream ended with an invalid chunk and a failed finish reason.');
524
+ }
525
+ }
526
+ }
527
+ // Record model response text from the collected parts
528
+ if (modelResponseParts.length > 0) {
529
+ const responseText = modelResponseParts
530
+ .filter((part) => part.text && !part.thought)
531
+ .map((part) => part.text)
532
+ .join('');
533
+ if (responseText.trim()) {
534
+ this.chatRecordingService.recordMessage({
535
+ type: 'gemini',
536
+ content: responseText,
537
+ });
538
+ }
447
539
  }
448
540
  // Bundle all streamed parts into a single Content object
449
541
  const modelOutput = modelResponseParts.length > 0
@@ -536,6 +628,54 @@ export class GeminiChat {
536
628
  this.history.push({ role: 'model', parts: [] });
537
629
  }
538
630
  }
631
+ /**
632
+ * Gets the chat recording service instance.
633
+ */
634
+ getChatRecordingService() {
635
+ return this.chatRecordingService;
636
+ }
637
+ /**
638
+ * Records completed tool calls with full metadata.
639
+ * This is called by external components when tool calls complete, before sending responses to Gemini.
640
+ */
641
+ recordCompletedToolCalls(toolCalls) {
642
+ const toolCallRecords = toolCalls.map((call) => {
643
+ const resultDisplayRaw = call.response?.resultDisplay;
644
+ const resultDisplay = typeof resultDisplayRaw === 'string' ? resultDisplayRaw : undefined;
645
+ return {
646
+ id: call.request.callId,
647
+ name: call.request.name,
648
+ args: call.request.args,
649
+ result: call.response?.responseParts || null,
650
+ status: call.status,
651
+ timestamp: new Date().toISOString(),
652
+ resultDisplay,
653
+ };
654
+ });
655
+ this.chatRecordingService.recordToolCalls(toolCallRecords);
656
+ }
657
+ /**
658
+ * Extracts and records thought from thought content.
659
+ */
660
+ recordThoughtFromContent(content) {
661
+ if (!content.parts || content.parts.length === 0) {
662
+ return;
663
+ }
664
+ const thoughtPart = content.parts[0];
665
+ if (thoughtPart.text) {
666
+ // Extract subject and description using the same logic as turn.ts
667
+ const rawText = thoughtPart.text;
668
+ const subjectStringMatches = rawText.match(/\*\*(.*?)\*\*/s);
669
+ const subject = subjectStringMatches
670
+ ? subjectStringMatches[1].trim()
671
+ : '';
672
+ const description = rawText.replace(/\*\*(.*?)\*\*/s, '').trim();
673
+ this.chatRecordingService.recordThought({
674
+ subject,
675
+ description,
676
+ });
677
+ }
678
+ }
539
679
  }
540
680
  /** Visible for Testing */
541
681
  export function isSchemaDepthError(errorMessage) {
@@ -1 +1 @@
1
- {"version":3,"file":"geminiChat.js","sourceRoot":"","sources":["../../../src/core/geminiChat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"geminiChat.js","sourceRoot":"","sources":["../../../src/core/geminiChat.ts"],"names":[],"mappings":"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"}
@@ -4,8 +4,31 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
- import { GeminiChat, EmptyStreamError } from './geminiChat.js';
7
+ import { GeminiChat, EmptyStreamError, StreamEventType, } from './geminiChat.js';
8
8
  import { setSimulate429 } from '../utils/testUtils.js';
9
+ // Mock fs module to prevent actual file system operations during tests
10
+ const mockFileSystem = new Map();
11
+ vi.mock('node:fs', () => {
12
+ const fsModule = {
13
+ mkdirSync: vi.fn(),
14
+ writeFileSync: vi.fn((path, data) => {
15
+ mockFileSystem.set(path, data);
16
+ }),
17
+ readFileSync: vi.fn((path) => {
18
+ if (mockFileSystem.has(path)) {
19
+ return mockFileSystem.get(path);
20
+ }
21
+ throw Object.assign(new Error('ENOENT: no such file or directory'), {
22
+ code: 'ENOENT',
23
+ });
24
+ }),
25
+ existsSync: vi.fn((path) => mockFileSystem.has(path)),
26
+ };
27
+ return {
28
+ default: fsModule,
29
+ ...fsModule,
30
+ };
31
+ });
9
32
  // Mocks
10
33
  const mockModelsModule = {
11
34
  generateContent: vi.fn(),
@@ -44,6 +67,13 @@ describe('GeminiChat', () => {
44
67
  getQuotaErrorOccurred: vi.fn().mockReturnValue(false),
45
68
  setQuotaErrorOccurred: vi.fn(),
46
69
  flashFallbackHandler: undefined,
70
+ getProjectRoot: vi.fn().mockReturnValue('/test/project/root'),
71
+ storage: {
72
+ getProjectTempDir: vi.fn().mockReturnValue('/test/temp'),
73
+ },
74
+ getToolRegistry: vi.fn().mockReturnValue({
75
+ getTool: vi.fn(),
76
+ }),
47
77
  };
48
78
  // Disable 429 simulation for tests
49
79
  setSimulate429(false);
@@ -55,6 +85,77 @@ describe('GeminiChat', () => {
55
85
  vi.resetAllMocks();
56
86
  });
57
87
  describe('sendMessage', () => {
88
+ it('should retain the initial user message when an automatic function call occurs', async () => {
89
+ // 1. Define the user's initial text message. This is the turn that gets dropped by the buggy logic.
90
+ const userInitialMessage = {
91
+ role: 'user',
92
+ parts: [{ text: 'How is the weather in Boston?' }],
93
+ };
94
+ // 2. Mock the full API response, including the automaticFunctionCallingHistory.
95
+ // This history represents the full turn: user asks, model calls tool, tool responds, model answers.
96
+ const mockAfcResponse = {
97
+ candidates: [
98
+ {
99
+ content: {
100
+ role: 'model',
101
+ parts: [
102
+ { text: 'The weather in Boston is 72 degrees and sunny.' },
103
+ ],
104
+ },
105
+ },
106
+ ],
107
+ automaticFunctionCallingHistory: [
108
+ userInitialMessage, // The user's turn
109
+ {
110
+ // The model's first response: a tool call
111
+ role: 'model',
112
+ parts: [
113
+ {
114
+ functionCall: {
115
+ name: 'get_weather',
116
+ args: { location: 'Boston' },
117
+ },
118
+ },
119
+ ],
120
+ },
121
+ {
122
+ // The tool's response, which has a 'user' role
123
+ role: 'user',
124
+ parts: [
125
+ {
126
+ functionResponse: {
127
+ name: 'get_weather',
128
+ response: { temperature: 72, condition: 'sunny' },
129
+ },
130
+ },
131
+ ],
132
+ },
133
+ ],
134
+ };
135
+ vi.mocked(mockModelsModule.generateContent).mockResolvedValue(mockAfcResponse);
136
+ // 3. Action: Send the initial message.
137
+ await chat.sendMessage({ message: 'How is the weather in Boston?' }, 'prompt-id-afc-bug');
138
+ // 4. Assert: Check the final state of the history.
139
+ const history = chat.getHistory();
140
+ // With the bug, history.length will be 3, because the first user message is dropped.
141
+ // The correct behavior is for the history to contain all 4 turns.
142
+ expect(history.length).toBe(4);
143
+ // Crucially, assert that the very first turn in the history matches the user's initial message.
144
+ // This is the assertion that will fail.
145
+ const firstTurn = history[0];
146
+ expect(firstTurn.role).toBe('user');
147
+ expect(firstTurn?.parts[0].text).toBe('How is the weather in Boston?');
148
+ // Verify the rest of the history is also correct.
149
+ const secondTurn = history[1];
150
+ expect(secondTurn.role).toBe('model');
151
+ expect(secondTurn?.parts[0].functionCall).toBeDefined();
152
+ const thirdTurn = history[2];
153
+ expect(thirdTurn.role).toBe('user');
154
+ expect(thirdTurn?.parts[0].functionResponse).toBeDefined();
155
+ const fourthTurn = history[3];
156
+ expect(fourthTurn.role).toBe('model');
157
+ expect(fourthTurn?.parts[0].text).toContain('72 degrees and sunny');
158
+ });
58
159
  it('should throw an error when attempting to add a user turn after another user turn', async () => {
59
160
  // 1. Setup: Create a history that already ends with a user turn (a functionResponse).
60
161
  const initialHistory = [
@@ -184,6 +285,89 @@ describe('GeminiChat', () => {
184
285
  });
185
286
  });
186
287
  describe('sendMessageStream', () => {
288
+ it('should succeed if a tool call is followed by an empty part', async () => {
289
+ // 1. Mock a stream that contains a tool call, then an invalid (empty) part.
290
+ const streamWithToolCall = (async function* () {
291
+ yield {
292
+ candidates: [
293
+ {
294
+ content: {
295
+ role: 'model',
296
+ parts: [{ functionCall: { name: 'test_tool', args: {} } }],
297
+ },
298
+ },
299
+ ],
300
+ };
301
+ // This second chunk is invalid according to isValidResponse
302
+ yield {
303
+ candidates: [
304
+ {
305
+ content: {
306
+ role: 'model',
307
+ parts: [{ text: '' }],
308
+ },
309
+ },
310
+ ],
311
+ };
312
+ })();
313
+ vi.mocked(mockModelsModule.generateContentStream).mockResolvedValue(streamWithToolCall);
314
+ // 2. Action & Assert: The stream processing should complete without throwing an error
315
+ // because the presence of a tool call makes the empty final chunk acceptable.
316
+ const stream = await chat.sendMessageStream({ message: 'test message' }, 'prompt-id-tool-call-empty-end');
317
+ await expect((async () => {
318
+ for await (const _ of stream) {
319
+ /* consume stream */
320
+ }
321
+ })()).resolves.not.toThrow();
322
+ // 3. Verify history was recorded correctly
323
+ const history = chat.getHistory();
324
+ expect(history.length).toBe(2); // user turn + model turn
325
+ const modelTurn = history[1];
326
+ expect(modelTurn?.parts?.length).toBe(1); // The empty part is discarded
327
+ expect(modelTurn?.parts[0].functionCall).toBeDefined();
328
+ });
329
+ it('should succeed if the stream ends with an empty part but has a valid finishReason', async () => {
330
+ // 1. Mock a stream that ends with an invalid part but has a 'STOP' finish reason.
331
+ const streamWithValidFinish = (async function* () {
332
+ yield {
333
+ candidates: [
334
+ {
335
+ content: {
336
+ role: 'model',
337
+ parts: [{ text: 'Initial content...' }],
338
+ },
339
+ },
340
+ ],
341
+ };
342
+ // This second chunk is invalid, but the finishReason should save it from retrying.
343
+ yield {
344
+ candidates: [
345
+ {
346
+ content: {
347
+ role: 'model',
348
+ parts: [{ text: '' }],
349
+ },
350
+ finishReason: 'STOP',
351
+ },
352
+ ],
353
+ };
354
+ })();
355
+ vi.mocked(mockModelsModule.generateContentStream).mockResolvedValue(streamWithValidFinish);
356
+ // 2. Action & Assert: The stream should complete successfully because the valid
357
+ // finishReason overrides the invalid final chunk.
358
+ const stream = await chat.sendMessageStream({ message: 'test message' }, 'prompt-id-valid-finish-empty-end');
359
+ await expect((async () => {
360
+ for await (const _ of stream) {
361
+ /* consume stream */
362
+ }
363
+ })()).resolves.not.toThrow();
364
+ // 3. Verify history was recorded correctly
365
+ const history = chat.getHistory();
366
+ expect(history.length).toBe(2);
367
+ const modelTurn = history[1];
368
+ expect(modelTurn?.parts?.length).toBe(1); // The empty part is discarded
369
+ expect(modelTurn?.parts[0].text).toBe('Initial content...');
370
+ });
187
371
  it('should not consolidate text into a part that also contains a functionCall', async () => {
188
372
  // 1. Mock the API to stream a malformed part followed by a valid text part.
189
373
  const multiChunkStream = (async function* () {
@@ -591,6 +775,34 @@ describe('GeminiChat', () => {
591
775
  });
592
776
  });
593
777
  describe('sendMessageStream with retries', () => {
778
+ it('should yield a RETRY event when an invalid stream is encountered', async () => {
779
+ // ARRANGE: Mock the stream to fail once, then succeed.
780
+ vi.mocked(mockModelsModule.generateContentStream)
781
+ .mockImplementationOnce(async () =>
782
+ // First attempt: An invalid stream with an empty text part.
783
+ (async function* () {
784
+ yield {
785
+ candidates: [{ content: { parts: [{ text: '' }] } }],
786
+ };
787
+ })())
788
+ .mockImplementationOnce(async () =>
789
+ // Second attempt (the retry): A minimal valid stream.
790
+ (async function* () {
791
+ yield {
792
+ candidates: [{ content: { parts: [{ text: 'Success' }] } }],
793
+ };
794
+ })());
795
+ // ACT: Send a message and collect all events from the stream.
796
+ const stream = await chat.sendMessageStream({ message: 'test' }, 'prompt-id-yield-retry');
797
+ const events = [];
798
+ for await (const event of stream) {
799
+ events.push(event);
800
+ }
801
+ // ASSERT: Check that a RETRY event was present in the stream's output.
802
+ const retryEvent = events.find((e) => e.type === StreamEventType.RETRY);
803
+ expect(retryEvent).toBeDefined();
804
+ expect(retryEvent?.type).toBe(StreamEventType.RETRY);
805
+ });
594
806
  it('should retry on invalid content, succeed, and report metrics', async () => {
595
807
  // Use mockImplementationOnce to provide a fresh, promise-wrapped generator for each attempt.
596
808
  vi.mocked(mockModelsModule.generateContentStream)
@@ -620,8 +832,12 @@ describe('GeminiChat', () => {
620
832
  expect(mockLogContentRetry).toHaveBeenCalledTimes(1);
621
833
  expect(mockLogContentRetryFailure).not.toHaveBeenCalled();
622
834
  expect(mockModelsModule.generateContentStream).toHaveBeenCalledTimes(2);
623
- expect(chunks.some((c) => c.candidates?.[0]?.content?.parts?.[0]?.text ===
624
- 'Successful response')).toBe(true);
835
+ // Check for a retry event
836
+ expect(chunks.some((c) => c.type === StreamEventType.RETRY)).toBe(true);
837
+ // Check for the successful content chunk
838
+ expect(chunks.some((c) => c.type === StreamEventType.CHUNK &&
839
+ c.value.candidates?.[0]?.content?.parts?.[0]?.text ===
840
+ 'Successful response')).toBe(true);
625
841
  // Check that history was recorded correctly once, with no duplicates.
626
842
  const history = chat.getHistory();
627
843
  expect(history.length).toBe(2);
@@ -799,8 +1015,9 @@ describe('GeminiChat', () => {
799
1015
  }
800
1016
  // 3. Assert the results.
801
1017
  expect(mockModelsModule.generateContentStream).toHaveBeenCalledTimes(2);
802
- expect(chunks.some((c) => c.candidates?.[0]?.content?.parts?.[0]?.text ===
803
- 'Successful response after empty')).toBe(true);
1018
+ expect(chunks.some((c) => c.type === StreamEventType.CHUNK &&
1019
+ c.value.candidates?.[0]?.content?.parts?.[0]?.text ===
1020
+ 'Successful response after empty')).toBe(true);
804
1021
  const history = chat.getHistory();
805
1022
  expect(history.length).toBe(2);
806
1023
  // Explicitly verify the structure of each part to satisfy TypeScript
@@ -871,5 +1088,56 @@ describe('GeminiChat', () => {
871
1088
  }
872
1089
  expect(turn4.parts[0].text).toBe('second response');
873
1090
  });
1091
+ it('should discard valid partial content from a failed attempt upon retry', async () => {
1092
+ // ARRANGE: Mock the stream to fail on the first attempt after yielding some valid content.
1093
+ vi.mocked(mockModelsModule.generateContentStream)
1094
+ .mockImplementationOnce(async () =>
1095
+ // First attempt: yields one valid chunk, then one invalid chunk
1096
+ (async function* () {
1097
+ yield {
1098
+ candidates: [
1099
+ {
1100
+ content: {
1101
+ parts: [{ text: 'This valid part should be discarded' }],
1102
+ },
1103
+ },
1104
+ ],
1105
+ };
1106
+ yield {
1107
+ candidates: [{ content: { parts: [{ text: '' }] } }], // Invalid chunk triggers retry
1108
+ };
1109
+ })())
1110
+ .mockImplementationOnce(async () =>
1111
+ // Second attempt (the retry): succeeds
1112
+ (async function* () {
1113
+ yield {
1114
+ candidates: [
1115
+ {
1116
+ content: {
1117
+ parts: [{ text: 'Successful final response' }],
1118
+ },
1119
+ },
1120
+ ],
1121
+ };
1122
+ })());
1123
+ // ACT: Send a message and consume the stream
1124
+ const stream = await chat.sendMessageStream({ message: 'test' }, 'prompt-id-discard-test');
1125
+ const events = [];
1126
+ for await (const event of stream) {
1127
+ events.push(event);
1128
+ }
1129
+ // ASSERT
1130
+ // Check that a retry happened
1131
+ expect(mockModelsModule.generateContentStream).toHaveBeenCalledTimes(2);
1132
+ expect(events.some((e) => e.type === StreamEventType.RETRY)).toBe(true);
1133
+ // Check the final recorded history
1134
+ const history = chat.getHistory();
1135
+ expect(history.length).toBe(2); // user turn + final model turn
1136
+ const modelTurn = history[1];
1137
+ // The model turn should only contain the text from the successful attempt
1138
+ expect(modelTurn.parts[0].text).toBe('Successful final response');
1139
+ // It should NOT contain any text from the failed attempt
1140
+ expect(modelTurn.parts[0].text).not.toContain('This valid part should be discarded');
1141
+ });
874
1142
  });
875
1143
  //# sourceMappingURL=geminiChat.test.js.map