@startuml title AI Repo Commander — Config overview (safe) class ConfigManager { +load() : object +save() : void +get(keyPath) : any +set(keyPath, value) : void +mergeConfigs(defaults, saved) : object +deepClone(o) : any } class STORAGE_KEYS { history : "ai_repo_commander_executed" cfg : "ai_repo_commander_cfg" panel : "ai_repo_commander_panel_state" } ' Split DEFAULT_CONFIG into simple classes (no quotes, no =) class DEFAULT_META { version : 1.6.2 } class DEFAULT_API { enabled : boolean timeout : number maxRetries : number bridgeKey : string } class DEFAULT_DEBUG { enabled : boolean level : number maxLines : number showPanel : boolean } class DEFAULT_EXECUTION { debounceDelay : ms settleCheckMs : ms settlePollMs : ms requireTerminator : boolean coldStartMs : ms stuckAfterMs : ms scanDebounceMs : ms fastWarnMs : ms slowWarnMs : ms clusterRescanMs : ms clusterMaxLookahead : count } class DEFAULT_QUEUE { minDelayMs : ms maxPerMinute : count maxPerMessage : count waitForComposerMs : ms } class DEFAULT_UI { autoSubmit : boolean appendTrailingNewline : boolean postPasteDelayMs : ms showExecutedMarker : boolean processExisting : boolean submitMode : "enter|ctrl+enter" maxComposerWaitMs : ms submitMaxRetries : count } class DEFAULT_STORAGE { dedupeTtlMs : ms cleanupAfterMs : ms cleanupIntervalMs : ms } class DEFAULT_RESPONSE { bufferFlushDelayMs : ms sectionHeadings : boolean maxPasteChars : number splitLongResponses : boolean } class DEFAULT_RUNTIME { paused : boolean '(note: runtime is not persisted) } ConfigManager --> STORAGE_KEYS : uses localStorage keys ConfigManager --> DEFAULT_META : deepClone/merge ConfigManager --> DEFAULT_API ConfigManager --> DEFAULT_DEBUG ConfigManager --> DEFAULT_EXECUTION ConfigManager --> DEFAULT_QUEUE ConfigManager --> DEFAULT_UI ConfigManager --> DEFAULT_STORAGE ConfigManager --> DEFAULT_RESPONSE ConfigManager --> DEFAULT_RUNTIME : in-memory only @enduml