@@ -57,7 +57,7 @@ type Provider struct {
5757
5858// Data defines storage configuration.
5959type Data struct {
60− Directory string `json:"directory"`
60+ Directory string `json:"directory,omitempty"`
6161}
6262
6363// LSPConfig defines configuration for Language Server Protocol integration.
@@ -86,7 +86,7 @@ type Config struct {
8686 MCPServers map[string]MCPServer `json:"mcpServers,omitempty"`
8787 Providers map[models.ModelProvider]Provider `json:"providers,omitempty"`
8888 LSP map[string]LSPConfig `json:"lsp,omitempty"`
89− Agents map[AgentName]Agent `json:"agents"`
89+ Agents map[AgentName]Agent `json:"agents,omitempty"`
9090 Debug bool `json:"debug,omitempty"`
9191 DebugLSP bool `json:"debugLSP,omitempty"`
9292 ContextPaths []string `json:"contextPaths,omitempty"`
@@ -721,6 +721,52 @@ func setDefaultModelForAgent(agent AgentName) bool {
721721 return false
722722}
723723
724+func updateCfgFile(updateCfg func(config *Config)) error {
725+ if cfg == nil {
726+ return fmt.Errorf("config not loaded")
727+ }
728+
729+ // Get the config file path
730+ configFile := viper.ConfigFileUsed()
731+ var configData []byte
732+ if configFile == "" {
733+ homeDir, err := os.UserHomeDir()
734+ if err != nil {
735+ return fmt.Errorf("failed to get home directory: %w", err)
736+ }
737+ configFile = filepath.Join(homeDir, fmt.Sprintf(".%s.json", appName))
738+ logging.Info("config file not found, creating new one", "path", configFile)
739+ configData = []byte(`{}`)
740+ } else {
741+ // Read the existing config file
742+ data, err := os.ReadFile(configFile)
743+ if err != nil {
744+ return fmt.Errorf("failed to read config file: %w", err)
745+ }
746+ configData = data
747+ }
748+
749+ // Parse the JSON
750+ var userCfg *Config
751+ if err := json.Unmarshal(configData, &userCfg); err != nil {
752+ return fmt.Errorf("failed to parse config file: %w", err)
753+ }
754+
755+ updateCfg(userCfg)
756+
757+ // Write the updated config back to file
758+ updatedData, err := json.MarshalIndent(userCfg, "", " ")
759+ if err != nil {
760+ return fmt.Errorf("failed to marshal config: %w", err)
761+ }
762+
763+ if err := os.WriteFile(configFile, updatedData, 0o644); err != nil {
764+ return fmt.Errorf("failed to write config file: %w", err)
765+ }
766+
767+ return nil
768+}
769+
724770// Get returns the current configuration.
725771// It's safe to call this function multiple times.
726772func Get() *Config {
@@ -765,7 +811,12 @@ func UpdateAgentModel(agentName AgentName, modelID models.ModelID) error {
765811 return fmt.Errorf("failed to update agent model: %w", err)
766812 }
767813
768− return nil
814+ return updateCfgFile(func(config *Config) {
815+ if config.Agents == nil {
816+ config.Agents = make(map[AgentName]Agent)
817+ }
818+ config.Agents[agentName] = newAgentCfg
819+ })
769820}
770821
771822// UpdateTheme updates the theme in the configuration and writes it to the config file.
@@ -777,52 +828,8 @@ func UpdateTheme(themeName string) error {
777828 // Update the in-memory config
778829 cfg.TUI.Theme = themeName
779830
780− // Get the config file path
781− configFile := viper.ConfigFileUsed()
782− var configData []byte
783− if configFile == "" {
784− homeDir, err := os.UserHomeDir()
785− if err != nil {
786− return fmt.Errorf("failed to get home directory: %w", err)
787− }
788− configFile = filepath.Join(homeDir, fmt.Sprintf(".%s.json", appName))
789− logging.Info("config file not found, creating new one", "path", configFile)
790− configData = []byte(`{}`)
791− } else {
792− // Read the existing config file
793− data, err := os.ReadFile(configFile)
794− if err != nil {
795− return fmt.Errorf("failed to read config file: %w", err)
796− }
797− configData = data
798− }
799−
800− // Parse the JSON
801− var configMap map[string]interface{}
802− if err := json.Unmarshal(configData, &configMap); err != nil {
803− return fmt.Errorf("failed to parse config file: %w", err)
804− }
805−
806− // Update just the theme value
807− tuiConfig, ok := configMap["tui"].(map[string]interface{})
808− if !ok {
809− // TUI config doesn't exist yet, create it
810− configMap["tui"] = map[string]interface{}{"theme": themeName}
811− } else {
812− // Update existing TUI config
813− tuiConfig["theme"] = themeName
814− configMap["tui"] = tuiConfig
815− }
816−
817− // Write the updated config back to file
818− updatedData, err := json.MarshalIndent(configMap, "", " ")
819− if err != nil {
820− return fmt.Errorf("failed to marshal config: %w", err)
821− }
822−
823− if err := os.WriteFile(configFile, updatedData, 0o644); err != nil {
824− return fmt.Errorf("failed to write config file: %w", err)
825− }
826−
827− return nil
831+ // Update the file config
832+ return updateCfgFile(func(config *Config) {
833+ config.TUI.Theme = themeName
834+ })
828835}