Skip to content

Commit b568fea

Browse files
committed
Make mode preference sticky!
1 parent 7fd3e84 commit b568fea

File tree

2 files changed

+121
-1
lines changed

2 files changed

+121
-1
lines changed

cli/src/state/chat-store.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { create } from 'zustand'
33
import { immer } from 'zustand/middleware/immer'
44

55
import { clamp } from '../utils/math'
6+
import { loadModePreference, saveModePreference } from '../utils/settings'
67

78
import type { ChatMessage } from '../types/chat'
89
import type { AgentMode } from '../utils/constants'
@@ -87,7 +88,7 @@ const initialState: ChatStoreState = {
8788
isChainInProgress: false,
8889
slashSelectedIndex: 0,
8990
agentSelectedIndex: 0,
90-
agentMode: 'DEFAULT',
91+
agentMode: loadModePreference(),
9192
hasReceivedPlanResponse: false,
9293
lastMessageMode: null,
9394
sessionCreditsUsed: 0,
@@ -171,6 +172,7 @@ export const useChatStore = create<ChatStore>()(
171172
setAgentMode: (mode) =>
172173
set((state) => {
173174
state.agentMode = mode
175+
saveModePreference(mode)
174176
}),
175177

176178
toggleAgentMode: () =>
@@ -182,6 +184,7 @@ export const useChatStore = create<ChatStore>()(
182184
} else {
183185
state.agentMode = 'DEFAULT'
184186
}
187+
saveModePreference(state.agentMode)
185188
}),
186189

187190
setHasReceivedPlanResponse: (value) =>

cli/src/utils/settings.ts

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
import fs from 'fs'
2+
import path from 'path'
3+
4+
import { getConfigDir } from './auth'
5+
import { logger } from './logger'
6+
7+
import type { AgentMode } from './constants'
8+
9+
/**
10+
* Settings schema - add new settings here as the product evolves
11+
*/
12+
export interface Settings {
13+
mode?: AgentMode
14+
// Add new settings here over time
15+
}
16+
17+
const VALID_MODES: AgentMode[] = ['DEFAULT', 'MAX', 'PLAN']
18+
19+
/**
20+
* Get the settings file path
21+
*/
22+
export const getSettingsPath = (): string => {
23+
return path.join(getConfigDir(), 'settings.json')
24+
}
25+
26+
/**
27+
* Load all settings from file system
28+
* @returns The saved settings object, with defaults for missing values
29+
*/
30+
export const loadSettings = (): Settings => {
31+
const settingsPath = getSettingsPath()
32+
33+
if (!fs.existsSync(settingsPath)) {
34+
return {}
35+
}
36+
37+
try {
38+
const settingsFile = fs.readFileSync(settingsPath, 'utf8')
39+
const parsed = JSON.parse(settingsFile)
40+
return validateSettings(parsed)
41+
} catch (error) {
42+
logger.debug(
43+
{
44+
error: error instanceof Error ? error.message : String(error),
45+
},
46+
'Error reading settings',
47+
)
48+
return {}
49+
}
50+
}
51+
52+
/**
53+
* Validate and sanitize settings from file
54+
*/
55+
const validateSettings = (parsed: unknown): Settings => {
56+
if (typeof parsed !== 'object' || parsed === null) {
57+
return {}
58+
}
59+
60+
const settings: Settings = {}
61+
const obj = parsed as Record<string, unknown>
62+
63+
// Validate mode
64+
if (
65+
typeof obj.mode === 'string' &&
66+
VALID_MODES.includes(obj.mode as AgentMode)
67+
) {
68+
settings.mode = obj.mode as AgentMode
69+
}
70+
71+
// Add validation for new settings here
72+
73+
return settings
74+
}
75+
76+
/**
77+
* Save settings to file system (merges with existing settings)
78+
*/
79+
export const saveSettings = (newSettings: Partial<Settings>): void => {
80+
const configDir = getConfigDir()
81+
const settingsPath = getSettingsPath()
82+
83+
try {
84+
if (!fs.existsSync(configDir)) {
85+
fs.mkdirSync(configDir, { recursive: true })
86+
}
87+
88+
// Load existing settings and merge
89+
const existingSettings = loadSettings()
90+
const mergedSettings = { ...existingSettings, ...newSettings }
91+
92+
fs.writeFileSync(settingsPath, JSON.stringify(mergedSettings, null, 2))
93+
} catch (error) {
94+
logger.debug(
95+
{
96+
error: error instanceof Error ? error.message : String(error),
97+
},
98+
'Error saving settings',
99+
)
100+
}
101+
}
102+
103+
/**
104+
* Load the saved agent mode preference
105+
* @returns The saved mode, or 'DEFAULT' if not found or invalid
106+
*/
107+
export const loadModePreference = (): AgentMode => {
108+
const settings = loadSettings()
109+
return settings.mode ?? 'DEFAULT'
110+
}
111+
112+
/**
113+
* Save the agent mode preference
114+
*/
115+
export const saveModePreference = (mode: AgentMode): void => {
116+
saveSettings({ mode })
117+
}

0 commit comments

Comments
 (0)