@n8n/instance-ai 1.17.2 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/agent/apply-agent-thinking.js +1 -1
  2. package/dist/agent/apply-agent-thinking.js.map +1 -1
  3. package/dist/agent/computer-use-prompt.js +2 -2
  4. package/dist/agent/instance-agent.d.ts +7 -1
  5. package/dist/agent/instance-agent.js +9 -2
  6. package/dist/agent/instance-agent.js.map +1 -1
  7. package/dist/agent/shared-prompts.js +6 -20
  8. package/dist/agent/shared-prompts.js.map +1 -1
  9. package/dist/agent/system-prompt.js +43 -105
  10. package/dist/agent/system-prompt.js.map +1 -1
  11. package/dist/build.tsbuildinfo +1 -1
  12. package/dist/index.d.ts +1 -3
  13. package/dist/index.js +1 -3
  14. package/dist/index.js.map +1 -1
  15. package/dist/mcp/mcp-client-manager.d.ts +13 -1
  16. package/dist/mcp/mcp-client-manager.js +17 -2
  17. package/dist/mcp/mcp-client-manager.js.map +1 -1
  18. package/dist/runtime/run-state-registry.d.ts +2 -1
  19. package/dist/runtime/run-state-registry.js.map +1 -1
  20. package/dist/storage/workflow-loop-storage.d.ts +7 -0
  21. package/dist/tools/attachments/parse-file.tool.js +2 -0
  22. package/dist/tools/attachments/parse-file.tool.js.map +1 -1
  23. package/dist/tools/credentials.tool.js +3 -2
  24. package/dist/tools/credentials.tool.js.map +1 -1
  25. package/dist/tools/data-tables.tool.js +5 -1
  26. package/dist/tools/data-tables.tool.js.map +1 -1
  27. package/dist/tools/evals/eval-config.tool.js +42 -7
  28. package/dist/tools/evals/eval-config.tool.js.map +1 -1
  29. package/dist/tools/index.js +0 -3
  30. package/dist/tools/index.js.map +1 -1
  31. package/dist/tools/orchestration/build-agent.tool.js +95 -26
  32. package/dist/tools/orchestration/build-agent.tool.js.map +1 -1
  33. package/dist/tools/orchestration/verification/analyze-result.d.ts +1 -0
  34. package/dist/tools/orchestration/verification/analyze-result.js +13 -3
  35. package/dist/tools/orchestration/verification/analyze-result.js.map +1 -1
  36. package/dist/tools/orchestration/verification/prepare-run.d.ts +1 -0
  37. package/dist/tools/orchestration/verification/prepare-run.js +31 -0
  38. package/dist/tools/orchestration/verification/prepare-run.js.map +1 -1
  39. package/dist/tools/orchestration/verify-built-workflow.tool.js +1 -0
  40. package/dist/tools/orchestration/verify-built-workflow.tool.js.map +1 -1
  41. package/dist/tools/research.tool.js +6 -1
  42. package/dist/tools/research.tool.js.map +1 -1
  43. package/dist/tools/task-control.tool.js +2 -2
  44. package/dist/tools/task-control.tool.js.map +1 -1
  45. package/dist/tools/tool-ids.d.ts +0 -1
  46. package/dist/tools/tool-ids.js +2 -2
  47. package/dist/tools/tool-ids.js.map +1 -1
  48. package/dist/tools/workflows/build-workflow.tool.js +2 -0
  49. package/dist/tools/workflows/build-workflow.tool.js.map +1 -1
  50. package/dist/tools/workflows/plan-verification-simulation.d.ts +2 -0
  51. package/dist/tools/workflows/plan-verification-simulation.js +22 -2
  52. package/dist/tools/workflows/plan-verification-simulation.js.map +1 -1
  53. package/dist/tools/workflows/reconcile-simulation-plan.js +2 -1
  54. package/dist/tools/workflows/reconcile-simulation-plan.js.map +1 -1
  55. package/dist/tools/workflows/workflow-json-utils.d.ts +2 -0
  56. package/dist/tools/workflows/workflow-json-utils.js +46 -0
  57. package/dist/tools/workflows/workflow-json-utils.js.map +1 -1
  58. package/dist/tools/workflows/workflow-source-compiler.js +6 -7
  59. package/dist/tools/workflows/workflow-source-compiler.js.map +1 -1
  60. package/dist/types.d.ts +5 -1
  61. package/dist/types.js.map +1 -1
  62. package/dist/workflow-loop/workflow-loop-state.d.ts +8 -0
  63. package/dist/workflow-loop/workflow-loop-state.js +1 -0
  64. package/dist/workflow-loop/workflow-loop-state.js.map +1 -1
  65. package/dist/workspace/lazy-runtime-workspace.js +2 -2
  66. package/dist/workspace/lazy-runtime-workspace.js.map +1 -1
  67. package/dist/workspace/pack-workspace-sdk.d.ts +9 -2
  68. package/dist/workspace/pack-workspace-sdk.js +36 -13
  69. package/dist/workspace/pack-workspace-sdk.js.map +1 -1
  70. package/dist/workspace/sandbox-setup.js +29 -19
  71. package/dist/workspace/sandbox-setup.js.map +1 -1
  72. package/dist/workspace/workspace-files.js +4 -4
  73. package/dist/workspace/workspace-files.js.map +1 -1
  74. package/package.json +10 -10
  75. package/skills/config-evals/SKILL.md +29 -5
  76. package/skills/config-evals/references/config-eval-playbook.md +20 -9
  77. package/skills/data-table-manager/SKILL.md +12 -5
  78. package/skills/intent-recognition/SKILL.md +10 -0
  79. package/skills/n8n-docs-assistant/SKILL.md +2 -1
  80. package/skills/planning/SKILL.md +14 -3
  81. package/skills/post-build-flow/SKILL.md +3 -0
  82. package/skills/workflow-builder/SKILL.md +105 -27
  83. package/dist/tools/templates.tool.d.ts +0 -2
  84. package/dist/tools/templates.tool.js +0 -20
  85. package/dist/tools/templates.tool.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-files.js","sourceRoot":"","sources":["../../src/workspace/workspace-files.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workspace-files.js","sourceRoot":"","sources":["../../src/workspace/workspace-files.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@n8n/instance-ai",
