mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-03-14 16:10:59 -07:00
feat: launch Gemini 3 in Gemini CLI 🚀🚀🚀 (in main) (#13287)
Co-authored-by: Adam Weidman <65992621+adamfweidman@users.noreply.github.com> Co-authored-by: Sehoon Shon <sshon@google.com> Co-authored-by: Adib234 <30782825+Adib234@users.noreply.github.com> Co-authored-by: Sandy Tao <sandytao520@icloud.com> Co-authored-by: Abhi <43648792+abhipatel12@users.noreply.github.com> Co-authored-by: Aishanee Shah <aishaneeshah@gmail.com> Co-authored-by: gemini-cli-robot <gemini-cli-robot@google.com> Co-authored-by: Gal Zahavi <38544478+galz10@users.noreply.github.com> Co-authored-by: Jacob Richman <jacob314@gmail.com> Co-authored-by: joshualitt <joshualitt@google.com> Co-authored-by: Jenna Inouye <jinouye@google.com>
This commit is contained in:
79
packages/cli/src/utils/persistentState.ts
Normal file
79
packages/cli/src/utils/persistentState.ts
Normal file
@@ -0,0 +1,79 @@
|
||||
/**
|
||||
* @license
|
||||
* Copyright 2025 Google LLC
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
import { Storage, debugLogger } from '@google/gemini-cli-core';
|
||||
import * as fs from 'node:fs';
|
||||
import * as path from 'node:path';
|
||||
|
||||
const STATE_FILENAME = 'state.json';
|
||||
|
||||
interface PersistentStateData {
|
||||
defaultBannerShownCount?: number;
|
||||
// Add other persistent state keys here as needed
|
||||
}
|
||||
|
||||
export class PersistentState {
|
||||
private cache: PersistentStateData | null = null;
|
||||
private filePath: string | null = null;
|
||||
|
||||
private getPath(): string {
|
||||
if (!this.filePath) {
|
||||
this.filePath = path.join(Storage.getGlobalGeminiDir(), STATE_FILENAME);
|
||||
}
|
||||
return this.filePath;
|
||||
}
|
||||
|
||||
private load(): PersistentStateData {
|
||||
if (this.cache) {
|
||||
return this.cache;
|
||||
}
|
||||
try {
|
||||
const filePath = this.getPath();
|
||||
if (fs.existsSync(filePath)) {
|
||||
const content = fs.readFileSync(filePath, 'utf-8');
|
||||
this.cache = JSON.parse(content);
|
||||
} else {
|
||||
this.cache = {};
|
||||
}
|
||||
} catch (error) {
|
||||
debugLogger.warn('Failed to load persistent state:', error);
|
||||
// If error reading (e.g. corrupt JSON), start fresh
|
||||
this.cache = {};
|
||||
}
|
||||
return this.cache!;
|
||||
}
|
||||
|
||||
private save() {
|
||||
if (!this.cache) return;
|
||||
try {
|
||||
const filePath = this.getPath();
|
||||
const dir = path.dirname(filePath);
|
||||
if (!fs.existsSync(dir)) {
|
||||
fs.mkdirSync(dir, { recursive: true });
|
||||
}
|
||||
fs.writeFileSync(filePath, JSON.stringify(this.cache, null, 2));
|
||||
} catch (error) {
|
||||
debugLogger.warn('Failed to save persistent state:', error);
|
||||
}
|
||||
}
|
||||
|
||||
get<K extends keyof PersistentStateData>(
|
||||
key: K,
|
||||
): PersistentStateData[K] | undefined {
|
||||
return this.load()[key];
|
||||
}
|
||||
|
||||
set<K extends keyof PersistentStateData>(
|
||||
key: K,
|
||||
value: PersistentStateData[K],
|
||||
): void {
|
||||
this.load(); // ensure loaded
|
||||
this.cache![key] = value;
|
||||
this.save();
|
||||
}
|
||||
}
|
||||
|
||||
export const persistentState = new PersistentState();
|
||||
Reference in New Issue
Block a user