@google/gemini-cli-core 0.21.0-nightly.20251217.db643e916 → 0.21.0-nightly.20251218.739c02bd6
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/google-gemini-cli-core-0.21.0-nightly.20251216.bb0c0d8ee.tgz +0 -0
- 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.d.ts +2 -2
- package/dist/src/agents/codebase-investigator.js +6 -5
- 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.js +8 -4
- package/dist/src/agents/delegate-to-agent-tool.js.map +1 -1
- package/dist/src/agents/delegate-to-agent-tool.test.js +5 -4
- package/dist/src/agents/delegate-to-agent-tool.test.js.map +1 -1
- package/dist/src/agents/{executor.d.ts → local-executor.d.ts} +5 -5
- package/dist/src/agents/{executor.js → local-executor.js} +7 -7
- package/dist/src/agents/local-executor.js.map +1 -0
- package/dist/src/agents/local-executor.test.d.ts +12 -0
- package/dist/src/agents/{executor.test.js → local-executor.test.js} +40 -39
- package/dist/src/agents/local-executor.test.js.map +1 -0
- package/dist/src/agents/{invocation.d.ts → local-invocation.d.ts} +5 -6
- package/dist/src/agents/{invocation.js → local-invocation.js} +8 -9
- package/dist/src/agents/local-invocation.js.map +1 -0
- package/dist/src/agents/{invocation.test.js → local-invocation.test.js} +18 -17
- package/dist/src/agents/local-invocation.test.js.map +1 -0
- package/dist/src/agents/registry.js +35 -24
- package/dist/src/agents/registry.js.map +1 -1
- package/dist/src/agents/registry.test.js +34 -4
- package/dist/src/agents/registry.test.js.map +1 -1
- package/dist/src/agents/remote-invocation.d.ts +21 -0
- package/dist/src/agents/remote-invocation.js +31 -0
- package/dist/src/agents/remote-invocation.js.map +1 -0
- package/dist/src/agents/remote-invocation.test.js +35 -0
- package/dist/src/agents/remote-invocation.test.js.map +1 -0
- package/dist/src/agents/subagent-tool-wrapper.js +7 -3
- package/dist/src/agents/subagent-tool-wrapper.js.map +1 -1
- package/dist/src/agents/subagent-tool-wrapper.test.js +10 -9
- package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -1
- package/dist/src/agents/types.d.ts +12 -4
- package/dist/src/availability/policyCatalog.d.ts +1 -0
- package/dist/src/availability/policyCatalog.js +6 -8
- 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 +9 -5
- package/dist/src/availability/policyHelpers.js +43 -37
- package/dist/src/availability/policyHelpers.js.map +1 -1
- package/dist/src/availability/policyHelpers.test.js +58 -20
- package/dist/src/availability/policyHelpers.test.js.map +1 -1
- package/dist/src/code_assist/oauth2.js +1 -1
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +6 -8
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/server.js +3 -9
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/server.test.js +18 -3
- package/dist/src/code_assist/server.test.js.map +1 -1
- package/dist/src/code_assist/telemetry.d.ts +6 -1
- package/dist/src/code_assist/telemetry.js +92 -3
- package/dist/src/code_assist/telemetry.js.map +1 -1
- package/dist/src/code_assist/telemetry.test.js +206 -18
- package/dist/src/code_assist/telemetry.test.js.map +1 -1
- package/dist/src/config/config.d.ts +6 -13
- package/dist/src/config/config.js +61 -38
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +134 -22
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/defaultModelConfigs.js +11 -0
- package/dist/src/config/defaultModelConfigs.js.map +1 -1
- package/dist/src/config/flashFallback.test.js +0 -37
- package/dist/src/config/flashFallback.test.js.map +1 -1
- package/dist/src/config/models.d.ts +23 -10
- package/dist/src/config/models.js +65 -23
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/config/models.test.js +57 -76
- package/dist/src/config/models.test.js.map +1 -1
- package/dist/src/core/baseLlmClient.d.ts +3 -1
- package/dist/src/core/baseLlmClient.js +51 -43
- package/dist/src/core/baseLlmClient.js.map +1 -1
- package/dist/src/core/baseLlmClient.test.js +12 -19
- package/dist/src/core/baseLlmClient.test.js.map +1 -1
- package/dist/src/core/client.js +18 -33
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +14 -65
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.js +1 -1
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +0 -6
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/geminiChat.js +29 -88
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +35 -257
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/geminiChat_network_retry.test.js +6 -6
- package/dist/src/core/geminiChat_network_retry.test.js.map +1 -1
- package/dist/src/core/prompts.js +6 -7
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/prompts.test.js +10 -7
- package/dist/src/core/prompts.test.js.map +1 -1
- package/dist/src/core/turn.d.ts +1 -0
- package/dist/src/core/turn.js +3 -2
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/fallback/handler.js +54 -121
- package/dist/src/fallback/handler.js.map +1 -1
- package/dist/src/fallback/handler.test.js +80 -285
- 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/index.d.ts +2 -0
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/routing/modelRouterService.js +0 -15
- package/dist/src/routing/modelRouterService.js.map +1 -1
- package/dist/src/routing/modelRouterService.test.js +0 -62
- package/dist/src/routing/modelRouterService.test.js.map +1 -1
- package/dist/src/routing/strategies/classifierStrategy.js +10 -21
- package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
- package/dist/src/routing/strategies/classifierStrategy.test.js +2 -1
- package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/fallbackStrategy.js +20 -12
- package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -1
- package/dist/src/routing/strategies/fallbackStrategy.test.js +63 -39
- package/dist/src/routing/strategies/fallbackStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/overrideStrategy.js +4 -3
- package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
- package/dist/src/services/chatCompressionService.js +3 -1
- package/dist/src/services/chatCompressionService.js.map +1 -1
- package/dist/src/services/loopDetectionService.js +2 -1
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/loopDetectionService.test.js +14 -8
- package/dist/src/services/loopDetectionService.test.js.map +1 -1
- package/dist/src/services/modelConfig.integration.test.js +1 -1
- package/dist/src/services/modelConfig.integration.test.js.map +1 -1
- package/dist/src/services/test-data/resolved-aliases-retry.golden.json +16 -0
- package/dist/src/services/test-data/resolved-aliases.golden.json +16 -0
- package/dist/src/telemetry/sdk.js +2 -2
- package/dist/src/telemetry/sdk.js.map +1 -1
- package/dist/src/tools/ripGrep.js +2 -2
- package/dist/src/tools/ripGrep.js.map +1 -1
- package/dist/src/utils/checkpointUtils.js +1 -1
- package/dist/src/utils/checkpointUtils.js.map +1 -1
- package/dist/src/utils/checkpointUtils.test.js +1 -1
- package/dist/src/utils/checkpointUtils.test.js.map +1 -1
- package/dist/src/utils/editCorrector.js +1 -1
- package/dist/src/utils/editCorrector.js.map +1 -1
- package/dist/src/utils/editCorrector.test.js +2 -2
- package/dist/src/utils/editCorrector.test.js.map +1 -1
- package/dist/src/utils/environmentContext.d.ts +1 -0
- package/dist/src/utils/environmentContext.js +1 -0
- package/dist/src/utils/environmentContext.js.map +1 -1
- package/dist/src/utils/events.d.ts +0 -16
- package/dist/src/utils/events.js +0 -9
- package/dist/src/utils/events.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/retry.js +2 -16
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js +7 -22
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/dist/src/agents/executor.js.map +0 -1
- package/dist/src/agents/executor.test.js.map +0 -1
- package/dist/src/agents/invocation.js.map +0 -1
- package/dist/src/agents/invocation.test.js.map +0 -1
- /package/dist/src/agents/{executor.test.d.ts → local-invocation.test.d.ts} +0 -0
- /package/dist/src/agents/{invocation.test.d.ts → remote-invocation.test.d.ts} +0 -0
|
@@ -3,11 +3,13 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
7
|
-
import { createConversationOffered, formatProtoJsonDuration, } from './telemetry.js';
|
|
8
|
-
import { ActionStatus } from './types.js';
|
|
9
|
-
import { FinishReason, GenerateContentResponse } from '@google/genai';
|
|
10
|
-
|
|
6
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
+
import { createConversationOffered, formatProtoJsonDuration, recordConversationOffered, recordToolCallInteractions, } from './telemetry.js';
|
|
8
|
+
import { ActionStatus, ConversationInteractionInteraction, } from './types.js';
|
|
9
|
+
import { FinishReason, GenerateContentResponse, } from '@google/genai';
|
|
10
|
+
import * as codeAssist from './codeAssist.js';
|
|
11
|
+
import { ToolConfirmationOutcome, } from '../tools/tools.js';
|
|
12
|
+
function createMockResponse(candidates = [], ok = true, functionCalls = undefined) {
|
|
11
13
|
const response = new GenerateContentResponse();
|
|
12
14
|
response.candidates = candidates;
|
|
13
15
|
response.sdkHttpResponse = {
|
|
@@ -16,6 +18,17 @@ function createMockResponse(candidates = [], ok = true) {
|
|
|
16
18
|
},
|
|
17
19
|
json: async () => ({}),
|
|
18
20
|
};
|
|
21
|
+
// If functionCalls is explicitly provided, mock the getter.
|
|
22
|
+
// Otherwise, let the default behavior (if any) or undefined prevail.
|
|
23
|
+
// In the real SDK, functionCalls is a getter derived from candidates.
|
|
24
|
+
// For testing `createConversationOffered` which guards on functionCalls,
|
|
25
|
+
// we often need to force it to be present.
|
|
26
|
+
if (functionCalls !== undefined) {
|
|
27
|
+
Object.defineProperty(response, 'functionCalls', {
|
|
28
|
+
get: () => functionCalls,
|
|
29
|
+
configurable: true,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
19
32
|
return response;
|
|
20
33
|
}
|
|
21
34
|
describe('telemetry', () => {
|
|
@@ -35,7 +48,7 @@ describe('telemetry', () => {
|
|
|
35
48
|
},
|
|
36
49
|
finishReason: FinishReason.STOP,
|
|
37
50
|
},
|
|
38
|
-
]);
|
|
51
|
+
], true, [{ name: 'someTool', args: {} }]);
|
|
39
52
|
const traceId = 'test-trace-id';
|
|
40
53
|
const streamingLatency = { totalLatency: '1s' };
|
|
41
54
|
const result = createConversationOffered(response, traceId, undefined, streamingLatency);
|
|
@@ -48,17 +61,34 @@ describe('telemetry', () => {
|
|
|
48
61
|
isAgentic: true,
|
|
49
62
|
});
|
|
50
63
|
});
|
|
64
|
+
it('should return undefined if no function calls', () => {
|
|
65
|
+
const response = createMockResponse([
|
|
66
|
+
{
|
|
67
|
+
index: 0,
|
|
68
|
+
content: {
|
|
69
|
+
role: 'model',
|
|
70
|
+
parts: [{ text: 'response without function calls' }],
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
], true, []);
|
|
74
|
+
const result = createConversationOffered(response, 'trace-id', undefined, {});
|
|
75
|
+
expect(result).toBeUndefined();
|
|
76
|
+
});
|
|
51
77
|
it('should set status to CANCELLED if signal is aborted', () => {
|
|
52
|
-
const response = createMockResponse(
|
|
78
|
+
const response = createMockResponse([], true, [
|
|
79
|
+
{ name: 'tool', args: {} },
|
|
80
|
+
]);
|
|
53
81
|
const signal = new AbortController().signal;
|
|
54
82
|
vi.spyOn(signal, 'aborted', 'get').mockReturnValue(true);
|
|
55
83
|
const result = createConversationOffered(response, 'trace-id', signal, {});
|
|
56
|
-
expect(result
|
|
84
|
+
expect(result?.status).toBe(ActionStatus.ACTION_STATUS_CANCELLED);
|
|
57
85
|
});
|
|
58
86
|
it('should set status to ERROR_UNKNOWN if response has error (non-OK SDK response)', () => {
|
|
59
|
-
const response = createMockResponse([], false
|
|
87
|
+
const response = createMockResponse([], false, [
|
|
88
|
+
{ name: 'tool', args: {} },
|
|
89
|
+
]);
|
|
60
90
|
const result = createConversationOffered(response, 'trace-id', undefined, {});
|
|
61
|
-
expect(result
|
|
91
|
+
expect(result?.status).toBe(ActionStatus.ACTION_STATUS_ERROR_UNKNOWN);
|
|
62
92
|
});
|
|
63
93
|
it('should set status to ERROR_UNKNOWN if finishReason is not STOP or MAX_TOKENS', () => {
|
|
64
94
|
const response = createMockResponse([
|
|
@@ -66,14 +96,18 @@ describe('telemetry', () => {
|
|
|
66
96
|
index: 0,
|
|
67
97
|
finishReason: FinishReason.SAFETY,
|
|
68
98
|
},
|
|
69
|
-
]);
|
|
99
|
+
], true, [{ name: 'tool', args: {} }]);
|
|
70
100
|
const result = createConversationOffered(response, 'trace-id', undefined, {});
|
|
71
|
-
expect(result
|
|
101
|
+
expect(result?.status).toBe(ActionStatus.ACTION_STATUS_ERROR_UNKNOWN);
|
|
72
102
|
});
|
|
73
103
|
it('should set status to EMPTY if candidates is empty', () => {
|
|
74
|
-
|
|
104
|
+
// We force functionCalls to be present to bypass the guard,
|
|
105
|
+
// simulating a state where we want to test the candidates check.
|
|
106
|
+
const response = createMockResponse([], true, [
|
|
107
|
+
{ name: 'tool', args: {} },
|
|
108
|
+
]);
|
|
75
109
|
const result = createConversationOffered(response, 'trace-id', undefined, {});
|
|
76
|
-
expect(result
|
|
110
|
+
expect(result?.status).toBe(ActionStatus.ACTION_STATUS_EMPTY);
|
|
77
111
|
});
|
|
78
112
|
it('should detect code in response', () => {
|
|
79
113
|
const response = createMockResponse([
|
|
@@ -85,9 +119,9 @@ describe('telemetry', () => {
|
|
|
85
119
|
],
|
|
86
120
|
},
|
|
87
121
|
},
|
|
88
|
-
]);
|
|
122
|
+
], true, [{ name: 'tool', args: {} }]);
|
|
89
123
|
const result = createConversationOffered(response, 'id', undefined, {});
|
|
90
|
-
expect(result
|
|
124
|
+
expect(result?.includedCode).toBe(true);
|
|
91
125
|
});
|
|
92
126
|
it('should not detect code if no backticks', () => {
|
|
93
127
|
const response = createMockResponse([
|
|
@@ -97,9 +131,9 @@ describe('telemetry', () => {
|
|
|
97
131
|
parts: [{ text: 'Here is some text.' }],
|
|
98
132
|
},
|
|
99
133
|
},
|
|
100
|
-
]);
|
|
134
|
+
], true, [{ name: 'tool', args: {} }]);
|
|
101
135
|
const result = createConversationOffered(response, 'id', undefined, {});
|
|
102
|
-
expect(result
|
|
136
|
+
expect(result?.includedCode).toBe(false);
|
|
103
137
|
});
|
|
104
138
|
});
|
|
105
139
|
describe('formatProtoJsonDuration', () => {
|
|
@@ -108,5 +142,159 @@ describe('telemetry', () => {
|
|
|
108
142
|
expect(formatProtoJsonDuration(100)).toBe('0.1s');
|
|
109
143
|
});
|
|
110
144
|
});
|
|
145
|
+
describe('recordConversationOffered', () => {
|
|
146
|
+
it('should call server.recordConversationOffered if traceId is present', async () => {
|
|
147
|
+
const serverMock = {
|
|
148
|
+
recordConversationOffered: vi.fn(),
|
|
149
|
+
};
|
|
150
|
+
const response = createMockResponse([], true, [
|
|
151
|
+
{ name: 'tool', args: {} },
|
|
152
|
+
]);
|
|
153
|
+
const streamingLatency = {};
|
|
154
|
+
await recordConversationOffered(serverMock, 'trace-id', response, streamingLatency, undefined);
|
|
155
|
+
expect(serverMock.recordConversationOffered).toHaveBeenCalledWith(expect.objectContaining({
|
|
156
|
+
traceId: 'trace-id',
|
|
157
|
+
}));
|
|
158
|
+
});
|
|
159
|
+
it('should not call server.recordConversationOffered if traceId is undefined', async () => {
|
|
160
|
+
const serverMock = {
|
|
161
|
+
recordConversationOffered: vi.fn(),
|
|
162
|
+
};
|
|
163
|
+
const response = createMockResponse([], true, [
|
|
164
|
+
{ name: 'tool', args: {} },
|
|
165
|
+
]);
|
|
166
|
+
await recordConversationOffered(serverMock, undefined, response, {}, undefined);
|
|
167
|
+
expect(serverMock.recordConversationOffered).not.toHaveBeenCalled();
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
describe('recordToolCallInteractions', () => {
|
|
171
|
+
let mockServer;
|
|
172
|
+
beforeEach(() => {
|
|
173
|
+
mockServer = {
|
|
174
|
+
recordConversationInteraction: vi.fn(),
|
|
175
|
+
};
|
|
176
|
+
vi.spyOn(codeAssist, 'getCodeAssistServer').mockReturnValue(mockServer);
|
|
177
|
+
});
|
|
178
|
+
afterEach(() => {
|
|
179
|
+
vi.restoreAllMocks();
|
|
180
|
+
});
|
|
181
|
+
it('should record ACCEPT_FILE interaction for accepted edit tools', async () => {
|
|
182
|
+
const toolCalls = [
|
|
183
|
+
{
|
|
184
|
+
request: {
|
|
185
|
+
name: 'replace', // in EDIT_TOOL_NAMES
|
|
186
|
+
args: {},
|
|
187
|
+
callId: 'call-1',
|
|
188
|
+
isClientInitiated: false,
|
|
189
|
+
prompt_id: 'p1',
|
|
190
|
+
traceId: 'trace-1',
|
|
191
|
+
},
|
|
192
|
+
outcome: ToolConfirmationOutcome.ProceedOnce,
|
|
193
|
+
status: 'success',
|
|
194
|
+
},
|
|
195
|
+
];
|
|
196
|
+
await recordToolCallInteractions({}, toolCalls);
|
|
197
|
+
expect(mockServer.recordConversationInteraction).toHaveBeenCalledWith({
|
|
198
|
+
traceId: 'trace-1',
|
|
199
|
+
status: ActionStatus.ACTION_STATUS_NO_ERROR,
|
|
200
|
+
interaction: ConversationInteractionInteraction.ACCEPT_FILE,
|
|
201
|
+
isAgentic: true,
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
it('should record UNKNOWN interaction for other accepted tools', async () => {
|
|
205
|
+
const toolCalls = [
|
|
206
|
+
{
|
|
207
|
+
request: {
|
|
208
|
+
name: 'read_file', // NOT in EDIT_TOOL_NAMES
|
|
209
|
+
args: {},
|
|
210
|
+
callId: 'call-2',
|
|
211
|
+
isClientInitiated: false,
|
|
212
|
+
prompt_id: 'p2',
|
|
213
|
+
traceId: 'trace-2',
|
|
214
|
+
},
|
|
215
|
+
outcome: ToolConfirmationOutcome.ProceedOnce,
|
|
216
|
+
status: 'success',
|
|
217
|
+
},
|
|
218
|
+
];
|
|
219
|
+
await recordToolCallInteractions({}, toolCalls);
|
|
220
|
+
expect(mockServer.recordConversationInteraction).toHaveBeenCalledWith({
|
|
221
|
+
traceId: 'trace-2',
|
|
222
|
+
status: ActionStatus.ACTION_STATUS_NO_ERROR,
|
|
223
|
+
interaction: ConversationInteractionInteraction.UNKNOWN,
|
|
224
|
+
isAgentic: true,
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
it('should not record interaction for cancelled status', async () => {
|
|
228
|
+
const toolCalls = [
|
|
229
|
+
{
|
|
230
|
+
request: {
|
|
231
|
+
name: 'tool',
|
|
232
|
+
args: {},
|
|
233
|
+
callId: 'call-3',
|
|
234
|
+
isClientInitiated: false,
|
|
235
|
+
prompt_id: 'p3',
|
|
236
|
+
traceId: 'trace-3',
|
|
237
|
+
},
|
|
238
|
+
status: 'cancelled',
|
|
239
|
+
response: {},
|
|
240
|
+
tool: {},
|
|
241
|
+
invocation: {},
|
|
242
|
+
},
|
|
243
|
+
];
|
|
244
|
+
await recordToolCallInteractions({}, toolCalls);
|
|
245
|
+
expect(mockServer.recordConversationInteraction).not.toHaveBeenCalled();
|
|
246
|
+
});
|
|
247
|
+
it('should not record interaction for error status', async () => {
|
|
248
|
+
const toolCalls = [
|
|
249
|
+
{
|
|
250
|
+
request: {
|
|
251
|
+
name: 'tool',
|
|
252
|
+
args: {},
|
|
253
|
+
callId: 'call-4',
|
|
254
|
+
isClientInitiated: false,
|
|
255
|
+
prompt_id: 'p4',
|
|
256
|
+
traceId: 'trace-4',
|
|
257
|
+
},
|
|
258
|
+
status: 'error',
|
|
259
|
+
response: {
|
|
260
|
+
error: new Error('fail'),
|
|
261
|
+
},
|
|
262
|
+
},
|
|
263
|
+
];
|
|
264
|
+
await recordToolCallInteractions({}, toolCalls);
|
|
265
|
+
expect(mockServer.recordConversationInteraction).not.toHaveBeenCalled();
|
|
266
|
+
});
|
|
267
|
+
it('should not record interaction if tool calls are mixed or not 100% accepted', async () => {
|
|
268
|
+
// Logic: traceId && acceptedToolCalls / toolCalls.length >= 1
|
|
269
|
+
const toolCalls = [
|
|
270
|
+
{
|
|
271
|
+
request: {
|
|
272
|
+
name: 't1',
|
|
273
|
+
args: {},
|
|
274
|
+
callId: 'c1',
|
|
275
|
+
isClientInitiated: false,
|
|
276
|
+
prompt_id: 'p1',
|
|
277
|
+
traceId: 't1',
|
|
278
|
+
},
|
|
279
|
+
outcome: ToolConfirmationOutcome.ProceedOnce,
|
|
280
|
+
status: 'success',
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
request: {
|
|
284
|
+
name: 't2',
|
|
285
|
+
args: {},
|
|
286
|
+
callId: 'c2',
|
|
287
|
+
isClientInitiated: false,
|
|
288
|
+
prompt_id: 'p1',
|
|
289
|
+
traceId: 't1',
|
|
290
|
+
},
|
|
291
|
+
outcome: ToolConfirmationOutcome.Cancel, // Rejected
|
|
292
|
+
status: 'success',
|
|
293
|
+
},
|
|
294
|
+
];
|
|
295
|
+
await recordToolCallInteractions({}, toolCalls);
|
|
296
|
+
expect(mockServer.recordConversationInteraction).not.toHaveBeenCalled();
|
|
297
|
+
});
|
|
298
|
+
});
|
|
111
299
|
});
|
|
112
300
|
//# sourceMappingURL=telemetry.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.test.js","sourceRoot":"","sources":["../../../src/code_assist/telemetry.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"telemetry.test.js","sourceRoot":"","sources":["../../../src/code_assist/telemetry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,6 +36,7 @@ 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';
|
|
39
40
|
import type { Experiments } from '../code_assist/experiments/experiments.js';
|
|
40
41
|
import { AgentRegistry } from '../agents/registry.js';
|
|
41
42
|
import { ApprovalMode } from '../policy/types.js';
|
|
@@ -229,7 +230,6 @@ export interface ConfigParameters {
|
|
|
229
230
|
});
|
|
230
231
|
previewFeatures?: boolean;
|
|
231
232
|
enableAgents?: boolean;
|
|
232
|
-
enableModelAvailabilityService?: boolean;
|
|
233
233
|
experimentalJitContext?: boolean;
|
|
234
234
|
}
|
|
235
235
|
export declare class Config {
|
|
@@ -279,10 +279,10 @@ export declare class Config {
|
|
|
279
279
|
private readonly bugCommand;
|
|
280
280
|
private model;
|
|
281
281
|
private previewFeatures;
|
|
282
|
+
private hasAccessToPreviewModel;
|
|
282
283
|
private readonly noBrowser;
|
|
283
284
|
private readonly folderTrust;
|
|
284
285
|
private ideMode;
|
|
285
|
-
private inFallbackMode;
|
|
286
286
|
private _activeModel;
|
|
287
287
|
private readonly maxSessionTurns;
|
|
288
288
|
private readonly listSessions;
|
|
@@ -336,9 +336,6 @@ export declare class Config {
|
|
|
336
336
|
private experiments;
|
|
337
337
|
private experimentsPromise;
|
|
338
338
|
private hookSystem?;
|
|
339
|
-
private previewModelFallbackMode;
|
|
340
|
-
private previewModelBypassMode;
|
|
341
|
-
private readonly enableModelAvailabilityService;
|
|
342
339
|
private readonly enableAgents;
|
|
343
340
|
private readonly experimentalJitContext;
|
|
344
341
|
private contextManager?;
|
|
@@ -365,15 +362,9 @@ export declare class Config {
|
|
|
365
362
|
setModel(newModel: string): void;
|
|
366
363
|
getActiveModel(): string;
|
|
367
364
|
setActiveModel(model: string): void;
|
|
368
|
-
resetTurn(): void;
|
|
369
|
-
isInFallbackMode(): boolean;
|
|
370
|
-
setFallbackMode(active: boolean): void;
|
|
371
365
|
setFallbackModelHandler(handler: FallbackModelHandler): void;
|
|
372
366
|
getFallbackModelHandler(): FallbackModelHandler | undefined;
|
|
373
|
-
|
|
374
|
-
setPreviewModelFallbackMode(active: boolean): void;
|
|
375
|
-
isPreviewModelBypassMode(): boolean;
|
|
376
|
-
setPreviewModelBypassMode(active: boolean): void;
|
|
367
|
+
resetTurn(): void;
|
|
377
368
|
getMaxSessionTurns(): number;
|
|
378
369
|
setQuotaErrorOccurred(value: boolean): void;
|
|
379
370
|
getQuotaErrorOccurred(): boolean;
|
|
@@ -391,6 +382,9 @@ export declare class Config {
|
|
|
391
382
|
getQuestion(): string | undefined;
|
|
392
383
|
getPreviewFeatures(): boolean | undefined;
|
|
393
384
|
setPreviewFeatures(previewFeatures: boolean): void;
|
|
385
|
+
getHasAccessToPreviewModel(): boolean;
|
|
386
|
+
setHasAccessToPreviewModel(hasAccess: boolean): void;
|
|
387
|
+
refreshUserQuota(): Promise<RetrieveUserQuotaResponse | undefined>;
|
|
394
388
|
getCoreTools(): string[] | undefined;
|
|
395
389
|
getAllowedTools(): string[] | undefined;
|
|
396
390
|
/**
|
|
@@ -472,7 +466,6 @@ export declare class Config {
|
|
|
472
466
|
getExtensionLoader(): ExtensionLoader;
|
|
473
467
|
getEnabledExtensions(): string[];
|
|
474
468
|
getEnableExtensionReloading(): boolean;
|
|
475
|
-
isModelAvailabilityServiceEnabled(): boolean;
|
|
476
469
|
isAgentsEnabled(): boolean;
|
|
477
470
|
getNoBrowser(): boolean;
|
|
478
471
|
isBrowserLaunchSuppressed(): boolean;
|
|
@@ -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, DEFAULT_THINKING_MODE, } from './models.js';
|
|
32
|
+
import { DEFAULT_GEMINI_EMBEDDING_MODEL, DEFAULT_GEMINI_FLASH_MODEL, DEFAULT_GEMINI_MODEL_AUTO, DEFAULT_THINKING_MODE, isPreviewModel, PREVIEW_GEMINI_MODEL, PREVIEW_GEMINI_MODEL_AUTO, } 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';
|
|
@@ -184,10 +184,10 @@ export class Config {
|
|
|
184
184
|
bugCommand;
|
|
185
185
|
model;
|
|
186
186
|
previewFeatures;
|
|
187
|
+
hasAccessToPreviewModel = false;
|
|
187
188
|
noBrowser;
|
|
188
189
|
folderTrust;
|
|
189
190
|
ideMode;
|
|
190
|
-
inFallbackMode = false;
|
|
191
191
|
_activeModel;
|
|
192
192
|
maxSessionTurns;
|
|
193
193
|
listSessions;
|
|
@@ -241,9 +241,6 @@ export class Config {
|
|
|
241
241
|
experiments;
|
|
242
242
|
experimentsPromise;
|
|
243
243
|
hookSystem;
|
|
244
|
-
previewModelFallbackMode = false;
|
|
245
|
-
previewModelBypassMode = false;
|
|
246
|
-
enableModelAvailabilityService;
|
|
247
244
|
enableAgents;
|
|
248
245
|
experimentalJitContext;
|
|
249
246
|
contextManager;
|
|
@@ -300,8 +297,6 @@ export class Config {
|
|
|
300
297
|
this.bugCommand = params.bugCommand;
|
|
301
298
|
this.model = params.model;
|
|
302
299
|
this._activeModel = params.model;
|
|
303
|
-
this.enableModelAvailabilityService =
|
|
304
|
-
params.enableModelAvailabilityService ?? false;
|
|
305
300
|
this.enableAgents = params.enableAgents ?? false;
|
|
306
301
|
this.experimentalJitContext = params.experimentalJitContext ?? false;
|
|
307
302
|
this.modelAvailabilityService = new ModelAvailabilityService();
|
|
@@ -343,7 +338,10 @@ export class Config {
|
|
|
343
338
|
params.truncateToolOutputLines ?? DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES;
|
|
344
339
|
this.enableToolOutputTruncation = params.enableToolOutputTruncation ?? true;
|
|
345
340
|
this.useSmartEdit = params.useSmartEdit ?? true;
|
|
346
|
-
|
|
341
|
+
// // TODO(joshualitt): Re-evaluate the todo tool for 3 family.
|
|
342
|
+
this.useWriteTodos = isPreviewModel(this.model)
|
|
343
|
+
? false
|
|
344
|
+
: (params.useWriteTodos ?? true);
|
|
347
345
|
this.enableHooks = params.enableHooks ?? false;
|
|
348
346
|
this.disabledHooks =
|
|
349
347
|
(params.hooks && 'disabled' in params.hooks
|
|
@@ -479,20 +477,24 @@ export class Config {
|
|
|
479
477
|
// Restore the conversation history to the new client
|
|
480
478
|
this.geminiClient.stripThoughtsFromHistory();
|
|
481
479
|
}
|
|
480
|
+
// Reset availability status when switching auth (e.g. from limited key to OAuth)
|
|
481
|
+
this.modelAvailabilityService.reset();
|
|
482
482
|
const newContentGeneratorConfig = await createContentGeneratorConfig(this, authMethod);
|
|
483
483
|
this.contentGenerator = await createContentGenerator(newContentGeneratorConfig, this, this.getSessionId());
|
|
484
484
|
// Only assign to instance properties after successful initialization
|
|
485
485
|
this.contentGeneratorConfig = newContentGeneratorConfig;
|
|
486
486
|
// Initialize BaseLlmClient now that the ContentGenerator is available
|
|
487
487
|
this.baseLlmClient = new BaseLlmClient(this.contentGenerator, this);
|
|
488
|
-
const previewFeatures = this.getPreviewFeatures();
|
|
489
488
|
const codeAssistServer = getCodeAssistServer(this);
|
|
490
489
|
if (codeAssistServer) {
|
|
490
|
+
if (codeAssistServer.projectId) {
|
|
491
|
+
await this.refreshUserQuota();
|
|
492
|
+
}
|
|
491
493
|
this.experimentsPromise = getExperiments(codeAssistServer)
|
|
492
494
|
.then((experiments) => {
|
|
493
495
|
this.setExperiments(experiments);
|
|
494
496
|
// 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
|
|
495
|
-
if (
|
|
497
|
+
if (this.getPreviewFeatures() === undefined) {
|
|
496
498
|
const remotePreviewFeatures = experiments.flags[ExperimentFlags.ENABLE_PREVIEW]?.boolValue;
|
|
497
499
|
if (remotePreviewFeatures === true) {
|
|
498
500
|
this.setPreviewFeatures(remotePreviewFeatures);
|
|
@@ -507,8 +509,15 @@ export class Config {
|
|
|
507
509
|
this.experiments = undefined;
|
|
508
510
|
this.experimentsPromise = undefined;
|
|
509
511
|
}
|
|
510
|
-
|
|
511
|
-
|
|
512
|
+
const authType = this.contentGeneratorConfig.authType;
|
|
513
|
+
if (authType === AuthType.USE_GEMINI ||
|
|
514
|
+
authType === AuthType.USE_VERTEX_AI) {
|
|
515
|
+
this.setHasAccessToPreviewModel(true);
|
|
516
|
+
}
|
|
517
|
+
// Update model if user no longer has access to the preview model
|
|
518
|
+
if (!this.hasAccessToPreviewModel && isPreviewModel(this.model)) {
|
|
519
|
+
this.setModel(DEFAULT_GEMINI_MODEL_AUTO);
|
|
520
|
+
}
|
|
512
521
|
}
|
|
513
522
|
async getExperimentsAsync() {
|
|
514
523
|
if (this.experiments) {
|
|
@@ -560,13 +569,12 @@ export class Config {
|
|
|
560
569
|
return this.model;
|
|
561
570
|
}
|
|
562
571
|
setModel(newModel) {
|
|
563
|
-
if (this.model !== newModel || this.
|
|
572
|
+
if (this.model !== newModel || this._activeModel !== newModel) {
|
|
564
573
|
this.model = newModel;
|
|
565
574
|
// When the user explicitly sets a model, that becomes the active model.
|
|
566
575
|
this._activeModel = newModel;
|
|
567
576
|
coreEvents.emitModelChanged(newModel);
|
|
568
577
|
}
|
|
569
|
-
this.setFallbackMode(false);
|
|
570
578
|
this.modelAvailabilityService.reset();
|
|
571
579
|
}
|
|
572
580
|
getActiveModel() {
|
|
@@ -575,35 +583,16 @@ export class Config {
|
|
|
575
583
|
setActiveModel(model) {
|
|
576
584
|
if (this._activeModel !== model) {
|
|
577
585
|
this._activeModel = model;
|
|
578
|
-
coreEvents.emitModelChanged(model);
|
|
579
586
|
}
|
|
580
587
|
}
|
|
581
|
-
resetTurn() {
|
|
582
|
-
this.modelAvailabilityService.resetTurn();
|
|
583
|
-
}
|
|
584
|
-
isInFallbackMode() {
|
|
585
|
-
return this.inFallbackMode;
|
|
586
|
-
}
|
|
587
|
-
setFallbackMode(active) {
|
|
588
|
-
this.inFallbackMode = active;
|
|
589
|
-
}
|
|
590
588
|
setFallbackModelHandler(handler) {
|
|
591
589
|
this.fallbackModelHandler = handler;
|
|
592
590
|
}
|
|
593
591
|
getFallbackModelHandler() {
|
|
594
592
|
return this.fallbackModelHandler;
|
|
595
593
|
}
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
}
|
|
599
|
-
setPreviewModelFallbackMode(active) {
|
|
600
|
-
this.previewModelFallbackMode = active;
|
|
601
|
-
}
|
|
602
|
-
isPreviewModelBypassMode() {
|
|
603
|
-
return this.previewModelBypassMode;
|
|
604
|
-
}
|
|
605
|
-
setPreviewModelBypassMode(active) {
|
|
606
|
-
this.previewModelBypassMode = active;
|
|
594
|
+
resetTurn() {
|
|
595
|
+
this.modelAvailabilityService.resetTurn();
|
|
607
596
|
}
|
|
608
597
|
getMaxSessionTurns() {
|
|
609
598
|
return this.maxSessionTurns;
|
|
@@ -659,7 +648,44 @@ export class Config {
|
|
|
659
648
|
return this.previewFeatures;
|
|
660
649
|
}
|
|
661
650
|
setPreviewFeatures(previewFeatures) {
|
|
651
|
+
// No change in state, no action needed
|
|
652
|
+
if (this.previewFeatures === previewFeatures) {
|
|
653
|
+
return;
|
|
654
|
+
}
|
|
662
655
|
this.previewFeatures = previewFeatures;
|
|
656
|
+
const currentModel = this.getModel();
|
|
657
|
+
// Case 1: Disabling preview features while on a preview model
|
|
658
|
+
if (!previewFeatures && isPreviewModel(currentModel)) {
|
|
659
|
+
this.setModel(DEFAULT_GEMINI_MODEL_AUTO);
|
|
660
|
+
}
|
|
661
|
+
// Case 2: Enabling preview features while on the default auto model
|
|
662
|
+
else if (previewFeatures && currentModel === DEFAULT_GEMINI_MODEL_AUTO) {
|
|
663
|
+
this.setModel(PREVIEW_GEMINI_MODEL_AUTO);
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
getHasAccessToPreviewModel() {
|
|
667
|
+
return this.hasAccessToPreviewModel;
|
|
668
|
+
}
|
|
669
|
+
setHasAccessToPreviewModel(hasAccess) {
|
|
670
|
+
this.hasAccessToPreviewModel = hasAccess;
|
|
671
|
+
}
|
|
672
|
+
async refreshUserQuota() {
|
|
673
|
+
const codeAssistServer = getCodeAssistServer(this);
|
|
674
|
+
if (!codeAssistServer || !codeAssistServer.projectId) {
|
|
675
|
+
return undefined;
|
|
676
|
+
}
|
|
677
|
+
try {
|
|
678
|
+
const quota = await codeAssistServer.retrieveUserQuota({
|
|
679
|
+
project: codeAssistServer.projectId,
|
|
680
|
+
});
|
|
681
|
+
const hasAccess = quota.buckets?.some((b) => b.modelId === PREVIEW_GEMINI_MODEL) ?? false;
|
|
682
|
+
this.setHasAccessToPreviewModel(hasAccess);
|
|
683
|
+
return quota;
|
|
684
|
+
}
|
|
685
|
+
catch (e) {
|
|
686
|
+
debugLogger.debug('Failed to retrieve user quota', e);
|
|
687
|
+
return undefined;
|
|
688
|
+
}
|
|
663
689
|
}
|
|
664
690
|
getCoreTools() {
|
|
665
691
|
return this.coreTools;
|
|
@@ -893,9 +919,6 @@ export class Config {
|
|
|
893
919
|
getEnableExtensionReloading() {
|
|
894
920
|
return this.enableExtensionReloading;
|
|
895
921
|
}
|
|
896
|
-
isModelAvailabilityServiceEnabled() {
|
|
897
|
-
return this.enableModelAvailabilityService;
|
|
898
|
-
}
|
|
899
922
|
isAgentsEnabled() {
|
|
900
923
|
return this.enableAgents;
|
|
901
924
|
}
|