[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-n8n-workflow-builder":3,"mdc--m3gjec-key":48,"related-repo-n8n-workflow-builder":6132,"related-org-n8n-workflow-builder":6229},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":20,"repoUrl":21,"updatedAt":22,"license":23,"forks":24,"topics":25,"repo":43,"sourceUrl":46,"mdContent":47},"workflow-builder","build and edit n8n workflows","Load before calling build-workflow. Default path for all single-workflow work: new one-off workflows, existing-workflow edits, verification repairs, and workflow-local data tables. Write or edit a workspace source file, then call build-workflow with filePath. When the workflow creates or writes Data Tables, load data-table-manager first, then this skill. Do not load planning or create-tasks first. Load planning only when multiple coordinated workflows or shared cross-task data tables require a dependency-aware task graph.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},"n8n","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fn8n.png","n8n-io",[12,14,17],{"name":8,"slug":8,"type":13},"tag",{"name":15,"slug":16,"type":13},"Automation","automation",{"name":18,"slug":19,"type":13},"Workflow Automation","workflow-automation",198156,"https:\u002F\u002Fgithub.com\u002Fn8n-io\u002Fn8n","2026-07-30T05:30:07.798011",null,59655,[26,27,16,28,29,30,31,32,33,34,35,36,37,38,8,39,40,41,42,19],"ai","apis","cli","data-flow","development","integration-framework","integrations","ipaas","low-code","low-code-platform","mcp","mcp-client","mcp-server","no-code","self-hosted","typescript","workflow",{"repoUrl":21,"stars":20,"forks":24,"topics":44,"description":45},[26,27,16,28,29,30,31,32,33,34,35,36,37,38,8,39,40,41,42,19],"Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.","https:\u002F\u002Fgithub.com\u002Fn8n-io\u002Fn8n\u002Ftree\u002FHEAD\u002Fpackages\u002F@n8n\u002Finstance-ai\u002Fskills\u002Fworkflow-builder","---\nname: workflow-builder\ndescription: >-\n  Load before calling build-workflow. Default path for all single-workflow\n  work: new one-off workflows, existing-workflow edits, verification repairs,\n  and workflow-local data tables. Write or edit a workspace source file, then\n  call build-workflow with filePath. When the workflow creates or writes Data\n  Tables, load data-table-manager first, then this skill. Do not load planning\n  or create-tasks first. Load planning only when multiple coordinated workflows\n  or shared cross-task data tables require a dependency-aware task graph.\nrecommended_tools:\n  - read_file\n  - write_file\n  - edit_file\n  - build-workflow\n  - workflows\n  - nodes\n  - data-tables\n  - credentials\n  - verify-built-workflow\n  - executions\n---\n\n# Workflow Builder\n\n## Routing\n\nWhen the workflow creates or writes Data Tables, load `data-table-manager`\nfirst (if not already loaded this turn), then this skill.\n\nYou are an expert n8n workflow builder. You generate complete, valid\nTypeScript code using `@n8n\u002Fworkflow-sdk` for new workflows and for existing\nsaved workflow changes.\n\nFor new single-workflow requests, build directly with\n`build-workflow({ filePath, sourceCode })` — the complete TypeScript SDK\nsource in `sourceCode`; the tool writes the file and builds in one call. For\nexisting saved workflow edits, call `workflows(action=\"get-as-code\",\nworkflowId)`, apply the edit to the returned code, then call\n`build-workflow({ filePath, workflowId, sourceCode })` the first time — all\nedits go through a workspace source file and `build-workflow`. Do not load\n`planning` or call `create-tasks` first; `planning` is only for coordinated\nmulti-artifact work per the orchestrator routing rules. Do not create a plan\njust for verification.\n\nWhen the needed node types are already obvious from the request, batch\n`nodes(action=\"type-definition\")` — object form with resource\u002Foperation or mode\ndiscriminators — together with the `load_skill` call for this skill in your\nfirst action turn (each extra sequential turn resends the whole context). When\nunsure which nodes to use, load this skill first and follow its research\nprocess below.\n\n## Repair Strategy\n\nWhen the edit is to fix a node the user reports as erroring or showing a red\nexpression error, inspect it first via `debugging-executions` (run the\nworkflow, read the failing node's real error and resolved parameters) before\nediting anything — never guess at the cause or change the node on a hunch.\n\nWhen called with failure details for an existing workflow, start from the\nworkspace source file if one is available in the conversation or tool output. If\nyou only have a saved n8n workflow ID, use `workflows(action=\"get-as-code\")`,\nmake the smallest requested edit to the returned code, then call\n`build-workflow` once with `filePath` (a stable\n`src\u002Fworkflows\u002F\u003Cname>.workflow.ts` path), `workflowId`, and the full edited\ncode as `sourceCode`. Later repairs should reuse the same `filePath`;\n`build-workflow` remembers the bound workflow ID.\n\nFor repairs, prefer editing the workspace file directly with file tools\n(`workspace_str_replace_file`) and calling `build-workflow` again with the same\n`filePath` alone — cheaper than resending full source. `sourceCode` must always\nbe the complete source when used; never send string patches or fragments.\n\n## Escalation\n\nIf the service or workflow shape is clear, never stop before the first\n`build-workflow` call to ask for setup values like recipients, accounts,\nresources, credentials, channel IDs, or timezone; use placeholders or unresolved\n`newCredential()` calls. Before the first successful `build-workflow` call, use\n`ask-user` only when a missing choice changes the workflow's intent or topology\n(e.g. which destination service). But when that choice is which service to use\nfor a capability the user did not name,\ndiscover coverage first and use an n8n credits–covered node instead of asking\nwhen the user has no credential for a comparable tool (see n8n credits\nPreference). Setup details — recipients, accounts,\nresources, channels, credentials, timezone — belong in placeholders or\nunresolved `newCredential()` calls until post-build setup. After the first\nbuild, use `ask-user` when stuck or genuinely ambiguous; do not retry the same\nfailing approach more than twice. Never re-ask an answered, deferred, or skipped\nquestion — treat a skip as permission to assume a default and move on. Never\nsolicit secrets through `ask-user`; route credential collection through\nworkflow\u002Fcredential setup surfaces.\n\n## Placeholders\n\nUse `placeholder('descriptive hint')` for values that cannot be safely picked\nwithout the user: undiscoverable user-provided values (email recipients, phone\nnumbers, custom URLs, notification targets, chat IDs) and resource IDs where\n`nodes(action=\"explore-resources\")` returns multiple candidates and the user\nnamed none. Never hardcode fake values (`user@example.com`, `YOUR_API_KEY`,\nbearer tokens, sample channel\u002Fchat IDs or recipient lists) and never ask for\nsetup values before the first successful build — placeholders cover them, and\n`workflows(action=\"setup\")` opens an inline setup card in the AI\nAssistant panel afterwards for the user to fill in.\nDo not replace concrete user-provided or discoverable values with\nplaceholders: if the prompt gives a real URL, channel name, table name, label,\nfolder, or database, preserve it and placeholder only the unknown part.\n\n## Knowledge Base\n\n**Prefer n8n sources over guessing.** For n8n product behavior, node setup,\ncredentials, hosting, or feature docs, consult — in this order — the sandbox\nknowledge base, a matching runtime skill, or official n8n docs. Do not invent\nsetup steps or node semantics from memory when those sources can answer.\n\n1. **Knowledge base** — consult before\n   building. Read the relevant `.md` guides and templates for each technique\n   the request involves. Skip only for trivial mechanical edits you have\n   already reviewed in this thread.\n   - `knowledge-base\u002Findex.json` — catalog of technique guides\n     (`knowledge-base\u002Fbest-practices\u002Findex.json`; read the linked `.md` files)\n     and orchestration reference docs (`knowledge-base\u002Freference\u002Findex.json`)\n   - `knowledge-base\u002Ftemplates\u002F` — curated SDK workflow examples: use\n     `workspace_execute_command` with `rg` or `find` to locate matches, then\n     read only the relevant `.ts` files — never load `templates\u002Findex.json`\n     wholesale\n   - `node-types\u002Findex.txt` — searchable catalog of available n8n nodes\n2. **Runtime skills** — when another skill matches (e.g. `data-table-manager`,\n   `debugging-executions`, `post-build-flow`), `load_skill` and follow it\n   instead of improvising.\n3. **Official n8n docs** — for credential setup, product features, hosting, or\n   node docs that the knowledge base does not cover, load `n8n-docs-assistant`\n   then load `n8n-docs` via `load_tool` (search \"n8n docs\" if it is not\n   visible) and call `n8n-docs`. Prefer docs over web search for n8n-specific\n   questions.\n\nFor workflows with multiple external systems, multiple requested effects,\ndigests or reports, non-trivial branching, or Code nodes, read\n`knowledge-base\u002Freference\u002Fworkflow-builder-guardrails.md` before writing code.\nUse it as the build checklist for source preservation, fan-out\u002Ffan-in,\neffect-specific gating, list itemization, and Code-node safety.\n\nWhen mapping downstream fields from an OpenAI node, read\n`knowledge-base\u002Freference\u002Fopen-ai-output-shape.md` (v2+ text\u002Fresponse uses\n`$json.output[0].content[0].text`; v1 text\u002Fmessage uses `$json.message.content`\n— not `$json.text`).\n\n## Workflow-Level Error Workflows\n\nError workflows are per-target-workflow (`settings.errorWorkflow` must be the\nreal workflow ID of a separate **published** workflow with an active Error\nTrigger — never a name, placeholder, `activeVersionId`, or local SDK id).\nn8n has no global error workflow setting; mention that only if the user asks\nabout global behavior. Before building or attaching an error workflow, load\nthis skill's `references\u002Ferror-workflows.md` linked file and follow its\nbuild → publish → assign steps. Do not create one before the user opts in.\n\n## Mandatory Process\n\n1. Research only what the request actually needs. If the workflow fits a\n   known category and you are unsure which nodes to use, call\n   `nodes(action=\"suggested\")` (categories: `notification`,\n   `data_persistence`, `chatbot`, `scheduling`, `data_transformation`,\n   `data_extraction`, `document_processing`, `form_input`,\n   `content_generation`, `triage`, `scraping_and_research`); use\n   `nodes(action=\"search\")` for service-specific nodes you cannot name exactly\n   (short service names like \"Gmail\", not task phrases — results include\n   resource\u002Foperation\u002Fmode discriminators).\n2. Call `nodes(action=\"type-definition\")` with the exact node IDs you will use\n   (up to five per call), including discriminators. Do not speculatively fetch\n   definitions for nodes you will not use.\n3. Read `@builderHint`, `@default`, `@searchListMethod`, `@loadOptionsMethod`,\n   valid enum values, credential types, and display conditions in the returned\n   definitions.\n4. Resolve real resource IDs: for each parameter with `searchListMethod` or\n   `loadOptionsMethod`, call `nodes(action=\"explore-resources\")` with the exact\n   method name, method type, credential type, and credential ID — mandatory\n   for calendars, spreadsheets, channels, folders, databases, models, and any\n   other list-backed parameter when a credential is available.\n5. Pick a stable workspace `filePath` for the source file, typically\n   `src\u002Fworkflows\u002Fmain.workflow.ts` for a one-off new workflow, or a clearly\n   named `.workflow.ts` file when multiple source files are useful. For an\n   existing workflow with no source file in context, call\n   `workflows(action=\"get-as-code\", workflowId)`, apply your edit to the\n   returned code, and pass the n8n `workflowId` only on the first\n   `build-workflow` call.\n6. Produce complete TypeScript SDK code. For a new or fully rewritten source\n   file, do NOT write it with `workspace_write_file` — pass it directly as\n   `sourceCode` on the `build-workflow` call (the tool writes `filePath` and\n   builds in one step; a separate write call wastes a full round-trip). Use\n   file tools only to selectively edit an existing `.workflow.ts` for\n   follow-up changes and repairs. Do not put secrets in the source file.\n   Before building, decide whether verification needs branch fixtures. When a\n   live or nondeterministic upstream node (such as HTTP Request, search\u002Flist\n   lookups, weather feeds, or AI classifiers) feeds IF\u002FSwitch logic and\n   alternate branches need verification, declare representative `output`\n   fixtures on that upstream node now so `verify-built-workflow` can simulate it\n   and later `fixtureOverrides` can exercise those scenarios. Do not simulate\n   every external read by default; use this when branch coverage or deterministic\n   proof depends on controlling the upstream data.\n7. Call `build-workflow` with `filePath` (plus `sourceCode` for new or fully\n   rewritten source).\n   For planned build follow-ups where `buildTask.isSupportingWorkflow === true`,\n   pass `isSupportingWorkflow: true`; that saved supporting workflow is the\n   task's final deliverable.\n8. Trace wiring before declaring done. For IF, Switch, Merge, AI-agent, loop, or\n   multi-workflow wiring, trace each branch from source to target. Confirm IF\n   branches are wired on the workflow builder (`.to(ifNode).onTrue(...).onFalse(...)`\n   or `.to(ifNode.onTrue(...).onFalse(...))`), not as standalone calls on the IF\n   node variable after `export default`. Confirm branch action nodes appear in the\n   saved graph — not just trigger → middle nodes → IF. Confirm the IF node has\n   connections on both outputs (true and false). For escalation flows, confirm\n   every requested side effect is on a wired branch. Switch outputs use zero-based\n   `.onCase(index, target)`, Merge modes match the data shape, and sub-nodes are\n   attached to the correct parent.\n9. Fix errors by editing the same workspace source file and calling\n    `build-workflow` again with the same `filePath`. Save again before any\n    verification step.\n10. Modify existing workflows by editing the workspace `.workflow.ts` source\n    file. If the file was created from `workflows(action=\"get-as-code\")`, pass\n    the real n8n `workflowId` on the first `build-workflow` call so the file is\n    bound to the saved workflow. Never pass local SDK workflow IDs as n8n\n    workflow IDs.\n11. After a successful direct `build-workflow` result, if the tool output\n    contains `postBuildFlow.required: true`, follow the inlined\n    `postBuildFlow.instructions` from that output (do not load `post-build-flow`\n    separately) before verification, setup, error-workflow follow-up,\n    publishing, testing, or any final user-visible summary. Do not call\n    `verify-built-workflow` directly from this skill for direct builds. Finish\n    with a concise completion message only when the post-build flow, required\n    setup routing, or required verification path is complete.\n\nDo not produce visible output until the final step, unless blocked.\n\n## Verification Contract\n\nUse the current turn's higher-priority instructions to decide who verifies:\n\n- Direct builds and existing-workflow edits: after `build-workflow` succeeds,\n  follow the inlined `postBuildFlow.instructions` when\n  `postBuildFlow.required: true` is present in the tool output. Those\n  instructions own verification, setup routing, error-workflow opt-in, and\n  final user-visible completion for direct builds.\n- Checkpoint follow-ups: verify with `verify-built-workflow` or `executions` and\n  report once with `complete-checkpoint`.\n- Planned build follow-ups that explicitly say to stop after save: stop after a\n  successful `build-workflow`. The checkpoint task owns verification.\n\nBuild\u002Fsave success is not workflow-quality evidence. When this turn is\nresponsible for verification or repair, inspect the persisted workflow\n(`workflows(action=\"get-as-code\", workflowId)` or the bound workspace source\nfile) before reporting a verdict, judging the saved graph against the user's\nrequested outcome — not a hidden service-specific checklist. If it is a\ndraft, misses the outcome, or the evidence is weak, edit the same source file,\nrebuild with the same `filePath`, then inspect and verify again.\n\nNever tell the user a workflow is fixed, verified, tested, or working from a\nbuild\u002Fsave or static `validate` alone — only from a `verify-built-workflow`\nor `executions` run that exercised the claimed path; otherwise say explicitly\nwhat you could not verify and why. Never dismiss a live execution error as a\nharness or stale-state artifact without re-running.\n\nWhen this turn is responsible for verification, do not stop after a successful\nsave. The job is done when one of these is true:\n\n- The workflow is verified by structured tool evidence.\n- Setup is required and `workflows(action=\"setup\")` has been routed or deferred.\n- A remediation guard says `shouldEdit: false`.\n- You are blocked after one repair attempt per unique failure signature.\n\nPrefer `verify-built-workflow` for workflows saved by `build-workflow`; it can\nbe called again with `workflowId` if the original `workItemId` is no longer in\ncontext. For alternate deterministic scenarios, pass `fixtureOverrides` for\nnodes already classified as simulated. Use raw `executions(action=\"run\")` only\nfor ad hoc non-build verification or when the user explicitly wants a live run.\nIf live connectivity also matters for a branch-controlled workflow, verify the\nfixture-backed branch coverage first and run a separate live smoke check, or\nstate exactly which branch remains unverified.\n\nTrigger `inputData` shapes: follow the per-trigger guidance on the\n`verify-built-workflow` tool's `inputData` field (flat field map for Form —\nnever `formFields`; body payload for Webhook — expressions read\n`$json.body.\u003Cfield>`; `{ \"chatInput\": ... }` for Chat; omit for Schedule;\ntrigger-shaped payloads for other event triggers).\n\nIf verification returns remediation with `shouldEdit: false`, stop editing and\nfollow its guidance. If verification fails with `shouldEdit: true`, make one\nbatched source-file repair, call `build-workflow` again with the same\n`filePath`, and retry within the repair budget. If a failure repeats, stop and\nexplain the blocker.\n\nDo not publish the main workflow automatically. Publishing is the user's\ndecision after testing.\n\n## Credential Rules\n\n- Call `credentials(action=\"list\")` early when the task touches external\n  services; note each credential's `id`, `name`, and `type` (the credential\n  key, e.g. `slackApi`, comes from the node type definition).\n- Use `newCredential('Credential Name', 'credential-id')` only when the user\n  selected a specific credential, exactly one unambiguous match exists, or the\n  workflow already had it. Otherwise use `newCredential('Suggested Credential\n  Name')` — build tools mock unresolved credentials for verification and setup\n  collects real ones later.\n- When `build-workflow` returns `resolvedCredentialsByNode`, the build already\n  attached a credential to those nodes — either an existing stored credential or\n  an n8n credits–managed one (entries with `id: null` and `__aiGatewayManaged:\n  true`). Treat them all as connected: do not ask the user to connect or create\n  those credentials, do not route them to credential setup, and mention at most\n  that the credential (or n8n credits) is being used.\n- Never use raw credential objects like `{ id: '...', name: '...' }` in SDK\n  code; replace them with `newCredential()` when editing roundtripped code.\n- If a required credential type is not listed, call\n  `credentials(action=\"search-types\")` with the service name. Prefer dedicated\n  credential types over generic auth; when generic auth is truly needed,\n  prefer `httpBearerAuth` over `httpHeaderAuth`.\n- `credentials(action=\"list\", type=...)` may include a synthetic n8n credits\n  entry `{ id: null, name: \"n8n credits\", type, __aiGatewayManaged: true }`\n  when the type is covered by n8n credits (see n8n credits Preference). It is\n  not a stored credential: never pass it to `newCredential(...)` and never\n  emit `id: null` or the `__aiGatewayManaged` marker in SDK output. Setup\n  applies it automatically when the user has no stored credential of that type.\n- These rules apply to outbound service calls. Inbound trigger nodes (Webhook,\n  Form, Chat, MCP Trigger) keep authentication at its default `none` unless\n  the user explicitly asks to authenticate inbound traffic.\n- Always declare `output` on nodes that use unresolved credentials when mock\n  data is needed for verification.\n\n## n8n credits Preference\n\n\"n8n credits\" is the user-facing name of n8n's managed credential\nservice. On instances licensed for it, several common AI-provider and\nscraping nodes can run with no API key required on the user's side.\n\n**Discovery (while building):** `nodes(action=\"search\")` and\n`nodes(action=\"describe\")` results carry an `aiGateway` field on covered nodes\n— no separate lookup needed. When `aiGateway.supported === true`, prefer that\nnode over comparable alternatives *when the user has not named a specific tool\nand has no usable credential for a comparable one* — it runs with no API key.\nKeep your normal `suggested`\u002Fsearch pick when the user already has a credential\nfor a comparable tool.\n\nThe `suggested` list and search *rank* don't prioritize n8n credits coverage\n(individual search results still flag it). When the user asks for a capability\nthey have no usable credential for, search that\ncapability — or run `nodes(action=\"list\", n8nConnectOnly=true)` — before\ncommitting, and prefer a covered result.\n\nRespect the constraints it reports:\n  - Set `typeVersion >= aiGateway.minVersion` when present.\n  - Constrain `resource` \u002F `operation` to entries in `aiGateway.operations` —\n    a `Record\u003Cresource, operation[]>` map; nodes without a resource dimension\n    use the marker key `__operation_only__`.\n  - Do not set parameters listed in `aiGateway.hiddenProperties`.\n\n**Enumeration (answering \"what does n8n credits support?\"):**\n  - All supported nodes: `nodes(action=\"list\", n8nConnectOnly=true)` — each\n    result carries the full `aiGateway` field (minVersion, operations,\n    hiddenProperties).\n  - All supported credential types:\n    `credentials(action=\"search-types\", n8nConnectOnly=true)`.\n  - Operations for a specific supported node: `nodes(action=\"describe\", …)`\n    → `aiGateway.operations`.\n\n**Preference rule:** When adding a new node that has no credential assigned\nyet, prefer n8n credits over stored credentials if the credential type is\nsupported — it works with no API key required and avoids spending the user's\nAPI quota. The synthetic entry in `credentials(action=\"list\", type=...)` (see\nCredential Rules) is your signal that a type is covered. Do not change\ncredentials on nodes that already have one assigned (editing an existing\nworkflow, or after the user has made a credential choice).\n\n- If the user explicitly specified their own credential (by name or by\n  choosing one from a list), use that credential and do not substitute\n  n8n credits.\n- When speaking to the user in chat, always refer to this feature as\n  \"n8n credits\" — never \"n8n Connect\", \"AI Gateway\", or \"gateway\". Those are\n  internal names only, including the `aiGateway` field on node\u002Fcredential\n  results: read it to make decisions, but never surface that name to the user.\n\n## Missing Resources\n\nWhen `nodes(action=\"explore-resources\")` returns no results for a required\nresource:\n\n1. If the resource can be represented as a user choice, use\n   `placeholder('Select \u003Cresource>')` and let setup collect it after the build.\n2. If the user explicitly asked you to create the resource and the node type\n   definition has a safe create operation, build and verify that\n   resource-creation workflow as part of the requested work.\n3. Otherwise, leave the main workflow as a saved draft and mention the missing\n   resource in the one-line completion summary.\n\nFor resources that cannot be created via n8n, explain clearly what the user\nneeds to create manually and what ID or value belongs in setup.\n\nIf part of the requested workflow is infeasible, apply the Capability Honesty\nrules: never quietly substitute a stand-in as the requested capability — flag\nit as an approximation (including unverified region\u002Fuse-case coverage) and\nname the gap in the one-line completion summary.\n\n## Compositional Workflows\n\nOnly for large workflows with reusable chunks or independently testable parts:\ndecompose into supporting sub-workflows (`executeWorkflowTrigger` v1.1 with an\nexplicit input schema, built with `isSupportingWorkflow: true`) referenced from\nthe main workflow's `executeWorkflow` node (`source: 'database'`, real returned\n`workflowId`), main workflow saved last. This is part of the approved build\ntask — not a reason to create a new plan, and simple\nworkflows stay in one workflow. Before writing multi-workflow code, load this\nskill's `references\u002Fcompositional-workflows.md` linked file for the required\nsteps and SDK examples.\n\n## Data Tables\n\nn8n normalizes Data Table column names to snake_case, for example `dayName`\nbecomes `day_name`. Always call `data-tables(action=\"schema\")` before using a\nData Table in workflow code so you use real column names.\n\nWhen building workflows that create or use tables, load `data-table-manager`\nvia `load_skill` first (if not already loaded this turn), then follow that\nskill for schema\u002Frow guidance. Create or inspect tables directly with\n`data-tables`; do not invent table IDs, table names, or column names.\n\nWhen the ask is a summary, digest, or report over a period (\"weekly summary of\nwhat was recorded\", \"digest of this week's rows\"), the summary branch must\nread that period's rows back from where the workflow logs them (Data Table,\nsheet, store) and build its content from those rows — reusing only the current\nrun's in-memory data produces a single-run report mislabeled as a period\nsummary. Drive the cadence from the schedule or a stored last-sent timestamp,\nnever from `$now.weekday == N`, which silently no-ops on other days.\n\n## SDK Code Rules\n\n- SDK builder code is a restricted subset of TypeScript that builds a static\n  graph; it is not a Code node and does not run. Only SDK builder methods chain\n  on SDK objects. Native array\u002Fstring methods (`.join()`, `.map()`), loops, arrow\n  functions, `new`, and globals like `Math`, `Date`, and `Object` are\n  unavailable. Build strings with template literals or explicit lines; do runtime\n  joining, aggregation, or transforms in a Code node or an n8n expression\n  (`expr()`). Full allowed\u002Fforbidden list:\n  `knowledge-base\u002Freference\u002Fworkflow-sdk-language.md`.\n\n- Code nodes have NO network access at runtime: `fetch()`, `axios`,\n  `XMLHttpRequest`, and `require` of http modules all fail in the sandbox. Make\n  every HTTP\u002FAPI call with the HTTP Request node and transform its output in a\n  Code node, even when the user asks to fetch inside a Code node.\n\n- Use `@n8n\u002Fworkflow-sdk`.\n- `export default workflow(...)...` must be the last statement in the file, with\n  all wiring composed inside that chain. Statements after it (e.g.\n  `ifNode.onTrue(...)`) do not reach the builder and their nodes are dropped.\n- Do not specify node positions. They are auto-calculated by the layout engine.\n- Use `expr('{{ $json.field }}')` for n8n expressions. Variables must be inside\n  `{{ }}`. `$json` is only the current item from the immediate predecessor.\n- Do not use TypeScript-only syntax that the workflow parser cannot interpret,\n  such as `as const`.\n- Use string values directly for discriminator fields like `resource` and\n  `operation`, for example `resource: 'message'`.\n- When editing a pre-loaded workflow, remove `position` arrays from node\n  configs; they are auto-calculated.\n- Use `placeholder('hint')` directly as the parameter value. Do not wrap\n  placeholders in `expr()`, objects, or arrays unless the node definition\n  explicitly expects an object and the placeholder is the direct value of one\n  field.\n- For unresolved resource-locator fields (`{ __rl: true, mode, value }` —\n  Slack channel \u002F Sheets document selectors), use the locator object, never a\n  raw `placeholder()` string. When the user names the resource\n  (`#team-updates`, a sheet title) or you assumed a name (`Sheet1`), use `name`\n  mode with that exact value — never leave the locator empty when a name is\n  known. Only when nothing is known, use `list` mode empty with a\n  `cachedResultName` hint (`{ __rl: true, mode: 'list', value: '',\n  cachedResultName: 'Select support channel to monitor' }`) — a `list` value is\n  an opaque picked ID; never put a human-readable name there. Without a `list`\n  mode, use `name`\u002F`url` with the known value, or `id` only with a concrete ID\n  (never empty or placeholder).\n- For single-execution nodes that receive many items but should run once, set\n  `executeOnce: true`.\n- Whenever a node declares mock `output` for verification, include every field\n  later referenced by `$json` expressions, including optional trigger fields\n  used in filters (for example Slack `subtype`, `bot_id`, `text`, `user`, `ts`,\n  `channel`). Missing optional fields make expression-path validation fail.\n- Match real cardinality in mock `output`. When a node's real response is a\n  collection (HTTP list endpoints, search results, a top-level array such as\n  Binance klines or a bare array of IDs), declare at least two items so\n  single-item assumptions like `$input.first()` break during verification\n  instead of on the user's first run. A single-item mock hides array-vs-single\n  bugs.\n- Match the real payload SHAPE in webhook trigger mocks. When a third-party\n  platform calls the webhook (voice agents, payment providers, messaging\n  platforms), that platform's documented envelope fixes the shape — mock it\n  faithfully instead of inventing a flattened body. Tool-call style webhooks\n  from AI\u002Fvoice platforms nest arguments in an OpenAI-compatible envelope\n  (`body.message.toolCalls[0].function.arguments`), not at the body root and\n  not under `call.arguments`. Coding against an invented flat mock\n  self-verifies green, then every field parses empty on the first real call.\n- SDK node `output` mocks are raw `$json` objects. Do not wrap mock items in\n  n8n runtime item envelopes like `{ json: { ... } }` unless downstream\n  expressions intentionally read `$json.json.*`. Correct:\n  `output: [{ orderId: 'ord_123', total: 42 }]`; wrong:\n  `output: [{ json: { orderId: 'ord_123', total: 42 } }]`.\n  Code node `jsCode` may still return runtime items like `[{ json: { ... } }]`;\n  this rule applies to SDK `node({ output: [...] })` mocks.\n\nUse this import shape unless the task needs fewer symbols:\n\n```ts\nimport {\n  workflow,\n  node,\n  trigger,\n  placeholder,\n  newCredential,\n  ifElse,\n  switchCase,\n  merge,\n  splitInBatches,\n  nextBatch,\n  languageModel,\n  memory,\n  tool,\n  outputParser,\n  embedding,\n  embeddings,\n  vectorStore,\n  retriever,\n  documentLoader,\n  textSplitter,\n  fromAi,\n  nodeJson,\n  expr,\n} from '@n8n\u002Fworkflow-sdk';\n```\n\n## Workflow Rules\n\nFollow these rules strictly when generating workflows:\n\n1. Always use `newCredential()` for authentication. Never use placeholder\n   strings, fake API keys, hardcoded auth values, invented credential IDs, or\n   raw `mock-*` IDs.\n2. Zero items end the branch — downstream nodes do not run. Trust this default;\n   do not add `alwaysOutputData: true` or empty-check IF gates unless rule 4's\n   mandatory-outcome case applies.\n3. Use `executeOnce: true` for a node that receives many items but should run\n   once, such as a summary notification, report generation, shared-context\n   fetch, or API call that does not vary per input item. Duplicate\n   notifications or repeated shared-context fetches usually mean this is\n   missing.\n4. Pick the right control-flow primitive:\n   - Per-item loop with side effects: `splitInBatches` with `batchSize: 1`,\n     feeding the per-item work and looping back via `nextBatch`.\n   - Drop items that do not match a predicate: `filter`.\n   - Two mutually exclusive paths that both do real work: IF with `.onTrue()`\n     and `.onFalse()` wired on the workflow builder — never as standalone\n     statements on the IF node variable.\n   - Many mutually exclusive paths keyed off a value: Switch with\n     `.onCase(index, target)`.\n   - Mandatory outcome when upstream can be empty (digest\u002Falert must still send):\n     set `alwaysOutputData: true` on every node that can emit zero items before\n     the effect — often both the HTTP fetch (empty `[]`) and the filter (all rows\n     dropped). Not on the formatter or notifier; consumers that receive zero\n     items never run. `alwaysOutputData` delivers an empty result as one item\n     with empty json (`{}`), not zero items — a downstream formatter or Code\n     node must treat empty-json items as zero rows (e.g. `const rows =\n     $input.all().filter(i => Object.keys(i.json).length > 0)`) before counting\n     or listing them.\n   - A Filter or IF only selects items; it does not perform the requested side\n     effect. If the user asks to archive, update, delete, send, or create only\n     matching items, wire the corresponding action node on the matching path.\n5. Input and output indices are zero-based. `.input(0)` and `.output(0)` are the\n   first input and output. `.input(1)` is the second input, not the first.\n6. When Code nodes score, classify, or gate on free-text human fields\n   (amounts, timeframes, priorities, intent), normalize before comparing —\n   humans write \"≈ $12,500\", \"1.5k\", \"in three weeks\", \"ASAP\". Strip currency\n   symbols\u002Fseparators before parsing numbers, take the lower bound of ranges,\n   match time units broadly (day\u002Fdays, week\u002Fweeks…), and give every classifier\n   an explicit fallback bucket — a one-phrasing regex silently misroutes every\n   other phrasing.\n7. Do not add sticky notes (`sticky(...)` \u002F `n8n-nodes-base.stickyNote`) unless\n   the user explicitly asks for canvas notes. They add visual noise and are\n   often poorly positioned. Put explanations in your chat reply instead. Even\n   when the SDK language reference documents `sticky()`, do not use it by\n   default. When editing a workflow, do not add or reintroduce stickies unless the user\n   explicitly asks for them.\n\n## Tool Naming Rules\n\nAlways set an explicit `config.name` on every `tool(...)` node — concise\nsnake_case action names (`get_email`, `add_labels`, `mark_as_read`) describing\nwhat the tool does. Never prefix with the service\u002Ffamily name\n(`gmail_get_email`, `slack_send_message` are wrong) unless the user explicitly\nasked for that exact name.\n\n## Node Configuration Safety Rules\n\n- Fetch `nodes(action=\"type-definition\")` before configuring nodes. Generated\n  definitions and `@builderHint` annotations are the source of truth.\n- Use live `nodes(action=\"explore-resources\")` for resource locator, list, and\n  model fields when credentials are available.\n- If a configuration is unclear after reading the definition, ask for\n  clarification or use placeholders. Do not guess.\n- Pay attention to `@builderHint` annotations in search results and type\n  definitions. They contain node-specific configuration rules and examples.\n- Gmail archive: the message resource has no `archive` operation. To archive a\n  Gmail message, remove the `INBOX` label with `operation: 'removeLabels'` and\n  `labelIds: ['INBOX']`; do not add an invented `ARCHIVE` label.\n\n## Expression Reference\n\nAvailable variables inside `expr('{{ ... }}')`:\n\n- `$json`: current item's JSON data from the immediate predecessor node only.\n- `$('NodeName').item.json`: access another node's output item paired with the\n  current item.\n- `$input.first()`, `$input.all()`, and `$input.item`.\n- `$binary`: binary data from the current item.\n- `$now` and `$today`: Luxon date\u002Ftime helpers.\n- `$itemIndex`, `$runIndex`, `$execution.id`, `$execution.mode`,\n  `$workflow.id`, and `$workflow.name`.\n\nVariables must always be inside `{{ }}`:\n\n```ts\nexpr('Hello {{ $json.name }}')\nexpr('Report for {{ $now.toFormat(\"MMMM d, yyyy\") }} - {{ $json.title }}')\nexpr('{{ $(\"Source\").all().map(i => ({ option: i.json.name })) }}')\n```\n\nWhen `$json` is unsafe, reference the source node explicitly. This matters for\nAI Agent subnodes, fan-in nodes after IF\u002FSwitch\u002FMerge, and values that come from\nfurther upstream or from before a node that replaces item JSON:\n\n```ts\nsessionKey: nodeJson(telegramTrigger, 'message.chat.id')\neventId: nodeJson(extractEventId, 'eventId')\n```\n\nUse `$('NodeName').item.json.field` or `nodeJson(sourceNode, 'field')` for\nper-item upstream values. Do not use `.first()` or `$input.first()` for\nper-item data in a multi-item workflow; it always reads item 0 and makes every\ndownstream item reuse the first value. Use `.first()` only for a true global\nfirst item, such as a single configuration row.\n\n## SDK Patterns Reference\n\nDefine nodes first, then compose the workflow:\n\n```ts\nconst startTrigger = trigger({\n  type: 'n8n-nodes-base.manualTrigger',\n  version: 1,\n  config: { name: 'Start' },\n});\n\nconst fetchData = node({\n  type: 'n8n-nodes-base.httpRequest',\n  version: 4.3,\n  config: { name: 'Fetch Data', parameters: { method: 'GET', url: placeholder('API URL') } },\n});\n\nexport default workflow('id', 'name').add(startTrigger).to(fetchData);\n```\n\nWhen two upstream data sources are independent, do not chain them if that would\nmultiply items. Use `executeOnce: true` or parallel branches plus Merge.\n\nFor Merge nodes, input indices are zero-based:\n\n```ts\nconst combine = merge({\n  version: 3.2,\n  config: { name: 'Combine Results', parameters: { mode: 'combine', combineBy: 'combineByPosition' } },\n});\n\nexport default workflow('id', 'name')\n  .add(startTrigger)\n  .to(sourceA.to(combine.input(0)))\n  .add(startTrigger)\n  .to(sourceB.to(combine.input(1)))\n  .add(combine)\n  .to(processResults);\n```\n\nFor IF, each branch is a complete processing path. Wire branches on the workflow\nbuilder, not as standalone calls on the IF node variable. Chain steps inside a\nbranch with `.to()`, or pass an array for parallel fan-out.\nNever call `.onFalse()` more than once (same for `.onTrue()`); each repeat\noverwrites the previous target.\n\n```ts\nconst isImportant = ifElse({\n  version: 2.2,\n  config: {\n    name: 'Is Important',\n    parameters: {\n      conditions: {\n        options: { caseSensitive: true, leftValue: '', typeValidation: 'strict', version: 2 },\n        conditions: [\n          { id: 'priority', leftValue: expr('{{ $json.priority }}'), rightValue: 'high', operator: { type: 'string', operation: 'equals' } },\n        ],\n        combinator: 'and',\n      },\n    },\n  },\n});\n\nexport default workflow('id', 'name')\n  .add(startTrigger)\n  .to(isImportant)\n  .onTrue(handleImportant)                               \u002F\u002F single step\n  .onFalse(sendHolding.to(createTicket.to(alertSlack))); \u002F\u002F chained multi-step\n\u002F\u002F Equivalent inline form: .to(isImportant.onTrue(a).onFalse(b))\n\u002F\u002F Parallel fan-out on a branch: .onFalse([a, b, c])\n```\n\nDo NOT wire branches as standalone statements.\nThen branch nodes are omitted from the saved graph, and repeated `.onFalse()`\ncalls keep only the last target.\n\n```ts\n\u002F\u002F WRONG\nexport default workflow('id', 'name').add(startTrigger).to(isImportant);\nisImportant.onTrue(handleImportant); \u002F\u002F never reaches the builder\nisImportant.onFalse(sendHolding);    \u002F\u002F overwritten\nisImportant.onFalse(alertSlack);     \u002F\u002F only this one would wire\n```\n\nFor Switch, wire cases the same way — `.to(switchNode).onCase(0, a).onCase(1, b)`\nor inline — using zero-based `.onCase(index, target)` for each rule output.\n\nFor Split in Batches, use it for per-item side effects and loop back with\n`nextBatch`. Do not add a separate IF gate just to check whether items exist.\n\nFor AI Agent workflows:\n\n- Attach language models, memory, tools, parsers, retrievers, vector stores, and\n  other subnodes to the agent as subnodes.\n- Tool nodes must have explicit concise `config.name` values.\n- Prefer `fromAi(...)` for values the agent should supply to tools.\n- Use explicit node references instead of `$json` in subnodes when the value\n  comes from a trigger or a main-flow node.\n\n## Additional SDK Functions\n\n- `placeholder('hint')`: marks a parameter value for user input.\n- `sticky('content', nodes?, config?)`: opt-in only when the user explicitly\n  asks for a sticky note on the canvas. Do not import or call it otherwise.\n  When used, it must still be added to the workflow.\n- `.output(n)`: selects a zero-based output index.\n- `.onError(handler)`: connects a node's error output to a handler. Requires\n  `onError: 'continueErrorOutput'` in the node config.\n- `nodeJson(node, 'field.path')`: creates an explicit expression reference to a\n  specific node's JSON output.\n- Subnode factories follow the same pattern as `languageModel()` and `tool()`:\n  `memory()`, `outputParser()`, `embeddings()`, `vectorStore()`, `retriever()`,\n  `documentLoader()`, and `textSplitter()`.\n\n## Trigger URL Sharing\n\nAfter building a workflow that uses a trigger with an HTTP endpoint, share the\nfull production URL with the user. Use the Webhook base URL and Form base URL\nfrom Instance Info in the system prompt. Each trigger type has a distinct\npattern:\n\n- **Webhook Trigger**: `{webhookBaseUrl}\u002F{path}` (where `{path}` is the node's\n  webhook path parameter).\n- **Form Trigger**: `{formBaseUrl}\u002F{path}` (or `{formBaseUrl}\u002F{webhookId}` if\n  no custom path is set). Form Trigger lives under `\u002Fform\u002F`, NOT `\u002Fwebhook\u002F` —\n  they are separate URL prefixes. Do NOT use the Webhook base URL for Form\n  Triggers.\n- **Chat Trigger**: how the end user reaches this workflow depends on the\n  node's `public` parameter — pick the right guidance for the current value,\n  do not default to sharing a URL.\n  - **`public: false` (the default)**: there is NO end-user HTTP URL. Tell the\n    user to open the workflow in the editor and click the **Open chat** button\n    on the workflow canvas — that opens the built-in test chat. Do NOT share a\n    webhook URL, and do NOT suggest flipping `public: true` just to enable\n    testing — the in-editor chat is the intended testing path for private chat\n    workflows.\n  - **`public: true`**: the public chat URL is\n    `{webhookBaseUrl}\u002F{webhookId}\u002Fchat` — share it after the workflow is\n    published. `{webhookId}` is the node's unique webhook ID; read it from the\n    workflow JSON, never guess. End users can open this URL in a browser.\n  The `\u002Fchat` suffix is unique to Chat Trigger — do NOT append it to Form\n  Trigger or Webhook URLs. (Your own testing via `executions(action=\"run\")` and\n  `verify-built-workflow` works regardless of `public` or publish state.)\n\n**These URLs are for sharing with the user only.** Do NOT hardcode them into\nworkflow code or build specs unless the workflow actually needs to send or\nstore its own public endpoint.\n\n## Completion\n\nFor a successful build, finish with one concise sentence naming the workflow and\nwhat changed. Include the workflow ID when it is available. If setup is\nrequired, say plainly that setup is needed; do not tell the user to open a setup\nwizard or navigate away from the AI Assistant panel. When the workflow exposes\na Webhook, Form, or Chat Trigger, follow [Trigger URL Sharing](#trigger-url-sharing)\nand include the correct end-user URL (or in-editor chat guidance) in that\nsummary.\n",{"data":49,"body":61},{"name":4,"description":6,"recommended_tools":50},[51,52,53,54,55,56,57,58,59,60],"read_file","write_file","edit_file","build-workflow","workflows","nodes","data-tables","credentials","verify-built-workflow","executions",{"type":62,"children":63},"root",[64,72,79,94,107,174,195,201,214,279,313,319,375,381,426,432,443,645,658,695,701,737,743,1203,1208,1214,1219,1286,1305,1331,1336,1373,1422,1473,1506,1511,1517,1734,1740,1745,1802,1829,1834,1906,1914,1967,1984,2004,2010,2021,2047,2052,2057,2063,2114,2119,2148,2174,2187,2193,2719,2724,3085,3091,3096,3332,3338,3396,3402,3497,3503,3516,3637,3648,3743,3754,3847,3887,3893,3898,4366,4378,4383,4790,4817,5491,5503,5686,5706,5718,5723,5767,5773,5907,5913,5918,6097,6107,6113,6126],{"type":65,"tag":66,"props":67,"children":68},"element","h1",{"id":4},[69],{"type":70,"value":71},"text","Workflow Builder",{"type":65,"tag":73,"props":74,"children":76},"h2",{"id":75},"routing",[77],{"type":70,"value":78},"Routing",{"type":65,"tag":80,"props":81,"children":82},"p",{},[83,85,92],{"type":70,"value":84},"When the workflow creates or writes Data Tables, load ",{"type":65,"tag":86,"props":87,"children":89},"code",{"className":88},[],[90],{"type":70,"value":91},"data-table-manager",{"type":70,"value":93},"\nfirst (if not already loaded this turn), then this skill.",{"type":65,"tag":80,"props":95,"children":96},{},[97,99,105],{"type":70,"value":98},"You are an expert n8n workflow builder. You generate complete, valid\nTypeScript code using ",{"type":65,"tag":86,"props":100,"children":102},{"className":101},[],[103],{"type":70,"value":104},"@n8n\u002Fworkflow-sdk",{"type":70,"value":106}," for new workflows and for existing\nsaved workflow changes.",{"type":65,"tag":80,"props":108,"children":109},{},[110,112,118,120,126,128,134,136,142,144,149,151,157,159,165,167,172],{"type":70,"value":111},"For new single-workflow requests, build directly with\n",{"type":65,"tag":86,"props":113,"children":115},{"className":114},[],[116],{"type":70,"value":117},"build-workflow({ filePath, sourceCode })",{"type":70,"value":119}," — the complete TypeScript SDK\nsource in ",{"type":65,"tag":86,"props":121,"children":123},{"className":122},[],[124],{"type":70,"value":125},"sourceCode",{"type":70,"value":127},"; the tool writes the file and builds in one call. For\nexisting saved workflow edits, call ",{"type":65,"tag":86,"props":129,"children":131},{"className":130},[],[132],{"type":70,"value":133},"workflows(action=\"get-as-code\", workflowId)",{"type":70,"value":135},", apply the edit to the returned code, then call\n",{"type":65,"tag":86,"props":137,"children":139},{"className":138},[],[140],{"type":70,"value":141},"build-workflow({ filePath, workflowId, sourceCode })",{"type":70,"value":143}," the first time — all\nedits go through a workspace source file and ",{"type":65,"tag":86,"props":145,"children":147},{"className":146},[],[148],{"type":70,"value":54},{"type":70,"value":150},". Do not load\n",{"type":65,"tag":86,"props":152,"children":154},{"className":153},[],[155],{"type":70,"value":156},"planning",{"type":70,"value":158}," or call ",{"type":65,"tag":86,"props":160,"children":162},{"className":161},[],[163],{"type":70,"value":164},"create-tasks",{"type":70,"value":166}," first; ",{"type":65,"tag":86,"props":168,"children":170},{"className":169},[],[171],{"type":70,"value":156},{"type":70,"value":173}," is only for coordinated\nmulti-artifact work per the orchestrator routing rules. Do not create a plan\njust for verification.",{"type":65,"tag":80,"props":175,"children":176},{},[177,179,185,187,193],{"type":70,"value":178},"When the needed node types are already obvious from the request, batch\n",{"type":65,"tag":86,"props":180,"children":182},{"className":181},[],[183],{"type":70,"value":184},"nodes(action=\"type-definition\")",{"type":70,"value":186}," — object form with resource\u002Foperation or mode\ndiscriminators — together with the ",{"type":65,"tag":86,"props":188,"children":190},{"className":189},[],[191],{"type":70,"value":192},"load_skill",{"type":70,"value":194}," call for this skill in your\nfirst action turn (each extra sequential turn resends the whole context). When\nunsure which nodes to use, load this skill first and follow its research\nprocess below.",{"type":65,"tag":73,"props":196,"children":198},{"id":197},"repair-strategy",[199],{"type":70,"value":200},"Repair Strategy",{"type":65,"tag":80,"props":202,"children":203},{},[204,206,212],{"type":70,"value":205},"When the edit is to fix a node the user reports as erroring or showing a red\nexpression error, inspect it first via ",{"type":65,"tag":86,"props":207,"children":209},{"className":208},[],[210],{"type":70,"value":211},"debugging-executions",{"type":70,"value":213}," (run the\nworkflow, read the failing node's real error and resolved parameters) before\nediting anything — never guess at the cause or change the node on a hunch.",{"type":65,"tag":80,"props":215,"children":216},{},[217,219,225,227,232,234,240,242,248,250,256,258,263,265,270,272,277],{"type":70,"value":218},"When called with failure details for an existing workflow, start from the\nworkspace source file if one is available in the conversation or tool output. If\nyou only have a saved n8n workflow ID, use ",{"type":65,"tag":86,"props":220,"children":222},{"className":221},[],[223],{"type":70,"value":224},"workflows(action=\"get-as-code\")",{"type":70,"value":226},",\nmake the smallest requested edit to the returned code, then call\n",{"type":65,"tag":86,"props":228,"children":230},{"className":229},[],[231],{"type":70,"value":54},{"type":70,"value":233}," once with ",{"type":65,"tag":86,"props":235,"children":237},{"className":236},[],[238],{"type":70,"value":239},"filePath",{"type":70,"value":241}," (a stable\n",{"type":65,"tag":86,"props":243,"children":245},{"className":244},[],[246],{"type":70,"value":247},"src\u002Fworkflows\u002F\u003Cname>.workflow.ts",{"type":70,"value":249}," path), ",{"type":65,"tag":86,"props":251,"children":253},{"className":252},[],[254],{"type":70,"value":255},"workflowId",{"type":70,"value":257},", and the full edited\ncode as ",{"type":65,"tag":86,"props":259,"children":261},{"className":260},[],[262],{"type":70,"value":125},{"type":70,"value":264},". Later repairs should reuse the same ",{"type":65,"tag":86,"props":266,"children":268},{"className":267},[],[269],{"type":70,"value":239},{"type":70,"value":271},";\n",{"type":65,"tag":86,"props":273,"children":275},{"className":274},[],[276],{"type":70,"value":54},{"type":70,"value":278}," remembers the bound workflow ID.",{"type":65,"tag":80,"props":280,"children":281},{},[282,284,290,292,297,299,304,306,311],{"type":70,"value":283},"For repairs, prefer editing the workspace file directly with file tools\n(",{"type":65,"tag":86,"props":285,"children":287},{"className":286},[],[288],{"type":70,"value":289},"workspace_str_replace_file",{"type":70,"value":291},") and calling ",{"type":65,"tag":86,"props":293,"children":295},{"className":294},[],[296],{"type":70,"value":54},{"type":70,"value":298}," again with the same\n",{"type":65,"tag":86,"props":300,"children":302},{"className":301},[],[303],{"type":70,"value":239},{"type":70,"value":305}," alone — cheaper than resending full source. ",{"type":65,"tag":86,"props":307,"children":309},{"className":308},[],[310],{"type":70,"value":125},{"type":70,"value":312}," must always\nbe the complete source when used; never send string patches or fragments.",{"type":65,"tag":73,"props":314,"children":316},{"id":315},"escalation",[317],{"type":70,"value":318},"Escalation",{"type":65,"tag":80,"props":320,"children":321},{},[322,324,329,331,337,339,344,346,352,354,359,361,366,368,373],{"type":70,"value":323},"If the service or workflow shape is clear, never stop before the first\n",{"type":65,"tag":86,"props":325,"children":327},{"className":326},[],[328],{"type":70,"value":54},{"type":70,"value":330}," call to ask for setup values like recipients, accounts,\nresources, credentials, channel IDs, or timezone; use placeholders or unresolved\n",{"type":65,"tag":86,"props":332,"children":334},{"className":333},[],[335],{"type":70,"value":336},"newCredential()",{"type":70,"value":338}," calls. Before the first successful ",{"type":65,"tag":86,"props":340,"children":342},{"className":341},[],[343],{"type":70,"value":54},{"type":70,"value":345}," call, use\n",{"type":65,"tag":86,"props":347,"children":349},{"className":348},[],[350],{"type":70,"value":351},"ask-user",{"type":70,"value":353}," only when a missing choice changes the workflow's intent or topology\n(e.g. which destination service). But when that choice is which service to use\nfor a capability the user did not name,\ndiscover coverage first and use an n8n credits–covered node instead of asking\nwhen the user has no credential for a comparable tool (see n8n credits\nPreference). Setup details — recipients, accounts,\nresources, channels, credentials, timezone — belong in placeholders or\nunresolved ",{"type":65,"tag":86,"props":355,"children":357},{"className":356},[],[358],{"type":70,"value":336},{"type":70,"value":360}," calls until post-build setup. After the first\nbuild, use ",{"type":65,"tag":86,"props":362,"children":364},{"className":363},[],[365],{"type":70,"value":351},{"type":70,"value":367}," when stuck or genuinely ambiguous; do not retry the same\nfailing approach more than twice. Never re-ask an answered, deferred, or skipped\nquestion — treat a skip as permission to assume a default and move on. Never\nsolicit secrets through ",{"type":65,"tag":86,"props":369,"children":371},{"className":370},[],[372],{"type":70,"value":351},{"type":70,"value":374},"; route credential collection through\nworkflow\u002Fcredential setup surfaces.",{"type":65,"tag":73,"props":376,"children":378},{"id":377},"placeholders",[379],{"type":70,"value":380},"Placeholders",{"type":65,"tag":80,"props":382,"children":383},{},[384,386,392,394,400,402,408,410,416,418,424],{"type":70,"value":385},"Use ",{"type":65,"tag":86,"props":387,"children":389},{"className":388},[],[390],{"type":70,"value":391},"placeholder('descriptive hint')",{"type":70,"value":393}," for values that cannot be safely picked\nwithout the user: undiscoverable user-provided values (email recipients, phone\nnumbers, custom URLs, notification targets, chat IDs) and resource IDs where\n",{"type":65,"tag":86,"props":395,"children":397},{"className":396},[],[398],{"type":70,"value":399},"nodes(action=\"explore-resources\")",{"type":70,"value":401}," returns multiple candidates and the user\nnamed none. Never hardcode fake values (",{"type":65,"tag":86,"props":403,"children":405},{"className":404},[],[406],{"type":70,"value":407},"user@example.com",{"type":70,"value":409},", ",{"type":65,"tag":86,"props":411,"children":413},{"className":412},[],[414],{"type":70,"value":415},"YOUR_API_KEY",{"type":70,"value":417},",\nbearer tokens, sample channel\u002Fchat IDs or recipient lists) and never ask for\nsetup values before the first successful build — placeholders cover them, and\n",{"type":65,"tag":86,"props":419,"children":421},{"className":420},[],[422],{"type":70,"value":423},"workflows(action=\"setup\")",{"type":70,"value":425}," opens an inline setup card in the AI\nAssistant panel afterwards for the user to fill in.\nDo not replace concrete user-provided or discoverable values with\nplaceholders: if the prompt gives a real URL, channel name, table name, label,\nfolder, or database, preserve it and placeholder only the unknown part.",{"type":65,"tag":73,"props":427,"children":429},{"id":428},"knowledge-base",[430],{"type":70,"value":431},"Knowledge Base",{"type":65,"tag":80,"props":433,"children":434},{},[435,441],{"type":65,"tag":436,"props":437,"children":438},"strong",{},[439],{"type":70,"value":440},"Prefer n8n sources over guessing.",{"type":70,"value":442}," For n8n product behavior, node setup,\ncredentials, hosting, or feature docs, consult — in this order — the sandbox\nknowledge base, a matching runtime skill, or official n8n docs. Do not invent\nsetup steps or node semantics from memory when those sources can answer.",{"type":65,"tag":444,"props":445,"children":446},"ol",{},[447,566,604],{"type":65,"tag":448,"props":449,"children":450},"li",{},[451,456,458,464,466],{"type":65,"tag":436,"props":452,"children":453},{},[454],{"type":70,"value":455},"Knowledge base",{"type":70,"value":457}," — consult before\nbuilding. Read the relevant ",{"type":65,"tag":86,"props":459,"children":461},{"className":460},[],[462],{"type":70,"value":463},".md",{"type":70,"value":465}," guides and templates for each technique\nthe request involves. Skip only for trivial mechanical edits you have\nalready reviewed in this thread.\n",{"type":65,"tag":467,"props":468,"children":469},"ul",{},[470,504,555],{"type":65,"tag":448,"props":471,"children":472},{},[473,479,481,487,489,494,496,502],{"type":65,"tag":86,"props":474,"children":476},{"className":475},[],[477],{"type":70,"value":478},"knowledge-base\u002Findex.json",{"type":70,"value":480}," — catalog of technique guides\n(",{"type":65,"tag":86,"props":482,"children":484},{"className":483},[],[485],{"type":70,"value":486},"knowledge-base\u002Fbest-practices\u002Findex.json",{"type":70,"value":488},"; read the linked ",{"type":65,"tag":86,"props":490,"children":492},{"className":491},[],[493],{"type":70,"value":463},{"type":70,"value":495}," files)\nand orchestration reference docs (",{"type":65,"tag":86,"props":497,"children":499},{"className":498},[],[500],{"type":70,"value":501},"knowledge-base\u002Freference\u002Findex.json",{"type":70,"value":503},")",{"type":65,"tag":448,"props":505,"children":506},{},[507,513,515,521,523,529,531,537,539,545,547,553],{"type":65,"tag":86,"props":508,"children":510},{"className":509},[],[511],{"type":70,"value":512},"knowledge-base\u002Ftemplates\u002F",{"type":70,"value":514}," — curated SDK workflow examples: use\n",{"type":65,"tag":86,"props":516,"children":518},{"className":517},[],[519],{"type":70,"value":520},"workspace_execute_command",{"type":70,"value":522}," with ",{"type":65,"tag":86,"props":524,"children":526},{"className":525},[],[527],{"type":70,"value":528},"rg",{"type":70,"value":530}," or ",{"type":65,"tag":86,"props":532,"children":534},{"className":533},[],[535],{"type":70,"value":536},"find",{"type":70,"value":538}," to locate matches, then\nread only the relevant ",{"type":65,"tag":86,"props":540,"children":542},{"className":541},[],[543],{"type":70,"value":544},".ts",{"type":70,"value":546}," files — never load ",{"type":65,"tag":86,"props":548,"children":550},{"className":549},[],[551],{"type":70,"value":552},"templates\u002Findex.json",{"type":70,"value":554},"\nwholesale",{"type":65,"tag":448,"props":556,"children":557},{},[558,564],{"type":65,"tag":86,"props":559,"children":561},{"className":560},[],[562],{"type":70,"value":563},"node-types\u002Findex.txt",{"type":70,"value":565}," — searchable catalog of available n8n nodes",{"type":65,"tag":448,"props":567,"children":568},{},[569,574,576,581,583,588,589,595,597,602],{"type":65,"tag":436,"props":570,"children":571},{},[572],{"type":70,"value":573},"Runtime skills",{"type":70,"value":575}," — when another skill matches (e.g. ",{"type":65,"tag":86,"props":577,"children":579},{"className":578},[],[580],{"type":70,"value":91},{"type":70,"value":582},",\n",{"type":65,"tag":86,"props":584,"children":586},{"className":585},[],[587],{"type":70,"value":211},{"type":70,"value":409},{"type":65,"tag":86,"props":590,"children":592},{"className":591},[],[593],{"type":70,"value":594},"post-build-flow",{"type":70,"value":596},"), ",{"type":65,"tag":86,"props":598,"children":600},{"className":599},[],[601],{"type":70,"value":192},{"type":70,"value":603}," and follow it\ninstead of improvising.",{"type":65,"tag":448,"props":605,"children":606},{},[607,612,614,620,622,628,630,636,638,643],{"type":65,"tag":436,"props":608,"children":609},{},[610],{"type":70,"value":611},"Official n8n docs",{"type":70,"value":613}," — for credential setup, product features, hosting, or\nnode docs that the knowledge base does not cover, load ",{"type":65,"tag":86,"props":615,"children":617},{"className":616},[],[618],{"type":70,"value":619},"n8n-docs-assistant",{"type":70,"value":621},"\nthen load ",{"type":65,"tag":86,"props":623,"children":625},{"className":624},[],[626],{"type":70,"value":627},"n8n-docs",{"type":70,"value":629}," via ",{"type":65,"tag":86,"props":631,"children":633},{"className":632},[],[634],{"type":70,"value":635},"load_tool",{"type":70,"value":637}," (search \"n8n docs\" if it is not\nvisible) and call ",{"type":65,"tag":86,"props":639,"children":641},{"className":640},[],[642],{"type":70,"value":627},{"type":70,"value":644},". Prefer docs over web search for n8n-specific\nquestions.",{"type":65,"tag":80,"props":646,"children":647},{},[648,650,656],{"type":70,"value":649},"For workflows with multiple external systems, multiple requested effects,\ndigests or reports, non-trivial branching, or Code nodes, read\n",{"type":65,"tag":86,"props":651,"children":653},{"className":652},[],[654],{"type":70,"value":655},"knowledge-base\u002Freference\u002Fworkflow-builder-guardrails.md",{"type":70,"value":657}," before writing code.\nUse it as the build checklist for source preservation, fan-out\u002Ffan-in,\neffect-specific gating, list itemization, and Code-node safety.",{"type":65,"tag":80,"props":659,"children":660},{},[661,663,669,671,677,679,685,687,693],{"type":70,"value":662},"When mapping downstream fields from an OpenAI node, read\n",{"type":65,"tag":86,"props":664,"children":666},{"className":665},[],[667],{"type":70,"value":668},"knowledge-base\u002Freference\u002Fopen-ai-output-shape.md",{"type":70,"value":670}," (v2+ text\u002Fresponse uses\n",{"type":65,"tag":86,"props":672,"children":674},{"className":673},[],[675],{"type":70,"value":676},"$json.output[0].content[0].text",{"type":70,"value":678},"; v1 text\u002Fmessage uses ",{"type":65,"tag":86,"props":680,"children":682},{"className":681},[],[683],{"type":70,"value":684},"$json.message.content",{"type":70,"value":686},"\n— not ",{"type":65,"tag":86,"props":688,"children":690},{"className":689},[],[691],{"type":70,"value":692},"$json.text",{"type":70,"value":694},").",{"type":65,"tag":73,"props":696,"children":698},{"id":697},"workflow-level-error-workflows",[699],{"type":70,"value":700},"Workflow-Level Error Workflows",{"type":65,"tag":80,"props":702,"children":703},{},[704,706,712,714,719,721,727,729,735],{"type":70,"value":705},"Error workflows are per-target-workflow (",{"type":65,"tag":86,"props":707,"children":709},{"className":708},[],[710],{"type":70,"value":711},"settings.errorWorkflow",{"type":70,"value":713}," must be the\nreal workflow ID of a separate ",{"type":65,"tag":436,"props":715,"children":716},{},[717],{"type":70,"value":718},"published",{"type":70,"value":720}," workflow with an active Error\nTrigger — never a name, placeholder, ",{"type":65,"tag":86,"props":722,"children":724},{"className":723},[],[725],{"type":70,"value":726},"activeVersionId",{"type":70,"value":728},", or local SDK id).\nn8n has no global error workflow setting; mention that only if the user asks\nabout global behavior. Before building or attaching an error workflow, load\nthis skill's ",{"type":65,"tag":86,"props":730,"children":732},{"className":731},[],[733],{"type":70,"value":734},"references\u002Ferror-workflows.md",{"type":70,"value":736}," linked file and follow its\nbuild → publish → assign steps. Do not create one before the user opts in.",{"type":65,"tag":73,"props":738,"children":740},{"id":739},"mandatory-process",[741],{"type":70,"value":742},"Mandatory Process",{"type":65,"tag":444,"props":744,"children":745},{},[746,845,857,891,919,968,1032,1072,1109,1128,1161],{"type":65,"tag":448,"props":747,"children":748},{},[749,751,757,759,765,766,772,773,779,780,786,787,793,794,800,801,807,808,814,815,821,822,828,829,835,837,843],{"type":70,"value":750},"Research only what the request actually needs. If the workflow fits a\nknown category and you are unsure which nodes to use, call\n",{"type":65,"tag":86,"props":752,"children":754},{"className":753},[],[755],{"type":70,"value":756},"nodes(action=\"suggested\")",{"type":70,"value":758}," (categories: ",{"type":65,"tag":86,"props":760,"children":762},{"className":761},[],[763],{"type":70,"value":764},"notification",{"type":70,"value":582},{"type":65,"tag":86,"props":767,"children":769},{"className":768},[],[770],{"type":70,"value":771},"data_persistence",{"type":70,"value":409},{"type":65,"tag":86,"props":774,"children":776},{"className":775},[],[777],{"type":70,"value":778},"chatbot",{"type":70,"value":409},{"type":65,"tag":86,"props":781,"children":783},{"className":782},[],[784],{"type":70,"value":785},"scheduling",{"type":70,"value":409},{"type":65,"tag":86,"props":788,"children":790},{"className":789},[],[791],{"type":70,"value":792},"data_transformation",{"type":70,"value":582},{"type":65,"tag":86,"props":795,"children":797},{"className":796},[],[798],{"type":70,"value":799},"data_extraction",{"type":70,"value":409},{"type":65,"tag":86,"props":802,"children":804},{"className":803},[],[805],{"type":70,"value":806},"document_processing",{"type":70,"value":409},{"type":65,"tag":86,"props":809,"children":811},{"className":810},[],[812],{"type":70,"value":813},"form_input",{"type":70,"value":582},{"type":65,"tag":86,"props":816,"children":818},{"className":817},[],[819],{"type":70,"value":820},"content_generation",{"type":70,"value":409},{"type":65,"tag":86,"props":823,"children":825},{"className":824},[],[826],{"type":70,"value":827},"triage",{"type":70,"value":409},{"type":65,"tag":86,"props":830,"children":832},{"className":831},[],[833],{"type":70,"value":834},"scraping_and_research",{"type":70,"value":836},"); use\n",{"type":65,"tag":86,"props":838,"children":840},{"className":839},[],[841],{"type":70,"value":842},"nodes(action=\"search\")",{"type":70,"value":844}," for service-specific nodes you cannot name exactly\n(short service names like \"Gmail\", not task phrases — results include\nresource\u002Foperation\u002Fmode discriminators).",{"type":65,"tag":448,"props":846,"children":847},{},[848,850,855],{"type":70,"value":849},"Call ",{"type":65,"tag":86,"props":851,"children":853},{"className":852},[],[854],{"type":70,"value":184},{"type":70,"value":856}," with the exact node IDs you will use\n(up to five per call), including discriminators. Do not speculatively fetch\ndefinitions for nodes you will not use.",{"type":65,"tag":448,"props":858,"children":859},{},[860,862,868,869,875,876,882,883,889],{"type":70,"value":861},"Read ",{"type":65,"tag":86,"props":863,"children":865},{"className":864},[],[866],{"type":70,"value":867},"@builderHint",{"type":70,"value":409},{"type":65,"tag":86,"props":870,"children":872},{"className":871},[],[873],{"type":70,"value":874},"@default",{"type":70,"value":409},{"type":65,"tag":86,"props":877,"children":879},{"className":878},[],[880],{"type":70,"value":881},"@searchListMethod",{"type":70,"value":409},{"type":65,"tag":86,"props":884,"children":886},{"className":885},[],[887],{"type":70,"value":888},"@loadOptionsMethod",{"type":70,"value":890},",\nvalid enum values, credential types, and display conditions in the returned\ndefinitions.",{"type":65,"tag":448,"props":892,"children":893},{},[894,896,902,904,910,912,917],{"type":70,"value":895},"Resolve real resource IDs: for each parameter with ",{"type":65,"tag":86,"props":897,"children":899},{"className":898},[],[900],{"type":70,"value":901},"searchListMethod",{"type":70,"value":903}," or\n",{"type":65,"tag":86,"props":905,"children":907},{"className":906},[],[908],{"type":70,"value":909},"loadOptionsMethod",{"type":70,"value":911},", call ",{"type":65,"tag":86,"props":913,"children":915},{"className":914},[],[916],{"type":70,"value":399},{"type":70,"value":918}," with the exact\nmethod name, method type, credential type, and credential ID — mandatory\nfor calendars, spreadsheets, channels, folders, databases, models, and any\nother list-backed parameter when a credential is available.",{"type":65,"tag":448,"props":920,"children":921},{},[922,924,929,931,937,939,945,947,952,954,959,961,966],{"type":70,"value":923},"Pick a stable workspace ",{"type":65,"tag":86,"props":925,"children":927},{"className":926},[],[928],{"type":70,"value":239},{"type":70,"value":930}," for the source file, typically\n",{"type":65,"tag":86,"props":932,"children":934},{"className":933},[],[935],{"type":70,"value":936},"src\u002Fworkflows\u002Fmain.workflow.ts",{"type":70,"value":938}," for a one-off new workflow, or a clearly\nnamed ",{"type":65,"tag":86,"props":940,"children":942},{"className":941},[],[943],{"type":70,"value":944},".workflow.ts",{"type":70,"value":946}," file when multiple source files are useful. For an\nexisting workflow with no source file in context, call\n",{"type":65,"tag":86,"props":948,"children":950},{"className":949},[],[951],{"type":70,"value":133},{"type":70,"value":953},", apply your edit to the\nreturned code, and pass the n8n ",{"type":65,"tag":86,"props":955,"children":957},{"className":956},[],[958],{"type":70,"value":255},{"type":70,"value":960}," only on the first\n",{"type":65,"tag":86,"props":962,"children":964},{"className":963},[],[965],{"type":70,"value":54},{"type":70,"value":967}," call.",{"type":65,"tag":448,"props":969,"children":970},{},[971,973,979,981,986,988,993,995,1000,1002,1007,1009,1015,1017,1022,1024,1030],{"type":70,"value":972},"Produce complete TypeScript SDK code. For a new or fully rewritten source\nfile, do NOT write it with ",{"type":65,"tag":86,"props":974,"children":976},{"className":975},[],[977],{"type":70,"value":978},"workspace_write_file",{"type":70,"value":980}," — pass it directly as\n",{"type":65,"tag":86,"props":982,"children":984},{"className":983},[],[985],{"type":70,"value":125},{"type":70,"value":987}," on the ",{"type":65,"tag":86,"props":989,"children":991},{"className":990},[],[992],{"type":70,"value":54},{"type":70,"value":994}," call (the tool writes ",{"type":65,"tag":86,"props":996,"children":998},{"className":997},[],[999],{"type":70,"value":239},{"type":70,"value":1001}," and\nbuilds in one step; a separate write call wastes a full round-trip). Use\nfile tools only to selectively edit an existing ",{"type":65,"tag":86,"props":1003,"children":1005},{"className":1004},[],[1006],{"type":70,"value":944},{"type":70,"value":1008}," for\nfollow-up changes and repairs. Do not put secrets in the source file.\nBefore building, decide whether verification needs branch fixtures. When a\nlive or nondeterministic upstream node (such as HTTP Request, search\u002Flist\nlookups, weather feeds, or AI classifiers) feeds IF\u002FSwitch logic and\nalternate branches need verification, declare representative ",{"type":65,"tag":86,"props":1010,"children":1012},{"className":1011},[],[1013],{"type":70,"value":1014},"output",{"type":70,"value":1016},"\nfixtures on that upstream node now so ",{"type":65,"tag":86,"props":1018,"children":1020},{"className":1019},[],[1021],{"type":70,"value":59},{"type":70,"value":1023}," can simulate it\nand later ",{"type":65,"tag":86,"props":1025,"children":1027},{"className":1026},[],[1028],{"type":70,"value":1029},"fixtureOverrides",{"type":70,"value":1031}," can exercise those scenarios. Do not simulate\nevery external read by default; use this when branch coverage or deterministic\nproof depends on controlling the upstream data.",{"type":65,"tag":448,"props":1033,"children":1034},{},[1035,1036,1041,1042,1047,1049,1054,1056,1062,1064,1070],{"type":70,"value":849},{"type":65,"tag":86,"props":1037,"children":1039},{"className":1038},[],[1040],{"type":70,"value":54},{"type":70,"value":522},{"type":65,"tag":86,"props":1043,"children":1045},{"className":1044},[],[1046],{"type":70,"value":239},{"type":70,"value":1048}," (plus ",{"type":65,"tag":86,"props":1050,"children":1052},{"className":1051},[],[1053],{"type":70,"value":125},{"type":70,"value":1055}," for new or fully\nrewritten source).\nFor planned build follow-ups where ",{"type":65,"tag":86,"props":1057,"children":1059},{"className":1058},[],[1060],{"type":70,"value":1061},"buildTask.isSupportingWorkflow === true",{"type":70,"value":1063},",\npass ",{"type":65,"tag":86,"props":1065,"children":1067},{"className":1066},[],[1068],{"type":70,"value":1069},"isSupportingWorkflow: true",{"type":70,"value":1071},"; that saved supporting workflow is the\ntask's final deliverable.",{"type":65,"tag":448,"props":1073,"children":1074},{},[1075,1077,1083,1085,1091,1093,1099,1101,1107],{"type":70,"value":1076},"Trace wiring before declaring done. For IF, Switch, Merge, AI-agent, loop, or\nmulti-workflow wiring, trace each branch from source to target. Confirm IF\nbranches are wired on the workflow builder (",{"type":65,"tag":86,"props":1078,"children":1080},{"className":1079},[],[1081],{"type":70,"value":1082},".to(ifNode).onTrue(...).onFalse(...)",{"type":70,"value":1084},"\nor ",{"type":65,"tag":86,"props":1086,"children":1088},{"className":1087},[],[1089],{"type":70,"value":1090},".to(ifNode.onTrue(...).onFalse(...))",{"type":70,"value":1092},"), not as standalone calls on the IF\nnode variable after ",{"type":65,"tag":86,"props":1094,"children":1096},{"className":1095},[],[1097],{"type":70,"value":1098},"export default",{"type":70,"value":1100},". Confirm branch action nodes appear in the\nsaved graph — not just trigger → middle nodes → IF. Confirm the IF node has\nconnections on both outputs (true and false). For escalation flows, confirm\nevery requested side effect is on a wired branch. Switch outputs use zero-based\n",{"type":65,"tag":86,"props":1102,"children":1104},{"className":1103},[],[1105],{"type":70,"value":1106},".onCase(index, target)",{"type":70,"value":1108},", Merge modes match the data shape, and sub-nodes are\nattached to the correct parent.",{"type":65,"tag":448,"props":1110,"children":1111},{},[1112,1114,1119,1121,1126],{"type":70,"value":1113},"Fix errors by editing the same workspace source file and calling\n",{"type":65,"tag":86,"props":1115,"children":1117},{"className":1116},[],[1118],{"type":70,"value":54},{"type":70,"value":1120}," again with the same ",{"type":65,"tag":86,"props":1122,"children":1124},{"className":1123},[],[1125],{"type":70,"value":239},{"type":70,"value":1127},". Save again before any\nverification step.",{"type":65,"tag":448,"props":1129,"children":1130},{},[1131,1133,1138,1140,1145,1147,1152,1154,1159],{"type":70,"value":1132},"Modify existing workflows by editing the workspace ",{"type":65,"tag":86,"props":1134,"children":1136},{"className":1135},[],[1137],{"type":70,"value":944},{"type":70,"value":1139}," source\nfile. If the file was created from ",{"type":65,"tag":86,"props":1141,"children":1143},{"className":1142},[],[1144],{"type":70,"value":224},{"type":70,"value":1146},", pass\nthe real n8n ",{"type":65,"tag":86,"props":1148,"children":1150},{"className":1149},[],[1151],{"type":70,"value":255},{"type":70,"value":1153}," on the first ",{"type":65,"tag":86,"props":1155,"children":1157},{"className":1156},[],[1158],{"type":70,"value":54},{"type":70,"value":1160}," call so the file is\nbound to the saved workflow. Never pass local SDK workflow IDs as n8n\nworkflow IDs.",{"type":65,"tag":448,"props":1162,"children":1163},{},[1164,1166,1171,1173,1179,1181,1187,1189,1194,1196,1201],{"type":70,"value":1165},"After a successful direct ",{"type":65,"tag":86,"props":1167,"children":1169},{"className":1168},[],[1170],{"type":70,"value":54},{"type":70,"value":1172}," result, if the tool output\ncontains ",{"type":65,"tag":86,"props":1174,"children":1176},{"className":1175},[],[1177],{"type":70,"value":1178},"postBuildFlow.required: true",{"type":70,"value":1180},", follow the inlined\n",{"type":65,"tag":86,"props":1182,"children":1184},{"className":1183},[],[1185],{"type":70,"value":1186},"postBuildFlow.instructions",{"type":70,"value":1188}," from that output (do not load ",{"type":65,"tag":86,"props":1190,"children":1192},{"className":1191},[],[1193],{"type":70,"value":594},{"type":70,"value":1195},"\nseparately) before verification, setup, error-workflow follow-up,\npublishing, testing, or any final user-visible summary. Do not call\n",{"type":65,"tag":86,"props":1197,"children":1199},{"className":1198},[],[1200],{"type":70,"value":59},{"type":70,"value":1202}," directly from this skill for direct builds. Finish\nwith a concise completion message only when the post-build flow, required\nsetup routing, or required verification path is complete.",{"type":65,"tag":80,"props":1204,"children":1205},{},[1206],{"type":70,"value":1207},"Do not produce visible output until the final step, unless blocked.",{"type":65,"tag":73,"props":1209,"children":1211},{"id":1210},"verification-contract",[1212],{"type":70,"value":1213},"Verification Contract",{"type":65,"tag":80,"props":1215,"children":1216},{},[1217],{"type":70,"value":1218},"Use the current turn's higher-priority instructions to decide who verifies:",{"type":65,"tag":467,"props":1220,"children":1221},{},[1222,1248,1274],{"type":65,"tag":448,"props":1223,"children":1224},{},[1225,1227,1232,1234,1239,1241,1246],{"type":70,"value":1226},"Direct builds and existing-workflow edits: after ",{"type":65,"tag":86,"props":1228,"children":1230},{"className":1229},[],[1231],{"type":70,"value":54},{"type":70,"value":1233}," succeeds,\nfollow the inlined ",{"type":65,"tag":86,"props":1235,"children":1237},{"className":1236},[],[1238],{"type":70,"value":1186},{"type":70,"value":1240}," when\n",{"type":65,"tag":86,"props":1242,"children":1244},{"className":1243},[],[1245],{"type":70,"value":1178},{"type":70,"value":1247}," is present in the tool output. Those\ninstructions own verification, setup routing, error-workflow opt-in, and\nfinal user-visible completion for direct builds.",{"type":65,"tag":448,"props":1249,"children":1250},{},[1251,1253,1258,1259,1264,1266,1272],{"type":70,"value":1252},"Checkpoint follow-ups: verify with ",{"type":65,"tag":86,"props":1254,"children":1256},{"className":1255},[],[1257],{"type":70,"value":59},{"type":70,"value":530},{"type":65,"tag":86,"props":1260,"children":1262},{"className":1261},[],[1263],{"type":70,"value":60},{"type":70,"value":1265}," and\nreport once with ",{"type":65,"tag":86,"props":1267,"children":1269},{"className":1268},[],[1270],{"type":70,"value":1271},"complete-checkpoint",{"type":70,"value":1273},".",{"type":65,"tag":448,"props":1275,"children":1276},{},[1277,1279,1284],{"type":70,"value":1278},"Planned build follow-ups that explicitly say to stop after save: stop after a\nsuccessful ",{"type":65,"tag":86,"props":1280,"children":1282},{"className":1281},[],[1283],{"type":70,"value":54},{"type":70,"value":1285},". The checkpoint task owns verification.",{"type":65,"tag":80,"props":1287,"children":1288},{},[1289,1291,1296,1298,1303],{"type":70,"value":1290},"Build\u002Fsave success is not workflow-quality evidence. When this turn is\nresponsible for verification or repair, inspect the persisted workflow\n(",{"type":65,"tag":86,"props":1292,"children":1294},{"className":1293},[],[1295],{"type":70,"value":133},{"type":70,"value":1297}," or the bound workspace source\nfile) before reporting a verdict, judging the saved graph against the user's\nrequested outcome — not a hidden service-specific checklist. If it is a\ndraft, misses the outcome, or the evidence is weak, edit the same source file,\nrebuild with the same ",{"type":65,"tag":86,"props":1299,"children":1301},{"className":1300},[],[1302],{"type":70,"value":239},{"type":70,"value":1304},", then inspect and verify again.",{"type":65,"tag":80,"props":1306,"children":1307},{},[1308,1310,1316,1318,1323,1324,1329],{"type":70,"value":1309},"Never tell the user a workflow is fixed, verified, tested, or working from a\nbuild\u002Fsave or static ",{"type":65,"tag":86,"props":1311,"children":1313},{"className":1312},[],[1314],{"type":70,"value":1315},"validate",{"type":70,"value":1317}," alone — only from a ",{"type":65,"tag":86,"props":1319,"children":1321},{"className":1320},[],[1322],{"type":70,"value":59},{"type":70,"value":1084},{"type":65,"tag":86,"props":1325,"children":1327},{"className":1326},[],[1328],{"type":70,"value":60},{"type":70,"value":1330}," run that exercised the claimed path; otherwise say explicitly\nwhat you could not verify and why. Never dismiss a live execution error as a\nharness or stale-state artifact without re-running.",{"type":65,"tag":80,"props":1332,"children":1333},{},[1334],{"type":70,"value":1335},"When this turn is responsible for verification, do not stop after a successful\nsave. The job is done when one of these is true:",{"type":65,"tag":467,"props":1337,"children":1338},{},[1339,1344,1356,1368],{"type":65,"tag":448,"props":1340,"children":1341},{},[1342],{"type":70,"value":1343},"The workflow is verified by structured tool evidence.",{"type":65,"tag":448,"props":1345,"children":1346},{},[1347,1349,1354],{"type":70,"value":1348},"Setup is required and ",{"type":65,"tag":86,"props":1350,"children":1352},{"className":1351},[],[1353],{"type":70,"value":423},{"type":70,"value":1355}," has been routed or deferred.",{"type":65,"tag":448,"props":1357,"children":1358},{},[1359,1361,1367],{"type":70,"value":1360},"A remediation guard says ",{"type":65,"tag":86,"props":1362,"children":1364},{"className":1363},[],[1365],{"type":70,"value":1366},"shouldEdit: false",{"type":70,"value":1273},{"type":65,"tag":448,"props":1369,"children":1370},{},[1371],{"type":70,"value":1372},"You are blocked after one repair attempt per unique failure signature.",{"type":65,"tag":80,"props":1374,"children":1375},{},[1376,1378,1383,1385,1390,1392,1397,1399,1405,1407,1412,1414,1420],{"type":70,"value":1377},"Prefer ",{"type":65,"tag":86,"props":1379,"children":1381},{"className":1380},[],[1382],{"type":70,"value":59},{"type":70,"value":1384}," for workflows saved by ",{"type":65,"tag":86,"props":1386,"children":1388},{"className":1387},[],[1389],{"type":70,"value":54},{"type":70,"value":1391},"; it can\nbe called again with ",{"type":65,"tag":86,"props":1393,"children":1395},{"className":1394},[],[1396],{"type":70,"value":255},{"type":70,"value":1398}," if the original ",{"type":65,"tag":86,"props":1400,"children":1402},{"className":1401},[],[1403],{"type":70,"value":1404},"workItemId",{"type":70,"value":1406}," is no longer in\ncontext. For alternate deterministic scenarios, pass ",{"type":65,"tag":86,"props":1408,"children":1410},{"className":1409},[],[1411],{"type":70,"value":1029},{"type":70,"value":1413}," for\nnodes already classified as simulated. Use raw ",{"type":65,"tag":86,"props":1415,"children":1417},{"className":1416},[],[1418],{"type":70,"value":1419},"executions(action=\"run\")",{"type":70,"value":1421}," only\nfor ad hoc non-build verification or when the user explicitly wants a live run.\nIf live connectivity also matters for a branch-controlled workflow, verify the\nfixture-backed branch coverage first and run a separate live smoke check, or\nstate exactly which branch remains unverified.",{"type":65,"tag":80,"props":1423,"children":1424},{},[1425,1427,1433,1435,1440,1442,1447,1449,1455,1457,1463,1465,1471],{"type":70,"value":1426},"Trigger ",{"type":65,"tag":86,"props":1428,"children":1430},{"className":1429},[],[1431],{"type":70,"value":1432},"inputData",{"type":70,"value":1434}," shapes: follow the per-trigger guidance on the\n",{"type":65,"tag":86,"props":1436,"children":1438},{"className":1437},[],[1439],{"type":70,"value":59},{"type":70,"value":1441}," tool's ",{"type":65,"tag":86,"props":1443,"children":1445},{"className":1444},[],[1446],{"type":70,"value":1432},{"type":70,"value":1448}," field (flat field map for Form —\nnever ",{"type":65,"tag":86,"props":1450,"children":1452},{"className":1451},[],[1453],{"type":70,"value":1454},"formFields",{"type":70,"value":1456},"; body payload for Webhook — expressions read\n",{"type":65,"tag":86,"props":1458,"children":1460},{"className":1459},[],[1461],{"type":70,"value":1462},"$json.body.\u003Cfield>",{"type":70,"value":1464},"; ",{"type":65,"tag":86,"props":1466,"children":1468},{"className":1467},[],[1469],{"type":70,"value":1470},"{ \"chatInput\": ... }",{"type":70,"value":1472}," for Chat; omit for Schedule;\ntrigger-shaped payloads for other event triggers).",{"type":65,"tag":80,"props":1474,"children":1475},{},[1476,1478,1483,1485,1491,1493,1498,1499,1504],{"type":70,"value":1477},"If verification returns remediation with ",{"type":65,"tag":86,"props":1479,"children":1481},{"className":1480},[],[1482],{"type":70,"value":1366},{"type":70,"value":1484},", stop editing and\nfollow its guidance. If verification fails with ",{"type":65,"tag":86,"props":1486,"children":1488},{"className":1487},[],[1489],{"type":70,"value":1490},"shouldEdit: true",{"type":70,"value":1492},", make one\nbatched source-file repair, call ",{"type":65,"tag":86,"props":1494,"children":1496},{"className":1495},[],[1497],{"type":70,"value":54},{"type":70,"value":298},{"type":65,"tag":86,"props":1500,"children":1502},{"className":1501},[],[1503],{"type":70,"value":239},{"type":70,"value":1505},", and retry within the repair budget. If a failure repeats, stop and\nexplain the blocker.",{"type":65,"tag":80,"props":1507,"children":1508},{},[1509],{"type":70,"value":1510},"Do not publish the main workflow automatically. Publishing is the user's\ndecision after testing.",{"type":65,"tag":73,"props":1512,"children":1514},{"id":1513},"credential-rules",[1515],{"type":70,"value":1516},"Credential Rules",{"type":65,"tag":467,"props":1518,"children":1519},{},[1520,1563,1583,1619,1639,1667,1709,1722],{"type":65,"tag":448,"props":1521,"children":1522},{},[1523,1524,1530,1532,1538,1539,1545,1547,1553,1555,1561],{"type":70,"value":849},{"type":65,"tag":86,"props":1525,"children":1527},{"className":1526},[],[1528],{"type":70,"value":1529},"credentials(action=\"list\")",{"type":70,"value":1531}," early when the task touches external\nservices; note each credential's ",{"type":65,"tag":86,"props":1533,"children":1535},{"className":1534},[],[1536],{"type":70,"value":1537},"id",{"type":70,"value":409},{"type":65,"tag":86,"props":1540,"children":1542},{"className":1541},[],[1543],{"type":70,"value":1544},"name",{"type":70,"value":1546},", and ",{"type":65,"tag":86,"props":1548,"children":1550},{"className":1549},[],[1551],{"type":70,"value":1552},"type",{"type":70,"value":1554}," (the credential\nkey, e.g. ",{"type":65,"tag":86,"props":1556,"children":1558},{"className":1557},[],[1559],{"type":70,"value":1560},"slackApi",{"type":70,"value":1562},", comes from the node type definition).",{"type":65,"tag":448,"props":1564,"children":1565},{},[1566,1567,1573,1575,1581],{"type":70,"value":385},{"type":65,"tag":86,"props":1568,"children":1570},{"className":1569},[],[1571],{"type":70,"value":1572},"newCredential('Credential Name', 'credential-id')",{"type":70,"value":1574}," only when the user\nselected a specific credential, exactly one unambiguous match exists, or the\nworkflow already had it. Otherwise use ",{"type":65,"tag":86,"props":1576,"children":1578},{"className":1577},[],[1579],{"type":70,"value":1580},"newCredential('Suggested Credential Name')",{"type":70,"value":1582}," — build tools mock unresolved credentials for verification and setup\ncollects real ones later.",{"type":65,"tag":448,"props":1584,"children":1585},{},[1586,1588,1593,1595,1601,1603,1609,1611,1617],{"type":70,"value":1587},"When ",{"type":65,"tag":86,"props":1589,"children":1591},{"className":1590},[],[1592],{"type":70,"value":54},{"type":70,"value":1594}," returns ",{"type":65,"tag":86,"props":1596,"children":1598},{"className":1597},[],[1599],{"type":70,"value":1600},"resolvedCredentialsByNode",{"type":70,"value":1602},", the build already\nattached a credential to those nodes — either an existing stored credential or\nan n8n credits–managed one (entries with ",{"type":65,"tag":86,"props":1604,"children":1606},{"className":1605},[],[1607],{"type":70,"value":1608},"id: null",{"type":70,"value":1610}," and ",{"type":65,"tag":86,"props":1612,"children":1614},{"className":1613},[],[1615],{"type":70,"value":1616},"__aiGatewayManaged: true",{"type":70,"value":1618},"). Treat them all as connected: do not ask the user to connect or create\nthose credentials, do not route them to credential setup, and mention at most\nthat the credential (or n8n credits) is being used.",{"type":65,"tag":448,"props":1620,"children":1621},{},[1622,1624,1630,1632,1637],{"type":70,"value":1623},"Never use raw credential objects like ",{"type":65,"tag":86,"props":1625,"children":1627},{"className":1626},[],[1628],{"type":70,"value":1629},"{ id: '...', name: '...' }",{"type":70,"value":1631}," in SDK\ncode; replace them with ",{"type":65,"tag":86,"props":1633,"children":1635},{"className":1634},[],[1636],{"type":70,"value":336},{"type":70,"value":1638}," when editing roundtripped code.",{"type":65,"tag":448,"props":1640,"children":1641},{},[1642,1644,1650,1652,1658,1660,1666],{"type":70,"value":1643},"If a required credential type is not listed, call\n",{"type":65,"tag":86,"props":1645,"children":1647},{"className":1646},[],[1648],{"type":70,"value":1649},"credentials(action=\"search-types\")",{"type":70,"value":1651}," with the service name. Prefer dedicated\ncredential types over generic auth; when generic auth is truly needed,\nprefer ",{"type":65,"tag":86,"props":1653,"children":1655},{"className":1654},[],[1656],{"type":70,"value":1657},"httpBearerAuth",{"type":70,"value":1659}," over ",{"type":65,"tag":86,"props":1661,"children":1663},{"className":1662},[],[1664],{"type":70,"value":1665},"httpHeaderAuth",{"type":70,"value":1273},{"type":65,"tag":448,"props":1668,"children":1669},{},[1670,1676,1678,1684,1686,1692,1694,1699,1701,1707],{"type":65,"tag":86,"props":1671,"children":1673},{"className":1672},[],[1674],{"type":70,"value":1675},"credentials(action=\"list\", type=...)",{"type":70,"value":1677}," may include a synthetic n8n credits\nentry ",{"type":65,"tag":86,"props":1679,"children":1681},{"className":1680},[],[1682],{"type":70,"value":1683},"{ id: null, name: \"n8n credits\", type, __aiGatewayManaged: true }",{"type":70,"value":1685},"\nwhen the type is covered by n8n credits (see n8n credits Preference). It is\nnot a stored credential: never pass it to ",{"type":65,"tag":86,"props":1687,"children":1689},{"className":1688},[],[1690],{"type":70,"value":1691},"newCredential(...)",{"type":70,"value":1693}," and never\nemit ",{"type":65,"tag":86,"props":1695,"children":1697},{"className":1696},[],[1698],{"type":70,"value":1608},{"type":70,"value":1700}," or the ",{"type":65,"tag":86,"props":1702,"children":1704},{"className":1703},[],[1705],{"type":70,"value":1706},"__aiGatewayManaged",{"type":70,"value":1708}," marker in SDK output. Setup\napplies it automatically when the user has no stored credential of that type.",{"type":65,"tag":448,"props":1710,"children":1711},{},[1712,1714,1720],{"type":70,"value":1713},"These rules apply to outbound service calls. Inbound trigger nodes (Webhook,\nForm, Chat, MCP Trigger) keep authentication at its default ",{"type":65,"tag":86,"props":1715,"children":1717},{"className":1716},[],[1718],{"type":70,"value":1719},"none",{"type":70,"value":1721}," unless\nthe user explicitly asks to authenticate inbound traffic.",{"type":65,"tag":448,"props":1723,"children":1724},{},[1725,1727,1732],{"type":70,"value":1726},"Always declare ",{"type":65,"tag":86,"props":1728,"children":1730},{"className":1729},[],[1731],{"type":70,"value":1014},{"type":70,"value":1733}," on nodes that use unresolved credentials when mock\ndata is needed for verification.",{"type":65,"tag":73,"props":1735,"children":1737},{"id":1736},"n8n-credits-preference",[1738],{"type":70,"value":1739},"n8n credits Preference",{"type":65,"tag":80,"props":1741,"children":1742},{},[1743],{"type":70,"value":1744},"\"n8n credits\" is the user-facing name of n8n's managed credential\nservice. On instances licensed for it, several common AI-provider and\nscraping nodes can run with no API key required on the user's side.",{"type":65,"tag":80,"props":1746,"children":1747},{},[1748,1753,1755,1760,1762,1768,1770,1776,1778,1784,1786,1792,1794,1800],{"type":65,"tag":436,"props":1749,"children":1750},{},[1751],{"type":70,"value":1752},"Discovery (while building):",{"type":70,"value":1754}," ",{"type":65,"tag":86,"props":1756,"children":1758},{"className":1757},[],[1759],{"type":70,"value":842},{"type":70,"value":1761}," and\n",{"type":65,"tag":86,"props":1763,"children":1765},{"className":1764},[],[1766],{"type":70,"value":1767},"nodes(action=\"describe\")",{"type":70,"value":1769}," results carry an ",{"type":65,"tag":86,"props":1771,"children":1773},{"className":1772},[],[1774],{"type":70,"value":1775},"aiGateway",{"type":70,"value":1777}," field on covered nodes\n— no separate lookup needed. When ",{"type":65,"tag":86,"props":1779,"children":1781},{"className":1780},[],[1782],{"type":70,"value":1783},"aiGateway.supported === true",{"type":70,"value":1785},", prefer that\nnode over comparable alternatives ",{"type":65,"tag":1787,"props":1788,"children":1789},"em",{},[1790],{"type":70,"value":1791},"when the user has not named a specific tool\nand has no usable credential for a comparable one",{"type":70,"value":1793}," — it runs with no API key.\nKeep your normal ",{"type":65,"tag":86,"props":1795,"children":1797},{"className":1796},[],[1798],{"type":70,"value":1799},"suggested",{"type":70,"value":1801},"\u002Fsearch pick when the user already has a credential\nfor a comparable tool.",{"type":65,"tag":80,"props":1803,"children":1804},{},[1805,1807,1812,1814,1819,1821,1827],{"type":70,"value":1806},"The ",{"type":65,"tag":86,"props":1808,"children":1810},{"className":1809},[],[1811],{"type":70,"value":1799},{"type":70,"value":1813}," list and search ",{"type":65,"tag":1787,"props":1815,"children":1816},{},[1817],{"type":70,"value":1818},"rank",{"type":70,"value":1820}," don't prioritize n8n credits coverage\n(individual search results still flag it). When the user asks for a capability\nthey have no usable credential for, search that\ncapability — or run ",{"type":65,"tag":86,"props":1822,"children":1824},{"className":1823},[],[1825],{"type":70,"value":1826},"nodes(action=\"list\", n8nConnectOnly=true)",{"type":70,"value":1828}," — before\ncommitting, and prefer a covered result.",{"type":65,"tag":80,"props":1830,"children":1831},{},[1832],{"type":70,"value":1833},"Respect the constraints it reports:",{"type":65,"tag":467,"props":1835,"children":1836},{},[1837,1850,1894],{"type":65,"tag":448,"props":1838,"children":1839},{},[1840,1842,1848],{"type":70,"value":1841},"Set ",{"type":65,"tag":86,"props":1843,"children":1845},{"className":1844},[],[1846],{"type":70,"value":1847},"typeVersion >= aiGateway.minVersion",{"type":70,"value":1849}," when present.",{"type":65,"tag":448,"props":1851,"children":1852},{},[1853,1855,1861,1863,1869,1871,1877,1879,1885,1887,1893],{"type":70,"value":1854},"Constrain ",{"type":65,"tag":86,"props":1856,"children":1858},{"className":1857},[],[1859],{"type":70,"value":1860},"resource",{"type":70,"value":1862}," \u002F ",{"type":65,"tag":86,"props":1864,"children":1866},{"className":1865},[],[1867],{"type":70,"value":1868},"operation",{"type":70,"value":1870}," to entries in ",{"type":65,"tag":86,"props":1872,"children":1874},{"className":1873},[],[1875],{"type":70,"value":1876},"aiGateway.operations",{"type":70,"value":1878}," —\na ",{"type":65,"tag":86,"props":1880,"children":1882},{"className":1881},[],[1883],{"type":70,"value":1884},"Record\u003Cresource, operation[]>",{"type":70,"value":1886}," map; nodes without a resource dimension\nuse the marker key ",{"type":65,"tag":86,"props":1888,"children":1890},{"className":1889},[],[1891],{"type":70,"value":1892},"__operation_only__",{"type":70,"value":1273},{"type":65,"tag":448,"props":1895,"children":1896},{},[1897,1899,1905],{"type":70,"value":1898},"Do not set parameters listed in ",{"type":65,"tag":86,"props":1900,"children":1902},{"className":1901},[],[1903],{"type":70,"value":1904},"aiGateway.hiddenProperties",{"type":70,"value":1273},{"type":65,"tag":80,"props":1907,"children":1908},{},[1909],{"type":65,"tag":436,"props":1910,"children":1911},{},[1912],{"type":70,"value":1913},"Enumeration (answering \"what does n8n credits support?\"):",{"type":65,"tag":467,"props":1915,"children":1916},{},[1917,1936,1948],{"type":65,"tag":448,"props":1918,"children":1919},{},[1920,1922,1927,1929,1934],{"type":70,"value":1921},"All supported nodes: ",{"type":65,"tag":86,"props":1923,"children":1925},{"className":1924},[],[1926],{"type":70,"value":1826},{"type":70,"value":1928}," — each\nresult carries the full ",{"type":65,"tag":86,"props":1930,"children":1932},{"className":1931},[],[1933],{"type":70,"value":1775},{"type":70,"value":1935}," field (minVersion, operations,\nhiddenProperties).",{"type":65,"tag":448,"props":1937,"children":1938},{},[1939,1941,1947],{"type":70,"value":1940},"All supported credential types:\n",{"type":65,"tag":86,"props":1942,"children":1944},{"className":1943},[],[1945],{"type":70,"value":1946},"credentials(action=\"search-types\", n8nConnectOnly=true)",{"type":70,"value":1273},{"type":65,"tag":448,"props":1949,"children":1950},{},[1951,1953,1959,1961,1966],{"type":70,"value":1952},"Operations for a specific supported node: ",{"type":65,"tag":86,"props":1954,"children":1956},{"className":1955},[],[1957],{"type":70,"value":1958},"nodes(action=\"describe\", …)",{"type":70,"value":1960},"\n→ ",{"type":65,"tag":86,"props":1962,"children":1964},{"className":1963},[],[1965],{"type":70,"value":1876},{"type":70,"value":1273},{"type":65,"tag":80,"props":1968,"children":1969},{},[1970,1975,1977,1982],{"type":65,"tag":436,"props":1971,"children":1972},{},[1973],{"type":70,"value":1974},"Preference rule:",{"type":70,"value":1976}," When adding a new node that has no credential assigned\nyet, prefer n8n credits over stored credentials if the credential type is\nsupported — it works with no API key required and avoids spending the user's\nAPI quota. The synthetic entry in ",{"type":65,"tag":86,"props":1978,"children":1980},{"className":1979},[],[1981],{"type":70,"value":1675},{"type":70,"value":1983}," (see\nCredential Rules) is your signal that a type is covered. Do not change\ncredentials on nodes that already have one assigned (editing an existing\nworkflow, or after the user has made a credential choice).",{"type":65,"tag":467,"props":1985,"children":1986},{},[1987,1992],{"type":65,"tag":448,"props":1988,"children":1989},{},[1990],{"type":70,"value":1991},"If the user explicitly specified their own credential (by name or by\nchoosing one from a list), use that credential and do not substitute\nn8n credits.",{"type":65,"tag":448,"props":1993,"children":1994},{},[1995,1997,2002],{"type":70,"value":1996},"When speaking to the user in chat, always refer to this feature as\n\"n8n credits\" — never \"n8n Connect\", \"AI Gateway\", or \"gateway\". Those are\ninternal names only, including the ",{"type":65,"tag":86,"props":1998,"children":2000},{"className":1999},[],[2001],{"type":70,"value":1775},{"type":70,"value":2003}," field on node\u002Fcredential\nresults: read it to make decisions, but never surface that name to the user.",{"type":65,"tag":73,"props":2005,"children":2007},{"id":2006},"missing-resources",[2008],{"type":70,"value":2009},"Missing Resources",{"type":65,"tag":80,"props":2011,"children":2012},{},[2013,2014,2019],{"type":70,"value":1587},{"type":65,"tag":86,"props":2015,"children":2017},{"className":2016},[],[2018],{"type":70,"value":399},{"type":70,"value":2020}," returns no results for a required\nresource:",{"type":65,"tag":444,"props":2022,"children":2023},{},[2024,2037,2042],{"type":65,"tag":448,"props":2025,"children":2026},{},[2027,2029,2035],{"type":70,"value":2028},"If the resource can be represented as a user choice, use\n",{"type":65,"tag":86,"props":2030,"children":2032},{"className":2031},[],[2033],{"type":70,"value":2034},"placeholder('Select \u003Cresource>')",{"type":70,"value":2036}," and let setup collect it after the build.",{"type":65,"tag":448,"props":2038,"children":2039},{},[2040],{"type":70,"value":2041},"If the user explicitly asked you to create the resource and the node type\ndefinition has a safe create operation, build and verify that\nresource-creation workflow as part of the requested work.",{"type":65,"tag":448,"props":2043,"children":2044},{},[2045],{"type":70,"value":2046},"Otherwise, leave the main workflow as a saved draft and mention the missing\nresource in the one-line completion summary.",{"type":65,"tag":80,"props":2048,"children":2049},{},[2050],{"type":70,"value":2051},"For resources that cannot be created via n8n, explain clearly what the user\nneeds to create manually and what ID or value belongs in setup.",{"type":65,"tag":80,"props":2053,"children":2054},{},[2055],{"type":70,"value":2056},"If part of the requested workflow is infeasible, apply the Capability Honesty\nrules: never quietly substitute a stand-in as the requested capability — flag\nit as an approximation (including unverified region\u002Fuse-case coverage) and\nname the gap in the one-line completion summary.",{"type":65,"tag":73,"props":2058,"children":2060},{"id":2059},"compositional-workflows",[2061],{"type":70,"value":2062},"Compositional Workflows",{"type":65,"tag":80,"props":2064,"children":2065},{},[2066,2068,2074,2076,2081,2083,2089,2091,2097,2099,2104,2106,2112],{"type":70,"value":2067},"Only for large workflows with reusable chunks or independently testable parts:\ndecompose into supporting sub-workflows (",{"type":65,"tag":86,"props":2069,"children":2071},{"className":2070},[],[2072],{"type":70,"value":2073},"executeWorkflowTrigger",{"type":70,"value":2075}," v1.1 with an\nexplicit input schema, built with ",{"type":65,"tag":86,"props":2077,"children":2079},{"className":2078},[],[2080],{"type":70,"value":1069},{"type":70,"value":2082},") referenced from\nthe main workflow's ",{"type":65,"tag":86,"props":2084,"children":2086},{"className":2085},[],[2087],{"type":70,"value":2088},"executeWorkflow",{"type":70,"value":2090}," node (",{"type":65,"tag":86,"props":2092,"children":2094},{"className":2093},[],[2095],{"type":70,"value":2096},"source: 'database'",{"type":70,"value":2098},", real returned\n",{"type":65,"tag":86,"props":2100,"children":2102},{"className":2101},[],[2103],{"type":70,"value":255},{"type":70,"value":2105},"), main workflow saved last. This is part of the approved build\ntask — not a reason to create a new plan, and simple\nworkflows stay in one workflow. Before writing multi-workflow code, load this\nskill's ",{"type":65,"tag":86,"props":2107,"children":2109},{"className":2108},[],[2110],{"type":70,"value":2111},"references\u002Fcompositional-workflows.md",{"type":70,"value":2113}," linked file for the required\nsteps and SDK examples.",{"type":65,"tag":73,"props":2115,"children":2116},{"id":57},[2117],{"type":70,"value":2118},"Data Tables",{"type":65,"tag":80,"props":2120,"children":2121},{},[2122,2124,2130,2132,2138,2140,2146],{"type":70,"value":2123},"n8n normalizes Data Table column names to snake_case, for example ",{"type":65,"tag":86,"props":2125,"children":2127},{"className":2126},[],[2128],{"type":70,"value":2129},"dayName",{"type":70,"value":2131},"\nbecomes ",{"type":65,"tag":86,"props":2133,"children":2135},{"className":2134},[],[2136],{"type":70,"value":2137},"day_name",{"type":70,"value":2139},". Always call ",{"type":65,"tag":86,"props":2141,"children":2143},{"className":2142},[],[2144],{"type":70,"value":2145},"data-tables(action=\"schema\")",{"type":70,"value":2147}," before using a\nData Table in workflow code so you use real column names.",{"type":65,"tag":80,"props":2149,"children":2150},{},[2151,2153,2158,2160,2165,2167,2172],{"type":70,"value":2152},"When building workflows that create or use tables, load ",{"type":65,"tag":86,"props":2154,"children":2156},{"className":2155},[],[2157],{"type":70,"value":91},{"type":70,"value":2159},"\nvia ",{"type":65,"tag":86,"props":2161,"children":2163},{"className":2162},[],[2164],{"type":70,"value":192},{"type":70,"value":2166}," first (if not already loaded this turn), then follow that\nskill for schema\u002Frow guidance. Create or inspect tables directly with\n",{"type":65,"tag":86,"props":2168,"children":2170},{"className":2169},[],[2171],{"type":70,"value":57},{"type":70,"value":2173},"; do not invent table IDs, table names, or column names.",{"type":65,"tag":80,"props":2175,"children":2176},{},[2177,2179,2185],{"type":70,"value":2178},"When the ask is a summary, digest, or report over a period (\"weekly summary of\nwhat was recorded\", \"digest of this week's rows\"), the summary branch must\nread that period's rows back from where the workflow logs them (Data Table,\nsheet, store) and build its content from those rows — reusing only the current\nrun's in-memory data produces a single-run report mislabeled as a period\nsummary. Drive the cadence from the schedule or a stored last-sent timestamp,\nnever from ",{"type":65,"tag":86,"props":2180,"children":2182},{"className":2181},[],[2183],{"type":70,"value":2184},"$now.weekday == N",{"type":70,"value":2186},", which silently no-ops on other days.",{"type":65,"tag":73,"props":2188,"children":2190},{"id":2189},"sdk-code-rules",[2191],{"type":70,"value":2192},"SDK Code Rules",{"type":65,"tag":467,"props":2194,"children":2195},{},[2196,2261,2295,2305,2324,2329,2357,2369,2394,2407,2426,2530,2542,2603,2623,2644],{"type":65,"tag":448,"props":2197,"children":2198},{},[2199,2201,2207,2208,2214,2216,2222,2224,2230,2231,2237,2238,2244,2246,2252,2254,2260],{"type":70,"value":2200},"SDK builder code is a restricted subset of TypeScript that builds a static\ngraph; it is not a Code node and does not run. Only SDK builder methods chain\non SDK objects. Native array\u002Fstring methods (",{"type":65,"tag":86,"props":2202,"children":2204},{"className":2203},[],[2205],{"type":70,"value":2206},".join()",{"type":70,"value":409},{"type":65,"tag":86,"props":2209,"children":2211},{"className":2210},[],[2212],{"type":70,"value":2213},".map()",{"type":70,"value":2215},"), loops, arrow\nfunctions, ",{"type":65,"tag":86,"props":2217,"children":2219},{"className":2218},[],[2220],{"type":70,"value":2221},"new",{"type":70,"value":2223},", and globals like ",{"type":65,"tag":86,"props":2225,"children":2227},{"className":2226},[],[2228],{"type":70,"value":2229},"Math",{"type":70,"value":409},{"type":65,"tag":86,"props":2232,"children":2234},{"className":2233},[],[2235],{"type":70,"value":2236},"Date",{"type":70,"value":1546},{"type":65,"tag":86,"props":2239,"children":2241},{"className":2240},[],[2242],{"type":70,"value":2243},"Object",{"type":70,"value":2245}," are\nunavailable. Build strings with template literals or explicit lines; do runtime\njoining, aggregation, or transforms in a Code node or an n8n expression\n(",{"type":65,"tag":86,"props":2247,"children":2249},{"className":2248},[],[2250],{"type":70,"value":2251},"expr()",{"type":70,"value":2253},"). Full allowed\u002Fforbidden list:\n",{"type":65,"tag":86,"props":2255,"children":2257},{"className":2256},[],[2258],{"type":70,"value":2259},"knowledge-base\u002Freference\u002Fworkflow-sdk-language.md",{"type":70,"value":1273},{"type":65,"tag":448,"props":2262,"children":2263},{},[2264,2266,2272,2273,2279,2280,2286,2287,2293],{"type":70,"value":2265},"Code nodes have NO network access at runtime: ",{"type":65,"tag":86,"props":2267,"children":2269},{"className":2268},[],[2270],{"type":70,"value":2271},"fetch()",{"type":70,"value":409},{"type":65,"tag":86,"props":2274,"children":2276},{"className":2275},[],[2277],{"type":70,"value":2278},"axios",{"type":70,"value":582},{"type":65,"tag":86,"props":2281,"children":2283},{"className":2282},[],[2284],{"type":70,"value":2285},"XMLHttpRequest",{"type":70,"value":1546},{"type":65,"tag":86,"props":2288,"children":2290},{"className":2289},[],[2291],{"type":70,"value":2292},"require",{"type":70,"value":2294}," of http modules all fail in the sandbox. Make\nevery HTTP\u002FAPI call with the HTTP Request node and transform its output in a\nCode node, even when the user asks to fetch inside a Code node.",{"type":65,"tag":448,"props":2296,"children":2297},{},[2298,2299,2304],{"type":70,"value":385},{"type":65,"tag":86,"props":2300,"children":2302},{"className":2301},[],[2303],{"type":70,"value":104},{"type":70,"value":1273},{"type":65,"tag":448,"props":2306,"children":2307},{},[2308,2314,2316,2322],{"type":65,"tag":86,"props":2309,"children":2311},{"className":2310},[],[2312],{"type":70,"value":2313},"export default workflow(...)...",{"type":70,"value":2315}," must be the last statement in the file, with\nall wiring composed inside that chain. Statements after it (e.g.\n",{"type":65,"tag":86,"props":2317,"children":2319},{"className":2318},[],[2320],{"type":70,"value":2321},"ifNode.onTrue(...)",{"type":70,"value":2323},") do not reach the builder and their nodes are dropped.",{"type":65,"tag":448,"props":2325,"children":2326},{},[2327],{"type":70,"value":2328},"Do not specify node positions. They are auto-calculated by the layout engine.",{"type":65,"tag":448,"props":2330,"children":2331},{},[2332,2333,2339,2341,2347,2349,2355],{"type":70,"value":385},{"type":65,"tag":86,"props":2334,"children":2336},{"className":2335},[],[2337],{"type":70,"value":2338},"expr('{{ $json.field }}')",{"type":70,"value":2340}," for n8n expressions. Variables must be inside\n",{"type":65,"tag":86,"props":2342,"children":2344},{"className":2343},[],[2345],{"type":70,"value":2346},"{{ }}",{"type":70,"value":2348},". ",{"type":65,"tag":86,"props":2350,"children":2352},{"className":2351},[],[2353],{"type":70,"value":2354},"$json",{"type":70,"value":2356}," is only the current item from the immediate predecessor.",{"type":65,"tag":448,"props":2358,"children":2359},{},[2360,2362,2368],{"type":70,"value":2361},"Do not use TypeScript-only syntax that the workflow parser cannot interpret,\nsuch as ",{"type":65,"tag":86,"props":2363,"children":2365},{"className":2364},[],[2366],{"type":70,"value":2367},"as const",{"type":70,"value":1273},{"type":65,"tag":448,"props":2370,"children":2371},{},[2372,2374,2379,2380,2385,2387,2393],{"type":70,"value":2373},"Use string values directly for discriminator fields like ",{"type":65,"tag":86,"props":2375,"children":2377},{"className":2376},[],[2378],{"type":70,"value":1860},{"type":70,"value":1761},{"type":65,"tag":86,"props":2381,"children":2383},{"className":2382},[],[2384],{"type":70,"value":1868},{"type":70,"value":2386},", for example ",{"type":65,"tag":86,"props":2388,"children":2390},{"className":2389},[],[2391],{"type":70,"value":2392},"resource: 'message'",{"type":70,"value":1273},{"type":65,"tag":448,"props":2395,"children":2396},{},[2397,2399,2405],{"type":70,"value":2398},"When editing a pre-loaded workflow, remove ",{"type":65,"tag":86,"props":2400,"children":2402},{"className":2401},[],[2403],{"type":70,"value":2404},"position",{"type":70,"value":2406}," arrays from node\nconfigs; they are auto-calculated.",{"type":65,"tag":448,"props":2408,"children":2409},{},[2410,2411,2417,2419,2424],{"type":70,"value":385},{"type":65,"tag":86,"props":2412,"children":2414},{"className":2413},[],[2415],{"type":70,"value":2416},"placeholder('hint')",{"type":70,"value":2418}," directly as the parameter value. Do not wrap\nplaceholders in ",{"type":65,"tag":86,"props":2420,"children":2422},{"className":2421},[],[2423],{"type":70,"value":2251},{"type":70,"value":2425},", objects, or arrays unless the node definition\nexplicitly expects an object and the placeholder is the direct value of one\nfield.",{"type":65,"tag":448,"props":2427,"children":2428},{},[2429,2431,2437,2439,2445,2447,2453,2455,2461,2463,2468,2470,2476,2478,2484,2486,2492,2494,2499,2501,2506,2508,2513,2515,2521,2523,2528],{"type":70,"value":2430},"For unresolved resource-locator fields (",{"type":65,"tag":86,"props":2432,"children":2434},{"className":2433},[],[2435],{"type":70,"value":2436},"{ __rl: true, mode, value }",{"type":70,"value":2438}," —\nSlack channel \u002F Sheets document selectors), use the locator object, never a\nraw ",{"type":65,"tag":86,"props":2440,"children":2442},{"className":2441},[],[2443],{"type":70,"value":2444},"placeholder()",{"type":70,"value":2446}," string. When the user names the resource\n(",{"type":65,"tag":86,"props":2448,"children":2450},{"className":2449},[],[2451],{"type":70,"value":2452},"#team-updates",{"type":70,"value":2454},", a sheet title) or you assumed a name (",{"type":65,"tag":86,"props":2456,"children":2458},{"className":2457},[],[2459],{"type":70,"value":2460},"Sheet1",{"type":70,"value":2462},"), use ",{"type":65,"tag":86,"props":2464,"children":2466},{"className":2465},[],[2467],{"type":70,"value":1544},{"type":70,"value":2469},"\nmode with that exact value — never leave the locator empty when a name is\nknown. Only when nothing is known, use ",{"type":65,"tag":86,"props":2471,"children":2473},{"className":2472},[],[2474],{"type":70,"value":2475},"list",{"type":70,"value":2477}," mode empty with a\n",{"type":65,"tag":86,"props":2479,"children":2481},{"className":2480},[],[2482],{"type":70,"value":2483},"cachedResultName",{"type":70,"value":2485}," hint (",{"type":65,"tag":86,"props":2487,"children":2489},{"className":2488},[],[2490],{"type":70,"value":2491},"{ __rl: true, mode: 'list', value: '', cachedResultName: 'Select support channel to monitor' }",{"type":70,"value":2493},") — a ",{"type":65,"tag":86,"props":2495,"children":2497},{"className":2496},[],[2498],{"type":70,"value":2475},{"type":70,"value":2500}," value is\nan opaque picked ID; never put a human-readable name there. Without a ",{"type":65,"tag":86,"props":2502,"children":2504},{"className":2503},[],[2505],{"type":70,"value":2475},{"type":70,"value":2507},"\nmode, use ",{"type":65,"tag":86,"props":2509,"children":2511},{"className":2510},[],[2512],{"type":70,"value":1544},{"type":70,"value":2514},"\u002F",{"type":65,"tag":86,"props":2516,"children":2518},{"className":2517},[],[2519],{"type":70,"value":2520},"url",{"type":70,"value":2522}," with the known value, or ",{"type":65,"tag":86,"props":2524,"children":2526},{"className":2525},[],[2527],{"type":70,"value":1537},{"type":70,"value":2529}," only with a concrete ID\n(never empty or placeholder).",{"type":65,"tag":448,"props":2531,"children":2532},{},[2533,2535,2541],{"type":70,"value":2534},"For single-execution nodes that receive many items but should run once, set\n",{"type":65,"tag":86,"props":2536,"children":2538},{"className":2537},[],[2539],{"type":70,"value":2540},"executeOnce: true",{"type":70,"value":1273},{"type":65,"tag":448,"props":2543,"children":2544},{},[2545,2547,2552,2554,2559,2561,2567,2568,2574,2575,2580,2581,2587,2588,2594,2595,2601],{"type":70,"value":2546},"Whenever a node declares mock ",{"type":65,"tag":86,"props":2548,"children":2550},{"className":2549},[],[2551],{"type":70,"value":1014},{"type":70,"value":2553}," for verification, include every field\nlater referenced by ",{"type":65,"tag":86,"props":2555,"children":2557},{"className":2556},[],[2558],{"type":70,"value":2354},{"type":70,"value":2560}," expressions, including optional trigger fields\nused in filters (for example Slack ",{"type":65,"tag":86,"props":2562,"children":2564},{"className":2563},[],[2565],{"type":70,"value":2566},"subtype",{"type":70,"value":409},{"type":65,"tag":86,"props":2569,"children":2571},{"className":2570},[],[2572],{"type":70,"value":2573},"bot_id",{"type":70,"value":409},{"type":65,"tag":86,"props":2576,"children":2578},{"className":2577},[],[2579],{"type":70,"value":70},{"type":70,"value":409},{"type":65,"tag":86,"props":2582,"children":2584},{"className":2583},[],[2585],{"type":70,"value":2586},"user",{"type":70,"value":409},{"type":65,"tag":86,"props":2589,"children":2591},{"className":2590},[],[2592],{"type":70,"value":2593},"ts",{"type":70,"value":582},{"type":65,"tag":86,"props":2596,"children":2598},{"className":2597},[],[2599],{"type":70,"value":2600},"channel",{"type":70,"value":2602},"). Missing optional fields make expression-path validation fail.",{"type":65,"tag":448,"props":2604,"children":2605},{},[2606,2608,2613,2615,2621],{"type":70,"value":2607},"Match real cardinality in mock ",{"type":65,"tag":86,"props":2609,"children":2611},{"className":2610},[],[2612],{"type":70,"value":1014},{"type":70,"value":2614},". When a node's real response is a\ncollection (HTTP list endpoints, search results, a top-level array such as\nBinance klines or a bare array of IDs), declare at least two items so\nsingle-item assumptions like ",{"type":65,"tag":86,"props":2616,"children":2618},{"className":2617},[],[2619],{"type":70,"value":2620},"$input.first()",{"type":70,"value":2622}," break during verification\ninstead of on the user's first run. A single-item mock hides array-vs-single\nbugs.",{"type":65,"tag":448,"props":2624,"children":2625},{},[2626,2628,2634,2636,2642],{"type":70,"value":2627},"Match the real payload SHAPE in webhook trigger mocks. When a third-party\nplatform calls the webhook (voice agents, payment providers, messaging\nplatforms), that platform's documented envelope fixes the shape — mock it\nfaithfully instead of inventing a flattened body. Tool-call style webhooks\nfrom AI\u002Fvoice platforms nest arguments in an OpenAI-compatible envelope\n(",{"type":65,"tag":86,"props":2629,"children":2631},{"className":2630},[],[2632],{"type":70,"value":2633},"body.message.toolCalls[0].function.arguments",{"type":70,"value":2635},"), not at the body root and\nnot under ",{"type":65,"tag":86,"props":2637,"children":2639},{"className":2638},[],[2640],{"type":70,"value":2641},"call.arguments",{"type":70,"value":2643},". Coding against an invented flat mock\nself-verifies green, then every field parses empty on the first real call.",{"type":65,"tag":448,"props":2645,"children":2646},{},[2647,2649,2654,2656,2661,2663,2669,2671,2677,2679,2685,2687,2693,2695,2701,2703,2709,2711,2717],{"type":70,"value":2648},"SDK node ",{"type":65,"tag":86,"props":2650,"children":2652},{"className":2651},[],[2653],{"type":70,"value":1014},{"type":70,"value":2655}," mocks are raw ",{"type":65,"tag":86,"props":2657,"children":2659},{"className":2658},[],[2660],{"type":70,"value":2354},{"type":70,"value":2662}," objects. Do not wrap mock items in\nn8n runtime item envelopes like ",{"type":65,"tag":86,"props":2664,"children":2666},{"className":2665},[],[2667],{"type":70,"value":2668},"{ json: { ... } }",{"type":70,"value":2670}," unless downstream\nexpressions intentionally read ",{"type":65,"tag":86,"props":2672,"children":2674},{"className":2673},[],[2675],{"type":70,"value":2676},"$json.json.*",{"type":70,"value":2678},". Correct:\n",{"type":65,"tag":86,"props":2680,"children":2682},{"className":2681},[],[2683],{"type":70,"value":2684},"output: [{ orderId: 'ord_123', total: 42 }]",{"type":70,"value":2686},"; wrong:\n",{"type":65,"tag":86,"props":2688,"children":2690},{"className":2689},[],[2691],{"type":70,"value":2692},"output: [{ json: { orderId: 'ord_123', total: 42 } }]",{"type":70,"value":2694},".\nCode node ",{"type":65,"tag":86,"props":2696,"children":2698},{"className":2697},[],[2699],{"type":70,"value":2700},"jsCode",{"type":70,"value":2702}," may still return runtime items like ",{"type":65,"tag":86,"props":2704,"children":2706},{"className":2705},[],[2707],{"type":70,"value":2708},"[{ json: { ... } }]",{"type":70,"value":2710},";\nthis rule applies to SDK ",{"type":65,"tag":86,"props":2712,"children":2714},{"className":2713},[],[2715],{"type":70,"value":2716},"node({ output: [...] })",{"type":70,"value":2718}," mocks.",{"type":65,"tag":80,"props":2720,"children":2721},{},[2722],{"type":70,"value":2723},"Use this import shape unless the task needs fewer symbols:",{"type":65,"tag":2725,"props":2726,"children":2730},"pre",{"className":2727,"code":2728,"language":2593,"meta":2729,"style":2729},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import {\n  workflow,\n  node,\n  trigger,\n  placeholder,\n  newCredential,\n  ifElse,\n  switchCase,\n  merge,\n  splitInBatches,\n  nextBatch,\n  languageModel,\n  memory,\n  tool,\n  outputParser,\n  embedding,\n  embeddings,\n  vectorStore,\n  retriever,\n  documentLoader,\n  textSplitter,\n  fromAi,\n  nodeJson,\n  expr,\n} from '@n8n\u002Fworkflow-sdk';\n","",[2731],{"type":65,"tag":86,"props":2732,"children":2733},{"__ignoreMap":2729},[2734,2752,2766,2779,2792,2805,2818,2831,2844,2857,2870,2883,2896,2909,2922,2935,2948,2961,2974,2987,3000,3013,3026,3039,3052],{"type":65,"tag":2735,"props":2736,"children":2739},"span",{"class":2737,"line":2738},"line",1,[2740,2746],{"type":65,"tag":2735,"props":2741,"children":2743},{"style":2742},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[2744],{"type":70,"value":2745},"import",{"type":65,"tag":2735,"props":2747,"children":2749},{"style":2748},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[2750],{"type":70,"value":2751}," {\n",{"type":65,"tag":2735,"props":2753,"children":2755},{"class":2737,"line":2754},2,[2756,2762],{"type":65,"tag":2735,"props":2757,"children":2759},{"style":2758},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[2760],{"type":70,"value":2761},"  workflow",{"type":65,"tag":2735,"props":2763,"children":2764},{"style":2748},[2765],{"type":70,"value":582},{"type":65,"tag":2735,"props":2767,"children":2769},{"class":2737,"line":2768},3,[2770,2775],{"type":65,"tag":2735,"props":2771,"children":2772},{"style":2758},[2773],{"type":70,"value":2774},"  node",{"type":65,"tag":2735,"props":2776,"children":2777},{"style":2748},[2778],{"type":70,"value":582},{"type":65,"tag":2735,"props":2780,"children":2782},{"class":2737,"line":2781},4,[2783,2788],{"type":65,"tag":2735,"props":2784,"children":2785},{"style":2758},[2786],{"type":70,"value":2787},"  trigger",{"type":65,"tag":2735,"props":2789,"children":2790},{"style":2748},[2791],{"type":70,"value":582},{"type":65,"tag":2735,"props":2793,"children":2795},{"class":2737,"line":2794},5,[2796,2801],{"type":65,"tag":2735,"props":2797,"children":2798},{"style":2758},[2799],{"type":70,"value":2800},"  placeholder",{"type":65,"tag":2735,"props":2802,"children":2803},{"style":2748},[2804],{"type":70,"value":582},{"type":65,"tag":2735,"props":2806,"children":2808},{"class":2737,"line":2807},6,[2809,2814],{"type":65,"tag":2735,"props":2810,"children":2811},{"style":2758},[2812],{"type":70,"value":2813},"  newCredential",{"type":65,"tag":2735,"props":2815,"children":2816},{"style":2748},[2817],{"type":70,"value":582},{"type":65,"tag":2735,"props":2819,"children":2821},{"class":2737,"line":2820},7,[2822,2827],{"type":65,"tag":2735,"props":2823,"children":2824},{"style":2758},[2825],{"type":70,"value":2826},"  ifElse",{"type":65,"tag":2735,"props":2828,"children":2829},{"style":2748},[2830],{"type":70,"value":582},{"type":65,"tag":2735,"props":2832,"children":2834},{"class":2737,"line":2833},8,[2835,2840],{"type":65,"tag":2735,"props":2836,"children":2837},{"style":2758},[2838],{"type":70,"value":2839},"  switchCase",{"type":65,"tag":2735,"props":2841,"children":2842},{"style":2748},[2843],{"type":70,"value":582},{"type":65,"tag":2735,"props":2845,"children":2847},{"class":2737,"line":2846},9,[2848,2853],{"type":65,"tag":2735,"props":2849,"children":2850},{"style":2758},[2851],{"type":70,"value":2852},"  merge",{"type":65,"tag":2735,"props":2854,"children":2855},{"style":2748},[2856],{"type":70,"value":582},{"type":65,"tag":2735,"props":2858,"children":2860},{"class":2737,"line":2859},10,[2861,2866],{"type":65,"tag":2735,"props":2862,"children":2863},{"style":2758},[2864],{"type":70,"value":2865},"  splitInBatches",{"type":65,"tag":2735,"props":2867,"children":2868},{"style":2748},[2869],{"type":70,"value":582},{"type":65,"tag":2735,"props":2871,"children":2873},{"class":2737,"line":2872},11,[2874,2879],{"type":65,"tag":2735,"props":2875,"children":2876},{"style":2758},[2877],{"type":70,"value":2878},"  nextBatch",{"type":65,"tag":2735,"props":2880,"children":2881},{"style":2748},[2882],{"type":70,"value":582},{"type":65,"tag":2735,"props":2884,"children":2886},{"class":2737,"line":2885},12,[2887,2892],{"type":65,"tag":2735,"props":2888,"children":2889},{"style":2758},[2890],{"type":70,"value":2891},"  languageModel",{"type":65,"tag":2735,"props":2893,"children":2894},{"style":2748},[2895],{"type":70,"value":582},{"type":65,"tag":2735,"props":2897,"children":2899},{"class":2737,"line":2898},13,[2900,2905],{"type":65,"tag":2735,"props":2901,"children":2902},{"style":2758},[2903],{"type":70,"value":2904},"  memory",{"type":65,"tag":2735,"props":2906,"children":2907},{"style":2748},[2908],{"type":70,"value":582},{"type":65,"tag":2735,"props":2910,"children":2912},{"class":2737,"line":2911},14,[2913,2918],{"type":65,"tag":2735,"props":2914,"children":2915},{"style":2758},[2916],{"type":70,"value":2917},"  tool",{"type":65,"tag":2735,"props":2919,"children":2920},{"style":2748},[2921],{"type":70,"value":582},{"type":65,"tag":2735,"props":2923,"children":2925},{"class":2737,"line":2924},15,[2926,2931],{"type":65,"tag":2735,"props":2927,"children":2928},{"style":2758},[2929],{"type":70,"value":2930},"  outputParser",{"type":65,"tag":2735,"props":2932,"children":2933},{"style":2748},[2934],{"type":70,"value":582},{"type":65,"tag":2735,"props":2936,"children":2938},{"class":2737,"line":2937},16,[2939,2944],{"type":65,"tag":2735,"props":2940,"children":2941},{"style":2758},[2942],{"type":70,"value":2943},"  embedding",{"type":65,"tag":2735,"props":2945,"children":2946},{"style":2748},[2947],{"type":70,"value":582},{"type":65,"tag":2735,"props":2949,"children":2951},{"class":2737,"line":2950},17,[2952,2957],{"type":65,"tag":2735,"props":2953,"children":2954},{"style":2758},[2955],{"type":70,"value":2956},"  embeddings",{"type":65,"tag":2735,"props":2958,"children":2959},{"style":2748},[2960],{"type":70,"value":582},{"type":65,"tag":2735,"props":2962,"children":2964},{"class":2737,"line":2963},18,[2965,2970],{"type":65,"tag":2735,"props":2966,"children":2967},{"style":2758},[2968],{"type":70,"value":2969},"  vectorStore",{"type":65,"tag":2735,"props":2971,"children":2972},{"style":2748},[2973],{"type":70,"value":582},{"type":65,"tag":2735,"props":2975,"children":2977},{"class":2737,"line":2976},19,[2978,2983],{"type":65,"tag":2735,"props":2979,"children":2980},{"style":2758},[2981],{"type":70,"value":2982},"  retriever",{"type":65,"tag":2735,"props":2984,"children":2985},{"style":2748},[2986],{"type":70,"value":582},{"type":65,"tag":2735,"props":2988,"children":2990},{"class":2737,"line":2989},20,[2991,2996],{"type":65,"tag":2735,"props":2992,"children":2993},{"style":2758},[2994],{"type":70,"value":2995},"  documentLoader",{"type":65,"tag":2735,"props":2997,"children":2998},{"style":2748},[2999],{"type":70,"value":582},{"type":65,"tag":2735,"props":3001,"children":3003},{"class":2737,"line":3002},21,[3004,3009],{"type":65,"tag":2735,"props":3005,"children":3006},{"style":2758},[3007],{"type":70,"value":3008},"  textSplitter",{"type":65,"tag":2735,"props":3010,"children":3011},{"style":2748},[3012],{"type":70,"value":582},{"type":65,"tag":2735,"props":3014,"children":3016},{"class":2737,"line":3015},22,[3017,3022],{"type":65,"tag":2735,"props":3018,"children":3019},{"style":2758},[3020],{"type":70,"value":3021},"  fromAi",{"type":65,"tag":2735,"props":3023,"children":3024},{"style":2748},[3025],{"type":70,"value":582},{"type":65,"tag":2735,"props":3027,"children":3029},{"class":2737,"line":3028},23,[3030,3035],{"type":65,"tag":2735,"props":3031,"children":3032},{"style":2758},[3033],{"type":70,"value":3034},"  nodeJson",{"type":65,"tag":2735,"props":3036,"children":3037},{"style":2748},[3038],{"type":70,"value":582},{"type":65,"tag":2735,"props":3040,"children":3042},{"class":2737,"line":3041},24,[3043,3048],{"type":65,"tag":2735,"props":3044,"children":3045},{"style":2758},[3046],{"type":70,"value":3047},"  expr",{"type":65,"tag":2735,"props":3049,"children":3050},{"style":2748},[3051],{"type":70,"value":582},{"type":65,"tag":2735,"props":3053,"children":3055},{"class":2737,"line":3054},25,[3056,3061,3066,3071,3076,3081],{"type":65,"tag":2735,"props":3057,"children":3058},{"style":2748},[3059],{"type":70,"value":3060},"}",{"type":65,"tag":2735,"props":3062,"children":3063},{"style":2742},[3064],{"type":70,"value":3065}," from",{"type":65,"tag":2735,"props":3067,"children":3068},{"style":2748},[3069],{"type":70,"value":3070}," '",{"type":65,"tag":2735,"props":3072,"children":3074},{"style":3073},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[3075],{"type":70,"value":104},{"type":65,"tag":2735,"props":3077,"children":3078},{"style":2748},[3079],{"type":70,"value":3080},"'",{"type":65,"tag":2735,"props":3082,"children":3083},{"style":2748},[3084],{"type":70,"value":271},{"type":65,"tag":73,"props":3086,"children":3088},{"id":3087},"workflow-rules",[3089],{"type":70,"value":3090},"Workflow Rules",{"type":65,"tag":80,"props":3092,"children":3093},{},[3094],{"type":70,"value":3095},"Follow these rules strictly when generating workflows:",{"type":65,"tag":444,"props":3097,"children":3098},{},[3099,3119,3132,3143,3271,3299,3304],{"type":65,"tag":448,"props":3100,"children":3101},{},[3102,3104,3109,3111,3117],{"type":70,"value":3103},"Always use ",{"type":65,"tag":86,"props":3105,"children":3107},{"className":3106},[],[3108],{"type":70,"value":336},{"type":70,"value":3110}," for authentication. Never use placeholder\nstrings, fake API keys, hardcoded auth values, invented credential IDs, or\nraw ",{"type":65,"tag":86,"props":3112,"children":3114},{"className":3113},[],[3115],{"type":70,"value":3116},"mock-*",{"type":70,"value":3118}," IDs.",{"type":65,"tag":448,"props":3120,"children":3121},{},[3122,3124,3130],{"type":70,"value":3123},"Zero items end the branch — downstream nodes do not run. Trust this default;\ndo not add ",{"type":65,"tag":86,"props":3125,"children":3127},{"className":3126},[],[3128],{"type":70,"value":3129},"alwaysOutputData: true",{"type":70,"value":3131}," or empty-check IF gates unless rule 4's\nmandatory-outcome case applies.",{"type":65,"tag":448,"props":3133,"children":3134},{},[3135,3136,3141],{"type":70,"value":385},{"type":65,"tag":86,"props":3137,"children":3139},{"className":3138},[],[3140],{"type":70,"value":2540},{"type":70,"value":3142}," for a node that receives many items but should run\nonce, such as a summary notification, report generation, shared-context\nfetch, or API call that does not vary per input item. Duplicate\nnotifications or repeated shared-context fetches usually mean this is\nmissing.",{"type":65,"tag":448,"props":3144,"children":3145},{},[3146,3148],{"type":70,"value":3147},"Pick the right control-flow primitive:\n",{"type":65,"tag":467,"props":3149,"children":3150},{},[3151,3178,3190,3211,3222,3266],{"type":65,"tag":448,"props":3152,"children":3153},{},[3154,3156,3162,3163,3169,3171,3177],{"type":70,"value":3155},"Per-item loop with side effects: ",{"type":65,"tag":86,"props":3157,"children":3159},{"className":3158},[],[3160],{"type":70,"value":3161},"splitInBatches",{"type":70,"value":522},{"type":65,"tag":86,"props":3164,"children":3166},{"className":3165},[],[3167],{"type":70,"value":3168},"batchSize: 1",{"type":70,"value":3170},",\nfeeding the per-item work and looping back via ",{"type":65,"tag":86,"props":3172,"children":3174},{"className":3173},[],[3175],{"type":70,"value":3176},"nextBatch",{"type":70,"value":1273},{"type":65,"tag":448,"props":3179,"children":3180},{},[3181,3183,3189],{"type":70,"value":3182},"Drop items that do not match a predicate: ",{"type":65,"tag":86,"props":3184,"children":3186},{"className":3185},[],[3187],{"type":70,"value":3188},"filter",{"type":70,"value":1273},{"type":65,"tag":448,"props":3191,"children":3192},{},[3193,3195,3201,3203,3209],{"type":70,"value":3194},"Two mutually exclusive paths that both do real work: IF with ",{"type":65,"tag":86,"props":3196,"children":3198},{"className":3197},[],[3199],{"type":70,"value":3200},".onTrue()",{"type":70,"value":3202},"\nand ",{"type":65,"tag":86,"props":3204,"children":3206},{"className":3205},[],[3207],{"type":70,"value":3208},".onFalse()",{"type":70,"value":3210}," wired on the workflow builder — never as standalone\nstatements on the IF node variable.",{"type":65,"tag":448,"props":3212,"children":3213},{},[3214,3216,3221],{"type":70,"value":3215},"Many mutually exclusive paths keyed off a value: Switch with\n",{"type":65,"tag":86,"props":3217,"children":3219},{"className":3218},[],[3220],{"type":70,"value":1106},{"type":70,"value":1273},{"type":65,"tag":448,"props":3223,"children":3224},{},[3225,3227,3232,3234,3240,3242,3248,3250,3256,3258,3264],{"type":70,"value":3226},"Mandatory outcome when upstream can be empty (digest\u002Falert must still send):\nset ",{"type":65,"tag":86,"props":3228,"children":3230},{"className":3229},[],[3231],{"type":70,"value":3129},{"type":70,"value":3233}," on every node that can emit zero items before\nthe effect — often both the HTTP fetch (empty ",{"type":65,"tag":86,"props":3235,"children":3237},{"className":3236},[],[3238],{"type":70,"value":3239},"[]",{"type":70,"value":3241},") and the filter (all rows\ndropped). Not on the formatter or notifier; consumers that receive zero\nitems never run. ",{"type":65,"tag":86,"props":3243,"children":3245},{"className":3244},[],[3246],{"type":70,"value":3247},"alwaysOutputData",{"type":70,"value":3249}," delivers an empty result as one item\nwith empty json (",{"type":65,"tag":86,"props":3251,"children":3253},{"className":3252},[],[3254],{"type":70,"value":3255},"{}",{"type":70,"value":3257},"), not zero items — a downstream formatter or Code\nnode must treat empty-json items as zero rows (e.g. ",{"type":65,"tag":86,"props":3259,"children":3261},{"className":3260},[],[3262],{"type":70,"value":3263},"const rows = $input.all().filter(i => Object.keys(i.json).length > 0)",{"type":70,"value":3265},") before counting\nor listing them.",{"type":65,"tag":448,"props":3267,"children":3268},{},[3269],{"type":70,"value":3270},"A Filter or IF only selects items; it does not perform the requested side\neffect. If the user asks to archive, update, delete, send, or create only\nmatching items, wire the corresponding action node on the matching path.",{"type":65,"tag":448,"props":3272,"children":3273},{},[3274,3276,3282,3283,3289,3291,3297],{"type":70,"value":3275},"Input and output indices are zero-based. ",{"type":65,"tag":86,"props":3277,"children":3279},{"className":3278},[],[3280],{"type":70,"value":3281},".input(0)",{"type":70,"value":1610},{"type":65,"tag":86,"props":3284,"children":3286},{"className":3285},[],[3287],{"type":70,"value":3288},".output(0)",{"type":70,"value":3290}," are the\nfirst input and output. ",{"type":65,"tag":86,"props":3292,"children":3294},{"className":3293},[],[3295],{"type":70,"value":3296},".input(1)",{"type":70,"value":3298}," is the second input, not the first.",{"type":65,"tag":448,"props":3300,"children":3301},{},[3302],{"type":70,"value":3303},"When Code nodes score, classify, or gate on free-text human fields\n(amounts, timeframes, priorities, intent), normalize before comparing —\nhumans write \"≈ $12,500\", \"1.5k\", \"in three weeks\", \"ASAP\". Strip currency\nsymbols\u002Fseparators before parsing numbers, take the lower bound of ranges,\nmatch time units broadly (day\u002Fdays, week\u002Fweeks…), and give every classifier\nan explicit fallback bucket — a one-phrasing regex silently misroutes every\nother phrasing.",{"type":65,"tag":448,"props":3305,"children":3306},{},[3307,3309,3315,3316,3322,3324,3330],{"type":70,"value":3308},"Do not add sticky notes (",{"type":65,"tag":86,"props":3310,"children":3312},{"className":3311},[],[3313],{"type":70,"value":3314},"sticky(...)",{"type":70,"value":1862},{"type":65,"tag":86,"props":3317,"children":3319},{"className":3318},[],[3320],{"type":70,"value":3321},"n8n-nodes-base.stickyNote",{"type":70,"value":3323},") unless\nthe user explicitly asks for canvas notes. They add visual noise and are\noften poorly positioned. Put explanations in your chat reply instead. Even\nwhen the SDK language reference documents ",{"type":65,"tag":86,"props":3325,"children":3327},{"className":3326},[],[3328],{"type":70,"value":3329},"sticky()",{"type":70,"value":3331},", do not use it by\ndefault. When editing a workflow, do not add or reintroduce stickies unless the user\nexplicitly asks for them.",{"type":65,"tag":73,"props":3333,"children":3335},{"id":3334},"tool-naming-rules",[3336],{"type":70,"value":3337},"Tool Naming Rules",{"type":65,"tag":80,"props":3339,"children":3340},{},[3341,3343,3349,3351,3357,3359,3365,3366,3372,3373,3379,3381,3387,3388,3394],{"type":70,"value":3342},"Always set an explicit ",{"type":65,"tag":86,"props":3344,"children":3346},{"className":3345},[],[3347],{"type":70,"value":3348},"config.name",{"type":70,"value":3350}," on every ",{"type":65,"tag":86,"props":3352,"children":3354},{"className":3353},[],[3355],{"type":70,"value":3356},"tool(...)",{"type":70,"value":3358}," node — concise\nsnake_case action names (",{"type":65,"tag":86,"props":3360,"children":3362},{"className":3361},[],[3363],{"type":70,"value":3364},"get_email",{"type":70,"value":409},{"type":65,"tag":86,"props":3367,"children":3369},{"className":3368},[],[3370],{"type":70,"value":3371},"add_labels",{"type":70,"value":409},{"type":65,"tag":86,"props":3374,"children":3376},{"className":3375},[],[3377],{"type":70,"value":3378},"mark_as_read",{"type":70,"value":3380},") describing\nwhat the tool does. Never prefix with the service\u002Ffamily name\n(",{"type":65,"tag":86,"props":3382,"children":3384},{"className":3383},[],[3385],{"type":70,"value":3386},"gmail_get_email",{"type":70,"value":409},{"type":65,"tag":86,"props":3389,"children":3391},{"className":3390},[],[3392],{"type":70,"value":3393},"slack_send_message",{"type":70,"value":3395}," are wrong) unless the user explicitly\nasked for that exact name.",{"type":65,"tag":73,"props":3397,"children":3399},{"id":3398},"node-configuration-safety-rules",[3400],{"type":70,"value":3401},"Node Configuration Safety Rules",{"type":65,"tag":467,"props":3403,"children":3404},{},[3405,3424,3436,3441,3453],{"type":65,"tag":448,"props":3406,"children":3407},{},[3408,3410,3415,3417,3422],{"type":70,"value":3409},"Fetch ",{"type":65,"tag":86,"props":3411,"children":3413},{"className":3412},[],[3414],{"type":70,"value":184},{"type":70,"value":3416}," before configuring nodes. Generated\ndefinitions and ",{"type":65,"tag":86,"props":3418,"children":3420},{"className":3419},[],[3421],{"type":70,"value":867},{"type":70,"value":3423}," annotations are the source of truth.",{"type":65,"tag":448,"props":3425,"children":3426},{},[3427,3429,3434],{"type":70,"value":3428},"Use live ",{"type":65,"tag":86,"props":3430,"children":3432},{"className":3431},[],[3433],{"type":70,"value":399},{"type":70,"value":3435}," for resource locator, list, and\nmodel fields when credentials are available.",{"type":65,"tag":448,"props":3437,"children":3438},{},[3439],{"type":70,"value":3440},"If a configuration is unclear after reading the definition, ask for\nclarification or use placeholders. Do not guess.",{"type":65,"tag":448,"props":3442,"children":3443},{},[3444,3446,3451],{"type":70,"value":3445},"Pay attention to ",{"type":65,"tag":86,"props":3447,"children":3449},{"className":3448},[],[3450],{"type":70,"value":867},{"type":70,"value":3452}," annotations in search results and type\ndefinitions. They contain node-specific configuration rules and examples.",{"type":65,"tag":448,"props":3454,"children":3455},{},[3456,3458,3464,3466,3472,3474,3480,3481,3487,3489,3495],{"type":70,"value":3457},"Gmail archive: the message resource has no ",{"type":65,"tag":86,"props":3459,"children":3461},{"className":3460},[],[3462],{"type":70,"value":3463},"archive",{"type":70,"value":3465}," operation. To archive a\nGmail message, remove the ",{"type":65,"tag":86,"props":3467,"children":3469},{"className":3468},[],[3470],{"type":70,"value":3471},"INBOX",{"type":70,"value":3473}," label with ",{"type":65,"tag":86,"props":3475,"children":3477},{"className":3476},[],[3478],{"type":70,"value":3479},"operation: 'removeLabels'",{"type":70,"value":1761},{"type":65,"tag":86,"props":3482,"children":3484},{"className":3483},[],[3485],{"type":70,"value":3486},"labelIds: ['INBOX']",{"type":70,"value":3488},"; do not add an invented ",{"type":65,"tag":86,"props":3490,"children":3492},{"className":3491},[],[3493],{"type":70,"value":3494},"ARCHIVE",{"type":70,"value":3496}," label.",{"type":65,"tag":73,"props":3498,"children":3500},{"id":3499},"expression-reference",[3501],{"type":70,"value":3502},"Expression Reference",{"type":65,"tag":80,"props":3504,"children":3505},{},[3506,3508,3514],{"type":70,"value":3507},"Available variables inside ",{"type":65,"tag":86,"props":3509,"children":3511},{"className":3510},[],[3512],{"type":70,"value":3513},"expr('{{ ... }}')",{"type":70,"value":3515},":",{"type":65,"tag":467,"props":3517,"children":3518},{},[3519,3529,3540,3563,3574,3592],{"type":65,"tag":448,"props":3520,"children":3521},{},[3522,3527],{"type":65,"tag":86,"props":3523,"children":3525},{"className":3524},[],[3526],{"type":70,"value":2354},{"type":70,"value":3528},": current item's JSON data from the immediate predecessor node only.",{"type":65,"tag":448,"props":3530,"children":3531},{},[3532,3538],{"type":65,"tag":86,"props":3533,"children":3535},{"className":3534},[],[3536],{"type":70,"value":3537},"$('NodeName').item.json",{"type":70,"value":3539},": access another node's output item paired with the\ncurrent item.",{"type":65,"tag":448,"props":3541,"children":3542},{},[3543,3548,3549,3555,3556,3562],{"type":65,"tag":86,"props":3544,"children":3546},{"className":3545},[],[3547],{"type":70,"value":2620},{"type":70,"value":409},{"type":65,"tag":86,"props":3550,"children":3552},{"className":3551},[],[3553],{"type":70,"value":3554},"$input.all()",{"type":70,"value":1546},{"type":65,"tag":86,"props":3557,"children":3559},{"className":3558},[],[3560],{"type":70,"value":3561},"$input.item",{"type":70,"value":1273},{"type":65,"tag":448,"props":3564,"children":3565},{},[3566,3572],{"type":65,"tag":86,"props":3567,"children":3569},{"className":3568},[],[3570],{"type":70,"value":3571},"$binary",{"type":70,"value":3573},": binary data from the current item.",{"type":65,"tag":448,"props":3575,"children":3576},{},[3577,3583,3584,3590],{"type":65,"tag":86,"props":3578,"children":3580},{"className":3579},[],[3581],{"type":70,"value":3582},"$now",{"type":70,"value":1610},{"type":65,"tag":86,"props":3585,"children":3587},{"className":3586},[],[3588],{"type":70,"value":3589},"$today",{"type":70,"value":3591},": Luxon date\u002Ftime helpers.",{"type":65,"tag":448,"props":3593,"children":3594},{},[3595,3601,3602,3608,3609,3615,3616,3622,3623,3629,3630,3636],{"type":65,"tag":86,"props":3596,"children":3598},{"className":3597},[],[3599],{"type":70,"value":3600},"$itemIndex",{"type":70,"value":409},{"type":65,"tag":86,"props":3603,"children":3605},{"className":3604},[],[3606],{"type":70,"value":3607},"$runIndex",{"type":70,"value":409},{"type":65,"tag":86,"props":3610,"children":3612},{"className":3611},[],[3613],{"type":70,"value":3614},"$execution.id",{"type":70,"value":409},{"type":65,"tag":86,"props":3617,"children":3619},{"className":3618},[],[3620],{"type":70,"value":3621},"$execution.mode",{"type":70,"value":582},{"type":65,"tag":86,"props":3624,"children":3626},{"className":3625},[],[3627],{"type":70,"value":3628},"$workflow.id",{"type":70,"value":1546},{"type":65,"tag":86,"props":3631,"children":3633},{"className":3632},[],[3634],{"type":70,"value":3635},"$workflow.name",{"type":70,"value":1273},{"type":65,"tag":80,"props":3638,"children":3639},{},[3640,3642,3647],{"type":70,"value":3641},"Variables must always be inside ",{"type":65,"tag":86,"props":3643,"children":3645},{"className":3644},[],[3646],{"type":70,"value":2346},{"type":70,"value":3515},{"type":65,"tag":2725,"props":3649,"children":3651},{"className":2727,"code":3650,"language":2593,"meta":2729,"style":2729},"expr('Hello {{ $json.name }}')\nexpr('Report for {{ $now.toFormat(\"MMMM d, yyyy\") }} - {{ $json.title }}')\nexpr('{{ $(\"Source\").all().map(i => ({ option: i.json.name })) }}')\n",[3652],{"type":65,"tag":86,"props":3653,"children":3654},{"__ignoreMap":2729},[3655,3687,3715],{"type":65,"tag":2735,"props":3656,"children":3657},{"class":2737,"line":2738},[3658,3664,3669,3673,3678,3682],{"type":65,"tag":2735,"props":3659,"children":3661},{"style":3660},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[3662],{"type":70,"value":3663},"expr",{"type":65,"tag":2735,"props":3665,"children":3666},{"style":2758},[3667],{"type":70,"value":3668},"(",{"type":65,"tag":2735,"props":3670,"children":3671},{"style":2748},[3672],{"type":70,"value":3080},{"type":65,"tag":2735,"props":3674,"children":3675},{"style":3073},[3676],{"type":70,"value":3677},"Hello {{ $json.name }}",{"type":65,"tag":2735,"props":3679,"children":3680},{"style":2748},[3681],{"type":70,"value":3080},{"type":65,"tag":2735,"props":3683,"children":3684},{"style":2758},[3685],{"type":70,"value":3686},")\n",{"type":65,"tag":2735,"props":3688,"children":3689},{"class":2737,"line":2754},[3690,3694,3698,3702,3707,3711],{"type":65,"tag":2735,"props":3691,"children":3692},{"style":3660},[3693],{"type":70,"value":3663},{"type":65,"tag":2735,"props":3695,"children":3696},{"style":2758},[3697],{"type":70,"value":3668},{"type":65,"tag":2735,"props":3699,"children":3700},{"style":2748},[3701],{"type":70,"value":3080},{"type":65,"tag":2735,"props":3703,"children":3704},{"style":3073},[3705],{"type":70,"value":3706},"Report for {{ $now.toFormat(\"MMMM d, yyyy\") }} - {{ $json.title }}",{"type":65,"tag":2735,"props":3708,"children":3709},{"style":2748},[3710],{"type":70,"value":3080},{"type":65,"tag":2735,"props":3712,"children":3713},{"style":2758},[3714],{"type":70,"value":3686},{"type":65,"tag":2735,"props":3716,"children":3717},{"class":2737,"line":2768},[3718,3722,3726,3730,3735,3739],{"type":65,"tag":2735,"props":3719,"children":3720},{"style":3660},[3721],{"type":70,"value":3663},{"type":65,"tag":2735,"props":3723,"children":3724},{"style":2758},[3725],{"type":70,"value":3668},{"type":65,"tag":2735,"props":3727,"children":3728},{"style":2748},[3729],{"type":70,"value":3080},{"type":65,"tag":2735,"props":3731,"children":3732},{"style":3073},[3733],{"type":70,"value":3734},"{{ $(\"Source\").all().map(i => ({ option: i.json.name })) }}",{"type":65,"tag":2735,"props":3736,"children":3737},{"style":2748},[3738],{"type":70,"value":3080},{"type":65,"tag":2735,"props":3740,"children":3741},{"style":2758},[3742],{"type":70,"value":3686},{"type":65,"tag":80,"props":3744,"children":3745},{},[3746,3747,3752],{"type":70,"value":1587},{"type":65,"tag":86,"props":3748,"children":3750},{"className":3749},[],[3751],{"type":70,"value":2354},{"type":70,"value":3753}," is unsafe, reference the source node explicitly. This matters for\nAI Agent subnodes, fan-in nodes after IF\u002FSwitch\u002FMerge, and values that come from\nfurther upstream or from before a node that replaces item JSON:",{"type":65,"tag":2725,"props":3755,"children":3757},{"className":2727,"code":3756,"language":2593,"meta":2729,"style":2729},"sessionKey: nodeJson(telegramTrigger, 'message.chat.id')\neventId: nodeJson(extractEventId, 'eventId')\n",[3758],{"type":65,"tag":86,"props":3759,"children":3760},{"__ignoreMap":2729},[3761,3806],{"type":65,"tag":2735,"props":3762,"children":3763},{"class":2737,"line":2738},[3764,3770,3774,3779,3784,3789,3793,3798,3802],{"type":65,"tag":2735,"props":3765,"children":3767},{"style":3766},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[3768],{"type":70,"value":3769},"sessionKey",{"type":65,"tag":2735,"props":3771,"children":3772},{"style":2748},[3773],{"type":70,"value":3515},{"type":65,"tag":2735,"props":3775,"children":3776},{"style":3660},[3777],{"type":70,"value":3778}," nodeJson",{"type":65,"tag":2735,"props":3780,"children":3781},{"style":2758},[3782],{"type":70,"value":3783},"(telegramTrigger",{"type":65,"tag":2735,"props":3785,"children":3786},{"style":2748},[3787],{"type":70,"value":3788},",",{"type":65,"tag":2735,"props":3790,"children":3791},{"style":2748},[3792],{"type":70,"value":3070},{"type":65,"tag":2735,"props":3794,"children":3795},{"style":3073},[3796],{"type":70,"value":3797},"message.chat.id",{"type":65,"tag":2735,"props":3799,"children":3800},{"style":2748},[3801],{"type":70,"value":3080},{"type":65,"tag":2735,"props":3803,"children":3804},{"style":2758},[3805],{"type":70,"value":3686},{"type":65,"tag":2735,"props":3807,"children":3808},{"class":2737,"line":2754},[3809,3814,3818,3822,3827,3831,3835,3839,3843],{"type":65,"tag":2735,"props":3810,"children":3811},{"style":3766},[3812],{"type":70,"value":3813},"eventId",{"type":65,"tag":2735,"props":3815,"children":3816},{"style":2748},[3817],{"type":70,"value":3515},{"type":65,"tag":2735,"props":3819,"children":3820},{"style":3660},[3821],{"type":70,"value":3778},{"type":65,"tag":2735,"props":3823,"children":3824},{"style":2758},[3825],{"type":70,"value":3826},"(extractEventId",{"type":65,"tag":2735,"props":3828,"children":3829},{"style":2748},[3830],{"type":70,"value":3788},{"type":65,"tag":2735,"props":3832,"children":3833},{"style":2748},[3834],{"type":70,"value":3070},{"type":65,"tag":2735,"props":3836,"children":3837},{"style":3073},[3838],{"type":70,"value":3813},{"type":65,"tag":2735,"props":3840,"children":3841},{"style":2748},[3842],{"type":70,"value":3080},{"type":65,"tag":2735,"props":3844,"children":3845},{"style":2758},[3846],{"type":70,"value":3686},{"type":65,"tag":80,"props":3848,"children":3849},{},[3850,3851,3857,3858,3864,3866,3872,3873,3878,3880,3885],{"type":70,"value":385},{"type":65,"tag":86,"props":3852,"children":3854},{"className":3853},[],[3855],{"type":70,"value":3856},"$('NodeName').item.json.field",{"type":70,"value":530},{"type":65,"tag":86,"props":3859,"children":3861},{"className":3860},[],[3862],{"type":70,"value":3863},"nodeJson(sourceNode, 'field')",{"type":70,"value":3865}," for\nper-item upstream values. Do not use ",{"type":65,"tag":86,"props":3867,"children":3869},{"className":3868},[],[3870],{"type":70,"value":3871},".first()",{"type":70,"value":530},{"type":65,"tag":86,"props":3874,"children":3876},{"className":3875},[],[3877],{"type":70,"value":2620},{"type":70,"value":3879}," for\nper-item data in a multi-item workflow; it always reads item 0 and makes every\ndownstream item reuse the first value. Use ",{"type":65,"tag":86,"props":3881,"children":3883},{"className":3882},[],[3884],{"type":70,"value":3871},{"type":70,"value":3886}," only for a true global\nfirst item, such as a single configuration row.",{"type":65,"tag":73,"props":3888,"children":3890},{"id":3889},"sdk-patterns-reference",[3891],{"type":70,"value":3892},"SDK Patterns Reference",{"type":65,"tag":80,"props":3894,"children":3895},{},[3896],{"type":70,"value":3897},"Define nodes first, then compose the workflow:",{"type":65,"tag":2725,"props":3899,"children":3901},{"className":2727,"code":3900,"language":2593,"meta":2729,"style":2729},"const startTrigger = trigger({\n  type: 'n8n-nodes-base.manualTrigger',\n  version: 1,\n  config: { name: 'Start' },\n});\n\nconst fetchData = node({\n  type: 'n8n-nodes-base.httpRequest',\n  version: 4.3,\n  config: { name: 'Fetch Data', parameters: { method: 'GET', url: placeholder('API URL') } },\n});\n\nexport default workflow('id', 'name').add(startTrigger).to(fetchData);\n",[3902],{"type":65,"tag":86,"props":3903,"children":3904},{"__ignoreMap":2729},[3905,3938,3968,3990,4034,4049,4058,4087,4115,4135,4258,4273,4280],{"type":65,"tag":2735,"props":3906,"children":3907},{"class":2737,"line":2738},[3908,3914,3919,3924,3929,3933],{"type":65,"tag":2735,"props":3909,"children":3911},{"style":3910},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[3912],{"type":70,"value":3913},"const",{"type":65,"tag":2735,"props":3915,"children":3916},{"style":2758},[3917],{"type":70,"value":3918}," startTrigger ",{"type":65,"tag":2735,"props":3920,"children":3921},{"style":2748},[3922],{"type":70,"value":3923},"=",{"type":65,"tag":2735,"props":3925,"children":3926},{"style":3660},[3927],{"type":70,"value":3928}," trigger",{"type":65,"tag":2735,"props":3930,"children":3931},{"style":2758},[3932],{"type":70,"value":3668},{"type":65,"tag":2735,"props":3934,"children":3935},{"style":2748},[3936],{"type":70,"value":3937},"{\n",{"type":65,"tag":2735,"props":3939,"children":3940},{"class":2737,"line":2754},[3941,3947,3951,3955,3960,3964],{"type":65,"tag":2735,"props":3942,"children":3944},{"style":3943},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[3945],{"type":70,"value":3946},"  type",{"type":65,"tag":2735,"props":3948,"children":3949},{"style":2748},[3950],{"type":70,"value":3515},{"type":65,"tag":2735,"props":3952,"children":3953},{"style":2748},[3954],{"type":70,"value":3070},{"type":65,"tag":2735,"props":3956,"children":3957},{"style":3073},[3958],{"type":70,"value":3959},"n8n-nodes-base.manualTrigger",{"type":65,"tag":2735,"props":3961,"children":3962},{"style":2748},[3963],{"type":70,"value":3080},{"type":65,"tag":2735,"props":3965,"children":3966},{"style":2748},[3967],{"type":70,"value":582},{"type":65,"tag":2735,"props":3969,"children":3970},{"class":2737,"line":2768},[3971,3976,3980,3986],{"type":65,"tag":2735,"props":3972,"children":3973},{"style":3943},[3974],{"type":70,"value":3975},"  version",{"type":65,"tag":2735,"props":3977,"children":3978},{"style":2748},[3979],{"type":70,"value":3515},{"type":65,"tag":2735,"props":3981,"children":3983},{"style":3982},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[3984],{"type":70,"value":3985}," 1",{"type":65,"tag":2735,"props":3987,"children":3988},{"style":2748},[3989],{"type":70,"value":582},{"type":65,"tag":2735,"props":3991,"children":3992},{"class":2737,"line":2781},[3993,3998,4002,4007,4012,4016,4020,4025,4029],{"type":65,"tag":2735,"props":3994,"children":3995},{"style":3943},[3996],{"type":70,"value":3997},"  config",{"type":65,"tag":2735,"props":3999,"children":4000},{"style":2748},[4001],{"type":70,"value":3515},{"type":65,"tag":2735,"props":4003,"children":4004},{"style":2748},[4005],{"type":70,"value":4006}," {",{"type":65,"tag":2735,"props":4008,"children":4009},{"style":3943},[4010],{"type":70,"value":4011}," name",{"type":65,"tag":2735,"props":4013,"children":4014},{"style":2748},[4015],{"type":70,"value":3515},{"type":65,"tag":2735,"props":4017,"children":4018},{"style":2748},[4019],{"type":70,"value":3070},{"type":65,"tag":2735,"props":4021,"children":4022},{"style":3073},[4023],{"type":70,"value":4024},"Start",{"type":65,"tag":2735,"props":4026,"children":4027},{"style":2748},[4028],{"type":70,"value":3080},{"type":65,"tag":2735,"props":4030,"children":4031},{"style":2748},[4032],{"type":70,"value":4033}," },\n",{"type":65,"tag":2735,"props":4035,"children":4036},{"class":2737,"line":2794},[4037,4041,4045],{"type":65,"tag":2735,"props":4038,"children":4039},{"style":2748},[4040],{"type":70,"value":3060},{"type":65,"tag":2735,"props":4042,"children":4043},{"style":2758},[4044],{"type":70,"value":503},{"type":65,"tag":2735,"props":4046,"children":4047},{"style":2748},[4048],{"type":70,"value":271},{"type":65,"tag":2735,"props":4050,"children":4051},{"class":2737,"line":2807},[4052],{"type":65,"tag":2735,"props":4053,"children":4055},{"emptyLinePlaceholder":4054},true,[4056],{"type":70,"value":4057},"\n",{"type":65,"tag":2735,"props":4059,"children":4060},{"class":2737,"line":2820},[4061,4065,4070,4074,4079,4083],{"type":65,"tag":2735,"props":4062,"children":4063},{"style":3910},[4064],{"type":70,"value":3913},{"type":65,"tag":2735,"props":4066,"children":4067},{"style":2758},[4068],{"type":70,"value":4069}," fetchData ",{"type":65,"tag":2735,"props":4071,"children":4072},{"style":2748},[4073],{"type":70,"value":3923},{"type":65,"tag":2735,"props":4075,"children":4076},{"style":3660},[4077],{"type":70,"value":4078}," node",{"type":65,"tag":2735,"props":4080,"children":4081},{"style":2758},[4082],{"type":70,"value":3668},{"type":65,"tag":2735,"props":4084,"children":4085},{"style":2748},[4086],{"type":70,"value":3937},{"type":65,"tag":2735,"props":4088,"children":4089},{"class":2737,"line":2833},[4090,4094,4098,4102,4107,4111],{"type":65,"tag":2735,"props":4091,"children":4092},{"style":3943},[4093],{"type":70,"value":3946},{"type":65,"tag":2735,"props":4095,"children":4096},{"style":2748},[4097],{"type":70,"value":3515},{"type":65,"tag":2735,"props":4099,"children":4100},{"style":2748},[4101],{"type":70,"value":3070},{"type":65,"tag":2735,"props":4103,"children":4104},{"style":3073},[4105],{"type":70,"value":4106},"n8n-nodes-base.httpRequest",{"type":65,"tag":2735,"props":4108,"children":4109},{"style":2748},[4110],{"type":70,"value":3080},{"type":65,"tag":2735,"props":4112,"children":4113},{"style":2748},[4114],{"type":70,"value":582},{"type":65,"tag":2735,"props":4116,"children":4117},{"class":2737,"line":2846},[4118,4122,4126,4131],{"type":65,"tag":2735,"props":4119,"children":4120},{"style":3943},[4121],{"type":70,"value":3975},{"type":65,"tag":2735,"props":4123,"children":4124},{"style":2748},[4125],{"type":70,"value":3515},{"type":65,"tag":2735,"props":4127,"children":4128},{"style":3982},[4129],{"type":70,"value":4130}," 4.3",{"type":65,"tag":2735,"props":4132,"children":4133},{"style":2748},[4134],{"type":70,"value":582},{"type":65,"tag":2735,"props":4136,"children":4137},{"class":2737,"line":2859},[4138,4142,4146,4150,4154,4158,4162,4167,4171,4175,4180,4184,4188,4193,4197,4201,4206,4210,4214,4219,4223,4228,4232,4236,4241,4245,4250,4254],{"type":65,"tag":2735,"props":4139,"children":4140},{"style":3943},[4141],{"type":70,"value":3997},{"type":65,"tag":2735,"props":4143,"children":4144},{"style":2748},[4145],{"type":70,"value":3515},{"type":65,"tag":2735,"props":4147,"children":4148},{"style":2748},[4149],{"type":70,"value":4006},{"type":65,"tag":2735,"props":4151,"children":4152},{"style":3943},[4153],{"type":70,"value":4011},{"type":65,"tag":2735,"props":4155,"children":4156},{"style":2748},[4157],{"type":70,"value":3515},{"type":65,"tag":2735,"props":4159,"children":4160},{"style":2748},[4161],{"type":70,"value":3070},{"type":65,"tag":2735,"props":4163,"children":4164},{"style":3073},[4165],{"type":70,"value":4166},"Fetch Data",{"type":65,"tag":2735,"props":4168,"children":4169},{"style":2748},[4170],{"type":70,"value":3080},{"type":65,"tag":2735,"props":4172,"children":4173},{"style":2748},[4174],{"type":70,"value":3788},{"type":65,"tag":2735,"props":4176,"children":4177},{"style":3943},[4178],{"type":70,"value":4179}," parameters",{"type":65,"tag":2735,"props":4181,"children":4182},{"style":2748},[4183],{"type":70,"value":3515},{"type":65,"tag":2735,"props":4185,"children":4186},{"style":2748},[4187],{"type":70,"value":4006},{"type":65,"tag":2735,"props":4189,"children":4190},{"style":3943},[4191],{"type":70,"value":4192}," method",{"type":65,"tag":2735,"props":4194,"children":4195},{"style":2748},[4196],{"type":70,"value":3515},{"type":65,"tag":2735,"props":4198,"children":4199},{"style":2748},[4200],{"type":70,"value":3070},{"type":65,"tag":2735,"props":4202,"children":4203},{"style":3073},[4204],{"type":70,"value":4205},"GET",{"type":65,"tag":2735,"props":4207,"children":4208},{"style":2748},[4209],{"type":70,"value":3080},{"type":65,"tag":2735,"props":4211,"children":4212},{"style":2748},[4213],{"type":70,"value":3788},{"type":65,"tag":2735,"props":4215,"children":4216},{"style":3943},[4217],{"type":70,"value":4218}," url",{"type":65,"tag":2735,"props":4220,"children":4221},{"style":2748},[4222],{"type":70,"value":3515},{"type":65,"tag":2735,"props":4224,"children":4225},{"style":3660},[4226],{"type":70,"value":4227}," placeholder",{"type":65,"tag":2735,"props":4229,"children":4230},{"style":2758},[4231],{"type":70,"value":3668},{"type":65,"tag":2735,"props":4233,"children":4234},{"style":2748},[4235],{"type":70,"value":3080},{"type":65,"tag":2735,"props":4237,"children":4238},{"style":3073},[4239],{"type":70,"value":4240},"API URL",{"type":65,"tag":2735,"props":4242,"children":4243},{"style":2748},[4244],{"type":70,"value":3080},{"type":65,"tag":2735,"props":4246,"children":4247},{"style":2758},[4248],{"type":70,"value":4249},") ",{"type":65,"tag":2735,"props":4251,"children":4252},{"style":2748},[4253],{"type":70,"value":3060},{"type":65,"tag":2735,"props":4255,"children":4256},{"style":2748},[4257],{"type":70,"value":4033},{"type":65,"tag":2735,"props":4259,"children":4260},{"class":2737,"line":2872},[4261,4265,4269],{"type":65,"tag":2735,"props":4262,"children":4263},{"style":2748},[4264],{"type":70,"value":3060},{"type":65,"tag":2735,"props":4266,"children":4267},{"style":2758},[4268],{"type":70,"value":503},{"type":65,"tag":2735,"props":4270,"children":4271},{"style":2748},[4272],{"type":70,"value":271},{"type":65,"tag":2735,"props":4274,"children":4275},{"class":2737,"line":2885},[4276],{"type":65,"tag":2735,"props":4277,"children":4278},{"emptyLinePlaceholder":4054},[4279],{"type":70,"value":4057},{"type":65,"tag":2735,"props":4281,"children":4282},{"class":2737,"line":2898},[4283,4288,4293,4298,4302,4306,4310,4314,4318,4322,4326,4330,4334,4338,4343,4348,4352,4357,4362],{"type":65,"tag":2735,"props":4284,"children":4285},{"style":2742},[4286],{"type":70,"value":4287},"export",{"type":65,"tag":2735,"props":4289,"children":4290},{"style":2742},[4291],{"type":70,"value":4292}," default",{"type":65,"tag":2735,"props":4294,"children":4295},{"style":3660},[4296],{"type":70,"value":4297}," workflow",{"type":65,"tag":2735,"props":4299,"children":4300},{"style":2758},[4301],{"type":70,"value":3668},{"type":65,"tag":2735,"props":4303,"children":4304},{"style":2748},[4305],{"type":70,"value":3080},{"type":65,"tag":2735,"props":4307,"children":4308},{"style":3073},[4309],{"type":70,"value":1537},{"type":65,"tag":2735,"props":4311,"children":4312},{"style":2748},[4313],{"type":70,"value":3080},{"type":65,"tag":2735,"props":4315,"children":4316},{"style":2748},[4317],{"type":70,"value":3788},{"type":65,"tag":2735,"props":4319,"children":4320},{"style":2748},[4321],{"type":70,"value":3070},{"type":65,"tag":2735,"props":4323,"children":4324},{"style":3073},[4325],{"type":70,"value":1544},{"type":65,"tag":2735,"props":4327,"children":4328},{"style":2748},[4329],{"type":70,"value":3080},{"type":65,"tag":2735,"props":4331,"children":4332},{"style":2758},[4333],{"type":70,"value":503},{"type":65,"tag":2735,"props":4335,"children":4336},{"style":2748},[4337],{"type":70,"value":1273},{"type":65,"tag":2735,"props":4339,"children":4340},{"style":3660},[4341],{"type":70,"value":4342},"add",{"type":65,"tag":2735,"props":4344,"children":4345},{"style":2758},[4346],{"type":70,"value":4347},"(startTrigger)",{"type":65,"tag":2735,"props":4349,"children":4350},{"style":2748},[4351],{"type":70,"value":1273},{"type":65,"tag":2735,"props":4353,"children":4354},{"style":3660},[4355],{"type":70,"value":4356},"to",{"type":65,"tag":2735,"props":4358,"children":4359},{"style":2758},[4360],{"type":70,"value":4361},"(fetchData)",{"type":65,"tag":2735,"props":4363,"children":4364},{"style":2748},[4365],{"type":70,"value":271},{"type":65,"tag":80,"props":4367,"children":4368},{},[4369,4371,4376],{"type":70,"value":4370},"When two upstream data sources are independent, do not chain them if that would\nmultiply items. Use ",{"type":65,"tag":86,"props":4372,"children":4374},{"className":4373},[],[4375],{"type":70,"value":2540},{"type":70,"value":4377}," or parallel branches plus Merge.",{"type":65,"tag":80,"props":4379,"children":4380},{},[4381],{"type":70,"value":4382},"For Merge nodes, input indices are zero-based:",{"type":65,"tag":2725,"props":4384,"children":4386},{"className":2727,"code":4385,"language":2593,"meta":2729,"style":2729},"const combine = merge({\n  version: 3.2,\n  config: { name: 'Combine Results', parameters: { mode: 'combine', combineBy: 'combineByPosition' } },\n});\n\nexport default workflow('id', 'name')\n  .add(startTrigger)\n  .to(sourceA.to(combine.input(0)))\n  .add(startTrigger)\n  .to(sourceB.to(combine.input(1)))\n  .add(combine)\n  .to(processResults);\n",[4387],{"type":65,"tag":86,"props":4388,"children":4389},{"__ignoreMap":2729},[4390,4419,4439,4548,4563,4570,4621,4638,4690,4705,4754,4770],{"type":65,"tag":2735,"props":4391,"children":4392},{"class":2737,"line":2738},[4393,4397,4402,4406,4411,4415],{"type":65,"tag":2735,"props":4394,"children":4395},{"style":3910},[4396],{"type":70,"value":3913},{"type":65,"tag":2735,"props":4398,"children":4399},{"style":2758},[4400],{"type":70,"value":4401}," combine ",{"type":65,"tag":2735,"props":4403,"children":4404},{"style":2748},[4405],{"type":70,"value":3923},{"type":65,"tag":2735,"props":4407,"children":4408},{"style":3660},[4409],{"type":70,"value":4410}," merge",{"type":65,"tag":2735,"props":4412,"children":4413},{"style":2758},[4414],{"type":70,"value":3668},{"type":65,"tag":2735,"props":4416,"children":4417},{"style":2748},[4418],{"type":70,"value":3937},{"type":65,"tag":2735,"props":4420,"children":4421},{"class":2737,"line":2754},[4422,4426,4430,4435],{"type":65,"tag":2735,"props":4423,"children":4424},{"style":3943},[4425],{"type":70,"value":3975},{"type":65,"tag":2735,"props":4427,"children":4428},{"style":2748},[4429],{"type":70,"value":3515},{"type":65,"tag":2735,"props":4431,"children":4432},{"style":3982},[4433],{"type":70,"value":4434}," 3.2",{"type":65,"tag":2735,"props":4436,"children":4437},{"style":2748},[4438],{"type":70,"value":582},{"type":65,"tag":2735,"props":4440,"children":4441},{"class":2737,"line":2768},[4442,4446,4450,4454,4458,4462,4466,4471,4475,4479,4483,4487,4491,4496,4500,4504,4509,4513,4517,4522,4526,4530,4535,4539,4544],{"type":65,"tag":2735,"props":4443,"children":4444},{"style":3943},[4445],{"type":70,"value":3997},{"type":65,"tag":2735,"props":4447,"children":4448},{"style":2748},[4449],{"type":70,"value":3515},{"type":65,"tag":2735,"props":4451,"children":4452},{"style":2748},[4453],{"type":70,"value":4006},{"type":65,"tag":2735,"props":4455,"children":4456},{"style":3943},[4457],{"type":70,"value":4011},{"type":65,"tag":2735,"props":4459,"children":4460},{"style":2748},[4461],{"type":70,"value":3515},{"type":65,"tag":2735,"props":4463,"children":4464},{"style":2748},[4465],{"type":70,"value":3070},{"type":65,"tag":2735,"props":4467,"children":4468},{"style":3073},[4469],{"type":70,"value":4470},"Combine Results",{"type":65,"tag":2735,"props":4472,"children":4473},{"style":2748},[4474],{"type":70,"value":3080},{"type":65,"tag":2735,"props":4476,"children":4477},{"style":2748},[4478],{"type":70,"value":3788},{"type":65,"tag":2735,"props":4480,"children":4481},{"style":3943},[4482],{"type":70,"value":4179},{"type":65,"tag":2735,"props":4484,"children":4485},{"style":2748},[4486],{"type":70,"value":3515},{"type":65,"tag":2735,"props":4488,"children":4489},{"style":2748},[4490],{"type":70,"value":4006},{"type":65,"tag":2735,"props":4492,"children":4493},{"style":3943},[4494],{"type":70,"value":4495}," mode",{"type":65,"tag":2735,"props":4497,"children":4498},{"style":2748},[4499],{"type":70,"value":3515},{"type":65,"tag":2735,"props":4501,"children":4502},{"style":2748},[4503],{"type":70,"value":3070},{"type":65,"tag":2735,"props":4505,"children":4506},{"style":3073},[4507],{"type":70,"value":4508},"combine",{"type":65,"tag":2735,"props":4510,"children":4511},{"style":2748},[4512],{"type":70,"value":3080},{"type":65,"tag":2735,"props":4514,"children":4515},{"style":2748},[4516],{"type":70,"value":3788},{"type":65,"tag":2735,"props":4518,"children":4519},{"style":3943},[4520],{"type":70,"value":4521}," combineBy",{"type":65,"tag":2735,"props":4523,"children":4524},{"style":2748},[4525],{"type":70,"value":3515},{"type":65,"tag":2735,"props":4527,"children":4528},{"style":2748},[4529],{"type":70,"value":3070},{"type":65,"tag":2735,"props":4531,"children":4532},{"style":3073},[4533],{"type":70,"value":4534},"combineByPosition",{"type":65,"tag":2735,"props":4536,"children":4537},{"style":2748},[4538],{"type":70,"value":3080},{"type":65,"tag":2735,"props":4540,"children":4541},{"style":2748},[4542],{"type":70,"value":4543}," }",{"type":65,"tag":2735,"props":4545,"children":4546},{"style":2748},[4547],{"type":70,"value":4033},{"type":65,"tag":2735,"props":4549,"children":4550},{"class":2737,"line":2781},[4551,4555,4559],{"type":65,"tag":2735,"props":4552,"children":4553},{"style":2748},[4554],{"type":70,"value":3060},{"type":65,"tag":2735,"props":4556,"children":4557},{"style":2758},[4558],{"type":70,"value":503},{"type":65,"tag":2735,"props":4560,"children":4561},{"style":2748},[4562],{"type":70,"value":271},{"type":65,"tag":2735,"props":4564,"children":4565},{"class":2737,"line":2794},[4566],{"type":65,"tag":2735,"props":4567,"children":4568},{"emptyLinePlaceholder":4054},[4569],{"type":70,"value":4057},{"type":65,"tag":2735,"props":4571,"children":4572},{"class":2737,"line":2807},[4573,4577,4581,4585,4589,4593,4597,4601,4605,4609,4613,4617],{"type":65,"tag":2735,"props":4574,"children":4575},{"style":2742},[4576],{"type":70,"value":4287},{"type":65,"tag":2735,"props":4578,"children":4579},{"style":2742},[4580],{"type":70,"value":4292},{"type":65,"tag":2735,"props":4582,"children":4583},{"style":3660},[4584],{"type":70,"value":4297},{"type":65,"tag":2735,"props":4586,"children":4587},{"style":2758},[4588],{"type":70,"value":3668},{"type":65,"tag":2735,"props":4590,"children":4591},{"style":2748},[4592],{"type":70,"value":3080},{"type":65,"tag":2735,"props":4594,"children":4595},{"style":3073},[4596],{"type":70,"value":1537},{"type":65,"tag":2735,"props":4598,"children":4599},{"style":2748},[4600],{"type":70,"value":3080},{"type":65,"tag":2735,"props":4602,"children":4603},{"style":2748},[4604],{"type":70,"value":3788},{"type":65,"tag":2735,"props":4606,"children":4607},{"style":2748},[4608],{"type":70,"value":3070},{"type":65,"tag":2735,"props":4610,"children":4611},{"style":3073},[4612],{"type":70,"value":1544},{"type":65,"tag":2735,"props":4614,"children":4615},{"style":2748},[4616],{"type":70,"value":3080},{"type":65,"tag":2735,"props":4618,"children":4619},{"style":2758},[4620],{"type":70,"value":3686},{"type":65,"tag":2735,"props":4622,"children":4623},{"class":2737,"line":2820},[4624,4629,4633],{"type":65,"tag":2735,"props":4625,"children":4626},{"style":2748},[4627],{"type":70,"value":4628},"  .",{"type":65,"tag":2735,"props":4630,"children":4631},{"style":3660},[4632],{"type":70,"value":4342},{"type":65,"tag":2735,"props":4634,"children":4635},{"style":2758},[4636],{"type":70,"value":4637},"(startTrigger)\n",{"type":65,"tag":2735,"props":4639,"children":4640},{"class":2737,"line":2833},[4641,4645,4649,4654,4658,4662,4667,4671,4676,4680,4685],{"type":65,"tag":2735,"props":4642,"children":4643},{"style":2748},[4644],{"type":70,"value":4628},{"type":65,"tag":2735,"props":4646,"children":4647},{"style":3660},[4648],{"type":70,"value":4356},{"type":65,"tag":2735,"props":4650,"children":4651},{"style":2758},[4652],{"type":70,"value":4653},"(sourceA",{"type":65,"tag":2735,"props":4655,"children":4656},{"style":2748},[4657],{"type":70,"value":1273},{"type":65,"tag":2735,"props":4659,"children":4660},{"style":3660},[4661],{"type":70,"value":4356},{"type":65,"tag":2735,"props":4663,"children":4664},{"style":2758},[4665],{"type":70,"value":4666},"(combine",{"type":65,"tag":2735,"props":4668,"children":4669},{"style":2748},[4670],{"type":70,"value":1273},{"type":65,"tag":2735,"props":4672,"children":4673},{"style":3660},[4674],{"type":70,"value":4675},"input",{"type":65,"tag":2735,"props":4677,"children":4678},{"style":2758},[4679],{"type":70,"value":3668},{"type":65,"tag":2735,"props":4681,"children":4682},{"style":3982},[4683],{"type":70,"value":4684},"0",{"type":65,"tag":2735,"props":4686,"children":4687},{"style":2758},[4688],{"type":70,"value":4689},")))\n",{"type":65,"tag":2735,"props":4691,"children":4692},{"class":2737,"line":2846},[4693,4697,4701],{"type":65,"tag":2735,"props":4694,"children":4695},{"style":2748},[4696],{"type":70,"value":4628},{"type":65,"tag":2735,"props":4698,"children":4699},{"style":3660},[4700],{"type":70,"value":4342},{"type":65,"tag":2735,"props":4702,"children":4703},{"style":2758},[4704],{"type":70,"value":4637},{"type":65,"tag":2735,"props":4706,"children":4707},{"class":2737,"line":2859},[4708,4712,4716,4721,4725,4729,4733,4737,4741,4745,4750],{"type":65,"tag":2735,"props":4709,"children":4710},{"style":2748},[4711],{"type":70,"value":4628},{"type":65,"tag":2735,"props":4713,"children":4714},{"style":3660},[4715],{"type":70,"value":4356},{"type":65,"tag":2735,"props":4717,"children":4718},{"style":2758},[4719],{"type":70,"value":4720},"(sourceB",{"type":65,"tag":2735,"props":4722,"children":4723},{"style":2748},[4724],{"type":70,"value":1273},{"type":65,"tag":2735,"props":4726,"children":4727},{"style":3660},[4728],{"type":70,"value":4356},{"type":65,"tag":2735,"props":4730,"children":4731},{"style":2758},[4732],{"type":70,"value":4666},{"type":65,"tag":2735,"props":4734,"children":4735},{"style":2748},[4736],{"type":70,"value":1273},{"type":65,"tag":2735,"props":4738,"children":4739},{"style":3660},[4740],{"type":70,"value":4675},{"type":65,"tag":2735,"props":4742,"children":4743},{"style":2758},[4744],{"type":70,"value":3668},{"type":65,"tag":2735,"props":4746,"children":4747},{"style":3982},[4748],{"type":70,"value":4749},"1",{"type":65,"tag":2735,"props":4751,"children":4752},{"style":2758},[4753],{"type":70,"value":4689},{"type":65,"tag":2735,"props":4755,"children":4756},{"class":2737,"line":2872},[4757,4761,4765],{"type":65,"tag":2735,"props":4758,"children":4759},{"style":2748},[4760],{"type":70,"value":4628},{"type":65,"tag":2735,"props":4762,"children":4763},{"style":3660},[4764],{"type":70,"value":4342},{"type":65,"tag":2735,"props":4766,"children":4767},{"style":2758},[4768],{"type":70,"value":4769},"(combine)\n",{"type":65,"tag":2735,"props":4771,"children":4772},{"class":2737,"line":2885},[4773,4777,4781,4786],{"type":65,"tag":2735,"props":4774,"children":4775},{"style":2748},[4776],{"type":70,"value":4628},{"type":65,"tag":2735,"props":4778,"children":4779},{"style":3660},[4780],{"type":70,"value":4356},{"type":65,"tag":2735,"props":4782,"children":4783},{"style":2758},[4784],{"type":70,"value":4785},"(processResults)",{"type":65,"tag":2735,"props":4787,"children":4788},{"style":2748},[4789],{"type":70,"value":271},{"type":65,"tag":80,"props":4791,"children":4792},{},[4793,4795,4801,4803,4808,4810,4815],{"type":70,"value":4794},"For IF, each branch is a complete processing path. Wire branches on the workflow\nbuilder, not as standalone calls on the IF node variable. Chain steps inside a\nbranch with ",{"type":65,"tag":86,"props":4796,"children":4798},{"className":4797},[],[4799],{"type":70,"value":4800},".to()",{"type":70,"value":4802},", or pass an array for parallel fan-out.\nNever call ",{"type":65,"tag":86,"props":4804,"children":4806},{"className":4805},[],[4807],{"type":70,"value":3208},{"type":70,"value":4809}," more than once (same for ",{"type":65,"tag":86,"props":4811,"children":4813},{"className":4812},[],[4814],{"type":70,"value":3200},{"type":70,"value":4816},"); each repeat\noverwrites the previous target.",{"type":65,"tag":2725,"props":4818,"children":4820},{"className":2727,"code":4819,"language":2593,"meta":2729,"style":2729},"const isImportant = ifElse({\n  version: 2.2,\n  config: {\n    name: 'Is Important',\n    parameters: {\n      conditions: {\n        options: { caseSensitive: true, leftValue: '', typeValidation: 'strict', version: 2 },\n        conditions: [\n          { id: 'priority', leftValue: expr('{{ $json.priority }}'), rightValue: 'high', operator: { type: 'string', operation: 'equals' } },\n        ],\n        combinator: 'and',\n      },\n    },\n  },\n});\n\nexport default workflow('id', 'name')\n  .add(startTrigger)\n  .to(isImportant)\n  .onTrue(handleImportant)                               \u002F\u002F single step\n  .onFalse(sendHolding.to(createTicket.to(alertSlack))); \u002F\u002F chained multi-step\n\u002F\u002F Equivalent inline form: .to(isImportant.onTrue(a).onFalse(b))\n\u002F\u002F Parallel fan-out on a branch: .onFalse([a, b, c])\n",[4821],{"type":65,"tag":86,"props":4822,"children":4823},{"__ignoreMap":2729},[4824,4853,4873,4888,4917,4933,4949,5046,5063,5230,5242,5271,5279,5287,5295,5310,5317,5368,5383,5399,5422,5475,5483],{"type":65,"tag":2735,"props":4825,"children":4826},{"class":2737,"line":2738},[4827,4831,4836,4840,4845,4849],{"type":65,"tag":2735,"props":4828,"children":4829},{"style":3910},[4830],{"type":70,"value":3913},{"type":65,"tag":2735,"props":4832,"children":4833},{"style":2758},[4834],{"type":70,"value":4835}," isImportant ",{"type":65,"tag":2735,"props":4837,"children":4838},{"style":2748},[4839],{"type":70,"value":3923},{"type":65,"tag":2735,"props":4841,"children":4842},{"style":3660},[4843],{"type":70,"value":4844}," ifElse",{"type":65,"tag":2735,"props":4846,"children":4847},{"style":2758},[4848],{"type":70,"value":3668},{"type":65,"tag":2735,"props":4850,"children":4851},{"style":2748},[4852],{"type":70,"value":3937},{"type":65,"tag":2735,"props":4854,"children":4855},{"class":2737,"line":2754},[4856,4860,4864,4869],{"type":65,"tag":2735,"props":4857,"children":4858},{"style":3943},[4859],{"type":70,"value":3975},{"type":65,"tag":2735,"props":4861,"children":4862},{"style":2748},[4863],{"type":70,"value":3515},{"type":65,"tag":2735,"props":4865,"children":4866},{"style":3982},[4867],{"type":70,"value":4868}," 2.2",{"type":65,"tag":2735,"props":4870,"children":4871},{"style":2748},[4872],{"type":70,"value":582},{"type":65,"tag":2735,"props":4874,"children":4875},{"class":2737,"line":2768},[4876,4880,4884],{"type":65,"tag":2735,"props":4877,"children":4878},{"style":3943},[4879],{"type":70,"value":3997},{"type":65,"tag":2735,"props":4881,"children":4882},{"style":2748},[4883],{"type":70,"value":3515},{"type":65,"tag":2735,"props":4885,"children":4886},{"style":2748},[4887],{"type":70,"value":2751},{"type":65,"tag":2735,"props":4889,"children":4890},{"class":2737,"line":2781},[4891,4896,4900,4904,4909,4913],{"type":65,"tag":2735,"props":4892,"children":4893},{"style":3943},[4894],{"type":70,"value":4895},"    name",{"type":65,"tag":2735,"props":4897,"children":4898},{"style":2748},[4899],{"type":70,"value":3515},{"type":65,"tag":2735,"props":4901,"children":4902},{"style":2748},[4903],{"type":70,"value":3070},{"type":65,"tag":2735,"props":4905,"children":4906},{"style":3073},[4907],{"type":70,"value":4908},"Is Important",{"type":65,"tag":2735,"props":4910,"children":4911},{"style":2748},[4912],{"type":70,"value":3080},{"type":65,"tag":2735,"props":4914,"children":4915},{"style":2748},[4916],{"type":70,"value":582},{"type":65,"tag":2735,"props":4918,"children":4919},{"class":2737,"line":2794},[4920,4925,4929],{"type":65,"tag":2735,"props":4921,"children":4922},{"style":3943},[4923],{"type":70,"value":4924},"    parameters",{"type":65,"tag":2735,"props":4926,"children":4927},{"style":2748},[4928],{"type":70,"value":3515},{"type":65,"tag":2735,"props":4930,"children":4931},{"style":2748},[4932],{"type":70,"value":2751},{"type":65,"tag":2735,"props":4934,"children":4935},{"class":2737,"line":2807},[4936,4941,4945],{"type":65,"tag":2735,"props":4937,"children":4938},{"style":3943},[4939],{"type":70,"value":4940},"      conditions",{"type":65,"tag":2735,"props":4942,"children":4943},{"style":2748},[4944],{"type":70,"value":3515},{"type":65,"tag":2735,"props":4946,"children":4947},{"style":2748},[4948],{"type":70,"value":2751},{"type":65,"tag":2735,"props":4950,"children":4951},{"class":2737,"line":2820},[4952,4957,4961,4965,4970,4974,4980,4984,4989,4993,4998,5002,5007,5011,5015,5020,5024,5028,5033,5037,5042],{"type":65,"tag":2735,"props":4953,"children":4954},{"style":3943},[4955],{"type":70,"value":4956},"        options",{"type":65,"tag":2735,"props":4958,"children":4959},{"style":2748},[4960],{"type":70,"value":3515},{"type":65,"tag":2735,"props":4962,"children":4963},{"style":2748},[4964],{"type":70,"value":4006},{"type":65,"tag":2735,"props":4966,"children":4967},{"style":3943},[4968],{"type":70,"value":4969}," caseSensitive",{"type":65,"tag":2735,"props":4971,"children":4972},{"style":2748},[4973],{"type":70,"value":3515},{"type":65,"tag":2735,"props":4975,"children":4977},{"style":4976},"--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC",[4978],{"type":70,"value":4979}," true",{"type":65,"tag":2735,"props":4981,"children":4982},{"style":2748},[4983],{"type":70,"value":3788},{"type":65,"tag":2735,"props":4985,"children":4986},{"style":3943},[4987],{"type":70,"value":4988}," leftValue",{"type":65,"tag":2735,"props":4990,"children":4991},{"style":2748},[4992],{"type":70,"value":3515},{"type":65,"tag":2735,"props":4994,"children":4995},{"style":2748},[4996],{"type":70,"value":4997}," ''",{"type":65,"tag":2735,"props":4999,"children":5000},{"style":2748},[5001],{"type":70,"value":3788},{"type":65,"tag":2735,"props":5003,"children":5004},{"style":3943},[5005],{"type":70,"value":5006}," typeValidation",{"type":65,"tag":2735,"props":5008,"children":5009},{"style":2748},[5010],{"type":70,"value":3515},{"type":65,"tag":2735,"props":5012,"children":5013},{"style":2748},[5014],{"type":70,"value":3070},{"type":65,"tag":2735,"props":5016,"children":5017},{"style":3073},[5018],{"type":70,"value":5019},"strict",{"type":65,"tag":2735,"props":5021,"children":5022},{"style":2748},[5023],{"type":70,"value":3080},{"type":65,"tag":2735,"props":5025,"children":5026},{"style":2748},[5027],{"type":70,"value":3788},{"type":65,"tag":2735,"props":5029,"children":5030},{"style":3943},[5031],{"type":70,"value":5032}," version",{"type":65,"tag":2735,"props":5034,"children":5035},{"style":2748},[5036],{"type":70,"value":3515},{"type":65,"tag":2735,"props":5038,"children":5039},{"style":3982},[5040],{"type":70,"value":5041}," 2",{"type":65,"tag":2735,"props":5043,"children":5044},{"style":2748},[5045],{"type":70,"value":4033},{"type":65,"tag":2735,"props":5047,"children":5048},{"class":2737,"line":2833},[5049,5054,5058],{"type":65,"tag":2735,"props":5050,"children":5051},{"style":3943},[5052],{"type":70,"value":5053},"        conditions",{"type":65,"tag":2735,"props":5055,"children":5056},{"style":2748},[5057],{"type":70,"value":3515},{"type":65,"tag":2735,"props":5059,"children":5060},{"style":2758},[5061],{"type":70,"value":5062}," [\n",{"type":65,"tag":2735,"props":5064,"children":5065},{"class":2737,"line":2846},[5066,5071,5076,5080,5084,5089,5093,5097,5101,5105,5110,5114,5118,5123,5127,5131,5135,5140,5144,5148,5153,5157,5161,5166,5170,5174,5179,5183,5187,5192,5196,5200,5205,5209,5213,5218,5222,5226],{"type":65,"tag":2735,"props":5067,"children":5068},{"style":2748},[5069],{"type":70,"value":5070},"          {",{"type":65,"tag":2735,"props":5072,"children":5073},{"style":3943},[5074],{"type":70,"value":5075}," id",{"type":65,"tag":2735,"props":5077,"children":5078},{"style":2748},[5079],{"type":70,"value":3515},{"type":65,"tag":2735,"props":5081,"children":5082},{"style":2748},[5083],{"type":70,"value":3070},{"type":65,"tag":2735,"props":5085,"children":5086},{"style":3073},[5087],{"type":70,"value":5088},"priority",{"type":65,"tag":2735,"props":5090,"children":5091},{"style":2748},[5092],{"type":70,"value":3080},{"type":65,"tag":2735,"props":5094,"children":5095},{"style":2748},[5096],{"type":70,"value":3788},{"type":65,"tag":2735,"props":5098,"children":5099},{"style":3943},[5100],{"type":70,"value":4988},{"type":65,"tag":2735,"props":5102,"children":5103},{"style":2748},[5104],{"type":70,"value":3515},{"type":65,"tag":2735,"props":5106,"children":5107},{"style":3660},[5108],{"type":70,"value":5109}," expr",{"type":65,"tag":2735,"props":5111,"children":5112},{"style":2758},[5113],{"type":70,"value":3668},{"type":65,"tag":2735,"props":5115,"children":5116},{"style":2748},[5117],{"type":70,"value":3080},{"type":65,"tag":2735,"props":5119,"children":5120},{"style":3073},[5121],{"type":70,"value":5122},"{{ $json.priority }}",{"type":65,"tag":2735,"props":5124,"children":5125},{"style":2748},[5126],{"type":70,"value":3080},{"type":65,"tag":2735,"props":5128,"children":5129},{"style":2758},[5130],{"type":70,"value":503},{"type":65,"tag":2735,"props":5132,"children":5133},{"style":2748},[5134],{"type":70,"value":3788},{"type":65,"tag":2735,"props":5136,"children":5137},{"style":3943},[5138],{"type":70,"value":5139}," rightValue",{"type":65,"tag":2735,"props":5141,"children":5142},{"style":2748},[5143],{"type":70,"value":3515},{"type":65,"tag":2735,"props":5145,"children":5146},{"style":2748},[5147],{"type":70,"value":3070},{"type":65,"tag":2735,"props":5149,"children":5150},{"style":3073},[5151],{"type":70,"value":5152},"high",{"type":65,"tag":2735,"props":5154,"children":5155},{"style":2748},[5156],{"type":70,"value":3080},{"type":65,"tag":2735,"props":5158,"children":5159},{"style":2748},[5160],{"type":70,"value":3788},{"type":65,"tag":2735,"props":5162,"children":5163},{"style":3943},[5164],{"type":70,"value":5165}," operator",{"type":65,"tag":2735,"props":5167,"children":5168},{"style":2748},[5169],{"type":70,"value":3515},{"type":65,"tag":2735,"props":5171,"children":5172},{"style":2748},[5173],{"type":70,"value":4006},{"type":65,"tag":2735,"props":5175,"children":5176},{"style":3943},[5177],{"type":70,"value":5178}," type",{"type":65,"tag":2735,"props":5180,"children":5181},{"style":2748},[5182],{"type":70,"value":3515},{"type":65,"tag":2735,"props":5184,"children":5185},{"style":2748},[5186],{"type":70,"value":3070},{"type":65,"tag":2735,"props":5188,"children":5189},{"style":3073},[5190],{"type":70,"value":5191},"string",{"type":65,"tag":2735,"props":5193,"children":5194},{"style":2748},[5195],{"type":70,"value":3080},{"type":65,"tag":2735,"props":5197,"children":5198},{"style":2748},[5199],{"type":70,"value":3788},{"type":65,"tag":2735,"props":5201,"children":5202},{"style":3943},[5203],{"type":70,"value":5204}," operation",{"type":65,"tag":2735,"props":5206,"children":5207},{"style":2748},[5208],{"type":70,"value":3515},{"type":65,"tag":2735,"props":5210,"children":5211},{"style":2748},[5212],{"type":70,"value":3070},{"type":65,"tag":2735,"props":5214,"children":5215},{"style":3073},[5216],{"type":70,"value":5217},"equals",{"type":65,"tag":2735,"props":5219,"children":5220},{"style":2748},[5221],{"type":70,"value":3080},{"type":65,"tag":2735,"props":5223,"children":5224},{"style":2748},[5225],{"type":70,"value":4543},{"type":65,"tag":2735,"props":5227,"children":5228},{"style":2748},[5229],{"type":70,"value":4033},{"type":65,"tag":2735,"props":5231,"children":5232},{"class":2737,"line":2859},[5233,5238],{"type":65,"tag":2735,"props":5234,"children":5235},{"style":2758},[5236],{"type":70,"value":5237},"        ]",{"type":65,"tag":2735,"props":5239,"children":5240},{"style":2748},[5241],{"type":70,"value":582},{"type":65,"tag":2735,"props":5243,"children":5244},{"class":2737,"line":2872},[5245,5250,5254,5258,5263,5267],{"type":65,"tag":2735,"props":5246,"children":5247},{"style":3943},[5248],{"type":70,"value":5249},"        combinator",{"type":65,"tag":2735,"props":5251,"children":5252},{"style":2748},[5253],{"type":70,"value":3515},{"type":65,"tag":2735,"props":5255,"children":5256},{"style":2748},[5257],{"type":70,"value":3070},{"type":65,"tag":2735,"props":5259,"children":5260},{"style":3073},[5261],{"type":70,"value":5262},"and",{"type":65,"tag":2735,"props":5264,"children":5265},{"style":2748},[5266],{"type":70,"value":3080},{"type":65,"tag":2735,"props":5268,"children":5269},{"style":2748},[5270],{"type":70,"value":582},{"type":65,"tag":2735,"props":5272,"children":5273},{"class":2737,"line":2885},[5274],{"type":65,"tag":2735,"props":5275,"children":5276},{"style":2748},[5277],{"type":70,"value":5278},"      },\n",{"type":65,"tag":2735,"props":5280,"children":5281},{"class":2737,"line":2898},[5282],{"type":65,"tag":2735,"props":5283,"children":5284},{"style":2748},[5285],{"type":70,"value":5286},"    },\n",{"type":65,"tag":2735,"props":5288,"children":5289},{"class":2737,"line":2911},[5290],{"type":65,"tag":2735,"props":5291,"children":5292},{"style":2748},[5293],{"type":70,"value":5294},"  },\n",{"type":65,"tag":2735,"props":5296,"children":5297},{"class":2737,"line":2924},[5298,5302,5306],{"type":65,"tag":2735,"props":5299,"children":5300},{"style":2748},[5301],{"type":70,"value":3060},{"type":65,"tag":2735,"props":5303,"children":5304},{"style":2758},[5305],{"type":70,"value":503},{"type":65,"tag":2735,"props":5307,"children":5308},{"style":2748},[5309],{"type":70,"value":271},{"type":65,"tag":2735,"props":5311,"children":5312},{"class":2737,"line":2937},[5313],{"type":65,"tag":2735,"props":5314,"children":5315},{"emptyLinePlaceholder":4054},[5316],{"type":70,"value":4057},{"type":65,"tag":2735,"props":5318,"children":5319},{"class":2737,"line":2950},[5320,5324,5328,5332,5336,5340,5344,5348,5352,5356,5360,5364],{"type":65,"tag":2735,"props":5321,"children":5322},{"style":2742},[5323],{"type":70,"value":4287},{"type":65,"tag":2735,"props":5325,"children":5326},{"style":2742},[5327],{"type":70,"value":4292},{"type":65,"tag":2735,"props":5329,"children":5330},{"style":3660},[5331],{"type":70,"value":4297},{"type":65,"tag":2735,"props":5333,"children":5334},{"style":2758},[5335],{"type":70,"value":3668},{"type":65,"tag":2735,"props":5337,"children":5338},{"style":2748},[5339],{"type":70,"value":3080},{"type":65,"tag":2735,"props":5341,"children":5342},{"style":3073},[5343],{"type":70,"value":1537},{"type":65,"tag":2735,"props":5345,"children":5346},{"style":2748},[5347],{"type":70,"value":3080},{"type":65,"tag":2735,"props":5349,"children":5350},{"style":2748},[5351],{"type":70,"value":3788},{"type":65,"tag":2735,"props":5353,"children":5354},{"style":2748},[5355],{"type":70,"value":3070},{"type":65,"tag":2735,"props":5357,"children":5358},{"style":3073},[5359],{"type":70,"value":1544},{"type":65,"tag":2735,"props":5361,"children":5362},{"style":2748},[5363],{"type":70,"value":3080},{"type":65,"tag":2735,"props":5365,"children":5366},{"style":2758},[5367],{"type":70,"value":3686},{"type":65,"tag":2735,"props":5369,"children":5370},{"class":2737,"line":2963},[5371,5375,5379],{"type":65,"tag":2735,"props":5372,"children":5373},{"style":2748},[5374],{"type":70,"value":4628},{"type":65,"tag":2735,"props":5376,"children":5377},{"style":3660},[5378],{"type":70,"value":4342},{"type":65,"tag":2735,"props":5380,"children":5381},{"style":2758},[5382],{"type":70,"value":4637},{"type":65,"tag":2735,"props":5384,"children":5385},{"class":2737,"line":2976},[5386,5390,5394],{"type":65,"tag":2735,"props":5387,"children":5388},{"style":2748},[5389],{"type":70,"value":4628},{"type":65,"tag":2735,"props":5391,"children":5392},{"style":3660},[5393],{"type":70,"value":4356},{"type":65,"tag":2735,"props":5395,"children":5396},{"style":2758},[5397],{"type":70,"value":5398},"(isImportant)\n",{"type":65,"tag":2735,"props":5400,"children":5401},{"class":2737,"line":2989},[5402,5406,5411,5416],{"type":65,"tag":2735,"props":5403,"children":5404},{"style":2748},[5405],{"type":70,"value":4628},{"type":65,"tag":2735,"props":5407,"children":5408},{"style":3660},[5409],{"type":70,"value":5410},"onTrue",{"type":65,"tag":2735,"props":5412,"children":5413},{"style":2758},[5414],{"type":70,"value":5415},"(handleImportant)                               ",{"type":65,"tag":2735,"props":5417,"children":5419},{"style":5418},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[5420],{"type":70,"value":5421},"\u002F\u002F single step\n",{"type":65,"tag":2735,"props":5423,"children":5424},{"class":2737,"line":3002},[5425,5429,5434,5439,5443,5447,5452,5456,5460,5465,5470],{"type":65,"tag":2735,"props":5426,"children":5427},{"style":2748},[5428],{"type":70,"value":4628},{"type":65,"tag":2735,"props":5430,"children":5431},{"style":3660},[5432],{"type":70,"value":5433},"onFalse",{"type":65,"tag":2735,"props":5435,"children":5436},{"style":2758},[5437],{"type":70,"value":5438},"(sendHolding",{"type":65,"tag":2735,"props":5440,"children":5441},{"style":2748},[5442],{"type":70,"value":1273},{"type":65,"tag":2735,"props":5444,"children":5445},{"style":3660},[5446],{"type":70,"value":4356},{"type":65,"tag":2735,"props":5448,"children":5449},{"style":2758},[5450],{"type":70,"value":5451},"(createTicket",{"type":65,"tag":2735,"props":5453,"children":5454},{"style":2748},[5455],{"type":70,"value":1273},{"type":65,"tag":2735,"props":5457,"children":5458},{"style":3660},[5459],{"type":70,"value":4356},{"type":65,"tag":2735,"props":5461,"children":5462},{"style":2758},[5463],{"type":70,"value":5464},"(alertSlack)))",{"type":65,"tag":2735,"props":5466,"children":5467},{"style":2748},[5468],{"type":70,"value":5469},";",{"type":65,"tag":2735,"props":5471,"children":5472},{"style":5418},[5473],{"type":70,"value":5474}," \u002F\u002F chained multi-step\n",{"type":65,"tag":2735,"props":5476,"children":5477},{"class":2737,"line":3015},[5478],{"type":65,"tag":2735,"props":5479,"children":5480},{"style":5418},[5481],{"type":70,"value":5482},"\u002F\u002F Equivalent inline form: .to(isImportant.onTrue(a).onFalse(b))\n",{"type":65,"tag":2735,"props":5484,"children":5485},{"class":2737,"line":3028},[5486],{"type":65,"tag":2735,"props":5487,"children":5488},{"style":5418},[5489],{"type":70,"value":5490},"\u002F\u002F Parallel fan-out on a branch: .onFalse([a, b, c])\n",{"type":65,"tag":80,"props":5492,"children":5493},{},[5494,5496,5501],{"type":70,"value":5495},"Do NOT wire branches as standalone statements.\nThen branch nodes are omitted from the saved graph, and repeated ",{"type":65,"tag":86,"props":5497,"children":5499},{"className":5498},[],[5500],{"type":70,"value":3208},{"type":70,"value":5502},"\ncalls keep only the last target.",{"type":65,"tag":2725,"props":5504,"children":5506},{"className":2727,"code":5505,"language":2593,"meta":2729,"style":2729},"\u002F\u002F WRONG\nexport default workflow('id', 'name').add(startTrigger).to(isImportant);\nisImportant.onTrue(handleImportant); \u002F\u002F never reaches the builder\nisImportant.onFalse(sendHolding);    \u002F\u002F overwritten\nisImportant.onFalse(alertSlack);     \u002F\u002F only this one would wire\n",[5507],{"type":65,"tag":86,"props":5508,"children":5509},{"__ignoreMap":2729},[5510,5518,5598,5628,5657],{"type":65,"tag":2735,"props":5511,"children":5512},{"class":2737,"line":2738},[5513],{"type":65,"tag":2735,"props":5514,"children":5515},{"style":5418},[5516],{"type":70,"value":5517},"\u002F\u002F WRONG\n",{"type":65,"tag":2735,"props":5519,"children":5520},{"class":2737,"line":2754},[5521,5525,5529,5533,5537,5541,5545,5549,5553,5557,5561,5565,5569,5573,5577,5581,5585,5589,5594],{"type":65,"tag":2735,"props":5522,"children":5523},{"style":2742},[5524],{"type":70,"value":4287},{"type":65,"tag":2735,"props":5526,"children":5527},{"style":2742},[5528],{"type":70,"value":4292},{"type":65,"tag":2735,"props":5530,"children":5531},{"style":3660},[5532],{"type":70,"value":4297},{"type":65,"tag":2735,"props":5534,"children":5535},{"style":2758},[5536],{"type":70,"value":3668},{"type":65,"tag":2735,"props":5538,"children":5539},{"style":2748},[5540],{"type":70,"value":3080},{"type":65,"tag":2735,"props":5542,"children":5543},{"style":3073},[5544],{"type":70,"value":1537},{"type":65,"tag":2735,"props":5546,"children":5547},{"style":2748},[5548],{"type":70,"value":3080},{"type":65,"tag":2735,"props":5550,"children":5551},{"style":2748},[5552],{"type":70,"value":3788},{"type":65,"tag":2735,"props":5554,"children":5555},{"style":2748},[5556],{"type":70,"value":3070},{"type":65,"tag":2735,"props":5558,"children":5559},{"style":3073},[5560],{"type":70,"value":1544},{"type":65,"tag":2735,"props":5562,"children":5563},{"style":2748},[5564],{"type":70,"value":3080},{"type":65,"tag":2735,"props":5566,"children":5567},{"style":2758},[5568],{"type":70,"value":503},{"type":65,"tag":2735,"props":5570,"children":5571},{"style":2748},[5572],{"type":70,"value":1273},{"type":65,"tag":2735,"props":5574,"children":5575},{"style":3660},[5576],{"type":70,"value":4342},{"type":65,"tag":2735,"props":5578,"children":5579},{"style":2758},[5580],{"type":70,"value":4347},{"type":65,"tag":2735,"props":5582,"children":5583},{"style":2748},[5584],{"type":70,"value":1273},{"type":65,"tag":2735,"props":5586,"children":5587},{"style":3660},[5588],{"type":70,"value":4356},{"type":65,"tag":2735,"props":5590,"children":5591},{"style":2758},[5592],{"type":70,"value":5593},"(isImportant)",{"type":65,"tag":2735,"props":5595,"children":5596},{"style":2748},[5597],{"type":70,"value":271},{"type":65,"tag":2735,"props":5599,"children":5600},{"class":2737,"line":2768},[5601,5606,5610,5614,5619,5623],{"type":65,"tag":2735,"props":5602,"children":5603},{"style":2758},[5604],{"type":70,"value":5605},"isImportant",{"type":65,"tag":2735,"props":5607,"children":5608},{"style":2748},[5609],{"type":70,"value":1273},{"type":65,"tag":2735,"props":5611,"children":5612},{"style":3660},[5613],{"type":70,"value":5410},{"type":65,"tag":2735,"props":5615,"children":5616},{"style":2758},[5617],{"type":70,"value":5618},"(handleImportant)",{"type":65,"tag":2735,"props":5620,"children":5621},{"style":2748},[5622],{"type":70,"value":5469},{"type":65,"tag":2735,"props":5624,"children":5625},{"style":5418},[5626],{"type":70,"value":5627}," \u002F\u002F never reaches the builder\n",{"type":65,"tag":2735,"props":5629,"children":5630},{"class":2737,"line":2781},[5631,5635,5639,5643,5648,5652],{"type":65,"tag":2735,"props":5632,"children":5633},{"style":2758},[5634],{"type":70,"value":5605},{"type":65,"tag":2735,"props":5636,"children":5637},{"style":2748},[5638],{"type":70,"value":1273},{"type":65,"tag":2735,"props":5640,"children":5641},{"style":3660},[5642],{"type":70,"value":5433},{"type":65,"tag":2735,"props":5644,"children":5645},{"style":2758},[5646],{"type":70,"value":5647},"(sendHolding)",{"type":65,"tag":2735,"props":5649,"children":5650},{"style":2748},[5651],{"type":70,"value":5469},{"type":65,"tag":2735,"props":5653,"children":5654},{"style":5418},[5655],{"type":70,"value":5656},"    \u002F\u002F overwritten\n",{"type":65,"tag":2735,"props":5658,"children":5659},{"class":2737,"line":2794},[5660,5664,5668,5672,5677,5681],{"type":65,"tag":2735,"props":5661,"children":5662},{"style":2758},[5663],{"type":70,"value":5605},{"type":65,"tag":2735,"props":5665,"children":5666},{"style":2748},[5667],{"type":70,"value":1273},{"type":65,"tag":2735,"props":5669,"children":5670},{"style":3660},[5671],{"type":70,"value":5433},{"type":65,"tag":2735,"props":5673,"children":5674},{"style":2758},[5675],{"type":70,"value":5676},"(alertSlack)",{"type":65,"tag":2735,"props":5678,"children":5679},{"style":2748},[5680],{"type":70,"value":5469},{"type":65,"tag":2735,"props":5682,"children":5683},{"style":5418},[5684],{"type":70,"value":5685},"     \u002F\u002F only this one would wire\n",{"type":65,"tag":80,"props":5687,"children":5688},{},[5689,5691,5697,5699,5704],{"type":70,"value":5690},"For Switch, wire cases the same way — ",{"type":65,"tag":86,"props":5692,"children":5694},{"className":5693},[],[5695],{"type":70,"value":5696},".to(switchNode).onCase(0, a).onCase(1, b)",{"type":70,"value":5698},"\nor inline — using zero-based ",{"type":65,"tag":86,"props":5700,"children":5702},{"className":5701},[],[5703],{"type":70,"value":1106},{"type":70,"value":5705}," for each rule output.",{"type":65,"tag":80,"props":5707,"children":5708},{},[5709,5711,5716],{"type":70,"value":5710},"For Split in Batches, use it for per-item side effects and loop back with\n",{"type":65,"tag":86,"props":5712,"children":5714},{"className":5713},[],[5715],{"type":70,"value":3176},{"type":70,"value":5717},". Do not add a separate IF gate just to check whether items exist.",{"type":65,"tag":80,"props":5719,"children":5720},{},[5721],{"type":70,"value":5722},"For AI Agent workflows:",{"type":65,"tag":467,"props":5724,"children":5725},{},[5726,5731,5743,5755],{"type":65,"tag":448,"props":5727,"children":5728},{},[5729],{"type":70,"value":5730},"Attach language models, memory, tools, parsers, retrievers, vector stores, and\nother subnodes to the agent as subnodes.",{"type":65,"tag":448,"props":5732,"children":5733},{},[5734,5736,5741],{"type":70,"value":5735},"Tool nodes must have explicit concise ",{"type":65,"tag":86,"props":5737,"children":5739},{"className":5738},[],[5740],{"type":70,"value":3348},{"type":70,"value":5742}," values.",{"type":65,"tag":448,"props":5744,"children":5745},{},[5746,5747,5753],{"type":70,"value":1377},{"type":65,"tag":86,"props":5748,"children":5750},{"className":5749},[],[5751],{"type":70,"value":5752},"fromAi(...)",{"type":70,"value":5754}," for values the agent should supply to tools.",{"type":65,"tag":448,"props":5756,"children":5757},{},[5758,5760,5765],{"type":70,"value":5759},"Use explicit node references instead of ",{"type":65,"tag":86,"props":5761,"children":5763},{"className":5762},[],[5764],{"type":70,"value":2354},{"type":70,"value":5766}," in subnodes when the value\ncomes from a trigger or a main-flow node.",{"type":65,"tag":73,"props":5768,"children":5770},{"id":5769},"additional-sdk-functions",[5771],{"type":70,"value":5772},"Additional SDK Functions",{"type":65,"tag":467,"props":5774,"children":5775},{},[5776,5786,5797,5808,5827,5838],{"type":65,"tag":448,"props":5777,"children":5778},{},[5779,5784],{"type":65,"tag":86,"props":5780,"children":5782},{"className":5781},[],[5783],{"type":70,"value":2416},{"type":70,"value":5785},": marks a parameter value for user input.",{"type":65,"tag":448,"props":5787,"children":5788},{},[5789,5795],{"type":65,"tag":86,"props":5790,"children":5792},{"className":5791},[],[5793],{"type":70,"value":5794},"sticky('content', nodes?, config?)",{"type":70,"value":5796},": opt-in only when the user explicitly\nasks for a sticky note on the canvas. Do not import or call it otherwise.\nWhen used, it must still be added to the workflow.",{"type":65,"tag":448,"props":5798,"children":5799},{},[5800,5806],{"type":65,"tag":86,"props":5801,"children":5803},{"className":5802},[],[5804],{"type":70,"value":5805},".output(n)",{"type":70,"value":5807},": selects a zero-based output index.",{"type":65,"tag":448,"props":5809,"children":5810},{},[5811,5817,5819,5825],{"type":65,"tag":86,"props":5812,"children":5814},{"className":5813},[],[5815],{"type":70,"value":5816},".onError(handler)",{"type":70,"value":5818},": connects a node's error output to a handler. Requires\n",{"type":65,"tag":86,"props":5820,"children":5822},{"className":5821},[],[5823],{"type":70,"value":5824},"onError: 'continueErrorOutput'",{"type":70,"value":5826}," in the node config.",{"type":65,"tag":448,"props":5828,"children":5829},{},[5830,5836],{"type":65,"tag":86,"props":5831,"children":5833},{"className":5832},[],[5834],{"type":70,"value":5835},"nodeJson(node, 'field.path')",{"type":70,"value":5837},": creates an explicit expression reference to a\nspecific node's JSON output.",{"type":65,"tag":448,"props":5839,"children":5840},{},[5841,5843,5849,5850,5856,5858,5864,5865,5871,5872,5878,5879,5885,5886,5892,5893,5899,5900,5906],{"type":70,"value":5842},"Subnode factories follow the same pattern as ",{"type":65,"tag":86,"props":5844,"children":5846},{"className":5845},[],[5847],{"type":70,"value":5848},"languageModel()",{"type":70,"value":1610},{"type":65,"tag":86,"props":5851,"children":5853},{"className":5852},[],[5854],{"type":70,"value":5855},"tool()",{"type":70,"value":5857},":\n",{"type":65,"tag":86,"props":5859,"children":5861},{"className":5860},[],[5862],{"type":70,"value":5863},"memory()",{"type":70,"value":409},{"type":65,"tag":86,"props":5866,"children":5868},{"className":5867},[],[5869],{"type":70,"value":5870},"outputParser()",{"type":70,"value":409},{"type":65,"tag":86,"props":5873,"children":5875},{"className":5874},[],[5876],{"type":70,"value":5877},"embeddings()",{"type":70,"value":409},{"type":65,"tag":86,"props":5880,"children":5882},{"className":5881},[],[5883],{"type":70,"value":5884},"vectorStore()",{"type":70,"value":409},{"type":65,"tag":86,"props":5887,"children":5889},{"className":5888},[],[5890],{"type":70,"value":5891},"retriever()",{"type":70,"value":582},{"type":65,"tag":86,"props":5894,"children":5896},{"className":5895},[],[5897],{"type":70,"value":5898},"documentLoader()",{"type":70,"value":1546},{"type":65,"tag":86,"props":5901,"children":5903},{"className":5902},[],[5904],{"type":70,"value":5905},"textSplitter()",{"type":70,"value":1273},{"type":65,"tag":73,"props":5908,"children":5910},{"id":5909},"trigger-url-sharing",[5911],{"type":70,"value":5912},"Trigger URL Sharing",{"type":65,"tag":80,"props":5914,"children":5915},{},[5916],{"type":70,"value":5917},"After building a workflow that uses a trigger with an HTTP endpoint, share the\nfull production URL with the user. Use the Webhook base URL and Form base URL\nfrom Instance Info in the system prompt. Each trigger type has a distinct\npattern:",{"type":65,"tag":467,"props":5919,"children":5920},{},[5921,5947,5988],{"type":65,"tag":448,"props":5922,"children":5923},{},[5924,5929,5931,5937,5939,5945],{"type":65,"tag":436,"props":5925,"children":5926},{},[5927],{"type":70,"value":5928},"Webhook Trigger",{"type":70,"value":5930},": ",{"type":65,"tag":86,"props":5932,"children":5934},{"className":5933},[],[5935],{"type":70,"value":5936},"{webhookBaseUrl}\u002F{path}",{"type":70,"value":5938}," (where ",{"type":65,"tag":86,"props":5940,"children":5942},{"className":5941},[],[5943],{"type":70,"value":5944},"{path}",{"type":70,"value":5946}," is the node's\nwebhook path parameter).",{"type":65,"tag":448,"props":5948,"children":5949},{},[5950,5955,5956,5962,5964,5970,5972,5978,5980,5986],{"type":65,"tag":436,"props":5951,"children":5952},{},[5953],{"type":70,"value":5954},"Form Trigger",{"type":70,"value":5930},{"type":65,"tag":86,"props":5957,"children":5959},{"className":5958},[],[5960],{"type":70,"value":5961},"{formBaseUrl}\u002F{path}",{"type":70,"value":5963}," (or ",{"type":65,"tag":86,"props":5965,"children":5967},{"className":5966},[],[5968],{"type":70,"value":5969},"{formBaseUrl}\u002F{webhookId}",{"type":70,"value":5971}," if\nno custom path is set). Form Trigger lives under ",{"type":65,"tag":86,"props":5973,"children":5975},{"className":5974},[],[5976],{"type":70,"value":5977},"\u002Fform\u002F",{"type":70,"value":5979},", NOT ",{"type":65,"tag":86,"props":5981,"children":5983},{"className":5982},[],[5984],{"type":70,"value":5985},"\u002Fwebhook\u002F",{"type":70,"value":5987}," —\nthey are separate URL prefixes. Do NOT use the Webhook base URL for Form\nTriggers.",{"type":65,"tag":448,"props":5989,"children":5990},{},[5991,5996,5998,6004,6006],{"type":65,"tag":436,"props":5992,"children":5993},{},[5994],{"type":70,"value":5995},"Chat Trigger",{"type":70,"value":5997},": how the end user reaches this workflow depends on the\nnode's ",{"type":65,"tag":86,"props":5999,"children":6001},{"className":6000},[],[6002],{"type":70,"value":6003},"public",{"type":70,"value":6005}," parameter — pick the right guidance for the current value,\ndo not default to sharing a URL.\n",{"type":65,"tag":467,"props":6007,"children":6008},{},[6009,6040],{"type":65,"tag":448,"props":6010,"children":6011},{},[6012,6023,6025,6030,6032,6038],{"type":65,"tag":436,"props":6013,"children":6014},{},[6015,6021],{"type":65,"tag":86,"props":6016,"children":6018},{"className":6017},[],[6019],{"type":70,"value":6020},"public: false",{"type":70,"value":6022}," (the default)",{"type":70,"value":6024},": there is NO end-user HTTP URL. Tell the\nuser to open the workflow in the editor and click the ",{"type":65,"tag":436,"props":6026,"children":6027},{},[6028],{"type":70,"value":6029},"Open chat",{"type":70,"value":6031}," button\non the workflow canvas — that opens the built-in test chat. Do NOT share a\nwebhook URL, and do NOT suggest flipping ",{"type":65,"tag":86,"props":6033,"children":6035},{"className":6034},[],[6036],{"type":70,"value":6037},"public: true",{"type":70,"value":6039}," just to enable\ntesting — the in-editor chat is the intended testing path for private chat\nworkflows.",{"type":65,"tag":448,"props":6041,"children":6042},{},[6043,6051,6053,6059,6061,6067,6069,6075,6077,6082,6083,6088,6090,6095],{"type":65,"tag":436,"props":6044,"children":6045},{},[6046],{"type":65,"tag":86,"props":6047,"children":6049},{"className":6048},[],[6050],{"type":70,"value":6037},{"type":70,"value":6052},": the public chat URL is\n",{"type":65,"tag":86,"props":6054,"children":6056},{"className":6055},[],[6057],{"type":70,"value":6058},"{webhookBaseUrl}\u002F{webhookId}\u002Fchat",{"type":70,"value":6060}," — share it after the workflow is\npublished. ",{"type":65,"tag":86,"props":6062,"children":6064},{"className":6063},[],[6065],{"type":70,"value":6066},"{webhookId}",{"type":70,"value":6068}," is the node's unique webhook ID; read it from the\nworkflow JSON, never guess. End users can open this URL in a browser.\nThe ",{"type":65,"tag":86,"props":6070,"children":6072},{"className":6071},[],[6073],{"type":70,"value":6074},"\u002Fchat",{"type":70,"value":6076}," suffix is unique to Chat Trigger — do NOT append it to Form\nTrigger or Webhook URLs. (Your own testing via ",{"type":65,"tag":86,"props":6078,"children":6080},{"className":6079},[],[6081],{"type":70,"value":1419},{"type":70,"value":1761},{"type":65,"tag":86,"props":6084,"children":6086},{"className":6085},[],[6087],{"type":70,"value":59},{"type":70,"value":6089}," works regardless of ",{"type":65,"tag":86,"props":6091,"children":6093},{"className":6092},[],[6094],{"type":70,"value":6003},{"type":70,"value":6096}," or publish state.)",{"type":65,"tag":80,"props":6098,"children":6099},{},[6100,6105],{"type":65,"tag":436,"props":6101,"children":6102},{},[6103],{"type":70,"value":6104},"These URLs are for sharing with the user only.",{"type":70,"value":6106}," Do NOT hardcode them into\nworkflow code or build specs unless the workflow actually needs to send or\nstore its own public endpoint.",{"type":65,"tag":73,"props":6108,"children":6110},{"id":6109},"completion",[6111],{"type":70,"value":6112},"Completion",{"type":65,"tag":80,"props":6114,"children":6115},{},[6116,6118,6124],{"type":70,"value":6117},"For a successful build, finish with one concise sentence naming the workflow and\nwhat changed. Include the workflow ID when it is available. If setup is\nrequired, say plainly that setup is needed; do not tell the user to open a setup\nwizard or navigate away from the AI Assistant panel. When the workflow exposes\na Webhook, Form, or Chat Trigger, follow ",{"type":65,"tag":6119,"props":6120,"children":6122},"a",{"href":6121},"#trigger-url-sharing",[6123],{"type":70,"value":5912},{"type":70,"value":6125},"\nand include the correct end-user URL (or in-editor chat guidance) in that\nsummary.",{"type":65,"tag":6127,"props":6128,"children":6129},"style",{},[6130],{"type":70,"value":6131},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":6133,"total":2872},[6134,6149,6164,6177,6188,6201,6213],{"slug":6135,"name":6135,"fn":6136,"description":6137,"org":6138,"tags":6139,"stars":20,"repoUrl":21,"updatedAt":6148},"config-evals","configure workflow evaluations","Builds and maintains configuration-based evaluations on a workflow with the eval-config tool. Use when the user asks to set up, add, view, change, or remove an evaluation, score, grade, or judge a workflow's output, or measure answer quality against a test dataset. This is the only eval form Instance AI handles — it does not touch on-canvas evaluation nodes.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[6140,6143,6144,6147],{"name":6141,"slug":6142,"type":13},"Evals","evals",{"name":8,"slug":8,"type":13},{"name":6145,"slug":6146,"type":13},"Testing","testing",{"name":18,"slug":19,"type":13},"2026-07-24T05:37:07.398695",{"slug":6150,"name":6150,"fn":6151,"description":6152,"org":6153,"tags":6154,"stars":20,"repoUrl":21,"updatedAt":6163},"credential-setup-with-computer-use","configure n8n credentials via browser","Guides n8n credential setup through Computer Use browser tools. Use when a user needs OAuth apps, API keys, client IDs, client secrets, or other credential values from an external service console.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[6155,6156,6159,6160],{"name":15,"slug":16,"type":13},{"name":6157,"slug":6158,"type":13},"Configuration","configuration",{"name":8,"slug":8,"type":13},{"name":6161,"slug":6162,"type":13},"OAuth","oauth","2026-06-30T07:40:45.54",{"slug":91,"name":91,"fn":6165,"description":6166,"org":6167,"tags":6168,"stars":20,"repoUrl":21,"updatedAt":6176},"manage n8n Data Tables","Load before calling data-tables or parse-file. Use for natural standalone requests like \"what data tables do I have?\", \"show\u002Flist my tables\", or \"what columns are in this table?\", and whenever the user asks to list, show, create, inspect, import, seed, query, update, clean up, rename columns in, or delete data tables and rows, especially from CSV\u002FXLSX\u002FJSON attachments. Also load before building or planning workflows that create or write to Data Tables (then load workflow-builder before build-workflow).",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[6169,6172,6175],{"name":6170,"slug":6171,"type":13},"Data Engineering","data-engineering",{"name":6173,"slug":6174,"type":13},"Database","database",{"name":8,"slug":8,"type":13},"2026-07-27T06:07:14.648144",{"slug":211,"name":211,"fn":6178,"description":6179,"org":6180,"tags":6181,"stars":20,"repoUrl":21,"updatedAt":6163},"debug failed n8n workflow executions","Debug failed or wrong-output workflow executions using executions tools. Load when the user reports execution failures, unexpected node output, empty parameter values after a successful run, or a node showing a red or failed expression error.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[6182,6183,6186,6187],{"name":15,"slug":16,"type":13},{"name":6184,"slug":6185,"type":13},"Debugging","debugging",{"name":8,"slug":8,"type":13},{"name":18,"slug":19,"type":13},{"slug":6189,"name":6189,"fn":6190,"description":6191,"org":6192,"tags":6193,"stars":20,"repoUrl":21,"updatedAt":6200},"intent-recognition","classify automation requests by control flow","Classifies automation requests using two decisions: anchor (which primitive owns the top-level control flow — workflow-anchored, agent-anchored, needs-clarification, or out-of-scope) and embeds_other (whether the other primitive appears embedded inside — an agent step inside a workflow, or a workflow invoked as an agent tool). Must be used before deciding the intent of any automation request, including compound requests with multiple independent automations, mid-build extensions to an existing workflow or agent, one-off questions or reports that need external systems you cannot query directly, and requests that need clarification before an anchor can be chosen, before choosing workflow-builder, planning, or an agent-oriented design.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[6194,6197,6198,6199],{"name":6195,"slug":6196,"type":13},"Agents","agents",{"name":15,"slug":16,"type":13},{"name":8,"slug":8,"type":13},{"name":18,"slug":19,"type":13},"2026-07-30T05:30:06.772347",{"slug":6202,"name":6202,"fn":6203,"description":6204,"org":6205,"tags":6206,"stars":20,"repoUrl":21,"updatedAt":6212},"n8n-cli","manage n8n workflows from the CLI","Use the n8n CLI to manage workflows, credentials, executions, and more on an n8n instance. Use when the user asks to interact with n8n, automate workflows, manage credentials, or operate their instance from the command line.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[6207,6208,6210,6211],{"name":15,"slug":16,"type":13},{"name":6209,"slug":28,"type":13},"CLI",{"name":8,"slug":8,"type":13},{"name":18,"slug":19,"type":13},"2026-04-06T18:38:40.360123",{"slug":619,"name":619,"fn":6214,"description":6215,"org":6216,"tags":6217,"stars":20,"repoUrl":21,"updatedAt":6228},"retrieve n8n documentation and guidance","Answers n8n product, setup, credential, node, hosting, API, and usage questions from current n8n docs. Load n8n-docs via load_tool before calling it (search \"n8n docs\" if not visible). Use when the user asks how to configure, set up, troubleshoot, or understand n8n behavior, especially credential setup questions opened from the credential modal.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[6218,6221,6222,6225],{"name":6219,"slug":6220,"type":13},"Documentation","documentation",{"name":8,"slug":8,"type":13},{"name":6223,"slug":6224,"type":13},"Reference","reference",{"name":6226,"slug":6227,"type":13},"Search","search","2026-07-27T06:07:15.692906",{"items":6230,"total":3054},[6231,6238,6245,6251,6258,6265,6272,6279,6288,6299,6308,6314],{"slug":6135,"name":6135,"fn":6136,"description":6137,"org":6232,"tags":6233,"stars":20,"repoUrl":21,"updatedAt":6148},{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[6234,6235,6236,6237],{"name":6141,"slug":6142,"type":13},{"name":8,"slug":8,"type":13},{"name":6145,"slug":6146,"type":13},{"name":18,"slug":19,"type":13},{"slug":6150,"name":6150,"fn":6151,"description":6152,"org":6239,"tags":6240,"stars":20,"repoUrl":21,"updatedAt":6163},{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[6241,6242,6243,6244],{"name":15,"slug":16,"type":13},{"name":6157,"slug":6158,"type":13},{"name":8,"slug":8,"type":13},{"name":6161,"slug":6162,"type":13},{"slug":91,"name":91,"fn":6165,"description":6166,"org":6246,"tags":6247,"stars":20,"repoUrl":21,"updatedAt":6176},{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[6248,6249,6250],{"name":6170,"slug":6171,"type":13},{"name":6173,"slug":6174,"type":13},{"name":8,"slug":8,"type":13},{"slug":211,"name":211,"fn":6178,"description":6179,"org":6252,"tags":6253,"stars":20,"repoUrl":21,"updatedAt":6163},{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[6254,6255,6256,6257],{"name":15,"slug":16,"type":13},{"name":6184,"slug":6185,"type":13},{"name":8,"slug":8,"type":13},{"name":18,"slug":19,"type":13},{"slug":6189,"name":6189,"fn":6190,"description":6191,"org":6259,"tags":6260,"stars":20,"repoUrl":21,"updatedAt":6200},{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[6261,6262,6263,6264],{"name":6195,"slug":6196,"type":13},{"name":15,"slug":16,"type":13},{"name":8,"slug":8,"type":13},{"name":18,"slug":19,"type":13},{"slug":6202,"name":6202,"fn":6203,"description":6204,"org":6266,"tags":6267,"stars":20,"repoUrl":21,"updatedAt":6212},{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[6268,6269,6270,6271],{"name":15,"slug":16,"type":13},{"name":6209,"slug":28,"type":13},{"name":8,"slug":8,"type":13},{"name":18,"slug":19,"type":13},{"slug":619,"name":619,"fn":6214,"description":6215,"org":6273,"tags":6274,"stars":20,"repoUrl":21,"updatedAt":6228},{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[6275,6276,6277,6278],{"name":6219,"slug":6220,"type":13},{"name":8,"slug":8,"type":13},{"name":6223,"slug":6224,"type":13},{"name":6226,"slug":6227,"type":13},{"slug":6280,"name":6280,"fn":6281,"description":6282,"org":6283,"tags":6284,"stars":20,"repoUrl":21,"updatedAt":6163},"planned-task-runtime","manage n8n task runtimes","Handles system follow-up turns: planned-task-follow-up (synthesize, replan, build-workflow, checkpoint), background-task-completed, running-tasks context, and create-tasks silence rules. Load whenever any of these tags appear or after calling create-tasks.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[6285,6286,6287],{"name":15,"slug":16,"type":13},{"name":8,"slug":8,"type":13},{"name":18,"slug":19,"type":13},{"slug":156,"name":156,"fn":6289,"description":6290,"org":6291,"tags":6292,"stars":20,"repoUrl":21,"updatedAt":6298},"coordinate multi-artifact workflows","ONLY for coordinated multi-artifact work: multiple workflows with dependencies, shared data-table schema\u002Fmigration across tasks, or the user explicitly asked to review a plan first. Load create-tasks via load_tool before calling it (search \"create tasks\" if not visible). Do NOT use for new one-off workflows, single-workflow edits, verification-only requests, or standalone data-table ops — use workflow-builder or data-table-manager instead.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[6293,6294,6295,6297],{"name":15,"slug":16,"type":13},{"name":8,"slug":8,"type":13},{"name":6296,"slug":156,"type":13},"Planning",{"name":18,"slug":19,"type":13},"2026-07-27T06:07:16.673218",{"slug":594,"name":594,"fn":6300,"description":6301,"org":6302,"tags":6303,"stars":20,"repoUrl":21,"updatedAt":6307},"verify and set up n8n workflows","Handles workflow verification and setup after build-workflow succeeds, or when the message contains workflow-verification-follow-up or workflow-setup-required. Load after direct builds, when verificationReadiness requires action, or on orchestrator verify\u002Fsetup follow-up turns.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[6304,6305,6306],{"name":15,"slug":16,"type":13},{"name":8,"slug":8,"type":13},{"name":18,"slug":19,"type":13},"2026-07-24T05:37:08.421329",{"slug":4,"name":4,"fn":5,"description":6,"org":6309,"tags":6310,"stars":20,"repoUrl":21,"updatedAt":22},{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[6311,6312,6313],{"name":15,"slug":16,"type":13},{"name":8,"slug":8,"type":13},{"name":18,"slug":19,"type":13},{"slug":6315,"name":6315,"fn":6316,"description":6317,"org":6318,"tags":6319,"stars":6325,"repoUrl":6326,"updatedAt":6327},"n8n-agents-official","build AI agents in n8n","Use when building or editing any AI feature in n8n: AI Agents, Text Classifier, Information Extractor, Sentiment Analysis, Summarization Chain, Basic LLM Chain, embeddings, vector stores, single one-shot LLM calls, or AI media generation (image \u002F audio \u002F video) via the native LangChain provider nodes. Triggers on any `@n8n\u002Fn8n-nodes-langchain.*` node, \"agent\", \"chat assistant\", \"LLM with tools\", \"tool calling\", \"fromAi\", \"system prompt\", \"memory window\", \"structured output\", \"outputParser\", \"function calling\", \"RAG\", \"vector store\", \"embeddings\", \"classify with AI\", \"extract fields with LLM\", \"sentiment analysis\", \"summarize with LLM\", \"single LLM call\", chat triggers with files, AI image \u002F video \u002F audio generation, or any multi-turn or one-shot LLM behavior.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[6320,6321,6324],{"name":6195,"slug":6196,"type":13},{"name":6322,"slug":6323,"type":13},"LLM","llm",{"name":18,"slug":19,"type":13},319,"https:\u002F\u002Fgithub.com\u002Fn8n-io\u002Fskills","2026-07-08T05:44:47.938896"]