| |
| |
| |
| |
| |
|
|
| 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?: Record<string, number>; |
| terminalSetupPromptShown?: boolean; |
| tipsShown?: number; |
| hasSeenScreenReaderNudge?: boolean; |
| focusUiEnabled?: boolean; |
| startupWarningCounts?: Record<string, number>; |
| |
| } |
|
|
| 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); |
| |
| 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(); |
| this.cache![key] = value; |
| this.save(); |
| } |
| } |
|
|
| export const persistentState = new PersistentState(); |
|
|