diff --git a/internal/app/app.go b/internal/app/app.go index bbebcbfea9d03ca97fcf71094b420bd181ee9516..1c65ce8616b45f13e9797ace033b02d0a3565ebb 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -345,10 +345,10 @@ func (app *App) overrideModelsForNonInteractive(ctx context.Context, largeModel, } largeProviderID = found.provider slog.Info("Overriding large model for non-interactive run", "provider", found.provider, "model", found.modelID) - app.config.Models[config.SelectedModelTypeLarge] = config.SelectedModel{ + app.configService.OverrideModel(config.SelectedModelTypeLarge, config.SelectedModel{ Provider: found.provider, Model: found.modelID, - } + }) } // Override small model. @@ -359,15 +359,15 @@ func (app *App) overrideModelsForNonInteractive(ctx context.Context, largeModel, return err } slog.Info("Overriding small model for non-interactive run", "provider", found.provider, "model", found.modelID) - app.config.Models[config.SelectedModelTypeSmall] = config.SelectedModel{ + app.configService.OverrideModel(config.SelectedModelTypeSmall, config.SelectedModel{ Provider: found.provider, Model: found.modelID, - } + }) case largeModel != "": // No small model specified, but large model was - use provider's default. smallCfg := app.GetDefaultSmallModel(largeProviderID) - app.config.Models[config.SelectedModelTypeSmall] = smallCfg + app.configService.OverrideModel(config.SelectedModelTypeSmall, smallCfg) } return app.AgentCoordinator.UpdateModels(ctx) diff --git a/internal/cmd/root.go b/internal/cmd/root.go index c1afc25f7a5555c586c43725f40bf708a18ed36f..8f70e3679efa7c1e416c145a9695003e2b9bbc73 100644 --- a/internal/cmd/root.go +++ b/internal/cmd/root.go @@ -199,12 +199,11 @@ func setupApp(cmd *cobra.Command) (*app.App, error) { if err != nil { return nil, err } - cfg := svc.Config() - - if cfg.Permissions == nil { - cfg.Permissions = &config.Permissions{} + if svc.Permissions() == nil { + svc.SetPermissions(&config.Permissions{}) } - cfg.Permissions.SkipRequests = yolo + p := svc.Permissions() + p.SkipRequests = yolo if err := createDotCrushDir(svc.DataDirectory()); err != nil { return nil, err diff --git a/internal/config/config.go b/internal/config/config.go index f2880f12c1dd267741b6167d1c4af9d2b98954d4..5e252170b7ac23b2c052ac92773fba26c52a3788 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -384,8 +384,6 @@ type Config struct { workingDir string `json:"-"` // TODO: find a better way to do this this should probably not be part of the config resolver VariableResolver - store Store `json:"-"` - dataConfigDir string `json:"-"` knownProviders []catwalk.Provider `json:"-"` } @@ -461,21 +459,6 @@ func (c *Config) Resolve(key string) (string, error) { return c.resolver.ResolveValue(key) } -func (c *Config) setConfigField(key string, value any) error { - return SetField(c.configStore(), key, value) -} - -func (c *Config) removeConfigField(key string) error { - return RemoveField(c.configStore(), key) -} - -func (c *Config) configStore() Store { - if c.store == nil { - c.store = NewFileStore(c.dataConfigDir) - } - return c.store -} - func allToolNames() []string { return []string{ "agent", diff --git a/internal/config/load.go b/internal/config/load.go index 044d9a5f7596ac21f7280936e44517f431195073..e3450dc266bc4e8cd4063f6497ff99569b619d19 100644 --- a/internal/config/load.go +++ b/internal/config/load.go @@ -46,9 +46,6 @@ func Load(workingDir, dataDir string, debug bool) (*Service, error) { workingDir: workingDir, } - // Keep dataConfigDir in sync for the transitional configStore() accessor. - cfg.dataConfigDir = GlobalConfigData() - cfg.setDefaults(workingDir, dataDir) if debug { @@ -562,7 +559,7 @@ func (s *Service) configureSelectedModels(knownProviders []catwalk.Provider) err if model == nil { large = defaultLarge c.Models[SelectedModelTypeLarge] = large - if err := c.setConfigField(fmt.Sprintf("models.%s", SelectedModelTypeLarge), large); err != nil { + if err := s.SetConfigField(fmt.Sprintf("models.%s", SelectedModelTypeLarge), large); err != nil { return fmt.Errorf("failed to update preferred large model: %w", err) } } else { @@ -605,7 +602,7 @@ func (s *Service) configureSelectedModels(knownProviders []catwalk.Provider) err if model == nil { small = defaultSmall c.Models[SelectedModelTypeSmall] = small - if err := c.setConfigField(fmt.Sprintf("models.%s", SelectedModelTypeSmall), small); err != nil { + if err := s.SetConfigField(fmt.Sprintf("models.%s", SelectedModelTypeSmall), small); err != nil { return fmt.Errorf("failed to update preferred small model: %w", err) } } else { diff --git a/internal/config/service.go b/internal/config/service.go index 9d2ad52f1665af79e09e89e841f5948f5ef10447..8124ff5e48cf1b6ac2ca190da9efa5fdbf736346 100644 --- a/internal/config/service.go +++ b/internal/config/service.go @@ -204,6 +204,12 @@ func (s *Service) SetPermissions(p *Permissions) { s.cfg.Permissions = p } +// OverrideModel overrides the in-memory model for the given type +// without persisting. Used for non-interactive model overrides. +func (s *Service) OverrideModel(modelType SelectedModelType, model SelectedModel) { + s.cfg.Models[modelType] = model +} + // ToolLsConfig returns the ls tool configuration. func (s *Service) ToolLsConfig() ToolLs { return s.cfg.Tools.Ls