3
- "version": "1.17.2",
3
+ "version": "1.18.0",
4
4
  "main": "dist/index.js",
5
5
  "module": "src/index.ts",
6
6
  "types": "dist/index.d.ts",
@@ -8,8 +8,8 @@
8
8
  "dist/**/*",
9
9
  "knowledge-base/**/*",
10
10
  "skills/**/*",
11
- "LICENSE_EE.md",
12
- "LICENSE.md"
11
+ "LICENSE.md",
12
+ "LICENSE_EE.md"
13
13
  ],
14
14
  "exports": {
15
15
  ".": {
@@ -56,13 +56,13 @@
56
56
  "@e965/xlsx": "0.20.3",
57
57
  "zod": "3.25.67",
58
58
  "zod-from-json-schema-v3": "npm:zod-from-json-schema@^0.0.5",
59
- "@n8n/agents": "0.17.1",
60
- "@n8n/ai-utilities": "0.25.1",
61
- "@n8n/api-types": "1.32.1",
59
+ "@n8n/agents": "0.18.0",
60
+ "@n8n/ai-utilities": "0.26.0",
61
+ "@n8n/utils": "1.41.0",
62
+ "@n8n/api-types": "1.33.0",
62
63
  "@n8n/mcp-browser": "0.15.0",
63
- "@n8n/utils": "1.40.0",
64
- "@n8n/workflow-sdk": "0.25.1",
65
- "n8n-workflow": "2.32.1"
64
+ "@n8n/workflow-sdk": "0.26.0",
65
+ "n8n-workflow": "2.33.0"
66
66
  },
67
67
  "devDependencies": {
68
68
  "@ai-sdk/anthropic": "^3.0.81",
@@ -91,7 +91,7 @@
91
91
  },
92
92
  "scripts": {
93
93
  "clean": "rimraf dist .turbo",
94
- "typecheck": "tsc --noEmit",
94
+ "typecheck": "tsc --noEmit && tsc -p evaluations/tsconfig.json",
95
95
  "build": "tsc -p ./tsconfig.build.json && tsc-alias -p tsconfig.build.json",
96
96
  "build:unchecked": "tsc -p ./tsconfig.build.json --noCheck && tsc-alias -p tsconfig.build.json",
97
97
  "format": "biome format --write src",
@@ -29,6 +29,7 @@ build a config eval instead and briefly say that is how you set up evaluations.
29
29
 
30
30
  - `name` — a human-readable evaluation name.
31
31
  - `startNodeName` — the node where a run begins; it is fed one test-input row.
32
+ Must be a node with an incoming connection — **never a trigger** (see step 2).
32
33
  - `endNodeName` — the node whose output is judged.
33
34
  - `dataTableId` — a Data Table holding the test dataset. Create and populate it
34
35
  with the `data-tables` tool first, then link it here by id.
@@ -39,8 +40,11 @@ build a config eval instead and briefly say that is how you set up evaluations.
39
40
  1. Identify the target workflow and read it. Trace the main path from trigger to
40
41
  the node that produces the answer.
41
42
  2. Pick the nodes:
42
- - `startNodeName` is normally the node that receives the input the dataset
43
- varies (often the trigger or the first node after it).
43
+ - `startNodeName` is the first node **after** the trigger the node that
44
+ receives the input the dataset varies. Never use the trigger itself: an
45
+ eval run swaps the trigger for a dataset-driven one, so the start node must
46
+ have an incoming connection or the run fails to compile. For a chat/agent
47
+ workflow this is usually the agent node (often the same as `endNodeName`).
44
48
  - `endNodeName` is the node whose output you want scored (usually the AI agent
45
49
  or the final response node).
46
50
  3. Resolve the dataset. Call `data-tables(action="list")` to find an existing
@@ -68,13 +72,33 @@ Two presets are available:
68
72
 
69
73
  - **`correctness`** — compares the produced answer to a ground-truth answer.
70
74
  Requires `expectedAnswer` (an n8n expression resolving to the ground-truth
71
- value, typically a dataset column, e.g. `{{ $json.expected_output }}`).
75
+ value, typically a dataset column, e.g. `={{ $json.expected_output }}`).
72
76
  - **`helpfulness`** — judges the produced answer against the user's query.
73
77
  Requires `userQuery` (an n8n expression for the input the user asked, e.g.
74
- `{{ $json.input }}`).
78
+ `={{ $json.input }}`).
75
79
 
