Everything you need to run your first agent team.
A graph is a team of agents. Each node is an agent with a role (supervisor, worker, router, reviewer), a model, a system prompt, and a tool set. Edges decide who runs next: explicit edges fire on conditions, auto edges let the model pick the next specialist by name, and consensus edges fan out to several agents at once and join on an aggregator.
A run executes the graph hop by hop — one BullMQ job per hop. Chat turns and runs started from the canvas are live: each hop re-resolves against the graph as it is right then, so a drag changes the next hop of the run you are watching. Saving that route is a separate choice; until you do, later runs are unaffected. pinned mode, the default for schedules and webhooks, snapshots the graph at launch so that run is reproducible.
Any node can carry an approval gate: the run parks at /approvals with the pending payload visible, and continues only when a human approves. Use it before anything irreversible — publishing, sending, paying.
allowedTools keep the model inside exactly the tools you grant. Credentials come from /settings, never from node config.SPAWN runtime-defined specialists that fan out and rejoin.ux_probe renders a site in a real browser (light, dark, reduced motion, phone width) and returns accessibility and layout findings as text, one line per problem. The agent names a site the operator configured, never a URL, and the probe shows up in the run like any other step.Cron schedules and webhook triggers live on the graph. Schedules auto-disable after repeated no-entry skips instead of silently burning budget; webhooks get a per-trigger token URL for external systems to fire.
Everything the app does goes through the same REST API you can call directly. Create a personal API key at Settings → API keys — it's shown once at creation, then only its hash is stored. Send it as the X-Api-Key header; a key authenticates as you, so it can do exactly what your account can — a member's key keeps that member's access.
POST /runs with { graphId, input }; poll GET /runs/:id for status and output. API-launched runs start pinned, so they snapshot the graph like a scheduled firing.POST /mcp/serve/:slug then speaks MCP JSON-RPC: tools/call launches a pinned run. Opt the slug into public access to serve unauthenticated callers.