@google/gemini-cli-a2a-server 0.21.0-nightly.20251205.f4f2bcbd9 → 0.21.0-nightly.20251206.3cf44acc0
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/a2a-server.mjs +95 -27
- package/dist/src/config/config.js +1 -0
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/settings.d.ts +3 -0
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/config/settings.test.d.ts +6 -0
- package/dist/src/config/settings.test.js +161 -0
- package/dist/src/config/settings.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
package/dist/a2a-server.mjs
CHANGED
|
@@ -307379,7 +307379,7 @@ function toFriendlyError(error2) {
|
|
|
307379
307379
|
if (error2 && typeof error2 === "object" && "response" in error2) {
|
|
307380
307380
|
const gaxiosError = error2;
|
|
307381
307381
|
const data = parseResponseData(gaxiosError);
|
|
307382
|
-
if (data.error && data.error.message && data.error.code) {
|
|
307382
|
+
if (data && data.error && data.error.message && data.error.code) {
|
|
307383
307383
|
switch (data.error.code) {
|
|
307384
307384
|
case 400:
|
|
307385
307385
|
return new BadRequestError(data.error.message);
|
|
@@ -307395,7 +307395,11 @@ function toFriendlyError(error2) {
|
|
|
307395
307395
|
}
|
|
307396
307396
|
function parseResponseData(error2) {
|
|
307397
307397
|
if (typeof error2.response?.data === "string") {
|
|
307398
|
-
|
|
307398
|
+
try {
|
|
307399
|
+
return JSON.parse(error2.response?.data);
|
|
307400
|
+
} catch {
|
|
307401
|
+
return void 0;
|
|
307402
|
+
}
|
|
307399
307403
|
}
|
|
307400
307404
|
return error2.response?.data;
|
|
307401
307405
|
}
|
|
@@ -311854,8 +311858,8 @@ var Float64Vector = import_vector.default.Float64Vector;
|
|
|
311854
311858
|
var PointerVector = import_vector.default.PointerVector;
|
|
311855
311859
|
|
|
311856
311860
|
// packages/core/dist/src/generated/git-commit.js
|
|
311857
|
-
var GIT_COMMIT_INFO = "
|
|
311858
|
-
var CLI_VERSION = "0.21.0-nightly.
|
|
311861
|
+
var GIT_COMMIT_INFO = "3cf44acc0";
|
|
311862
|
+
var CLI_VERSION = "0.21.0-nightly.20251206.3cf44acc0";
|
|
311859
311863
|
|
|
311860
311864
|
// packages/core/dist/src/ide/detect-ide.js
|
|
311861
311865
|
var IDE_DEFINITIONS = {
|
|
@@ -315000,7 +315004,7 @@ async function createContentGenerator(config3, gcConfig, sessionId2) {
|
|
|
315000
315004
|
if (gcConfig.fakeResponses) {
|
|
315001
315005
|
return FakeContentGenerator.fromFile(gcConfig.fakeResponses);
|
|
315002
315006
|
}
|
|
315003
|
-
const version4 = "0.21.0-nightly.
|
|
315007
|
+
const version4 = "0.21.0-nightly.20251206.3cf44acc0";
|
|
315004
315008
|
const customHeadersEnv = process.env["GEMINI_CLI_CUSTOM_HEADERS"] || void 0;
|
|
315005
315009
|
const userAgent = `GeminiCLI/${version4} (${process.platform}; ${process.arch})`;
|
|
315006
315010
|
const customHeadersMap = parseCustomHeaders(customHeadersEnv);
|
|
@@ -352871,7 +352875,7 @@ var DEFAULT_RETRY_OPTIONS = {
|
|
|
352871
352875
|
initialDelayMs: 5e3,
|
|
352872
352876
|
maxDelayMs: 3e4,
|
|
352873
352877
|
// 30 seconds
|
|
352874
|
-
shouldRetryOnError:
|
|
352878
|
+
shouldRetryOnError: isRetryableError
|
|
352875
352879
|
};
|
|
352876
352880
|
var RETRYABLE_NETWORK_CODES = [
|
|
352877
352881
|
"ECONNRESET",
|
|
@@ -352901,15 +352905,15 @@ function getNetworkErrorCode(error2) {
|
|
|
352901
352905
|
return void 0;
|
|
352902
352906
|
}
|
|
352903
352907
|
var FETCH_FAILED_MESSAGE = "fetch failed";
|
|
352904
|
-
function
|
|
352908
|
+
function isRetryableError(error2, retryFetchErrors) {
|
|
352909
|
+
const errorCode = getNetworkErrorCode(error2);
|
|
352910
|
+
if (errorCode && RETRYABLE_NETWORK_CODES.includes(errorCode)) {
|
|
352911
|
+
return true;
|
|
352912
|
+
}
|
|
352905
352913
|
if (retryFetchErrors && error2 instanceof Error) {
|
|
352906
352914
|
if (error2.message.toLowerCase().includes(FETCH_FAILED_MESSAGE)) {
|
|
352907
352915
|
return true;
|
|
352908
352916
|
}
|
|
352909
|
-
const errorCode = getNetworkErrorCode(error2);
|
|
352910
|
-
if (errorCode && RETRYABLE_NETWORK_CODES.includes(errorCode)) {
|
|
352911
|
-
return true;
|
|
352912
|
-
}
|
|
352913
352917
|
}
|
|
352914
352918
|
if (error2 instanceof ApiError2) {
|
|
352915
352919
|
if (error2.status === 400)
|
|
@@ -352932,6 +352936,7 @@ async function retryWithBackoff(fn, options2) {
|
|
|
352932
352936
|
const cleanOptions = options2 ? Object.fromEntries(Object.entries(options2).filter(([_, v]) => v != null)) : {};
|
|
352933
352937
|
const { maxAttempts, initialDelayMs, maxDelayMs, onPersistent429, authType, shouldRetryOnError, shouldRetryOnContent, retryFetchErrors, signal } = {
|
|
352934
352938
|
...DEFAULT_RETRY_OPTIONS,
|
|
352939
|
+
shouldRetryOnError: isRetryableError,
|
|
352935
352940
|
...cleanOptions
|
|
352936
352941
|
};
|
|
352937
352942
|
let attempt = 0;
|
|
@@ -358993,6 +358998,7 @@ function convertColorToHex(color, colorMode, defaultColor) {
|
|
|
358993
358998
|
var { Terminal } = import_headless.default;
|
|
358994
358999
|
var SIGKILL_TIMEOUT_MS = 200;
|
|
358995
359000
|
var MAX_CHILD_PROCESS_BUFFER_SIZE = 16 * 1024 * 1024;
|
|
359001
|
+
var SCROLLBACK_LIMIT = 3e5;
|
|
358996
359002
|
var BASH_SHOPT_OPTIONS = "promptvars nullglob extglob nocaseglob dotglob";
|
|
358997
359003
|
var BASH_SHOPT_GUARD = `shopt -u ${BASH_SHOPT_OPTIONS};`;
|
|
358998
359004
|
function ensurePromptvarsDisabled(command, shell) {
|
|
@@ -359010,10 +359016,27 @@ var getFullBufferText = (terminal) => {
|
|
|
359010
359016
|
const lines = [];
|
|
359011
359017
|
for (let i4 = 0; i4 < buffer.length; i4++) {
|
|
359012
359018
|
const line = buffer.getLine(i4);
|
|
359013
|
-
|
|
359014
|
-
|
|
359019
|
+
if (!line) {
|
|
359020
|
+
continue;
|
|
359021
|
+
}
|
|
359022
|
+
let trimRight = true;
|
|
359023
|
+
if (i4 + 1 < buffer.length) {
|
|
359024
|
+
const nextLine = buffer.getLine(i4 + 1);
|
|
359025
|
+
if (nextLine?.isWrapped) {
|
|
359026
|
+
trimRight = false;
|
|
359027
|
+
}
|
|
359028
|
+
}
|
|
359029
|
+
const lineContent = line.translateToString(trimRight);
|
|
359030
|
+
if (line.isWrapped && lines.length > 0) {
|
|
359031
|
+
lines[lines.length - 1] += lineContent;
|
|
359032
|
+
} else {
|
|
359033
|
+
lines.push(lineContent);
|
|
359034
|
+
}
|
|
359015
359035
|
}
|
|
359016
|
-
|
|
359036
|
+
while (lines.length > 0 && lines[lines.length - 1] === "") {
|
|
359037
|
+
lines.pop();
|
|
359038
|
+
}
|
|
359039
|
+
return lines.join("\n");
|
|
359017
359040
|
};
|
|
359018
359041
|
var ShellExecutionService = class {
|
|
359019
359042
|
static activePtys = /* @__PURE__ */ new Map();
|
|
@@ -359250,7 +359273,8 @@ var ShellExecutionService = class {
|
|
|
359250
359273
|
const headlessTerminal = new Terminal({
|
|
359251
359274
|
allowProposedApi: true,
|
|
359252
359275
|
cols,
|
|
359253
|
-
rows
|
|
359276
|
+
rows,
|
|
359277
|
+
scrollback: shellExecutionConfig.scrollback ?? SCROLLBACK_LIMIT
|
|
359254
359278
|
});
|
|
359255
359279
|
headlessTerminal.scrollToTop();
|
|
359256
359280
|
this.activePtys.set(ptyProcess.pid, { ptyProcess, headlessTerminal });
|
|
@@ -360138,8 +360162,8 @@ var PRIVATE_IP_RANGES = [
|
|
|
360138
360162
|
];
|
|
360139
360163
|
var FetchError2 = class extends Error {
|
|
360140
360164
|
code;
|
|
360141
|
-
constructor(message, code2) {
|
|
360142
|
-
super(message);
|
|
360165
|
+
constructor(message, code2, options2) {
|
|
360166
|
+
super(message, options2);
|
|
360143
360167
|
this.code = code2;
|
|
360144
360168
|
this.name = "FetchError";
|
|
360145
360169
|
}
|
|
@@ -360162,7 +360186,7 @@ async function fetchWithTimeout(url5, timeout) {
|
|
|
360162
360186
|
if (isNodeError(error2) && error2.code === "ABORT_ERR") {
|
|
360163
360187
|
throw new FetchError2(`Request timed out after ${timeout}ms`, "ETIMEDOUT");
|
|
360164
360188
|
}
|
|
360165
|
-
throw new FetchError2(getErrorMessage(error2));
|
|
360189
|
+
throw new FetchError2(getErrorMessage(error2), void 0, { cause: error2 });
|
|
360166
360190
|
} finally {
|
|
360167
360191
|
clearTimeout(timeoutId);
|
|
360168
360192
|
}
|
|
@@ -365147,10 +365171,17 @@ var WebFetchToolInvocation = class extends BaseToolInvocation {
|
|
|
365147
365171
|
url5 = url5.replace("github.com", "raw.githubusercontent.com").replace("/blob/", "/");
|
|
365148
365172
|
}
|
|
365149
365173
|
try {
|
|
365150
|
-
const response = await
|
|
365151
|
-
|
|
365152
|
-
|
|
365153
|
-
|
|
365174
|
+
const response = await retryWithBackoff(async () => {
|
|
365175
|
+
const res = await fetchWithTimeout(url5, URL_FETCH_TIMEOUT_MS);
|
|
365176
|
+
if (!res.ok) {
|
|
365177
|
+
const error2 = new Error(`Request failed with status code ${res.status} ${res.statusText}`);
|
|
365178
|
+
error2.status = res.status;
|
|
365179
|
+
throw error2;
|
|
365180
|
+
}
|
|
365181
|
+
return res;
|
|
365182
|
+
}, {
|
|
365183
|
+
retryFetchErrors: this.config.getRetryFetchErrors()
|
|
365184
|
+
});
|
|
365154
365185
|
const rawContent = await response.text();
|
|
365155
365186
|
const contentType = response.headers.get("content-type") || "";
|
|
365156
365187
|
let textContent2;
|
|
@@ -367378,6 +367409,33 @@ var ChatRecordingService = class {
|
|
|
367378
367409
|
updateFn(conversation);
|
|
367379
367410
|
this.writeConversation(conversation);
|
|
367380
367411
|
}
|
|
367412
|
+
/**
|
|
367413
|
+
* Saves a summary for the current session.
|
|
367414
|
+
*/
|
|
367415
|
+
saveSummary(summary) {
|
|
367416
|
+
if (!this.conversationFile)
|
|
367417
|
+
return;
|
|
367418
|
+
try {
|
|
367419
|
+
this.updateConversation((conversation) => {
|
|
367420
|
+
conversation.summary = summary;
|
|
367421
|
+
});
|
|
367422
|
+
} catch (error2) {
|
|
367423
|
+
debugLogger.error("Error saving summary to chat history.", error2);
|
|
367424
|
+
}
|
|
367425
|
+
}
|
|
367426
|
+
/**
|
|
367427
|
+
* Gets the current conversation data (for summary generation).
|
|
367428
|
+
*/
|
|
367429
|
+
getConversation() {
|
|
367430
|
+
if (!this.conversationFile)
|
|
367431
|
+
return null;
|
|
367432
|
+
try {
|
|
367433
|
+
return this.readConversation();
|
|
367434
|
+
} catch (error2) {
|
|
367435
|
+
debugLogger.error("Error reading conversation for summary.", error2);
|
|
367436
|
+
return null;
|
|
367437
|
+
}
|
|
367438
|
+
}
|
|
367381
367439
|
/**
|
|
367382
367440
|
* Deletes a session file by session ID.
|
|
367383
367441
|
*/
|
|
@@ -367993,6 +368051,7 @@ var GeminiChat = class {
|
|
|
367993
368051
|
maxAttempts = 1;
|
|
367994
368052
|
}
|
|
367995
368053
|
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
368054
|
+
let isConnectionPhase = true;
|
|
367996
368055
|
try {
|
|
367997
368056
|
if (attempt > 0) {
|
|
367998
368057
|
yield { type: StreamEventType.RETRY };
|
|
@@ -368000,19 +368059,27 @@ var GeminiChat = class {
|
|
|
368000
368059
|
if (attempt > 0) {
|
|
368001
368060
|
generateContentConfig.temperature = 1;
|
|
368002
368061
|
}
|
|
368062
|
+
isConnectionPhase = true;
|
|
368003
368063
|
const stream3 = await this.makeApiCallAndProcessStream(model, generateContentConfig, requestContents, prompt_id);
|
|
368064
|
+
isConnectionPhase = false;
|
|
368004
368065
|
for await (const chunk2 of stream3) {
|
|
368005
368066
|
yield { type: StreamEventType.CHUNK, value: chunk2 };
|
|
368006
368067
|
}
|
|
368007
368068
|
lastError = null;
|
|
368008
368069
|
break;
|
|
368009
368070
|
} catch (error2) {
|
|
368071
|
+
if (isConnectionPhase) {
|
|
368072
|
+
throw error2;
|
|
368073
|
+
}
|
|
368010
368074
|
lastError = error2;
|
|
368011
368075
|
const isContentError = error2 instanceof InvalidStreamError;
|
|
368012
|
-
|
|
368076
|
+
const isRetryable = isRetryableError(error2, this.config.getRetryFetchErrors());
|
|
368077
|
+
if (isContentError && isGemini2Model(model) || isRetryable && !signal.aborted) {
|
|
368013
368078
|
if (attempt < maxAttempts - 1) {
|
|
368014
|
-
|
|
368015
|
-
|
|
368079
|
+
const delayMs = INVALID_CONTENT_RETRY_OPTIONS.initialDelayMs;
|
|
368080
|
+
const retryType = isContentError ? error2.type : "NETWORK_ERROR";
|
|
368081
|
+
logContentRetry(this.config, new ContentRetryEvent(attempt, retryType, delayMs, model));
|
|
368082
|
+
await new Promise((res) => setTimeout(res, delayMs * (attempt + 1)));
|
|
368016
368083
|
continue;
|
|
368017
368084
|
}
|
|
368018
368085
|
}
|
|
@@ -381722,7 +381789,7 @@ async function getClientMetadata() {
|
|
|
381722
381789
|
clientMetadataPromise = (async () => ({
|
|
381723
381790
|
ideName: "IDE_UNSPECIFIED",
|
|
381724
381791
|
pluginType: "GEMINI",
|
|
381725
|
-
ideVersion: "0.21.0-nightly.
|
|
381792
|
+
ideVersion: "0.21.0-nightly.20251206.3cf44acc0",
|
|
381726
381793
|
platform: getPlatform(),
|
|
381727
381794
|
updateChannel: await getReleaseChannel(__dirname5)
|
|
381728
381795
|
}))();
|
|
@@ -385803,7 +385870,8 @@ async function loadConfig(settings, extensionLoader, taskId) {
|
|
|
385803
385870
|
},
|
|
385804
385871
|
ideMode: false,
|
|
385805
385872
|
folderTrust: settings.folderTrust === true,
|
|
385806
|
-
extensionLoader
|
|
385873
|
+
extensionLoader,
|
|
385874
|
+
previewFeatures: settings.general?.previewFeatures
|
|
385807
385875
|
};
|
|
385808
385876
|
const fileService = new FileDiscoveryService(workspaceDir);
|
|
385809
385877
|
const { memoryContent, fileCount } = await loadServerHierarchicalMemory(
|
|
@@ -44,6 +44,7 @@ export async function loadConfig(settings, extensionLoader, taskId) {
|
|
|
44
44
|
ideMode: false,
|
|
45
45
|
folderTrust: settings.folderTrust === true,
|
|
46
46
|
extensionLoader,
|
|
47
|
+
previewFeatures: settings.general?.previewFeatures,
|
|
47
48
|
};
|
|
48
49
|
const fileService = new FileDiscoveryService(workspaceDir);
|
|
49
50
|
const { memoryContent, fileCount } = await loadServerHierarchicalMemory(workspaceDir, [workspaceDir], false, fileService, extensionLoader, settings.folderTrust === true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/config/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAGjC,OAAO,EACL,QAAQ,EACR,MAAM,EAEN,oBAAoB,EACpB,YAAY,EACZ,4BAA4B,EAC5B,UAAU,EACV,8BAA8B,EAC9B,oBAAoB,EAEpB,eAAe,GAChB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAsB,eAAe,EAAE,MAAM,aAAa,CAAC;AAElE,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAAkB,EAClB,eAAgC,EAChC,MAAc;IAEd,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACnC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAElE,MAAM,YAAY,GAAqB;QACrC,SAAS,EAAE,MAAM;QACjB,KAAK,EAAE,oBAAoB;QAC3B,cAAc,EAAE,8BAA8B;QAC9C,OAAO,EAAE,SAAS,EAAE,wDAAwD;QAC5E,SAAS,EAAE,YAAY,EAAE,gDAAgD;QACzE,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,MAAM,IAAI,KAAK;QACnD,QAAQ,EAAE,EAAE,EAAE,4CAA4C;QAE1D,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,SAAS;QAC1C,YAAY,EAAE,QAAQ,CAAC,YAAY,IAAI,SAAS;QAChD,eAAe,EAAE,QAAQ,CAAC,eAAe,IAAI,KAAK;QAClD,YAAY,EACV,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,MAAM;YACxC,CAAC,CAAC,YAAY,CAAC,IAAI;YACnB,CAAC,CAAC,YAAY,CAAC,OAAO;QAC1B,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,GAAG,EAAE,YAAY;QACjB,SAAS,EAAE;YACT,OAAO,EAAE,QAAQ,CAAC,SAAS,EAAE,OAAO;YACpC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,MAAyB;YACrD,YAAY,EACV,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC;gBAC1C,QAAQ,CAAC,SAAS,EAAE,YAAY;YAClC,UAAU,EAAE,QAAQ,CAAC,SAAS,EAAE,UAAU;SAC3C;QACD,oCAAoC;QACpC,aAAa,EAAE;YACb,gBAAgB,EAAE,QAAQ,CAAC,aAAa,EAAE,gBAAgB;YAC1D,yBAAyB,EACvB,QAAQ,CAAC,aAAa,EAAE,yBAAyB;SACpD;QACD,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,QAAQ,CAAC,WAAW,KAAK,IAAI;QAC1C,eAAe;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/config/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,9 @@ export interface Settings {
|
|
|
15
15
|
showMemoryUsage?: boolean;
|
|
16
16
|
checkpointing?: CheckpointingSettings;
|
|
17
17
|
folderTrust?: boolean;
|
|
18
|
+
general?: {
|
|
19
|
+
previewFeatures?: boolean;
|
|
20
|
+
};
|
|
18
21
|
fileFiltering?: {
|
|
19
22
|
respectGitIgnore?: boolean;
|
|
20
23
|
enableRecursiveFileSearch?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/config/settings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC,OAAO,EACL,WAAW,EACX,UAAU,EACV,eAAe,GAEhB,MAAM,yBAAyB,CAAC;AACjC,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AAEpD,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/config/settings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC,OAAO,EACL,WAAW,EACX,UAAU,EACV,eAAe,GAEhB,MAAM,yBAAyB,CAAC;AACjC,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AAEpD,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;AAiChF;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,YAAoB;IAC/C,IAAI,YAAY,GAAa,EAAE,CAAC;IAChC,IAAI,iBAAiB,GAAa,EAAE,CAAC;IACrC,MAAM,cAAc,GAAoB,EAAE,CAAC;IAE3C,qBAAqB;IACrB,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACtC,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;YACjE,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CACnC,iBAAiB,CAAC,WAAW,CAAC,CACnB,CAAC;YACd,YAAY,GAAG,sBAAsB,CAAC,kBAAkB,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,cAAc,CAAC,IAAI,CAAC;YAClB,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC;YAC/B,IAAI,EAAE,kBAAkB;SACzB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,qBAAqB,GAAG,IAAI,CAAC,IAAI,CACrC,YAAY,EACZ,UAAU,EACV,eAAe,CAChB,CAAC;IAEF,0BAA0B;IAC1B,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACzC,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC;YACvE,MAAM,uBAAuB,GAAG,IAAI,CAAC,KAAK,CACxC,iBAAiB,CAAC,cAAc,CAAC,CACtB,CAAC;YACd,iBAAiB,GAAG,sBAAsB,CAAC,uBAAuB,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,cAAc,CAAC,IAAI,CAAC;YAClB,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC;YAC/B,IAAI,EAAE,qBAAqB;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,WAAW,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,WAAW,CAAC,KAAK,CAAC,WAAW,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3C,WAAW,CAAC,KAAK,CAAC,cAAc,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,oCAAoC;IACpC,OAAO;QACL,GAAG,YAAY;QACf,GAAG,iBAAiB;KACrB,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAa;IAC3C,MAAM,WAAW,GAAG,wBAAwB,CAAC,CAAC,gCAAgC;IAC9E,OAAO,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;QAC9D,MAAM,OAAO,GAAG,QAAQ,IAAI,QAAQ,CAAC;QACrC,IAAI,OAAO,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YACvE,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;QAC/B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,sBAAsB,CAAI,GAAM;IACvC,IACE,GAAG,KAAK,IAAI;QACZ,GAAG,KAAK,SAAS;QACjB,OAAO,GAAG,KAAK,SAAS;QACxB,OAAO,GAAG,KAAK,QAAQ,EACvB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,sBAAsB,CAAC,GAAG,CAAiB,CAAC;IACrD,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAiB,CAAC;IACzE,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,EAAE,GAAG,GAAG,EAAO,CAAC;QAC/B,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;gBACtD,MAAM,CAAC,GAAG,CAAC,GAAG,sBAAsB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
+
import * as fs from 'node:fs';
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import * as os from 'node:os';
|
|
10
|
+
import { loadSettings, USER_SETTINGS_PATH } from './settings.js';
|
|
11
|
+
const mocks = vi.hoisted(() => {
|
|
12
|
+
const suffix = Math.random().toString(36).slice(2);
|
|
13
|
+
return {
|
|
14
|
+
suffix,
|
|
15
|
+
};
|
|
16
|
+
});
|
|
17
|
+
vi.mock('node:os', async (importOriginal) => {
|
|
18
|
+
const actual = await importOriginal();
|
|
19
|
+
const path = await import('node:path');
|
|
20
|
+
return {
|
|
21
|
+
...actual,
|
|
22
|
+
homedir: () => path.join(actual.tmpdir(), `gemini-home-${mocks.suffix}`),
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
vi.mock('@google/gemini-cli-core', () => ({
|
|
26
|
+
GEMINI_DIR: '.gemini',
|
|
27
|
+
debugLogger: {
|
|
28
|
+
error: vi.fn(),
|
|
29
|
+
},
|
|
30
|
+
getErrorMessage: (error) => String(error),
|
|
31
|
+
}));
|
|
32
|
+
describe('loadSettings', () => {
|
|
33
|
+
const mockHomeDir = path.join(os.tmpdir(), `gemini-home-${mocks.suffix}`);
|
|
34
|
+
const mockWorkspaceDir = path.join(os.tmpdir(), `gemini-workspace-${mocks.suffix}`);
|
|
35
|
+
const mockGeminiHomeDir = path.join(mockHomeDir, '.gemini');
|
|
36
|
+
const mockGeminiWorkspaceDir = path.join(mockWorkspaceDir, '.gemini');
|
|
37
|
+
beforeEach(() => {
|
|
38
|
+
vi.clearAllMocks();
|
|
39
|
+
// Create the directories using the real fs
|
|
40
|
+
if (!fs.existsSync(mockGeminiHomeDir)) {
|
|
41
|
+
fs.mkdirSync(mockGeminiHomeDir, { recursive: true });
|
|
42
|
+
}
|
|
43
|
+
if (!fs.existsSync(mockGeminiWorkspaceDir)) {
|
|
44
|
+
fs.mkdirSync(mockGeminiWorkspaceDir, { recursive: true });
|
|
45
|
+
}
|
|
46
|
+
// Clean up settings files before each test
|
|
47
|
+
if (fs.existsSync(USER_SETTINGS_PATH)) {
|
|
48
|
+
fs.rmSync(USER_SETTINGS_PATH);
|
|
49
|
+
}
|
|
50
|
+
const workspaceSettingsPath = path.join(mockGeminiWorkspaceDir, 'settings.json');
|
|
51
|
+
if (fs.existsSync(workspaceSettingsPath)) {
|
|
52
|
+
fs.rmSync(workspaceSettingsPath);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
afterEach(() => {
|
|
56
|
+
try {
|
|
57
|
+
if (fs.existsSync(mockHomeDir)) {
|
|
58
|
+
fs.rmSync(mockHomeDir, { recursive: true, force: true });
|
|
59
|
+
}
|
|
60
|
+
if (fs.existsSync(mockWorkspaceDir)) {
|
|
61
|
+
fs.rmSync(mockWorkspaceDir, { recursive: true, force: true });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
console.error('Failed to cleanup temp dirs', e);
|
|
66
|
+
}
|
|
67
|
+
vi.restoreAllMocks();
|
|
68
|
+
});
|
|
69
|
+
it('should load nested previewFeatures from user settings', () => {
|
|
70
|
+
const settings = {
|
|
71
|
+
general: {
|
|
72
|
+
previewFeatures: true,
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
fs.writeFileSync(USER_SETTINGS_PATH, JSON.stringify(settings));
|
|
76
|
+
const result = loadSettings(mockWorkspaceDir);
|
|
77
|
+
expect(result.general?.previewFeatures).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
it('should load nested previewFeatures from workspace settings', () => {
|
|
80
|
+
const settings = {
|
|
81
|
+
general: {
|
|
82
|
+
previewFeatures: true,
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
const workspaceSettingsPath = path.join(mockGeminiWorkspaceDir, 'settings.json');
|
|
86
|
+
fs.writeFileSync(workspaceSettingsPath, JSON.stringify(settings));
|
|
87
|
+
const result = loadSettings(mockWorkspaceDir);
|
|
88
|
+
expect(result.general?.previewFeatures).toBe(true);
|
|
89
|
+
});
|
|
90
|
+
it('should prioritize workspace settings over user settings', () => {
|
|
91
|
+
const userSettings = {
|
|
92
|
+
general: {
|
|
93
|
+
previewFeatures: false,
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
fs.writeFileSync(USER_SETTINGS_PATH, JSON.stringify(userSettings));
|
|
97
|
+
const workspaceSettings = {
|
|
98
|
+
general: {
|
|
99
|
+
previewFeatures: true,
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
const workspaceSettingsPath = path.join(mockGeminiWorkspaceDir, 'settings.json');
|
|
103
|
+
fs.writeFileSync(workspaceSettingsPath, JSON.stringify(workspaceSettings));
|
|
104
|
+
const result = loadSettings(mockWorkspaceDir);
|
|
105
|
+
expect(result.general?.previewFeatures).toBe(true);
|
|
106
|
+
});
|
|
107
|
+
it('should handle missing previewFeatures', () => {
|
|
108
|
+
const settings = {
|
|
109
|
+
general: {},
|
|
110
|
+
};
|
|
111
|
+
fs.writeFileSync(USER_SETTINGS_PATH, JSON.stringify(settings));
|
|
112
|
+
const result = loadSettings(mockWorkspaceDir);
|
|
113
|
+
expect(result.general?.previewFeatures).toBeUndefined();
|
|
114
|
+
});
|
|
115
|
+
it('should load other top-level settings correctly', () => {
|
|
116
|
+
const settings = {
|
|
117
|
+
showMemoryUsage: true,
|
|
118
|
+
coreTools: ['tool1', 'tool2'],
|
|
119
|
+
mcpServers: {
|
|
120
|
+
server1: {
|
|
121
|
+
command: 'cmd',
|
|
122
|
+
args: ['arg'],
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
fileFiltering: {
|
|
126
|
+
respectGitIgnore: true,
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
fs.writeFileSync(USER_SETTINGS_PATH, JSON.stringify(settings));
|
|
130
|
+
const result = loadSettings(mockWorkspaceDir);
|
|
131
|
+
expect(result.showMemoryUsage).toBe(true);
|
|
132
|
+
expect(result.coreTools).toEqual(['tool1', 'tool2']);
|
|
133
|
+
expect(result.mcpServers).toHaveProperty('server1');
|
|
134
|
+
expect(result.fileFiltering?.respectGitIgnore).toBe(true);
|
|
135
|
+
});
|
|
136
|
+
it('should overwrite top-level settings from workspace (shallow merge)', () => {
|
|
137
|
+
const userSettings = {
|
|
138
|
+
showMemoryUsage: false,
|
|
139
|
+
fileFiltering: {
|
|
140
|
+
respectGitIgnore: true,
|
|
141
|
+
enableRecursiveFileSearch: true,
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
fs.writeFileSync(USER_SETTINGS_PATH, JSON.stringify(userSettings));
|
|
145
|
+
const workspaceSettings = {
|
|
146
|
+
showMemoryUsage: true,
|
|
147
|
+
fileFiltering: {
|
|
148
|
+
respectGitIgnore: false,
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
const workspaceSettingsPath = path.join(mockGeminiWorkspaceDir, 'settings.json');
|
|
152
|
+
fs.writeFileSync(workspaceSettingsPath, JSON.stringify(workspaceSettings));
|
|
153
|
+
const result = loadSettings(mockWorkspaceDir);
|
|
154
|
+
// Primitive value overwritten
|
|
155
|
+
expect(result.showMemoryUsage).toBe(true);
|
|
156
|
+
// Object value completely replaced (shallow merge behavior)
|
|
157
|
+
expect(result.fileFiltering?.respectGitIgnore).toBe(false);
|
|
158
|
+
expect(result.fileFiltering?.enableRecursiveFileSearch).toBeUndefined();
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
//# sourceMappingURL=settings.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.test.js","sourceRoot":"","sources":["../../../src/config/settings.test.ts"],"names":[],"mappings":"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"}
|