76
80
  Every metric also needs `actualAnswer`: an n8n expression resolving to the
77
- workflow's produced answer at the end node, e.g. `{{ $json.output }}`.
81
+ workflow's produced answer at the end node, e.g. `={{ $json.output }}`.
82
+
83
+ `userQuery` and `expectedAnswer` name **dataset columns** (the input the user
84
+ asked; the ground-truth answer). `actualAnswer` names a field of the workflow's
85
+ **produced output**. Write all of them as `={{ $json.<name> }}` — the evaluation
86
+ reads dataset columns from the dataset row and `actualAnswer` from the end node
87
+ automatically. Do not reference the trigger or any node by name.
88
+
89
+ ### Expression fields must begin with `=`
90
+
91
+ `actualAnswer`, `userQuery`, and `expectedAnswer` are n8n **expressions** — they
92
+ read a value out of each test row at runtime. The leading `=` is what tells n8n
93
+ to evaluate the `{{ … }}` template. **Without it the string is stored as literal
94
+ text**: the field shows `{{ $json.output }}` verbatim and the judge scores that
95
+ raw string instead of the resolved value.
96
+
97
+ - Correct: `={{ $json.output }}`, `={{ $json.expected_output }}`
98
+ - Wrong: `{{ $json.output }}` (no `=` → treated as fixed text)
99
+
100
+ Only add `=` when the value references workflow data via `{{ … }}`. A genuinely
101
+ fixed constant (rare for these fields) is written as plain text without `=`.
78
102
 
79
103
  Pick `correctness` when the dataset has a known right answer to compare against;
80
104
  pick `helpfulness` when there is no single ground truth and quality is judged
@@ -16,6 +16,12 @@ discriminated by `action` and always take a `workflowId`.
16
16
  Config fields (create/update): `name`, `startNodeName`, `endNodeName`,
17
17
  `dataTableId`, `metrics`.
18
18
 
19
+ `startNodeName` must be a node **with an incoming connection** — the first node
20
+ the trigger feeds into, never the trigger itself. An eval run replaces the
21
+ trigger with a dataset-driven one, so naming the trigger as the start node fails
22
+ to compile. For a single-agent workflow, `startNodeName` and `endNodeName` are
23
+ usually the same agent node.
24
+
19
25
  `create`, `update`, and `delete` show an approval card automatically. Call the
20
26
  tool and act on the result; do not ask for chat approval beforehand.
21
27
 
@@ -28,12 +34,17 @@ tool and act on the result; do not ask for chat approval beforehand.
28
34
  | `credentialId` | always | credential id for the judge model; also determines the provider |
29
35
  | `model` | always | e.g. `gpt-4o` |
30
36
  | `outputType` | defaults to `numeric` | `numeric` or `boolean` |
