@n8n/ai-workflow-builder 1.8.1 → 1.9.1

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 (200) hide show
  1. package/dist/agents/planner.agent.d.ts +1 -0
  2. package/dist/agents/planner.agent.js +1 -0
  3. package/dist/agents/planner.agent.js.map +1 -1
  4. package/dist/agents/responder.agent.d.ts +16 -6
  5. package/dist/agents/responder.agent.js +19 -8
  6. package/dist/agents/responder.agent.js.map +1 -1
  7. package/dist/agents/supervisor.agent.js +6 -0
  8. package/dist/agents/supervisor.agent.js.map +1 -1
  9. package/dist/ai-workflow-builder-agent.service.d.ts +7 -3
  10. package/dist/ai-workflow-builder-agent.service.js +76 -48
  11. package/dist/ai-workflow-builder-agent.service.js.map +1 -1
  12. package/dist/assistant/assistant-handler.d.ts +23 -0
  13. package/dist/assistant/assistant-handler.js +249 -0
  14. package/dist/assistant/assistant-handler.js.map +1 -0
  15. package/dist/assistant/index.d.ts +2 -0
  16. package/dist/assistant/index.js +6 -0
  17. package/dist/assistant/index.js.map +1 -0
  18. package/dist/assistant/types.d.ts +83 -0
  19. package/dist/assistant/types.js +3 -0
  20. package/dist/assistant/types.js.map +1 -0
  21. package/dist/build.tsbuildinfo +1 -1
  22. package/dist/code-builder/code-builder-agent.d.ts +31 -0
  23. package/dist/code-builder/code-builder-agent.js +463 -0
  24. package/dist/code-builder/code-builder-agent.js.map +1 -0
  25. package/dist/code-builder/code-workflow-builder.d.ts +34 -0
  26. package/dist/code-builder/code-workflow-builder.js +80 -0
  27. package/dist/code-builder/code-workflow-builder.js.map +1 -0
  28. package/dist/code-builder/constants.d.ts +62 -0
  29. package/dist/code-builder/constants.js +83 -0
  30. package/dist/code-builder/constants.js.map +1 -0
  31. package/dist/code-builder/engines/code-builder-node-search-engine.d.ts +19 -0
  32. package/dist/code-builder/engines/code-builder-node-search-engine.js +236 -0
  33. package/dist/code-builder/engines/code-builder-node-search-engine.js.map +1 -0
  34. package/dist/code-builder/handlers/agent-iteration-handler.d.ts +36 -0
  35. package/dist/code-builder/handlers/agent-iteration-handler.js +78 -0
  36. package/dist/code-builder/handlers/agent-iteration-handler.js.map +1 -0
  37. package/dist/code-builder/handlers/auto-finalize-handler.d.ts +29 -0
  38. package/dist/code-builder/handlers/auto-finalize-handler.js +50 -0
  39. package/dist/code-builder/handlers/auto-finalize-handler.js.map +1 -0
  40. package/dist/code-builder/handlers/chat-setup-handler.d.ts +57 -0
  41. package/dist/code-builder/handlers/chat-setup-handler.js +147 -0
  42. package/dist/code-builder/handlers/chat-setup-handler.js.map +1 -0
  43. package/dist/code-builder/handlers/final-response-handler.d.ts +29 -0
  44. package/dist/code-builder/handlers/final-response-handler.js +75 -0
  45. package/dist/code-builder/handlers/final-response-handler.js.map +1 -0
  46. package/dist/code-builder/handlers/parse-validate-handler.d.ts +17 -0
  47. package/dist/code-builder/handlers/parse-validate-handler.js +116 -0
  48. package/dist/code-builder/handlers/parse-validate-handler.js.map +1 -0
  49. package/dist/code-builder/handlers/session-chat-handler.d.ts +30 -0
  50. package/dist/code-builder/handlers/session-chat-handler.js +96 -0
  51. package/dist/code-builder/handlers/session-chat-handler.js.map +1 -0
  52. package/dist/code-builder/handlers/text-editor-handler.d.ts +19 -0
  53. package/dist/code-builder/handlers/text-editor-handler.js +230 -0
  54. package/dist/code-builder/handlers/text-editor-handler.js.map +1 -0
  55. package/dist/code-builder/handlers/text-editor-tool-handler.d.ts +44 -0
  56. package/dist/code-builder/handlers/text-editor-tool-handler.js +145 -0
  57. package/dist/code-builder/handlers/text-editor-tool-handler.js.map +1 -0
  58. package/dist/code-builder/handlers/text-editor.types.d.ts +68 -0
  59. package/dist/code-builder/handlers/text-editor.types.js +68 -0
  60. package/dist/code-builder/handlers/text-editor.types.js.map +1 -0
  61. package/dist/code-builder/handlers/tool-dispatch-handler.d.ts +47 -0
  62. package/dist/code-builder/handlers/tool-dispatch-handler.js +287 -0
  63. package/dist/code-builder/handlers/tool-dispatch-handler.js.map +1 -0
  64. package/dist/code-builder/handlers/validate-tool-handler.d.ts +33 -0
  65. package/dist/code-builder/handlers/validate-tool-handler.js +101 -0
  66. package/dist/code-builder/handlers/validate-tool-handler.js.map +1 -0
  67. package/dist/code-builder/index.d.ts +5 -0
  68. package/dist/code-builder/index.js +10 -0
  69. package/dist/code-builder/index.js.map +1 -0
  70. package/dist/code-builder/prompts/index.d.ts +22 -0
  71. package/dist/code-builder/prompts/index.js +830 -0
  72. package/dist/code-builder/prompts/index.js.map +1 -0
  73. package/dist/code-builder/state/warning-tracker.d.ts +9 -0
  74. package/dist/code-builder/state/warning-tracker.js +28 -0
  75. package/dist/code-builder/state/warning-tracker.js.map +1 -0
  76. package/dist/code-builder/tools/ask-assistant.tool.d.ts +12 -0
  77. package/dist/code-builder/tools/ask-assistant.tool.js +12 -0
  78. package/dist/code-builder/tools/ask-assistant.tool.js.map +1 -0
  79. package/dist/code-builder/tools/build-workflow.tool.d.ts +12 -0
  80. package/dist/code-builder/tools/build-workflow.tool.js +12 -0
  81. package/dist/code-builder/tools/build-workflow.tool.js.map +1 -0
  82. package/dist/code-builder/tools/code-builder-get.tool.d.ts +61 -0
  83. package/dist/code-builder/tools/code-builder-get.tool.js +399 -0
  84. package/dist/code-builder/tools/code-builder-get.tool.js.map +1 -0
  85. package/dist/code-builder/tools/code-builder-search.tool.d.ts +15 -0
  86. package/dist/code-builder/tools/code-builder-search.tool.js +338 -0
  87. package/dist/code-builder/tools/code-builder-search.tool.js.map +1 -0
  88. package/dist/code-builder/tools/get-suggested-nodes.tool.d.ts +14 -0
  89. package/dist/code-builder/tools/get-suggested-nodes.tool.js +89 -0
  90. package/dist/code-builder/tools/get-suggested-nodes.tool.js.map +1 -0
  91. package/dist/code-builder/tools/suggested-nodes-data.d.ts +11 -0
  92. package/dist/code-builder/tools/suggested-nodes-data.js +236 -0
  93. package/dist/code-builder/tools/suggested-nodes-data.js.map +1 -0
  94. package/dist/code-builder/triage.agent.d.ts +48 -0
  95. package/dist/code-builder/triage.agent.js +223 -0
  96. package/dist/code-builder/triage.agent.js.map +1 -0
  97. package/dist/code-builder/types.d.ts +51 -0
  98. package/dist/code-builder/types.js +3 -0
  99. package/dist/code-builder/types.js.map +1 -0
  100. package/dist/code-builder/utils/code-builder-session.d.ts +25 -0
  101. package/dist/code-builder/utils/code-builder-session.js +186 -0
  102. package/dist/code-builder/utils/code-builder-session.js.map +1 -0
  103. package/dist/code-builder/utils/content-extractors.d.ts +5 -0
  104. package/dist/code-builder/utils/content-extractors.js +88 -0
  105. package/dist/code-builder/utils/content-extractors.js.map +1 -0
  106. package/dist/code-builder/utils/discriminator-utils.d.ts +22 -0
  107. package/dist/code-builder/utils/discriminator-utils.js +85 -0
  108. package/dist/code-builder/utils/discriminator-utils.js.map +1 -0
  109. package/dist/code-builder/utils/extract-code.d.ts +3 -0
  110. package/dist/code-builder/utils/extract-code.js +23 -0
  111. package/dist/code-builder/utils/extract-code.js.map +1 -0
  112. package/dist/code-builder/utils/format-warnings.d.ts +3 -0
  113. package/dist/code-builder/utils/format-warnings.js +12 -0
  114. package/dist/code-builder/utils/format-warnings.js.map +1 -0
  115. package/dist/code-builder/utils/llm-response-processor.d.ts +15 -0
  116. package/dist/code-builder/utils/llm-response-processor.js +38 -0
  117. package/dist/code-builder/utils/llm-response-processor.js.map +1 -0
  118. package/dist/code-builder/utils/node-diff.d.ts +13 -0
  119. package/dist/code-builder/utils/node-diff.js +22 -0
  120. package/dist/code-builder/utils/node-diff.js.map +1 -0
  121. package/dist/code-builder/utils/node-type-parser.d.ts +18 -0
  122. package/dist/code-builder/utils/node-type-parser.js +67 -0
  123. package/dist/code-builder/utils/node-type-parser.js.map +1 -0
  124. package/dist/constants.d.ts +2 -0
  125. package/dist/constants.js +3 -1
  126. package/dist/constants.js.map +1 -1
  127. package/dist/index.d.ts +4 -0
  128. package/dist/index.js +7 -1
  129. package/dist/index.js.map +1 -1
  130. package/dist/llm-config.js +1 -1
  131. package/dist/llm-config.js.map +1 -1
  132. package/dist/multi-agent-workflow-subgraphs.d.ts +37 -0
  133. package/dist/multi-agent-workflow-subgraphs.js +15 -8
  134. package/dist/multi-agent-workflow-subgraphs.js.map +1 -1
  135. package/dist/parent-graph-state.d.ts +8 -0
  136. package/dist/parent-graph-state.js +4 -0
  137. package/dist/parent-graph-state.js.map +1 -1
  138. package/dist/prompts/agents/builder.prompt.d.ts +1 -0
  139. package/dist/prompts/agents/builder.prompt.js +86 -4
  140. package/dist/prompts/agents/builder.prompt.js.map +1 -1
  141. package/dist/prompts/agents/planner.prompt.d.ts +1 -0
  142. package/dist/prompts/agents/planner.prompt.js +2 -1
  143. package/dist/prompts/agents/planner.prompt.js.map +1 -1
  144. package/dist/prompts/agents/responder.prompt.d.ts +4 -1
  145. package/dist/prompts/agents/responder.prompt.js +72 -1
  146. package/dist/prompts/agents/responder.prompt.js.map +1 -1
  147. package/dist/prompts/agents/supervisor.prompt.js +49 -1
  148. package/dist/prompts/agents/supervisor.prompt.js.map +1 -1
  149. package/dist/prompts/builder/prompt-builder.js +13 -5
  150. package/dist/prompts/builder/prompt-builder.js.map +1 -1
  151. package/dist/prompts/builder/types.d.ts +2 -1
  152. package/dist/prompts/shared/deictic-resolution.d.ts +14 -0
  153. package/dist/prompts/shared/deictic-resolution.js +142 -0
  154. package/dist/prompts/shared/deictic-resolution.js.map +1 -0
  155. package/dist/session-manager.service.d.ts +4 -3
  156. package/dist/session-manager.service.js +56 -8
  157. package/dist/session-manager.service.js.map +1 -1
  158. package/dist/subgraphs/builder.subgraph.d.ts +28 -0
  159. package/dist/subgraphs/builder.subgraph.js +30 -6
  160. package/dist/subgraphs/builder.subgraph.js.map +1 -1
  161. package/dist/subgraphs/discovery.subgraph.d.ts +7 -0
  162. package/dist/subgraphs/discovery.subgraph.js +21 -0
  163. package/dist/subgraphs/discovery.subgraph.js.map +1 -1
  164. package/dist/tools/add-node.tool.d.ts +4 -4
  165. package/dist/tools/builder-tools.js +6 -1
  166. package/dist/tools/builder-tools.js.map +1 -1
  167. package/dist/tools/introspect.tool.d.ts +34 -0
  168. package/dist/tools/introspect.tool.js +125 -0
  169. package/dist/tools/introspect.tool.js.map +1 -0
  170. package/dist/tools/submit-questions.tool.d.ts +8 -8
  171. package/dist/types/streaming.d.ts +7 -1
  172. package/dist/utils/cache-control/helpers.js +29 -22
  173. package/dist/utils/cache-control/helpers.js.map +1 -1
  174. package/dist/utils/context-builders.d.ts +2 -0
  175. package/dist/utils/context-builders.js +57 -0
  176. package/dist/utils/context-builders.js.map +1 -1
  177. package/dist/utils/error-sanitizer.d.ts +1 -0
  178. package/dist/utils/error-sanitizer.js +39 -0
  179. package/dist/utils/error-sanitizer.js.map +1 -0
  180. package/dist/utils/resource-operation-extractor.d.ts +12 -2
  181. package/dist/utils/resource-operation-extractor.js +12 -4
  182. package/dist/utils/resource-operation-extractor.js.map +1 -1
  183. package/dist/utils/stream-processor.js +9 -1
  184. package/dist/utils/stream-processor.js.map +1 -1
  185. package/dist/utils/thread-id.d.ts +1 -0
  186. package/dist/utils/thread-id.js +10 -0
  187. package/dist/utils/thread-id.js.map +1 -0
  188. package/dist/utils/token-usage-tracking-handler.d.ts +14 -0
  189. package/dist/utils/token-usage-tracking-handler.js +55 -0
  190. package/dist/utils/token-usage-tracking-handler.js.map +1 -0
  191. package/dist/validation/types.d.ts +3 -1
  192. package/dist/validation/types.js +11 -0
  193. package/dist/validation/types.js.map +1 -1
  194. package/dist/validation/utils/expressions.js +1 -1
  195. package/dist/validation/utils/expressions.js.map +1 -1
  196. package/dist/workflow-builder-agent.d.ts +26 -3
  197. package/dist/workflow-builder-agent.js +154 -1
  198. package/dist/workflow-builder-agent.js.map +1 -1
  199. package/dist/workflow-state.d.ts +6 -0
  200. package/package.json +10 -6
