Files
gemini-cli/packages/cli/src/utils/persistentState.ts
Shreya Keshive 86828bb561 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>
2025-11-18 09:01:16 -08:00

80 lines
1.9 KiB
TypeScript

/**
* @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();