The Visual Canvas
The workflow editor is a drag-and-drop canvas built with SvelteKit, Svelte 5 runes, and SvelteFlow (XYFlow). It's a direct visual editor for the underlying DSL — every action on the canvas maps to a change in the workflow's JSON definition, and vice versa (paste/import a DSL and the canvas renders it).
Node types on the canvas
- TriggerNode — the workflow's single entry point (webhook, schedule, manual, event poller, LiveKit). Rendered distinctly at the top/left of the graph.
- WorkflowNode — a regular step (HTTP, LLM, Transform, Connector, etc.). Shows a Lucide icon badge per node type, a colored border by category, a target handle on the left, and a source handle on the right for chaining (
depends_on). - ToolNode — represents a tool attached to an Agent node (e.g. a connector action, web search, code tool). Rendered with a dashed border and a "→ to agent" arrow, with a single source handle connecting up to the agent.
- Agent nodes have an extra bottom handle (yellow square) specifically for tool connections, separate from the main step-to-step flow handles.
Connecting steps
Dragging an edge from one node's source handle to another's target handle adds that step's ID to the target's depends_on. Steps with no shared dependency chain run in parallel automatically when the workflow executes.
Conditional branches
Connecting an edge from a Condition or Switch node's branch-specific output (e.g. the "true" output) to a downstream node sets that node's branch_deps — the downstream step only runs if the upstream condition took that branch. The canvas visually distinguishes branch edges (e.g. labeled "true"/"false") from plain dependency edges.
Deleting edges
Edges are deleted via useSvelteFlow().deleteElements() directly in FloatingEdge.svelte — clicking the delete control on a hovered edge removes just that dependency without affecting the rest of the graph.
Node configuration panel
Selecting a node opens the NodeConfigPanel, a form generated from that node type's schema:
- Text/number/boolean fields map directly to
configkeys. - Fields that accept expressions (
{{...}}) get VarAutocomplete — typing{{suggestssteps.*,trigger.*,vars.*,secret.*, andinput.*paths based on the actual upstream steps connected to this node, so you don't have to remember step IDs or output shapes. - Credential fields (API keys, OAuth connections) show a picker backed by
/api/v1/secretsand/api/v1/oauth/connections— see Secrets & Credentials. - For
agentnodes,builtin_toolsand the connectortoolslist use multi-select toggle UIs rather than raw JSON editing.
Node palette
The left-side palette groups available node types by category (mirroring the Node Reference categories) plus a separate Agent Tools palette for everything that can be attached to an agent node as a ToolNode (built-in tools, connector actions, custom HTTP tools).
Design conventions
- No emoji — every node type, trigger type, and tool uses a Lucide icon for a consistent, professional look.
- Color-coding by category (AI nodes, data nodes, communication nodes, etc.) makes large workflows scannable at a glance.
Saving, versions, import/export
- Save writes the current canvas state back to the workflow's
dslfield, creating a new version. - Export downloads the DSL as
.goagents.json; Import creates a new workflow from one. - The AI Workflow Generator can populate the canvas directly from a natural-language prompt — see AI Workflow Generator.