@google/gemini-cli-core 0.17.0-nightly.20251117.cf8de02c6 → 0.17.0-preview.0
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.
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/src/code_assist/experiments/flagNames.d.ts +3 -0
- package/dist/src/code_assist/experiments/flagNames.js +3 -0
- package/dist/src/code_assist/experiments/flagNames.js.map +1 -1
- package/dist/src/config/config.d.ts +13 -0
- package/dist/src/config/config.js +44 -1
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +77 -0
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/models.d.ts +22 -1
- package/dist/src/config/models.js +48 -5
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/config/models.test.js +71 -10
- package/dist/src/config/models.test.js.map +1 -1
- package/dist/src/core/client.d.ts +0 -1
- package/dist/src/core/client.js +5 -12
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +5 -16
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/geminiChat.d.ts +2 -0
- package/dist/src/core/geminiChat.js +91 -12
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +253 -18
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/fallback/handler.js +52 -5
- package/dist/src/fallback/handler.js.map +1 -1
- package/dist/src/fallback/handler.test.js +64 -4
- package/dist/src/fallback/handler.test.js.map +1 -1
- package/dist/src/fallback/types.d.ts +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/generated/git-commit.js.map +1 -1
- package/dist/src/ide/detect-ide.d.ts +4 -0
- package/dist/src/ide/detect-ide.js +4 -0
- package/dist/src/ide/detect-ide.js.map +1 -1
- package/dist/src/ide/detect-ide.test.js +5 -0
- package/dist/src/ide/detect-ide.test.js.map +1 -1
- package/dist/src/ide/ide-client.d.ts +3 -1
- package/dist/src/ide/ide-client.js +5 -4
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/ide/ide-installer.js +65 -20
- package/dist/src/ide/ide-installer.js.map +1 -1
- package/dist/src/ide/ide-installer.test.js +41 -0
- package/dist/src/ide/ide-installer.test.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/routing/modelRouterService.js +15 -0
- package/dist/src/routing/modelRouterService.js.map +1 -1
- package/dist/src/routing/modelRouterService.test.js +62 -0
- package/dist/src/routing/modelRouterService.test.js.map +1 -1
- package/dist/src/routing/strategies/classifierStrategy.d.ts +1 -1
- package/dist/src/routing/strategies/classifierStrategy.js +4 -4
- package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
- package/dist/src/routing/strategies/classifierStrategy.test.js +1 -0
- package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/fallbackStrategy.js +1 -1
- package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -1
- package/dist/src/routing/strategies/fallbackStrategy.test.js +4 -0
- package/dist/src/routing/strategies/fallbackStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/overrideStrategy.js +2 -2
- package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
- package/dist/src/routing/strategies/overrideStrategy.test.js +3 -0
- package/dist/src/routing/strategies/overrideStrategy.test.js.map +1 -1
- package/dist/src/tools/edit.test.js +203 -200
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +4 -2
- package/dist/src/tools/mcp-client.js +76 -22
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +111 -42
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +186 -273
- package/dist/src/tools/mcp-tool.test.js.map +1 -1
- package/dist/src/tools/ripGrep.test.js +84 -126
- package/dist/src/tools/ripGrep.test.js.map +1 -1
- package/dist/src/tools/smart-edit.test.js +92 -111
- package/dist/src/tools/smart-edit.test.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +59 -90
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/tools/web-fetch.test.js +121 -179
- package/dist/src/tools/web-fetch.test.js.map +1 -1
- package/dist/src/tools/write-file.test.js +105 -116
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/utils/editor.d.ts +3 -1
- package/dist/src/utils/editor.js +18 -1
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/editor.test.js +11 -0
- package/dist/src/utils/editor.test.js.map +1 -1
- package/dist/src/utils/flashFallback.test.js +2 -2
- package/dist/src/utils/flashFallback.test.js.map +1 -1
- package/dist/src/utils/googleQuotaErrors.d.ts +2 -1
- package/dist/src/utils/googleQuotaErrors.js +20 -12
- package/dist/src/utils/googleQuotaErrors.js.map +1 -1
- package/dist/src/utils/httpErrors.d.ts +18 -0
- package/dist/src/utils/httpErrors.js +36 -0
- package/dist/src/utils/httpErrors.js.map +1 -0
- package/dist/src/utils/retry.d.ts +0 -9
- package/dist/src/utils/retry.js +24 -28
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js +51 -0
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/dist/google-gemini-cli-core-0.17.0-nightly.20251116.e650a4ee5.tgz +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classifierStrategy.test.js","sourceRoot":"","sources":["../../../../src/routing/strategies/classifierStrategy.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAI7D,OAAO,EACL,cAAc,EACd,kBAAkB,GACnB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAIjE,EAAE,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;AACvC,EAAE,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;AAE1C,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,QAA4B,CAAC;IACjC,IAAI,WAA2B,CAAC;IAChC,IAAI,UAAkB,CAAC;IACvB,IAAI,iBAAgC,CAAC;IACrC,IAAI,kBAAuC,CAAC;IAE5C,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QAEnB,QAAQ,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACpC,WAAW,GAAG;YACZ,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;YAClC,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM;SACrC,CAAC;
|
|
1
|
+
{"version":3,"file":"classifierStrategy.test.js","sourceRoot":"","sources":["../../../../src/routing/strategies/classifierStrategy.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ export class FallbackStrategy {
|
|
|
11
11
|
if (!isInFallbackMode) {
|
|
12
12
|
return null;
|
|
13
13
|
}
|
|
14
|
-
const effectiveModel = getEffectiveModel(isInFallbackMode, config.getModel());
|
|
14
|
+
const effectiveModel = getEffectiveModel(isInFallbackMode, config.getModel(), config.getPreviewFeatures());
|
|
15
15
|
return {
|
|
16
16
|
model: effectiveModel,
|
|
17
17
|
metadata: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fallbackStrategy.js","sourceRoot":"","sources":["../../../../src/routing/strategies/fallbackStrategy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAQ3D,MAAM,OAAO,gBAAgB;IAClB,IAAI,GAAG,UAAU,CAAC;IAE3B,KAAK,CAAC,KAAK,CACT,QAAwB,EACxB,MAAc,EACd,cAA6B;QAE7B,MAAM,gBAAgB,GAAY,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAE5D,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,cAAc,GAAG,iBAAiB,CACtC,gBAAgB,EAChB,MAAM,CAAC,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"fallbackStrategy.js","sourceRoot":"","sources":["../../../../src/routing/strategies/fallbackStrategy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAQ3D,MAAM,OAAO,gBAAgB;IAClB,IAAI,GAAG,UAAU,CAAC;IAE3B,KAAK,CAAC,KAAK,CACT,QAAwB,EACxB,MAAc,EACd,cAA6B;QAE7B,MAAM,gBAAgB,GAAY,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAE5D,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,cAAc,GAAG,iBAAiB,CACtC,gBAAgB,EAChB,MAAM,CAAC,QAAQ,EAAE,EACjB,MAAM,CAAC,kBAAkB,EAAE,CAC5B,CAAC;QACF,OAAO;YACL,KAAK,EAAE,cAAc;YACrB,QAAQ,EAAE;gBACR,MAAM,EAAE,IAAI,CAAC,IAAI;gBACjB,SAAS,EAAE,CAAC;gBACZ,SAAS,EAAE,4BAA4B,cAAc,EAAE;aACxD;SACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -14,6 +14,7 @@ describe('FallbackStrategy', () => {
|
|
|
14
14
|
const mockConfig = {
|
|
15
15
|
isInFallbackMode: () => false,
|
|
16
16
|
getModel: () => DEFAULT_GEMINI_MODEL,
|
|
17
|
+
getPreviewFeatures: () => false,
|
|
17
18
|
};
|
|
18
19
|
const decision = await strategy.route(mockContext, mockConfig, mockClient);
|
|
19
20
|
expect(decision).toBeNull();
|
|
@@ -23,6 +24,7 @@ describe('FallbackStrategy', () => {
|
|
|
23
24
|
const mockConfig = {
|
|
24
25
|
isInFallbackMode: () => true,
|
|
25
26
|
getModel: () => DEFAULT_GEMINI_MODEL,
|
|
27
|
+
getPreviewFeatures: () => false,
|
|
26
28
|
};
|
|
27
29
|
const decision = await strategy.route(mockContext, mockConfig, mockClient);
|
|
28
30
|
expect(decision).not.toBeNull();
|
|
@@ -34,6 +36,7 @@ describe('FallbackStrategy', () => {
|
|
|
34
36
|
const mockConfig = {
|
|
35
37
|
isInFallbackMode: () => true,
|
|
36
38
|
getModel: () => DEFAULT_GEMINI_FLASH_LITE_MODEL,
|
|
39
|
+
getPreviewFeatures: () => false,
|
|
37
40
|
};
|
|
38
41
|
const decision = await strategy.route(mockContext, mockConfig, mockClient);
|
|
39
42
|
expect(decision).not.toBeNull();
|
|
@@ -44,6 +47,7 @@ describe('FallbackStrategy', () => {
|
|
|
44
47
|
const mockConfig = {
|
|
45
48
|
isInFallbackMode: () => true,
|
|
46
49
|
getModel: () => DEFAULT_GEMINI_FLASH_MODEL,
|
|
50
|
+
getPreviewFeatures: () => false,
|
|
47
51
|
};
|
|
48
52
|
const decision = await strategy.route(mockContext, mockConfig, mockClient);
|
|
49
53
|
expect(decision).not.toBeNull();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fallbackStrategy.test.js","sourceRoot":"","sources":["../../../../src/routing/strategies/fallbackStrategy.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAIzD,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,+BAA+B,GAChC,MAAM,wBAAwB,CAAC;AAEhC,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,MAAM,QAAQ,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACxC,MAAM,WAAW,GAAG,EAAoB,CAAC;IACzC,MAAM,UAAU,GAAG,EAAmB,CAAC;IAEvC,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,UAAU,GAAG;YACjB,gBAAgB,EAAE,GAAG,EAAE,CAAC,KAAK;YAC7B,QAAQ,EAAE,GAAG,EAAE,CAAC,oBAAoB;
|
|
1
|
+
{"version":3,"file":"fallbackStrategy.test.js","sourceRoot":"","sources":["../../../../src/routing/strategies/fallbackStrategy.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { DEFAULT_GEMINI_MODEL_AUTO } from '../../config/models.js';
|
|
6
|
+
import { DEFAULT_GEMINI_MODEL_AUTO, resolveModel, } from '../../config/models.js';
|
|
7
7
|
/**
|
|
8
8
|
* Handles cases where the user explicitly specifies a model (override).
|
|
9
9
|
*/
|
|
@@ -16,7 +16,7 @@ export class OverrideStrategy {
|
|
|
16
16
|
return null;
|
|
17
17
|
// Return the overridden model name.
|
|
18
18
|
return {
|
|
19
|
-
model: overrideModel,
|
|
19
|
+
model: resolveModel(overrideModel, config.getPreviewFeatures()),
|
|
20
20
|
metadata: {
|
|
21
21
|
source: this.name,
|
|
22
22
|
latencyMs: 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overrideStrategy.js","sourceRoot":"","sources":["../../../../src/routing/strategies/overrideStrategy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,
|
|
1
|
+
{"version":3,"file":"overrideStrategy.js","sourceRoot":"","sources":["../../../../src/routing/strategies/overrideStrategy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,yBAAyB,EACzB,YAAY,GACb,MAAM,wBAAwB,CAAC;AAQhC;;GAEG;AACH,MAAM,OAAO,gBAAgB;IAClB,IAAI,GAAG,UAAU,CAAC;IAE3B,KAAK,CAAC,KAAK,CACT,QAAwB,EACxB,MAAc,EACd,cAA6B;QAE7B,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAExC,8DAA8D;QAC9D,IAAI,aAAa,KAAK,yBAAyB;YAAE,OAAO,IAAI,CAAC;QAE7D,oCAAoC;QACpC,OAAO;YACL,KAAK,EAAE,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAC/D,QAAQ,EAAE;gBACR,MAAM,EAAE,IAAI,CAAC,IAAI;gBACjB,SAAS,EAAE,CAAC;gBACZ,SAAS,EAAE,sDAAsD,aAAa,EAAE;aACjF;SACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -13,6 +13,7 @@ describe('OverrideStrategy', () => {
|
|
|
13
13
|
it('should return null when the override model is auto', async () => {
|
|
14
14
|
const mockConfig = {
|
|
15
15
|
getModel: () => DEFAULT_GEMINI_MODEL_AUTO,
|
|
16
|
+
getPreviewFeatures: () => false,
|
|
16
17
|
};
|
|
17
18
|
const decision = await strategy.route(mockContext, mockConfig, mockClient);
|
|
18
19
|
expect(decision).toBeNull();
|
|
@@ -21,6 +22,7 @@ describe('OverrideStrategy', () => {
|
|
|
21
22
|
const overrideModel = 'gemini-2.5-pro-custom';
|
|
22
23
|
const mockConfig = {
|
|
23
24
|
getModel: () => overrideModel,
|
|
25
|
+
getPreviewFeatures: () => false,
|
|
24
26
|
};
|
|
25
27
|
const decision = await strategy.route(mockContext, mockConfig, mockClient);
|
|
26
28
|
expect(decision).not.toBeNull();
|
|
@@ -33,6 +35,7 @@ describe('OverrideStrategy', () => {
|
|
|
33
35
|
const overrideModel = 'gemini-2.5-flash-experimental';
|
|
34
36
|
const mockConfig = {
|
|
35
37
|
getModel: () => overrideModel,
|
|
38
|
+
getPreviewFeatures: () => false,
|
|
36
39
|
};
|
|
37
40
|
const decision = await strategy.route(mockContext, mockConfig, mockClient);
|
|
38
41
|
expect(decision).not.toBeNull();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overrideStrategy.test.js","sourceRoot":"","sources":["../../../../src/routing/strategies/overrideStrategy.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAIzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,MAAM,QAAQ,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACxC,MAAM,WAAW,GAAG,EAAoB,CAAC;IACzC,MAAM,UAAU,GAAG,EAAmB,CAAC;IAEvC,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,UAAU,GAAG;YACjB,QAAQ,EAAE,GAAG,EAAE,CAAC,yBAAyB;
|
|
1
|
+
{"version":3,"file":"overrideStrategy.test.js","sourceRoot":"","sources":["../../../../src/routing/strategies/overrideStrategy.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAIzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,MAAM,QAAQ,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACxC,MAAM,WAAW,GAAG,EAAoB,CAAC;IACzC,MAAM,UAAU,GAAG,EAAmB,CAAC;IAEvC,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,UAAU,GAAG;YACjB,QAAQ,EAAE,GAAG,EAAE,CAAC,yBAAyB;YACzC,kBAAkB,EAAE,GAAG,EAAE,CAAC,KAAK;SACtB,CAAC;QAEZ,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QAC3E,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,MAAM,aAAa,GAAG,uBAAuB,CAAC;QAC9C,MAAM,UAAU,GAAG;YACjB,QAAQ,EAAE,GAAG,EAAE,CAAC,aAAa;YAC7B,kBAAkB,EAAE,GAAG,EAAE,CAAC,KAAK;SACtB,CAAC;QAEZ,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QAE3E,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5C,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,SAAS,CAC5C,4CAA4C,CAC7C,CAAC;QACF,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,aAAa,GAAG,+BAA+B,CAAC;QACtD,MAAM,UAAU,GAAG;YACjB,QAAQ,EAAE,GAAG,EAAE,CAAC,aAAa;YAC7B,kBAAkB,EAAE,GAAG,EAAE,CAAC,KAAK;SACtB,CAAC;QAEZ,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QAE3E,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -157,75 +157,80 @@ describe('EditTool', () => {
|
|
|
157
157
|
it('should return currentContent if oldString is empty and not a new file', () => {
|
|
158
158
|
expect(applyReplacement('hello world', '', 'new', false)).toBe('hello world');
|
|
159
159
|
});
|
|
160
|
-
it(
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
160
|
+
it.each([
|
|
161
|
+
{
|
|
162
|
+
name: '$ literal',
|
|
163
|
+
current: "price is $100 and pattern end is ' '",
|
|
164
|
+
oldStr: 'price is $100',
|
|
165
|
+
newStr: 'price is $200',
|
|
166
|
+
expected: "price is $200 and pattern end is ' '",
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
name: "$' literal",
|
|
170
|
+
current: 'foo',
|
|
171
|
+
oldStr: 'foo',
|
|
172
|
+
newStr: "bar$'baz",
|
|
173
|
+
expected: "bar$'baz",
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
name: '$& literal',
|
|
177
|
+
current: 'hello world',
|
|
178
|
+
oldStr: 'hello',
|
|
179
|
+
newStr: '$&-replacement',
|
|
180
|
+
expected: '$&-replacement world',
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
name: '$` literal',
|
|
184
|
+
current: 'prefix-middle-suffix',
|
|
185
|
+
oldStr: 'middle',
|
|
186
|
+
newStr: 'new$`content',
|
|
187
|
+
expected: 'prefix-new$`content-suffix',
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
name: '$1, $2 capture groups literal',
|
|
191
|
+
current: 'test string',
|
|
192
|
+
oldStr: 'test',
|
|
193
|
+
newStr: '$1$2replacement',
|
|
194
|
+
expected: '$1$2replacement string',
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
name: 'normal strings without problematic $',
|
|
198
|
+
current: 'normal text replacement',
|
|
199
|
+
oldStr: 'text',
|
|
200
|
+
newStr: 'string',
|
|
201
|
+
expected: 'normal string replacement',
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
name: 'multiple occurrences with $ sequences',
|
|
205
|
+
current: 'foo bar foo baz',
|
|
206
|
+
oldStr: 'foo',
|
|
207
|
+
newStr: "test$'end",
|
|
208
|
+
expected: "test$'end bar test$'end baz",
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
name: 'complex regex patterns with $ at end',
|
|
212
|
+
current: "| select('match', '^[sv]d[a-z]$')",
|
|
213
|
+
oldStr: "'^[sv]d[a-z]$'",
|
|
214
|
+
newStr: "'^[sv]d[a-z]$' # updated",
|
|
215
|
+
expected: "| select('match', '^[sv]d[a-z]$' # updated)",
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
name: 'empty replacement with problematic $',
|
|
219
|
+
current: 'test content',
|
|
220
|
+
oldStr: 'nothing',
|
|
221
|
+
newStr: "replacement$'text",
|
|
222
|
+
expected: 'test content',
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
name: '$$ (escaped dollar)',
|
|
226
|
+
current: 'price value',
|
|
227
|
+
oldStr: 'value',
|
|
228
|
+
newStr: '$$100',
|
|
229
|
+
expected: 'price $$100',
|
|
230
|
+
},
|
|
231
|
+
])('should handle $name', ({ current, oldStr, newStr, expected }) => {
|
|
164
232
|
const result = applyReplacement(current, oldStr, newStr, false);
|
|
165
|
-
expect(result).toBe(
|
|
166
|
-
});
|
|
167
|
-
it("should treat $' literally and not as a replacement pattern", () => {
|
|
168
|
-
const current = 'foo';
|
|
169
|
-
const oldStr = 'foo';
|
|
170
|
-
const newStr = "bar$'baz";
|
|
171
|
-
const result = applyReplacement(current, oldStr, newStr, false);
|
|
172
|
-
expect(result).toBe("bar$'baz");
|
|
173
|
-
});
|
|
174
|
-
it('should treat $& literally and not as a replacement pattern', () => {
|
|
175
|
-
const current = 'hello world';
|
|
176
|
-
const oldStr = 'hello';
|
|
177
|
-
const newStr = '$&-replacement';
|
|
178
|
-
const result = applyReplacement(current, oldStr, newStr, false);
|
|
179
|
-
expect(result).toBe('$&-replacement world');
|
|
180
|
-
});
|
|
181
|
-
it('should treat $` literally and not as a replacement pattern', () => {
|
|
182
|
-
const current = 'prefix-middle-suffix';
|
|
183
|
-
const oldStr = 'middle';
|
|
184
|
-
const newStr = 'new$`content';
|
|
185
|
-
const result = applyReplacement(current, oldStr, newStr, false);
|
|
186
|
-
expect(result).toBe('prefix-new$`content-suffix');
|
|
187
|
-
});
|
|
188
|
-
it('should treat $1, $2 capture groups literally', () => {
|
|
189
|
-
const current = 'test string';
|
|
190
|
-
const oldStr = 'test';
|
|
191
|
-
const newStr = '$1$2replacement';
|
|
192
|
-
const result = applyReplacement(current, oldStr, newStr, false);
|
|
193
|
-
expect(result).toBe('$1$2replacement string');
|
|
194
|
-
});
|
|
195
|
-
it('should use replaceAll for normal strings without problematic $ sequences', () => {
|
|
196
|
-
const current = 'normal text replacement';
|
|
197
|
-
const oldStr = 'text';
|
|
198
|
-
const newStr = 'string';
|
|
199
|
-
const result = applyReplacement(current, oldStr, newStr, false);
|
|
200
|
-
expect(result).toBe('normal string replacement');
|
|
201
|
-
});
|
|
202
|
-
it('should handle multiple occurrences with problematic $ sequences', () => {
|
|
203
|
-
const current = 'foo bar foo baz';
|
|
204
|
-
const oldStr = 'foo';
|
|
205
|
-
const newStr = "test$'end";
|
|
206
|
-
const result = applyReplacement(current, oldStr, newStr, false);
|
|
207
|
-
expect(result).toBe("test$'end bar test$'end baz");
|
|
208
|
-
});
|
|
209
|
-
it('should handle complex regex patterns with $ at end', () => {
|
|
210
|
-
const current = "| select('match', '^[sv]d[a-z]$')";
|
|
211
|
-
const oldStr = "'^[sv]d[a-z]$'";
|
|
212
|
-
const newStr = "'^[sv]d[a-z]$' # updated";
|
|
213
|
-
const result = applyReplacement(current, oldStr, newStr, false);
|
|
214
|
-
expect(result).toBe("| select('match', '^[sv]d[a-z]$' # updated)");
|
|
215
|
-
});
|
|
216
|
-
it('should handle empty replacement with problematic $ in newString', () => {
|
|
217
|
-
const current = 'test content';
|
|
218
|
-
const oldStr = 'nothing';
|
|
219
|
-
const newStr = "replacement$'text";
|
|
220
|
-
const result = applyReplacement(current, oldStr, newStr, false);
|
|
221
|
-
expect(result).toBe('test content'); // No replacement because oldStr not found
|
|
222
|
-
});
|
|
223
|
-
it('should handle $$ (escaped dollar) correctly', () => {
|
|
224
|
-
const current = 'price value';
|
|
225
|
-
const oldStr = 'value';
|
|
226
|
-
const newStr = '$$100';
|
|
227
|
-
const result = applyReplacement(current, oldStr, newStr, false);
|
|
228
|
-
expect(result).toBe('price $$100');
|
|
233
|
+
expect(result).toBe(expected);
|
|
229
234
|
});
|
|
230
235
|
});
|
|
231
236
|
describe('validateToolParams', () => {
|
|
@@ -620,27 +625,25 @@ describe('EditTool', () => {
|
|
|
620
625
|
user_removed_chars: 7,
|
|
621
626
|
});
|
|
622
627
|
});
|
|
623
|
-
it(
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
}
|
|
632
|
-
|
|
633
|
-
const invocation = tool.build(params);
|
|
634
|
-
const result = await invocation.execute(new AbortController().signal);
|
|
635
|
-
expect(result.llmContent).not.toMatch(/User modified the `new_string` content/);
|
|
636
|
-
});
|
|
637
|
-
it('should not include modification message when modified_by_user is not provided', async () => {
|
|
628
|
+
it.each([
|
|
629
|
+
{
|
|
630
|
+
name: 'modified_by_user is false',
|
|
631
|
+
modifiedByUser: false,
|
|
632
|
+
},
|
|
633
|
+
{
|
|
634
|
+
name: 'modified_by_user is not provided',
|
|
635
|
+
modifiedByUser: undefined,
|
|
636
|
+
},
|
|
637
|
+
])('should not include modification message when $name', async ({ modifiedByUser }) => {
|
|
638
638
|
const initialContent = 'This is some old text.';
|
|
639
639
|
fs.writeFileSync(filePath, initialContent, 'utf8');
|
|
640
640
|
const params = {
|
|
641
641
|
file_path: filePath,
|
|
642
642
|
old_string: 'old',
|
|
643
643
|
new_string: 'new',
|
|
644
|
+
...(modifiedByUser !== undefined && {
|
|
645
|
+
modified_by_user: modifiedByUser,
|
|
646
|
+
}),
|
|
644
647
|
};
|
|
645
648
|
mockConfig.getApprovalMode.mockReturnValueOnce(ApprovalMode.AUTO_EDIT);
|
|
646
649
|
const invocation = tool.build(params);
|
|
@@ -688,126 +691,126 @@ describe('EditTool', () => {
|
|
|
688
691
|
beforeEach(() => {
|
|
689
692
|
filePath = path.join(rootDir, testFile);
|
|
690
693
|
});
|
|
691
|
-
it(
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
new_string: 'new',
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
new_string: '
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
const
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
694
|
+
it.each([
|
|
695
|
+
{
|
|
696
|
+
name: 'FILE_NOT_FOUND error',
|
|
697
|
+
setup: () => { },
|
|
698
|
+
params: { file_path: '', old_string: 'any', new_string: 'new' },
|
|
699
|
+
expectedError: ToolErrorType.FILE_NOT_FOUND,
|
|
700
|
+
isAsyncTest: true,
|
|
701
|
+
},
|
|
702
|
+
{
|
|
703
|
+
name: 'ATTEMPT_TO_CREATE_EXISTING_FILE error',
|
|
704
|
+
setup: (fp) => fs.writeFileSync(fp, 'existing content', 'utf8'),
|
|
705
|
+
params: { file_path: '', old_string: '', new_string: 'new content' },
|
|
706
|
+
expectedError: ToolErrorType.ATTEMPT_TO_CREATE_EXISTING_FILE,
|
|
707
|
+
isAsyncTest: true,
|
|
708
|
+
},
|
|
709
|
+
{
|
|
710
|
+
name: 'NO_OCCURRENCE_FOUND error',
|
|
711
|
+
setup: (fp) => fs.writeFileSync(fp, 'content', 'utf8'),
|
|
712
|
+
params: { file_path: '', old_string: 'not-found', new_string: 'new' },
|
|
713
|
+
expectedError: ToolErrorType.EDIT_NO_OCCURRENCE_FOUND,
|
|
714
|
+
isAsyncTest: true,
|
|
715
|
+
},
|
|
716
|
+
{
|
|
717
|
+
name: 'EXPECTED_OCCURRENCE_MISMATCH error',
|
|
718
|
+
setup: (fp) => fs.writeFileSync(fp, 'one one two', 'utf8'),
|
|
719
|
+
params: {
|
|
720
|
+
file_path: '',
|
|
721
|
+
old_string: 'one',
|
|
722
|
+
new_string: 'new',
|
|
723
|
+
expected_replacements: 3,
|
|
724
|
+
},
|
|
725
|
+
expectedError: ToolErrorType.EDIT_EXPECTED_OCCURRENCE_MISMATCH,
|
|
726
|
+
isAsyncTest: true,
|
|
727
|
+
},
|
|
728
|
+
{
|
|
729
|
+
name: 'NO_CHANGE error',
|
|
730
|
+
setup: (fp) => fs.writeFileSync(fp, 'content', 'utf8'),
|
|
731
|
+
params: { file_path: '', old_string: 'content', new_string: 'content' },
|
|
732
|
+
expectedError: ToolErrorType.EDIT_NO_CHANGE,
|
|
733
|
+
isAsyncTest: true,
|
|
734
|
+
},
|
|
735
|
+
{
|
|
736
|
+
name: 'relative path (should not throw)',
|
|
737
|
+
setup: () => { },
|
|
738
|
+
params: {
|
|
739
|
+
file_path: 'relative/path.txt',
|
|
740
|
+
old_string: 'a',
|
|
741
|
+
new_string: 'b',
|
|
742
|
+
},
|
|
743
|
+
expectedError: null,
|
|
744
|
+
isAsyncTest: false,
|
|
745
|
+
},
|
|
746
|
+
{
|
|
747
|
+
name: 'FILE_WRITE_FAILURE on write error',
|
|
748
|
+
setup: (fp) => {
|
|
749
|
+
fs.writeFileSync(fp, 'content', 'utf8');
|
|
750
|
+
fs.chmodSync(fp, '444');
|
|
751
|
+
},
|
|
752
|
+
params: {
|
|
753
|
+
file_path: '',
|
|
754
|
+
old_string: 'content',
|
|
755
|
+
new_string: 'new content',
|
|
756
|
+
},
|
|
757
|
+
expectedError: ToolErrorType.FILE_WRITE_FAILURE,
|
|
758
|
+
isAsyncTest: true,
|
|
759
|
+
},
|
|
760
|
+
])('should return $name', async ({ setup, params, expectedError, isAsyncTest }) => {
|
|
761
|
+
const testParams = {
|
|
762
|
+
...params,
|
|
763
|
+
file_path: params.file_path || filePath,
|
|
764
|
+
};
|
|
765
|
+
setup(filePath);
|
|
766
|
+
if (!isAsyncTest) {
|
|
767
|
+
expect(() => tool.build(testParams)).not.toThrow();
|
|
768
|
+
}
|
|
769
|
+
else {
|
|
770
|
+
const invocation = tool.build(testParams);
|
|
771
|
+
const result = await invocation.execute(new AbortController().signal);
|
|
772
|
+
expect(result.error?.type).toBe(expectedError);
|
|
773
|
+
}
|
|
766
774
|
});
|
|
767
775
|
});
|
|
768
776
|
describe('getDescription', () => {
|
|
769
|
-
it(
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
const
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
const
|
|
805
|
-
|
|
806
|
-
old_string: 'this is a very long old string that will definitely be truncated',
|
|
807
|
-
new_string: 'this is a very long new string that will also be truncated',
|
|
808
|
-
};
|
|
809
|
-
const invocation = tool.build(params);
|
|
810
|
-
expect(invocation.getDescription()).toBe(`${testFileName}: this is a very long old string... => this is a very long new string...`);
|
|
777
|
+
it.each([
|
|
778
|
+
{
|
|
779
|
+
name: 'identical strings (no change)',
|
|
780
|
+
fileName: 'test.txt',
|
|
781
|
+
oldStr: 'identical_string',
|
|
782
|
+
newStr: 'identical_string',
|
|
783
|
+
expected: 'No file changes to test.txt',
|
|
784
|
+
},
|
|
785
|
+
{
|
|
786
|
+
name: 'different strings (full)',
|
|
787
|
+
fileName: 'test.txt',
|
|
788
|
+
oldStr: 'this is the old string value',
|
|
789
|
+
newStr: 'this is the new string value',
|
|
790
|
+
expected: 'test.txt: this is the old string value => this is the new string value',
|
|
791
|
+
},
|
|
792
|
+
{
|
|
793
|
+
name: 'very short strings',
|
|
794
|
+
fileName: 'short.txt',
|
|
795
|
+
oldStr: 'old',
|
|
796
|
+
newStr: 'new',
|
|
797
|
+
expected: 'short.txt: old => new',
|
|
798
|
+
},
|
|
799
|
+
{
|
|
800
|
+
name: 'long strings (truncated)',
|
|
801
|
+
fileName: 'long.txt',
|
|
802
|
+
oldStr: 'this is a very long old string that will definitely be truncated',
|
|
803
|
+
newStr: 'this is a very long new string that will also be truncated',
|
|
804
|
+
expected: 'long.txt: this is a very long old string... => this is a very long new string...',
|
|
805
|
+
},
|
|
806
|
+
])('should handle $name', ({ fileName, oldStr, newStr, expected }) => {
|
|
807
|
+
const params = {
|
|
808
|
+
file_path: path.join(rootDir, fileName),
|
|
809
|
+
old_string: oldStr,
|
|
810
|
+
new_string: newStr,
|
|
811
|
+
};
|
|
812
|
+
const invocation = tool.build(params);
|
|
813
|
+
expect(invocation.getDescription()).toBe(expected);
|
|
811
814
|
});
|
|
812
815
|
});
|
|
813
816
|
describe('workspace boundary validation', () => {
|