# Configuration Reference Complete guide to all Sovereign Engine configuration options. ## EngineConfig Dataclass The `EngineConfig` controls all engine behavior. Pass it to `SovereignEngine()`: ```python from pathlib import Path from src.sovereign import EngineConfig, SovereignEngine config = EngineConfig( allowed_roots=[Path("/safe/paths")], ledger_path=Path("./sovereign.worm"), continuity_dir=Path.home() / ".sovereign" / "continuity", max_steps=15, enable_shadow=True, enable_ipc=True, agent_id="sovereign_main" ) engine = SovereignEngine(config) ``` ### Configuration Options | Option | Type | Default | Description | |--------|------|---------|-------------| | `allowed_roots` | `list[Path]` | `[Path.cwd()]` | Filesystem roots the engine can access. PathJail blocks all others. | | `ledger_path` | `Path` | `./sovereign.worm` | Binary WORM ledger file for cryptographic audit trail. | | `continuity_dir` | `Path` | `~/.sovereign/continuity` | Directory for all four continuity backends. Auto-created. | | `max_steps` | `int` | `15` | Max reasoning steps in ReActAgent loop before timeout. | | `enable_shadow` | `bool` | `True` | Enable ShadowAgent for non-blocking observation. | | `enable_ipc` | `bool` | `True` | Enable native IPC multiplexer (O(1) tool dispatch). | | `agent_id` | `str` | `"sovereign_main"` | Unique agent identifier (for multi-agent coordination). | ## Environment Variables Override config via environment variables (prefixed with `SOVEREIGN_`): ```bash export SOVEREIGN_ALLOWED_ROOTS="/home/user/projects:/tmp" export SOVEREIGN_MAX_STEPS=25 export SOVEREIGN_ENABLE_SHADOW=false export SOVEREIGN_AGENT_ID="batch_processor_1" python your_script.py ``` Supported environment variables: | Variable | Type | Maps To | |----------|------|---------| | `SOVEREIGN_ALLOWED_ROOTS` | CSV paths | `allowed_roots` (split on `:` or `;`) | | `SOVEREIGN_LEDGER_PATH` | path | `ledger_path` | | `SOVEREIGN_CONTINUITY_DIR` | path | `continuity_dir` | | `SOVEREIGN_MAX_STEPS` | int | `max_steps` | | `SOVEREIGN_ENABLE_SHADOW` | bool | `enable_shadow` (true/false/1/0) | | `SOVEREIGN_ENABLE_IPC` | bool | `enable_ipc` | | `SOVEREIGN_AGENT_ID` | str | `agent_id` | Example: ```python import os from src.sovereign import SovereignEngine # Environment variables take precedence if "SOVEREIGN_MAX_STEPS" in os.environ: max_steps = int(os.environ["SOVEREIGN_MAX_STEPS"]) else: max_steps = 15 ``` ## ReActAgent Config The ReAct reasoning agent has its own config: ```python from src.agents.react import ReActConfig, ReActAgent react_config = ReActConfig( max_steps=20, timeout_ms=60000, model_provider="bedrock", # bedrock, openrouter, ollama, anthropic temperature=0.7, top_p=0.9, ) agent = ReActAgent( agent_id="code_agent", config=react_config, registry=tool_registry, ledger=worm_ledger, ) ``` | Option | Type | Default | Description | |--------|------|---------|-------------| | `max_steps` | `int` | `15` | Max thinking/action loops. | | `timeout_ms` | `int` | `30000` | Total execution timeout. | | `model_provider` | `str` | `"bedrock"` | LLM backend: bedrock, openrouter, ollama, anthropic. | | `temperature` | `float` | `0.7` | Sampling temperature (0.0-1.0). | | `top_p` | `float` | `0.9` | Nucleus sampling parameter. | ## Continuity Directory Structure The engine uses 4 paradigms for state recovery. Structure: ``` ~/.sovereign/continuity/ ├── env_state.bin # Paradigm 1: Env bitmask (for hot-restart) ├── seed.bin # Paradigm 2: Seed for deterministic replay ├── agent_id_seed.bin # Paradigm 2 per-agent seed ├── inode/ │ ├── flags.db # Paradigm 3: File handles mapped to boolean gates │ ├── agent_id.lock │ └── agent_id.state ├── shm/ │ └── block_0.bin # Paradigm 4: Shared memory block (4KB) └── checkpoints/ ├── checkpoint_001.ckpt # Full state snapshot with signature ├── checkpoint_002.ckpt └── manifest.json ``` **Paradigm 1: Env State** — 64-bit bitmask in `os.environ["SOVEREIGN_STATE"]`: - Fastest (RAM) - Lost on process exit - Use for: hot-restart via `os.execv()` **Paradigm 2: Seed Chain** — Blake2b seed derivation: - Deterministic replay - Store operation log in binary - Use for: replay testing, timeline forking **Paradigm 3: Inode State** — Zero-byte files as gates: - Kernel-durable - Fast stat() reads - Use for: boolean flags, pause/resume **Paradigm 4: Shared Memory** — ctypes mmap block: - Cross-process coordination - 4KB block - Use for: multi-agent sync, realtime state ## PathJail Configuration Restrict filesystem access to approved roots: ```python from src.core.path_jail import PathJail from pathlib import Path jail = PathJail(roots=[ Path("/home/user/projects"), Path("/tmp/scratch"), Path.home() / "Downloads" ]) # This is OK jail.check("/home/user/projects/code.py") # ✓ # This is BLOCKED jail.check("/etc/passwd") # ✗ PathJailError jail.check("/root/.ssh/id_rsa") # ✗ PathJailError ``` Pass to engine: ```python config = EngineConfig( allowed_roots=[ Path("/home/user/projects"), Path("/tmp/scratch"), ] ) engine = SovereignEngine(config) ``` ## Model Provider Configuration Choose which LLM backend to use. Defaults to **AWS Bedrock** (all models via unified API). ### Bedrock (Recommended) ```python from src.sovereign import EngineConfig from src.runtime.providers.bedrock import BedrockProvider config = EngineConfig() provider = BedrockProvider( region="us-west-2", model="anthropic.claude-3-opus-20240229-v1:0", ) # Engine automatically uses it engine = SovereignEngine(config) ``` Requires `~/.aws/credentials`: ``` [default] aws_access_key_id = YOUR_KEY aws_secret_access_key = YOUR_SECRET region = us-west-2 ``` ### OpenRouter (Open-source + proprietary models) ```python from src.runtime.providers.openrouter import OpenRouterProvider provider = OpenRouterProvider(api_key="sk-or-...") # Uses OpenRouter API for Mistral, Llama, Qwen, etc. ``` Requires `OPENROUTER_API_KEY` environment variable. ### Ollama (Local models) ```python from src.runtime.providers.ollama import OllamaProvider provider = OllamaProvider(base_url="http://localhost:11434") # Connect to local Ollama instance (ollama serve) ``` Run locally first: ```bash ollama run mistral # or ollama run llama2 ``` ### Anthropic API (Direct) ```python from src.runtime.providers.anthropic import AnthropicProvider provider = AnthropicProvider(api_key="sk-ant-...") ``` ## Example Configurations ### Development Mode Minimal logging, fast iteration: ```python from src.sovereign import EngineConfig from pathlib import Path import logging logging.basicConfig(level=logging.DEBUG) config = EngineConfig( allowed_roots=[Path.cwd()], ledger_path=Path("/tmp/dev.worm"), continuity_dir=Path("/tmp/continuity"), max_steps=10, # Fast iteration enable_shadow=False, ) ``` ### Production Mode Full logging, durability, multi-agent: ```python config = EngineConfig( allowed_roots=[ Path("/var/app/data"), Path("/var/app/cache"), ], ledger_path=Path("/var/lib/sovereign/ledger.worm"), continuity_dir=Path("/var/lib/sovereign/continuity"), max_steps=25, # More thinking enable_shadow=True, # Async observation enable_ipc=True, # Native IPC agent_id="prod_reactor_1", ) ``` With Bedrock: ```python from src.runtime.providers.bedrock import BedrockProvider provider = BedrockProvider( region="us-east-1", model="anthropic.claude-3-sonnet-20240229-v1:0", timeout_ms=120000, ) ``` ### CI Testing Mode Fast, deterministic, no external calls: ```python config = EngineConfig( allowed_roots=[Path("/tmp/ci_test")], ledger_path=Path("/tmp/ci.worm"), continuity_dir=Path("/tmp/ci_continuity"), max_steps=5, enable_shadow=False, enable_ipc=False, # Use pure Python agent_id=f"ci_test_{os.getenv('CI_BUILD_ID')}", ) ``` Use mock provider for testing: ```python from src.runtime.providers.multi import MultiProvider # Fallback chain: try each in order provider = MultiProvider([ MockProvider(), # Return fixed responses OllamaProvider(), # Fall back to local if available ]) ``` ## Logging Configuration Control verbosity via Python logging: ```python import logging # Engine logs logging.getLogger("sovereign.engine").setLevel(logging.INFO) # Routing pipeline logging.getLogger("sovereign.routing").setLevel(logging.DEBUG) # Tool registry logging.getLogger("sovereign.tools").setLevel(logging.WARNING) # Everything logging.basicConfig( level=logging.DEBUG, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s" ) ``` ## Dynamic Configuration Updates Update config without restarting: ```python engine = SovereignEngine(config) # Update max_steps engine.config.max_steps = 25 # Restart agent with new config from src.agents.react import ReActConfig engine.agent.config.max_steps = 25 # Add a new allowed root engine.config.allowed_roots.append(Path("/new/path")) engine.path_jail = PathJail(roots=engine.config.allowed_roots) ``` ## Configuration Validation Validate config before starting engine: ```python from src.sovereign import EngineConfig from pathlib import Path config = EngineConfig( allowed_roots=[Path("/tmp/test")], ) # Check roots exist for root in config.allowed_roots: if not root.exists(): root.mkdir(parents=True, exist_ok=True) # Check continuity dir writable try: config.continuity_dir.mkdir(parents=True, exist_ok=True) (config.continuity_dir / ".test").touch() (config.continuity_dir / ".test").unlink() except PermissionError: raise RuntimeError(f"Cannot write to {config.continuity_dir}") ```