31
- | `actualAnswer` | always | expression for the produced answer, e.g. `{{ $json.output }}` |
32
- | `expectedAnswer` | `correctness` preset | expression for ground truth, e.g. `{{ $json.expected_output }}` |
33
- | `userQuery` | `helpfulness` preset | expression for the user's query, e.g. `{{ $json.input }}` |
37
+ | `actualAnswer` | always | expression for the produced answer, e.g. `={{ $json.output }}` |
38
+ | `expectedAnswer` | `correctness` preset | expression for ground truth, e.g. `={{ $json.expected_output }}` |
39
+ | `userQuery` | `helpfulness` preset | expression for the user's query, e.g. `={{ $json.input }}` |
34
40
  | `prompt` | optional | overrides the default judge prompt |
35
41
  | `provider` | omit | chat-model node type; leave unset — derived from `credentialId`. Set only if you know it (e.g. `@n8n/n8n-nodes-langchain.lmChatOpenAi`) |
36
42
 
43
+ `actualAnswer`, `expectedAnswer`, and `userQuery` are expressions and **must
44
+ begin with `=`** (e.g. `={{ $json.output }}`). Without the `=` the value is stored
45
+ as literal text and the judge scores `{{ $json.output }}` verbatim instead of the
46
+ resolved output. Only omit `=` for a genuinely fixed constant string.
47
+
37
48
  ## Worked Example — correctness eval on an agent workflow
38
49
 
39
50
  1. Ensure a dataset exists with an input column and a ground-truth column:
@@ -54,7 +65,7 @@ tool and act on the result; do not ask for chat approval beforehand.
54
65
  action="create",
55
66
  workflowId="<wf_id>",
56
67
  name="Support agent correctness",
57
- startNodeName="When chat message received",
68
+ startNodeName="AI Agent", // first node after the trigger — not the trigger itself
58
69
  endNodeName="AI Agent",
59
70
  dataTableId="<dt_id>",
60
71
  metrics=[{
@@ -62,8 +73,8 @@ tool and act on the result; do not ask for chat approval beforehand.
62
73
  preset: "correctness",
63
74
  credentialId: "<cred_id>", // provider is derived from this credential
64
75
  model: "gpt-4o",
65
- actualAnswer: "{{ $json.output }}",
66
- expectedAnswer: "{{ $json.expected_output }}"
76
+ actualAnswer: "={{ $json.output }}",
77
+ expectedAnswer: "={{ $json.expected_output }}"
67
78
  }]
68
79
  )
69
80
  ```
@@ -80,7 +91,7 @@ eval-config(
80
91
  action="create",
81
92
  workflowId="<wf_id>",
82
93
  name="Assistant helpfulness",
83
- startNodeName="When chat message received",
94
+ startNodeName="AI Agent", // first node after the trigger — not the trigger itself
84
95
  endNodeName="AI Agent",
85
96
  dataTableId="<dt_id>",
86
97
  metrics=[{
@@ -88,8 +99,8 @@ eval-config(
88
99
  preset: "helpfulness",
89
100
  credentialId: "<cred_id>", // provider is derived from this credential
90
101
  model: "claude-sonnet-4-5",
91
- userQuery: "{{ $json.input }}",
92
- actualAnswer: "{{ $json.output }}"
102
+ userQuery: "={{ $json.input }}",
103
+ actualAnswer: "={{ $json.output }}"
93
104
  }]
94
105
  )
95
106
  ```
@@ -1,11 +1,13 @@
1
1
  ---
2
2
  name: data-table-manager
3
3
  description: >-
4
- Designs and manages n8n Data Tables directly with the data-tables and
5
- parse-file tools. Use when the user asks to list, show, create, inspect,
6
- import, seed, query, update, clean up, rename columns in, or delete data
7
- tables and rows, especially from CSV/XLSX/JSON attachments, and before
8
- building or planning workflows that create or write to Data Tables.
4
+ Load before calling data-tables or parse-file. Use for natural standalone
5
+ requests like "what data tables do I have?", "show/list my tables", or "what
6
+ columns are in this table?", and whenever the user asks to list, show,
7
+ create, inspect, import, seed, query, update, clean up, rename columns in, or
8
+ delete data tables and rows, especially from CSV/XLSX/JSON attachments. Also
9
+ load before building or planning workflows that create or write to Data
10
+ Tables (then load workflow-builder before build-workflow).
9
11
  recommended_tools:
10
12
  - data-tables
11
13
  - parse-file
@@ -15,6 +17,11 @@ platforms:
15
17
 
16
18
  # Data Table Manager
17
19
 
