spore-commons/node/spore_node/node.py

52 lines
1.5 KiB
Python

"""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