@n8n/ai-workflow-builder 1.4.1 → 1.5.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 (158) hide show
  1. package/dist/agents/responder.agent.d.ts +4 -2
  2. package/dist/agents/responder.agent.js +9 -2
  3. package/dist/agents/responder.agent.js.map +1 -1
  4. package/dist/agents/supervisor.agent.d.ts +2 -1
  5. package/dist/agents/supervisor.agent.js +2 -2
  6. package/dist/agents/supervisor.agent.js.map +1 -1
  7. package/dist/ai-workflow-builder-agent.service.js +11 -7
  8. package/dist/ai-workflow-builder-agent.service.js.map +1 -1
  9. package/dist/build.tsbuildinfo +1 -1
  10. package/dist/chains/conversation-compact.d.ts +2 -1
  11. package/dist/chains/conversation-compact.js +2 -2
  12. package/dist/chains/conversation-compact.js.map +1 -1
  13. package/dist/chains/workflow-name.d.ts +2 -1
  14. package/dist/chains/workflow-name.js +3 -2
  15. package/dist/chains/workflow-name.js.map +1 -1
  16. package/dist/constants.d.ts +0 -1
  17. package/dist/constants.js +1 -2
  18. package/dist/constants.js.map +1 -1
  19. package/dist/llm-config.d.ts +14 -5
  20. package/dist/llm-config.js +90 -35
  21. package/dist/llm-config.js.map +1 -1
  22. package/dist/multi-agent-workflow-subgraphs.d.ts +2 -4
  23. package/dist/multi-agent-workflow-subgraphs.js +20 -15
  24. package/dist/multi-agent-workflow-subgraphs.js.map +1 -1
  25. package/dist/prompts/agents/builder.prompt.js +211 -33
  26. package/dist/prompts/agents/builder.prompt.js.map +1 -1
  27. package/dist/prompts/agents/configurator.prompt.js +24 -2
  28. package/dist/prompts/agents/configurator.prompt.js.map +1 -1
  29. package/dist/prompts/agents/discovery.prompt.js +84 -7
  30. package/dist/prompts/agents/discovery.prompt.js.map +1 -1
  31. package/dist/prompts/chains/parameter-updater/guides/gmail.js +27 -2
  32. package/dist/prompts/chains/parameter-updater/guides/gmail.js.map +1 -1
  33. package/dist/prompts/chains/parameter-updater/guides/index.d.ts +1 -0
  34. package/dist/prompts/chains/parameter-updater/guides/index.js +3 -1
  35. package/dist/prompts/chains/parameter-updater/guides/index.js.map +1 -1
  36. package/dist/prompts/chains/parameter-updater/guides/predecessor-output.d.ts +2 -0
  37. package/dist/prompts/chains/parameter-updater/guides/predecessor-output.js +25 -0
  38. package/dist/prompts/chains/parameter-updater/guides/predecessor-output.js.map +1 -0
  39. package/dist/prompts/chains/parameter-updater/registry.js +1 -0
  40. package/dist/prompts/chains/parameter-updater/registry.js.map +1 -1
  41. package/dist/prompts/index.d.ts +0 -1
  42. package/dist/prompts/index.js +1 -4
  43. package/dist/prompts/index.js.map +1 -1
  44. package/dist/prompts/shared/node-guidance/structured-output-parser.js +1 -1
  45. package/dist/prompts/shared/node-recommendations/audio-generation.d.ts +2 -0
  46. package/dist/prompts/shared/node-recommendations/audio-generation.js +18 -0
  47. package/dist/prompts/shared/node-recommendations/audio-generation.js.map +1 -0
  48. package/dist/prompts/shared/node-recommendations/image-generation.d.ts +2 -0
  49. package/dist/prompts/shared/node-recommendations/image-generation.js +18 -0
  50. package/dist/prompts/shared/node-recommendations/image-generation.js.map +1 -0
  51. package/dist/prompts/shared/node-recommendations/index.d.ts +3 -0
  52. package/dist/prompts/shared/node-recommendations/index.js +17 -0
  53. package/dist/prompts/shared/node-recommendations/index.js.map +1 -0
  54. package/dist/prompts/shared/node-recommendations/text-manipulation.d.ts +2 -0
  55. package/dist/prompts/shared/node-recommendations/text-manipulation.js +27 -0
  56. package/dist/prompts/shared/node-recommendations/text-manipulation.js.map +1 -0
  57. package/dist/prompts/shared/node-recommendations/utils/format-recommendation.d.ts +2 -0
  58. package/dist/prompts/shared/node-recommendations/utils/format-recommendation.js +24 -0
  59. package/dist/prompts/shared/node-recommendations/utils/format-recommendation.js.map +1 -0
  60. package/dist/prompts/shared/node-recommendations/video-generation.d.ts +2 -0
  61. package/dist/prompts/shared/node-recommendations/video-generation.js +15 -0
  62. package/dist/prompts/shared/node-recommendations/video-generation.js.map +1 -0
  63. package/dist/subgraphs/builder.subgraph.d.ts +3 -1
  64. package/dist/subgraphs/builder.subgraph.js +28 -4
  65. package/dist/subgraphs/builder.subgraph.js.map +1 -1
  66. package/dist/subgraphs/configurator.subgraph.d.ts +3 -1
  67. package/dist/subgraphs/configurator.subgraph.js +5 -3
  68. package/dist/subgraphs/configurator.subgraph.js.map +1 -1
  69. package/dist/subgraphs/discovery.subgraph.d.ts +81 -1
  70. package/dist/subgraphs/discovery.subgraph.js +67 -8
  71. package/dist/subgraphs/discovery.subgraph.js.map +1 -1
  72. package/dist/tools/add-node.tool.d.ts +12 -12
  73. package/dist/tools/add-node.tool.js +25 -30
  74. package/dist/tools/add-node.tool.js.map +1 -1
  75. package/dist/tools/best-practices/data-persistence.js +5 -0
  76. package/dist/tools/best-practices/data-persistence.js.map +1 -1
  77. package/dist/tools/best-practices/index.js +2 -1
  78. package/dist/tools/best-practices/index.js.map +1 -1
  79. package/dist/tools/best-practices/scheduling.js +41 -168
  80. package/dist/tools/best-practices/scheduling.js.map +1 -1
  81. package/dist/tools/builder-tools.d.ts +1 -10
  82. package/dist/tools/builder-tools.js +6 -17
  83. package/dist/tools/builder-tools.js.map +1 -1
  84. package/dist/tools/get-documentation.tool.d.ts +79 -0
  85. package/dist/tools/get-documentation.tool.js +164 -0
  86. package/dist/tools/get-documentation.tool.js.map +1 -0
  87. package/dist/tools/helpers/state.d.ts +1 -0
  88. package/dist/tools/helpers/state.js +6 -0
  89. package/dist/tools/helpers/state.js.map +1 -1
  90. package/dist/tools/node-details.tool.js +14 -3
  91. package/dist/tools/node-details.tool.js.map +1 -1
  92. package/dist/tools/rename-node.tool.d.ts +15 -0
  93. package/dist/tools/rename-node.tool.js +141 -0
  94. package/dist/tools/rename-node.tool.js.map +1 -0
  95. package/dist/tools/update-node-parameters.tool.d.ts +1 -1
  96. package/dist/tools/update-node-parameters.tool.js +131 -2
  97. package/dist/tools/update-node-parameters.tool.js.map +1 -1
  98. package/dist/tools/utils/mermaid.utils.js +12 -10
  99. package/dist/tools/utils/mermaid.utils.js.map +1 -1
  100. package/dist/tools/validate-structure.tool.js +3 -2
  101. package/dist/tools/validate-structure.tool.js.map +1 -1
  102. package/dist/types/discovery-types.d.ts +2 -0
  103. package/dist/types/index.d.ts +1 -0
  104. package/dist/types/index.js +1 -0
  105. package/dist/types/index.js.map +1 -1
  106. package/dist/types/node-recommendations.d.ts +26 -0
  107. package/dist/types/node-recommendations.js +16 -0
  108. package/dist/types/node-recommendations.js.map +1 -0
  109. package/dist/types/tools.d.ts +5 -3
  110. package/dist/types/workflow.d.ts +5 -0
  111. package/dist/utils/context-builders.js +17 -2
  112. package/dist/utils/context-builders.js.map +1 -1
  113. package/dist/utils/operations-processor.js +37 -5
  114. package/dist/utils/operations-processor.js.map +1 -1
  115. package/dist/utils/resource-operation-extractor.d.ts +16 -0
  116. package/dist/utils/resource-operation-extractor.js +148 -0
  117. package/dist/utils/resource-operation-extractor.js.map +1 -0
  118. package/dist/utils/state-modifier.d.ts +3 -2
  119. package/dist/utils/state-modifier.js +4 -4
  120. package/dist/utils/state-modifier.js.map +1 -1
  121. package/dist/utils/stream-processor.js +1 -1
  122. package/dist/utils/stream-processor.js.map +1 -1
  123. package/dist/utils/subgraph-helpers.d.ts +1 -0
  124. package/dist/utils/subgraph-helpers.js +12 -0
  125. package/dist/utils/subgraph-helpers.js.map +1 -1
  126. package/dist/validation/auto-fix/auto-fix-connections.d.ts +21 -0
  127. package/dist/validation/auto-fix/auto-fix-connections.js +207 -0
  128. package/dist/validation/auto-fix/auto-fix-connections.js.map +1 -0
  129. package/dist/validation/auto-fix/index.d.ts +2 -0
  130. package/dist/validation/auto-fix/index.js +6 -0
  131. package/dist/validation/auto-fix/index.js.map +1 -0
  132. package/dist/validation/checks/connections.js +10 -0
  133. package/dist/validation/checks/connections.js.map +1 -1
  134. package/dist/validation/checks/credentials.js +6 -6
  135. package/dist/validation/checks/credentials.js.map +1 -1
  136. package/dist/validation/types.d.ts +1 -1
  137. package/dist/workflow-builder-agent.d.ts +14 -14
  138. package/dist/workflow-builder-agent.js +22 -239
  139. package/dist/workflow-builder-agent.js.map +1 -1
  140. package/dist/workflow-state.d.ts +0 -1
  141. package/dist/workflow-state.js +0 -17
  142. package/dist/workflow-state.js.map +1 -1
  143. package/package.json +15 -12
  144. package/dist/prompts/legacy-agent.prompt.d.ts +0 -6
  145. package/dist/prompts/legacy-agent.prompt.js +0 -587
  146. package/dist/prompts/legacy-agent.prompt.js.map +0 -1
  147. package/dist/tools/categorize-prompt.tool.d.ts +0 -5
  148. package/dist/tools/categorize-prompt.tool.js +0 -85
  149. package/dist/tools/categorize-prompt.tool.js.map +0 -1
  150. package/dist/tools/get-best-practices.tool.d.ts +0 -34
  151. package/dist/tools/get-best-practices.tool.js +0 -94
  152. package/dist/tools/get-best-practices.tool.js.map +0 -1
  153. package/dist/tools/validate-workflow.tool.d.ts +0 -5
  154. package/dist/tools/validate-workflow.tool.js +0 -73
  155. package/dist/tools/validate-workflow.tool.js.map +0 -1
  156. package/dist/utils/workflow-validation.d.ts +0 -2
  157. package/dist/utils/workflow-validation.js +0 -37
  158. package/dist/utils/workflow-validation.js.map +0 -1
