@google/gemini-cli-core 0.5.0-nightly.20250908.4693137b → 0.5.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 (133) hide show
  1. package/dist/index.d.ts +3 -2
  2. package/dist/index.js +3 -2
  3. package/dist/index.js.map +1 -1
  4. package/dist/src/config/config.d.ts +12 -3
  5. package/dist/src/config/config.js +46 -7
  6. package/dist/src/config/config.js.map +1 -1
  7. package/dist/src/config/config.test.js +118 -1
  8. package/dist/src/config/config.test.js.map +1 -1
  9. package/dist/src/config/storage.d.ts +1 -0
  10. package/dist/src/config/storage.js +4 -0
  11. package/dist/src/config/storage.js.map +1 -1
  12. package/dist/src/config/storage.test.js +4 -0
  13. package/dist/src/config/storage.test.js.map +1 -1
  14. package/dist/src/core/baseLlmClient.d.ts +45 -0
  15. package/dist/src/core/baseLlmClient.js +88 -0
  16. package/dist/src/core/baseLlmClient.js.map +1 -0
  17. package/dist/src/core/baseLlmClient.test.js +190 -0
  18. package/dist/src/core/baseLlmClient.test.js.map +1 -0
  19. package/dist/src/core/client.d.ts +0 -5
  20. package/dist/src/core/client.js +41 -58
  21. package/dist/src/core/client.js.map +1 -1
  22. package/dist/src/core/client.test.js +32 -39
  23. package/dist/src/core/client.test.js.map +1 -1
  24. package/dist/src/core/coreToolScheduler.js +5 -2
  25. package/dist/src/core/coreToolScheduler.js.map +1 -1
  26. package/dist/src/core/geminiChat.d.ts +0 -5
  27. package/dist/src/core/geminiChat.js +23 -41
  28. package/dist/src/core/geminiChat.js.map +1 -1
  29. package/dist/src/core/geminiChat.test.js +129 -5
  30. package/dist/src/core/geminiChat.test.js.map +1 -1
  31. package/dist/src/fallback/handler.d.ts +7 -0
  32. package/dist/src/fallback/handler.js +51 -0
  33. package/dist/src/fallback/handler.js.map +1 -0
  34. package/dist/src/fallback/handler.test.d.ts +6 -0
  35. package/dist/src/fallback/handler.test.js +130 -0
  36. package/dist/src/fallback/handler.test.js.map +1 -0
  37. package/dist/src/fallback/types.d.ts +14 -0
  38. package/dist/src/fallback/types.js +7 -0
  39. package/dist/src/fallback/types.js.map +1 -0
  40. package/dist/src/generated/git-commit.d.ts +2 -2
  41. package/dist/src/generated/git-commit.js +2 -2
  42. package/dist/src/generated/git-commit.js.map +1 -1
  43. package/dist/src/ide/constants.d.ts +2 -0
  44. package/dist/src/ide/constants.js +2 -0
  45. package/dist/src/ide/constants.js.map +1 -1
  46. package/dist/src/ide/ide-client.d.ts +1 -1
  47. package/dist/src/ide/ide-client.js +61 -2
  48. package/dist/src/ide/ide-client.js.map +1 -1
  49. package/dist/src/ide/ide-client.test.js +147 -1
  50. package/dist/src/ide/ide-client.test.js.map +1 -1
  51. package/dist/src/ide/ideContext.d.ts +1 -264
  52. package/dist/src/ide/ideContext.js +42 -31
  53. package/dist/src/ide/ideContext.js.map +1 -1
  54. package/dist/src/ide/ideContext.test.js +154 -24
  55. package/dist/src/ide/ideContext.test.js.map +1 -1
  56. package/dist/src/ide/process-utils.js +8 -1
  57. package/dist/src/ide/process-utils.js.map +1 -1
  58. package/dist/src/ide/types.d.ts +345 -0
  59. package/dist/src/ide/types.js +65 -0
  60. package/dist/src/ide/types.js.map +1 -0
  61. package/dist/src/index.d.ts +3 -0
  62. package/dist/src/index.js +3 -0
  63. package/dist/src/index.js.map +1 -1
  64. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +6 -2
  65. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +30 -0
  66. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  67. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +15 -0
  68. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  69. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +5 -1
  70. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +11 -0
  71. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  72. package/dist/src/telemetry/constants.d.ts +1 -0
  73. package/dist/src/telemetry/constants.js +1 -0
  74. package/dist/src/telemetry/constants.js.map +1 -1
  75. package/dist/src/telemetry/high-water-mark-tracker.d.ts +43 -0
  76. package/dist/src/telemetry/high-water-mark-tracker.js +88 -0
  77. package/dist/src/telemetry/high-water-mark-tracker.js.map +1 -0
  78. package/dist/src/telemetry/high-water-mark-tracker.test.d.ts +6 -0
  79. package/dist/src/telemetry/high-water-mark-tracker.test.js +152 -0
  80. package/dist/src/telemetry/high-water-mark-tracker.test.js.map +1 -0
  81. package/dist/src/telemetry/index.d.ts +2 -0
  82. package/dist/src/telemetry/index.js +2 -0
  83. package/dist/src/telemetry/index.js.map +1 -1
  84. package/dist/src/telemetry/loggers.d.ts +2 -1
  85. package/dist/src/telemetry/loggers.js +18 -1
  86. package/dist/src/telemetry/loggers.js.map +1 -1
  87. package/dist/src/telemetry/loggers.test.js +38 -3
  88. package/dist/src/telemetry/loggers.test.js.map +1 -1
  89. package/dist/src/telemetry/rate-limiter.d.ts +48 -0
  90. package/dist/src/telemetry/rate-limiter.js +100 -0
  91. package/dist/src/telemetry/rate-limiter.js.map +1 -0
  92. package/dist/src/telemetry/rate-limiter.test.d.ts +6 -0
  93. package/dist/src/telemetry/rate-limiter.test.js +207 -0
  94. package/dist/src/telemetry/rate-limiter.test.js.map +1 -0
  95. package/dist/src/telemetry/types.d.ts +16 -1
  96. package/dist/src/telemetry/types.js +26 -0
  97. package/dist/src/telemetry/types.js.map +1 -1
  98. package/dist/src/tools/mcp-client-manager.js +5 -21
  99. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  100. package/dist/src/tools/ripGrep.d.ts +4 -0
  101. package/dist/src/tools/ripGrep.js +17 -2
  102. package/dist/src/tools/ripGrep.js.map +1 -1
  103. package/dist/src/tools/ripGrep.test.js +57 -5
  104. package/dist/src/tools/ripGrep.test.js.map +1 -1
  105. package/dist/src/tools/smart-edit.js +1 -1
  106. package/dist/src/tools/smart-edit.js.map +1 -1
  107. package/dist/src/tools/smart-edit.test.js +5 -0
  108. package/dist/src/tools/smart-edit.test.js.map +1 -1
  109. package/dist/src/utils/fileUtils.d.ts +1 -0
  110. package/dist/src/utils/fileUtils.js +10 -0
  111. package/dist/src/utils/fileUtils.js.map +1 -1
  112. package/dist/src/utils/fileUtils.test.js +17 -1
  113. package/dist/src/utils/fileUtils.test.js.map +1 -1
  114. package/dist/src/utils/flashFallback.test.d.ts +6 -0
  115. package/dist/src/utils/{flashFallback.integration.test.js → flashFallback.test.js} +31 -27
  116. package/dist/src/utils/flashFallback.test.js.map +1 -0
  117. package/dist/src/utils/gitIgnoreParser.d.ts +1 -0
  118. package/dist/src/utils/gitIgnoreParser.js +33 -24
  119. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  120. package/dist/src/utils/llm-edit-fixer.d.ts +4 -3
  121. package/dist/src/utils/llm-edit-fixer.js +19 -10
  122. package/dist/src/utils/llm-edit-fixer.js.map +1 -1
  123. package/dist/src/utils/llm-edit-fixer.test.d.ts +6 -0
  124. package/dist/src/utils/llm-edit-fixer.test.js +105 -0
  125. package/dist/src/utils/llm-edit-fixer.test.js.map +1 -0
  126. package/dist/src/utils/promptIdContext.d.ts +7 -0
  127. package/dist/src/utils/promptIdContext.js +8 -0
  128. package/dist/src/utils/promptIdContext.js.map +1 -0
  129. package/dist/tsconfig.tsbuildinfo +1 -1
  130. package/package.json +2 -2
  131. package/dist/google-gemini-cli-core-0.3.4.tgz +0 -0
  132. package/dist/src/utils/flashFallback.integration.test.js.map +0 -1
  133. /package/dist/src/{utils/flashFallback.integration.test.d.ts → core/baseLlmClient.test.d.ts} +0 -0
