@n8n/ai-workflow-builder 1.8.1 → 1.9.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 (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,57 @@
1
+ import type { BaseChatModel, BaseChatModelCallOptions } from '@langchain/core/language_models/chat_models';
2
+ import type { AIMessage, BaseMessage } from '@langchain/core/messages';
3
+ import type { Runnable } from '@langchain/core/runnables';
4
+ import type { StructuredToolInterface } from '@langchain/core/tools';
5
+ import type { Logger } from '@n8n/backend-common';
6
+ import type { WorkflowJSON } from '@n8n/workflow-sdk';
7
+ import { type HistoryContext } from '../prompts';
8
+ import { TextEditorHandler } from './text-editor-handler';
9
+ import { TextEditorToolHandler } from './text-editor-tool-handler';
10
+ import type { PlanOutput } from '../../types/planning';
11
+ import type { ChatPayload } from '../../workflow-builder-agent';
12
+ import type { ParseAndValidateResult } from '../types';
13
+ import type { NodeTypeParser } from '../utils/node-type-parser';
14
+ type ParseAndValidateFn = (code: string, currentWorkflow?: WorkflowJSON) => Promise<ParseAndValidateResult>;
15
+ type GetErrorContextFn = (code: string, errorMessage: string) => string;
16
+ export interface ChatSetupHandlerConfig {
17
+ llm: BaseChatModel;
18
+ tools: StructuredToolInterface[];
19
+ enableTextEditorConfig?: boolean;
20
+ parseAndValidate: ParseAndValidateFn;
21
+ getErrorContext: GetErrorContextFn;
22
+ nodeTypeParser?: NodeTypeParser;
23
+ logger?: Logger;
24
+ }
25
+ export interface ChatSetupParams {
26
+ payload: ChatPayload;
27
+ historyContext?: HistoryContext;
28
+ }
29
+ export type LlmWithTools = Runnable<BaseMessage[], AIMessage, BaseChatModelCallOptions>;
30
+ export interface ChatSetupResult {
31
+ llmWithTools: LlmWithTools;
32
+ messages: BaseMessage[];
33
+ textEditorEnabled: boolean;
34
+ preGeneratedWorkflowCode?: string;
35
+ currentWorkflow?: WorkflowJSON;
36
+ textEditorHandler?: TextEditorHandler;
37
+ textEditorToolHandler?: TextEditorToolHandler;
38
+ }
39
+ export declare class ChatSetupHandler {
40
+ private llm;
41
+ private tools;
42
+ private enableTextEditorConfig?;
43
+ private parseAndValidate;
44
+ private getErrorContext;
45
+ private nodeTypeParser?;
46
+ private logger?;
47
+ constructor(config: ChatSetupHandlerConfig);
48
+ execute(params: ChatSetupParams): Promise<ChatSetupResult>;
49
+ private shouldEnableTextEditor;
50
+ private preGenerateWorkflowCode;
51
+ private bindToolsToLlm;
52
+ private formatInitialMessages;
53
+ private initializeTextEditorHandlers;
54
+ private prefetchSearchResults;
55
+ }
56
+ export declare function extractNodeNamesFromPlan(plan: PlanOutput): string[];
57
+ export {};
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ChatSetupHandler = void 0;
4
+ exports.extractNodeNamesFromPlan = extractNodeNamesFromPlan;
5
+ const workflow_sdk_1 = require("@n8n/workflow-sdk");
6
+ const constants_1 = require("../constants");
7
+ const prompts_1 = require("../prompts");
8
+ const text_editor_handler_1 = require("./text-editor-handler");
9
+ const text_editor_tool_handler_1 = require("./text-editor-tool-handler");
10
+ const code_builder_search_tool_1 = require("../tools/code-builder-search.tool");
11
+ const extract_code_1 = require("../utils/extract-code");
12
+ class ChatSetupHandler {
13
+ llm;
14
+ tools;
15
+ enableTextEditorConfig;
16
+ parseAndValidate;
17
+ getErrorContext;
18
+ nodeTypeParser;
19
+ logger;
20
+ constructor(config) {
21
+ this.llm = config.llm;
22
+ this.tools = config.tools;
23
+ this.enableTextEditorConfig = config.enableTextEditorConfig;
24
+ this.parseAndValidate = config.parseAndValidate;
25
+ this.getErrorContext = config.getErrorContext;
26
+ this.nodeTypeParser = config.nodeTypeParser;
27
+ this.logger = config.logger;
28
+ }
29
+ async execute(params) {
30
+ const { payload, historyContext } = params;
31
+ const currentWorkflow = payload.workflowContext?.currentWorkflow;
32
+ const workflowForCodeContext = (currentWorkflow?.nodes?.length ?? 0) > 0 ? currentWorkflow : undefined;
33
+ const preGeneratedWorkflowCode = this.preGenerateWorkflowCode(payload, workflowForCodeContext);
34
+ const preSearchResults = payload.planOutput
35
+ ? this.prefetchSearchResults(payload.planOutput)
36
+ : undefined;
37
+ const textEditorEnabled = this.shouldEnableTextEditor();
38
+ const prompt = (0, prompts_1.buildCodeBuilderPrompt)(workflowForCodeContext, historyContext, {
39
+ enableTextEditor: textEditorEnabled,
40
+ executionSchema: payload.workflowContext?.executionSchema,
41
+ executionData: payload.workflowContext?.executionData,
42
+ expressionValues: payload.workflowContext?.expressionValues,
43
+ preGeneratedCode: preGeneratedWorkflowCode,
44
+ valuesExcluded: payload.workflowContext?.valuesExcluded,
45
+ pinnedNodes: payload.workflowContext?.pinnedNodes,
46
+ planOutput: payload.planOutput,
47
+ preSearchResults,
48
+ });
49
+ const llmWithTools = this.bindToolsToLlm(textEditorEnabled, !!payload.planOutput);
50
+ const messages = await this.formatInitialMessages(prompt, payload.message);
51
+ const { textEditorHandler, textEditorToolHandler } = this.initializeTextEditorHandlers(textEditorEnabled, preGeneratedWorkflowCode);
52
+ return {
53
+ llmWithTools,
54
+ messages,
55
+ textEditorEnabled,
56
+ preGeneratedWorkflowCode,
57
+ currentWorkflow,
58
+ textEditorHandler,
59
+ textEditorToolHandler,
60
+ };
61
+ }
62
+ shouldEnableTextEditor() {
63
+ if (this.enableTextEditorConfig !== undefined) {
64
+ return this.enableTextEditorConfig;
65
+ }
66
+ const modelName = this.llm.modelId ?? '';
67
+ return (modelName.includes('claude-4') ||
68
+ modelName.includes('opus-4') ||
69
+ modelName.includes('sonnet-4'));
70
+ }
71
+ preGenerateWorkflowCode(payload, currentWorkflow) {
72
+ if (!currentWorkflow) {
73
+ return undefined;
74
+ }
75
+ return (0, workflow_sdk_1.generateWorkflowCode)({
76
+ workflow: currentWorkflow,
77
+ executionSchema: payload.workflowContext?.executionSchema,
78
+ executionData: payload.workflowContext?.executionData,
79
+ expressionValues: payload.workflowContext?.expressionValues,
80
+ valuesExcluded: payload.workflowContext?.valuesExcluded,
81
+ pinnedNodes: payload.workflowContext?.pinnedNodes,
82
+ });
83
+ }
84
+ bindToolsToLlm(textEditorEnabled, hasPlanOutput) {
85
+ if (!this.llm.bindTools) {
86
+ throw new Error('LLM does not support bindTools - cannot use tools for node discovery');
87
+ }
88
+ let tools = hasPlanOutput ? this.tools.filter((t) => t.name !== 'get_suggested_nodes') : this.tools;
89
+ if (textEditorEnabled) {
90
+ tools = [...tools, constants_1.TEXT_EDITOR_TOOL, constants_1.VALIDATE_TOOL, constants_1.BATCH_STR_REPLACE_TOOL];
91
+ }
92
+ return this.llm.bindTools(tools);
93
+ }
94
+ async formatInitialMessages(prompt, userMessage) {
95
+ const formattedMessages = await prompt.formatMessages({ userMessage });
96
+ return [...formattedMessages];
97
+ }
98
+ initializeTextEditorHandlers(textEditorEnabled, preGeneratedWorkflowCode) {
99
+ if (!textEditorEnabled) {
100
+ return {};
101
+ }
102
+ const textEditorHandler = new text_editor_handler_1.TextEditorHandler();
103
+ const textEditorToolHandler = new text_editor_tool_handler_1.TextEditorToolHandler({
104
+ textEditorExecute: (args) => textEditorHandler.execute(args),
105
+ textEditorGetCode: () => textEditorHandler.getWorkflowCode(),
106
+ parseAndValidate: this.parseAndValidate,
107
+ getErrorContext: this.getErrorContext,
108
+ });
109
+ if (preGeneratedWorkflowCode) {
110
+ const codeWithImport = `${extract_code_1.SDK_IMPORT_STATEMENT}\n\n${preGeneratedWorkflowCode}`;
111
+ textEditorHandler.setWorkflowCode(codeWithImport);
112
+ }
113
+ return { textEditorHandler, textEditorToolHandler };
114
+ }
115
+ prefetchSearchResults(plan) {
116
+ const nodeNames = extractNodeNamesFromPlan(plan);
117
+ if (nodeNames.length === 0)
118
+ return undefined;
119
+ if (!this.nodeTypeParser) {
120
+ this.logger?.warn('nodeTypeParser not available, skipping pre-fetch of plan suggestedNodes');
121
+ return undefined;
122
+ }
123
+ const formattedResults = [];
124
+ for (const nodeName of nodeNames) {
125
+ const result = (0, code_builder_search_tool_1.formatNodeResult)(this.nodeTypeParser, nodeName);
126
+ if (result) {
127
+ formattedResults.push(result);
128
+ }
129
+ }
130
+ if (formattedResults.length === 0)
131
+ return undefined;
132
+ return `Found ${formattedResults.length} nodes:\n\n${formattedResults.join('\n\n')}`;
133
+ }
134
+ }
135
+ exports.ChatSetupHandler = ChatSetupHandler;
136
+ function extractNodeNamesFromPlan(plan) {
137
+ const nodeSet = new Set();
138
+ for (const step of plan.steps) {
139
+ if (step.suggestedNodes) {
140
+ for (const nodeName of step.suggestedNodes) {
141
+ nodeSet.add(nodeName);
142
+ }
143
+ }
144
+ }
145
+ return [...nodeSet];
146
+ }
147
+ //# sourceMappingURL=chat-setup-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-setup-handler.js","sourceRoot":"","sources":["../../../src/code-builder/handlers/chat-setup-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { AIMessage, BaseMessage } from '@langchain/core/messages';
2
+ import type { WorkflowJSON } from '@n8n/workflow-sdk';
3
+ import type { WarningTracker } from '../state/warning-tracker';
4
+ import type { ParseAndValidateResult } from '../types';
5
+ type ParseAndValidateFn = (code: string, currentWorkflow?: WorkflowJSON) => Promise<ParseAndValidateResult>;
6
+ export interface FinalResponseHandlerConfig {
7
+ parseAndValidate: ParseAndValidateFn;
8
+ }
9
+ export interface FinalResponseParams {
10
+ response: AIMessage;
11
+ currentWorkflow: WorkflowJSON | undefined;
12
+ messages: BaseMessage[];
13
+ warningTracker: WarningTracker;
14
+ }
15
+ export interface FinalResponseResult {
16
+ success: boolean;
17
+ workflow?: WorkflowJSON;
18
+ sourceCode?: string;
19
+ parseDuration?: number;
20
+ isParseError?: boolean;
21
+ shouldContinue?: boolean;
22
+ }
23
+ export declare class FinalResponseHandler {
24
+ private parseAndValidate;
25
+ constructor(config: FinalResponseHandlerConfig);
26
+ process(params: FinalResponseParams): Promise<FinalResponseResult>;
27
+ private parseStructuredOutput;
28
+ }
29
+ export {};
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FinalResponseHandler = void 0;
4
+ const content_extractors_1 = require("../utils/content-extractors");
5
+ const extract_code_1 = require("../utils/extract-code");
6
+ const format_warnings_1 = require("../utils/format-warnings");
7
+ class FinalResponseHandler {
8
+ parseAndValidate;
9
+ constructor(config) {
10
+ this.parseAndValidate = config.parseAndValidate;
11
+ }
12
+ async process(params) {
13
+ const { response, currentWorkflow, messages, warningTracker } = params;
14
+ const parseResult = this.parseStructuredOutput(response);
15
+ if (!parseResult.result) {
16
+ (0, content_extractors_1.pushValidationFeedback)(messages, `Could not parse your response: ${parseResult.error}\n\nPlease provide your workflow code in a \`\`\`typescript code block.`);
17
+ return {
18
+ success: false,
19
+ isParseError: true,
20
+ shouldContinue: true,
21
+ };
22
+ }
23
+ const workflowCode = parseResult.result.workflowCode;
24
+ const parseStartTime = Date.now();
25
+ try {
26
+ const result = await this.parseAndValidate(workflowCode, currentWorkflow);
27
+ const parseDuration = Date.now() - parseStartTime;
28
+ const newWarnings = warningTracker.filterNewWarnings(result.warnings);
29
+ if (newWarnings.length > 0) {
30
+ warningTracker.markAsSeen(newWarnings);
31
+ const warningMessages = (0, format_warnings_1.formatWarnings)(newWarnings.slice(0, 5), warningTracker);
32
+ (0, content_extractors_1.pushValidationFeedback)(messages, `The workflow code has validation warnings that should be addressed:\n\n${warningMessages}\n\nPlease fix these issues and provide the corrected version in a \`\`\`typescript code block.`);
33
+ return {
34
+ success: false,
35
+ parseDuration,
36
+ shouldContinue: true,
37
+ };
38
+ }
39
+ return {
40
+ success: true,
41
+ workflow: result.workflow,
42
+ sourceCode: workflowCode,
43
+ parseDuration,
44
+ shouldContinue: false,
45
+ };
46
+ }
47
+ catch (parseError) {
48
+ const parseDuration = Date.now() - parseStartTime;
49
+ const errorMessage = parseError instanceof Error ? parseError.message : String(parseError);
50
+ (0, content_extractors_1.pushValidationFeedback)(messages, `The workflow code you generated has a parsing error:\n\n${errorMessage}\n\nPlease fix the code and provide the corrected version in a \`\`\`typescript code block.`);
51
+ return {
52
+ success: false,
53
+ parseDuration,
54
+ isParseError: true,
55
+ shouldContinue: true,
56
+ };
57
+ }
58
+ }
59
+ parseStructuredOutput(message) {
60
+ const content = (0, content_extractors_1.extractTextContent)(message);
61
+ if (!content) {
62
+ return { result: null, error: 'No text content found in response' };
63
+ }
64
+ const workflowCode = (0, extract_code_1.extractWorkflowCode)(content);
65
+ if (!workflowCode?.includes('workflow')) {
66
+ return {
67
+ result: null,
68
+ error: 'No valid workflow code found in response. Please provide your code in a ```typescript code block.',
69
+ };
70
+ }
71
+ return { result: { workflowCode }, error: null };
72
+ }
73
+ }
74
+ exports.FinalResponseHandler = FinalResponseHandler;
75
+ //# sourceMappingURL=final-response-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"final-response-handler.js","sourceRoot":"","sources":["../../../src/code-builder/handlers/final-response-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Logger } from '@n8n/backend-common';
2
+ import type { WorkflowJSON } from '@n8n/workflow-sdk';
3
+ import type { ParseAndValidateResult, ValidationWarning } from '../types';
4
+ export interface ParseValidateHandlerConfig {
5
+ logger?: Logger;
6
+ generatePinData?: boolean;
7
+ }
8
+ export declare class ParseValidateHandler {
9
+ private logger?;
10
+ private generatePinData;
11
+ constructor(config?: ParseValidateHandlerConfig);
12
+ private collectValidationIssues;
13
+ validateExistingWorkflow(json: WorkflowJSON): ValidationWarning[];
14
+ parseAndValidate(code: string, currentWorkflow?: WorkflowJSON): Promise<ParseAndValidateResult>;
15
+ getErrorContext(code: string, errorMessage: string): string;
16
+ private detectFixHint;
17
+ }
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ParseValidateHandler = void 0;
4
+ const workflow_sdk_1 = require("@n8n/workflow-sdk");
5
+ const extract_code_1 = require("../utils/extract-code");
6
+ class ParseValidateHandler {
7
+ logger;
8
+ generatePinData;
9
+ constructor(config = {}) {
10
+ this.logger = config.logger;
11
+ this.generatePinData = config.generatePinData ?? true;
12
+ }
13
+ collectValidationIssues(issues, allWarnings, context, logLevel) {
14
+ if (issues.length === 0)
15
+ return;
16
+ if (logLevel === 'warn') {
17
+ this.logger?.warn(`Graph validation ${context.toLowerCase()}`, {
18
+ [context.toLowerCase()]: issues.map((i) => i.message),
19
+ });
20
+ }
21
+ else {
22
+ this.logger?.info(`Graph validation ${context.toLowerCase()}`, {
23
+ [context.toLowerCase()]: issues.map((i) => i.message),
24
+ });
25
+ }
26
+ for (const issue of issues) {
27
+ allWarnings.push({
28
+ code: issue.code,
29
+ message: issue.message,
30
+ nodeName: issue.nodeName,
31
+ });
32
+ }
33
+ }
34
+ validateExistingWorkflow(json) {
35
+ if (json.nodes.length === 0) {
36
+ return [];
37
+ }
38
+ const builder = workflow_sdk_1.workflow.fromJSON(json);
39
+ const allWarnings = [];
40
+ const graphValidation = builder.validate();
41
+ this.collectValidationIssues(graphValidation.errors, allWarnings, 'GRAPH VALIDATION ERRORS', 'warn');
42
+ this.collectValidationIssues(graphValidation.warnings, allWarnings, 'GRAPH VALIDATION WARNINGS', 'info');
43
+ return allWarnings;
44
+ }
45
+ async parseAndValidate(code, currentWorkflow) {
46
+ const codeToParse = (0, extract_code_1.stripImportStatements)(code);
47
+ try {
48
+ this.logger?.debug('Parsing WorkflowCode', { codeLength: codeToParse.length });
49
+ const builder = (0, workflow_sdk_1.parseWorkflowCodeToBuilder)(codeToParse);
50
+ builder.regenerateNodeIds();
51
+ const allWarnings = [];
52
+ const graphValidation = builder.validate();
53
+ this.collectValidationIssues(graphValidation.errors, allWarnings, 'GRAPH VALIDATION ERRORS', 'warn');
54
+ this.collectValidationIssues(graphValidation.warnings, allWarnings, 'GRAPH VALIDATION WARNINGS', 'info');
55
+ const json = builder.toJSON();
56
+ const validationResult = (0, workflow_sdk_1.validateWorkflow)(json);
57
+ this.collectValidationIssues(validationResult.errors, allWarnings, 'JSON VALIDATION ERRORS', 'warn');
58
+ this.collectValidationIssues(validationResult.warnings, allWarnings, 'JSON VALIDATION WARNINGS', 'info');
59
+ if (this.generatePinData) {
60
+ builder.generatePinData({ beforeWorkflow: currentWorkflow });
61
+ }
62
+ const workflowJson = builder.toJSON();
63
+ this.logger?.debug('Parsed workflow', {
64
+ id: workflowJson.id,
65
+ name: workflowJson.name,
66
+ nodeCount: workflowJson.nodes.length,
67
+ });
68
+ return { workflow: workflowJson, warnings: allWarnings };
69
+ }
70
+ catch (error) {
71
+ this.logger?.error('Failed to parse WorkflowCode', {
72
+ error: error instanceof Error ? error.message : String(error),
73
+ code: code.substring(0, 500),
74
+ });
75
+ throw new Error(`Failed to parse generated workflow code: ${error instanceof Error ? error.message : 'Unknown error'}`);
76
+ }
77
+ }
78
+ getErrorContext(code, errorMessage) {
79
+ const lineMatch = errorMessage.match(/(?:line|Line)\s*(\d+)/i);
80
+ if (!lineMatch) {
81
+ const lines = code.split('\n').slice(0, 10);
82
+ return `Code context:\n${lines.map((l, i) => `${i + 1}: ${l}`).join('\n')}`;
83
+ }
84
+ const errorLine = parseInt(lineMatch[1], 10);
85
+ const lines = code.split('\n');
86
+ const start = Math.max(0, errorLine - 4);
87
+ const end = Math.min(lines.length, errorLine + 3);
88
+ const context = lines
89
+ .slice(start, end)
90
+ .map((l, i) => {
91
+ const lineNum = start + i + 1;
92
+ const marker = lineNum === errorLine ? '> ' : ' ';
93
+ return `${marker}${lineNum}: ${l}`;
94
+ })
95
+ .join('\n');
96
+ const contextText = `Code around line ${errorLine}:\n${context}`;
97
+ const hint = this.detectFixHint(lines, errorLine);
98
+ if (hint) {
99
+ return `${contextText}\n\n${hint}`;
100
+ }
101
+ return contextText;
102
+ }
103
+ detectFixHint(lines, errorLine) {
104
+ const searchStart = Math.max(0, errorLine - 5);
105
+ const searchEnd = Math.min(lines.length, errorLine + 5);
106
+ const nearbyCode = lines.slice(searchStart, searchEnd).join('\n');
107
+ if (/expr\s*\(\s*`[^`]*\$\{\{/.test(nearbyCode)) {
108
+ return ("HINT: The '$' before '{{' inside a backtick template literal is interpreted as JS template interpolation. " +
109
+ "Use single quotes instead of backticks for expr(), e.g. expr('Amount: ${{ $json.amount }}'). " +
110
+ 'Fix ALL occurrences in the file at once.');
111
+ }
112
+ return null;
113
+ }
114
+ }
115
+ exports.ParseValidateHandler = ParseValidateHandler;
116
+ //# sourceMappingURL=parse-validate-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-validate-handler.js","sourceRoot":"","sources":["../../../src/code-builder/handlers/parse-validate-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { BaseChatModel } from '@langchain/core/language_models/chat_models';
2
+ import type { MemorySaver } from '@langchain/langgraph';
3
+ import type { Logger } from '@n8n/backend-common';
4
+ import type { StreamOutput } from '../../types/streaming';
5
+ import type { ChatPayload } from '../../workflow-builder-agent';
6
+ import type { HistoryContext } from '../prompts';
7
+ type AgentChatFn = (payload: ChatPayload, userId: string, abortSignal?: AbortSignal, historyContext?: HistoryContext) => AsyncGenerator<StreamOutput, void, unknown>;
8
+ export interface SessionChatHandlerConfig {
9
+ checkpointer: MemorySaver;
10
+ llm: BaseChatModel;
11
+ logger?: Logger;
12
+ onGenerationSuccess?: () => Promise<void>;
13
+ }
14
+ export interface SessionChatParams {
15
+ payload: ChatPayload;
16
+ userId: string;
17
+ abortSignal?: AbortSignal;
18
+ agentChat: AgentChatFn;
19
+ }
20
+ export declare class SessionChatHandler {
21
+ private checkpointer;
22
+ private llm;
23
+ private logger?;
24
+ private onGenerationSuccess?;
25
+ constructor(config: SessionChatHandlerConfig);
26
+ private buildHistoryContext;
27
+ private processChunk;
28
+ execute(params: SessionChatParams): AsyncGenerator<StreamOutput, void, unknown>;
29
+ }
30
+ export {};
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SessionChatHandler = void 0;
4
+ const code_builder_session_1 = require("../utils/code-builder-session");
5
+ function isSessionMessagesChunk(chunk) {
6
+ return chunk.type === 'session-messages' && 'messages' in chunk;
7
+ }
8
+ class SessionChatHandler {
9
+ checkpointer;
10
+ llm;
11
+ logger;
12
+ onGenerationSuccess;
13
+ constructor(config) {
14
+ this.checkpointer = config.checkpointer;
15
+ this.llm = config.llm;
16
+ this.logger = config.logger;
17
+ this.onGenerationSuccess = config.onGenerationSuccess;
18
+ }
19
+ buildHistoryContext(session) {
20
+ if (session.conversationEntries.length > 0 || session.previousSummary) {
21
+ return {
22
+ conversationEntries: session.conversationEntries,
23
+ previousSummary: session.previousSummary,
24
+ };
25
+ }
26
+ return undefined;
27
+ }
28
+ processChunk(chunk) {
29
+ let generationSucceeded = false;
30
+ let sessionMessages;
31
+ if (chunk.messages?.some((msg) => msg.type === 'workflow-updated')) {
32
+ generationSucceeded = true;
33
+ }
34
+ for (const msg of chunk.messages ?? []) {
35
+ if (isSessionMessagesChunk(msg)) {
36
+ sessionMessages = msg.messages;
37
+ }
38
+ }
39
+ const filteredMessages = chunk.messages?.filter((msg) => msg.type !== 'session-messages');
40
+ return { generationSucceeded, sessionMessages, filteredMessages };
41
+ }
42
+ async *execute(params) {
43
+ const { payload, userId, abortSignal, agentChat } = params;
44
+ const workflowId = payload.workflowContext?.currentWorkflow?.id;
45
+ if (!workflowId) {
46
+ this.logger?.debug('No workflow ID, skipping session management');
47
+ yield* agentChat(payload, userId, abortSignal);
48
+ return;
49
+ }
50
+ const threadId = (0, code_builder_session_1.generateCodeBuilderThreadId)(workflowId, userId);
51
+ let session = await (0, code_builder_session_1.loadCodeBuilderSession)(this.checkpointer, threadId);
52
+ this.logger?.debug('Loaded CodeBuilder session', {
53
+ threadId,
54
+ conversationEntriesCount: session.conversationEntries.length,
55
+ hasPreviousSummary: !!session.previousSummary,
56
+ });
57
+ session = await (0, code_builder_session_1.compactSessionIfNeeded)(session, this.llm);
58
+ const historyContext = this.buildHistoryContext(session);
59
+ let generationSucceeded = false;
60
+ let sessionMessages;
61
+ for await (const chunk of agentChat(payload, userId, abortSignal, historyContext)) {
62
+ const result = this.processChunk(chunk);
63
+ if (result.generationSucceeded)
64
+ generationSucceeded = true;
65
+ if (result.sessionMessages)
66
+ sessionMessages = result.sessionMessages;
67
+ if (result.filteredMessages && result.filteredMessages.length > 0) {
68
+ yield { messages: result.filteredMessages };
69
+ }
70
+ }
71
+ session.conversationEntries.push({ type: 'build-request', message: payload.message });
72
+ await (0, code_builder_session_1.saveCodeBuilderSession)(this.checkpointer, threadId, session);
73
+ if (generationSucceeded && sessionMessages) {
74
+ await (0, code_builder_session_1.saveSessionMessages)(this.checkpointer, workflowId, userId, sessionMessages, payload.versionId, payload.id);
75
+ this.logger?.debug('Saved session messages to SessionManager thread', {
76
+ workflowId,
77
+ userId,
78
+ messageCount: sessionMessages.length,
79
+ });
80
+ }
81
+ if (generationSucceeded && this.onGenerationSuccess) {
82
+ try {
83
+ await this.onGenerationSuccess();
84
+ }
85
+ catch (error) {
86
+ this.logger?.warn('Failed to execute onGenerationSuccess callback', { error });
87
+ }
88
+ }
89
+ this.logger?.debug('Saved CodeBuilder session', {
90
+ threadId,
91
+ newEntryCount: session.conversationEntries.length,
92
+ });
93
+ }
94
+ }
95
+ exports.SessionChatHandler = SessionChatHandler;
96
+ //# sourceMappingURL=session-chat-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-chat-handler.js","sourceRoot":"","sources":["../../../src/code-builder/handlers/session-chat-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { TextEditorCommand, StrReplacement, BatchReplaceResult } from './text-editor.types';
2
+ export declare function formatCodeWithLineNumbers(code: string): string;
3
+ export declare function findDivergenceContext(code: string, searchStr: string): string | undefined;
4
+ export declare class TextEditorHandler {
5
+ private code;
6
+ constructor();
7
+ execute(command: TextEditorCommand): string;
8
+ private validatePath;
9
+ private handleView;
10
+ private handleCreate;
11
+ private handleStrReplace;
12
+ private handleInsert;
13
+ private countOccurrences;
14
+ executeBatch(replacements: StrReplacement[]): string | BatchReplaceResult[];
15
+ getWorkflowCode(): string | null;
16
+ setWorkflowCode(code: string): void;
17
+ hasWorkflowCode(): boolean;
18
+ clearWorkflowCode(): void;
19
+ }