52 lines
1.5 KiB
Python
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
|