20
+ ## Routing
21
+
22
+ For workflow builds that create or write Data Tables, load this skill, then
23
+ `workflow-builder`, before `build-workflow`.
24
+
18
25
  Use this skill to build and maintain n8n Data Tables in the current turn with
19
26
  `data-tables` and, for attachments, `parse-file`. Do not spawn another agent or
20
27
  create a background plan for data-table-only work.
@@ -102,6 +102,16 @@ be a direct agent tool or a workflow tool:
102
102
  reusable, manually callable, or usable outside the agent. Build the workflow
103
103
  first, pass it to `build-agent` via `workflowContext`, and set
104
104
  `embeds_other: true`.
105
+ - Create required **data tables** via `data-table-manager` → `data-tables`
106
+ before `build-agent` when the agent will store or query tabular data — the
107
+ builder cannot create tables.
108
+ - Before the first `build-agent` call, create every prerequisite the builder
109
+ cannot: required data tables and any workflow tools the agent will invoke.
110
+ Pass built workflows in `workflowContext` and list every prerequisite
111
+ name/schema in `message`. Then let the builder gather remaining agent-specific
112
+ requirements (model, credentials, integrations).
113
+ - If a `builderReply` lists missing workflows or tables, create them and call
114
+ `build-agent` again — never ask the user to create them manually.
105
115
 
106
116
  Count the nodes required inside one tool invocation, not the total number of
107
117
  tools on the agent. For example, looking up and inserting Data Table rows are
@@ -2,7 +2,8 @@
2
2
  name: n8n-docs-assistant
3
3
  description: >-
4
4
  Answers n8n product, setup, credential, node, hosting, API, and usage
5
- questions from current n8n docs. Use when the user asks how to configure,
5
+ questions from current n8n docs. Load n8n-docs via load_tool before calling it
6
+ (search "n8n docs" if not visible). Use when the user asks how to configure,
6
7
  set up, troubleshoot, or understand n8n behavior, especially credential setup
7
8
  questions opened from the credential modal.
8
9
  recommended_tools:
@@ -3,9 +3,10 @@ name: planning
3
3
  description: >-
4
4
  ONLY for coordinated multi-artifact work: multiple workflows with dependencies,
5
5
  shared data-table schema/migration across tasks, or the user explicitly asked
6
- to review a plan first. Do NOT use for new one-off workflows, single-workflow
7
- edits, verification-only requests, or standalone data-table ops use
8
- workflow-builder or data-table-manager instead.
6
+ to review a plan first. Load create-tasks via load_tool before calling it
7
+ (search "create tasks" if not visible). Do NOT use for new one-off workflows,
8
+ single-workflow edits, verification-only requests, or standalone data-table
9
+ ops — use workflow-builder or data-table-manager instead.
9
10
  recommended_tools:
10
11
  - create-tasks
11
12
  - workflows
@@ -55,6 +56,15 @@ single-workflow builds and existing-workflow edits use `workflow-builder` with
55
56
  `build-workflow` directly. Standalone data-table work uses `data-table-manager`
56
57
  with direct `data-tables` and `parse-file` calls.
57
58
 
59
+ ## Knowledge Base
60
+
61
+ **Consult the knowledge base before planning.** Read the relevant `.md` guides
62
+ and templates for each technique the request involves (`knowledge-base/index.json`,
63
+ `knowledge-base/best-practices/index.json`, and linked files). Use
64
+ `workspace_execute_command` with `rg` or `find` under `knowledge-base/templates/`
65
+ to locate matching SDK examples — never load `templates/index.json` wholesale.
66
+ Skip only for trivial mechanical edits you have already reviewed in this thread.
67
+
58
68
  ## Method
59
69
 
60
70
  1. Decide whether the request is plan-worthy by coordination need, not by
@@ -63,6 +73,7 @@ with direct `data-tables` and `parse-file` calls.
63
73
  `nodes(action="suggested")`, `credentials(action="list")`,
64
74
  `data-tables(action="list")`, `parse-file`, `workflows`, and `research`
65
75
  when relevant.
76
+
66
77
  3. Prefer reasonable assumptions over questions. Ask the user only when the
67
78
  answer would materially change the plan and cannot be discovered.
68
79
  4. Build a dependency-aware graph. Producers must come before consumers.
@@ -20,6 +20,9 @@ especially when the build result contains `postBuildFlow.required: true`, or whe
20
20
  the current message contains `<workflow-verification-follow-up>` or
21
21
  `<workflow-setup-required>`.
22
22
 
23
+ These instructions are in English, but user-visible text you write while
24
+ following them stays in the user's conversation language.
25
+
23
26
  For trigger `inputData` shapes, read