@@ -1,85 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CATEGORIZE_PROMPT_TOOL = void 0;
4
- exports.createCategorizePromptTool = createCategorizePromptTool;
5
- const tools_1 = require("@langchain/core/tools");
6
- const zod_1 = require("zod");
7
- const prompt_categorization_1 = require("../chains/prompt-categorization");
8
- const errors_1 = require("../errors");
9
- const progress_1 = require("../tools/helpers/progress");
10
- const response_1 = require("../tools/helpers/response");
11
- const categorizePromptSchema = zod_1.z.object({
12
- prompt: zod_1.z.string().min(1).describe('The user prompt to categorize'),
13
- });
14
- function buildCategorizationMessage(categorization) {
15
- const parts = [];
16
- parts.push('Prompt categorized');
17
- if (categorization.techniques.length > 0) {
18
- parts.push(`- Techniques: ${categorization.techniques.join(', ')}`);
19
- }
20
- if (categorization.confidence !== undefined) {
21
- parts.push(`- Confidence: ${(categorization.confidence * 100).toFixed(0)}%`);
22
- }
23
- return parts.join('\n');
24
- }
25
- exports.CATEGORIZE_PROMPT_TOOL = {
26
- toolName: 'categorize_prompt',
27
- displayTitle: 'Categorizing prompt',
28
- };
29
- function createCategorizePromptTool(llm, logger) {
30
- const dynamicTool = (0, tools_1.tool)(async (input, config) => {
31
- const reporter = (0, progress_1.createProgressReporter)(config, exports.CATEGORIZE_PROMPT_TOOL.toolName, exports.CATEGORIZE_PROMPT_TOOL.displayTitle);
32
- try {
33
- const validatedInput = categorizePromptSchema.parse(input);
34
- const { prompt } = validatedInput;
35
- reporter.start(validatedInput);
36
- logger?.debug('Categorizing user prompt using LLM...');
37
- reporter.progress('Analyzing prompt to identify use case and techniques...');
38
- const categorization = await (0, prompt_categorization_1.promptCategorizationChain)(llm, prompt);
39
- logger?.debug('Prompt categorized', {
40
- techniques: categorization.techniques,
41
- confidence: categorization.confidence,
42
- });
43
- const output = {
44
- categorization,
45
- };
46
- reporter.complete(output);
47
- return (0, response_1.createSuccessResponse)(config, buildCategorizationMessage(categorization), {
48
- categorization,
49
- techniqueCategories: categorization.techniques,
50
- });
51
- }
52
- catch (error) {
53
- if (error instanceof zod_1.z.ZodError) {
54
- const validationError = new errors_1.ValidationError('Invalid input parameters', {
55
- extra: { errors: error.errors },
56
- });
57
- reporter.error(validationError);
58
- return (0, response_1.createErrorResponse)(config, validationError);
59
- }
60
- const toolError = new errors_1.ToolExecutionError(error instanceof Error ? error.message : 'Unknown error occurred', {
61
- toolName: exports.CATEGORIZE_PROMPT_TOOL.toolName,
62
- cause: error instanceof Error ? error : undefined,
63
- });
64
- reporter.error(toolError);
65
- return (0, response_1.createErrorResponse)(config, toolError);
66
- }
67
- }, {
68
- name: exports.CATEGORIZE_PROMPT_TOOL.toolName,
69
- description: `Categorize a user's workflow request to identify the use case and required techniques.
70
-
71
- This helps understand what type of workflow the user wants to build and which automation patterns will be needed.
72
-
73
- Use this tool when you receive an initial workflow request to:
74
- - Detect required techniques (e.g., scraping, data transformation, notifications)
75
- - Better understand the user's needs and context
76
-
77
- The categorization allows retrieving relevant best practice documentation to improve workflow structure and node selection.`,
78
- schema: categorizePromptSchema,
79
- });
80
- return {
81
- tool: dynamicTool,
82
- ...exports.CATEGORIZE_PROMPT_TOOL,
83
- };
84
- }
85
- //# sourceMappingURL=categorize-prompt.tool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"categorize-prompt.tool.js","sourceRoot":"","sources":["../../src/tools/categorize-prompt.tool.ts"],"names":[],"mappings":"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"}
@@ -1,34 +0,0 @@
1
- import { z } from 'zod';
2
- import type { BuilderToolBase } from '../utils/stream-processor';
3
- export declare const GET_BEST_PRACTICES_TOOL: BuilderToolBase;
4
- export declare function createGetBestPracticesTool(): {
5
- toolName: string;
6
- displayTitle: string;
7
- getCustomDisplayTitle?: (values: Record<string, unknown>) => string;
8
- tool: import("@langchain/core/tools").DynamicStructuredTool<z.ZodObject<{
9
- techniques: z.ZodArray<z.ZodNativeEnum<{
10
- readonly SCHEDULING: "scheduling";
11
- readonly CHATBOT: "chatbot";
12
- readonly FORM_INPUT: "form_input";
13
- readonly SCRAPING_AND_RESEARCH: "scraping_and_research";
14
- readonly MONITORING: "monitoring";
15
- readonly ENRICHMENT: "enrichment";
16
- readonly TRIAGE: "triage";
17
- readonly CONTENT_GENERATION: "content_generation";
18
- readonly DOCUMENT_PROCESSING: "document_processing";
19
- readonly DATA_EXTRACTION: "data_extraction";
20
- readonly DATA_ANALYSIS: "data_analysis";
21
- readonly DATA_TRANSFORMATION: "data_transformation";
22
- readonly DATA_PERSISTENCE: "data_persistence";
23
- readonly NOTIFICATION: "notification";
24
- readonly KNOWLEDGE_BASE: "knowledge_base";
25
- readonly HUMAN_IN_THE_LOOP: "human_in_the_loop";
26
- }>, "many">;
27
- }, "strip", z.ZodTypeAny, {
28
- techniques: ("scheduling" | "chatbot" | "form_input" | "scraping_and_research" | "monitoring" | "enrichment" | "triage" | "content_generation" | "document_processing" | "data_extraction" | "data_analysis" | "data_transformation" | "data_persistence" | "notification" | "knowledge_base" | "human_in_the_loop")[];
29
- }, {
30
- techniques: ("scheduling" | "chatbot" | "form_input" | "scraping_and_research" | "monitoring" | "enrichment" | "triage" | "content_generation" | "document_processing" | "data_extraction" | "data_analysis" | "data_transformation" | "data_persistence" | "notification" | "knowledge_base" | "human_in_the_loop")[];
31
- }>, unknown, {
32
- techniques: ("scheduling" | "chatbot" | "form_input" | "scraping_and_research" | "monitoring" | "enrichment" | "triage" | "content_generation" | "document_processing" | "data_extraction" | "data_analysis" | "data_transformation" | "data_persistence" | "notification" | "knowledge_base" | "human_in_the_loop")[];
33
- }, import("@langchain/langgraph").Command<unknown, Record<string, unknown>, string>>;
34
- };
@@ -1,94 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GET_BEST_PRACTICES_TOOL = void 0;
4
- exports.createGetBestPracticesTool = createGetBestPracticesTool;
5
- const tools_1 = require("@langchain/core/tools");
6
- const zod_1 = require("zod");
7
- const errors_1 = require("../errors");
8
- const best_practices_1 = require("../tools/best-practices");
9
- const progress_1 = require("../tools/helpers/progress");
10
- const response_1 = require("../tools/helpers/response");
11
- const categorization_1 = require("../types/categorization");
12
- const getBestPracticesSchema = zod_1.z.object({
13
- techniques: zod_1.z
14
- .array(zod_1.z.nativeEnum(categorization_1.WorkflowTechnique))
15
- .min(1)
16
- .describe('List of workflow techniques to retrieve best practices for'),
17
- });
18
- function formatBestPractices(techniques) {
19
- const parts = [];
20
- const foundDocs = [];
21
- for (const technique of techniques) {
22
- const doc = best_practices_1.documentation[technique];
23
- if (doc) {
24
- foundDocs.push(doc.getDocumentation());
25
- }
26
- }
27
- if (foundDocs.length > 0) {
28
- parts.push('<best_practices>');
29
- parts.push(foundDocs.join('\n---\n'));
30
- parts.push('</best_practices>');
31
- }
32
- return parts.join('\n');
33
- }
34
- exports.GET_BEST_PRACTICES_TOOL = {
35
- toolName: 'get_best_practices',
36
- displayTitle: 'Getting best practices',
37
- };
38
- function createGetBestPracticesTool() {
39
- const dynamicTool = (0, tools_1.tool)((input, config) => {
40
- const reporter = (0, progress_1.createProgressReporter)(config, exports.GET_BEST_PRACTICES_TOOL.toolName, exports.GET_BEST_PRACTICES_TOOL.displayTitle);
41
- try {
42
- const validatedInput = getBestPracticesSchema.parse(input);
43
- const { techniques } = validatedInput;
44
- reporter.start(validatedInput);
45
- reporter.progress(`Retrieving best practices for ${techniques.length} technique(s)...`);
46
- const availableDocs = techniques.filter((technique) => best_practices_1.documentation[technique]);
47
- if (availableDocs.length === 0) {
48
- const message = `No best practices documentation available for the requested techniques: ${techniques.join(', ')}`;
49
- reporter.complete({ techniques, found: 0 });
50
- return (0, response_1.createSuccessResponse)(config, message);
51
- }
52
- const message = formatBestPractices(techniques);
53
- reporter.complete({
54
- techniques,
55
- found: availableDocs.length,
56
- missing: techniques.length - availableDocs.length,
57
- });
58
- return (0, response_1.createSuccessResponse)(config, message);
59
- }
60
- catch (error) {
61
- if (error instanceof zod_1.z.ZodError) {
62
- const validationError = new errors_1.ValidationError('Invalid input parameters', {
63
- extra: { errors: error.errors },
64
- });
65
- reporter.error(validationError);
66
- return (0, response_1.createErrorResponse)(config, validationError);
67
- }
68
- const toolError = new errors_1.ToolExecutionError(error instanceof Error ? error.message : 'Unknown error occurred', {
69
- toolName: exports.GET_BEST_PRACTICES_TOOL.toolName,
70
- cause: error instanceof Error ? error : undefined,
71
- });
72
- reporter.error(toolError);
73
- return (0, response_1.createErrorResponse)(config, toolError);
74
- }
75
- }, {
76
- name: exports.GET_BEST_PRACTICES_TOOL.toolName,
77
- description: `Retrieve best practices documentation for specific workflow techniques.
78
-
79
- Use this tool after categorizing a user's prompt to get relevant guidance on:
80
- - Recommended nodes and their purposes
81
- - Common pitfalls to avoid
82
- - Performance and resource management tips
83
- - Implementation patterns and best practices
84
- - General tips on building workflows that utilise the provided techniques
85
-
86
- This helps build better workflows by applying proven patterns and avoiding common mistakes.`,
87
- schema: getBestPracticesSchema,
88
- });
89
- return {
90
- tool: dynamicTool,
91
- ...exports.GET_BEST_PRACTICES_TOOL,
92
- };
93
- }
94
- //# sourceMappingURL=get-best-practices.tool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-best-practices.tool.js","sourceRoot":"","sources":["../../src/tools/get-best-practices.tool.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- import type { Logger } from '@n8n/backend-common';
2
- import type { INodeTypeDescription } from 'n8n-workflow';
3
- import type { BuilderTool, BuilderToolBase } from '../utils/stream-processor';
4
- export declare const VALIDATE_WORKFLOW_TOOL: BuilderToolBase;
5
- export declare function createValidateWorkflowTool(parsedNodeTypes: INodeTypeDescription[], logger?: Logger): BuilderTool;
@@ -1,73 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VALIDATE_WORKFLOW_TOOL = void 0;
4
- exports.createValidateWorkflowTool = createValidateWorkflowTool;
5
- const tools_1 = require("@langchain/core/tools");
6
- const zod_1 = require("zod");
7
- const programmatic_1 = require("../validation/programmatic");
8
- const types_1 = require("../validation/types");
9
- const errors_1 = require("../errors");
10
- const workflow_validation_1 = require("../utils/workflow-validation");
11
- const progress_1 = require("./helpers/progress");
12
- const response_1 = require("./helpers/response");
13
- const state_1 = require("./helpers/state");
14
- const validateWorkflowSchema = zod_1.z.object({}).strict().default({});
15
- exports.VALIDATE_WORKFLOW_TOOL = {
16
- toolName: 'validate_workflow',
17
- displayTitle: 'Validating workflow',
18
- };
19
- function collectValidationResultForTelemetry(results) {
20
- const status = Object.fromEntries(types_1.PROGRAMMATIC_VIOLATION_NAMES.map((name) => [name, 'pass']));
21
- Object.values(results).forEach((violations) => {
22
- violations?.forEach((violation) => {
23
- status[violation.name] = 'fail';
24
- });
25
- });
26
- return status;
27
- }
28
- function createValidateWorkflowTool(parsedNodeTypes, logger) {
29
- const dynamicTool = (0, tools_1.tool)(async (input, config) => {
30
- const reporter = (0, progress_1.createProgressReporter)(config, exports.VALIDATE_WORKFLOW_TOOL.toolName, exports.VALIDATE_WORKFLOW_TOOL.displayTitle);
31
- try {
32
- const validatedInput = validateWorkflowSchema.parse(input ?? {});
33
- reporter.start(validatedInput);
34
- const state = (0, state_1.getWorkflowState)();
35
- (0, progress_1.reportProgress)(reporter, 'Running programmatic checks');
36
- const violations = (0, programmatic_1.programmaticValidation)({
37
- generatedWorkflow: state.workflowJSON,
38
- }, parsedNodeTypes);
39
- const validationResultForTelemetry = collectValidationResultForTelemetry(violations);
40
- const message = (0, workflow_validation_1.formatWorkflowValidation)(violations);
41
- reporter.complete({ message });
42
- return (0, response_1.createSuccessResponse)(config, message, {
43
- workflowValidation: violations,
44
- validationHistory: [validationResultForTelemetry],
45
- });
46
- }
47
- catch (error) {
48
- if (error instanceof zod_1.z.ZodError) {
49
- const validationError = new errors_1.ValidationError('Invalid input parameters', {
50
- extra: { errors: error.errors },
51
- });
52
- reporter.error(validationError);
53
- return (0, response_1.createErrorResponse)(config, validationError);
54
- }
55
- const toolError = new errors_1.ToolExecutionError(error instanceof Error ? error.message : 'Failed to validate workflow', {
56
- toolName: exports.VALIDATE_WORKFLOW_TOOL.toolName,
57
- cause: error instanceof Error ? error : undefined,
58
- });
59
- logger?.warn('validate_workflow tool failed', { error: toolError });
60
- reporter.error(toolError);
61
- return (0, response_1.createErrorResponse)(config, toolError);
62
- }
63
- }, {
64
- name: exports.VALIDATE_WORKFLOW_TOOL.toolName,
65
- description: 'Run validation checks against the current workflow. Call this after making changes to ensure the workflow is valid.',
66
- schema: validateWorkflowSchema,
67
- });
68
- return {
69
- tool: dynamicTool,
70
- ...exports.VALIDATE_WORKFLOW_TOOL,
71
- };
72
- }
73
- //# sourceMappingURL=validate-workflow.tool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate-workflow.tool.js","sourceRoot":"","sources":["../../src/tools/validate-workflow.tool.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import type { ProgrammaticChecksResult } from '../validation/types';
2
- export declare function formatWorkflowValidation(validation: ProgrammaticChecksResult | null): string;
@@ -1,37 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.formatWorkflowValidation = formatWorkflowValidation;
4
- function formatViolationsByCategory(categories) {
5
- const lines = [];
6
- for (const [name, violations] of categories) {
7
- if (!violations.length)
8
- continue;
9
- lines.push(`${name}:`);
10
- for (const violation of violations) {
11
- lines.push(`- (${violation.type}) ${violation.description}`);
12
- }
13
- }
14
- return lines;
15
- }
16
- function formatWorkflowValidation(validation) {
17
- if (!validation) {
18
- return 'Workflow validation not yet run. Call the validate_workflow tool to analyze the current workflow.';
19
- }
20
- const lines = ['Workflow Validation Summary:'];
21
- const violationLines = formatViolationsByCategory([
22
- ['Connections', validation.connections],
23
- ['Trigger', validation.trigger],
24
- ['Nodes', validation.nodes],
25
- ['Agent Prompt', validation.agentPrompt],
26
- ['Tools', validation.tools],
27
- ['From AI', validation.fromAi],
28
- ]);
29
- if (violationLines.length === 0) {
30
- lines.push('No validation violations detected.');
31
- }
32
- else {
33
- lines.push(...violationLines);
34
- }
35
- return lines.join('\n');
36
- }
37
- //# sourceMappingURL=workflow-validation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workflow-validation.js","sourceRoot":"","sources":["../../src/utils/workflow-validation.ts"],"names":[],"mappings":";;AAmBA,4DAuBC;AAxCD,SAAS,0BAA0B,CAClC,UAAoD;IAEpD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,UAAU,EAAE,CAAC;QAC7C,IAAI,CAAC,UAAU,CAAC,MAAM;YAAE,SAAS;QAEjC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QACvB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9D,CAAC;IACF,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAgB,wBAAwB,CAAC,UAA2C;IACnF,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,OAAO,mGAAmG,CAAC;IAC5G,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,8BAA8B,CAAC,CAAC;IAEzD,MAAM,cAAc,GAAG,0BAA0B,CAAC;QACjD,CAAC,aAAa,EAAE,UAAU,CAAC,WAAW,CAAC;QACvC,CAAC,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC;QAC/B,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC;QAC3B,CAAC,cAAc,EAAE,UAAU,CAAC,WAAW,CAAC;QACxC,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC;QAC3B,CAAC,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC;KAC9B,CAAC,CAAC;IAEH,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACP,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}