Makes the flow engine reachable from the API, which is what M3 needs before
any of it can reach the browser.
- app/flow is a package now; the prototype's watch-dir scripts and the
matplotlib/networkx visualiser are gone with their dependencies.
- Messages carry a serializable dtype instead of a live Python type, and a
port name, so the graph can speak qualified names while node functions keep
local arguments. Redis state is JSON, not pickle.
- Message names are namespaced per flow ("heating.temp"); a bare name resolves
to its own flow, a dotted one crosses flows.
- Several nodes may provide the same message: producers are a list, so fan-in
is a real edge instead of a silently dropped one.
- Flows are stored as flow.json plus node sources in a git repository, one
commit per save, with identical saves skipped so autosave stays quiet.
- Node failures are isolated and reported per node; validate() returns cycles
and unconnected inputs instead of raising deep in a run.
- Credentials live in an encrypted store and are referenced as {"$secret": …}.
- Engine events reach websocket clients through a bus, so values, node status
and execution show up live.
27 lines
694 B
Python
27 lines
694 B
Python
"""The flow engine: nodes, the pipeline that runs them, and their storage."""
|
|
|
|
from app.flow.controller import FlowController, NodeStatus
|
|
from app.flow.events import EventBus, event_bus
|
|
from app.flow.messages import DType, MessageSpec, qualify
|
|
from app.flow.nodes import Node
|
|
from app.flow.pipeline import Pipeline, ValidationIssue
|
|
from app.flow.state import MemoryState, RedisState, StateBackend
|
|
from app.flow.store import FlowStore
|
|
|
|
__all__ = [
|
|
"DType",
|
|
"EventBus",
|
|
"FlowController",
|
|
"FlowStore",
|
|
"MemoryState",
|
|
"MessageSpec",
|
|
"Node",
|
|
"NodeStatus",
|
|
"Pipeline",
|
|
"RedisState",
|
|
"StateBackend",
|
|
"ValidationIssue",
|
|
"event_bus",
|
|
"qualify",
|
|
]
|