24
27
  `knowledge-base/reference/trigger-input-data-shapes.md` in the sandbox workspace
25
28
  when available, or load this skill's `references/trigger-input-data-shapes.md`
@@ -1,12 +1,13 @@
1
1
  ---
2
2
  name: workflow-builder
3
3
  description: >-
4
- Default path for all single-workflow work: new one-off workflows, existing-
5
- workflow edits, verification repairs, and workflow-local data tables. Write
6
- or edit a workspace source file, then call build-workflow with filePath. Do
7
- not load planning or create-tasks first. Load planning only when multiple
8
- coordinated workflows or shared cross-task data tables require a
9
- dependency-aware task graph.
4
+ Load before calling build-workflow. Default path for all single-workflow
5
+ work: new one-off workflows, existing-workflow edits, verification repairs,
6
+ and workflow-local data tables. Write or edit a workspace source file, then
7
+ call build-workflow with filePath. When the workflow creates or writes Data
8
+ Tables, load data-table-manager first, then this skill. Do not load planning
9
+ or create-tasks first. Load planning only when multiple coordinated workflows
10
+ or shared cross-task data tables require a dependency-aware task graph.
10
11
  recommended_tools:
11
12
  - read_file
12
13
  - write_file
@@ -22,15 +23,15 @@ recommended_tools:
22
23
 
23
24
  # Workflow Builder
24
25
 
26
+ ## Routing
27
+
28
+ When the workflow creates or writes Data Tables, load `data-table-manager`
29
+ first (if not already loaded this turn), then this skill.
30
+
25
31
  You are an expert n8n workflow builder. You generate complete, valid
26
32
  TypeScript code using `@n8n/workflow-sdk` for new workflows and for existing
27
33
  saved workflow changes.
28
34
 
29
- This skill runs inside the orchestrator — no separate builder agent, handoff,
30
- or tool allowlist; use the orchestrator and workspace file tools already
31
- available this turn (plus any relevant tool-search/MCP tool). Workflow building
32
- runs in the orchestrator with this skill and `build-workflow`.
33
-
34
35
  For new single-workflow requests, build directly with
35
36
  `build-workflow({ filePath, sourceCode })` — the complete TypeScript SDK
36
37
  source in `sourceCode`; the tool writes the file and builds in one call. For
