"""Runtime mode resolution for Basic Memory.
This module centralizes runtime mode detection, ensuring cloud/local/test
determination happens in one place rather than scattered across modules.
Composition roots (containers) read ConfigManager and use this module
to resolve the runtime mode, then pass the result downstream.
"""
from enum import Enum, auto
class RuntimeMode(Enum):
"""Runtime modes for Basic Memory."""
LOCAL = auto() # Local standalone mode (default)
CLOUD = auto() # Cloud mode with remote sync
TEST = auto() # Test environment
@property
def is_cloud(self) -> bool:
return self == RuntimeMode.CLOUD
@property
def is_local(self) -> bool:
return self == RuntimeMode.LOCAL
@property
def is_test(self) -> bool:
return self == RuntimeMode.TEST
def resolve_runtime_mode(
cloud_mode_enabled: bool,
is_test_env: bool,
) -> RuntimeMode:
"""Resolve the runtime mode from configuration flags.
This is the single source of truth for mode resolution.
Composition roots call this with config values they've read.
Args:
cloud_mode_enabled: Whether cloud mode is enabled in config
is_test_env: Whether running in test environment
Returns:
The resolved RuntimeMode
"""
# Trigger: test environment is detected
# Why: tests need special handling (no file sync, isolated DB)
# Outcome: returns TEST mode, skipping cloud mode check
if is_test_env:
return RuntimeMode.TEST
# Trigger: cloud mode is enabled in config
# Why: cloud mode changes auth, sync, and API behavior
# Outcome: returns CLOUD mode for remote-first behavior
if cloud_mode_enabled:
return RuntimeMode.CLOUD
return RuntimeMode.LOCAL