"""SporeNode — extends koi-net FullNode with Spore primitives.""" from dataclasses import dataclass from pathlib import Path from koi_net.core import FullNode from koi_net.components.interfaces import KnowledgeHandler, HandlerType from koi_net.protocol.event import EventType from koi_net.protocol.knowledge_object import KnowledgeObject from rid_lib.ext import Bundle from .config import SporeConfig, build_node_config from .rid_types import SporeHolon, SPORE_RID_TYPES @dataclass class SporeDerefHandler: """Dereference Spore RID types from PostgreSQL.""" handler_type = HandlerType.Bundle rid_types = SPORE_RID_TYPES event_types = () def handle(self, kobj: KnowledgeObject) -> KnowledgeObject | None: # Phase 1: pass-through. Phase 2 will add DB lookups. return kobj class SporeNode(FullNode): """Spore Agent Commons koi-net node.""" spore_deref: SporeDerefHandler = SporeDerefHandler def create_node(cfg: SporeConfig) -> object: """Create and configure the SporeNode. Returns a NodeContainer (koi-net assembler pattern). """ node_config = build_node_config(cfg) # Write config to root_dir for koi-net to pick up config_dir = cfg.root_dir config_dir.mkdir(parents=True, exist_ok=True) config_path = config_dir / "config.yaml" import yaml with open(config_path, "w") as f: yaml.dump(node_config.model_dump(mode="json"), f) node = SporeNode(root_dir=config_dir) return node