@@ -2,6 +2,12 @@ import * as fs from "fs";
22import * as path from "path" ;
33import * as os from "os" ;
44
5+ /**
6+ * Current settings version - increment this when adding new models or changing settings structure
7+ * This triggers automatic migration for existing users
8+ */
9+ const SETTINGS_VERSION = 2 ;
10+
511/**
612 * User-level settings stored in ~/.grok/user-settings.json
713 * These are global settings that apply across all projects
@@ -11,6 +17,7 @@ export interface UserSettings {
1117 baseURL ?: string ; // API base URL
1218 defaultModel ?: string ; // User's preferred default model
1319 models ?: string [ ] ; // Available models list
20+ settingsVersion ?: number ; // Version for migration tracking
1421}
1522
1623/**
@@ -29,10 +36,22 @@ const DEFAULT_USER_SETTINGS: Partial<UserSettings> = {
2936 baseURL : "https://api.x.ai/v1" ,
3037 defaultModel : "grok-code-fast-1" ,
3138 models : [
32- "grok-code-fast-1" ,
39+ // Grok 4.1 Fast models (2M context, latest - November 2025)
40+ "grok-4-1-fast-reasoning" ,
41+ "grok-4-1-fast-non-reasoning" ,
42+ // Grok 4 Fast models (2M context)
43+ "grok-4-fast-reasoning" ,
44+ "grok-4-fast-non-reasoning" ,
45+ // Grok 4 flagship (256K context)
46+ "grok-4" ,
3347 "grok-4-latest" ,
48+ // Grok Code (optimized for coding, 256K context)
49+ "grok-code-fast-1" ,
50+ // Grok 3 models (131K context)
51+ "grok-3" ,
3452 "grok-3-latest" ,
3553 "grok-3-fast" ,
54+ "grok-3-mini" ,
3655 "grok-3-mini-fast" ,
3756 ] ,
3857} ;
@@ -96,13 +115,22 @@ export class SettingsManager {
96115 try {
97116 if ( ! fs . existsSync ( this . userSettingsPath ) ) {
98117 // Create default user settings if file doesn't exist
99- this . saveUserSettings ( DEFAULT_USER_SETTINGS ) ;
100- return { ...DEFAULT_USER_SETTINGS } ;
118+ const newSettings = { ...DEFAULT_USER_SETTINGS , settingsVersion : SETTINGS_VERSION } ;
119+ this . saveUserSettings ( newSettings ) ;
120+ return newSettings ;
101121 }
102122
103123 const content = fs . readFileSync ( this . userSettingsPath , "utf-8" ) ;
104124 const settings = JSON . parse ( content ) ;
105125
126+ // Check if migration is needed
127+ const currentVersion = settings . settingsVersion || 1 ;
128+ if ( currentVersion < SETTINGS_VERSION ) {
129+ const migratedSettings = this . migrateSettings ( settings , currentVersion ) ;
130+ this . saveUserSettings ( migratedSettings ) ;
131+ return migratedSettings ;
132+ }
133+
106134 // Merge with defaults to ensure all required fields exist
107135 return { ...DEFAULT_USER_SETTINGS , ...settings } ;
108136 } catch ( error ) {
@@ -114,6 +142,31 @@ export class SettingsManager {
114142 }
115143 }
116144
145+ /**
146+ * Migrate settings from an older version to the current version
147+ */
148+ private migrateSettings ( settings : UserSettings , fromVersion : number ) : UserSettings {
149+ let migrated = { ...settings } ;
150+
151+ // Migration from version 1 to 2: Add new Grok 4.1 and Grok 4 Fast models
152+ if ( fromVersion < 2 ) {
153+ const defaultModels = DEFAULT_USER_SETTINGS . models || [ ] ;
154+ const existingModels = new Set ( migrated . models || [ ] ) ;
155+
156+ // Add any new models that don't exist in user's current list
157+ const newModels = defaultModels . filter ( model => ! existingModels . has ( model ) ) ;
158+
159+ // Prepend new models to the list (newest models first)
160+ migrated . models = [ ...newModels , ...( migrated . models || [ ] ) ] ;
161+ }
162+
163+ // Add future migrations here:
164+ // if (fromVersion < 3) { ... }
165+
166+ migrated . settingsVersion = SETTINGS_VERSION ;
167+ return migrated ;
168+ }
169+
117170 /**
118171 * Save user settings to ~/.grok/user-settings.json
119172 */
0 commit comments