@google/gemini-cli-core 0.9.0-nightly.20251002.aa8b2abe → 0.9.0-nightly.20251004.7db79e14
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/README.md +2 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/src/agents/codebase-investigator.d.ts +36 -1
- package/dist/src/agents/codebase-investigator.js +58 -86
- package/dist/src/agents/codebase-investigator.js.map +1 -1
- package/dist/src/agents/executor.d.ts +7 -11
- package/dist/src/agents/executor.js +225 -94
- package/dist/src/agents/executor.js.map +1 -1
- package/dist/src/agents/executor.test.js +327 -287
- package/dist/src/agents/executor.test.js.map +1 -1
- package/dist/src/agents/invocation.d.ts +3 -2
- package/dist/src/agents/invocation.js +1 -0
- package/dist/src/agents/invocation.js.map +1 -1
- package/dist/src/agents/invocation.test.js +1 -0
- package/dist/src/agents/invocation.test.js.map +1 -1
- package/dist/src/agents/registry.d.ts +2 -1
- package/dist/src/agents/registry.js +2 -0
- package/dist/src/agents/registry.js.map +1 -1
- package/dist/src/agents/types.d.ts +28 -6
- package/dist/src/agents/types.js +1 -0
- package/dist/src/agents/types.js.map +1 -1
- package/dist/src/config/config.d.ts +4 -0
- package/dist/src/config/config.js +8 -0
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/core/client.js +2 -2
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +1 -1
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/geminiChat.js +1 -14
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +14 -18
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/prompts.d.ts +2 -1
- package/dist/src/core/prompts.js +81 -8
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/prompts.test.js +73 -24
- package/dist/src/core/prompts.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/telemetry/clearcut-logger/clearcut-logger.js +0 -8
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +2 -2
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +4 -4
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/constants.d.ts +1 -0
- package/dist/src/telemetry/constants.js +1 -0
- package/dist/src/telemetry/constants.js.map +1 -1
- package/dist/src/telemetry/loggers.js +2 -2
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +2 -2
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +3 -2
- package/dist/src/tools/mcp-client.js +28 -30
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +168 -5
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/utils/errorParsing.d.ts +1 -1
- package/dist/src/utils/errorParsing.js +5 -33
- package/dist/src/utils/errorParsing.js.map +1 -1
- package/dist/src/utils/errorParsing.test.js +0 -88
- package/dist/src/utils/errorParsing.test.js.map +1 -1
- package/dist/src/utils/flashFallback.test.js +26 -45
- package/dist/src/utils/flashFallback.test.js.map +1 -1
- package/dist/src/utils/googleErrors.d.ts +104 -0
- package/dist/src/utils/googleErrors.js +108 -0
- package/dist/src/utils/googleErrors.js.map +1 -0
- package/dist/src/utils/googleErrors.test.d.ts +6 -0
- package/dist/src/utils/googleErrors.test.js +212 -0
- package/dist/src/utils/googleErrors.test.js.map +1 -0
- package/dist/src/utils/googleQuotaErrors.d.ts +35 -0
- package/dist/src/utils/googleQuotaErrors.js +108 -0
- package/dist/src/utils/googleQuotaErrors.js.map +1 -0
- package/dist/src/utils/googleQuotaErrors.test.d.ts +6 -0
- package/dist/src/utils/googleQuotaErrors.test.js +189 -0
- package/dist/src/utils/googleQuotaErrors.test.js.map +1 -0
- package/dist/src/utils/memoryDiscovery.d.ts +1 -0
- package/dist/src/utils/memoryDiscovery.js +2 -1
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +99 -21
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/quotaErrorDetection.d.ts +0 -2
- package/dist/src/utils/quotaErrorDetection.js +0 -46
- package/dist/src/utils/quotaErrorDetection.js.map +1 -1
- package/dist/src/utils/retry.js +40 -157
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js +85 -144
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { parseGoogleApiError } from './googleErrors.js';
|
|
7
|
+
const FIVE_MINUTES_IN_SECONDS = 5 * 60;
|
|
8
|
+
/**
|
|
9
|
+
* A non-retryable error indicating a hard quota limit has been reached (e.g., daily limit).
|
|
10
|
+
*/
|
|
11
|
+
export class TerminalQuotaError extends Error {
|
|
12
|
+
cause;
|
|
13
|
+
constructor(message, cause) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.cause = cause;
|
|
16
|
+
this.name = 'TerminalQuotaError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* A retryable error indicating a temporary quota issue (e.g., per-minute limit).
|
|
21
|
+
*/
|
|
22
|
+
export class RetryableQuotaError extends Error {
|
|
23
|
+
cause;
|
|
24
|
+
retryDelayMs;
|
|
25
|
+
constructor(message, cause, retryDelaySeconds) {
|
|
26
|
+
super(message);
|
|
27
|
+
this.cause = cause;
|
|
28
|
+
this.name = 'RetryableQuotaError';
|
|
29
|
+
this.retryDelayMs = retryDelaySeconds * 1000;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Parses a duration string (e.g., "34.074824224s", "60s") and returns the time in seconds.
|
|
34
|
+
* @param duration The duration string to parse.
|
|
35
|
+
* @returns The duration in seconds, or null if parsing fails.
|
|
36
|
+
*/
|
|
37
|
+
function parseDurationInSeconds(duration) {
|
|
38
|
+
if (!duration.endsWith('s')) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
const seconds = parseFloat(duration.slice(0, -1));
|
|
42
|
+
return isNaN(seconds) ? null : seconds;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Analyzes a caught error and classifies it as a specific quota-related error if applicable.
|
|
46
|
+
*
|
|
47
|
+
* It decides whether an error is a `TerminalQuotaError` or a `RetryableQuotaError` based on
|
|
48
|
+
* the following logic:
|
|
49
|
+
* - If the error indicates a daily limit, it's a `TerminalQuotaError`.
|
|
50
|
+
* - If the error suggests a retry delay of more than 5 minutes, it's a `TerminalQuotaError`.
|
|
51
|
+
* - If the error suggests a retry delay of 5 minutes or less, it's a `RetryableQuotaError`.
|
|
52
|
+
* - If the error indicates a per-minute limit, it's a `RetryableQuotaError`.
|
|
53
|
+
*
|
|
54
|
+
* @param error The error to classify.
|
|
55
|
+
* @returns A `TerminalQuotaError`, `RetryableQuotaError`, or the original `unknown` error.
|
|
56
|
+
*/
|
|
57
|
+
export function classifyGoogleError(error) {
|
|
58
|
+
const googleApiError = parseGoogleApiError(error);
|
|
59
|
+
if (!googleApiError || googleApiError.code !== 429) {
|
|
60
|
+
return error; // Not a 429 error we can handle.
|
|
61
|
+
}
|
|
62
|
+
const quotaFailure = googleApiError.details.find((d) => d['@type'] === 'type.googleapis.com/google.rpc.QuotaFailure');
|
|
63
|
+
const errorInfo = googleApiError.details.find((d) => d['@type'] === 'type.googleapis.com/google.rpc.ErrorInfo');
|
|
64
|
+
const retryInfo = googleApiError.details.find((d) => d['@type'] === 'type.googleapis.com/google.rpc.RetryInfo');
|
|
65
|
+
// 1. Check for long-term limits in QuotaFailure or ErrorInfo
|
|
66
|
+
if (quotaFailure) {
|
|
67
|
+
for (const violation of quotaFailure.violations) {
|
|
68
|
+
const quotaId = violation.quotaId ?? '';
|
|
69
|
+
if (quotaId.includes('PerDay') || quotaId.includes('Daily')) {
|
|
70
|
+
return new TerminalQuotaError(`Reached a daily quota limit: ${violation.description}`, googleApiError);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (errorInfo) {
|
|
75
|
+
const quotaLimit = errorInfo.metadata?.['quota_limit'] ?? '';
|
|
76
|
+
if (quotaLimit.includes('PerDay') || quotaLimit.includes('Daily')) {
|
|
77
|
+
return new TerminalQuotaError(`Reached a daily quota limit: ${errorInfo.reason}`, googleApiError);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// 2. Check for long delays in RetryInfo
|
|
81
|
+
if (retryInfo?.retryDelay) {
|
|
82
|
+
const delaySeconds = parseDurationInSeconds(retryInfo.retryDelay);
|
|
83
|
+
if (delaySeconds !== null) {
|
|
84
|
+
if (delaySeconds > FIVE_MINUTES_IN_SECONDS) {
|
|
85
|
+
return new TerminalQuotaError(`Quota limit requires a long delay of ${retryInfo.retryDelay}.`, googleApiError);
|
|
86
|
+
}
|
|
87
|
+
// This is a retryable error with a specific delay.
|
|
88
|
+
return new RetryableQuotaError(`Quota limit hit. Retrying after ${retryInfo.retryDelay}.`, googleApiError, delaySeconds);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// 3. Check for short-term limits in QuotaFailure or ErrorInfo
|
|
92
|
+
if (quotaFailure) {
|
|
93
|
+
for (const violation of quotaFailure.violations) {
|
|
94
|
+
const quotaId = violation.quotaId ?? '';
|
|
95
|
+
if (quotaId.includes('PerMinute')) {
|
|
96
|
+
return new RetryableQuotaError(`Quota limit hit: ${violation.description}. Retrying after 60s.`, googleApiError, 60);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (errorInfo) {
|
|
101
|
+
const quotaLimit = errorInfo.metadata?.['quota_limit'] ?? '';
|
|
102
|
+
if (quotaLimit.includes('PerMinute')) {
|
|
103
|
+
return new RetryableQuotaError(`Quota limit hit: ${errorInfo.reason}. Retrying after 60s.`, googleApiError, 60);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return error; // Fallback to original error if no specific classification fits.
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=googleQuotaErrors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"googleQuotaErrors.js","sourceRoot":"","sources":["../../../src/utils/googleQuotaErrors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, afterEach } from 'vitest';
|
|
7
|
+
import { classifyGoogleError, RetryableQuotaError, TerminalQuotaError, } from './googleQuotaErrors.js';
|
|
8
|
+
import * as errorParser from './googleErrors.js';
|
|
9
|
+
describe('classifyGoogleError', () => {
|
|
10
|
+
afterEach(() => {
|
|
11
|
+
vi.restoreAllMocks();
|
|
12
|
+
});
|
|
13
|
+
it('should return original error if not a Google API error', () => {
|
|
14
|
+
const regularError = new Error('Something went wrong');
|
|
15
|
+
vi.spyOn(errorParser, 'parseGoogleApiError').mockReturnValue(null);
|
|
16
|
+
const result = classifyGoogleError(regularError);
|
|
17
|
+
expect(result).toBe(regularError);
|
|
18
|
+
});
|
|
19
|
+
it('should return original error if code is not 429', () => {
|
|
20
|
+
const apiError = {
|
|
21
|
+
code: 500,
|
|
22
|
+
message: 'Server error',
|
|
23
|
+
details: [],
|
|
24
|
+
};
|
|
25
|
+
vi.spyOn(errorParser, 'parseGoogleApiError').mockReturnValue(apiError);
|
|
26
|
+
const originalError = new Error();
|
|
27
|
+
const result = classifyGoogleError(originalError);
|
|
28
|
+
expect(result).toBe(originalError);
|
|
29
|
+
expect(result).not.toBeInstanceOf(TerminalQuotaError);
|
|
30
|
+
expect(result).not.toBeInstanceOf(RetryableQuotaError);
|
|
31
|
+
});
|
|
32
|
+
it('should return TerminalQuotaError for daily quota violations in QuotaFailure', () => {
|
|
33
|
+
const apiError = {
|
|
34
|
+
code: 429,
|
|
35
|
+
message: 'Quota exceeded',
|
|
36
|
+
details: [
|
|
37
|
+
{
|
|
38
|
+
'@type': 'type.googleapis.com/google.rpc.QuotaFailure',
|
|
39
|
+
violations: [
|
|
40
|
+
{
|
|
41
|
+
subject: 'user',
|
|
42
|
+
description: 'daily limit',
|
|
43
|
+
quotaId: 'RequestsPerDay-limit',
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
};
|
|
49
|
+
vi.spyOn(errorParser, 'parseGoogleApiError').mockReturnValue(apiError);
|
|
50
|
+
const result = classifyGoogleError(new Error());
|
|
51
|
+
expect(result).toBeInstanceOf(TerminalQuotaError);
|
|
52
|
+
expect(result.cause).toBe(apiError);
|
|
53
|
+
});
|
|
54
|
+
it('should return TerminalQuotaError for daily quota violations in ErrorInfo', () => {
|
|
55
|
+
const apiError = {
|
|
56
|
+
code: 429,
|
|
57
|
+
message: 'Quota exceeded',
|
|
58
|
+
details: [
|
|
59
|
+
{
|
|
60
|
+
'@type': 'type.googleapis.com/google.rpc.ErrorInfo',
|
|
61
|
+
reason: 'QUOTA_EXCEEDED',
|
|
62
|
+
domain: 'googleapis.com',
|
|
63
|
+
metadata: {
|
|
64
|
+
quota_limit: 'RequestsPerDay_PerProject_PerUser',
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
};
|
|
69
|
+
vi.spyOn(errorParser, 'parseGoogleApiError').mockReturnValue(apiError);
|
|
70
|
+
const result = classifyGoogleError(new Error());
|
|
71
|
+
expect(result).toBeInstanceOf(TerminalQuotaError);
|
|
72
|
+
});
|
|
73
|
+
it('should return TerminalQuotaError for long retry delays', () => {
|
|
74
|
+
const apiError = {
|
|
75
|
+
code: 429,
|
|
76
|
+
message: 'Too many requests',
|
|
77
|
+
details: [
|
|
78
|
+
{
|
|
79
|
+
'@type': 'type.googleapis.com/google.rpc.RetryInfo',
|
|
80
|
+
retryDelay: '301s', // > 5 minutes
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
};
|
|
84
|
+
vi.spyOn(errorParser, 'parseGoogleApiError').mockReturnValue(apiError);
|
|
85
|
+
const result = classifyGoogleError(new Error());
|
|
86
|
+
expect(result).toBeInstanceOf(TerminalQuotaError);
|
|
87
|
+
});
|
|
88
|
+
it('should return RetryableQuotaError for short retry delays', () => {
|
|
89
|
+
const apiError = {
|
|
90
|
+
code: 429,
|
|
91
|
+
message: 'Too many requests',
|
|
92
|
+
details: [
|
|
93
|
+
{
|
|
94
|
+
'@type': 'type.googleapis.com/google.rpc.RetryInfo',
|
|
95
|
+
retryDelay: '45.123s',
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
};
|
|
99
|
+
vi.spyOn(errorParser, 'parseGoogleApiError').mockReturnValue(apiError);
|
|
100
|
+
const result = classifyGoogleError(new Error());
|
|
101
|
+
expect(result).toBeInstanceOf(RetryableQuotaError);
|
|
102
|
+
expect(result.retryDelayMs).toBe(45123);
|
|
103
|
+
});
|
|
104
|
+
it('should return RetryableQuotaError for per-minute quota violations in QuotaFailure', () => {
|
|
105
|
+
const apiError = {
|
|
106
|
+
code: 429,
|
|
107
|
+
message: 'Quota exceeded',
|
|
108
|
+
details: [
|
|
109
|
+
{
|
|
110
|
+
'@type': 'type.googleapis.com/google.rpc.QuotaFailure',
|
|
111
|
+
violations: [
|
|
112
|
+
{
|
|
113
|
+
subject: 'user',
|
|
114
|
+
description: 'per minute limit',
|
|
115
|
+
quotaId: 'RequestsPerMinute-limit',
|
|
116
|
+
},
|
|
117
|
+
],
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
};
|
|
121
|
+
vi.spyOn(errorParser, 'parseGoogleApiError').mockReturnValue(apiError);
|
|
122
|
+
const result = classifyGoogleError(new Error());
|
|
123
|
+
expect(result).toBeInstanceOf(RetryableQuotaError);
|
|
124
|
+
expect(result.retryDelayMs).toBe(60000);
|
|
125
|
+
});
|
|
126
|
+
it('should return RetryableQuotaError for per-minute quota violations in ErrorInfo', () => {
|
|
127
|
+
const apiError = {
|
|
128
|
+
code: 429,
|
|
129
|
+
message: 'Quota exceeded',
|
|
130
|
+
details: [
|
|
131
|
+
{
|
|
132
|
+
'@type': 'type.googleapis.com/google.rpc.ErrorInfo',
|
|
133
|
+
reason: 'QUOTA_EXCEEDED',
|
|
134
|
+
domain: 'googleapis.com',
|
|
135
|
+
metadata: {
|
|
136
|
+
quota_limit: 'RequestsPerMinute_PerProject_PerUser',
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
};
|
|
141
|
+
vi.spyOn(errorParser, 'parseGoogleApiError').mockReturnValue(apiError);
|
|
142
|
+
const result = classifyGoogleError(new Error());
|
|
143
|
+
expect(result).toBeInstanceOf(RetryableQuotaError);
|
|
144
|
+
expect(result.retryDelayMs).toBe(60000);
|
|
145
|
+
});
|
|
146
|
+
it('should prioritize daily limit over retry info', () => {
|
|
147
|
+
const apiError = {
|
|
148
|
+
code: 429,
|
|
149
|
+
message: 'Quota exceeded',
|
|
150
|
+
details: [
|
|
151
|
+
{
|
|
152
|
+
'@type': 'type.googleapis.com/google.rpc.QuotaFailure',
|
|
153
|
+
violations: [
|
|
154
|
+
{
|
|
155
|
+
subject: 'user',
|
|
156
|
+
description: 'daily limit',
|
|
157
|
+
quotaId: 'RequestsPerDay-limit',
|
|
158
|
+
},
|
|
159
|
+
],
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
'@type': 'type.googleapis.com/google.rpc.RetryInfo',
|
|
163
|
+
retryDelay: '10s',
|
|
164
|
+
},
|
|
165
|
+
],
|
|
166
|
+
};
|
|
167
|
+
vi.spyOn(errorParser, 'parseGoogleApiError').mockReturnValue(apiError);
|
|
168
|
+
const result = classifyGoogleError(new Error());
|
|
169
|
+
expect(result).toBeInstanceOf(TerminalQuotaError);
|
|
170
|
+
});
|
|
171
|
+
it('should return original error for 429 without specific details', () => {
|
|
172
|
+
const apiError = {
|
|
173
|
+
code: 429,
|
|
174
|
+
message: 'Too many requests',
|
|
175
|
+
details: [
|
|
176
|
+
{
|
|
177
|
+
'@type': 'type.googleapis.com/google.rpc.DebugInfo',
|
|
178
|
+
detail: 'some debug info',
|
|
179
|
+
stackEntries: [],
|
|
180
|
+
},
|
|
181
|
+
],
|
|
182
|
+
};
|
|
183
|
+
vi.spyOn(errorParser, 'parseGoogleApiError').mockReturnValue(apiError);
|
|
184
|
+
const originalError = new Error();
|
|
185
|
+
const result = classifyGoogleError(originalError);
|
|
186
|
+
expect(result).toBe(originalError);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
//# sourceMappingURL=googleQuotaErrors.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"googleQuotaErrors.test.js","sourceRoot":"","sources":["../../../src/utils/googleQuotaErrors.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ import type { FileFilteringOptions } from '../config/constants.js';
|
|
|
8
8
|
export interface LoadServerHierarchicalMemoryResponse {
|
|
9
9
|
memoryContent: string;
|
|
10
10
|
fileCount: number;
|
|
11
|
+
filePaths: string[];
|
|
11
12
|
}
|
|
12
13
|
/**
|
|
13
14
|
* Loads hierarchical GEMINI.md files and concatenates their content.
|
|
@@ -237,7 +237,7 @@ export async function loadServerHierarchicalMemory(currentWorkingDirectory, incl
|
|
|
237
237
|
if (filePaths.length === 0) {
|
|
238
238
|
if (debugMode)
|
|
239
239
|
logger.debug('No GEMINI.md files found in hierarchy of the workspace.');
|
|
240
|
-
return { memoryContent: '', fileCount: 0 };
|
|
240
|
+
return { memoryContent: '', fileCount: 0, filePaths: [] };
|
|
241
241
|
}
|
|
242
242
|
const contentsWithPaths = await readGeminiMdFiles(filePaths, debugMode, importFormat);
|
|
243
243
|
// Pass CWD for relative path display in concatenated content
|
|
@@ -249,6 +249,7 @@ export async function loadServerHierarchicalMemory(currentWorkingDirectory, incl
|
|
|
249
249
|
return {
|
|
250
250
|
memoryContent: combinedInstructions,
|
|
251
251
|
fileCount: contentsWithPaths.length,
|
|
252
|
+
filePaths,
|
|
252
253
|
};
|
|
253
254
|
}
|
|
254
255
|
//# sourceMappingURL=memoryDiscovery.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memoryDiscovery.js","sourceRoot":"","sources":["../../../src/utils/memoryDiscovery.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"memoryDiscovery.js","sourceRoot":"","sources":["../../../src/utils/memoryDiscovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -61,17 +61,22 @@ describe('loadServerHierarchicalMemory', () => {
|
|
|
61
61
|
it('does not load context files from untrusted workspaces', async () => {
|
|
62
62
|
await createTestFile(path.join(projectRoot, DEFAULT_CONTEXT_FILENAME), 'Project root memory');
|
|
63
63
|
await createTestFile(path.join(cwd, DEFAULT_CONTEXT_FILENAME), 'Src directory memory');
|
|
64
|
-
const
|
|
65
|
-
expect(
|
|
64
|
+
const result = await loadServerHierarchicalMemory(cwd, [], false, new FileDiscoveryService(projectRoot), [], false);
|
|
65
|
+
expect(result).toEqual({
|
|
66
|
+
memoryContent: '',
|
|
67
|
+
fileCount: 0,
|
|
68
|
+
filePaths: [],
|
|
69
|
+
});
|
|
66
70
|
});
|
|
67
71
|
it('loads context from outside the untrusted workspace', async () => {
|
|
68
|
-
await createTestFile(path.join(projectRoot, DEFAULT_CONTEXT_FILENAME), 'Project root memory');
|
|
69
|
-
await createTestFile(path.join(cwd, DEFAULT_CONTEXT_FILENAME), 'Src directory memory');
|
|
72
|
+
await createTestFile(path.join(projectRoot, DEFAULT_CONTEXT_FILENAME), 'Project root memory');
|
|
73
|
+
await createTestFile(path.join(cwd, DEFAULT_CONTEXT_FILENAME), 'Src directory memory');
|
|
70
74
|
const filepath = path.join(homedir, GEMINI_DIR, DEFAULT_CONTEXT_FILENAME);
|
|
71
75
|
await createTestFile(filepath, 'default context content'); // In user home dir (outside untrusted space).
|
|
72
|
-
const { fileCount, memoryContent } = await loadServerHierarchicalMemory(cwd, [], false, new FileDiscoveryService(projectRoot), [], false);
|
|
76
|
+
const { fileCount, memoryContent, filePaths } = await loadServerHierarchicalMemory(cwd, [], false, new FileDiscoveryService(projectRoot), [], false);
|
|
73
77
|
expect(fileCount).toEqual(1);
|
|
74
78
|
expect(memoryContent).toContain(path.relative(cwd, filepath).toString());
|
|
79
|
+
expect(filePaths).toEqual([filepath]);
|
|
75
80
|
});
|
|
76
81
|
});
|
|
77
82
|
it('should return empty memory and count if no context files are found', async () => {
|
|
@@ -79,14 +84,18 @@ describe('loadServerHierarchicalMemory', () => {
|
|
|
79
84
|
expect(result).toEqual({
|
|
80
85
|
memoryContent: '',
|
|
81
86
|
fileCount: 0,
|
|
87
|
+
filePaths: [],
|
|
82
88
|
});
|
|
83
89
|
});
|
|
84
90
|
it('should load only the global context file if present and others are not (default filename)', async () => {
|
|
85
91
|
const defaultContextFile = await createTestFile(path.join(homedir, GEMINI_DIR, DEFAULT_CONTEXT_FILENAME), 'default context content');
|
|
86
92
|
const result = await loadServerHierarchicalMemory(cwd, [], false, new FileDiscoveryService(projectRoot), [], DEFAULT_FOLDER_TRUST);
|
|
87
93
|
expect(result).toEqual({
|
|
88
|
-
memoryContent: `--- Context from: ${path.relative(cwd, defaultContextFile)}
|
|
94
|
+
memoryContent: `--- Context from: ${path.relative(cwd, defaultContextFile)} ---
|
|
95
|
+
default context content
|
|
96
|
+
--- End of Context from: ${path.relative(cwd, defaultContextFile)} ---`,
|
|
89
97
|
fileCount: 1,
|
|
98
|
+
filePaths: [defaultContextFile],
|
|
90
99
|
});
|
|
91
100
|
});
|
|
92
101
|
it('should load only the global custom context file if present and filename is changed', async () => {
|
|
@@ -95,8 +104,11 @@ describe('loadServerHierarchicalMemory', () => {
|
|
|
95
104
|
const customContextFile = await createTestFile(path.join(homedir, GEMINI_DIR, customFilename), 'custom context content');
|
|
96
105
|
const result = await loadServerHierarchicalMemory(cwd, [], false, new FileDiscoveryService(projectRoot), [], DEFAULT_FOLDER_TRUST);
|
|
97
106
|
expect(result).toEqual({
|
|
98
|
-
memoryContent: `--- Context from: ${path.relative(cwd, customContextFile)}
|
|
107
|
+
memoryContent: `--- Context from: ${path.relative(cwd, customContextFile)} ---
|
|
108
|
+
custom context content
|
|
109
|
+
--- End of Context from: ${path.relative(cwd, customContextFile)} ---`,
|
|
99
110
|
fileCount: 1,
|
|
111
|
+
filePaths: [customContextFile],
|
|
100
112
|
});
|
|
101
113
|
});
|
|
102
114
|
it('should load context files by upward traversal with custom filename', async () => {
|
|
@@ -106,19 +118,33 @@ describe('loadServerHierarchicalMemory', () => {
|
|
|
106
118
|
const cwdContextFile = await createTestFile(path.join(cwd, customFilename), 'cwd context content');
|
|
107
119
|
const result = await loadServerHierarchicalMemory(cwd, [], false, new FileDiscoveryService(projectRoot), [], DEFAULT_FOLDER_TRUST);
|
|
108
120
|
expect(result).toEqual({
|
|
109
|
-
memoryContent: `--- Context from: ${path.relative(cwd, projectContextFile)}
|
|
121
|
+
memoryContent: `--- Context from: ${path.relative(cwd, projectContextFile)} ---
|
|
122
|
+
project context content
|
|
123
|
+
--- End of Context from: ${path.relative(cwd, projectContextFile)} ---
|
|
124
|
+
|
|
125
|
+
--- Context from: ${path.relative(cwd, cwdContextFile)} ---
|
|
126
|
+
cwd context content
|
|
127
|
+
--- End of Context from: ${path.relative(cwd, cwdContextFile)} ---`,
|
|
110
128
|
fileCount: 2,
|
|
129
|
+
filePaths: [projectContextFile, cwdContextFile],
|
|
111
130
|
});
|
|
112
131
|
});
|
|
113
132
|
it('should load context files by downward traversal with custom filename', async () => {
|
|
114
133
|
const customFilename = 'LOCAL_CONTEXT.md';
|
|
115
134
|
setGeminiMdFilename(customFilename);
|
|
116
|
-
await createTestFile(path.join(cwd, 'subdir', customFilename), 'Subdir custom memory');
|
|
117
|
-
await createTestFile(path.join(cwd, customFilename), 'CWD custom memory');
|
|
135
|
+
const subdirCustomFile = await createTestFile(path.join(cwd, 'subdir', customFilename), 'Subdir custom memory');
|
|
136
|
+
const cwdCustomFile = await createTestFile(path.join(cwd, customFilename), 'CWD custom memory');
|
|
118
137
|
const result = await loadServerHierarchicalMemory(cwd, [], false, new FileDiscoveryService(projectRoot), [], DEFAULT_FOLDER_TRUST);
|
|
119
138
|
expect(result).toEqual({
|
|
120
|
-
memoryContent: `--- Context from: ${customFilename}
|
|
139
|
+
memoryContent: `--- Context from: ${customFilename} ---
|
|
140
|
+
CWD custom memory
|
|
141
|
+
--- End of Context from: ${customFilename} ---
|
|
142
|
+
|
|
143
|
+
--- Context from: ${path.join('subdir', customFilename)} ---
|
|
144
|
+
Subdir custom memory
|
|
145
|
+
--- End of Context from: ${path.join('subdir', customFilename)} ---`,
|
|
121
146
|
fileCount: 2,
|
|
147
|
+
filePaths: [cwdCustomFile, subdirCustomFile],
|
|
122
148
|
});
|
|
123
149
|
});
|
|
124
150
|
it('should load ORIGINAL_GEMINI_MD_FILENAME files by upward traversal from CWD to project root', async () => {
|
|
@@ -126,17 +152,31 @@ describe('loadServerHierarchicalMemory', () => {
|
|
|
126
152
|
const srcGeminiFile = await createTestFile(path.join(cwd, DEFAULT_CONTEXT_FILENAME), 'Src directory memory');
|
|
127
153
|
const result = await loadServerHierarchicalMemory(cwd, [], false, new FileDiscoveryService(projectRoot), [], DEFAULT_FOLDER_TRUST);
|
|
128
154
|
expect(result).toEqual({
|
|
129
|
-
memoryContent: `--- Context from: ${path.relative(cwd, projectRootGeminiFile)}
|
|
155
|
+
memoryContent: `--- Context from: ${path.relative(cwd, projectRootGeminiFile)} ---
|
|
156
|
+
Project root memory
|
|
157
|
+
--- End of Context from: ${path.relative(cwd, projectRootGeminiFile)} ---
|
|
158
|
+
|
|
159
|
+
--- Context from: ${path.relative(cwd, srcGeminiFile)} ---
|
|
160
|
+
Src directory memory
|
|
161
|
+
--- End of Context from: ${path.relative(cwd, srcGeminiFile)} ---`,
|
|
130
162
|
fileCount: 2,
|
|
163
|
+
filePaths: [projectRootGeminiFile, srcGeminiFile],
|
|
131
164
|
});
|
|
132
165
|
});
|
|
133
166
|
it('should load ORIGINAL_GEMINI_MD_FILENAME files by downward traversal from CWD', async () => {
|
|
134
|
-
await createTestFile(path.join(cwd, 'subdir', DEFAULT_CONTEXT_FILENAME), 'Subdir memory');
|
|
135
|
-
await createTestFile(path.join(cwd, DEFAULT_CONTEXT_FILENAME), 'CWD memory');
|
|
167
|
+
const subDirGeminiFile = await createTestFile(path.join(cwd, 'subdir', DEFAULT_CONTEXT_FILENAME), 'Subdir memory');
|
|
168
|
+
const cwdGeminiFile = await createTestFile(path.join(cwd, DEFAULT_CONTEXT_FILENAME), 'CWD memory');
|
|
136
169
|
const result = await loadServerHierarchicalMemory(cwd, [], false, new FileDiscoveryService(projectRoot), [], DEFAULT_FOLDER_TRUST);
|
|
137
170
|
expect(result).toEqual({
|
|
138
|
-
memoryContent: `--- Context from: ${DEFAULT_CONTEXT_FILENAME}
|
|
171
|
+
memoryContent: `--- Context from: ${DEFAULT_CONTEXT_FILENAME} ---
|
|
172
|
+
CWD memory
|
|
173
|
+
--- End of Context from: ${DEFAULT_CONTEXT_FILENAME} ---
|
|
174
|
+
|
|
175
|
+
--- Context from: ${path.join('subdir', DEFAULT_CONTEXT_FILENAME)} ---
|
|
176
|
+
Subdir memory
|
|
177
|
+
--- End of Context from: ${path.join('subdir', DEFAULT_CONTEXT_FILENAME)} ---`,
|
|
139
178
|
fileCount: 2,
|
|
179
|
+
filePaths: [cwdGeminiFile, subDirGeminiFile],
|
|
140
180
|
});
|
|
141
181
|
});
|
|
142
182
|
it('should load and correctly order global, upward, and downward ORIGINAL_GEMINI_MD_FILENAME files', async () => {
|
|
@@ -147,8 +187,33 @@ describe('loadServerHierarchicalMemory', () => {
|
|
|
147
187
|
const subDirGeminiFile = await createTestFile(path.join(cwd, 'sub', DEFAULT_CONTEXT_FILENAME), 'Subdir memory');
|
|
148
188
|
const result = await loadServerHierarchicalMemory(cwd, [], false, new FileDiscoveryService(projectRoot), [], DEFAULT_FOLDER_TRUST);
|
|
149
189
|
expect(result).toEqual({
|
|
150
|
-
memoryContent: `--- Context from: ${path.relative(cwd, defaultContextFile)}
|
|
190
|
+
memoryContent: `--- Context from: ${path.relative(cwd, defaultContextFile)} ---
|
|
191
|
+
default context content
|
|
192
|
+
--- End of Context from: ${path.relative(cwd, defaultContextFile)} ---
|
|
193
|
+
|
|
194
|
+
--- Context from: ${path.relative(cwd, rootGeminiFile)} ---
|
|
195
|
+
Project parent memory
|
|
196
|
+
--- End of Context from: ${path.relative(cwd, rootGeminiFile)} ---
|
|
197
|
+
|
|
198
|
+
--- Context from: ${path.relative(cwd, projectRootGeminiFile)} ---
|
|
199
|
+
Project root memory
|
|
200
|
+
--- End of Context from: ${path.relative(cwd, projectRootGeminiFile)} ---
|
|
201
|
+
|
|
202
|
+
--- Context from: ${path.relative(cwd, cwdGeminiFile)} ---
|
|
203
|
+
CWD memory
|
|
204
|
+
--- End of Context from: ${path.relative(cwd, cwdGeminiFile)} ---
|
|
205
|
+
|
|
206
|
+
--- Context from: ${path.relative(cwd, subDirGeminiFile)} ---
|
|
207
|
+
Subdir memory
|
|
208
|
+
--- End of Context from: ${path.relative(cwd, subDirGeminiFile)} ---`,
|
|
151
209
|
fileCount: 5,
|
|
210
|
+
filePaths: [
|
|
211
|
+
defaultContextFile,
|
|
212
|
+
rootGeminiFile,
|
|
213
|
+
projectRootGeminiFile,
|
|
214
|
+
cwdGeminiFile,
|
|
215
|
+
subDirGeminiFile,
|
|
216
|
+
],
|
|
152
217
|
});
|
|
153
218
|
});
|
|
154
219
|
it('should ignore specified directories during downward scan', async () => {
|
|
@@ -161,8 +226,11 @@ describe('loadServerHierarchicalMemory', () => {
|
|
|
161
226
|
respectGeminiIgnore: true,
|
|
162
227
|
}, 200);
|
|
163
228
|
expect(result).toEqual({
|
|
164
|
-
memoryContent: `--- Context from: ${path.relative(cwd, regularSubDirGeminiFile)}
|
|
229
|
+
memoryContent: `--- Context from: ${path.relative(cwd, regularSubDirGeminiFile)} ---
|
|
230
|
+
My code memory
|
|
231
|
+
--- End of Context from: ${path.relative(cwd, regularSubDirGeminiFile)} ---`,
|
|
165
232
|
fileCount: 1,
|
|
233
|
+
filePaths: [regularSubDirGeminiFile],
|
|
166
234
|
});
|
|
167
235
|
});
|
|
168
236
|
it('should respect the maxDirs parameter during downward scan', async () => {
|
|
@@ -184,14 +252,18 @@ describe('loadServerHierarchicalMemory', () => {
|
|
|
184
252
|
expect(result).toEqual({
|
|
185
253
|
memoryContent: '',
|
|
186
254
|
fileCount: 0,
|
|
255
|
+
filePaths: [],
|
|
187
256
|
});
|
|
188
257
|
});
|
|
189
258
|
it('should load extension context file paths', async () => {
|
|
190
259
|
const extensionFilePath = await createTestFile(path.join(testRootDir, 'extensions/ext1/GEMINI.md'), 'Extension memory content');
|
|
191
260
|
const result = await loadServerHierarchicalMemory(cwd, [], false, new FileDiscoveryService(projectRoot), [extensionFilePath], DEFAULT_FOLDER_TRUST);
|
|
192
261
|
expect(result).toEqual({
|
|
193
|
-
memoryContent: `--- Context from: ${path.relative(cwd, extensionFilePath)}
|
|
262
|
+
memoryContent: `--- Context from: ${path.relative(cwd, extensionFilePath)} ---
|
|
263
|
+
Extension memory content
|
|
264
|
+
--- End of Context from: ${path.relative(cwd, extensionFilePath)} ---`,
|
|
194
265
|
fileCount: 1,
|
|
266
|
+
filePaths: [extensionFilePath],
|
|
195
267
|
});
|
|
196
268
|
});
|
|
197
269
|
it('should load memory from included directories', async () => {
|
|
@@ -199,8 +271,11 @@ describe('loadServerHierarchicalMemory', () => {
|
|
|
199
271
|
const includedFile = await createTestFile(path.join(includedDir, DEFAULT_CONTEXT_FILENAME), 'included directory memory');
|
|
200
272
|
const result = await loadServerHierarchicalMemory(cwd, [includedDir], false, new FileDiscoveryService(projectRoot), [], DEFAULT_FOLDER_TRUST);
|
|
201
273
|
expect(result).toEqual({
|
|
202
|
-
memoryContent: `--- Context from: ${path.relative(cwd, includedFile)}
|
|
274
|
+
memoryContent: `--- Context from: ${path.relative(cwd, includedFile)} ---
|
|
275
|
+
included directory memory
|
|
276
|
+
--- End of Context from: ${path.relative(cwd, includedFile)} ---`,
|
|
203
277
|
fileCount: 1,
|
|
278
|
+
filePaths: [includedFile],
|
|
204
279
|
});
|
|
205
280
|
});
|
|
206
281
|
it('should handle multiple directories and files in parallel correctly', async () => {
|
|
@@ -216,6 +291,8 @@ describe('loadServerHierarchicalMemory', () => {
|
|
|
216
291
|
const result = await loadServerHierarchicalMemory(cwd, createdFiles.map((f) => path.dirname(f)), false, new FileDiscoveryService(projectRoot), [], DEFAULT_FOLDER_TRUST);
|
|
217
292
|
// Should have loaded all files
|
|
218
293
|
expect(result.fileCount).toBe(numDirs);
|
|
294
|
+
expect(result.filePaths.length).toBe(numDirs);
|
|
295
|
+
expect(result.filePaths.sort()).toEqual(createdFiles.sort());
|
|
219
296
|
// Content should include all project contents
|
|
220
297
|
for (let i = 0; i < numDirs; i++) {
|
|
221
298
|
expect(result.memoryContent).toContain(`Content from project ${i}`);
|
|
@@ -225,8 +302,8 @@ describe('loadServerHierarchicalMemory', () => {
|
|
|
225
302
|
// Create overlapping directory structure
|
|
226
303
|
const parentDir = await createEmptyDir(path.join(testRootDir, 'parent'));
|
|
227
304
|
const childDir = await createEmptyDir(path.join(parentDir, 'child'));
|
|
228
|
-
await createTestFile(path.join(parentDir, DEFAULT_CONTEXT_FILENAME), 'Parent content');
|
|
229
|
-
await createTestFile(path.join(childDir, DEFAULT_CONTEXT_FILENAME), 'Child content');
|
|
305
|
+
const parentFile = await createTestFile(path.join(parentDir, DEFAULT_CONTEXT_FILENAME), 'Parent content');
|
|
306
|
+
const childFile = await createTestFile(path.join(childDir, DEFAULT_CONTEXT_FILENAME), 'Child content');
|
|
230
307
|
// Include both parent and child directories
|
|
231
308
|
const result = await loadServerHierarchicalMemory(parentDir, [childDir, parentDir], // Deliberately include duplicates
|
|
232
309
|
false, new FileDiscoveryService(projectRoot), [], DEFAULT_FOLDER_TRUST);
|
|
@@ -234,6 +311,7 @@ describe('loadServerHierarchicalMemory', () => {
|
|
|
234
311
|
expect(result.fileCount).toBe(2);
|
|
235
312
|
expect(result.memoryContent).toContain('Parent content');
|
|
236
313
|
expect(result.memoryContent).toContain('Child content');
|
|
314
|
+
expect(result.filePaths.sort()).toEqual([parentFile, childFile].sort());
|
|
237
315
|
// Check that files are not duplicated
|
|
238
316
|
const parentOccurrences = (result.memoryContent.match(/Parent content/g) || []).length;
|
|
239
317
|
const childOccurrences = (result.memoryContent.match(/Child content/g) || []).length;
|