Project JSON Schema =================== The project file represents the canvas state and is stored as JSON named ``_prj.json``. Top-level object ---------------- :: { "id": "string", // filename stem (no suffix) "name": "string?", // optional display name "version": 1, // schema version (number) "nodes": [ Node, ... ], "edges": [ Edge, ... ], "meta": { ... }? // optional free-form metadata } Node ---- :: { "id": "string", // unique within project "guid": "string", // references a palette/object definition "name": "string?", // optional display name "x": 100, // canvas center position X "y": 100, // canvas center position Y "connectors": [ // optional explicit connectors { "id": "string", "kind": "source"|"sink", "name": "string" }, ... ] } Edge ---- :: { "id": "string", // unique within project "from": { "nodeId": "string", "connectorId": "string" }, // must be a source connector "to": { "nodeId": "string", "connectorId": "string" } // must be a sink connector } Validation ---------- Server-side validation is implemented in ``lib/graph.ts`` and applied on load/save: - Required fields, types and array shapes are checked - Duplicate ``node.id`` and ``edge.id`` are rejected - Connectors must exist and have the correct ``kind`` for each edge endpoint - ``version`` is a number (currently ``1``) Responses on invalid payloads return HTTP 422 with a body like: :: { "error": "invalid project", "details": ["...specific messages..."] } Examples -------- A minimal valid project: :: { "id": "example", "version": 1, "nodes": [], "edges": [] }