@@ -39,12 +40,23 @@ workflowId)`, apply the edit to the returned code, then call
39
40
  `build-workflow({ filePath, workflowId, sourceCode })` the first time — all
40
41
  edits go through a workspace source file and `build-workflow`. Do not load
41
42
  `planning` or call `create-tasks` first; `planning` is only for coordinated
42
- multi-artifact work per the orchestrator routing rules. Use this skill for
43
- direct single-workflow builds/edits and during approved
44
- `<planned-task-follow-up type="build-workflow">` turns.
43
+ multi-artifact work per the orchestrator routing rules. Do not create a plan
44
+ just for verification.
45
+
46
+ When the needed node types are already obvious from the request, batch
47
+ `nodes(action="type-definition")` — object form with resource/operation or mode
48
+ discriminators — together with the `load_skill` call for this skill in your
49
+ first action turn (each extra sequential turn resends the whole context). When
50
+ unsure which nodes to use, load this skill first and follow its research
51
+ process below.
45
52
 
46
53
  ## Repair Strategy
47
54
 
55
+ When the edit is to fix a node the user reports as erroring or showing a red
56
+ expression error, inspect it first via `debugging-executions` (run the
57
+ workflow, read the failing node's real error and resolved parameters) before
58
+ editing anything — never guess at the cause or change the node on a hunch.
59
+
48
60
  When called with failure details for an existing workflow, start from the
49
61
  workspace source file if one is available in the conversation or tool output. If
50
62
  you only have a saved n8n workflow ID, use `workflows(action="get-as-code")`,
@@ -61,13 +73,16 @@ be the complete source when used; never send string patches or fragments.
61
73
 
62
74
  ## Escalation
63
75
 
64
- Before the first successful `build-workflow` call, use `ask-user` only when a
65
- missing choice changes the workflow's intent or topology (e.g. which
66
- destination service). Setup details recipients, accounts, resources,
67
- channels, credentials, timezone belong in placeholders or unresolved
68
- `newCredential()` calls until post-build setup. After the first build, use
69
- `ask-user` when stuck or genuinely ambiguous; do not retry the same failing
70
- approach more than twice. Never re-ask an answered, deferred, or skipped
76
+ If the service or workflow shape is clear, never stop before the first
77
+ `build-workflow` call to ask for setup values like recipients, accounts,
78
+ resources, credentials, channel IDs, or timezone; use placeholders or unresolved
79
+ `newCredential()` calls. Before the first successful `build-workflow` call, use
80
+ `ask-user` only when a missing choice changes the workflow's intent or topology
81
+ (e.g. which destination service). Setup details recipients, accounts,
82
+ resources, channels, credentials, timezone belong in placeholders or
83
+ unresolved `newCredential()` calls until post-build setup. After the first
84
+ build, use `ask-user` when stuck or genuinely ambiguous; do not retry the same
85
+ failing approach more than twice. Never re-ask an answered, deferred, or skipped
71
86
  question — treat a skip as permission to assume a default and move on. Never
72
87
  solicit secrets through `ask-user`; route credential collection through
73
88
  workflow/credential setup surfaces.
@@ -87,7 +102,33 @@ Do not replace concrete user-provided or discoverable values with
87
102
  placeholders: if the prompt gives a real URL, channel name, table name, label,
88
103
  folder, or database, preserve it and placeholder only the unknown part.
89
104
 
90
- ## Knowledge Base Guardrails
105
+ ## Knowledge Base
106
+
107
+ **Prefer n8n sources over guessing.** For n8n product behavior, node setup,
108
+ credentials, hosting, or feature docs, consult — in this order — the sandbox
109
+ knowledge base, a matching runtime skill, or official n8n docs. Do not invent
110
+ setup steps or node semantics from memory when those sources can answer.
111
+
112
+ 1. **Knowledge base** — consult before
113
+ building. Read the relevant `.md` guides and templates for each technique
114
+ the request involves. Skip only for trivial mechanical edits you have
115
+ already reviewed in this thread.
116
+ - `knowledge-base/index.json` — catalog of technique guides
117
+ (`knowledge-base/best-practices/index.json`; read the linked `.md` files)
118
+ and orchestration reference docs (`knowledge-base/reference/index.json`)
119
+ - `knowledge-base/templates/` — curated SDK workflow examples: use
120
+ `workspace_execute_command` with `rg` or `find` to locate matches, then
121
+ read only the relevant `.ts` files — never load `templates/index.json`
122
+ wholesale
123
+ - `node-types/index.txt` — searchable catalog of available n8n nodes
124
+ 2. **Runtime skills** — when another skill matches (e.g. `data-table-manager`,
125
+ `debugging-executions`, `post-build-flow`), `load_skill` and follow it
126
+ instead of improvising.
127
+ 3. **Official n8n docs** — for credential setup, product features, hosting, or
128
+ node docs that the knowledge base does not cover, load `n8n-docs-assistant`
129
+ then load `n8n-docs` via `load_tool` (search "n8n docs" if it is not
130
+ visible) and call `n8n-docs`. Prefer docs over web search for n8n-specific
131
+ questions.
91
132
 
92
133
  For workflows with multiple external systems, multiple requested effects,
93
134
  digests or reports, non-trivial branching, or Code nodes, read
@@ -362,10 +403,10 @@ n8n normalizes Data Table column names to snake_case, for example `dayName`
362
403
  becomes `day_name`. Always call `data-tables(action="schema")` before using a
363
404
  Data Table in workflow code so you use real column names.
364
405
 
365
- When building workflows that create or use tables, use the data table skill
366
- guidance already loaded by the orchestrator when available. Create or inspect
367
- tables directly with `data-tables`; do not invent table IDs, table names, or
368
- column names.
406
+ When building workflows that create or use tables, load `data-table-manager`
407
+ via `load_skill` first (if not already loaded this turn), then follow that
408
+ skill for schema/row guidance. Create or inspect tables directly with
409
+ `data-tables`; do not invent table IDs, table names, or column names.
369
410
 
370
411
  When the ask is a summary, digest, or report over a period ("weekly summary of
371
412
  what was recorded", "digest of this week's rows"), the summary branch must
@@ -701,9 +742,46 @@ For AI Agent workflows:
701
742
  `memory()`, `outputParser()`, `embeddings()`, `vectorStore()`, `retriever()`,
702
743
  `documentLoader()`, and `textSplitter()`.
703
744
 
745
+ ## Trigger URL Sharing
746
+
747
+ After building a workflow that uses a trigger with an HTTP endpoint, share the
748
+ full production URL with the user. Use the Webhook base URL and Form base URL
749
+ from Instance Info in the system prompt. Each trigger type has a distinct
750
+ pattern:
751
+
752
+ - **Webhook Trigger**: `{webhookBaseUrl}/{path}` (where `{path}` is the node's
753
+ webhook path parameter).
754
+ - **Form Trigger**: `{formBaseUrl}/{path}` (or `{formBaseUrl}/{webhookId}` if
755
+ no custom path is set). Form Trigger lives under `/form/`, NOT `/webhook/` —
756
+ they are separate URL prefixes. Do NOT use the Webhook base URL for Form
757
+ Triggers.
758
+ - **Chat Trigger**: how the end user reaches this workflow depends on the
759
+ node's `public` parameter — pick the right guidance for the current value,
760
+ do not default to sharing a URL.
761
+ - **`public: false` (the default)**: there is NO end-user HTTP URL. Tell the
762
+ user to open the workflow in the editor and click the **Open chat** button
763
+ on the workflow canvas — that opens the built-in test chat. Do NOT share a
764
+ webhook URL, and do NOT suggest flipping `public: true` just to enable
765
+ testing — the in-editor chat is the intended testing path for private chat
766
+ workflows.
767
+ - **`public: true`**: the public chat URL is
768
+ `{webhookBaseUrl}/{webhookId}/chat` — share it after the workflow is
769
+ published. `{webhookId}` is the node's unique webhook ID; read it from the
770
+ workflow JSON, never guess. End users can open this URL in a browser.
771
+ The `/chat` suffix is unique to Chat Trigger — do NOT append it to Form
772
+ Trigger or Webhook URLs. (Your own testing via `executions(action="run")` and
773
+ `verify-built-workflow` works regardless of `public` or publish state.)
774
+
775
+ **These URLs are for sharing with the user only.** Do NOT hardcode them into
776
+ workflow code or build specs unless the workflow actually needs to send or
777
+ store its own public endpoint.
778
+
704
779
  ## Completion
705
780
 
706
781
  For a successful build, finish with one concise sentence naming the workflow and
707
782
  what changed. Include the workflow ID when it is available. If setup is
708
783
  required, say plainly that setup is needed; do not tell the user to open a setup
709
- wizard or navigate away from the AI Assistant panel.
784
+ wizard or navigate away from the AI Assistant panel. When the workflow exposes
785
+ a Webhook, Form, or Chat Trigger, follow [Trigger URL Sharing](#trigger-url-sharing)
786
+ and include the correct end-user URL (or in-editor chat guidance) in that
787
+ summary.
@@ -1,2 +0,0 @@
1
- import type { InstanceAiContext } from '../types';
2
- export declare function createTemplatesTool(context: InstanceAiContext): import("@n8n/agents").BuiltTool;
@@ -1,20 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createTemplatesTool = createTemplatesTool;
4
- const agents_1 = require("@n8n/agents");
5
- const zod_1 = require("zod");
6
- const sanitize_mcp_schemas_1 = require("../agent/sanitize-mcp-schemas");
7
- const inputSchema = (0, sanitize_mcp_schemas_1.sanitizeInputSchema)(zod_1.z.object({
8
- templateId: zod_1.z.string().describe('The numeric id of the workflow template to load'),
9
- }));
10
- function createTemplatesTool(context) {
11
- return new agents_1.Tool('templates')
12
- .description('Load an n8n workflow template by its id. Returns the template workflow ' +
13
- '(nodes and connections) to use as a starting point for building.')
14
- .input(inputSchema)
15
- .handler(async (input) => {
16
- return await context.workflowTemplateService.getTemplate(input.templateId);
17
- })
18
- .build();
19
- }
20
- //# sourceMappingURL=templates.tool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"templates.tool.js","sourceRoot":"","sources":["../../src/tools/templates.tool.ts"],"names":[],"mappings":";;;AAAA,wCAAmC;AACnC,6BAAwB;AAExB,wEAAoE;AAKpE,MAAM,WAAW,GAAG,IAAA,0CAAmB,EACtC,OAAC,CAAC,MAAM,CAAC;IACR,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;CAClF,CAAC,CACF,CAAC;AAMF,6BAAoC,OAA0B;IAC7D,OAAO,IAAI,aAAI,CAAC,WAAW,CAAC;SAC1B,WAAW,CACX,yEAAyE;QACxE,kEAAkE,CACnE;SACA,KAAK,CAAC,WAAW,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,KAAY,EAAE,EAAE;QAC/B,OAAO,MAAM,OAAO,CAAC,uBAAuB,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC5E,CAAC,CAAC;SACD,KAAK,EAAE,CAAC;AACX,CAAC"}