@google/gemini-cli-core 0.31.0-preview.3 → 0.32.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/docs/changelogs/index.md +22 -0
- package/dist/docs/changelogs/latest.md +307 -352
- package/dist/docs/changelogs/preview.md +391 -293
- package/dist/docs/cli/plan-mode.md +29 -7
- package/dist/docs/cli/settings.md +15 -6
- package/dist/docs/cli/telemetry.md +39 -11
- package/dist/docs/extensions/reference.md +36 -0
- package/dist/docs/get-started/installation.md +1 -1
- package/dist/docs/local-development.md +49 -43
- package/dist/docs/reference/configuration.md +32 -0
- package/dist/docs/reference/keyboard-shortcuts.md +6 -6
- package/dist/docs/reference/policy-engine.md +4 -3
- package/dist/docs/resources/faq.md +13 -0
- package/dist/docs/resources/tos-privacy.md +6 -0
- package/dist/docs/resources/uninstall.md +1 -10
- package/dist/docs/tools/mcp-server.md +22 -0
- package/dist/src/agents/a2a-client-manager.d.ts +7 -6
- package/dist/src/agents/a2a-client-manager.js +8 -9
- package/dist/src/agents/a2a-client-manager.js.map +1 -1
- package/dist/src/agents/a2a-client-manager.test.js +45 -31
- package/dist/src/agents/a2a-client-manager.test.js.map +1 -1
- package/dist/src/agents/a2aUtils.d.ts +25 -7
- package/dist/src/agents/a2aUtils.js +165 -58
- package/dist/src/agents/a2aUtils.js.map +1 -1
- package/dist/src/agents/a2aUtils.test.js +170 -27
- package/dist/src/agents/a2aUtils.test.js.map +1 -1
- package/dist/src/agents/generalist-agent.js +1 -2
- package/dist/src/agents/generalist-agent.js.map +1 -1
- package/dist/src/agents/registry.test.js +4 -2
- package/dist/src/agents/registry.test.js.map +1 -1
- package/dist/src/agents/remote-invocation.d.ts +2 -1
- package/dist/src/agents/remote-invocation.js +41 -22
- package/dist/src/agents/remote-invocation.js.map +1 -1
- package/dist/src/agents/remote-invocation.test.js +196 -56
- package/dist/src/agents/remote-invocation.test.js.map +1 -1
- package/dist/src/agents/subagent-tool-wrapper.js +1 -1
- package/dist/src/agents/subagent-tool-wrapper.test.js +1 -1
- package/dist/src/agents/subagent-tool.js +15 -2
- package/dist/src/agents/subagent-tool.js.map +1 -1
- package/dist/src/agents/subagent-tool.test.js +31 -0
- package/dist/src/agents/subagent-tool.test.js.map +1 -1
- package/dist/src/billing/billing.d.ts +80 -0
- package/dist/src/billing/billing.js +127 -0
- package/dist/src/billing/billing.js.map +1 -0
- package/dist/src/billing/billing.test.d.ts +6 -0
- package/dist/src/billing/billing.test.js +182 -0
- package/dist/src/billing/billing.test.js.map +1 -0
- package/dist/src/billing/index.d.ts +6 -0
- package/dist/src/billing/index.js +7 -0
- package/dist/src/billing/index.js.map +1 -0
- package/dist/src/code_assist/codeAssist.js +1 -1
- package/dist/src/code_assist/codeAssist.js.map +1 -1
- package/dist/src/code_assist/codeAssist.test.js +2 -2
- package/dist/src/code_assist/codeAssist.test.js.map +1 -1
- package/dist/src/code_assist/converter.d.ts +9 -4
- package/dist/src/code_assist/converter.js +17 -2
- package/dist/src/code_assist/converter.js.map +1 -1
- package/dist/src/code_assist/converter.test.js.map +1 -1
- package/dist/src/code_assist/oauth2.js +6 -3
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +1 -0
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/server.d.ts +9 -4
- package/dist/src/code_assist/server.js +86 -5
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/server.test.js +11 -0
- package/dist/src/code_assist/server.test.js.map +1 -1
- package/dist/src/code_assist/setup.d.ts +2 -1
- package/dist/src/code_assist/setup.js +15 -4
- package/dist/src/code_assist/setup.js.map +1 -1
- package/dist/src/code_assist/types.d.ts +33 -10
- package/dist/src/code_assist/types.js.map +1 -1
- package/dist/src/config/config.d.ts +50 -4
- package/dist/src/config/config.js +77 -3
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +151 -1
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/storage.d.ts +1 -0
- package/dist/src/config/storage.js +3 -0
- package/dist/src/config/storage.js.map +1 -1
- package/dist/src/core/contentGenerator.d.ts +3 -2
- package/dist/src/core/contentGenerator.js +9 -2
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/coreToolScheduler.js +2 -1
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +21 -2
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/fakeContentGenerator.d.ts +2 -1
- package/dist/src/core/fakeContentGenerator.js +1 -0
- package/dist/src/core/fakeContentGenerator.js.map +1 -1
- package/dist/src/core/geminiChat.js +6 -2
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +34 -0
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/localLiteRtLmClient.d.ts +24 -0
- package/dist/src/core/localLiteRtLmClient.js +77 -0
- package/dist/src/core/localLiteRtLmClient.js.map +1 -0
- package/dist/src/core/localLiteRtLmClient.test.d.ts +6 -0
- package/dist/src/core/localLiteRtLmClient.test.js +87 -0
- package/dist/src/core/localLiteRtLmClient.test.js.map +1 -0
- package/dist/src/core/loggingContentGenerator.d.ts +2 -1
- package/dist/src/core/loggingContentGenerator.js +39 -17
- package/dist/src/core/loggingContentGenerator.js.map +1 -1
- package/dist/src/core/loggingContentGenerator.test.js +122 -5
- package/dist/src/core/loggingContentGenerator.test.js.map +1 -1
- package/dist/src/core/prompts.test.js +1 -1
- package/dist/src/core/prompts.test.js.map +1 -1
- package/dist/src/fallback/handler.js +2 -0
- package/dist/src/fallback/handler.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/index.d.ts +5 -0
- package/dist/src/index.js +5 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/policy/config.d.ts +18 -6
- package/dist/src/policy/config.js +50 -12
- package/dist/src/policy/config.js.map +1 -1
- package/dist/src/policy/config.test.js +26 -26
- package/dist/src/policy/config.test.js.map +1 -1
- package/dist/src/policy/policies/plan.toml +1 -1
- package/dist/src/policy/policy-engine.d.ts +8 -0
- package/dist/src/policy/policy-engine.js +12 -0
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/policy/policy-engine.test.js +93 -0
- package/dist/src/policy/policy-engine.test.js.map +1 -1
- package/dist/src/policy/toml-loader.d.ts +1 -1
- package/dist/src/policy/toml-loader.js +4 -2
- package/dist/src/policy/toml-loader.js.map +1 -1
- package/dist/src/policy/toml-loader.test.js +15 -12
- package/dist/src/policy/toml-loader.test.js.map +1 -1
- package/dist/src/policy/workspace-policy.test.js +10 -10
- package/dist/src/prompts/snippets.js +43 -27
- package/dist/src/prompts/snippets.js.map +1 -1
- package/dist/src/routing/modelRouterService.js +19 -11
- package/dist/src/routing/modelRouterService.js.map +1 -1
- package/dist/src/routing/modelRouterService.test.js +38 -1
- package/dist/src/routing/modelRouterService.test.js.map +1 -1
- package/dist/src/routing/routingStrategy.d.ts +3 -2
- package/dist/src/routing/strategies/classifierStrategy.d.ts +2 -1
- package/dist/src/routing/strategies/classifierStrategy.js +1 -1
- package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
- package/dist/src/routing/strategies/classifierStrategy.test.js +15 -13
- package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/compositeStrategy.d.ts +2 -1
- package/dist/src/routing/strategies/compositeStrategy.js +3 -3
- package/dist/src/routing/strategies/compositeStrategy.js.map +1 -1
- package/dist/src/routing/strategies/compositeStrategy.test.js +10 -8
- package/dist/src/routing/strategies/compositeStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/defaultStrategy.d.ts +2 -1
- package/dist/src/routing/strategies/defaultStrategy.js +1 -1
- package/dist/src/routing/strategies/defaultStrategy.js.map +1 -1
- package/dist/src/routing/strategies/defaultStrategy.test.js +8 -4
- package/dist/src/routing/strategies/defaultStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/fallbackStrategy.d.ts +2 -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 +6 -5
- package/dist/src/routing/strategies/fallbackStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/gemmaClassifierStrategy.d.ts +14 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.js +182 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.js.map +1 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.test.d.ts +6 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.test.js +218 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.test.js.map +1 -0
- package/dist/src/routing/strategies/numericalClassifierStrategy.d.ts +2 -1
- package/dist/src/routing/strategies/numericalClassifierStrategy.js +1 -1
- package/dist/src/routing/strategies/numericalClassifierStrategy.js.map +1 -1
- package/dist/src/routing/strategies/numericalClassifierStrategy.test.js +24 -22
- package/dist/src/routing/strategies/numericalClassifierStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/overrideStrategy.d.ts +2 -1
- package/dist/src/routing/strategies/overrideStrategy.js +1 -1
- package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
- package/dist/src/routing/strategies/overrideStrategy.test.js +5 -4
- package/dist/src/routing/strategies/overrideStrategy.test.js.map +1 -1
- package/dist/src/scheduler/scheduler.d.ts +1 -0
- package/dist/src/scheduler/scheduler.js +18 -7
- package/dist/src/scheduler/scheduler.js.map +1 -1
- package/dist/src/scheduler/scheduler.test.js +19 -1
- package/dist/src/scheduler/scheduler.test.js.map +1 -1
- package/dist/src/scheduler/scheduler_parallel.test.js +94 -3
- package/dist/src/scheduler/scheduler_parallel.test.js.map +1 -1
- package/dist/src/scheduler/tool-executor.js +21 -12
- package/dist/src/scheduler/tool-executor.js.map +1 -1
- package/dist/src/scheduler/tool-executor.test.js +54 -0
- package/dist/src/scheduler/tool-executor.test.js.map +1 -1
- package/dist/src/services/trackerService.d.ts +49 -0
- package/dist/src/services/trackerService.js +172 -0
- package/dist/src/services/trackerService.js.map +1 -0
- package/dist/src/services/trackerService.test.d.ts +6 -0
- package/dist/src/services/trackerService.test.js +117 -0
- package/dist/src/services/trackerService.test.js.map +1 -0
- package/dist/src/services/trackerTypes.d.ts +51 -0
- package/dist/src/services/trackerTypes.js +33 -0
- package/dist/src/services/trackerTypes.js.map +1 -0
- package/dist/src/telemetry/billingEvents.d.ts +75 -0
- package/dist/src/telemetry/billingEvents.js +181 -0
- package/dist/src/telemetry/billingEvents.js.map +1 -0
- package/dist/src/telemetry/billingEvents.test.d.ts +6 -0
- package/dist/src/telemetry/billingEvents.test.js +139 -0
- package/dist/src/telemetry/billingEvents.test.js.map +1 -0
- package/dist/src/telemetry/conseca-logger.test.js +1 -0
- package/dist/src/telemetry/conseca-logger.test.js.map +1 -1
- package/dist/src/telemetry/constants.d.ts +25 -0
- package/dist/src/telemetry/constants.js +29 -0
- package/dist/src/telemetry/constants.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +3 -1
- package/dist/src/telemetry/index.js +5 -1
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +2 -0
- package/dist/src/telemetry/loggers.js +10 -0
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +16 -0
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +28 -0
- package/dist/src/telemetry/metrics.js +40 -0
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/sanitize.test.js +1 -0
- package/dist/src/telemetry/sanitize.test.js.map +1 -1
- package/dist/src/telemetry/sdk.test.js +1 -0
- package/dist/src/telemetry/sdk.test.js.map +1 -1
- package/dist/src/telemetry/telemetryAttributes.js +2 -0
- package/dist/src/telemetry/telemetryAttributes.js.map +1 -1
- package/dist/src/telemetry/trace.d.ts +2 -1
- package/dist/src/telemetry/trace.js +13 -18
- package/dist/src/telemetry/trace.js.map +1 -1
- package/dist/src/telemetry/trace.test.d.ts +6 -0
- package/dist/src/telemetry/trace.test.js +116 -0
- package/dist/src/telemetry/trace.test.js.map +1 -0
- package/dist/src/tools/confirmation-policy.test.js +1 -0
- package/dist/src/tools/confirmation-policy.test.js.map +1 -1
- package/dist/src/tools/definitions/model-family-sets/default-legacy.js +2 -2
- package/dist/src/tools/definitions/model-family-sets/default-legacy.js.map +1 -1
- package/dist/src/tools/definitions/model-family-sets/gemini-3.js +3 -3
- package/dist/src/tools/definitions/model-family-sets/gemini-3.js.map +1 -1
- package/dist/src/tools/grep-utils.d.ts +1 -1
- package/dist/src/tools/grep-utils.js +4 -4
- package/dist/src/tools/grep-utils.js.map +1 -1
- package/dist/src/tools/grep.d.ts +1 -1
- package/dist/src/tools/grep.js +9 -9
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/grep.test.js +8 -5
- package/dist/src/tools/grep.test.js.map +1 -1
- package/dist/src/tools/line-endings.test.js +3 -11
- package/dist/src/tools/line-endings.test.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.d.ts +25 -0
- package/dist/src/tools/mcp-client-manager.js +66 -3
- package/dist/src/tools/mcp-client-manager.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.test.js +47 -0
- package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +20 -9
- package/dist/src/tools/mcp-client.js +50 -46
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +96 -84
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts +3 -3
- package/dist/src/tools/mcp-tool.js +1 -0
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/ripGrep.d.ts +1 -1
- package/dist/src/tools/ripGrep.js +7 -7
- package/dist/src/tools/ripGrep.js.map +1 -1
- package/dist/src/tools/ripGrep.test.js +10 -7
- package/dist/src/tools/ripGrep.test.js.map +1 -1
- package/dist/src/tools/tools.d.ts +1 -0
- package/dist/src/tools/tools.js +1 -0
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/write-file.js +4 -17
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +29 -83
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/utils/editCorrector.d.ts +1 -42
- package/dist/src/utils/editCorrector.js +9 -461
- package/dist/src/utils/editCorrector.js.map +1 -1
- package/dist/src/utils/editCorrector.test.js +17 -421
- package/dist/src/utils/editCorrector.test.js.map +1 -1
- package/dist/src/utils/envExpansion.js.map +1 -1
- package/dist/src/utils/errors.js +7 -0
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/errors_timeout.test.d.ts +6 -0
- package/dist/src/utils/errors_timeout.test.js +40 -0
- package/dist/src/utils/errors_timeout.test.js.map +1 -0
- package/dist/src/utils/extensionLoader.js +35 -0
- package/dist/src/utils/extensionLoader.js.map +1 -1
- package/dist/src/utils/extensionLoader.test.js +36 -0
- package/dist/src/utils/extensionLoader.test.js.map +1 -1
- package/dist/src/utils/fetch.js +13 -2
- package/dist/src/utils/fetch.js.map +1 -1
- package/dist/src/utils/fileUtils.js +0 -1
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/fileUtils.test.js +0 -1
- package/dist/src/utils/fileUtils.test.js.map +1 -1
- package/dist/src/utils/flashFallback.test.js +24 -0
- package/dist/src/utils/flashFallback.test.js.map +1 -1
- package/dist/src/utils/googleErrors.d.ts +2 -2
- package/dist/src/utils/googleQuotaErrors.d.ts +3 -1
- package/dist/src/utils/googleQuotaErrors.js +22 -12
- package/dist/src/utils/googleQuotaErrors.js.map +1 -1
- package/dist/src/utils/googleQuotaErrors.test.js +33 -1
- package/dist/src/utils/googleQuotaErrors.test.js.map +1 -1
- package/dist/src/utils/retry.js +4 -2
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js +20 -0
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/src/utils/schemaValidator.js +0 -1
- package/dist/src/utils/schemaValidator.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/dist/google-gemini-cli-core-0.31.0-preview.2.tgz +0 -0
|
@@ -25,7 +25,7 @@ describe('Workspace-Level Policies', () => {
|
|
|
25
25
|
vi.restoreAllMocks();
|
|
26
26
|
vi.doUnmock('node:fs/promises');
|
|
27
27
|
});
|
|
28
|
-
it('should load workspace policies with correct priority (Tier
|
|
28
|
+
it('should load workspace policies with correct priority (Tier 3)', async () => {
|
|
29
29
|
const workspacePoliciesDir = '/mock/workspace/policies';
|
|
30
30
|
const defaultPoliciesDir = '/mock/default/policies';
|
|
31
31
|
// Mock FS
|
|
@@ -82,21 +82,21 @@ priority = 10
|
|
|
82
82
|
toolName = "test_tool"
|
|
83
83
|
decision = "deny"
|
|
84
84
|
priority = 10
|
|
85
|
-
`; // Tier
|
|
85
|
+
`; // Tier 4 -> 4.010
|
|
86
86
|
}
|
|
87
87
|
if (path.includes('workspace.toml')) {
|
|
88
88
|
return `[[rule]]
|
|
89
89
|
toolName = "test_tool"
|
|
90
90
|
decision = "allow"
|
|
91
91
|
priority = 10
|
|
92
|
-
`; // Tier
|
|
92
|
+
`; // Tier 3 -> 3.010
|
|
93
93
|
}
|
|
94
94
|
if (path.includes('admin.toml')) {
|
|
95
95
|
return `[[rule]]
|
|
96
96
|
toolName = "test_tool"
|
|
97
97
|
decision = "deny"
|
|
98
98
|
priority = 10
|
|
99
|
-
`; // Tier
|
|
99
|
+
`; // Tier 5 -> 5.010
|
|
100
100
|
}
|
|
101
101
|
return '';
|
|
102
102
|
});
|
|
@@ -119,9 +119,9 @@ priority = 10
|
|
|
119
119
|
expect(rules).toBeDefined();
|
|
120
120
|
// Check for all 4 rules
|
|
121
121
|
const defaultRule = rules?.find((r) => r.priority === 1.01);
|
|
122
|
-
const workspaceRule = rules?.find((r) => r.priority ===
|
|
123
|
-
const userRule = rules?.find((r) => r.priority ===
|
|
124
|
-
const adminRule = rules?.find((r) => r.priority ===
|
|
122
|
+
const workspaceRule = rules?.find((r) => r.priority === 3.01);
|
|
123
|
+
const userRule = rules?.find((r) => r.priority === 4.01);
|
|
124
|
+
const adminRule = rules?.find((r) => r.priority === 5.01);
|
|
125
125
|
expect(defaultRule).toBeDefined();
|
|
126
126
|
expect(userRule).toBeDefined();
|
|
127
127
|
expect(workspaceRule).toBeDefined();
|
|
@@ -179,7 +179,7 @@ priority=10`);
|
|
|
179
179
|
expect(rules).toHaveLength(1);
|
|
180
180
|
expect(rules[0].priority).toBe(1.01);
|
|
181
181
|
});
|
|
182
|
-
it('should load workspace policies and correctly transform to Tier
|
|
182
|
+
it('should load workspace policies and correctly transform to Tier 3', async () => {
|
|
183
183
|
const workspacePoliciesDir = '/mock/workspace/policies';
|
|
184
184
|
// Mock FS
|
|
185
185
|
const actualFs = await vi.importActual('node:fs/promises');
|
|
@@ -224,8 +224,8 @@ priority=500`);
|
|
|
224
224
|
const config = await createPolicyEngineConfig({ workspacePoliciesDir }, ApprovalMode.DEFAULT);
|
|
225
225
|
const rule = config.rules?.find((r) => r.toolName === 'p_tool');
|
|
226
226
|
expect(rule).toBeDefined();
|
|
227
|
-
// Workspace Tier (
|
|
228
|
-
expect(rule?.priority).toBe(
|
|
227
|
+
// Workspace Tier (3) + 500/1000 = 3.5
|
|
228
|
+
expect(rule?.priority).toBe(3.5);
|
|
229
229
|
});
|
|
230
230
|
});
|
|
231
231
|
//# sourceMappingURL=workspace-policy.test.js.map
|
|
@@ -97,7 +97,7 @@ Use the following guidelines to optimize your search and read patterns.
|
|
|
97
97
|
</guidelines>
|
|
98
98
|
|
|
99
99
|
<examples>
|
|
100
|
-
- **Searching:** utilize search tools like ${GREP_TOOL_NAME} and ${GLOB_TOOL_NAME} with a conservative result count (\`total_max_matches\`) and a narrow scope (\`
|
|
100
|
+
- **Searching:** utilize search tools like ${GREP_TOOL_NAME} and ${GLOB_TOOL_NAME} with a conservative result count (\`total_max_matches\`) and a narrow scope (\`include_pattern\` and \`exclude_pattern\` parameters).
|
|
101
101
|
- **Searching and editing:** utilize search tools like ${GREP_TOOL_NAME} with a conservative result count and a narrow scope. Use \`context\`, \`before\`, and/or \`after\` to request enough context to avoid the need to read the file before editing matches.
|
|
102
102
|
- **Understanding:** minimize turns needed to understand a file. It's most efficient to read small files in their entirety.
|
|
103
103
|
- **Large files:** utilize search tools like ${GREP_TOOL_NAME} and/or ${READ_FILE_TOOL_NAME} called in parallel with 'start_line' and 'end_line' to reduce the impact on context. Minimize extra turns, unless unavoidable due to the file being too large.
|
|
@@ -133,6 +133,18 @@ export function renderSubAgents(subAgents) {
|
|
|
133
133
|
|
|
134
134
|
Sub-agents are specialized expert agents. Each sub-agent is available as a tool of the same name. You MUST delegate tasks to the sub-agent with the most relevant expertise.
|
|
135
135
|
|
|
136
|
+
### Strategic Orchestration & Delegation
|
|
137
|
+
Operate as a **strategic orchestrator**. Your own context window is your most precious resource. Every turn you take adds to the permanent session history. To keep the session fast and efficient, use sub-agents to "compress" complex or repetitive work.
|
|
138
|
+
|
|
139
|
+
When you delegate, the sub-agent's entire execution is consolidated into a single summary in your history, keeping your main loop lean.
|
|
140
|
+
|
|
141
|
+
**High-Impact Delegation Candidates:**
|
|
142
|
+
- **Repetitive Batch Tasks:** Tasks involving more than 3 files or repeated steps (e.g., "Add license headers to all files in src/", "Fix all lint errors in the project").
|
|
143
|
+
- **High-Volume Output:** Commands or tools expected to return large amounts of data (e.g., verbose builds, exhaustive file searches).
|
|
144
|
+
- **Speculative Research:** Investigations that require many "trial and error" steps before a clear path is found.
|
|
145
|
+
|
|
146
|
+
**Assertive Action:** Continue to handle "surgical" tasks directly—simple reads, single-file edits, or direct questions that can be resolved in 1-2 turns. Delegation is an efficiency tool, not a way to avoid direct action when it is the fastest path.
|
|
147
|
+
|
|
136
148
|
<available_subagents>
|
|
137
149
|
${subAgentsXml}
|
|
138
150
|
</available_subagents>
|
|
@@ -217,7 +229,7 @@ export function renderOperationalGuidelines(options) {
|
|
|
217
229
|
- **Handling Inability:** If unable/unwilling to fulfill a request, state so briefly without excessive justification. Offer alternatives if appropriate.
|
|
218
230
|
|
|
219
231
|
## Security and Safety Rules
|
|
220
|
-
- **Explain Critical Commands:** Before executing commands with ${formatToolName(SHELL_TOOL_NAME)} that modify the file system, codebase, or system state, you *must* provide a brief explanation of the command's purpose and potential impact. Prioritize user understanding and safety. You should not ask permission to use the tool; the user will be presented with a confirmation dialogue upon use (you do not need to tell them this).
|
|
232
|
+
- **Explain Critical Commands:** Before executing commands with ${formatToolName(SHELL_TOOL_NAME)} that modify the file system, codebase, or system state, you *must* provide a brief explanation of the command's purpose and potential impact. Prioritize user understanding and safety. You should not ask permission to use the tool; the user will be presented with a confirmation dialogue upon use (you do not need to tell them this). You MUST NOT use ${formatToolName(ASK_USER_TOOL_NAME)} to ask for permission to run a command.
|
|
221
233
|
- **Security First:** Always apply security best practices. Never introduce code that exposes, logs, or commits secrets, API keys, or other sensitive information.
|
|
222
234
|
|
|
223
235
|
## Tool Usage
|
|
@@ -334,7 +346,7 @@ export function renderPlanningWorkflow(options) {
|
|
|
334
346
|
return `
|
|
335
347
|
# Active Approval Mode: Plan
|
|
336
348
|
|
|
337
|
-
You are operating in **Plan Mode**. Your goal is to produce
|
|
349
|
+
You are operating in **Plan Mode**. Your goal is to produce an implementation plan in \`${options.plansDir}/\` and get user approval before editing source code.
|
|
338
350
|
|
|
339
351
|
## Available Tools
|
|
340
352
|
The following tools are available in Plan Mode:
|
|
@@ -343,31 +355,35 @@ ${options.planModeToolsList}
|
|
|
343
355
|
</available_tools>
|
|
344
356
|
|
|
345
357
|
## Rules
|
|
346
|
-
1. **Read-Only:** You cannot modify source code. You may ONLY use read-only tools to explore, and you can only write to \`${options.plansDir}/\`. If the user asks you to modify source code directly, you MUST explain that you are in Plan Mode and must first create a
|
|
358
|
+
1. **Read-Only:** You cannot modify source code. You may ONLY use read-only tools to explore, and you can only write to \`${options.plansDir}/\`. If the user asks you to modify source code directly, you MUST explain that you are in Plan Mode and must first create a plan and get approval.
|
|
347
359
|
2. **Write Constraint:** ${formatToolName(WRITE_FILE_TOOL_NAME)} and ${formatToolName(EDIT_TOOL_NAME)} may ONLY be used to write .md plan files to \`${options.plansDir}/\`. They cannot modify source code.
|
|
348
|
-
3. **Efficiency:** Autonomously combine discovery and drafting phases to minimize conversational turns. If the request is ambiguous, use ${formatToolName(ASK_USER_TOOL_NAME)} to clarify.
|
|
360
|
+
3. **Efficiency:** Autonomously combine discovery and drafting phases to minimize conversational turns. If the request is ambiguous, use ${formatToolName(ASK_USER_TOOL_NAME)} to clarify. Use multi-select to offer flexibility and include detailed descriptions for each option to help the user understand the implications of their choice.
|
|
349
361
|
4. **Inquiries and Directives:** Distinguish between Inquiries and Directives to minimize unnecessary planning.
|
|
350
|
-
- **Inquiries:** If the request is an **Inquiry** (e.g., "How does X work?"),
|
|
351
|
-
- **Directives:** If the request is a **Directive** (e.g., "Fix bug Y"), follow the workflow below
|
|
352
|
-
5. **Plan Storage:** Save plans as Markdown (.md) using descriptive filenames
|
|
353
|
-
6. **Direct Modification:** If asked to modify code
|
|
354
|
-
|
|
355
|
-
##
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
362
|
+
- **Inquiries:** If the request is an **Inquiry** (e.g., "How does X work?"), answer directly. DO NOT create a plan.
|
|
363
|
+
- **Directives:** If the request is a **Directive** (e.g., "Fix bug Y"), follow the workflow below.
|
|
364
|
+
5. **Plan Storage:** Save plans as Markdown (.md) using descriptive filenames.
|
|
365
|
+
6. **Direct Modification:** If asked to modify code, explain you are in Plan Mode and use ${formatToolName(EXIT_PLAN_MODE_TOOL_NAME)} to request approval.
|
|
366
|
+
|
|
367
|
+
## Planning Workflow
|
|
368
|
+
Plan Mode uses an adaptive planning workflow where the research depth, plan structure, and consultation level are proportional to the task's complexity.
|
|
369
|
+
|
|
370
|
+
### 1. Explore & Analyze
|
|
371
|
+
Analyze requirements and use search/read tools to explore the codebase. Systematically map affected modules, trace data flow, and identify dependencies.
|
|
372
|
+
|
|
373
|
+
### 2. Consult
|
|
374
|
+
The depth of your consultation should be proportional to the task's complexity:
|
|
375
|
+
- **Simple Tasks:** Skip consultation and proceed directly to drafting.
|
|
376
|
+
- **Standard Tasks:** If multiple viable approaches exist, present a concise summary (including pros/cons and your recommendation) via ${formatToolName(ASK_USER_TOOL_NAME)} and wait for a decision.
|
|
377
|
+
- **Complex Tasks:** You MUST present at least two viable approaches with detailed trade-offs via ${formatToolName(ASK_USER_TOOL_NAME)} and obtain approval before drafting the plan.
|
|
378
|
+
|
|
379
|
+
### 3. Draft
|
|
380
|
+
Write the implementation plan to \`${options.plansDir}/\`. The plan's structure adapts to the task:
|
|
381
|
+
- **Simple Tasks:** Include a bulleted list of specific **Changes** and **Verification** steps.
|
|
382
|
+
- **Standard Tasks:** Include an **Objective**, **Key Files & Context**, **Implementation Steps**, and **Verification & Testing**.
|
|
383
|
+
- **Complex Tasks:** Include **Background & Motivation**, **Scope & Impact**, **Proposed Solution**, **Alternatives Considered**, a phased **Implementation Plan**, **Verification**, and **Migration & Rollback** strategies.
|
|
384
|
+
|
|
385
|
+
### 4. Review & Approval
|
|
386
|
+
Use the ${formatToolName(EXIT_PLAN_MODE_TOOL_NAME)} tool to present the plan and formally request approval.
|
|
371
387
|
|
|
372
388
|
${renderApprovedPlanSection(options.approvedPlanPath)}`.trim();
|
|
373
389
|
}
|
|
@@ -407,7 +423,7 @@ function mandateContinueWork(interactive) {
|
|
|
407
423
|
function workflowStepResearch(options) {
|
|
408
424
|
let suggestion = '';
|
|
409
425
|
if (options.enableEnterPlanModeTool) {
|
|
410
|
-
suggestion = ` If the request is ambiguous, broad in scope, or involves
|
|
426
|
+
suggestion = ` If the request is ambiguous, broad in scope, or involves architectural decisions or cross-cutting changes, use the ${formatToolName(ENTER_PLAN_MODE_TOOL_NAME)} tool to safely research and design your strategy. Do NOT use Plan Mode for straightforward bug fixes, answering questions, or simple inquiries.`;
|
|
411
427
|
}
|
|
412
428
|
const searchTools = [];
|
|
413
429
|
if (options.enableGrep)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snippets.js","sourceRoot":"","sources":["../../../src/prompts/snippets.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"snippets.js","sourceRoot":"","sources":["../../../src/prompts/snippets.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
+
import { GemmaClassifierStrategy } from './strategies/gemmaClassifierStrategy.js';
|
|
6
7
|
import { DefaultStrategy } from './strategies/defaultStrategy.js';
|
|
7
8
|
import { ClassifierStrategy } from './strategies/classifierStrategy.js';
|
|
8
9
|
import { NumericalClassifierStrategy } from './strategies/numericalClassifierStrategy.js';
|
|
@@ -24,16 +25,23 @@ export class ModelRouterService {
|
|
|
24
25
|
this.strategy = this.initializeDefaultStrategy();
|
|
25
26
|
}
|
|
26
27
|
initializeDefaultStrategy() {
|
|
27
|
-
|
|
28
|
-
//
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
new
|
|
36
|
-
|
|
28
|
+
const strategies = [];
|
|
29
|
+
// Order matters here. Fallback and override are checked first.
|
|
30
|
+
strategies.push(new FallbackStrategy());
|
|
31
|
+
strategies.push(new OverrideStrategy());
|
|
32
|
+
// Approval mode is next.
|
|
33
|
+
strategies.push(new ApprovalModeStrategy());
|
|
34
|
+
// Then, if enabled, the Gemma classifier is used.
|
|
35
|
+
if (this.config.getGemmaModelRouterSettings()?.enabled) {
|
|
36
|
+
strategies.push(new GemmaClassifierStrategy());
|
|
37
|
+
}
|
|
38
|
+
// The generic classifier is next.
|
|
39
|
+
strategies.push(new ClassifierStrategy());
|
|
40
|
+
// The numerical classifier is next.
|
|
41
|
+
strategies.push(new NumericalClassifierStrategy());
|
|
42
|
+
// The default strategy is the terminal strategy.
|
|
43
|
+
const terminalStrategy = new DefaultStrategy();
|
|
44
|
+
return new CompositeStrategy([...strategies, terminalStrategy], 'agent-router');
|
|
37
45
|
}
|
|
38
46
|
/**
|
|
39
47
|
* Determines which model to use for a given request context.
|
|
@@ -52,7 +60,7 @@ export class ModelRouterService {
|
|
|
52
60
|
let failed = false;
|
|
53
61
|
let error_message;
|
|
54
62
|
try {
|
|
55
|
-
decision = await this.strategy.route(context, this.config, this.config.getBaseLlmClient());
|
|
63
|
+
decision = await this.strategy.route(context, this.config, this.config.getBaseLlmClient(), this.config.getLocalLiteRtLmClient());
|
|
56
64
|
debugLogger.debug(`[Routing] Selected model: ${decision.model} (Source: ${decision.metadata.source}, Latency: ${decision.metadata.latencyMs}ms)\n\t[Routing] Reasoning: ${decision.metadata.reasoning}`);
|
|
57
65
|
}
|
|
58
66
|
catch (e) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelRouterService.js","sourceRoot":"","sources":["../../../src/routing/modelRouterService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"modelRouterService.js","sourceRoot":"","sources":["../../../src/routing/modelRouterService.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ import { ClassifierStrategy } from './strategies/classifierStrategy.js';
|
|
|
15
15
|
import { NumericalClassifierStrategy } from './strategies/numericalClassifierStrategy.js';
|
|
16
16
|
import { logModelRouting } from '../telemetry/loggers.js';
|
|
17
17
|
import { ModelRoutingEvent } from '../telemetry/types.js';
|
|
18
|
+
import { GemmaClassifierStrategy } from './strategies/gemmaClassifierStrategy.js';
|
|
18
19
|
import { ApprovalMode } from '../policy/types.js';
|
|
19
20
|
vi.mock('../config/config.js');
|
|
20
21
|
vi.mock('../core/baseLlmClient.js');
|
|
@@ -25,21 +26,32 @@ vi.mock('./strategies/overrideStrategy.js');
|
|
|
25
26
|
vi.mock('./strategies/approvalModeStrategy.js');
|
|
26
27
|
vi.mock('./strategies/classifierStrategy.js');
|
|
27
28
|
vi.mock('./strategies/numericalClassifierStrategy.js');
|
|
29
|
+
vi.mock('./strategies/gemmaClassifierStrategy.js');
|
|
28
30
|
vi.mock('../telemetry/loggers.js');
|
|
29
31
|
vi.mock('../telemetry/types.js');
|
|
30
32
|
describe('ModelRouterService', () => {
|
|
31
33
|
let service;
|
|
32
34
|
let mockConfig;
|
|
33
35
|
let mockBaseLlmClient;
|
|
36
|
+
let mockLocalLiteRtLmClient;
|
|
34
37
|
let mockContext;
|
|
35
38
|
let mockCompositeStrategy;
|
|
36
39
|
beforeEach(() => {
|
|
37
40
|
vi.clearAllMocks();
|
|
38
41
|
mockConfig = new Config({});
|
|
39
42
|
mockBaseLlmClient = {};
|
|
43
|
+
mockLocalLiteRtLmClient = {};
|
|
40
44
|
vi.spyOn(mockConfig, 'getBaseLlmClient').mockReturnValue(mockBaseLlmClient);
|
|
45
|
+
vi.spyOn(mockConfig, 'getLocalLiteRtLmClient').mockReturnValue(mockLocalLiteRtLmClient);
|
|
41
46
|
vi.spyOn(mockConfig, 'getNumericalRoutingEnabled').mockResolvedValue(false);
|
|
42
47
|
vi.spyOn(mockConfig, 'getClassifierThreshold').mockResolvedValue(undefined);
|
|
48
|
+
vi.spyOn(mockConfig, 'getGemmaModelRouterSettings').mockReturnValue({
|
|
49
|
+
enabled: false,
|
|
50
|
+
classifier: {
|
|
51
|
+
host: 'http://localhost:1234',
|
|
52
|
+
model: 'gemma3-1b-gpu-custom',
|
|
53
|
+
},
|
|
54
|
+
});
|
|
43
55
|
vi.spyOn(mockConfig, 'getApprovalMode').mockReturnValue(ApprovalMode.DEFAULT);
|
|
44
56
|
mockCompositeStrategy = new CompositeStrategy([
|
|
45
57
|
new FallbackStrategy(),
|
|
@@ -74,6 +86,31 @@ describe('ModelRouterService', () => {
|
|
|
74
86
|
expect(childStrategies[5]).toBeInstanceOf(DefaultStrategy);
|
|
75
87
|
expect(compositeStrategyArgs[1]).toBe('agent-router');
|
|
76
88
|
});
|
|
89
|
+
it('should include GemmaClassifierStrategy when enabled', () => {
|
|
90
|
+
// Override the default mock for this specific test
|
|
91
|
+
vi.spyOn(mockConfig, 'getGemmaModelRouterSettings').mockReturnValue({
|
|
92
|
+
enabled: true,
|
|
93
|
+
classifier: {
|
|
94
|
+
host: 'http://localhost:1234',
|
|
95
|
+
model: 'gemma3-1b-gpu-custom',
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
// Clear previous mock calls from beforeEach
|
|
99
|
+
vi.mocked(CompositeStrategy).mockClear();
|
|
100
|
+
// Re-initialize the service to pick up the new config
|
|
101
|
+
service = new ModelRouterService(mockConfig);
|
|
102
|
+
const compositeStrategyArgs = vi.mocked(CompositeStrategy).mock.calls[0];
|
|
103
|
+
const childStrategies = compositeStrategyArgs[0];
|
|
104
|
+
expect(childStrategies.length).toBe(7);
|
|
105
|
+
expect(childStrategies[0]).toBeInstanceOf(FallbackStrategy);
|
|
106
|
+
expect(childStrategies[1]).toBeInstanceOf(OverrideStrategy);
|
|
107
|
+
expect(childStrategies[2]).toBeInstanceOf(ApprovalModeStrategy);
|
|
108
|
+
expect(childStrategies[3]).toBeInstanceOf(GemmaClassifierStrategy);
|
|
109
|
+
expect(childStrategies[4]).toBeInstanceOf(ClassifierStrategy);
|
|
110
|
+
expect(childStrategies[5]).toBeInstanceOf(NumericalClassifierStrategy);
|
|
111
|
+
expect(childStrategies[6]).toBeInstanceOf(DefaultStrategy);
|
|
112
|
+
expect(compositeStrategyArgs[1]).toBe('agent-router');
|
|
113
|
+
});
|
|
77
114
|
describe('route()', () => {
|
|
78
115
|
const strategyDecision = {
|
|
79
116
|
model: 'strategy-chosen-model',
|
|
@@ -88,7 +125,7 @@ describe('ModelRouterService', () => {
|
|
|
88
125
|
.spyOn(mockCompositeStrategy, 'route')
|
|
89
126
|
.mockResolvedValue(strategyDecision);
|
|
90
127
|
const decision = await service.route(mockContext);
|
|
91
|
-
expect(strategySpy).toHaveBeenCalledWith(mockContext, mockConfig, mockBaseLlmClient);
|
|
128
|
+
expect(strategySpy).toHaveBeenCalledWith(mockContext, mockConfig, mockBaseLlmClient, mockLocalLiteRtLmClient);
|
|
92
129
|
expect(decision).toEqual(strategyDecision);
|
|
93
130
|
});
|
|
94
131
|
it('should log a telemetry event on a successful decision', async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelRouterService.test.js","sourceRoot":"","sources":["../../../src/routing/modelRouterService.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;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"modelRouterService.test.js","sourceRoot":"","sources":["../../../src/routing/modelRouterService.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import type { Content, PartListUnion } from '@google/genai';
|
|
7
7
|
import type { BaseLlmClient } from '../core/baseLlmClient.js';
|
|
8
8
|
import type { Config } from '../config/config.js';
|
|
9
|
+
import type { LocalLiteRtLmClient } from '../core/localLiteRtLmClient.js';
|
|
9
10
|
/**
|
|
10
11
|
* The output of a routing decision. It specifies which model to use and why.
|
|
11
12
|
*/
|
|
@@ -49,7 +50,7 @@ export interface RoutingStrategy {
|
|
|
49
50
|
* @param client A reference to the GeminiClient, allowing the strategy to make its own API calls if needed.
|
|
50
51
|
* @returns A promise that resolves to a RoutingDecision, or null if the strategy is not applicable.
|
|
51
52
|
*/
|
|
52
|
-
route(context: RoutingContext, config: Config, baseLlmClient: BaseLlmClient): Promise<RoutingDecision | null>;
|
|
53
|
+
route(context: RoutingContext, config: Config, baseLlmClient: BaseLlmClient, localLiteRtLmClient: LocalLiteRtLmClient): Promise<RoutingDecision | null>;
|
|
53
54
|
}
|
|
54
55
|
/**
|
|
55
56
|
* A strategy that is guaranteed to return a decision. It must not return null.
|
|
@@ -60,5 +61,5 @@ export interface TerminalStrategy extends RoutingStrategy {
|
|
|
60
61
|
* Determines which model to use for a given request context.
|
|
61
62
|
* @returns A promise that resolves to a RoutingDecision.
|
|
62
63
|
*/
|
|
63
|
-
route(context: RoutingContext, config: Config, baseLlmClient: BaseLlmClient): Promise<RoutingDecision>;
|
|
64
|
+
route(context: RoutingContext, config: Config, baseLlmClient: BaseLlmClient, localLiteRtLmClient: LocalLiteRtLmClient): Promise<RoutingDecision>;
|
|
64
65
|
}
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
import type { BaseLlmClient } from '../../core/baseLlmClient.js';
|
|
7
7
|
import type { RoutingContext, RoutingDecision, RoutingStrategy } from '../routingStrategy.js';
|
|
8
8
|
import type { Config } from '../../config/config.js';
|
|
9
|
+
import type { LocalLiteRtLmClient } from '../../core/localLiteRtLmClient.js';
|
|
9
10
|
export declare class ClassifierStrategy implements RoutingStrategy {
|
|
10
11
|
readonly name = "classifier";
|
|
11
|
-
route(context: RoutingContext, config: Config, baseLlmClient: BaseLlmClient): Promise<RoutingDecision | null>;
|
|
12
|
+
route(context: RoutingContext, config: Config, baseLlmClient: BaseLlmClient, _localLiteRtLmClient: LocalLiteRtLmClient): Promise<RoutingDecision | null>;
|
|
12
13
|
}
|
|
@@ -109,7 +109,7 @@ const ClassifierResponseSchema = z.object({
|
|
|
109
109
|
});
|
|
110
110
|
export class ClassifierStrategy {
|
|
111
111
|
name = 'classifier';
|
|
112
|
-
async route(context, config, baseLlmClient) {
|
|
112
|
+
async route(context, config, baseLlmClient, _localLiteRtLmClient) {
|
|
113
113
|
const startTime = Date.now();
|
|
114
114
|
try {
|
|
115
115
|
const model = context.requestedModel ?? config.getModel();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classifierStrategy.js","sourceRoot":"","sources":["../../../../src/routing/strategies/classifierStrategy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAMzE,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAExD,OAAO,EACL,cAAc,EACd,kBAAkB,GACnB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"classifierStrategy.js","sourceRoot":"","sources":["../../../../src/routing/strategies/classifierStrategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ describe('ClassifierStrategy', () => {
|
|
|
16
16
|
let mockContext;
|
|
17
17
|
let mockConfig;
|
|
18
18
|
let mockBaseLlmClient;
|
|
19
|
+
let mockLocalLiteRtLmClient;
|
|
19
20
|
let mockResolvedConfig;
|
|
20
21
|
beforeEach(() => {
|
|
21
22
|
vi.clearAllMocks();
|
|
@@ -43,12 +44,13 @@ describe('ClassifierStrategy', () => {
|
|
|
43
44
|
mockBaseLlmClient = {
|
|
44
45
|
generateJson: vi.fn(),
|
|
45
46
|
};
|
|
47
|
+
mockLocalLiteRtLmClient = {};
|
|
46
48
|
vi.spyOn(promptIdContext, 'getStore').mockReturnValue('test-prompt-id');
|
|
47
49
|
});
|
|
48
50
|
it('should return null if numerical routing is enabled and model is Gemini 3', async () => {
|
|
49
51
|
vi.mocked(mockConfig.getNumericalRoutingEnabled).mockResolvedValue(true);
|
|
50
52
|
vi.mocked(mockConfig.getModel).mockReturnValue(PREVIEW_GEMINI_MODEL_AUTO);
|
|
51
|
-
const decision = await strategy.route(mockContext, mockConfig, mockBaseLlmClient);
|
|
53
|
+
const decision = await strategy.route(mockContext, mockConfig, mockBaseLlmClient, mockLocalLiteRtLmClient);
|
|
52
54
|
expect(decision).toBeNull();
|
|
53
55
|
expect(mockBaseLlmClient.generateJson).not.toHaveBeenCalled();
|
|
54
56
|
});
|
|
@@ -59,7 +61,7 @@ describe('ClassifierStrategy', () => {
|
|
|
59
61
|
reasoning: 'test',
|
|
60
62
|
model_choice: 'flash',
|
|
61
63
|
});
|
|
62
|
-
const decision = await strategy.route(mockContext, mockConfig, mockBaseLlmClient);
|
|
64
|
+
const decision = await strategy.route(mockContext, mockConfig, mockBaseLlmClient, mockLocalLiteRtLmClient);
|
|
63
65
|
expect(decision).not.toBeNull();
|
|
64
66
|
expect(mockBaseLlmClient.generateJson).toHaveBeenCalled();
|
|
65
67
|
});
|
|
@@ -69,7 +71,7 @@ describe('ClassifierStrategy', () => {
|
|
|
69
71
|
model_choice: 'flash',
|
|
70
72
|
};
|
|
71
73
|
vi.mocked(mockBaseLlmClient.generateJson).mockResolvedValue(mockApiResponse);
|
|
72
|
-
await strategy.route(mockContext, mockConfig, mockBaseLlmClient);
|
|
74
|
+
await strategy.route(mockContext, mockConfig, mockBaseLlmClient, mockLocalLiteRtLmClient);
|
|
73
75
|
expect(mockBaseLlmClient.generateJson).toHaveBeenCalledWith(expect.objectContaining({
|
|
74
76
|
modelConfigKey: { model: mockResolvedConfig.model },
|
|
75
77
|
promptId: 'test-prompt-id',
|
|
@@ -81,7 +83,7 @@ describe('ClassifierStrategy', () => {
|
|
|
81
83
|
model_choice: 'flash',
|
|
82
84
|
};
|
|
83
85
|
vi.mocked(mockBaseLlmClient.generateJson).mockResolvedValue(mockApiResponse);
|
|
84
|
-
const decision = await strategy.route(mockContext, mockConfig, mockBaseLlmClient);
|
|
86
|
+
const decision = await strategy.route(mockContext, mockConfig, mockBaseLlmClient, mockLocalLiteRtLmClient);
|
|
85
87
|
expect(mockBaseLlmClient.generateJson).toHaveBeenCalledOnce();
|
|
86
88
|
expect(decision).toEqual({
|
|
87
89
|
model: DEFAULT_GEMINI_FLASH_MODEL,
|
|
@@ -99,7 +101,7 @@ describe('ClassifierStrategy', () => {
|
|
|
99
101
|
};
|
|
100
102
|
vi.mocked(mockBaseLlmClient.generateJson).mockResolvedValue(mockApiResponse);
|
|
101
103
|
mockContext.request = [{ text: 'how do I build a spaceship?' }];
|
|
102
|
-
const decision = await strategy.route(mockContext, mockConfig, mockBaseLlmClient);
|
|
104
|
+
const decision = await strategy.route(mockContext, mockConfig, mockBaseLlmClient, mockLocalLiteRtLmClient);
|
|
103
105
|
expect(mockBaseLlmClient.generateJson).toHaveBeenCalledOnce();
|
|
104
106
|
expect(decision).toEqual({
|
|
105
107
|
model: DEFAULT_GEMINI_MODEL,
|
|
@@ -116,7 +118,7 @@ describe('ClassifierStrategy', () => {
|
|
|
116
118
|
.mockImplementation(() => { });
|
|
117
119
|
const testError = new Error('API Failure');
|
|
118
120
|
vi.mocked(mockBaseLlmClient.generateJson).mockRejectedValue(testError);
|
|
119
|
-
const decision = await strategy.route(mockContext, mockConfig, mockBaseLlmClient);
|
|
121
|
+
const decision = await strategy.route(mockContext, mockConfig, mockBaseLlmClient, mockLocalLiteRtLmClient);
|
|
120
122
|
expect(decision).toBeNull();
|
|
121
123
|
expect(consoleWarnSpy).toHaveBeenCalled();
|
|
122
124
|
consoleWarnSpy.mockRestore();
|
|
@@ -130,7 +132,7 @@ describe('ClassifierStrategy', () => {
|
|
|
130
132
|
// model_choice is missing, which will cause a Zod parsing error.
|
|
131
133
|
};
|
|
132
134
|
vi.mocked(mockBaseLlmClient.generateJson).mockResolvedValue(malformedApiResponse);
|
|
133
|
-
const decision = await strategy.route(mockContext, mockConfig, mockBaseLlmClient);
|
|
135
|
+
const decision = await strategy.route(mockContext, mockConfig, mockBaseLlmClient, mockLocalLiteRtLmClient);
|
|
134
136
|
expect(decision).toBeNull();
|
|
135
137
|
expect(consoleWarnSpy).toHaveBeenCalled();
|
|
136
138
|
consoleWarnSpy.mockRestore();
|
|
@@ -152,7 +154,7 @@ describe('ClassifierStrategy', () => {
|
|
|
152
154
|
model_choice: 'flash',
|
|
153
155
|
};
|
|
154
156
|
vi.mocked(mockBaseLlmClient.generateJson).mockResolvedValue(mockApiResponse);
|
|
155
|
-
await strategy.route(mockContext, mockConfig, mockBaseLlmClient);
|
|
157
|
+
await strategy.route(mockContext, mockConfig, mockBaseLlmClient, mockLocalLiteRtLmClient);
|
|
156
158
|
const generateJsonCall = vi.mocked(mockBaseLlmClient.generateJson).mock
|
|
157
159
|
.calls[0][0];
|
|
158
160
|
const contents = generateJsonCall.contents;
|
|
@@ -181,7 +183,7 @@ describe('ClassifierStrategy', () => {
|
|
|
181
183
|
model_choice: 'flash',
|
|
182
184
|
};
|
|
183
185
|
vi.mocked(mockBaseLlmClient.generateJson).mockResolvedValue(mockApiResponse);
|
|
184
|
-
await strategy.route(mockContext, mockConfig, mockBaseLlmClient);
|
|
186
|
+
await strategy.route(mockContext, mockConfig, mockBaseLlmClient, mockLocalLiteRtLmClient);
|
|
185
187
|
const generateJsonCall = vi.mocked(mockBaseLlmClient.generateJson).mock
|
|
186
188
|
.calls[0][0];
|
|
187
189
|
const contents = generateJsonCall.contents;
|
|
@@ -208,7 +210,7 @@ describe('ClassifierStrategy', () => {
|
|
|
208
210
|
model_choice: 'flash',
|
|
209
211
|
};
|
|
210
212
|
vi.mocked(mockBaseLlmClient.generateJson).mockResolvedValue(mockApiResponse);
|
|
211
|
-
await strategy.route(mockContext, mockConfig, mockBaseLlmClient);
|
|
213
|
+
await strategy.route(mockContext, mockConfig, mockBaseLlmClient, mockLocalLiteRtLmClient);
|
|
212
214
|
const generateJsonCall = vi.mocked(mockBaseLlmClient.generateJson).mock
|
|
213
215
|
.calls[0][0];
|
|
214
216
|
expect(generateJsonCall.promptId).toMatch(/^classifier-router-fallback-\d+-\w+$/);
|
|
@@ -226,7 +228,7 @@ describe('ClassifierStrategy', () => {
|
|
|
226
228
|
...mockContext,
|
|
227
229
|
requestedModel,
|
|
228
230
|
};
|
|
229
|
-
const decision = await strategy.route(contextWithRequestedModel, mockConfig, mockBaseLlmClient);
|
|
231
|
+
const decision = await strategy.route(contextWithRequestedModel, mockConfig, mockBaseLlmClient, mockLocalLiteRtLmClient);
|
|
230
232
|
expect(decision).not.toBeNull();
|
|
231
233
|
// Since requestedModel is Pro, and choice is flash, it should resolve to Flash
|
|
232
234
|
expect(decision?.model).toBe(DEFAULT_GEMINI_FLASH_MODEL);
|
|
@@ -240,7 +242,7 @@ describe('ClassifierStrategy', () => {
|
|
|
240
242
|
model_choice: 'pro',
|
|
241
243
|
};
|
|
242
244
|
vi.mocked(mockBaseLlmClient.generateJson).mockResolvedValue(mockApiResponse);
|
|
243
|
-
const decision = await strategy.route(mockContext, mockConfig, mockBaseLlmClient);
|
|
245
|
+
const decision = await strategy.route(mockContext, mockConfig, mockBaseLlmClient, mockLocalLiteRtLmClient);
|
|
244
246
|
expect(decision?.model).toBe(PREVIEW_GEMINI_3_1_MODEL);
|
|
245
247
|
});
|
|
246
248
|
it('should route to PREVIEW_GEMINI_3_1_CUSTOM_TOOLS_MODEL when Gemini 3.1 is launched and auth is USE_GEMINI', async () => {
|
|
@@ -254,7 +256,7 @@ describe('ClassifierStrategy', () => {
|
|
|
254
256
|
model_choice: 'pro',
|
|
255
257
|
};
|
|
256
258
|
vi.mocked(mockBaseLlmClient.generateJson).mockResolvedValue(mockApiResponse);
|
|
257
|
-
const decision = await strategy.route(mockContext, mockConfig, mockBaseLlmClient);
|
|
259
|
+
const decision = await strategy.route(mockContext, mockConfig, mockBaseLlmClient, mockLocalLiteRtLmClient);
|
|
258
260
|
expect(decision?.model).toBe(PREVIEW_GEMINI_3_1_CUSTOM_TOOLS_MODEL);
|
|
259
261
|
});
|
|
260
262
|
});
|