@@ -2,10 +2,12 @@ package config
22
33import (
44 "fmt"
5+ "os"
56 "slices"
67 "strings"
78
89 "github.com/charmbracelet/crush/internal/fur/provider"
10+ "github.com/tidwall/sjson"
911)
1012
1113const (
@@ -274,6 +276,14 @@ func (c *Config) SmallModel() *provider.Model {
274276 return c.GetModel(model.Provider, model.Model)
275277}
276278
279+func (c *Config) SetCompactMode(enabled bool) error {
280+ if c.Options == nil {
281+ c.Options = &Options{}
282+ }
283+ c.Options.TUI.CompactMode = enabled
284+ return c.SetConfigField("options.tui.compact_mode", enabled)
285+}
286+
277287func (c *Config) Resolve(key string) (string, error) {
278288 if c.resolver == nil {
279289 return "", fmt.Errorf("no variable resolver configured")
@@ -287,3 +297,25 @@ func UpdatePreferredModel(modelType SelectedModelType, model SelectedModel) erro
287297 cfg.Models[modelType] = model
288298 return nil
289299}
300+
301+func (c *Config) SetConfigField(key string, value any) error {
302+ configPath := globalConfigData()
303+ // read the data
304+ data, err := os.ReadFile(configPath)
305+ if err != nil {
306+ if os.IsNotExist(err) {
307+ data = []byte("{}")
308+ } else {
309+ return fmt.Errorf("failed to read config file: %w", err)
310+ }
311+ }
312+
313+ newValue, err := sjson.Set(string(data), key, value)
314+ if err != nil {
315+ return fmt.Errorf("failed to set config field %s: %w", key, err)
316+ }
317+ if err := os.WriteFile(configPath, []byte(newValue), 0o644); err != nil {
318+ return fmt.Errorf("failed to write config file: %w", err)
319+ }
320+ return nil
321+}