| 1 | package main |
| 2 | |
| 3 | import ( |
| 4 | "runtime" |
| 5 | |
| 6 | "reasonix/internal/agent" |
| 7 | "reasonix/internal/config" |
| 8 | "reasonix/internal/provider" |
| 9 | "reasonix/internal/sandbox" |
| 10 | ) |
| 11 | |
| 12 | func desktopStartupSettingsFromConfig(cfg *config.Config) DesktopStartupSettingsView { |
| 13 | if cfg == nil { |
| 14 | return DesktopStartupSettingsView{ |
| 15 | Bot: botSettingsView(config.BotConfig{}), DesktopLayoutStyle: "workbench", |
| 16 | DesktopTheme: "auto", DesktopThemeStyle: "graphite", DesktopTerminalTheme: "auto", |
| 17 | DisplayMode: "standard", SessionExperience: "standard", ReasoningDisplayMode: "auto", StatusBarStyle: "icon", |
| 18 | StatusBarItems: config.DefaultDesktopStatusBarItems(), CheckUpdates: false, UpdaterEnabled: desktopUpdaterEnabled(), |
| 19 | UpdateChannel: "stable", ConversationWidth: "standard", |
| 20 | } |
| 21 | } |
| 22 | return DesktopStartupSettingsView{ |
| 23 | Bot: botSettingsView(cfg.Bot), DesktopLanguage: cfg.DesktopLanguage(), |
| 24 | DesktopLayoutStyle: cfg.DesktopLayoutStyle(), DesktopTheme: cfg.DesktopTheme(), |
| 25 | DesktopThemeStyle: cfg.DesktopThemeStyle(), DesktopTerminalTheme: cfg.DesktopTerminalTheme(), |
| 26 | DisplayMode: cfg.DesktopDisplayMode(), SessionExperience: cfg.DesktopSessionExperience(), ReasoningDisplayMode: cfg.DesktopReasoningDisplayMode(), |
| 27 | ReasoningDisplayModeExplicit: cfg.DesktopReasoningDisplayModeExplicit(), StatusBarStyle: cfg.DesktopStatusBarStyle(), |
| 28 | StatusBarItems: cfg.DesktopStatusBarItems(), CheckUpdates: cfg.DesktopCheckUpdates(), UpdaterEnabled: desktopUpdaterEnabled(), |
| 29 | UpdateChannel: cfg.DesktopUpdateChannel(), ConversationWidth: cfg.DesktopConversationWidth(), |
| 30 | ConfigWarnings: cfg.LoadWarnings(), ConfigPath: config.UserConfigPath(), |
| 31 | } |
| 32 | } |
| 33 | |
| 34 | func (a *App) defaultSettingsView() SettingsView { |
| 35 | defaults := config.Default() |
| 36 | return SettingsView{ |
| 37 | WebSearchModels: []string{}, |
| 38 | Providers: []ProviderView{}, OfficialProviders: officialProviderViews(map[string]bool{}, ""), |
| 39 | ProviderPresets: providerPresetViewsForRootWithResolver(nil, a.activeWorkspaceRoot(), nil), |
| 40 | ProviderKinds: nonNil(provider.Kinds()), |
| 41 | Permissions: PermissionsView{Mode: "ask", Allow: []string{}, Ask: []string{}, Deny: []string{}}, |
| 42 | Sandbox: SandboxView{Bash: defaults.BashMode(), AllowWrite: []string{}, EffectiveWriteRoots: []string{}, Shell: "auto", |
| 43 | EffectiveShell: sandboxEffectiveShellView(sandbox.ResolveShell("", "", nil)), |
| 44 | ResolvedShell: sandboxEffectiveShellView(sandbox.ResolveShell("", "", nil)), |
| 45 | ShellCapabilities: sandboxCapabilityViews("", ""), |
| 46 | GitCapability: gitCapabilityView("", ""), |
| 47 | ShellRepairGuidance: shellRepairGuidanceForGOOS(runtime.GOOS), |
| 48 | GitRepairGuidance: gitRepairGuidanceForGOOS(runtime.GOOS)}, |
| 49 | Agent: AgentView{ |
| 50 | PlannerMaxSteps: 0, MaxSubagentDepth: agent.DefaultMaxSubagentDepth, |
| 51 | MaxSubagentConcurrency: agent.DefaultMaxSubagentConcurrency, MaxParallelWriters: agent.DefaultMaxParallelWriters, |
| 52 | ReasoningLanguage: "auto", |
| 53 | CompactRatio: defaults.Agent.CompactRatio, EffectiveCompactRatio: defaults.Agent.CompactRatio, |
| 54 | }, |
| 55 | Bot: botSettingsView(config.BotConfig{}), AutoPlan: "off", DesktopLayoutStyle: "workbench", |
| 56 | DesktopTheme: "auto", DesktopThemeStyle: "graphite", DesktopTerminalTheme: "auto", |
| 57 | CloseBehavior: "background", DisplayMode: "standard", ReasoningDisplayMode: "auto", |
| 58 | StatusBarStyle: "icon", StatusBarItems: config.DefaultDesktopStatusBarItems(), SessionExperience: "standard", |
| 59 | DefaultToolApprovalMode: "workspace-write", CheckUpdates: false, UpdaterEnabled: desktopUpdaterEnabled(), UpdateChannel: "stable", |
| 60 | Telemetry: true, Metrics: true, ExpandThinking: false, ConversationWidth: "standard", |
| 61 | } |
| 62 | } |
| 63 | |
| 64 | // SetReasoningDisplayMode persists presentation only; no controller rebuild is needed. |
| 65 | func (a *App) SetReasoningDisplayMode(mode string) error { |
| 66 | return a.applyConfigOnly(func(c *config.Config) error { |
| 67 | if mode == "expanded" { |
| 68 | return c.SetDesktopSessionExperience(string(config.SessionExperienceDeep)) |
| 69 | } |
| 70 | return c.SetDesktopSessionExperience(string(config.SessionExperienceStandard)) |
| 71 | }) |
| 72 | } |
| 73 | |
| 74 | // SetSessionExperience persists the canonical two-state desktop presentation. |
| 75 | func (a *App) SetSessionExperience(mode string) error { |
| 76 | return a.applyConfigOnly(func(c *config.Config) error { return c.SetDesktopSessionExperience(mode) }) |
| 77 | } |
| 78 | |
| 79 | // SetDisplayMode preserves the legacy density setter for one release. |
| 80 | func (a *App) SetDisplayMode(string) error { |
| 81 | return a.SetSessionExperience(string(config.SessionExperienceStandard)) |
| 82 | } |
| 83 | |
| 84 | // SetExpandThinking preserves the legacy reasoning boolean for one release. |
| 85 | func (a *App) SetExpandThinking(bool) error { |
| 86 | return a.SetSessionExperience(string(config.SessionExperienceStandard)) |
| 87 | } |
| 88 |