@google/gemini-cli-core 0.21.2 → 0.22.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 +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/src/agents/codebase-investigator.js +2 -2
- package/dist/src/agents/codebase-investigator.js.map +1 -1
- package/dist/src/agents/codebase-investigator.test.js +2 -2
- package/dist/src/agents/codebase-investigator.test.js.map +1 -1
- package/dist/src/agents/delegate-to-agent-tool.d.ts +19 -0
- package/dist/src/agents/delegate-to-agent-tool.js +111 -0
- package/dist/src/agents/delegate-to-agent-tool.js.map +1 -0
- package/dist/src/agents/delegate-to-agent-tool.test.d.ts +6 -0
- package/dist/src/agents/delegate-to-agent-tool.test.js +133 -0
- package/dist/src/agents/delegate-to-agent-tool.test.js.map +1 -0
- package/dist/src/agents/executor.js +1 -1
- package/dist/src/agents/executor.js.map +1 -1
- package/dist/src/agents/executor.test.js.map +1 -1
- package/dist/src/agents/registry.d.ts +15 -0
- package/dist/src/agents/registry.js +49 -17
- package/dist/src/agents/registry.js.map +1 -1
- package/dist/src/agents/registry.test.js +22 -33
- package/dist/src/agents/registry.test.js.map +1 -1
- package/dist/src/availability/policyCatalog.d.ts +0 -1
- package/dist/src/availability/policyCatalog.js +8 -6
- package/dist/src/availability/policyCatalog.js.map +1 -1
- package/dist/src/availability/policyCatalog.test.js +2 -2
- package/dist/src/availability/policyCatalog.test.js.map +1 -1
- package/dist/src/availability/policyHelpers.d.ts +2 -5
- package/dist/src/availability/policyHelpers.js +17 -30
- package/dist/src/availability/policyHelpers.js.map +1 -1
- package/dist/src/availability/policyHelpers.test.js +2 -30
- package/dist/src/availability/policyHelpers.test.js.map +1 -1
- package/dist/src/code_assist/experiments/client_metadata.js +2 -1
- package/dist/src/code_assist/experiments/client_metadata.js.map +1 -1
- package/dist/src/code_assist/experiments/client_metadata.test.js +7 -10
- package/dist/src/code_assist/experiments/client_metadata.test.js.map +1 -1
- package/dist/src/commands/init.d.ts +7 -0
- package/dist/src/commands/init.js +53 -0
- package/dist/src/commands/init.js.map +1 -0
- package/dist/src/commands/init.test.d.ts +6 -0
- package/dist/src/commands/init.test.js +25 -0
- package/dist/src/commands/init.test.js.map +1 -0
- package/dist/src/config/config.d.ts +0 -5
- package/dist/src/config/config.js +32 -76
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +36 -129
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/defaultModelConfigs.js +10 -11
- package/dist/src/config/defaultModelConfigs.js.map +1 -1
- package/dist/src/config/models.d.ts +17 -22
- package/dist/src/config/models.js +32 -64
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/config/models.test.js +89 -57
- package/dist/src/config/models.test.js.map +1 -1
- package/dist/src/confirmation-bus/message-bus.js.map +1 -1
- package/dist/src/confirmation-bus/types.d.ts +4 -0
- package/dist/src/core/baseLlmClient.d.ts +1 -3
- package/dist/src/core/baseLlmClient.js +1 -8
- package/dist/src/core/baseLlmClient.js.map +1 -1
- package/dist/src/core/baseLlmClient.test.js.map +1 -1
- package/dist/src/core/client.js +3 -4
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +1 -3
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.js +5 -3
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +29 -2
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.d.ts +1 -1
- package/dist/src/core/coreToolScheduler.js +72 -34
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +134 -37
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/geminiChat.js +23 -16
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +186 -40
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/geminiChat_network_retry.test.js +0 -2
- package/dist/src/core/geminiChat_network_retry.test.js.map +1 -1
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.js +4 -5
- package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
- package/dist/src/core/prompts.js +15 -12
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/prompts.test.js +14 -13
- package/dist/src/core/prompts.test.js.map +1 -1
- package/dist/src/core/turn.js +1 -1
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/fallback/handler.js +121 -54
- package/dist/src/fallback/handler.js.map +1 -1
- package/dist/src/fallback/handler.test.js +266 -82
- package/dist/src/fallback/handler.test.js.map +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/hooks/hookEventHandler.js +6 -1
- package/dist/src/hooks/hookEventHandler.js.map +1 -1
- package/dist/src/hooks/hookEventHandler.test.js +8 -1
- package/dist/src/hooks/hookEventHandler.test.js.map +1 -1
- package/dist/src/hooks/hookRegistry.d.ts +0 -7
- package/dist/src/hooks/hookRegistry.js +0 -20
- package/dist/src/hooks/hookRegistry.js.map +1 -1
- package/dist/src/hooks/hookRegistry.test.js +1 -7
- package/dist/src/hooks/hookRegistry.test.js.map +1 -1
- package/dist/src/hooks/hookRunner.test.js +1 -1
- package/dist/src/hooks/hookRunner.test.js.map +1 -1
- package/dist/src/hooks/hookSystem.d.ts +0 -8
- package/dist/src/hooks/hookSystem.js +0 -18
- package/dist/src/hooks/hookSystem.js.map +1 -1
- package/dist/src/hooks/hookSystem.test.js +2 -21
- package/dist/src/hooks/hookSystem.test.js.map +1 -1
- package/dist/src/ide/detect-ide.test.js +32 -1
- package/dist/src/ide/detect-ide.test.js.map +1 -1
- package/dist/src/ide/ide-installer.test.js +1 -1
- package/dist/src/ide/ide-installer.test.js.map +1 -1
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.js +3 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/oauth-provider.js.map +1 -1
- package/dist/src/output/json-formatter.test.js +2 -0
- package/dist/src/output/json-formatter.test.js.map +1 -1
- package/dist/src/output/stream-json-formatter.js +6 -0
- package/dist/src/output/stream-json-formatter.js.map +1 -1
- package/dist/src/output/stream-json-formatter.test.js +98 -100
- package/dist/src/output/stream-json-formatter.test.js.map +1 -1
- package/dist/src/output/types.d.ts +2 -0
- package/dist/src/policy/config.js +71 -2
- package/dist/src/policy/config.js.map +1 -1
- package/dist/src/policy/persistence.test.d.ts +6 -0
- package/dist/src/policy/persistence.test.js +149 -0
- package/dist/src/policy/persistence.test.js.map +1 -0
- package/dist/src/policy/policies/agent.toml +31 -0
- package/dist/src/policy/policy-engine.js +55 -1
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/policy/shell-safety.test.d.ts +6 -0
- package/dist/src/policy/shell-safety.test.js +74 -0
- package/dist/src/policy/shell-safety.test.js.map +1 -0
- package/dist/src/policy/toml-loader.d.ts +8 -0
- package/dist/src/policy/toml-loader.js +3 -3
- package/dist/src/policy/toml-loader.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.js +21 -10
- package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
- package/dist/src/routing/strategies/classifierStrategy.test.js +1 -2
- package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/fallbackStrategy.js +12 -23
- package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -1
- package/dist/src/routing/strategies/fallbackStrategy.test.js +39 -69
- package/dist/src/routing/strategies/fallbackStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/overrideStrategy.js +3 -4
- package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
- package/dist/src/safety/checker-runner.js +17 -6
- package/dist/src/safety/checker-runner.js.map +1 -1
- package/dist/src/services/chatCompressionService.js +1 -3
- package/dist/src/services/chatCompressionService.js.map +1 -1
- package/dist/src/services/chatRecordingService.d.ts +5 -0
- package/dist/src/services/chatRecordingService.js +7 -0
- package/dist/src/services/chatRecordingService.js.map +1 -1
- package/dist/src/services/fileSystemService.d.ts +0 -9
- package/dist/src/services/fileSystemService.js +0 -11
- package/dist/src/services/fileSystemService.js.map +1 -1
- package/dist/src/services/loopDetectionService.js +2 -2
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/modelConfig.golden.test.js +32 -0
- package/dist/src/services/modelConfig.golden.test.js.map +1 -1
- package/dist/src/services/modelConfigService.d.ts +3 -0
- package/dist/src/services/modelConfigService.js +3 -2
- package/dist/src/services/modelConfigService.js.map +1 -1
- package/dist/src/services/modelConfigService.test.js +110 -0
- package/dist/src/services/modelConfigService.test.js.map +1 -1
- package/dist/src/services/shellExecutionService.js +1 -2
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +6 -3
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/services/test-data/resolved-aliases-retry.golden.json +222 -0
- package/dist/src/services/test-data/resolved-aliases.golden.json +0 -16
- package/dist/src/telemetry/activity-detector.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +5 -5
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +18 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
- package/dist/src/telemetry/config.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +5 -5
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/metrics.test.js.map +1 -1
- package/dist/src/telemetry/startupProfiler.test.js +1 -2
- package/dist/src/telemetry/startupProfiler.test.js.map +1 -1
- package/dist/src/telemetry/trace.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +10 -5
- package/dist/src/telemetry/types.js +16 -8
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.d.ts +1 -0
- package/dist/src/telemetry/uiTelemetry.js +2 -0
- package/dist/src/telemetry/uiTelemetry.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.test.js +4 -0
- package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
- package/dist/src/test-utils/mock-message-bus.js.map +1 -1
- package/dist/src/tools/edit.js +1 -0
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/mcp-tool.js +13 -0
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +25 -0
- package/dist/src/tools/mcp-tool.test.js.map +1 -1
- package/dist/src/tools/memoryTool.js +1 -0
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/modifiable-tool.js.map +1 -1
- package/dist/src/tools/read-file.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +2 -1
- package/dist/src/tools/shell.js +9 -1
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +2 -1
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/smart-edit.js +1 -0
- package/dist/src/tools/smart-edit.js.map +1 -1
- package/dist/src/tools/smart-edit.test.js.map +1 -1
- package/dist/src/tools/tool-names.d.ts +1 -0
- package/dist/src/tools/tool-names.js +1 -0
- package/dist/src/tools/tool-names.js.map +1 -1
- package/dist/src/tools/tools.d.ts +19 -0
- package/dist/src/tools/tools.js +28 -9
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/web-fetch.js +1 -0
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/write-file.js +1 -0
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/utils/bfsFileSearch.d.ts +8 -0
- package/dist/src/utils/bfsFileSearch.js +63 -23
- package/dist/src/utils/bfsFileSearch.js.map +1 -1
- package/dist/src/utils/bfsFileSearch.test.js +65 -1
- package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
- package/dist/src/utils/checkpointUtils.js.map +1 -1
- package/dist/src/utils/extensionLoader.d.ts +2 -2
- package/dist/src/utils/extensionLoader.js +5 -6
- package/dist/src/utils/extensionLoader.js.map +1 -1
- package/dist/src/utils/extensionLoader.test.js +11 -0
- package/dist/src/utils/extensionLoader.test.js.map +1 -1
- package/dist/src/utils/filesearch/crawlCache.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
- package/dist/src/utils/flashFallback.test.js +1 -1
- package/dist/src/utils/flashFallback.test.js.map +1 -1
- package/dist/src/utils/pathCorrector.js +12 -2
- package/dist/src/utils/pathCorrector.js.map +1 -1
- package/dist/src/utils/pathCorrector.test.js +6 -2
- package/dist/src/utils/pathCorrector.test.js.map +1 -1
- package/dist/src/utils/retry.js +16 -2
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js +22 -7
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/src/utils/shell-permissions.d.ts +52 -0
- package/dist/src/utils/shell-permissions.js +188 -0
- package/dist/src/utils/shell-permissions.js.map +1 -0
- package/dist/src/utils/shell-permissions.test.d.ts +6 -0
- package/dist/src/utils/shell-permissions.test.js +342 -0
- package/dist/src/utils/shell-permissions.test.js.map +1 -0
- package/dist/src/utils/shell-utils.d.ts +10 -47
- package/dist/src/utils/shell-utils.js +1 -182
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/shell-utils.test.js +1 -288
- package/dist/src/utils/shell-utils.test.js.map +1 -1
- package/dist/src/utils/tool-utils.js.map +1 -1
- package/dist/src/utils/version.d.ts +6 -0
- package/dist/src/utils/version.js +15 -0
- package/dist/src/utils/version.js.map +1 -0
- package/dist/src/utils/version.test.d.ts +6 -0
- package/dist/src/utils/version.test.js +39 -0
- package/dist/src/utils/version.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -1
- package/dist/google-gemini-cli-core-0.21.1.tgz +0 -0
|
@@ -3,33 +3,26 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { createDefaultPolicy,
|
|
7
|
-
import { DEFAULT_GEMINI_MODEL,
|
|
6
|
+
import { createDefaultPolicy, getModelPolicyChain } from './policyCatalog.js';
|
|
7
|
+
import { DEFAULT_GEMINI_MODEL, getEffectiveModel } from '../config/models.js';
|
|
8
8
|
/**
|
|
9
9
|
* Resolves the active policy chain for the given config, ensuring the
|
|
10
10
|
* user-selected active model is represented.
|
|
11
11
|
*/
|
|
12
|
-
export function resolvePolicyChain(config, preferredModel
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
chain = createSingleModelChain(modelFromConfig);
|
|
12
|
+
export function resolvePolicyChain(config, preferredModel) {
|
|
13
|
+
const chain = getModelPolicyChain({
|
|
14
|
+
previewEnabled: !!config.getPreviewFeatures(),
|
|
15
|
+
userTier: config.getUserTier(),
|
|
16
|
+
});
|
|
17
|
+
// TODO: This will be replaced when we get rid of Fallback Modes.
|
|
18
|
+
// Switch to getActiveModel()
|
|
19
|
+
const activeModel = preferredModel ??
|
|
20
|
+
getEffectiveModel(config.isInFallbackMode(), config.getModel(), config.getPreviewFeatures());
|
|
21
|
+
if (activeModel === 'auto') {
|
|
22
|
+
return [...chain];
|
|
26
23
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if (activeIndex !== -1) {
|
|
30
|
-
return wrapsAround
|
|
31
|
-
? [...chain.slice(activeIndex), ...chain.slice(0, activeIndex)]
|
|
32
|
-
: [...chain.slice(activeIndex)];
|
|
24
|
+
if (chain.some((policy) => policy.model === activeModel)) {
|
|
25
|
+
return [...chain];
|
|
33
26
|
}
|
|
34
27
|
// If the user specified a model not in the default chain, we assume they want
|
|
35
28
|
// *only* that model. We do not fallback to the default chain.
|
|
@@ -38,23 +31,17 @@ export function resolvePolicyChain(config, preferredModel, wrapsAround = false)
|
|
|
38
31
|
/**
|
|
39
32
|
* Produces the failed policy (if it exists in the chain) and the list of
|
|
40
33
|
* fallback candidates that follow it.
|
|
41
|
-
* @param chain - The ordered list of available model policies.
|
|
42
|
-
* @param failedModel - The identifier of the model that failed.
|
|
43
|
-
* @param wrapsAround - If true, treats the chain as a circular buffer.
|
|
44
34
|
*/
|
|
45
|
-
export function buildFallbackPolicyContext(chain, failedModel
|
|
35
|
+
export function buildFallbackPolicyContext(chain, failedModel) {
|
|
46
36
|
const index = chain.findIndex((policy) => policy.model === failedModel);
|
|
47
37
|
if (index === -1) {
|
|
48
38
|
return { failedPolicy: undefined, candidates: chain };
|
|
49
39
|
}
|
|
50
40
|
// Return [candidates_after, candidates_before] to prioritize downgrades
|
|
51
41
|
// (continuing the chain) before wrapping around to upgrades.
|
|
52
|
-
const candidates = wrapsAround
|
|
53
|
-
? [...chain.slice(index + 1), ...chain.slice(0, index)]
|
|
54
|
-
: [...chain.slice(index + 1)];
|
|
55
42
|
return {
|
|
56
43
|
failedPolicy: chain[index],
|
|
57
|
-
candidates,
|
|
44
|
+
candidates: [...chain.slice(index + 1), ...chain.slice(0, index)],
|
|
58
45
|
};
|
|
59
46
|
}
|
|
60
47
|
export function resolvePolicyAction(failureKind, policy) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policyHelpers.js","sourceRoot":"","sources":["../../../src/availability/policyHelpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,
|
|
1
|
+
{"version":3,"file":"policyHelpers.js","sourceRoot":"","sources":["../../../src/availability/policyHelpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
7
7
|
import { resolvePolicyChain, buildFallbackPolicyContext, applyModelSelection, } from './policyHelpers.js';
|
|
8
8
|
import { createDefaultPolicy } from './policyCatalog.js';
|
|
9
|
-
import { DEFAULT_GEMINI_MODEL_AUTO } from '../config/models.js';
|
|
10
9
|
const createMockConfig = (overrides = {}) => ({
|
|
11
10
|
getPreviewFeatures: () => false,
|
|
12
11
|
getUserTier: () => undefined,
|
|
@@ -16,7 +15,7 @@ const createMockConfig = (overrides = {}) => ({
|
|
|
16
15
|
});
|
|
17
16
|
describe('policyHelpers', () => {
|
|
18
17
|
describe('resolvePolicyChain', () => {
|
|
19
|
-
it('
|
|
18
|
+
it('inserts the active model when missing from the catalog', () => {
|
|
20
19
|
const config = createMockConfig({
|
|
21
20
|
getModel: () => 'custom-model',
|
|
22
21
|
});
|
|
@@ -33,7 +32,7 @@ describe('policyHelpers', () => {
|
|
|
33
32
|
});
|
|
34
33
|
it('returns the default chain when active model is "auto"', () => {
|
|
35
34
|
const config = createMockConfig({
|
|
36
|
-
getModel: () =>
|
|
35
|
+
getModel: () => 'auto',
|
|
37
36
|
});
|
|
38
37
|
const chain = resolvePolicyChain(config);
|
|
39
38
|
// Expect default chain [Pro, Flash]
|
|
@@ -41,23 +40,6 @@ describe('policyHelpers', () => {
|
|
|
41
40
|
expect(chain[0]?.model).toBe('gemini-2.5-pro');
|
|
42
41
|
expect(chain[1]?.model).toBe('gemini-2.5-flash');
|
|
43
42
|
});
|
|
44
|
-
it('starts chain from preferredModel when model is "auto"', () => {
|
|
45
|
-
const config = createMockConfig({
|
|
46
|
-
getModel: () => DEFAULT_GEMINI_MODEL_AUTO,
|
|
47
|
-
});
|
|
48
|
-
const chain = resolvePolicyChain(config, 'gemini-2.5-flash');
|
|
49
|
-
expect(chain).toHaveLength(1);
|
|
50
|
-
expect(chain[0]?.model).toBe('gemini-2.5-flash');
|
|
51
|
-
});
|
|
52
|
-
it('wraps around the chain when wrapsAround is true', () => {
|
|
53
|
-
const config = createMockConfig({
|
|
54
|
-
getModel: () => DEFAULT_GEMINI_MODEL_AUTO,
|
|
55
|
-
});
|
|
56
|
-
const chain = resolvePolicyChain(config, 'gemini-2.5-flash', true);
|
|
57
|
-
expect(chain).toHaveLength(2);
|
|
58
|
-
expect(chain[0]?.model).toBe('gemini-2.5-flash');
|
|
59
|
-
expect(chain[1]?.model).toBe('gemini-2.5-pro');
|
|
60
|
-
});
|
|
61
43
|
});
|
|
62
44
|
describe('buildFallbackPolicyContext', () => {
|
|
63
45
|
it('returns remaining candidates after the failed model', () => {
|
|
@@ -68,16 +50,6 @@ describe('policyHelpers', () => {
|
|
|
68
50
|
];
|
|
69
51
|
const context = buildFallbackPolicyContext(chain, 'b');
|
|
70
52
|
expect(context.failedPolicy?.model).toBe('b');
|
|
71
|
-
expect(context.candidates.map((p) => p.model)).toEqual(['c']);
|
|
72
|
-
});
|
|
73
|
-
it('wraps around when building fallback context if wrapsAround is true', () => {
|
|
74
|
-
const chain = [
|
|
75
|
-
createDefaultPolicy('a'),
|
|
76
|
-
createDefaultPolicy('b'),
|
|
77
|
-
createDefaultPolicy('c'),
|
|
78
|
-
];
|
|
79
|
-
const context = buildFallbackPolicyContext(chain, 'b', true);
|
|
80
|
-
expect(context.failedPolicy?.model).toBe('b');
|
|
81
53
|
expect(context.candidates.map((p) => p.model)).toEqual(['c', 'a']);
|
|
82
54
|
});
|
|
83
55
|
it('returns full chain when model is not in policy list', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policyHelpers.test.js","sourceRoot":"","sources":["../../../src/availability/policyHelpers.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"policyHelpers.test.js","sourceRoot":"","sources":["../../../src/availability/policyHelpers.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import { getReleaseChannel } from '../../utils/channel.js';
|
|
7
7
|
import { fileURLToPath } from 'node:url';
|
|
8
8
|
import path from 'node:path';
|
|
9
|
+
import { getVersion } from '../../utils/version.js';
|
|
9
10
|
const __filename = fileURLToPath(import.meta.url);
|
|
10
11
|
const __dirname = path.dirname(__filename);
|
|
11
12
|
// Cache all client metadata.
|
|
@@ -40,7 +41,7 @@ export async function getClientMetadata() {
|
|
|
40
41
|
clientMetadataPromise = (async () => ({
|
|
41
42
|
ideName: 'IDE_UNSPECIFIED',
|
|
42
43
|
pluginType: 'GEMINI',
|
|
43
|
-
ideVersion:
|
|
44
|
+
ideVersion: await getVersion(),
|
|
44
45
|
platform: getPlatform(),
|
|
45
46
|
updateChannel: await getReleaseChannel(__dirname),
|
|
46
47
|
}))();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client_metadata.js","sourceRoot":"","sources":["../../../../src/code_assist/experiments/client_metadata.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"client_metadata.js","sourceRoot":"","sources":["../../../../src/code_assist/experiments/client_metadata.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,6BAA6B;AAC7B,IAAI,qBAA0D,CAAC;AAE/D,SAAS,WAAW;IAClB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAE1B,IAAI,QAAQ,KAAK,QAAQ,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QAC5C,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,IAAI,QAAQ,KAAK,QAAQ,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QAC9C,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QAC3C,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7C,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QAC3C,OAAO,eAAe,CAAC;IACzB,CAAC;IACD,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,qBAAqB,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YACpC,OAAO,EAAE,iBAAiB;YAC1B,UAAU,EAAE,QAAQ;YACpB,UAAU,EAAE,MAAM,UAAU,EAAE;YAC9B,QAAQ,EAAE,WAAW,EAAE;YACvB,aAAa,EAAE,MAAM,iBAAiB,CAAC,SAAS,CAAC;SAClD,CAAC,CAAC,EAAE,CAAC;IACR,CAAC;IACD,OAAO,qBAAqB,CAAC;AAC/B,CAAC"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
7
|
import { ReleaseChannel, getReleaseChannel } from '../../utils/channel.js';
|
|
8
|
+
import { getVersion } from '../../utils/version.js';
|
|
8
9
|
// Mock dependencies before importing the module under test
|
|
9
10
|
vi.mock('../../utils/channel.js', async () => {
|
|
10
11
|
const actual = await vi.importActual('../../utils/channel.js');
|
|
@@ -13,6 +14,9 @@ vi.mock('../../utils/channel.js', async () => {
|
|
|
13
14
|
getReleaseChannel: vi.fn(),
|
|
14
15
|
};
|
|
15
16
|
});
|
|
17
|
+
vi.mock('../../utils/version.js', async () => ({
|
|
18
|
+
getVersion: vi.fn(),
|
|
19
|
+
}));
|
|
16
20
|
describe('client_metadata', () => {
|
|
17
21
|
const originalPlatform = process.platform;
|
|
18
22
|
const originalArch = process.arch;
|
|
@@ -25,6 +29,7 @@ describe('client_metadata', () => {
|
|
|
25
29
|
await import('./client_metadata.js');
|
|
26
30
|
// Provide a default mock implementation for each test
|
|
27
31
|
vi.mocked(getReleaseChannel).mockResolvedValue(ReleaseChannel.STABLE);
|
|
32
|
+
vi.mocked(getVersion).mockResolvedValue('0.0.0');
|
|
28
33
|
});
|
|
29
34
|
afterEach(() => {
|
|
30
35
|
// Restore original process properties to avoid side-effects between tests
|
|
@@ -55,20 +60,12 @@ describe('client_metadata', () => {
|
|
|
55
60
|
}
|
|
56
61
|
});
|
|
57
62
|
describe('getClientMetadata', () => {
|
|
58
|
-
it('should use
|
|
59
|
-
|
|
60
|
-
Object.defineProperty(process, 'version', { value: 'v18.0.0' });
|
|
63
|
+
it('should use version from getCliVersion for ideVersion', async () => {
|
|
64
|
+
vi.mocked(getVersion).mockResolvedValue('1.2.3');
|
|
61
65
|
const { getClientMetadata } = await import('./client_metadata.js');
|
|
62
66
|
const metadata = await getClientMetadata();
|
|
63
67
|
expect(metadata.ideVersion).toBe('1.2.3');
|
|
64
68
|
});
|
|
65
|
-
it('should use process.version for ideVersion as a fallback', async () => {
|
|
66
|
-
delete process.env['CLI_VERSION'];
|
|
67
|
-
Object.defineProperty(process, 'version', { value: 'v20.0.0' });
|
|
68
|
-
const { getClientMetadata } = await import('./client_metadata.js');
|
|
69
|
-
const metadata = await getClientMetadata();
|
|
70
|
-
expect(metadata.ideVersion).toBe('v20.0.0');
|
|
71
|
-
});
|
|
72
69
|
it('should call getReleaseChannel to get the update channel', async () => {
|
|
73
70
|
vi.mocked(getReleaseChannel).mockResolvedValue(ReleaseChannel.NIGHTLY);
|
|
74
71
|
const { getClientMetadata } = await import('./client_metadata.js');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client_metadata.test.js","sourceRoot":"","sources":["../../../../src/code_assist/experiments/client_metadata.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"client_metadata.test.js","sourceRoot":"","sources":["../../../../src/code_assist/experiments/client_metadata.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
export function performInit(doesGeminiMdExist) {
|
|
7
|
+
if (doesGeminiMdExist) {
|
|
8
|
+
return {
|
|
9
|
+
type: 'message',
|
|
10
|
+
messageType: 'info',
|
|
11
|
+
content: 'A GEMINI.md file already exists in this directory. No changes were made.',
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
type: 'submit_prompt',
|
|
16
|
+
content: `
|
|
17
|
+
You are an AI agent that brings the power of Gemini directly into the terminal. Your task is to analyze the current directory and generate a comprehensive GEMINI.md file to be used as instructional context for future interactions.
|
|
18
|
+
|
|
19
|
+
**Analysis Process:**
|
|
20
|
+
|
|
21
|
+
1. **Initial Exploration:**
|
|
22
|
+
* Start by listing the files and directories to get a high-level overview of the structure.
|
|
23
|
+
* Read the README file (e.g., \`README.md\`, \`README.txt\`) if it exists. This is often the best place to start.
|
|
24
|
+
|
|
25
|
+
2. **Iterative Deep Dive (up to 10 files):**
|
|
26
|
+
* Based on your initial findings, select a few files that seem most important (e.g., configuration files, main source files, documentation).
|
|
27
|
+
* Read them. As you learn more, refine your understanding and decide which files to read next. You don't need to decide all 10 files at once. Let your discoveries guide your exploration.
|
|
28
|
+
|
|
29
|
+
3. **Identify Project Type:**
|
|
30
|
+
* **Code Project:** Look for clues like \`package.json\`, \`requirements.txt\`, \`pom.xml\`, \`go.mod\`, \`Cargo.toml\`, \`build.gradle\`, or a \`src\` directory. If you find them, this is likely a software project.
|
|
31
|
+
* **Non-Code Project:** If you don't find code-related files, this might be a directory for documentation, research papers, notes, or something else.
|
|
32
|
+
|
|
33
|
+
**GEMINI.md Content Generation:**
|
|
34
|
+
|
|
35
|
+
**For a Code Project:**
|
|
36
|
+
|
|
37
|
+
* **Project Overview:** Write a clear and concise summary of the project's purpose, main technologies, and architecture.
|
|
38
|
+
* **Building and Running:** Document the key commands for building, running, and testing the project. Infer these from the files you've read (e.g., \`scripts\` in \`package.json\`, \`Makefile\`, etc.). If you can't find explicit commands, provide a placeholder with a TODO.
|
|
39
|
+
* **Development Conventions:** Describe any coding styles, testing practices, or contribution guidelines you can infer from the codebase.
|
|
40
|
+
|
|
41
|
+
**For a Non-Code Project:**
|
|
42
|
+
|
|
43
|
+
* **Directory Overview:** Describe the purpose and contents of the directory. What is it for? What kind of information does it hold?
|
|
44
|
+
* **Key Files:** List the most important files and briefly explain what they contain.
|
|
45
|
+
* **Usage:** Explain how the contents of this directory are intended to be used.
|
|
46
|
+
|
|
47
|
+
**Final Output:**
|
|
48
|
+
|
|
49
|
+
Write the complete content to the \`GEMINI.md\` file. The output must be well-formatted Markdown.
|
|
50
|
+
`,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,UAAU,WAAW,CAAC,iBAA0B;IACpD,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO;YACL,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,MAAM;YACnB,OAAO,EACL,0EAA0E;SAC7E,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCZ;KACE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { expect, describe, it } from 'vitest';
|
|
7
|
+
import { performInit } from './init.js';
|
|
8
|
+
describe('performInit', () => {
|
|
9
|
+
it('returns info if GEMINI.md already exists', () => {
|
|
10
|
+
const result = performInit(true);
|
|
11
|
+
expect(result.type).toBe('message');
|
|
12
|
+
if (result.type === 'message') {
|
|
13
|
+
expect(result.messageType).toBe('info');
|
|
14
|
+
expect(result.content).toContain('already exists');
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
it('returns submit_prompt if GEMINI.md does not exist', () => {
|
|
18
|
+
const result = performInit(false);
|
|
19
|
+
expect(result.type).toBe('submit_prompt');
|
|
20
|
+
if (result.type === 'submit_prompt') {
|
|
21
|
+
expect(result.content).toContain('You are an AI agent');
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=init.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../../src/commands/init.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAEjC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAE1C,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -36,7 +36,6 @@ import { PolicyEngine } from '../policy/policy-engine.js';
|
|
|
36
36
|
import type { PolicyEngineConfig } from '../policy/types.js';
|
|
37
37
|
import { HookSystem } from '../hooks/index.js';
|
|
38
38
|
import type { UserTierId } from '../code_assist/types.js';
|
|
39
|
-
import type { RetrieveUserQuotaResponse } from '../code_assist/types.js';
|
|
40
39
|
import type { Experiments } from '../code_assist/experiments/experiments.js';
|
|
41
40
|
import { AgentRegistry } from '../agents/registry.js';
|
|
42
41
|
import { ApprovalMode } from '../policy/types.js';
|
|
@@ -280,7 +279,6 @@ export declare class Config {
|
|
|
280
279
|
private readonly bugCommand;
|
|
281
280
|
private model;
|
|
282
281
|
private previewFeatures;
|
|
283
|
-
private hasAccessToPreviewModel;
|
|
284
282
|
private readonly noBrowser;
|
|
285
283
|
private readonly folderTrust;
|
|
286
284
|
private ideMode;
|
|
@@ -393,9 +391,6 @@ export declare class Config {
|
|
|
393
391
|
getQuestion(): string | undefined;
|
|
394
392
|
getPreviewFeatures(): boolean | undefined;
|
|
395
393
|
setPreviewFeatures(previewFeatures: boolean): void;
|
|
396
|
-
getHasAccessToPreviewModel(): boolean;
|
|
397
|
-
setHasAccessToPreviewModel(hasAccess: boolean): void;
|
|
398
|
-
refreshUserQuota(): Promise<RetrieveUserQuotaResponse | undefined>;
|
|
399
394
|
getCoreTools(): string[] | undefined;
|
|
400
395
|
getAllowedTools(): string[] | undefined;
|
|
401
396
|
/**
|
|
@@ -29,7 +29,7 @@ import { GitService } from '../services/gitService.js';
|
|
|
29
29
|
import { initializeTelemetry, DEFAULT_TELEMETRY_TARGET, DEFAULT_OTLP_ENDPOINT, uiTelemetryService, } from '../telemetry/index.js';
|
|
30
30
|
import { coreEvents } from '../utils/events.js';
|
|
31
31
|
import { tokenLimit } from '../core/tokenLimits.js';
|
|
32
|
-
import { DEFAULT_GEMINI_EMBEDDING_MODEL, DEFAULT_GEMINI_FLASH_MODEL,
|
|
32
|
+
import { DEFAULT_GEMINI_EMBEDDING_MODEL, DEFAULT_GEMINI_FLASH_MODEL, DEFAULT_THINKING_MODE, } from './models.js';
|
|
33
33
|
import { shouldAttemptBrowserLaunch } from '../utils/browser.js';
|
|
34
34
|
import { ideContextStore } from '../ide/ideContext.js';
|
|
35
35
|
import { WriteTodosTool } from '../tools/write-todos.js';
|
|
@@ -51,7 +51,8 @@ import { HookSystem } from '../hooks/index.js';
|
|
|
51
51
|
import { getCodeAssistServer } from '../code_assist/codeAssist.js';
|
|
52
52
|
import { AgentRegistry } from '../agents/registry.js';
|
|
53
53
|
import { setGlobalProxy } from '../utils/fetch.js';
|
|
54
|
-
import {
|
|
54
|
+
import { DelegateToAgentTool } from '../agents/delegate-to-agent-tool.js';
|
|
55
|
+
import { DELEGATE_TO_AGENT_TOOL_NAME } from '../tools/tool-names.js';
|
|
55
56
|
import { getExperiments } from '../code_assist/experiments/experiments.js';
|
|
56
57
|
import { ExperimentFlags } from '../code_assist/experiments/flagNames.js';
|
|
57
58
|
import { debugLogger } from '../utils/debugLogger.js';
|
|
@@ -183,7 +184,6 @@ export class Config {
|
|
|
183
184
|
bugCommand;
|
|
184
185
|
model;
|
|
185
186
|
previewFeatures;
|
|
186
|
-
hasAccessToPreviewModel = false;
|
|
187
187
|
noBrowser;
|
|
188
188
|
folderTrust;
|
|
189
189
|
ideMode;
|
|
@@ -300,7 +300,8 @@ export class Config {
|
|
|
300
300
|
this.bugCommand = params.bugCommand;
|
|
301
301
|
this.model = params.model;
|
|
302
302
|
this._activeModel = params.model;
|
|
303
|
-
this.enableModelAvailabilityService =
|
|
303
|
+
this.enableModelAvailabilityService =
|
|
304
|
+
params.enableModelAvailabilityService ?? false;
|
|
304
305
|
this.enableAgents = params.enableAgents ?? false;
|
|
305
306
|
this.experimentalJitContext = params.experimentalJitContext ?? false;
|
|
306
307
|
this.modelAvailabilityService = new ModelAvailabilityService();
|
|
@@ -342,10 +343,7 @@ export class Config {
|
|
|
342
343
|
params.truncateToolOutputLines ?? DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES;
|
|
343
344
|
this.enableToolOutputTruncation = params.enableToolOutputTruncation ?? true;
|
|
344
345
|
this.useSmartEdit = params.useSmartEdit ?? true;
|
|
345
|
-
|
|
346
|
-
this.useWriteTodos = isPreviewModel(this.model)
|
|
347
|
-
? false
|
|
348
|
-
: (params.useWriteTodos ?? true);
|
|
346
|
+
this.useWriteTodos = params.useWriteTodos ?? true;
|
|
349
347
|
this.enableHooks = params.enableHooks ?? false;
|
|
350
348
|
this.disabledHooks =
|
|
351
349
|
(params.hooks && 'disabled' in params.hooks
|
|
@@ -415,11 +413,19 @@ export class Config {
|
|
|
415
413
|
// TODO(12593): Fix the settings loading logic to properly merge defaults and
|
|
416
414
|
// remove this hack.
|
|
417
415
|
let modelConfigServiceConfig = params.modelConfigServiceConfig;
|
|
418
|
-
if (modelConfigServiceConfig
|
|
419
|
-
modelConfigServiceConfig
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
416
|
+
if (modelConfigServiceConfig) {
|
|
417
|
+
if (!modelConfigServiceConfig.aliases) {
|
|
418
|
+
modelConfigServiceConfig = {
|
|
419
|
+
...modelConfigServiceConfig,
|
|
420
|
+
aliases: DEFAULT_MODEL_CONFIGS.aliases,
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
if (!modelConfigServiceConfig.overrides) {
|
|
424
|
+
modelConfigServiceConfig = {
|
|
425
|
+
...modelConfigServiceConfig,
|
|
426
|
+
overrides: DEFAULT_MODEL_CONFIGS.overrides,
|
|
427
|
+
};
|
|
428
|
+
}
|
|
423
429
|
}
|
|
424
430
|
this.modelConfigService = new ModelConfigService(modelConfigServiceConfig ?? DEFAULT_MODEL_CONFIGS);
|
|
425
431
|
}
|
|
@@ -473,24 +479,20 @@ export class Config {
|
|
|
473
479
|
// Restore the conversation history to the new client
|
|
474
480
|
this.geminiClient.stripThoughtsFromHistory();
|
|
475
481
|
}
|
|
476
|
-
// Reset availability status when switching auth (e.g. from limited key to OAuth)
|
|
477
|
-
this.modelAvailabilityService.reset();
|
|
478
482
|
const newContentGeneratorConfig = await createContentGeneratorConfig(this, authMethod);
|
|
479
483
|
this.contentGenerator = await createContentGenerator(newContentGeneratorConfig, this, this.getSessionId());
|
|
480
484
|
// Only assign to instance properties after successful initialization
|
|
481
485
|
this.contentGeneratorConfig = newContentGeneratorConfig;
|
|
482
486
|
// Initialize BaseLlmClient now that the ContentGenerator is available
|
|
483
487
|
this.baseLlmClient = new BaseLlmClient(this.contentGenerator, this);
|
|
488
|
+
const previewFeatures = this.getPreviewFeatures();
|
|
484
489
|
const codeAssistServer = getCodeAssistServer(this);
|
|
485
490
|
if (codeAssistServer) {
|
|
486
|
-
if (codeAssistServer.projectId) {
|
|
487
|
-
await this.refreshUserQuota();
|
|
488
|
-
}
|
|
489
491
|
this.experimentsPromise = getExperiments(codeAssistServer)
|
|
490
492
|
.then((experiments) => {
|
|
491
493
|
this.setExperiments(experiments);
|
|
492
494
|
// If preview features have not been set and the user authenticated through Google, we enable preview based on remote config only if it's true
|
|
493
|
-
if (
|
|
495
|
+
if (previewFeatures === undefined) {
|
|
494
496
|
const remotePreviewFeatures = experiments.flags[ExperimentFlags.ENABLE_PREVIEW]?.boolValue;
|
|
495
497
|
if (remotePreviewFeatures === true) {
|
|
496
498
|
this.setPreviewFeatures(remotePreviewFeatures);
|
|
@@ -505,17 +507,8 @@ export class Config {
|
|
|
505
507
|
this.experiments = undefined;
|
|
506
508
|
this.experimentsPromise = undefined;
|
|
507
509
|
}
|
|
508
|
-
const authType = this.contentGeneratorConfig.authType;
|
|
509
|
-
if (authType === AuthType.USE_GEMINI ||
|
|
510
|
-
authType === AuthType.USE_VERTEX_AI) {
|
|
511
|
-
this.setHasAccessToPreviewModel(true);
|
|
512
|
-
}
|
|
513
510
|
// Reset the session flag since we're explicitly changing auth and using default model
|
|
514
511
|
this.inFallbackMode = false;
|
|
515
|
-
// Update model if user no longer has access to the preview model
|
|
516
|
-
if (!this.hasAccessToPreviewModel && isPreviewModel(this.model)) {
|
|
517
|
-
this.setModel(DEFAULT_GEMINI_MODEL_AUTO);
|
|
518
|
-
}
|
|
519
512
|
}
|
|
520
513
|
async getExperimentsAsync() {
|
|
521
514
|
if (this.experiments) {
|
|
@@ -582,6 +575,7 @@ export class Config {
|
|
|
582
575
|
setActiveModel(model) {
|
|
583
576
|
if (this._activeModel !== model) {
|
|
584
577
|
this._activeModel = model;
|
|
578
|
+
coreEvents.emitModelChanged(model);
|
|
585
579
|
}
|
|
586
580
|
}
|
|
587
581
|
resetTurn() {
|
|
@@ -665,44 +659,7 @@ export class Config {
|
|
|
665
659
|
return this.previewFeatures;
|
|
666
660
|
}
|
|
667
661
|
setPreviewFeatures(previewFeatures) {
|
|
668
|
-
// No change in state, no action needed
|
|
669
|
-
if (this.previewFeatures === previewFeatures) {
|
|
670
|
-
return;
|
|
671
|
-
}
|
|
672
662
|
this.previewFeatures = previewFeatures;
|
|
673
|
-
const currentModel = this.getModel();
|
|
674
|
-
// Case 1: Disabling preview features while on a preview model
|
|
675
|
-
if (!previewFeatures && isPreviewModel(currentModel)) {
|
|
676
|
-
this.setModel(DEFAULT_GEMINI_MODEL_AUTO);
|
|
677
|
-
}
|
|
678
|
-
// Case 2: Enabling preview features while on the default auto model
|
|
679
|
-
else if (previewFeatures && currentModel === DEFAULT_GEMINI_MODEL_AUTO) {
|
|
680
|
-
this.setModel(PREVIEW_GEMINI_MODEL_AUTO);
|
|
681
|
-
}
|
|
682
|
-
}
|
|
683
|
-
getHasAccessToPreviewModel() {
|
|
684
|
-
return this.hasAccessToPreviewModel;
|
|
685
|
-
}
|
|
686
|
-
setHasAccessToPreviewModel(hasAccess) {
|
|
687
|
-
this.hasAccessToPreviewModel = hasAccess;
|
|
688
|
-
}
|
|
689
|
-
async refreshUserQuota() {
|
|
690
|
-
const codeAssistServer = getCodeAssistServer(this);
|
|
691
|
-
if (!codeAssistServer || !codeAssistServer.projectId) {
|
|
692
|
-
return undefined;
|
|
693
|
-
}
|
|
694
|
-
try {
|
|
695
|
-
const quota = await codeAssistServer.retrieveUserQuota({
|
|
696
|
-
project: codeAssistServer.projectId,
|
|
697
|
-
});
|
|
698
|
-
const hasAccess = quota.buckets?.some((b) => b.modelId === PREVIEW_GEMINI_MODEL) ?? false;
|
|
699
|
-
this.setHasAccessToPreviewModel(hasAccess);
|
|
700
|
-
return quota;
|
|
701
|
-
}
|
|
702
|
-
catch (e) {
|
|
703
|
-
debugLogger.debug('Failed to retrieve user quota', e);
|
|
704
|
-
return undefined;
|
|
705
|
-
}
|
|
706
663
|
}
|
|
707
664
|
getCoreTools() {
|
|
708
665
|
return this.coreTools;
|
|
@@ -1197,17 +1154,16 @@ export class Config {
|
|
|
1197
1154
|
registerCoreTool(WriteTodosTool, this);
|
|
1198
1155
|
}
|
|
1199
1156
|
// Register Subagents as Tools
|
|
1200
|
-
if
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
}
|
|
1157
|
+
// Register DelegateToAgentTool if agents are enabled
|
|
1158
|
+
if (this.isAgentsEnabled() ||
|
|
1159
|
+
this.getCodebaseInvestigatorSettings().enabled) {
|
|
1160
|
+
// Check if the delegate tool itself is allowed (if allowedTools is set)
|
|
1161
|
+
const allowedTools = this.getAllowedTools();
|
|
1162
|
+
const isAllowed = !allowedTools || allowedTools.includes(DELEGATE_TO_AGENT_TOOL_NAME);
|
|
1163
|
+
if (isAllowed) {
|
|
1164
|
+
const messageBusEnabled = this.getEnableMessageBusIntegration();
|
|
1165
|
+
const delegateTool = new DelegateToAgentTool(this.agentRegistry, this, messageBusEnabled ? this.getMessageBus() : undefined);
|
|
1166
|
+
registry.registerTool(delegateTool);
|
|
1211
1167
|
}
|
|
1212
1168
|
}
|
|
1213
1169
|
await registry.discoverAllTools();
|