@google/gemini-cli-core 0.62.0-nightly.20260925.gbedef96ef → 0.62.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 +0 -16
- package/dist/docs/changelogs/latest.md +55 -34
- package/dist/docs/changelogs/preview.md +3 -7
- package/dist/src/agents/local-executor.js +6 -44
- package/dist/src/agents/local-executor.js.map +1 -1
- package/dist/src/agents/local-executor.test.js +6 -10
- package/dist/src/agents/local-executor.test.js.map +1 -1
- package/dist/src/context/chatCompressionService.d.ts +0 -26
- package/dist/src/context/chatCompressionService.js +3 -190
- package/dist/src/context/chatCompressionService.js.map +1 -1
- package/dist/src/context/chatCompressionService.test.js +1 -350
- package/dist/src/context/chatCompressionService.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/scheduler/tool-executor.js +3 -67
- package/dist/src/scheduler/tool-executor.js.map +1 -1
- package/dist/src/scheduler/tool-executor.test.js +0 -143
- package/dist/src/scheduler/tool-executor.test.js.map +1 -1
- package/dist/src/services/shellExecutionService.js +3 -37
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/utils/constants.d.ts +0 -5
- package/dist/src/utils/constants.js +0 -5
- package/dist/src/utils/constants.js.map +1 -1
- package/dist/src/utils/gitUtils.js +0 -1
- package/dist/src/utils/gitUtils.js.map +1 -1
- package/dist/src/utils/tool-utils.d.ts +0 -16
- package/dist/src/utils/tool-utils.js +0 -113
- package/dist/src/utils/tool-utils.js.map +1 -1
- package/dist/src/utils/tool-utils.test.js +1 -150
- package/dist/src/utils/tool-utils.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/dist/google-gemini-cli-core-0.62.0-nightly.20260918.g9450ade79.tgz +0 -0
- package/dist/src/agents/memory-leak-regression.test.d.ts +0 -6
- package/dist/src/agents/memory-leak-regression.test.js +0 -314
- package/dist/src/agents/memory-leak-regression.test.js.map +0 -1
package/package.json
CHANGED
|
Binary file
|
|
@@ -1,314 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2026 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
7
|
-
import { MAX_STORED_TOOL_OUTPUT_BYTES } from '../utils/constants.js';
|
|
8
|
-
import { truncateToolOutput, truncateFunctionResponsePart, } from '../utils/tool-utils.js';
|
|
9
|
-
import { calculateHistoryByteSize, collapseOlderFunctionResponses, COLLAPSED_FUNCTION_RESPONSE_MAX_BYTES, ChatCompressionService, } from '../context/chatCompressionService.js';
|
|
10
|
-
import { CompressionStatus } from '../core/turn.js';
|
|
11
|
-
import { makeFakeConfig } from '../test-utils/config.js';
|
|
12
|
-
import { tokenLimit } from '../core/tokenLimits.js';
|
|
13
|
-
vi.mock('../core/tokenLimits.js', () => ({
|
|
14
|
-
tokenLimit: vi.fn().mockReturnValue(1_000_000),
|
|
15
|
-
}));
|
|
16
|
-
describe('GH-28537 / b/561554750 Memory Leak Regression Tests', () => {
|
|
17
|
-
describe('Tool Output Truncation Cap', () => {
|
|
18
|
-
it('truncates tool outputs exceeding MAX_STORED_TOOL_OUTPUT_BYTES (64 KB)', () => {
|
|
19
|
-
const largeOutput = 'x'.repeat(100 * 1024); // 100 KB
|
|
20
|
-
const truncated = truncateToolOutput(largeOutput, MAX_STORED_TOOL_OUTPUT_BYTES);
|
|
21
|
-
expect(Buffer.byteLength(truncated, 'utf8')).toBeLessThanOrEqual(MAX_STORED_TOOL_OUTPUT_BYTES);
|
|
22
|
-
expect(truncated).toContain('[Tool output truncated to conserve memory]');
|
|
23
|
-
});
|
|
24
|
-
it('preserves tool outputs within MAX_STORED_TOOL_OUTPUT_BYTES', () => {
|
|
25
|
-
const smallOutput = 'hello world';
|
|
26
|
-
const result = truncateToolOutput(smallOutput, MAX_STORED_TOOL_OUTPUT_BYTES);
|
|
27
|
-
expect(result).toBe(smallOutput);
|
|
28
|
-
});
|
|
29
|
-
it('truncates function response parts with large string or object outputs', () => {
|
|
30
|
-
const largeOutput = 'A'.repeat(80 * 1024);
|
|
31
|
-
const part = {
|
|
32
|
-
functionResponse: {
|
|
33
|
-
name: 'shell',
|
|
34
|
-
response: {
|
|
35
|
-
output: largeOutput,
|
|
36
|
-
},
|
|
37
|
-
},
|
|
38
|
-
};
|
|
39
|
-
const truncatedPart = truncateFunctionResponsePart(part, MAX_STORED_TOOL_OUTPUT_BYTES);
|
|
40
|
-
const response = truncatedPart.functionResponse?.response;
|
|
41
|
-
expect(response).toBeDefined();
|
|
42
|
-
expect(response.output).toContain('[Tool output truncated to conserve memory]');
|
|
43
|
-
expect(Buffer.byteLength(response.output, 'utf8')).toBeLessThanOrEqual(MAX_STORED_TOOL_OUTPUT_BYTES);
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
describe('History Collapsing Across Long-Running Turns', () => {
|
|
47
|
-
it('collapses older functionResponse payloads from completed previous turns while preserving recent protected turns', () => {
|
|
48
|
-
const largeToolOutput = 'data '.repeat(2000); // ~10 KB
|
|
49
|
-
// Simulate 5 turns of tool calls and responses
|
|
50
|
-
const history = [
|
|
51
|
-
// Turn 1
|
|
52
|
-
{ role: 'user', parts: [{ text: 'Turn 1 user request' }] },
|
|
53
|
-
{
|
|
54
|
-
role: 'model',
|
|
55
|
-
parts: [
|
|
56
|
-
{ functionCall: { name: 'shell', args: { command: 'test 1' } } },
|
|
57
|
-
],
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
role: 'user',
|
|
61
|
-
parts: [
|
|
62
|
-
{
|
|
63
|
-
functionResponse: {
|
|
64
|
-
name: 'shell',
|
|
65
|
-
response: { output: largeToolOutput },
|
|
66
|
-
},
|
|
67
|
-
},
|
|
68
|
-
],
|
|
69
|
-
},
|
|
70
|
-
{ role: 'model', parts: [{ text: 'Turn 1 response' }] },
|
|
71
|
-
// Turn 2
|
|
72
|
-
{ role: 'user', parts: [{ text: 'Turn 2 user request' }] },
|
|
73
|
-
{
|
|
74
|
-
role: 'model',
|
|
75
|
-
parts: [
|
|
76
|
-
{ functionCall: { name: 'shell', args: { command: 'test 2' } } },
|
|
77
|
-
],
|
|
78
|
-
},
|
|
79
|
-
{
|
|
80
|
-
role: 'user',
|
|
81
|
-
parts: [
|
|
82
|
-
{
|
|
83
|
-
functionResponse: {
|
|
84
|
-
name: 'shell',
|
|
85
|
-
response: { output: largeToolOutput },
|
|
86
|
-
},
|
|
87
|
-
},
|
|
88
|
-
],
|
|
89
|
-
},
|
|
90
|
-
{ role: 'model', parts: [{ text: 'Turn 2 response' }] },
|
|
91
|
-
// Turn 3
|
|
92
|
-
{ role: 'user', parts: [{ text: 'Turn 3 user request' }] },
|
|
93
|
-
{
|
|
94
|
-
role: 'model',
|
|
95
|
-
parts: [
|
|
96
|
-
{ functionCall: { name: 'shell', args: { command: 'test 3' } } },
|
|
97
|
-
],
|
|
98
|
-
},
|
|
99
|
-
{
|
|
100
|
-
role: 'user',
|
|
101
|
-
parts: [
|
|
102
|
-
{
|
|
103
|
-
functionResponse: {
|
|
104
|
-
name: 'shell',
|
|
105
|
-
response: { output: largeToolOutput },
|
|
106
|
-
},
|
|
107
|
-
},
|
|
108
|
-
],
|
|
109
|
-
},
|
|
110
|
-
{ role: 'model', parts: [{ text: 'Turn 3 response' }] },
|
|
111
|
-
// Turn 4
|
|
112
|
-
{ role: 'user', parts: [{ text: 'Turn 4 user request' }] },
|
|
113
|
-
{
|
|
114
|
-
role: 'model',
|
|
115
|
-
parts: [
|
|
116
|
-
{ functionCall: { name: 'shell', args: { command: 'test 4' } } },
|
|
117
|
-
],
|
|
118
|
-
},
|
|
119
|
-
{
|
|
120
|
-
role: 'user',
|
|
121
|
-
parts: [
|
|
122
|
-
{
|
|
123
|
-
functionResponse: {
|
|
124
|
-
name: 'shell',
|
|
125
|
-
response: { output: largeToolOutput },
|
|
126
|
-
},
|
|
127
|
-
},
|
|
128
|
-
],
|
|
129
|
-
},
|
|
130
|
-
{ role: 'model', parts: [{ text: 'Turn 4 response' }] },
|
|
131
|
-
// Turn 5
|
|
132
|
-
{ role: 'user', parts: [{ text: 'Turn 5 user request' }] },
|
|
133
|
-
{
|
|
134
|
-
role: 'model',
|
|
135
|
-
parts: [
|
|
136
|
-
{ functionCall: { name: 'shell', args: { command: 'test 5' } } },
|
|
137
|
-
],
|
|
138
|
-
},
|
|
139
|
-
{
|
|
140
|
-
role: 'user',
|
|
141
|
-
parts: [
|
|
142
|
-
{
|
|
143
|
-
functionResponse: {
|
|
144
|
-
name: 'shell',
|
|
145
|
-
response: { output: largeToolOutput },
|
|
146
|
-
},
|
|
147
|
-
},
|
|
148
|
-
],
|
|
149
|
-
},
|
|
150
|
-
];
|
|
151
|
-
const collapsed = collapseOlderFunctionResponses(history, COLLAPSED_FUNCTION_RESPONSE_MAX_BYTES);
|
|
152
|
-
// Turn 1 tool response (index 2) should be collapsed
|
|
153
|
-
const turn1Part = collapsed[2].parts[0].functionResponse?.response;
|
|
154
|
-
expect(turn1Part.output).toContain('[Tool output collapsed from previous turn:');
|
|
155
|
-
expect(Buffer.byteLength(turn1Part.output, 'utf8')).toBeLessThanOrEqual(COLLAPSED_FUNCTION_RESPONSE_MAX_BYTES + 256);
|
|
156
|
-
// Turn 2 tool response (index 6) should be collapsed
|
|
157
|
-
const turn2Part = collapsed[6].parts[0].functionResponse?.response;
|
|
158
|
-
expect(turn2Part.output).toContain('[Tool output collapsed from previous turn:');
|
|
159
|
-
// Turn 3, 4, 5 tool responses (the 3 most recent) must be PRESERVED intact
|
|
160
|
-
const turn3Part = collapsed[10].parts[0].functionResponse?.response;
|
|
161
|
-
expect(turn3Part.output).toBe(largeToolOutput);
|
|
162
|
-
const turn4Part = collapsed[14].parts[0].functionResponse?.response;
|
|
163
|
-
expect(turn4Part.output).toBe(largeToolOutput);
|
|
164
|
-
const turn5Part = collapsed[18].parts[0].functionResponse?.response;
|
|
165
|
-
expect(turn5Part.output).toBe(largeToolOutput);
|
|
166
|
-
});
|
|
167
|
-
it('keeps history byte growth bounded across 50 simulated tool turns', () => {
|
|
168
|
-
let currentHistory = [];
|
|
169
|
-
const toolOutputChunk = 'x'.repeat(60 * 1024); // 60 KB output per turn
|
|
170
|
-
for (let turn = 1; turn <= 50; turn++) {
|
|
171
|
-
// Model tool call turn
|
|
172
|
-
currentHistory.push({
|
|
173
|
-
role: 'model',
|
|
174
|
-
parts: [
|
|
175
|
-
{
|
|
176
|
-
functionCall: {
|
|
177
|
-
name: 'shell',
|
|
178
|
-
args: { command: `run-test-${turn}` },
|
|
179
|
-
},
|
|
180
|
-
},
|
|
181
|
-
],
|
|
182
|
-
});
|
|
183
|
-
// User tool response turn (capped at 64 KB initially)
|
|
184
|
-
const cappedPart = truncateFunctionResponsePart({
|
|
185
|
-
functionResponse: {
|
|
186
|
-
name: 'shell',
|
|
187
|
-
response: { output: toolOutputChunk },
|
|
188
|
-
},
|
|
189
|
-
});
|
|
190
|
-
currentHistory.push({
|
|
191
|
-
role: 'user',
|
|
192
|
-
parts: [cappedPart],
|
|
193
|
-
});
|
|
194
|
-
// Model text response turn
|
|
195
|
-
currentHistory.push({
|
|
196
|
-
role: 'model',
|
|
197
|
-
parts: [{ text: `Turn ${turn} completed.` }],
|
|
198
|
-
});
|
|
199
|
-
// Apply older turn collapsing as done during local executor turns
|
|
200
|
-
currentHistory = collapseOlderFunctionResponses(currentHistory);
|
|
201
|
-
}
|
|
202
|
-
const totalByteSize = calculateHistoryByteSize(currentHistory);
|
|
203
|
-
// 50 turns with 60 KB uncollapsed would be 3,000 KB (3 MB).
|
|
204
|
-
// With older turn collapsing to 2 KB, 47 turns * 2 KB + 3 turns * 60 KB ≈ 274 KB.
|
|
205
|
-
// Assert that total size remains well bounded under 350 KB!
|
|
206
|
-
expect(totalByteSize).toBeLessThan(350 * 1024);
|
|
207
|
-
// The latest tool response must still be intact
|
|
208
|
-
const toolTurns = currentHistory.filter((c) => c.role === 'user' &&
|
|
209
|
-
c.parts?.some((p) => p.functionResponse?.name === 'shell'));
|
|
210
|
-
const latestToolTurn = toolTurns[toolTurns.length - 1];
|
|
211
|
-
const latestPart = latestToolTurn.parts[0].functionResponse
|
|
212
|
-
?.response;
|
|
213
|
-
expect(latestPart.output).toBe(toolOutputChunk);
|
|
214
|
-
// Earlier tool turns beyond the 3 protected recent turns must be collapsed
|
|
215
|
-
for (let i = 0; i < toolTurns.length - 3; i++) {
|
|
216
|
-
const oldPart = toolTurns[i].parts[0].functionResponse?.response;
|
|
217
|
-
expect(oldPart.output).toContain('[Tool output collapsed from previous turn:');
|
|
218
|
-
}
|
|
219
|
-
// The recent 3 protected tool turns must remain intact
|
|
220
|
-
for (let i = toolTurns.length - 3; i < toolTurns.length; i++) {
|
|
221
|
-
const recentPart = toolTurns[i].parts[0].functionResponse
|
|
222
|
-
?.response;
|
|
223
|
-
expect(recentPart.output).toBe(toolOutputChunk);
|
|
224
|
-
}
|
|
225
|
-
});
|
|
226
|
-
});
|
|
227
|
-
describe('High-Token Context Retention on Large Context Models', () => {
|
|
228
|
-
let compressionService;
|
|
229
|
-
let mockChat;
|
|
230
|
-
beforeEach(() => {
|
|
231
|
-
compressionService = new ChatCompressionService();
|
|
232
|
-
mockChat = {
|
|
233
|
-
getHistory: vi.fn(),
|
|
234
|
-
getLastPromptTokenCount: vi.fn().mockReturnValue(100),
|
|
235
|
-
};
|
|
236
|
-
});
|
|
237
|
-
it('does not prematurely trigger compression for 60,000 to 200,000 tokens on 1M+ models when threshold is not reached', async () => {
|
|
238
|
-
// 2,000,000 token limit with 0.5 threshold = 1,000,000 tokens needed to trigger compression.
|
|
239
|
-
// A conversation of 150,000 tokens should return NOOP and not discard history.
|
|
240
|
-
const history = [
|
|
241
|
-
{ role: 'user', parts: [{ text: 'some prompt' }] },
|
|
242
|
-
{ role: 'model', parts: [{ text: 'some response' }] },
|
|
243
|
-
];
|
|
244
|
-
vi.mocked(mockChat.getHistory).mockReturnValue(history);
|
|
245
|
-
vi.mocked(mockChat.getLastPromptTokenCount).mockReturnValue(150_000);
|
|
246
|
-
vi.mocked(tokenLimit).mockReturnValue(2_000_000);
|
|
247
|
-
const mockConfig = makeFakeConfig();
|
|
248
|
-
mockConfig.getCompressionThreshold = vi.fn().mockResolvedValue(0.5);
|
|
249
|
-
const result = await compressionService.compress(mockChat, 'high-token-context-test', false, 'gemini-2.5-pro', mockConfig, false);
|
|
250
|
-
// Must NOT have compressed: status must be NOOP
|
|
251
|
-
expect(result.info.compressionStatus).toBe(CompressionStatus.NOOP);
|
|
252
|
-
expect(result.newHistory).toBeNull();
|
|
253
|
-
});
|
|
254
|
-
it('does not trigger compression for 50,000 tokens on a 1M context model when threshold is 0.5', async () => {
|
|
255
|
-
const history = [
|
|
256
|
-
{ role: 'user', parts: [{ text: 'some prompt' }] },
|
|
257
|
-
{ role: 'model', parts: [{ text: 'some response' }] },
|
|
258
|
-
];
|
|
259
|
-
vi.mocked(mockChat.getHistory).mockReturnValue(history);
|
|
260
|
-
vi.mocked(mockChat.getLastPromptTokenCount).mockReturnValue(50_000);
|
|
261
|
-
vi.mocked(tokenLimit).mockReturnValue(1_000_000);
|
|
262
|
-
const mockConfig = makeFakeConfig();
|
|
263
|
-
mockConfig.getCompressionThreshold = vi.fn().mockResolvedValue(0.5);
|
|
264
|
-
const result = await compressionService.compress(mockChat, '50k-token-test', false, 'gemini-2.5-flash', mockConfig, false);
|
|
265
|
-
expect(result.info.compressionStatus).toBe(CompressionStatus.NOOP);
|
|
266
|
-
expect(result.newHistory).toBeNull();
|
|
267
|
-
});
|
|
268
|
-
it('returns NOOP when both tokens and bytes are below watermarks and model threshold', async () => {
|
|
269
|
-
const history = [
|
|
270
|
-
{ role: 'user', parts: [{ text: 'small text' }] },
|
|
271
|
-
{ role: 'model', parts: [{ text: 'small response' }] },
|
|
272
|
-
];
|
|
273
|
-
vi.mocked(mockChat.getHistory).mockReturnValue(history);
|
|
274
|
-
vi.mocked(mockChat.getLastPromptTokenCount).mockReturnValue(500);
|
|
275
|
-
vi.mocked(tokenLimit).mockReturnValue(1_000_000);
|
|
276
|
-
const mockConfig = makeFakeConfig();
|
|
277
|
-
mockConfig.getCompressionThreshold = vi.fn().mockResolvedValue(0.5);
|
|
278
|
-
const result = await compressionService.compress(mockChat, 'noop-test', false, 'gemini-2.5-pro', mockConfig, false);
|
|
279
|
-
expect(result.info.compressionStatus).toBe(CompressionStatus.NOOP);
|
|
280
|
-
expect(result.newHistory).toBeNull();
|
|
281
|
-
});
|
|
282
|
-
});
|
|
283
|
-
describe('Turn ID Stability', () => {
|
|
284
|
-
it('preserves existing turn IDs when updating history', () => {
|
|
285
|
-
const turn1Id = 'turn-uuid-1';
|
|
286
|
-
const turn2Id = 'turn-uuid-2';
|
|
287
|
-
const originalTurns = [
|
|
288
|
-
{ id: turn1Id, content: { role: 'user', parts: [{ text: 'hello' }] } },
|
|
289
|
-
{ id: turn2Id, content: { role: 'model', parts: [{ text: 'world' }] } },
|
|
290
|
-
];
|
|
291
|
-
// Simulate what LocalAgentExecutor does: preserving existing turn IDs
|
|
292
|
-
const newContents = [
|
|
293
|
-
{ role: 'user', parts: [{ text: 'hello' }] },
|
|
294
|
-
{ role: 'model', parts: [{ text: 'world' }] },
|
|
295
|
-
];
|
|
296
|
-
const mappedTurns = newContents.map((c, idx) => ({
|
|
297
|
-
id: originalTurns[idx]?.id ?? 'fallback-uuid',
|
|
298
|
-
content: c,
|
|
299
|
-
}));
|
|
300
|
-
expect(mappedTurns[0].id).toBe(turn1Id);
|
|
301
|
-
expect(mappedTurns[1].id).toBe(turn2Id);
|
|
302
|
-
});
|
|
303
|
-
});
|
|
304
|
-
describe('Tool Output Disk Fallback', () => {
|
|
305
|
-
it('includes disk file path in truncation notice when output exceeds cap', () => {
|
|
306
|
-
const largeOutput = 'x'.repeat(100 * 1024);
|
|
307
|
-
const savedPath = '/tmp/project/tools/tool-output-123.txt';
|
|
308
|
-
const truncated = truncateToolOutput(largeOutput, MAX_STORED_TOOL_OUTPUT_BYTES, savedPath);
|
|
309
|
-
expect(truncated).toContain(`[Tool output truncated to conserve memory. For full output see: ${savedPath}]`);
|
|
310
|
-
expect(Buffer.byteLength(truncated, 'utf8')).toBeLessThanOrEqual(MAX_STORED_TOOL_OUTPUT_BYTES);
|
|
311
|
-
});
|
|
312
|
-
});
|
|
313
|
-
});
|
|
314
|
-
//# sourceMappingURL=memory-leak-regression.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"memory-leak-regression.test.js","sourceRoot":"","sources":["../../../src/agents/memory-leak-regression.test.ts"],"names":[],"mappings":"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"}
|