"""Configuration for Spore Agent Commons node.""" import os from pathlib import Path from pydantic_settings import BaseSettings from koi_net.config.full_node import FullNodeConfig from koi_net.config.koi_net_config import KoiNetConfig, NodeContact from koi_net.config.server_config import ServerConfig from koi_net.protocol.node import NodeProfile, NodeType, NodeProvides from rid_lib.core import RID from .rid_types import SPORE_RID_TYPES, SporeHolon class SporeConfig(BaseSettings): """App-level config loaded from env vars.""" node_name: str = "spore-commons" node_port: int = 8351 root_dir: Path = Path("/data") # Database postgres_host: str = "spore-db" postgres_port: int = 5432 postgres_user: str = "spore" postgres_password: str = "" postgres_db: str = "spore_commons" # Redis redis_url: str = "redis://spore-redis:6379" # Federation bkc_node_url: str = "" # AI embedding_api_url: str = "http://litellm:4000" @property def database_url(self) -> str: return ( f"postgresql://{self.postgres_user}:{self.postgres_password}" f"@{self.postgres_host}:{self.postgres_port}/{self.postgres_db}" ) model_config = {"env_prefix": "", "case_sensitive": False} def build_node_config(cfg: SporeConfig) -> FullNodeConfig: """Build koi-net FullNodeConfig from our SporeConfig.""" koi_net = KoiNetConfig( node_name=cfg.node_name, node_profile=NodeProfile( node_type=NodeType.FULL, provides=NodeProvides( event=list(SPORE_RID_TYPES), state=list(SPORE_RID_TYPES), ), ), rid_types_of_interest=list(SPORE_RID_TYPES), cache_directory_path=cfg.root_dir / ".rid_cache", private_key_pem_path=cfg.root_dir / "priv_key.pem", ) # Add BKC as first contact if configured if cfg.bkc_node_url: koi_net.first_contact = NodeContact( rid=None, url=cfg.bkc_node_url, ) return FullNodeConfig( koi_net=koi_net, server=ServerConfig( host="0.0.0.0", port=cfg.node_port, path="/koi-net", ), )