Frame Engine (v3-framed): - Tick-based deterministic pipeline: frames advance on completion, not timers - FrameRecord/FrameTrace dataclasses for structured per-message tracing - /api/frames endpoint: queryable frame trace history (last 20 messages) - frame_trace HUD event with full pipeline visibility - Reflex=2F, Director=4F, Director+Interpreter=5F deterministic frame counts Expert Architecture (v4-eras): - PA node (pa_v1): routes to domain experts, holds user context - ExpertNode base: stateless executor with plan+execute two-LLM-call pattern - ErasExpertNode: eras2_production DB specialist with DESCRIBE-first discipline - Schema caching: DESCRIBE results reused across queries within session - Progress streaming: PA streams thinking message, expert streams per-tool progress - PARouting type for structured routing decisions UI Controls Split: - Separate thinker_controls from machine controls (current_controls is now a property) - Machine buttons persist across Thinker responses - Machine state parser handles both dict and list formats from Director - Normalized button format with go/payload field mapping WebSocket Architecture: - /ws/test: dedicated debug socket for test runner progress - /ws/trace: dedicated debug socket for HUD/frame trace events - /ws (chat): cleaned up, only deltas/controls/done/cleared - WS survives graph switch (re-attaches to new runtime) - Pipeline result reset on clear Test Infrastructure: - Live test streaming: on_result callback fires per check during execution - Frontend polling fallback (500ms) for proxy-buffered WS - frame_trace-first trace assertion (fixes stale perceived event bug) - action_match supports "or" patterns and multi-pattern matching - Trace window increased to 40 events - Graph-agnostic assertions (has X or Y) Test Suites: - smoketest.md: 12 steps covering all categories (~2min) - fast.md: 10 quick checks (~1min) - fast_v4.md: 10 v4-eras specific checks - expert_eras.md: eras domain tests (routing, DB, schema, errors) - expert_progress.md: progress streaming tests Other: - Shared db.py extracted from thinker_v2 (reused by experts) - InputNode prompt: few-shot examples, history as context summary - Director prompt: full tool signatures for add_state/reset_machine/destroy_machine - nginx no-cache headers for static files during development - Cache-busted static file references Scores: v3 smoketest 39/40, v4-eras fast 28/28, expert_eras 23/23 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
53 lines
1.6 KiB
Python
53 lines
1.6 KiB
Python
"""Node modules — versioned nodes + shared (unversioned) nodes."""
|
|
|
|
# Shared nodes (pure code, no LLM, no versioning)
|
|
from .sensor import SensorNode
|
|
from .ui import UINode
|
|
|
|
# Versioned nodes — v1 (current)
|
|
from .input_v1 import InputNode as InputNodeV1
|
|
from .thinker_v1 import ThinkerNode as ThinkerNodeV1
|
|
from .output_v1 import OutputNode as OutputNodeV1
|
|
from .memorizer_v1 import MemorizerNode as MemorizerNodeV1
|
|
from .director_v1 import DirectorNode as DirectorNodeV1
|
|
|
|
# Versioned nodes — v2
|
|
from .director_v2 import DirectorV2Node
|
|
from .thinker_v2 import ThinkerV2Node
|
|
from .interpreter_v1 import InterpreterNode
|
|
|
|
# v4 — PA + Expert nodes
|
|
from .pa_v1 import PANode
|
|
from .eras_expert import ErasExpertNode
|
|
|
|
# Default aliases (used by runtime.py until engine.py takes over)
|
|
InputNode = InputNodeV1
|
|
ThinkerNode = ThinkerNodeV1
|
|
OutputNode = OutputNodeV1
|
|
MemorizerNode = MemorizerNodeV1
|
|
DirectorNode = DirectorNodeV1
|
|
|
|
# Registry — engine.py uses this to look up node classes by name
|
|
NODE_REGISTRY = {
|
|
"sensor": SensorNode,
|
|
"ui": UINode,
|
|
"input_v1": InputNodeV1,
|
|
"thinker_v1": ThinkerNodeV1,
|
|
"output_v1": OutputNodeV1,
|
|
"memorizer_v1": MemorizerNodeV1,
|
|
"director_v1": DirectorNodeV1,
|
|
"director_v2": DirectorV2Node,
|
|
"thinker_v2": ThinkerV2Node,
|
|
"interpreter_v1": InterpreterNode,
|
|
"pa_v1": PANode,
|
|
"eras_expert": ErasExpertNode,
|
|
}
|
|
|
|
__all__ = [
|
|
"SensorNode", "UINode",
|
|
"InputNodeV1", "ThinkerNodeV1", "OutputNodeV1", "MemorizerNodeV1", "DirectorNodeV1",
|
|
"DirectorV2Node", "ThinkerV2Node", "InterpreterNode",
|
|
"InputNode", "ThinkerNode", "OutputNode", "MemorizerNode", "DirectorNode",
|
|
"NODE_REGISTRY",
|
|
]
|