fix: make /config/state return live runtime values from globals

config_manager.runtime_state was a plain dict initialized with hardcoded
defaults (dm_mood='neutral', evil_mode=False, etc.) that were never updated
by any code path except current_gpu. The /config/state endpoint and
get_full_config() both returned this stale dict, so the API always reported
neutral mood and english mode regardless of actual state.

Replaced the static dict with a @property that reads live values from
globals (DM_MOOD, EVIL_MODE, BIPOLAR_MODE, LANGUAGE_MODE) on every access.
GPU state is still managed via _current_gpu and persisted to gpu_state.json.

get_state() and set_state() continue to work for the GPU path.
This commit is contained in:
2026-04-08 14:53:13 +03:00
parent 0831f721e1
commit 9be7c0b1d2

View File

@@ -48,16 +48,10 @@ class ConfigManager:
self.static_config: Dict = self._load_static_config() self.static_config: Dict = self._load_static_config()
self.runtime_config: Dict = self._load_runtime_config() self.runtime_config: Dict = self._load_runtime_config()
# Runtime state (not persisted) # GPU state (the only piece of runtime_state that is persisted to its own file)
self.runtime_state: Dict = { self._current_gpu: str = "nvidia"
"dm_mood": "neutral",
"evil_mode": False,
"bipolar_mode": False,
"language_mode": "english",
"current_gpu": "nvidia",
}
# Load persisted state # Load persisted state (GPU)
self._load_runtime_state() self._load_runtime_state()
logger.info("✅ ConfigManager initialized") logger.info("✅ ConfigManager initialized")
@@ -100,8 +94,8 @@ class ConfigManager:
if gpu_state_file.exists(): if gpu_state_file.exists():
with open(gpu_state_file, "r") as f: with open(gpu_state_file, "r") as f:
gpu_state = json.load(f) gpu_state = json.load(f)
self.runtime_state["current_gpu"] = gpu_state.get("current_gpu", "nvidia") self._current_gpu = gpu_state.get("current_gpu", "nvidia")
logger.debug(f"✅ Loaded GPU state: {self.runtime_state['current_gpu']}") logger.debug(f"✅ Loaded GPU state: {self._current_gpu}")
except Exception as e: except Exception as e:
logger.error(f"❌ Failed to load GPU state: {e}") logger.error(f"❌ Failed to load GPU state: {e}")
@@ -261,13 +255,31 @@ class ConfigManager:
# ========== Runtime State Management ========== # ========== Runtime State Management ==========
@property
def runtime_state(self) -> Dict:
"""
Return live runtime state assembled from globals (the actual source of truth).
Previously this was a static dict that was never updated, causing /config/state
to always return stale defaults. Now it reads the real values each time.
"""
import globals as g
return {
"dm_mood": getattr(g, "DM_MOOD", "neutral"),
"evil_mode": getattr(g, "EVIL_MODE", False),
"bipolar_mode": getattr(g, "BIPOLAR_MODE", False),
"language_mode": getattr(g, "LANGUAGE_MODE", "english"),
"current_gpu": self._current_gpu,
}
def get_state(self, key: str, default: Any = None) -> Any: def get_state(self, key: str, default: Any = None) -> Any:
"""Get runtime state value (not persisted to config).""" """Get runtime state value."""
return self.runtime_state.get(key, default) return self.runtime_state.get(key, default)
def set_state(self, key: str, value: Any): def set_state(self, key: str, value: Any):
"""Set runtime state value.""" """Set runtime state value. Only current_gpu is managed here; other state lives in globals."""
self.runtime_state[key] = value if key == "current_gpu":
self._current_gpu = value
logger.debug(f"📊 State: {key} = {value}") logger.debug(f"📊 State: {key} = {value}")
# ========== Server Configuration ========== # ========== Server Configuration ==========