Skip to content

Node catalog

Every workflow primitive is a typed node. Schema for each type is self-documenting via the executor's Descriptor() — the canvas inspector, MCP workflow_node_types, and these docs all read the same source.

When a new node type lands in internal/agents/workflow/nodes/, add a page under docs/workflow/nodes/ mirroring the schema + output map from the descriptor. The workflow-node-module skill is the authoring guide for the executor side.

Index

Logic & routing

TypeWhat it does
classifyLLM picks one of output_cases for free-text input. Verdict drives outgoing edges by case:.
branchSingle Go-template expression → verdict. Routes to the edge whose case: matches.
switchMulti-rule list. First rule whose when is true wins.
transformPure data shaping — gotemplate / jsonpath / jq. No I/O.
endExplicit terminator with a final result expression.

Execution

TypeWhat it does
agentSpawn an agent turn through the existing pool. Templated prompt, optional skills + tools whitelist.
session_initFirst-turn context injection for agent nodes — mirrors the channel session-context pattern.
shellRun a local command. Captures stdout / stderr / exit_code. Same gate policy as agents.
go_scriptRun a Go program under the yaegi interpreter. Stdin = run context JSON, stdout = result JSON.

Integrations

TypeWhat it does
connectorCall one operation on a registered connector row. Same code path as MCP wick_execute.
channelCall a channel action (Slack send_message, open_modal, add_reaction, …) without going through an agent.
httpOutbound HTTP call. Templated URL / headers / query / body. Retry + parse_response: raw|json|bytes.
db_queryParameterized SQL against a configured DSN. Returns rows + row_count + columns.

State

TypeWhat it does
datatable_getLoad one row by primary key. Branches on found/not_found.
datatable_existsCheck whether any row matches. Branches on true/false.
datatable_queryMulti-row search with where / order_by / limit.
datatable_countCount without loading.
datatable_insertInsert; fail on PK conflict.
datatable_upsertInsert or update; returns `action: insert
datatable_deleteDelete rows matching where.

Render context

Every node's templated fields render against the run's render context. Top-level keys:

KeyWhat
.EventTrigger payload — .Event.Payload, .Event.User, .Event.Channel, etc. Per-trigger shape; see Triggers.
.Node.<id>Output of an upstream node. Object keys are merged so .Node.classify.verdict, .Node.classify.confidence work directly.
.EnvPer-workflow env variables (including secrets). Set via ⋮ → Settings in the canvas editor. Secrets are stored encrypted and decrypted at run time — use {{.Env.KEY}} for both plain and secret vars. Secret values are masked in output and stored run state. See Canvas editor ▶ Workflow settings.
.RunRun-scoped metadata: .Run.id, .Run.workflow_id, .Run.started_at, .Run.final_result.
.WorkflowWorkflow metadata: .Workflow.id, .Workflow.name, .Workflow.version.

Template engine = Go's text/template with wick-specific helpers (jsonEscape, upper, lower, default, …). Test a template against a synthetic context with workflow_template_test — on missing-key errors it lists available keys at the offending path plus a did-you-mean hint.

Output shape convention

Every node sets at minimum result (string for routing) and may add typed fields. When result is an object the fields are merged into .Node.<id>.* for direct template access. Branching nodes (classify, branch, switch) emit verdict — the engine filters outgoing edges by edge.case == verdict.

See also

  • Triggers — what populates .Event.
  • MCP authoringworkflow_node_types + workflow_node_detail ops the LLM uses to discover this same catalog.
  • Canvas editor — visual palette of these types.
Built with ❤️ by a developer, for developers.