@@ -0,0 +1,236 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.categoryList = exports.suggestedNodesData = void 0;
4
+ exports.suggestedNodesData = {
5
+ chatbot: {
6
+ description: 'Receiving chat messages and replying (built-in chat, Telegram, Slack, etc.)',
7
+ patternHint: 'Chat Trigger → AI Agent → Memory → Response',
8
+ nodes: [
9
+ {
10
+ name: '@n8n/n8n-nodes-langchain.chatTrigger',
11
+ note: 'When loadPreviousSession is set to memory, the downstream Agent must also have its own memory subnode to maintain conversation context during processing',
12
+ },
13
+ {
14
+ name: '@n8n/n8n-nodes-langchain.agent',
15
+ note: 'Every agent in a conversational workflow MUST have a memory subnode connected. If multiple agents share the same conversation, they must use the same memory session key',
16
+ },
17
+ { name: '@n8n/n8n-nodes-langchain.lmChatOpenAi' },
18
+ { name: '@n8n/n8n-nodes-langchain.lmChatGoogleGemini' },
19
+ {
20
+ name: '@n8n/n8n-nodes-langchain.memoryBufferWindow',
21
+ note: 'Maintains short-term conversation history. Must be connected as a subnode to every Agent that participates in a conversation. When multiple agents share a conversation, use the same session key across all of them',
22
+ },
23
+ {
24
+ name: '@n8n/n8n-nodes-langchain.retrieverVectorStore',
25
+ note: 'Connects any Vector Store (Pinecone, Qdrant, Supabase, In-Memory, etc.) to an AI Agent for RAG. Use this as a subnode between the vector store and the agent to retrieve relevant documents when answering questions',
26
+ },
27
+ { name: 'n8n-nodes-base.slack' },
28
+ { name: 'n8n-nodes-base.telegram' },
29
+ { name: 'n8n-nodes-base.whatsApp' },
30
+ { name: 'n8n-nodes-base.discord' },
31
+ ],
32
+ },
33
+ notification: {
34
+ description: 'Sending alerts or updates via email, chat, SMS when events occur',
35
+ patternHint: 'Trigger → Condition → Send (Email/Slack/SMS)',
36
+ nodes: [
37
+ { name: 'n8n-nodes-base.webhook', note: 'Event-based notifications from external systems' },
38
+ {
39
+ name: 'n8n-nodes-base.scheduleTrigger',
40
+ note: 'Periodic monitoring and batch notifications',
41
+ },
42
+ {
43
+ name: 'n8n-nodes-base.gmail',
44
+ note: "Default to this because it's easy for users to setup",
45
+ },
46
+ { name: 'n8n-nodes-base.slack' },
47
+ { name: 'n8n-nodes-base.telegram' },
48
+ { name: 'n8n-nodes-base.twilio' },
49
+ {
50
+ name: 'n8n-nodes-base.httpRequest',
51
+ note: 'For services without dedicated nodes (Teams, Discord)',
52
+ },
53
+ { name: 'n8n-nodes-base.if', note: 'Check alert conditions before sending' },
54
+ {
55
+ name: 'n8n-nodes-base.switch',
56
+ note: 'If routing by severity/type is needed, use Switch to direct to different channels',
57
+ },
58
+ ],
59
+ },
60
+ scheduling: {
61
+ description: 'Running actions at specific times or intervals',
62
+ patternHint: 'Schedule Trigger → Fetch → Process → Act',
63
+ nodes: [
64
+ { name: 'n8n-nodes-base.scheduleTrigger' },
65
+ { name: 'n8n-nodes-base.httpRequest' },
66
+ { name: 'n8n-nodes-base.set' },
67
+ { name: 'n8n-nodes-base.wait', note: 'Respect rate limits between API calls' },
68
+ ],
69
+ },
70
+ data_transformation: {
71
+ description: 'Cleaning, formatting, or restructuring data',
72
+ patternHint: 'Input → Filter/Map → Transform → Output',
73
+ nodes: [
74
+ { name: 'n8n-nodes-base.set' },
75
+ { name: 'n8n-nodes-base.if', note: 'Use early to validate inputs' },
76
+ { name: 'n8n-nodes-base.filter', note: 'Use early to reduce data volume' },
77
+ { name: 'n8n-nodes-base.summarize', note: 'Pivot table-style aggregations' },
78
+ { name: 'n8n-nodes-base.aggregate', note: 'Combine multiple items into one' },
79
+ {
80
+ name: 'n8n-nodes-base.splitOut',
81
+ note: 'Convert single item with array into multiple items',
82
+ },
83
+ { name: 'n8n-nodes-base.sort' },
84
+ { name: 'n8n-nodes-base.limit' },
85
+ { name: 'n8n-nodes-base.removeDuplicates' },
86
+ {
87
+ name: 'n8n-nodes-base.splitInBatches',
88
+ note: 'For large datasets (100+ items), batch processing prevents timeouts',
89
+ },
90
+ ],
91
+ },
92
+ data_persistence: {
93
+ description: 'Storing, updating, or retrieving records from persistent storage',
94
+ patternHint: 'Trigger → Process → Store (DataTable/Sheets)',
95
+ nodes: [
96
+ { name: 'n8n-nodes-base.dataTable', note: 'PREFERRED - no external config needed' },
97
+ {
98
+ name: 'n8n-nodes-base.googleSheets',
99
+ note: 'For collaboration needs; if >10k rows expected, consider DataTable instead',
100
+ },
101
+ {
102
+ name: 'n8n-nodes-base.airtable',
103
+ note: 'If relationships between tables are needed',
104
+ },
105
+ { name: 'n8n-nodes-base.postgres' },
106
+ { name: 'n8n-nodes-base.mySql' },
107
+ { name: 'n8n-nodes-base.mongoDb' },
108
+ ],
109
+ },
110
+ data_extraction: {
111
+ description: 'Pulling specific information from structured or unstructured inputs',
112
+ patternHint: 'Source → Extract → Parse → Structure',
113
+ nodes: [
114
+ {
115
+ name: 'n8n-nodes-base.extractFromFile',
116
+ note: 'For multiple file types, route by file type first with IF/Switch',
117
+ },
118
+ { name: 'n8n-nodes-base.htmlExtract', note: 'JS-rendered content may be empty' },
119
+ { name: 'n8n-nodes-base.splitOut', note: 'Use before Loop Over Items for arrays' },
120
+ {
121
+ name: 'n8n-nodes-base.splitInBatches',
122
+ note: 'Process 200 rows at a time for memory',
123
+ },
124
+ { name: 'n8n-nodes-base.code' },
125
+ { name: '@n8n/n8n-nodes-langchain.informationExtractor', note: 'For unstructured text' },
126
+ {
127
+ name: '@n8n/n8n-nodes-langchain.chainSummarization',
128
+ note: 'Context window limits may truncate',
129
+ },
130
+ ],
131
+ },
132
+ document_processing: {
133
+ description: 'Taking action on content within files (PDFs, Word docs, images)',
134
+ patternHint: 'Trigger → Extract Text → AI Parse → Store',
135
+ nodes: [
136
+ {
137
+ name: 'n8n-nodes-base.gmailTrigger',
138
+ },
139
+ { name: 'n8n-nodes-base.googleDriveTrigger' },
140
+ {
141
+ name: 'n8n-nodes-base.extractFromFile',
142
+ note: 'Different file types require different operations - route accordingly',
143
+ },
144
+ { name: 'n8n-nodes-base.awsTextract', note: 'For tables and forms in scanned docs' },
145
+ { name: 'n8n-nodes-base.mindee', note: 'Specialized invoice/receipt parsing' },
146
+ { name: '@n8n/n8n-nodes-langchain.agent' },
147
+ {
148
+ name: '@n8n/n8n-nodes-langchain.documentDefaultDataLoader',
149
+ note: 'Loads binary files (PDF, CSV, JSON, DOCX, EPUB, text) into LangChain Documents. Auto-detects format from MIME type. Requires a preceding node that outputs binary data',
150
+ },
151
+ {
152
+ name: '@n8n/n8n-nodes-langchain.vectorStoreInMemory',
153
+ note: 'No external dependencies needed',
154
+ },
155
+ { name: 'n8n-nodes-base.splitInBatches', note: 'Process 5-10 files at a time' },
156
+ ],
157
+ },
158
+ form_input: {
159
+ description: 'Gathering data from users via forms',
160
+ patternHint: 'Form Trigger → Validate → Store → Respond',
161
+ nodes: [
162
+ { name: 'n8n-nodes-base.formTrigger', note: 'ALWAYS store raw data to persistent storage' },
163
+ { name: 'n8n-nodes-base.form', note: 'Each node is one page/step' },
164
+ { name: 'n8n-nodes-base.dataTable', note: 'PREFERRED for form data storage' },
165
+ { name: 'n8n-nodes-base.googleSheets' },
166
+ { name: 'n8n-nodes-base.airtable' },
167
+ ],
168
+ },
169
+ content_generation: {
170
+ description: 'Creating text, images, audio, or video',
171
+ patternHint: 'Trigger → Generate (Text/Image/Video) → Deliver',
172
+ nodes: [
173
+ { name: '@n8n/n8n-nodes-langchain.agent', note: 'For text generation' },
174
+ {
175
+ name: '@n8n/n8n-nodes-langchain.openAi',
176
+ note: 'Use for image/video generation. DALL-E, TTS, Sora video generation',
177
+ },
178
+ { name: '@n8n/n8n-nodes-langchain.lmChatGoogleGemini', note: 'Imagen, video generation' },
179
+ { name: 'n8n-nodes-base.httpRequest', note: 'For APIs without dedicated nodes' },
180
+ { name: 'n8n-nodes-base.editImage', note: 'Resize, crop, format conversion' },
181
+ { name: 'n8n-nodes-base.markdown', note: 'Convert to HTML' },
182
+ { name: 'n8n-nodes-base.facebookGraphApi' },
183
+ {
184
+ name: 'n8n-nodes-base.wait',
185
+ note: 'Video generation is async, use wait while polling for updated',
186
+ },
187
+ ],
188
+ },
189
+ triage: {
190
+ description: 'Classifying data for routing or prioritization',
191
+ patternHint: 'Trigger → Classify → Route → Act',
192
+ nodes: [
193
+ {
194
+ name: '@n8n/n8n-nodes-langchain.agent',
195
+ note: 'For consistent/deterministic classification, always use structured output parser and set temperature 0-0.2',
196
+ },
197
+ {
198
+ name: '@n8n/n8n-nodes-langchain.outputParserStructured',
199
+ note: 'Critical to ensure agent output is consistent and matching general schema',
200
+ },
201
+ ],
202
+ },
203
+ scraping_and_research: {
204
+ description: 'Collecting information from websites or APIs',
205
+ patternHint: 'Trigger → Fetch → Extract → Store',
206
+ nodes: [
207
+ {
208
+ name: 'n8n-nodes-base.dataTable',
209
+ note: 'Default storage for scraped data when the user does not specify a destination. No external config needed. Always include a storage step in scraping workflows',
210
+ },
211
+ {
212
+ name: 'n8n-nodes-base.phantombuster',
213
+ note: 'Use this for social media requests: LinkedIn, Facebook, Instagram, Twitter, etc.',
214
+ },
215
+ {
216
+ name: '@n8n/n8n-nodes-langchain.toolSerpApi',
217
+ note: 'Give agent web search capability, get up-to-date information from websites.',
218
+ },
219
+ { name: 'n8n-nodes-base.perplexity', note: 'Recommended for fetching up-to-date news' },
220
+ { name: 'n8n-nodes-base.perplexityTool', note: 'Recommended for fetching up-to-date news' },
221
+ {
222
+ name: 'n8n-nodes-base.htmlExtract',
223
+ note: 'Use to extract HTML content from http requests. Though, JS-rendered sites may return empty',
224
+ },
225
+ {
226
+ name: 'n8n-nodes-base.splitInBatches',
227
+ note: 'Use to batch the processing of items. General recommendation: 200 rows at a time if processing is fast',
228
+ },
229
+ { name: 'n8n-nodes-base.wait', note: 'Use this to avoid rate limits (429 errors)' },
230
+ { name: 'n8n-nodes-base.httpRequest' },
231
+ { name: 'n8n-nodes-base.httpRequestTool' },
232
+ ],
233
+ },
234
+ };
235
+ exports.categoryList = Object.keys(exports.suggestedNodesData);
236
+ //# sourceMappingURL=suggested-nodes-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggested-nodes-data.js","sourceRoot":"","sources":["../../../src/code-builder/tools/suggested-nodes-data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { BaseChatModel } from '@langchain/core/language_models/chat_models';
2
+ import type { Logger } from '@n8n/backend-common';
3
+ import type { AssistantHandler } from '../assistant/assistant-handler';
4
+ import type { StreamOutput } from '../types/streaming';
5
+ import type { ChatPayload } from '../workflow-builder-agent';
6
+ type TriageConversationEntry = {
7
+ type: 'build-request';
8
+ message: string;
9
+ } | {
10
+ type: 'assistant-exchange';
11
+ userQuery: string;
12
+ assistantSummary: string;
13
+ } | {
14
+ type: 'plan';
15
+ userQuery: string;
16
+ plan: string;
17
+ };
18
+ export interface TriageAgentConfig {
19
+ llm: BaseChatModel;
20
+ assistantHandler: AssistantHandler;
21
+ buildWorkflow: (payload: ChatPayload, userId: string, abortSignal?: AbortSignal) => AsyncIterable<StreamOutput>;
22
+ logger?: Logger;
23
+ }
24
+ export interface TriageAgentParams {
25
+ payload: ChatPayload;
26
+ userId: string;
27
+ abortSignal?: AbortSignal;
28
+ sdkSessionId?: string;
29
+ conversationHistory?: TriageConversationEntry[];
30
+ }
31
+ export interface TriageAgentOutcome {
32
+ sdkSessionId?: string;
33
+ assistantSummary?: string;
34
+ buildExecuted?: boolean;
35
+ }
36
+ export declare class TriageAgent {
37
+ private readonly llm;
38
+ private readonly assistantHandler;
39
+ private readonly buildWorkflow;
40
+ private readonly logger?;
41
+ constructor(config: TriageAgentConfig);
42
+ run(params: TriageAgentParams): AsyncGenerator<StreamOutput, TriageAgentOutcome>;
43
+ private executeToolWithStreaming;
44
+ private executeTool;
45
+ private getOutcome;
46
+ private wrapChunk;
47
+ }
48
+ export {};
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TriageAgent = void 0;
4
+ const messages_1 = require("@langchain/core/messages");
5
+ const content_extractors_1 = require("../code-builder/utils/content-extractors");
6
+ const constants_1 = require("../constants");
7
+ const builder_1 = require("../prompts/builder");
8
+ const ask_assistant_tool_1 = require("./tools/ask-assistant.tool");
9
+ const build_workflow_tool_1 = require("./tools/build-workflow.tool");
10
+ function conversationEntryToString(entry) {
11
+ switch (entry.type) {
12
+ case 'build-request':
13
+ return entry.message;
14
+ case 'assistant-exchange':
15
+ return `[Help] Q: ${entry.userQuery} → A: ${entry.assistantSummary}`;
16
+ case 'plan':
17
+ return `[Plan] Q: ${entry.userQuery} → ${entry.plan}`;
18
+ }
19
+ }
20
+ function buildTriagePrompt(conversationHistory) {
21
+ return (0, builder_1.prompt)()
22
+ .section('role', 'You are a triage agent for the n8n workflow builder. ' +
23
+ 'Your job is to classify each user message and route it to the right handler.')
24
+ .section('routing', `Route each message using one or more of these:
25
+
26
+ 1. **build_workflow** — The user wants to create, modify, or change a workflow.
27
+ Pass the full user request as instructions.
28
+
29
+ 2. **ask_assistant** — The user has a general question about n8n concepts, needs help understanding how something works, wants guidance on setting up credentials, or needs to diagnose a workflow error.
30
+ Pass the user's query faithfully.
31
+
32
+ 3. **Direct reply** — Simple conversational messages that don't need either tool.
33
+ Respond with helpful text directly.`)
34
+ .section('rules', `- For error/debug messages: first call ask_assistant to diagnose, then call build_workflow to apply the fix
35
+ - For pure questions (no fix needed): call ask_assistant and respond with its answer — no follow-up build required
36
+ - When in doubt between ask_assistant and build_workflow, prefer build_workflow for any message that implies changing the workflow
37
+ - Use conversation history to resolve references like "change that" or "the previous node"`)
38
+ .sectionIf(conversationHistory && conversationHistory.length > 0, 'conversation history', () => conversationHistory
39
+ .map((entry, i) => `${i + 1}. ${conversationEntryToString(entry)}`)
40
+ .join('\n'))
41
+ .build();
42
+ }
43
+ class TriageAgent {
44
+ llm;
45
+ assistantHandler;
46
+ buildWorkflow;
47
+ logger;
48
+ constructor(config) {
49
+ this.llm = config.llm;
50
+ this.assistantHandler = config.assistantHandler;
51
+ this.buildWorkflow = config.buildWorkflow;
52
+ this.logger = config.logger;
53
+ }
54
+ async *run(params) {
55
+ const { payload, userId, abortSignal, sdkSessionId, conversationHistory } = params;
56
+ if (!this.llm.bindTools) {
57
+ throw new Error('LLM does not support bindTools');
58
+ }
59
+ const llmWithTools = this.llm.bindTools([ask_assistant_tool_1.ASK_ASSISTANT_TOOL, build_workflow_tool_1.BUILD_WORKFLOW_TOOL]);
60
+ const systemContent = buildTriagePrompt(conversationHistory);
61
+ const messages = [
62
+ new messages_1.SystemMessage(systemContent),
63
+ new messages_1.HumanMessage(payload.message),
64
+ ];
65
+ const ctx = { userId, payload, abortSignal };
66
+ const state = { sdkSessionId };
67
+ let reachedMaxIterations = true;
68
+ for (let iteration = 0; iteration < constants_1.MAX_TRIAGE_ITERATIONS; iteration++) {
69
+ const response = await llmWithTools.invoke(messages, {
70
+ signal: abortSignal,
71
+ });
72
+ messages.push(response);
73
+ const toolCalls = response.tool_calls ?? [];
74
+ if (toolCalls.length === 0) {
75
+ this.logger?.debug('[TriageAgent] No tool call, responding with text', {
76
+ iteration: iteration + 1,
77
+ });
78
+ const text = (0, content_extractors_1.extractTextContent)(new messages_1.AIMessage({ content: response.content })) ?? '';
79
+ if (text) {
80
+ yield this.wrapChunk({
81
+ role: 'assistant',
82
+ type: 'message',
83
+ text,
84
+ });
85
+ }
86
+ reachedMaxIterations = false;
87
+ break;
88
+ }
89
+ for (const toolCall of toolCalls) {
90
+ this.logger?.debug('[TriageAgent] Tool called', {
91
+ toolName: toolCall.name,
92
+ iteration: iteration + 1,
93
+ });
94
+ const toolCallId = toolCall.id ?? `tc-${iteration}`;
95
+ const result = yield* this.executeToolWithStreaming(toolCall, ctx, state);
96
+ this.logger?.debug('[TriageAgent] Tool completed', {
97
+ toolName: toolCall.name,
98
+ iteration: iteration + 1,
99
+ endLoop: result.endLoop,
100
+ });
101
+ messages.push(new messages_1.ToolMessage({
102
+ tool_call_id: toolCallId,
103
+ content: result.content,
104
+ }));
105
+ if (result.endLoop) {
106
+ return this.getOutcome(state);
107
+ }
108
+ }
109
+ }
110
+ if (reachedMaxIterations) {
111
+ this.logger?.warn('[TriageAgent] Max iterations reached');
112
+ }
113
+ return this.getOutcome(state);
114
+ }
115
+ async *executeToolWithStreaming(toolCall, ctx, state) {
116
+ const queue = [];
117
+ let resolveNext;
118
+ let done = false;
119
+ const enqueue = (output) => {
120
+ queue.push(output);
121
+ resolveNext?.();
122
+ };
123
+ const toolPromise = this.executeTool(toolCall, ctx, state, enqueue).finally(() => {
124
+ done = true;
125
+ resolveNext?.();
126
+ });
127
+ while (!done || queue.length > 0) {
128
+ if (queue.length > 0) {
129
+ yield queue.shift();
130
+ }
131
+ else if (!done) {
132
+ await new Promise((resolve) => {
133
+ resolveNext = resolve;
134
+ if (queue.length > 0 || done) {
135
+ resolve();
136
+ }
137
+ });
138
+ }
139
+ }
140
+ return await toolPromise;
141
+ }
142
+ async executeTool(toolCall, ctx, state, enqueue) {
143
+ switch (toolCall.name) {
144
+ case 'ask_assistant': {
145
+ const assistantToolCallId = `triage-ask-assistant-${Date.now()}`;
146
+ enqueue(this.wrapChunk({
147
+ type: 'tool',
148
+ toolName: 'assistant',
149
+ toolCallId: assistantToolCallId,
150
+ customDisplayTitle: 'Asking assistant...',
151
+ status: 'running',
152
+ }));
153
+ const progressWriter = (chunk) => {
154
+ if (chunk.type === 'tool') {
155
+ enqueue(this.wrapChunk(chunk));
156
+ }
157
+ };
158
+ const currentWorkflow = ctx.payload.workflowContext?.currentWorkflow;
159
+ const workflowJSON = currentWorkflow
160
+ ? {
161
+ name: currentWorkflow.name ?? '',
162
+ nodes: currentWorkflow.nodes ?? [],
163
+ connections: currentWorkflow.connections ?? {},
164
+ }
165
+ : undefined;
166
+ const result = await this.assistantHandler.execute({
167
+ query: toolCall.args.query,
168
+ sdkSessionId: state.sdkSessionId,
169
+ workflowJSON,
170
+ }, ctx.userId, progressWriter, ctx.abortSignal);
171
+ const chunks = [
172
+ {
173
+ type: 'tool',
174
+ toolName: 'assistant',
175
+ toolCallId: assistantToolCallId,
176
+ status: 'completed',
177
+ },
178
+ ];
179
+ if (result.responseText) {
180
+ chunks.push({
181
+ role: 'assistant',
182
+ type: 'message',
183
+ text: result.responseText,
184
+ });
185
+ }
186
+ enqueue({ messages: chunks });
187
+ state.sdkSessionId = result.sdkSessionId;
188
+ state.assistantSummary = result.summary;
189
+ return { content: result.summary };
190
+ }
191
+ case 'build_workflow': {
192
+ const enrichedPayload = state.assistantSummary
193
+ ? {
194
+ ...ctx.payload,
195
+ message: `[Diagnosis]: ${state.assistantSummary}\n\n${ctx.payload.message}`,
196
+ }
197
+ : ctx.payload;
198
+ for await (const chunk of this.buildWorkflow(enrichedPayload, ctx.userId, ctx.abortSignal)) {
199
+ enqueue(chunk);
200
+ }
201
+ state.buildExecuted = true;
202
+ return { content: 'Workflow built.', endLoop: true };
203
+ }
204
+ default:
205
+ this.logger?.warn('[TriageAgent] Unknown tool call', {
206
+ toolName: toolCall.name,
207
+ });
208
+ return { content: `Unknown tool: ${toolCall.name}` };
209
+ }
210
+ }
211
+ getOutcome(state) {
212
+ return {
213
+ sdkSessionId: state.sdkSessionId,
214
+ assistantSummary: state.assistantSummary,
215
+ buildExecuted: state.buildExecuted,
216
+ };
217
+ }
218
+ wrapChunk(chunk) {
219
+ return { messages: [chunk] };
220
+ }
221
+ }
222
+ exports.TriageAgent = TriageAgent;
223
+ //# sourceMappingURL=triage.agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage.agent.js","sourceRoot":"","sources":["../../src/code-builder/triage.agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { Callbacks } from '@langchain/core/callbacks/manager';
2
+ import type { BaseChatModel } from '@langchain/core/language_models/chat_models';
3
+ import type { Logger } from '@n8n/backend-common';
4
+ import type { WorkflowJSON } from '@n8n/workflow-sdk';
5
+ import type { IDisplayOptions, INodeTypeDescription, ITelemetryTrackProperties } from 'n8n-workflow';
6
+ export interface SubnodeRequirement {
7
+ connectionType: string;
8
+ required: boolean;
9
+ displayOptions?: IDisplayOptions;
10
+ }
11
+ export interface CodeBuilderNodeSearchResult {
12
+ name: string;
13
+ displayName: string;
14
+ description: string;
15
+ version: number;
16
+ score: number;
17
+ inputs: INodeTypeDescription['inputs'];
18
+ outputs: INodeTypeDescription['outputs'];
19
+ builderHintMessage?: string;
20
+ subnodeRequirements?: SubnodeRequirement[];
21
+ }
22
+ export interface WorkflowCodeOutput {
23
+ workflowCode: string;
24
+ }
25
+ export interface ValidationWarning {
26
+ code: string;
27
+ message: string;
28
+ nodeName?: string;
29
+ parameterPath?: string;
30
+ }
31
+ export interface ParseAndValidateResult {
32
+ workflow: WorkflowJSON;
33
+ warnings: ValidationWarning[];
34
+ }
35
+ export interface TokenUsage {
36
+ inputTokens: number;
37
+ outputTokens: number;
38
+ thinkingTokens: number;
39
+ }
40
+ export interface CodeBuilderAgentConfig {
41
+ llm: BaseChatModel;
42
+ nodeTypes: INodeTypeDescription[];
43
+ logger?: Logger;
44
+ nodeDefinitionDirs?: string[];
45
+ enableTextEditor?: boolean;
46
+ onTokenUsage?: (usage: TokenUsage) => void;
47
+ callbacks?: Callbacks;
48
+ runMetadata?: Record<string, unknown>;
49
+ onTelemetryEvent?: (event: string, properties: ITelemetryTrackProperties) => void;
50
+ generatePinData?: boolean;
51
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/code-builder/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import type { BaseChatModel } from '@langchain/core/language_models/chat_models';
2
+ import type { MemorySaver } from '@langchain/langgraph';
3
+ export type ConversationEntry = {
4
+ type: 'build-request';
5
+ message: string;
6
+ } | {
7
+ type: 'assistant-exchange';
8
+ userQuery: string;
9
+ assistantSummary: string;
10
+ } | {
11
+ type: 'plan';
12
+ userQuery: string;
13
+ plan: string;
14
+ };
15
+ export declare function entryToString(entry: ConversationEntry): string;
16
+ export interface CodeBuilderSession {
17
+ conversationEntries: ConversationEntry[];
18
+ previousSummary?: string;
19
+ sdkSessionId?: string;
20
+ }
21
+ export declare function loadCodeBuilderSession(checkpointer: MemorySaver, threadId: string): Promise<CodeBuilderSession>;
22
+ export declare function saveCodeBuilderSession(checkpointer: MemorySaver, threadId: string, session: CodeBuilderSession): Promise<void>;
23
+ export declare function compactSessionIfNeeded(session: CodeBuilderSession, llm: BaseChatModel, maxMessages?: number): Promise<CodeBuilderSession>;
24
+ export declare function generateCodeBuilderThreadId(workflowId: string, userId: string): string;
25
+ export declare function saveSessionMessages(checkpointer: MemorySaver, workflowId: string, userId: string, messages: unknown[], versionId?: string, userMessageId?: string): Promise<void>;