@@ -11,6 +11,7 @@ export class GitIgnoreParser {
11
11
  projectRoot;
12
12
  ig = ignore();
13
13
  patterns = [];
14
+ maxScannedDirs = 200;
14
15
  constructor(projectRoot) {
15
16
  this.projectRoot = path.resolve(projectRoot);
16
17
  }
@@ -22,32 +23,40 @@ export class GitIgnoreParser {
22
23
  this.loadPatterns(path.join('.git', 'info', 'exclude'));
23
24
  this.findAndLoadGitignoreFiles(this.projectRoot);
24
25
  }
25
- findAndLoadGitignoreFiles(dir) {
26
- const relativeDir = path.relative(this.projectRoot, dir);
27
- // For sub-directories, check if they are ignored before proceeding.
28
- // The root directory (relativeDir === '') should not be checked.
29
- if (relativeDir && this.isIgnored(relativeDir)) {
30
- return;
31
- }
32
- // Load patterns from .gitignore in the current directory
33
- const gitignorePath = path.join(dir, '.gitignore');
34
- if (fs.existsSync(gitignorePath)) {
35
- this.loadPatterns(path.relative(this.projectRoot, gitignorePath));
36
- }
37
- // Recurse into subdirectories
38
- try {
39
- const entries = fs.readdirSync(dir, { withFileTypes: true });
40
- for (const entry of entries) {
41
- if (entry.name === '.git') {
42
- continue;
43
- }
44
- if (entry.isDirectory()) {
45
- this.findAndLoadGitignoreFiles(path.join(dir, entry.name));
26
+ findAndLoadGitignoreFiles(startDir) {
27
+ const queue = [startDir];
28
+ let scannedDirs = 0;
29
+ let queueHead = 0;
30
+ while (queueHead < queue.length && scannedDirs < this.maxScannedDirs) {
31
+ const dir = queue[queueHead];
32
+ queueHead++;
33
+ scannedDirs++;
34
+ const relativeDir = path.relative(this.projectRoot, dir);
35
+ // For sub-directories, check if they are ignored before proceeding.
36
+ // The root directory (relativeDir === '') should not be checked.
37
+ if (relativeDir && this.isIgnored(relativeDir)) {
38
+ continue;
39
+ }
40
+ // Load patterns from .gitignore in the current directory
41
+ const gitignorePath = path.join(dir, '.gitignore');
42
+ if (fs.existsSync(gitignorePath)) {
43
+ this.loadPatterns(path.relative(this.projectRoot, gitignorePath));
44
+ }
45
+ // Recurse into subdirectories
46
+ try {
47
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
48
+ for (const entry of entries) {
49
+ if (entry.name === '.git') {
50
+ continue;
51
+ }
52
+ if (entry.isDirectory()) {
53
+ queue.push(path.join(dir, entry.name));
54
+ }
46
55
  }
47
56
  }
48
- }
49
- catch (_error) {
50
- // ignore readdir errors
57
+ catch (_error) {
58
+ // ignore readdir errors
59
+ }
51
60
  }
52
61
  }
53
62
  loadPatterns(patternsFileName) {
@@ -1 +1 @@
1
- {"version":3,"file":"gitIgnoreParser.js","sourceRoot":"","sources":["../../../src/utils/gitIgnoreParser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gitIgnoreParser.js","sourceRoot":"","sources":["../../../src/utils/gitIgnoreParser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,MAAM,EAAE,EAAe,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAOhD,MAAM,OAAO,eAAe;IAClB,WAAW,CAAS;IACpB,EAAE,GAAW,MAAM,EAAE,CAAC;IACtB,QAAQ,GAAa,EAAE,CAAC;IACf,cAAc,GAAG,GAAG,CAAC;IAEtC,YAAY,WAAmB;QAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/C,CAAC;IAED,mBAAmB;QACjB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC;YAAE,OAAO;QAE/C,gEAAgE;QAChE,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAE3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC;IAEO,yBAAyB,CAAC,QAAgB;QAChD,MAAM,KAAK,GAAa,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,OAAO,SAAS,GAAG,KAAK,CAAC,MAAM,IAAI,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACrE,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;YAC7B,SAAS,EAAE,CAAC;YACZ,WAAW,EAAE,CAAC;YAEd,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YAEzD,oEAAoE;YACpE,iEAAiE;YACjE,IAAI,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC/C,SAAS;YACX,CAAC;YAED,yDAAyD;YACzD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YACnD,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC;YACpE,CAAC;YAED,8BAA8B;YAC9B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;wBAC1B,SAAS;oBACX,CAAC;oBACD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;wBACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;oBACzC,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,MAAM,EAAE,CAAC;gBAChB,wBAAwB;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED,YAAY,CAAC,gBAAwB;QACnC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;QACvE,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,wBAAwB;YACxB,OAAO;QACT,CAAC;QAED,sFAAsF;QACtF,MAAM,aAAa,GACjB,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,mBAAmB,CAAC;QAC/D,MAAM,eAAe,GAAG,aAAa;YACnC,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAEnC,MAAM,QAAQ,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;aAC7B,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;aAC7C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACT,MAAM,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,UAAU,EAAE,CAAC;gBACf,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACrB,CAAC;YAED,MAAM,gBAAgB,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,gBAAgB,EAAE,CAAC;gBACrB,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACrB,CAAC;YAED,+DAA+D;YAC/D,uBAAuB;YACvB,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;gBACb,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,IAAI,eAAe,IAAI,eAAe,KAAK,GAAG,EAAE,CAAC;gBAC/C,kFAAkF;gBAClF,6EAA6E;gBAC7E,+EAA+E;gBAC/E,gFAAgF;gBAEhF,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC1C,gEAAgE;oBAChE,gBAAgB;oBAChB,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAClC,CAAC;gBAED,2CAA2C;gBAC3C,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;gBAEpD,sDAAsD;gBACtD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAChC,UAAU,GAAG,GAAG,GAAG,UAAU,CAAC;gBAChC,CAAC;YACH,CAAC;YAED,4CAA4C;YAC5C,IAAI,gBAAgB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpD,UAAU,GAAG,GAAG,GAAG,UAAU,CAAC;YAChC,CAAC;YAED,IAAI,UAAU,EAAE,CAAC;gBACf,UAAU,GAAG,GAAG,GAAG,UAAU,CAAC;YAChC,CAAC;YAED,mDAAmD;YACnD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAE5C,OAAO,UAAU,CAAC;QACpB,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3B,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAEO,WAAW,CAAC,QAAkB;QACpC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,SAAS,CAAC,QAAgB;QACxB,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC9C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IACE,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC;YACzB,QAAQ,KAAK,GAAG;YAChB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EACvB,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YAE/D,IAAI,YAAY,KAAK,EAAE,IAAI,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,mDAAmD;YACnD,MAAM,cAAc,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAExD,IAAI,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,cAAc,KAAK,EAAE,EAAE,CAAC;gBAC5D,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF"}
@@ -3,7 +3,7 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { type GeminiClient } from '../core/client.js';
6
+ import { type BaseLlmClient } from '../core/baseLlmClient.js';
7
7
  export interface SearchReplaceEdit {
8
8
  search: string;
9
9
  replace: string;
@@ -17,9 +17,10 @@ export interface SearchReplaceEdit {
17
17
  * @param new_string The original replacement string.
18
18
  * @param error The error that occurred during the initial edit.
19
19
  * @param current_content The current content of the file.
20
- * @param geminiClient The Gemini client to use for the LLM call.
20
+ * @param baseLlmClient The BaseLlmClient to use for the LLM call.
21
21
  * @param abortSignal An abort signal to cancel the operation.
22
+ * @param promptId A unique ID for the prompt.
22
23
  * @returns A new search and replace pair.
23
24
  */
24
- export declare function FixLLMEditWithInstruction(instruction: string, old_string: string, new_string: string, error: string, current_content: string, geminiClient: GeminiClient, abortSignal: AbortSignal): Promise<SearchReplaceEdit>;
25
+ export declare function FixLLMEditWithInstruction(instruction: string, old_string: string, new_string: string, error: string, current_content: string, baseLlmClient: BaseLlmClient, abortSignal: AbortSignal): Promise<SearchReplaceEdit>;
25
26
  export declare function resetLlmEditFixerCaches_TEST_ONLY(): void;
@@ -4,9 +4,10 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { Type } from '@google/genai';
7
- import {} from '../core/client.js';
7
+ import {} from '../core/baseLlmClient.js';
8
8
  import { LruCache } from './LruCache.js';
9
9
  import { DEFAULT_GEMINI_FLASH_MODEL } from '../config/models.js';
10
+ import { promptIdContext } from './promptIdContext.js';
10
11
  const MAX_CACHE_SIZE = 50;
11
12
  const EDIT_SYS_PROMPT = `
12
13
  You are an expert code-editing assistant specializing in debugging and correcting failed search-and-replace operations.
@@ -76,11 +77,17 @@ const editCorrectionWithInstructionCache = new LruCache(MAX_CACHE_SIZE);
76
77
  * @param new_string The original replacement string.
77
78
  * @param error The error that occurred during the initial edit.
78
79
  * @param current_content The current content of the file.
79
- * @param geminiClient The Gemini client to use for the LLM call.
80
+ * @param baseLlmClient The BaseLlmClient to use for the LLM call.
80
81
  * @param abortSignal An abort signal to cancel the operation.
82
+ * @param promptId A unique ID for the prompt.
81
83
  * @returns A new search and replace pair.
82
84
  */
83
- export async function FixLLMEditWithInstruction(instruction, old_string, new_string, error, current_content, geminiClient, abortSignal) {
85
+ export async function FixLLMEditWithInstruction(instruction, old_string, new_string, error, current_content, baseLlmClient, abortSignal) {
86
+ let promptId = promptIdContext.getStore();
87
+ if (!promptId) {
88
+ promptId = `llm-fixer-fallback-${Date.now()}-${Math.random().toString(16).slice(2)}`;
89
+ console.warn(`Could not find promptId in context. This is unexpected. Using a fallback ID: ${promptId}`);
90
+ }
84
91
  const cacheKey = `${instruction}---${old_string}---${new_string}--${current_content}--${error}`;
85
92
  const cachedResult = editCorrectionWithInstructionCache.get(cacheKey);
86
93
  if (cachedResult) {
@@ -94,15 +101,17 @@ export async function FixLLMEditWithInstruction(instruction, old_string, new_str
94
101
  const contents = [
95
102
  {
96
103
  role: 'user',
97
- parts: [
98
- {
99
- text: `${EDIT_SYS_PROMPT}
100
- ${userPrompt}`,
101
- },
102
- ],
104
+ parts: [{ text: userPrompt }],
103
105
  },
104
106
  ];
105
- const result = (await geminiClient.generateJson(contents, SearchReplaceEditSchema, abortSignal, DEFAULT_GEMINI_FLASH_MODEL));
107
+ const result = (await baseLlmClient.generateJson({
108
+ contents,
109
+ schema: SearchReplaceEditSchema,
110
+ abortSignal,
111
+ model: DEFAULT_GEMINI_FLASH_MODEL,
112
+ systemInstruction: EDIT_SYS_PROMPT,
113
+ promptId,
114
+ }));
106
115
  editCorrectionWithInstructionCache.set(cacheKey, result);
107
116
  return result;
108
117
  }
@@ -1 +1 @@
1
- {"version":3,"file":"llm-edit-fixer.js","sourceRoot":"","sources":["../../../src/utils/llm-edit-fixer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAgB,IAAI,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAqB,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAEjE,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;CAqBvB,CAAC;AAEF,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BxB,CAAC;AASF,MAAM,uBAAuB,GAAG;IAC9B,IAAI,EAAE,IAAI,CAAC,MAAM;IACjB,UAAU,EAAE;QACV,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;QAClC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;QAC7B,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;QAC9B,iBAAiB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE;KAC1C;IACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,aAAa,CAAC;CAC/C,CAAC;AAEF,MAAM,kCAAkC,GAAG,IAAI,QAAQ,CAGrD,cAAc,CAAC,CAAC;AAElB;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,WAAmB,EACnB,UAAkB,EAClB,UAAkB,EAClB,KAAa,EACb,eAAuB,EACvB,YAA0B,EAC1B,WAAwB;IAExB,MAAM,QAAQ,GAAG,GAAG,WAAW,MAAM,UAAU,MAAM,UAAU,KAAK,eAAe,KAAK,KAAK,EAAE,CAAC;IAChG,MAAM,YAAY,GAAG,kCAAkC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtE,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,eAAe,EAAE,WAAW,CAAC;SACtE,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC;SACnC,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC;SACnC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC;SACzB,OAAO,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;IAEjD,MAAM,QAAQ,GAAc;QAC1B;YACE,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE,GAAG,eAAe;EAChC,UAAU,EAAE;iBACL;aACF;SACF;KACF,CAAC;IAEF,MAAM,MAAM,GAAG,CAAC,MAAM,YAAY,CAAC,YAAY,CAC7C,QAAQ,EACR,uBAAuB,EACvB,WAAW,EACX,0BAA0B,CAC3B,CAAiC,CAAC;IAEnC,kCAAkC,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACzD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,iCAAiC;IAC/C,kCAAkC,CAAC,KAAK,EAAE,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"llm-edit-fixer.js","sourceRoot":"","sources":["../../../src/utils/llm-edit-fixer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAgB,IAAI,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAsB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;CAqBvB,CAAC;AAEF,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BxB,CAAC;AASF,MAAM,uBAAuB,GAAG;IAC9B,IAAI,EAAE,IAAI,CAAC,MAAM;IACjB,UAAU,EAAE;QACV,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;QAClC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;QAC7B,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;QAC9B,iBAAiB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE;KAC1C;IACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,aAAa,CAAC;CAC/C,CAAC;AAEF,MAAM,kCAAkC,GAAG,IAAI,QAAQ,CAGrD,cAAc,CAAC,CAAC;AAElB;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,WAAmB,EACnB,UAAkB,EAClB,UAAkB,EAClB,KAAa,EACb,eAAuB,EACvB,aAA4B,EAC5B,WAAwB;IAExB,IAAI,QAAQ,GAAG,eAAe,CAAC,QAAQ,EAAE,CAAC;IAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,sBAAsB,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,OAAO,CAAC,IAAI,CACV,gFAAgF,QAAQ,EAAE,CAC3F,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,WAAW,MAAM,UAAU,MAAM,UAAU,KAAK,eAAe,KAAK,KAAK,EAAE,CAAC;IAChG,MAAM,YAAY,GAAG,kCAAkC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtE,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,eAAe,EAAE,WAAW,CAAC;SACtE,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC;SACnC,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC;SACnC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC;SACzB,OAAO,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;IAEjD,MAAM,QAAQ,GAAc;QAC1B;YACE,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;SAC9B;KACF,CAAC;IAEF,MAAM,MAAM,GAAG,CAAC,MAAM,aAAa,CAAC,YAAY,CAAC;QAC/C,QAAQ;QACR,MAAM,EAAE,uBAAuB;QAC/B,WAAW;QACX,KAAK,EAAE,0BAA0B;QACjC,iBAAiB,EAAE,eAAe;QAClC,QAAQ;KACT,CAAC,CAAiC,CAAC;IAEpC,kCAAkC,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACzD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,iCAAiC;IAC/C,kCAAkC,CAAC,KAAK,EAAE,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,105 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
+ import { FixLLMEditWithInstruction, resetLlmEditFixerCaches_TEST_ONLY, } from './llm-edit-fixer.js';
8
+ import { promptIdContext } from './promptIdContext.js';
9
+ // Mock the BaseLlmClient
10
+ const mockGenerateJson = vi.fn();
11
+ const mockBaseLlmClient = {
12
+ generateJson: mockGenerateJson,
13
+ };
14
+ describe('FixLLMEditWithInstruction', () => {
15
+ const instruction = 'Replace the title';
16
+ const old_string = '<h1>Old Title</h1>';
17
+ const new_string = '<h1>New Title</h1>';
18
+ const error = 'String not found';
19
+ const current_content = '<body><h1>Old Title</h1></body>';
20
+ const abortController = new AbortController();
21
+ const abortSignal = abortController.signal;
22
+ beforeEach(() => {
23
+ vi.clearAllMocks();
24
+ resetLlmEditFixerCaches_TEST_ONLY(); // Ensure cache is cleared before each test
25
+ });
26
+ afterEach(() => {
27
+ vi.useRealTimers(); // Reset timers after each test
28
+ });
29
+ const mockApiResponse = {
30
+ search: '<h1>Old Title</h1>',
31
+ replace: '<h1>New Title</h1>',
32
+ noChangesRequired: false,
33
+ explanation: 'The original search was correct.',
34
+ };
35
+ it('should use the promptId from the AsyncLocalStorage context when available', async () => {
36
+ const testPromptId = 'test-prompt-id-12345';
37
+ mockGenerateJson.mockResolvedValue(mockApiResponse);
38
+ await promptIdContext.run(testPromptId, async () => {
39
+ await FixLLMEditWithInstruction(instruction, old_string, new_string, error, current_content, mockBaseLlmClient, abortSignal);
40
+ });
41
+ // Verify that generateJson was called with the promptId from the context
42
+ expect(mockGenerateJson).toHaveBeenCalledTimes(1);
43
+ expect(mockGenerateJson).toHaveBeenCalledWith(expect.objectContaining({
44
+ promptId: testPromptId,
45
+ }));
46
+ });
47
+ it('should generate and use a fallback promptId when context is not available', async () => {
48
+ mockGenerateJson.mockResolvedValue(mockApiResponse);
49
+ const consoleWarnSpy = vi
50
+ .spyOn(console, 'warn')
51
+ .mockImplementation(() => { });
52
+ // Run the function outside of any context
53
+ await FixLLMEditWithInstruction(instruction, old_string, new_string, error, current_content, mockBaseLlmClient, abortSignal);
54
+ // Verify the warning was logged
55
+ expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining('Could not find promptId in context. This is unexpected. Using a fallback ID: llm-fixer-fallback-'));
56
+ // Verify that generateJson was called with the generated fallback promptId
57
+ expect(mockGenerateJson).toHaveBeenCalledTimes(1);
58
+ expect(mockGenerateJson).toHaveBeenCalledWith(expect.objectContaining({
59
+ promptId: expect.stringContaining('llm-fixer-fallback-'),
60
+ }));
61
+ // Restore mocks
62
+ consoleWarnSpy.mockRestore();
63
+ });
64
+ it('should construct the user prompt correctly', async () => {
65
+ mockGenerateJson.mockResolvedValue(mockApiResponse);
66
+ const promptId = 'test-prompt-id-prompt-construction';
67
+ await promptIdContext.run(promptId, async () => {
68
+ await FixLLMEditWithInstruction(instruction, old_string, new_string, error, current_content, mockBaseLlmClient, abortSignal);
69
+ });
70
+ const generateJsonCall = mockGenerateJson.mock.calls[0][0];
71
+ const userPromptContent = generateJsonCall.contents[0].parts[0].text;
72
+ expect(userPromptContent).toContain(`<instruction>\n${instruction}\n</instruction>`);
73
+ expect(userPromptContent).toContain(`<search>\n${old_string}\n</search>`);
74
+ expect(userPromptContent).toContain(`<replace>\n${new_string}\n</replace>`);
75
+ expect(userPromptContent).toContain(`<error>\n${error}\n</error>`);
76
+ expect(userPromptContent).toContain(`<file_content>\n${current_content}\n</file_content>`);
77
+ });
78
+ it('should return a cached result on subsequent identical calls', async () => {
79
+ mockGenerateJson.mockResolvedValue(mockApiResponse);
80
+ const testPromptId = 'test-prompt-id-caching';
81
+ await promptIdContext.run(testPromptId, async () => {
82
+ // First call - should call the API
83
+ const result1 = await FixLLMEditWithInstruction(instruction, old_string, new_string, error, current_content, mockBaseLlmClient, abortSignal);
84
+ // Second call with identical parameters - should hit the cache
85
+ const result2 = await FixLLMEditWithInstruction(instruction, old_string, new_string, error, current_content, mockBaseLlmClient, abortSignal);
86
+ expect(result1).toEqual(mockApiResponse);
87
+ expect(result2).toEqual(mockApiResponse);
88
+ // Verify the underlying service was only called ONCE
89
+ expect(mockGenerateJson).toHaveBeenCalledTimes(1);
90
+ });
91
+ });
92
+ it('should not use cache for calls with different parameters', async () => {
93
+ mockGenerateJson.mockResolvedValue(mockApiResponse);
94
+ const testPromptId = 'test-prompt-id-cache-miss';
95
+ await promptIdContext.run(testPromptId, async () => {
96
+ // First call
97
+ await FixLLMEditWithInstruction(instruction, old_string, new_string, error, current_content, mockBaseLlmClient, abortSignal);
98
+ // Second call with a different instruction
99
+ await FixLLMEditWithInstruction('A different instruction', old_string, new_string, error, current_content, mockBaseLlmClient, abortSignal);
100
+ // Verify the underlying service was called TWICE
101
+ expect(mockGenerateJson).toHaveBeenCalledTimes(2);
102
+ });
103
+ });
104
+ });
105
+ //# sourceMappingURL=llm-edit-fixer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-edit-fixer.test.js","sourceRoot":"","sources":["../../../src/utils/llm-edit-fixer.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { AsyncLocalStorage } from 'node:async_hooks';
7
+ export declare const promptIdContext: AsyncLocalStorage<string>;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { AsyncLocalStorage } from 'node:async_hooks';
7
+ export const promptIdContext = new AsyncLocalStorage();
8
+ //# sourceMappingURL=promptIdContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promptIdContext.js","sourceRoot":"","sources":["../../../src/utils/promptIdContext.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,iBAAiB,EAAU,CAAC"}