- POST /api/fabric/create-target: add_writer to target node, poll for target_info
- POST /api/fabric/connect: get target_info from target, configure initiator node
- node_runner: track all readers/writers in flow_resources vector,
release them via mxlReleaseFlowWriter/mxlReleaseFlowReader before
destroying the MXL instance (fixes 'leaked flow writer' warning)
- node_runner: remove_writer/remove_reader commands now also release
the MXL flow resources, not just reset the node's optional<>
- engine: call process_manager.stop_all(graph) on shutdown to kill
child node processes (prevents orphaned passthrough processes)
- graph: add get_node_mut() for process_manager to update node state
- process_manager: implement stop_all(Graph&) that SIGTERMs all
running node processes
- passthrough: reduce logging to first-grain and realign-once only
- tests: update flow format assertion to match NMOS
(urn:x-nmos:format:video instead of video/v210)
- Node control server now accepts HTTP POST /cmd for command dispatch
(in addition to existing WebSocket control)
- Added NodeControlClient: engine sends commands to nodes via HTTP POST
- New REST endpoints:
POST /api/graph/nodes/:id/connect-input - connect node input to MXL flow
POST /api/graph/nodes/:id/connect-output - create new MXL flow + connect output
POST /api/graph/nodes/:id/disconnect-port - remove reader/writer
POST /api/graph/nodes/:id/command - send raw command to node
- Flow IDs now use proper UUID v4 format (MXL requires standard UUIDs)
- Flow definitions use NMOS format (urn:x-nmos:format:video)
- Engine passes --mxl-domain to node processes
- User-provided node IDs (via 'id' field in POST body)
- End-to-end verified: testsrc → passthrough → new MXL output flow
- Use lws_http_get_uri_and_method() for proper HTTP method detection
(GET, POST, PUT, DELETE all supported)
- Handle GET/DELETE in LWS_CALLBACK_HTTP without waiting for body
- Support user-provided node IDs via config.id field
- Fixes all REST API endpoints hanging on GET requests