@n8n/instance-ai 1.12.2 → 1.13.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.
- package/dist/agent/apply-agent-thinking.d.ts +2 -0
- package/dist/agent/apply-agent-thinking.js +41 -0
- package/dist/agent/apply-agent-thinking.js.map +1 -0
- package/dist/agent/instance-agent.js +10 -2
- package/dist/agent/instance-agent.js.map +1 -1
- package/dist/agent/sanitize-mcp-schemas.js +133 -125
- package/dist/agent/sanitize-mcp-schemas.js.map +1 -1
- package/dist/agent/shared-prompts.d.ts +0 -1
- package/dist/agent/shared-prompts.js +4 -11
- package/dist/agent/shared-prompts.js.map +1 -1
- package/dist/agent/sub-agent-debriefing.d.ts +4 -4
- package/dist/agent/system-prompt.js +3 -10
- package/dist/agent/system-prompt.js.map +1 -1
- package/dist/build.tsbuildinfo +1 -1
- package/dist/debug/run-debug-buffer.d.ts +63 -0
- package/dist/debug/run-debug-buffer.js +177 -0
- package/dist/debug/run-debug-buffer.js.map +1 -0
- package/dist/debug/sanitize-debug-snapshot.d.ts +2 -0
- package/dist/debug/sanitize-debug-snapshot.js +88 -0
- package/dist/debug/sanitize-debug-snapshot.js.map +1 -0
- package/dist/error-formatting.js +3 -5
- package/dist/error-formatting.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.js +8 -3
- package/dist/index.js.map +1 -1
- package/dist/knowledge-base/build-templates-index.d.ts +1 -0
- package/dist/knowledge-base/build-templates-index.js +18 -2
- package/dist/knowledge-base/build-templates-index.js.map +1 -1
- package/dist/knowledge-base/materialize-knowledge-base.d.ts +2 -3
- package/dist/knowledge-base/materialize-knowledge-base.js +10 -7
- package/dist/knowledge-base/materialize-knowledge-base.js.map +1 -1
- package/dist/mcp/mcp-client-manager.d.ts +1 -1
- package/dist/mcp/mcp-client-manager.js +13 -9
- package/dist/mcp/mcp-client-manager.js.map +1 -1
- package/dist/runtime/memory-task-registry.d.ts +8 -0
- package/dist/runtime/memory-task-registry.js +42 -0
- package/dist/runtime/memory-task-registry.js.map +1 -0
- package/dist/runtime/resumable-stream-executor.d.ts +3 -0
- package/dist/runtime/resumable-stream-executor.js +171 -90
- package/dist/runtime/resumable-stream-executor.js.map +1 -1
- package/dist/runtime/run-state-registry.d.ts +2 -0
- package/dist/runtime/run-state-registry.js +3 -0
- package/dist/runtime/run-state-registry.js.map +1 -1
- package/dist/runtime/stream-runner.d.ts +3 -0
- package/dist/runtime/stream-runner.js +3 -0
- package/dist/runtime/stream-runner.js.map +1 -1
- package/dist/skills/materialize-runtime-skills.d.ts +3 -3
- package/dist/skills/materialize-runtime-skills.js +1 -1
- package/dist/skills/materialize-runtime-skills.js.map +1 -1
- package/dist/source-map-filter.js +0 -1
- package/dist/source-map-filter.js.map +1 -1
- package/dist/storage/terminal-outcome-storage.d.ts +2 -2
- package/dist/storage/workflow-loop-storage.d.ts +75 -4
- package/dist/stream/map-chunk.js +198 -237
- package/dist/stream/map-chunk.js.map +1 -1
- package/dist/stream/output-redaction.js +2 -2
- package/dist/stream/output-redaction.js.map +1 -1
- package/dist/stream/usage-accumulator.d.ts +90 -0
- package/dist/stream/usage-accumulator.js +89 -0
- package/dist/stream/usage-accumulator.js.map +1 -0
- package/dist/stream/work-summary-accumulator.d.ts +6 -6
- package/dist/tools/attachments/parse-file.tool.js +1 -1
- package/dist/tools/attachments/parse-file.tool.js.map +1 -1
- package/dist/tools/credentials.tool.js +4 -1
- package/dist/tools/credentials.tool.js.map +1 -1
- package/dist/tools/data-tables.tool.js +5 -2
- package/dist/tools/data-tables.tool.js.map +1 -1
- package/dist/tools/evals/column-ref-utils.d.ts +1 -2
- package/dist/tools/evals/column-ref-utils.js +19 -18
- package/dist/tools/evals/column-ref-utils.js.map +1 -1
- package/dist/tools/evals/describe-metric-for-workflow.service.js +7 -25
- package/dist/tools/evals/describe-metric-for-workflow.service.js.map +1 -1
- package/dist/tools/evals/detect-tool-refs.service.js +2 -1
- package/dist/tools/evals/detect-tool-refs.service.js.map +1 -1
- package/dist/tools/evals/eval-data-requirements.service.js +10 -9
- package/dist/tools/evals/eval-data-requirements.service.js.map +1 -1
- package/dist/tools/evals/evals.tool.js +2 -2
- package/dist/tools/evals/evals.tool.js.map +1 -1
- package/dist/tools/evals/extract-rows-from-history.service.js +8 -8
- package/dist/tools/evals/extract-rows-from-history.service.js.map +1 -1
- package/dist/tools/evals/generate-sample-rows.service.d.ts +2 -2
- package/dist/tools/evals/generate-sample-rows.service.js +30 -49
- package/dist/tools/evals/generate-sample-rows.service.js.map +1 -1
- package/dist/tools/evals/generate-tool-ref-pin-data.service.js +10 -23
- package/dist/tools/evals/generate-tool-ref-pin-data.service.js.map +1 -1
- package/dist/tools/evals/metric-catalog.js +3 -3
- package/dist/tools/evals/metric-catalog.js.map +1 -1
- package/dist/tools/executions.tool.js +10 -2
- package/dist/tools/executions.tool.js.map +1 -1
- package/dist/tools/filesystem/create-tools-from-mcp-server.d.ts +1 -1
- package/dist/tools/filesystem/create-tools-from-mcp-server.js +8 -10
- package/dist/tools/filesystem/create-tools-from-mcp-server.js.map +1 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/nodes/node-search-engine.js +21 -42
- package/dist/tools/nodes/node-search-engine.js.map +1 -1
- package/dist/tools/nodes/node-search-engine.types.d.ts +2 -0
- package/dist/tools/nodes/preferred-chat-model.d.ts +1 -0
- package/dist/tools/nodes/preferred-chat-model.js +19 -0
- package/dist/tools/nodes/preferred-chat-model.js.map +1 -0
- package/dist/tools/nodes/suggested-nodes-data.js +13 -3
- package/dist/tools/nodes/suggested-nodes-data.js.map +1 -1
- package/dist/tools/nodes.tool.js +32 -7
- package/dist/tools/nodes.tool.js.map +1 -1
- package/dist/tools/orchestration/complete-checkpoint.tool.js +3 -5
- package/dist/tools/orchestration/complete-checkpoint.tool.js.map +1 -1
- package/dist/tools/orchestration/eval-data-agent.tool.js +2 -1
- package/dist/tools/orchestration/eval-data-agent.tool.js.map +1 -1
- package/dist/tools/orchestration/eval-setup-agent.prompt.d.ts +1 -1
- package/dist/tools/orchestration/eval-setup-agent.prompt.js +3 -3
- package/dist/tools/orchestration/report-verification-verdict.tool.d.ts +2 -2
- package/dist/tools/orchestration/report-verification-verdict.tool.js +1 -1
- package/dist/tools/orchestration/report-verification-verdict.tool.js.map +1 -1
- package/dist/tools/orchestration/verify-built-workflow.tool.js +320 -307
- package/dist/tools/orchestration/verify-built-workflow.tool.js.map +1 -1
- package/dist/tools/research.tool.js +1 -1
- package/dist/tools/research.tool.js.map +1 -1
- package/dist/tools/shared/ask-user.tool.d.ts +4 -4
- package/dist/tools/shared/ask-user.tool.js +6 -1
- package/dist/tools/shared/ask-user.tool.js.map +1 -1
- package/dist/tools/tool-ids.d.ts +0 -1
- package/dist/tools/tool-ids.js +0 -1
- package/dist/tools/tool-ids.js.map +1 -1
- package/dist/tools/workflows/build-workflow.tool.d.ts +4 -22
- package/dist/tools/workflows/build-workflow.tool.js +373 -317
- package/dist/tools/workflows/build-workflow.tool.js.map +1 -1
- package/dist/tools/workflows/classify-node-destructiveness.service.d.ts +7 -0
- package/dist/tools/workflows/classify-node-destructiveness.service.js +307 -0
- package/dist/tools/workflows/classify-node-destructiveness.service.js.map +1 -0
- package/dist/tools/workflows/generate-simulation-fixtures.service.d.ts +8 -0
- package/dist/tools/workflows/generate-simulation-fixtures.service.js +95 -0
- package/dist/tools/workflows/generate-simulation-fixtures.service.js.map +1 -0
- package/dist/tools/workflows/plan-verification-simulation.d.ts +15 -0
- package/dist/tools/workflows/plan-verification-simulation.js +32 -0
- package/dist/tools/workflows/plan-verification-simulation.js.map +1 -0
- package/dist/tools/workflows/resolve-credentials.d.ts +0 -2
- package/dist/tools/workflows/resolve-credentials.js +0 -13
- package/dist/tools/workflows/resolve-credentials.js.map +1 -1
- package/dist/tools/workflows/setup-workflow.service.js +259 -215
- package/dist/tools/workflows/setup-workflow.service.js.map +1 -1
- package/dist/tools/workflows/validate-workflow.service.js +81 -66
- package/dist/tools/workflows/validate-workflow.service.js.map +1 -1
- package/dist/tools/workflows/workflow-build-context.d.ts +33 -0
- package/dist/tools/workflows/workflow-build-context.js +80 -0
- package/dist/tools/workflows/workflow-build-context.js.map +1 -0
- package/dist/tools/workflows/workflow-build-remediation.d.ts +11 -0
- package/dist/tools/workflows/workflow-build-remediation.js +89 -0
- package/dist/tools/workflows/workflow-build-remediation.js.map +1 -0
- package/dist/tools/workflows/workflow-build-reporting.d.ts +19 -0
- package/dist/tools/workflows/workflow-build-reporting.js +78 -0
- package/dist/tools/workflows/workflow-build-reporting.js.map +1 -0
- package/dist/tools/workflows/workflow-build-routing.d.ts +2 -0
- package/dist/tools/workflows/workflow-build-routing.js +83 -0
- package/dist/tools/workflows/workflow-build-routing.js.map +1 -0
- package/dist/tools/workflows/workflow-build-telemetry.d.ts +18 -0
- package/dist/tools/workflows/workflow-build-telemetry.js +33 -0
- package/dist/tools/workflows/workflow-build-telemetry.js.map +1 -0
- package/dist/tools/workflows/workflow-file-bindings.d.ts +28 -0
- package/dist/tools/workflows/workflow-file-bindings.js +104 -0
- package/dist/tools/workflows/workflow-file-bindings.js.map +1 -0
- package/dist/tools/workflows/workflow-json-utils.d.ts +3 -0
- package/dist/tools/workflows/workflow-json-utils.js +54 -5
- package/dist/tools/workflows/workflow-json-utils.js.map +1 -1
- package/dist/tools/workflows/workflow-source-compiler.d.ts +19 -0
- package/dist/tools/workflows/workflow-source-compiler.js +217 -0
- package/dist/tools/workflows/workflow-source-compiler.js.map +1 -0
- package/dist/tools/workflows/workflow-validation-warnings.d.ts +14 -0
- package/dist/tools/workflows/workflow-validation-warnings.js +28 -0
- package/dist/tools/workflows/workflow-validation-warnings.js.map +1 -0
- package/dist/tools/workflows.tool.js +107 -99
- package/dist/tools/workflows.tool.js.map +1 -1
- package/dist/tracing/langsmith-tracing.js +7 -7
- package/dist/tracing/langsmith-tracing.js.map +1 -1
- package/dist/tracing/trace-payloads.d.ts +2 -1
- package/dist/tracing/trace-payloads.js +152 -114
- package/dist/tracing/trace-payloads.js.map +1 -1
- package/dist/types.d.ts +24 -4
- package/dist/types.js.map +1 -1
- package/dist/utils/eval-agents.d.ts +0 -3
- package/dist/utils/eval-agents.js +3 -11
- package/dist/utils/eval-agents.js.map +1 -1
- package/dist/utils/generate-validated-json.d.ts +16 -0
- package/dist/utils/generate-validated-json.js +38 -0
- package/dist/utils/generate-validated-json.js.map +1 -0
- package/dist/utils/stream-helpers.d.ts +0 -1
- package/dist/utils/stream-helpers.js +5 -8
- package/dist/utils/stream-helpers.js.map +1 -1
- package/dist/workflow-builder/build-failure-tracker.js +25 -1
- package/dist/workflow-builder/build-failure-tracker.js.map +1 -1
- package/dist/workflow-builder/index.d.ts +0 -4
- package/dist/workflow-builder/index.js +1 -11
- package/dist/workflow-builder/index.js.map +1 -1
- package/dist/workflow-loop/guidance.js +14 -15
- package/dist/workflow-loop/guidance.js.map +1 -1
- package/dist/workflow-loop/runtime.js +1 -0
- package/dist/workflow-loop/runtime.js.map +1 -1
- package/dist/workflow-loop/verification-obligation.js +8 -1
- package/dist/workflow-loop/verification-obligation.js.map +1 -1
- package/dist/workflow-loop/workflow-loop-controller.js +17 -1
- package/dist/workflow-loop/workflow-loop-controller.js.map +1 -1
- package/dist/workflow-loop/workflow-loop-state.d.ts +90 -6
- package/dist/workflow-loop/workflow-loop-state.js +13 -1
- package/dist/workflow-loop/workflow-loop-state.js.map +1 -1
- package/dist/workspace/builder-templates-service.d.ts +5 -5
- package/dist/workspace/builder-templates-service.js +17 -14
- package/dist/workspace/builder-templates-service.js.map +1 -1
- package/dist/workspace/create-workspace.js +8 -1
- package/dist/workspace/create-workspace.js.map +1 -1
- package/dist/workspace/prebaked-workspace-bundle.d.ts +2 -2
- package/dist/workspace/prebaked-workspace-bundle.js +5 -5
- package/dist/workspace/prebaked-workspace-bundle.js.map +1 -1
- package/dist/workspace/sandbox-setup.d.ts +1 -1
- package/dist/workspace/sandbox-setup.js +10 -37
- package/dist/workspace/sandbox-setup.js.map +1 -1
- package/dist/workspace/snapshot-manager.d.ts +1 -1
- package/dist/workspace/template-telemetry.js +2 -5
- package/dist/workspace/template-telemetry.js.map +1 -1
- package/dist/workspace/workspace-files.d.ts +1 -1
- package/dist/workspace/workspace-files.js +3 -3
- package/dist/workspace/workspace-files.js.map +1 -1
- package/dist/workspace/workspace-manifest.js +2 -2
- package/dist/workspace/workspace-manifest.js.map +1 -1
- package/dist/workspace/workspace-paths.d.ts +4 -0
- package/dist/workspace/workspace-paths.js +25 -0
- package/dist/workspace/workspace-paths.js.map +1 -0
- package/knowledge-base/reference/open-ai-output-shape.md +79 -0
- package/knowledge-base/reference/workflow-builder-guardrails.md +15 -0
- package/package.json +13 -12
- package/skills/planned-task-runtime/SKILL.md +3 -2
- package/skills/planning/SKILL.md +5 -0
- package/skills/post-build-flow/SKILL.md +25 -9
- package/skills/workflow-builder/SKILL.md +89 -134
- package/dist/tools/workflows/submit-workflow-identity.d.ts +0 -39
- package/dist/tools/workflows/submit-workflow-identity.js +0 -181
- package/dist/tools/workflows/submit-workflow-identity.js.map +0 -1
- package/dist/tools/workflows/submit-workflow.tool.d.ts +0 -223
- package/dist/tools/workflows/submit-workflow.tool.js +0 -491
- package/dist/tools/workflows/submit-workflow.tool.js.map +0 -1
- package/dist/workflow-builder/extract-code.d.ts +0 -5
- package/dist/workflow-builder/extract-code.js +0 -105
- package/dist/workflow-builder/extract-code.js.map +0 -1
- package/dist/workflow-builder/parse-validate.d.ts +0 -10
- package/dist/workflow-builder/parse-validate.js +0 -50
- package/dist/workflow-builder/parse-validate.js.map +0 -1
- package/dist/workflow-builder/patch-code.d.ts +0 -14
- package/dist/workflow-builder/patch-code.js +0 -117
- package/dist/workflow-builder/patch-code.js.map +0 -1
- package/dist/workflow-builder/types.d.ts +0 -11
- package/dist/workflow-builder/types.js +0 -3
- package/dist/workflow-builder/types.js.map +0 -1
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isWorkflowJsonSourceFile = isWorkflowJsonSourceFile;
|
|
4
|
+
exports.compileWorkflowSource = compileWorkflowSource;
|
|
5
|
+
const sandbox_1 = require("@n8n/agents/sandbox");
|
|
6
|
+
const utils_1 = require("@n8n/utils");
|
|
7
|
+
const workflow_sdk_1 = require("@n8n/workflow-sdk");
|
|
8
|
+
const workflow_validation_warnings_1 = require("./workflow-validation-warnings");
|
|
9
|
+
const sandbox_fs_1 = require("../../workspace/sandbox-fs");
|
|
10
|
+
const workspace_paths_1 = require("../../workspace/workspace-paths");
|
|
11
|
+
function isWorkflowJson(value) {
|
|
12
|
+
return ((0, utils_1.isRecord)(value) &&
|
|
13
|
+
typeof value.name === 'string' &&
|
|
14
|
+
Array.isArray(value.nodes) &&
|
|
15
|
+
(0, utils_1.isRecord)(value.connections));
|
|
16
|
+
}
|
|
17
|
+
function isTypeScriptWorkflowSource(filePath) {
|
|
18
|
+
const normalized = filePath.toLowerCase();
|
|
19
|
+
return normalized.endsWith('.ts') || normalized.endsWith('.tsx');
|
|
20
|
+
}
|
|
21
|
+
function isWorkflowJsonSourceFile(filePath) {
|
|
22
|
+
return filePath.toLowerCase().endsWith('.json');
|
|
23
|
+
}
|
|
24
|
+
function normalizeWorkflowNodeParameters(json) {
|
|
25
|
+
for (const node of json.nodes ?? []) {
|
|
26
|
+
if (!(0, utils_1.isRecord)(node.parameters)) {
|
|
27
|
+
node.parameters = {};
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function validateCompiledWorkflow(json, context, compilerWarnings = []) {
|
|
32
|
+
normalizeWorkflowNodeParameters(json);
|
|
33
|
+
const schemaValidation = (0, workflow_sdk_1.validateWorkflow)(json, {
|
|
34
|
+
nodeTypesProvider: context.nodeTypesProvider,
|
|
35
|
+
strictMode: true,
|
|
36
|
+
});
|
|
37
|
+
const warnings = [...compilerWarnings];
|
|
38
|
+
(0, workflow_validation_warnings_1.collectValidationIssues)(schemaValidation.errors, warnings);
|
|
39
|
+
(0, workflow_validation_warnings_1.collectValidationIssues)(schemaValidation.warnings, warnings);
|
|
40
|
+
return warnings;
|
|
41
|
+
}
|
|
42
|
+
function parseWorkflowJsonSource(source) {
|
|
43
|
+
let parsed;
|
|
44
|
+
try {
|
|
45
|
+
parsed = JSON.parse(source);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return {
|
|
49
|
+
success: false,
|
|
50
|
+
reason: 'workflow_json_parse_failed',
|
|
51
|
+
editable: true,
|
|
52
|
+
errors: [
|
|
53
|
+
`Failed to parse workflow JSON: ${error instanceof Error ? error.message : 'Invalid JSON'}`,
|
|
54
|
+
],
|
|
55
|
+
summary: 'Workflow JSON source did not parse.',
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
if (!isWorkflowJson(parsed)) {
|
|
59
|
+
return {
|
|
60
|
+
success: false,
|
|
61
|
+
reason: 'workflow_json_invalid',
|
|
62
|
+
editable: true,
|
|
63
|
+
errors: ['Workflow JSON must include name, nodes, and connections.'],
|
|
64
|
+
summary: 'Workflow JSON source is missing required workflow fields.',
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
return { success: true, workflow: parsed, warnings: [], compiler: 'workflow-json' };
|
|
68
|
+
}
|
|
69
|
+
function parseSandboxWarnings(value) {
|
|
70
|
+
if (!Array.isArray(value))
|
|
71
|
+
return [];
|
|
72
|
+
const warnings = [];
|
|
73
|
+
for (const warning of value) {
|
|
74
|
+
if (!(0, utils_1.isRecord)(warning))
|
|
75
|
+
continue;
|
|
76
|
+
if (typeof warning.code !== 'string' || typeof warning.message !== 'string')
|
|
77
|
+
continue;
|
|
78
|
+
warnings.push({
|
|
79
|
+
code: warning.code,
|
|
80
|
+
message: warning.message,
|
|
81
|
+
nodeName: typeof warning.nodeName === 'string' ? warning.nodeName : undefined,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return warnings;
|
|
85
|
+
}
|
|
86
|
+
function parseSandboxErrors(value) {
|
|
87
|
+
if (!Array.isArray(value))
|
|
88
|
+
return [];
|
|
89
|
+
return value.filter((error) => typeof error === 'string');
|
|
90
|
+
}
|
|
91
|
+
function parseSandboxBuildOutput(stdout) {
|
|
92
|
+
const lastJsonLine = stdout
|
|
93
|
+
.trim()
|
|
94
|
+
.split('\n')
|
|
95
|
+
.map((line) => line.trim())
|
|
96
|
+
.filter(Boolean)
|
|
97
|
+
.pop();
|
|
98
|
+
if (!lastJsonLine)
|
|
99
|
+
return undefined;
|
|
100
|
+
let parsed;
|
|
101
|
+
try {
|
|
102
|
+
parsed = JSON.parse(lastJsonLine);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
if (!(0, utils_1.isRecord)(parsed) || typeof parsed.success !== 'boolean')
|
|
108
|
+
return undefined;
|
|
109
|
+
return {
|
|
110
|
+
success: parsed.success,
|
|
111
|
+
workflow: isWorkflowJson(parsed.workflow) ? parsed.workflow : undefined,
|
|
112
|
+
warnings: parseSandboxWarnings(parsed.warnings),
|
|
113
|
+
errors: parseSandboxErrors(parsed.errors),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function enhanceBuildErrors(errors) {
|
|
117
|
+
const needsTemplateGuidance = errors.some((error) => {
|
|
118
|
+
const normalized = error.toLowerCase();
|
|
119
|
+
return (normalized.includes('unterminated template') ||
|
|
120
|
+
normalized.includes('unexpected end of input') ||
|
|
121
|
+
normalized.includes('unexpected identifier') ||
|
|
122
|
+
normalized.includes('unexpected token') ||
|
|
123
|
+
normalized.includes('expected unicode escape') ||
|
|
124
|
+
normalized.includes('missing ) after argument list'));
|
|
125
|
+
});
|
|
126
|
+
if (!needsTemplateGuidance)
|
|
127
|
+
return errors;
|
|
128
|
+
return [
|
|
129
|
+
...errors,
|
|
130
|
+
'Code node guidance: for large HTML, write it to a separate file (e.g., chunks/page.html), then in your SDK TypeScript use readFileSync + JSON.stringify to safely embed it. NEVER embed large HTML directly in jsCode. See the web_app_pattern in your instructions.',
|
|
131
|
+
];
|
|
132
|
+
}
|
|
133
|
+
async function compileTypeScriptWorkflowSource(context, filePath) {
|
|
134
|
+
if (!context.workspace) {
|
|
135
|
+
return {
|
|
136
|
+
success: false,
|
|
137
|
+
reason: 'workflow_source_sandbox_unavailable',
|
|
138
|
+
editable: false,
|
|
139
|
+
errors: [
|
|
140
|
+
'Runtime workspace with sandbox support is required for TypeScript workflow builds.',
|
|
141
|
+
],
|
|
142
|
+
summary: 'Workflow source could not be built because the sandbox is unavailable.',
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
let root;
|
|
146
|
+
let buildResult;
|
|
147
|
+
try {
|
|
148
|
+
root = await (0, sandbox_1.getWorkspaceRoot)(context.workspace);
|
|
149
|
+
const sandboxFilePath = (0, workspace_paths_1.joinWorkspacePath)(root, filePath);
|
|
150
|
+
buildResult = await (0, sandbox_fs_1.runInSandbox)(context.workspace, `node --import tsx build.mjs '${(0, sandbox_fs_1.escapeSingleQuotes)(sandboxFilePath)}'`, root);
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
return {
|
|
154
|
+
success: false,
|
|
155
|
+
reason: 'workflow_source_sandbox_unavailable',
|
|
156
|
+
editable: false,
|
|
157
|
+
errors: [error instanceof Error ? error.message : String(error)],
|
|
158
|
+
summary: 'Workflow source could not be built because the sandbox is unavailable.',
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
const buildOutput = parseSandboxBuildOutput(buildResult.stdout);
|
|
162
|
+
if (!buildOutput) {
|
|
163
|
+
const detail = buildResult.stderr.trim() || buildResult.stdout.trim() || 'No output';
|
|
164
|
+
return {
|
|
165
|
+
success: false,
|
|
166
|
+
reason: 'workflow_source_sandbox_failed',
|
|
167
|
+
editable: true,
|
|
168
|
+
errors: [
|
|
169
|
+
`Failed to execute workflow file in sandbox (exit code ${buildResult.exitCode}).`,
|
|
170
|
+
detail,
|
|
171
|
+
],
|
|
172
|
+
summary: 'Workflow source did not produce parseable sandbox output.',
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
if (!buildOutput.success || !buildOutput.workflow) {
|
|
176
|
+
return {
|
|
177
|
+
success: false,
|
|
178
|
+
reason: 'workflow_source_build_failed',
|
|
179
|
+
editable: true,
|
|
180
|
+
errors: enhanceBuildErrors(buildOutput.errors ?? ['Unknown workflow build error']),
|
|
181
|
+
summary: 'Workflow source failed during sandbox execution.',
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
return {
|
|
185
|
+
success: true,
|
|
186
|
+
workflow: buildOutput.workflow,
|
|
187
|
+
warnings: buildOutput.warnings ?? [],
|
|
188
|
+
compiler: 'sandbox-tsx',
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
async function compileWorkflowSource(context, filePath, source) {
|
|
192
|
+
let result;
|
|
193
|
+
if (isWorkflowJsonSourceFile(filePath)) {
|
|
194
|
+
result = parseWorkflowJsonSource(source);
|
|
195
|
+
}
|
|
196
|
+
else if (isTypeScriptWorkflowSource(filePath)) {
|
|
197
|
+
result = await compileTypeScriptWorkflowSource(context, filePath);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
result = {
|
|
201
|
+
success: false,
|
|
202
|
+
reason: 'workflow_source_unsupported_extension',
|
|
203
|
+
editable: true,
|
|
204
|
+
errors: [
|
|
205
|
+
'Workflow source file must be a TypeScript SDK file (.ts or .tsx) or WorkflowJSON file (.json).',
|
|
206
|
+
],
|
|
207
|
+
summary: 'Workflow source file extension is unsupported.',
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
if (!result.success)
|
|
211
|
+
return result;
|
|
212
|
+
return {
|
|
213
|
+
...result,
|
|
214
|
+
warnings: validateCompiledWorkflow(result.workflow, context, result.warnings),
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=workflow-source-compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-source-compiler.js","sourceRoot":"","sources":["../../../src/tools/workflows/workflow-source-compiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface ValidationWarning {
|
|
2
|
+
code: string;
|
|
3
|
+
message: string;
|
|
4
|
+
nodeName?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function collectValidationIssues(issues: Array<{
|
|
7
|
+
code: string;
|
|
8
|
+
message: string;
|
|
9
|
+
nodeName?: string;
|
|
10
|
+
}>, allWarnings: ValidationWarning[]): void;
|
|
11
|
+
export declare function partitionWarnings(warnings: ValidationWarning[]): {
|
|
12
|
+
errors: ValidationWarning[];
|
|
13
|
+
informational: ValidationWarning[];
|
|
14
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.collectValidationIssues = collectValidationIssues;
|
|
4
|
+
exports.partitionWarnings = partitionWarnings;
|
|
5
|
+
function collectValidationIssues(issues, allWarnings) {
|
|
6
|
+
for (const issue of issues) {
|
|
7
|
+
allWarnings.push({
|
|
8
|
+
code: issue.code,
|
|
9
|
+
message: issue.message,
|
|
10
|
+
nodeName: issue.nodeName,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function partitionWarnings(warnings) {
|
|
15
|
+
const informationalCodes = new Set(['MISSING_TRIGGER', 'DISCONNECTED_NODE']);
|
|
16
|
+
const errors = [];
|
|
17
|
+
const informational = [];
|
|
18
|
+
for (const warning of warnings) {
|
|
19
|
+
if (informationalCodes.has(warning.code)) {
|
|
20
|
+
informational.push(warning);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
errors.push(warning);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return { errors, informational };
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=workflow-validation-warnings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-validation-warnings.js","sourceRoot":"","sources":["../../../src/tools/workflows/workflow-validation-warnings.ts"],"names":[],"mappings":";;AAMA,0DAWC;AAED,8CAkBC;AA/BD,SAAgB,uBAAuB,CACtC,MAAmE,EACnE,WAAgC;IAEhC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,WAAW,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACxB,CAAC,CAAC;IACJ,CAAC;AACF,CAAC;AAED,SAAgB,iBAAiB,CAAC,QAA6B;IAI9D,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAE7E,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,MAAM,aAAa,GAAwB,EAAE,CAAC;IAE9C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAChC,IAAI,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;IACF,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.createWorkflowsTool = createWorkflowsTool;
|
|
37
37
|
const agents_1 = require("@n8n/agents");
|
|
38
|
+
const utils_1 = require("@n8n/utils");
|
|
38
39
|
const nanoid_1 = require("nanoid");
|
|
39
40
|
const zod_1 = require("zod");
|
|
40
41
|
const sanitize_mcp_schemas_1 = require("../agent/sanitize-mcp-schemas");
|
|
@@ -44,7 +45,9 @@ const setup_workflow_service_1 = require("./workflows/setup-workflow.service");
|
|
|
44
45
|
const validate_workflow_service_1 = require("./workflows/validate-workflow.service");
|
|
45
46
|
const workflow_json_utils_1 = require("./workflows/workflow-json-utils");
|
|
46
47
|
const listAction = zod_1.z.object({
|
|
47
|
-
action: zod_1.z
|
|
48
|
+
action: zod_1.z
|
|
49
|
+
.literal('list')
|
|
50
|
+
.describe('List workflows accessible to the current user. Use for workflow inspection.'),
|
|
48
51
|
query: zod_1.z.string().optional().describe('Filter workflows by name'),
|
|
49
52
|
limit: zod_1.z.number().int().positive().max(100).optional().describe('Max results to return'),
|
|
50
53
|
status: zod_1.z
|
|
@@ -57,17 +60,21 @@ const listAction = zod_1.z.object({
|
|
|
57
60
|
.describe("Which project(s) to search. Defaults to this conversation's project. Use 'instance' only when you have a clear reason to look across all projects you can access."),
|
|
58
61
|
});
|
|
59
62
|
const getAction = zod_1.z.object({
|
|
60
|
-
action: zod_1.z
|
|
63
|
+
action: zod_1.z
|
|
64
|
+
.literal('get')
|
|
65
|
+
.describe('Get full details of a specific workflow. Use for workflow inspection.'),
|
|
61
66
|
workflowId: zod_1.z.string().describe('ID of the workflow'),
|
|
62
67
|
});
|
|
63
68
|
const getJsonAction = zod_1.z.object({
|
|
64
69
|
action: zod_1.z
|
|
65
70
|
.literal('get-json')
|
|
66
|
-
.describe('Get full WorkflowJSON for
|
|
71
|
+
.describe('Get full WorkflowJSON for workspace-file workflow edits. Write it to a .workflow.json file, edit the file, then save with build-workflow.'),
|
|
67
72
|
workflowId: zod_1.z.string().describe('ID of the workflow'),
|
|
68
73
|
});
|
|
69
74
|
const getAsCodeAction = zod_1.z.object({
|
|
70
|
-
action: zod_1.z
|
|
75
|
+
action: zod_1.z
|
|
76
|
+
.literal('get-as-code')
|
|
77
|
+
.describe('Convert an existing workflow to TypeScript SDK code. Call before precise patches when you need the current code.'),
|
|
71
78
|
workflowId: zod_1.z.string().describe('ID of the workflow'),
|
|
72
79
|
});
|
|
73
80
|
const deleteAction = zod_1.z.object({
|
|
@@ -85,7 +92,7 @@ const unarchiveAction = zod_1.z.object({
|
|
|
85
92
|
const setupAction = zod_1.z.object({
|
|
86
93
|
action: zod_1.z
|
|
87
94
|
.literal('setup')
|
|
88
|
-
.describe('Open the inline AI Assistant workflow setup card for credential and parameter configuration'),
|
|
95
|
+
.describe('Open the inline AI Assistant workflow setup card for credential and parameter configuration. Use for setup routing after a build.'),
|
|
89
96
|
workflowId: zod_1.z.string().describe('ID of the workflow'),
|
|
90
97
|
projectId: zod_1.z.string().optional().describe('Project ID to scope credential creation to'),
|
|
91
98
|
});
|
|
@@ -102,7 +109,7 @@ const validateAction = zod_1.z.object({
|
|
|
102
109
|
const updateAction = zod_1.z.object({
|
|
103
110
|
action: zod_1.z
|
|
104
111
|
.literal('update')
|
|
105
|
-
.describe('Save a complete modified WorkflowJSON back to the workflow.
|
|
112
|
+
.describe('Internal/raw update escape hatch. Save a complete modified WorkflowJSON back to the workflow. Replaces the full workflow definition.'),
|
|
106
113
|
workflowId: zod_1.z.string().describe('ID of the workflow'),
|
|
107
114
|
workflow: zod_1.z
|
|
108
115
|
.record(zod_1.z.unknown())
|
|
@@ -198,14 +205,13 @@ function getSupportedWorkflowActionSchemas(context, surface = 'full') {
|
|
|
198
205
|
return {
|
|
199
206
|
list: listAction,
|
|
200
207
|
get: getAction,
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
: {}),
|
|
208
|
+
'get-json': getJsonAction,
|
|
209
|
+
'get-as-code': getAsCodeAction,
|
|
204
210
|
delete: deleteAction,
|
|
205
211
|
unarchive: unarchiveAction,
|
|
206
212
|
setup: setupAction,
|
|
207
213
|
validate: validateAction,
|
|
208
|
-
update: updateAction,
|
|
214
|
+
...(surface !== 'orchestrator' ? { update: updateAction } : {}),
|
|
209
215
|
publish: hasNamedVersions ? publishExtendedAction : publishBaseAction,
|
|
210
216
|
unpublish: unpublishAction,
|
|
211
217
|
...(hasVersions
|
|
@@ -341,86 +347,66 @@ async function handleUnarchive(context, input, ctx) {
|
|
|
341
347
|
await context.workflowService.unarchive(input.workflowId);
|
|
342
348
|
return { success: true };
|
|
343
349
|
}
|
|
344
|
-
async function
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
if (resumeData === undefined || resumeData === null) {
|
|
350
|
-
const setupRequests = await (0, setup_workflow_service_1.analyzeWorkflow)(context, input.workflowId);
|
|
351
|
-
if (setupRequests.length === 0) {
|
|
352
|
-
return { success: true, reason: 'No nodes require setup.' };
|
|
353
|
-
}
|
|
354
|
-
state.currentRequestId = (0, nanoid_1.nanoid)();
|
|
355
|
-
return await ctx.suspend({
|
|
356
|
-
requestId: state.currentRequestId,
|
|
357
|
-
message: 'Configure credentials for your workflow',
|
|
358
|
-
severity: 'info',
|
|
359
|
-
setupRequests,
|
|
360
|
-
workflowId: input.workflowId,
|
|
361
|
-
...(input.projectId ? { projectId: input.projectId } : {}),
|
|
350
|
+
async function runTriggerTest(context, workflowId, triggerNodeName) {
|
|
351
|
+
try {
|
|
352
|
+
const result = await context.executionService.run(workflowId, undefined, {
|
|
353
|
+
timeout: 30_000,
|
|
354
|
+
triggerNodeName,
|
|
362
355
|
});
|
|
356
|
+
if (result.status === 'success')
|
|
357
|
+
return { status: 'success' };
|
|
358
|
+
if (result.status === 'waiting')
|
|
359
|
+
return { status: 'listening' };
|
|
360
|
+
return { status: 'error', error: result.error ?? 'Trigger test failed' };
|
|
363
361
|
}
|
|
364
|
-
|
|
365
|
-
if (state.preTestSnapshot) {
|
|
366
|
-
await context.workflowService.updateFromWorkflowJSON(input.workflowId, state.preTestSnapshot);
|
|
367
|
-
state.preTestSnapshot = null;
|
|
368
|
-
}
|
|
362
|
+
catch (error) {
|
|
369
363
|
return {
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
reason: 'User skipped workflow setup for now.',
|
|
364
|
+
status: 'error',
|
|
365
|
+
error: error instanceof Error ? error.message : 'Trigger test failed',
|
|
373
366
|
};
|
|
374
367
|
}
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
if (
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
let triggerTestResult;
|
|
387
|
-
try {
|
|
388
|
-
const result = await context.executionService.run(input.workflowId, undefined, {
|
|
389
|
-
timeout: 30_000,
|
|
390
|
-
triggerNodeName: resumeData.testTriggerNode,
|
|
368
|
+
}
|
|
369
|
+
function collectCredentialTestFailures(remainingRequests, credentials) {
|
|
370
|
+
const failures = [];
|
|
371
|
+
for (const req of remainingRequests) {
|
|
372
|
+
if (req.credentialTestResult &&
|
|
373
|
+
!req.credentialTestResult.success &&
|
|
374
|
+
req.credentialType &&
|
|
375
|
+
credentials?.[req.node.name]?.[req.credentialType]) {
|
|
376
|
+
failures.push({
|
|
377
|
+
nodeName: req.node.name,
|
|
378
|
+
error: `Credential test failed for ${req.credentialType}: ${req.credentialTestResult.message ?? 'Invalid credentials'}`,
|
|
391
379
|
});
|
|
392
|
-
if (result.status === 'success') {
|
|
393
|
-
triggerTestResult = { status: 'success' };
|
|
394
|
-
}
|
|
395
|
-
else if (result.status === 'waiting') {
|
|
396
|
-
triggerTestResult = { status: 'listening' };
|
|
397
|
-
}
|
|
398
|
-
else {
|
|
399
|
-
triggerTestResult = {
|
|
400
|
-
status: 'error',
|
|
401
|
-
error: result.error ?? 'Trigger test failed',
|
|
402
|
-
};
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
catch (error) {
|
|
406
|
-
triggerTestResult = {
|
|
407
|
-
status: 'error',
|
|
408
|
-
error: error instanceof Error ? error.message : 'Trigger test failed',
|
|
409
|
-
};
|
|
410
380
|
}
|
|
411
|
-
const refreshedRequests = await (0, setup_workflow_service_1.analyzeWorkflow)(context, input.workflowId, {
|
|
412
|
-
[resumeData.testTriggerNode]: triggerTestResult,
|
|
413
|
-
});
|
|
414
|
-
state.currentRequestId = (0, nanoid_1.nanoid)();
|
|
415
|
-
return await ctx.suspend({
|
|
416
|
-
requestId: state.currentRequestId,
|
|
417
|
-
message: 'Configure credentials for your workflow',
|
|
418
|
-
severity: 'info',
|
|
419
|
-
setupRequests: refreshedRequests,
|
|
420
|
-
workflowId: input.workflowId,
|
|
421
|
-
...(input.projectId ? { projectId: input.projectId } : {}),
|
|
422
|
-
});
|
|
423
381
|
}
|
|
382
|
+
return failures;
|
|
383
|
+
}
|
|
384
|
+
async function handleSetupTestTrigger(context, input, ctx, state, resumeData, testTriggerNode) {
|
|
385
|
+
state.preTestSnapshot ??= await context.workflowService.getAsWorkflowJSON(input.workflowId);
|
|
386
|
+
const preTestApply = await (0, setup_workflow_service_1.applyNodeChanges)(context, input.workflowId, resumeData.credentials, resumeData.nodeParameters);
|
|
387
|
+
const applyFailures = preTestApply.failed;
|
|
388
|
+
if (applyFailures.length > 0) {
|
|
389
|
+
return {
|
|
390
|
+
success: false,
|
|
391
|
+
error: `Failed to apply setup before trigger test: ${applyFailures.map((f) => `${f.nodeName}: ${f.error}`).join('; ')}`,
|
|
392
|
+
failedNodes: applyFailures,
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
const triggerTestResult = await runTriggerTest(context, input.workflowId, testTriggerNode);
|
|
396
|
+
const refreshedRequests = await (0, setup_workflow_service_1.analyzeWorkflow)(context, input.workflowId, {
|
|
397
|
+
[testTriggerNode]: triggerTestResult,
|
|
398
|
+
});
|
|
399
|
+
state.currentRequestId = (0, nanoid_1.nanoid)();
|
|
400
|
+
return await ctx.suspend({
|
|
401
|
+
requestId: state.currentRequestId,
|
|
402
|
+
message: 'Configure credentials for your workflow',
|
|
403
|
+
severity: 'info',
|
|
404
|
+
setupRequests: refreshedRequests,
|
|
405
|
+
workflowId: input.workflowId,
|
|
406
|
+
...(input.projectId ? { projectId: input.projectId } : {}),
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
async function handleSetupApply(context, input, state, resumeData) {
|
|
424
410
|
try {
|
|
425
411
|
state.preTestSnapshot = null;
|
|
426
412
|
const applyResult = await (0, setup_workflow_service_1.applyNodeChanges)(context, input.workflowId, resumeData.credentials, resumeData.nodeParameters);
|
|
@@ -440,18 +426,7 @@ async function handleSetup(context, input, ctx, state) {
|
|
|
440
426
|
const remainingRequests = await (0, setup_workflow_service_1.analyzeWorkflow)(context, input.workflowId);
|
|
441
427
|
const pendingRequests = remainingRequests.filter((r) => r.needsAction);
|
|
442
428
|
const completedNodes = (0, setup_workflow_service_1.buildCompletedReport)(resumeData.credentials, resumeData.nodeParameters);
|
|
443
|
-
const credTestFailures =
|
|
444
|
-
for (const req of remainingRequests) {
|
|
445
|
-
if (req.credentialTestResult &&
|
|
446
|
-
!req.credentialTestResult.success &&
|
|
447
|
-
req.credentialType &&
|
|
448
|
-
resumeData.credentials?.[req.node.name]?.[req.credentialType]) {
|
|
449
|
-
credTestFailures.push({
|
|
450
|
-
nodeName: req.node.name,
|
|
451
|
-
error: `Credential test failed for ${req.credentialType}: ${req.credentialTestResult.message ?? 'Invalid credentials'}`,
|
|
452
|
-
});
|
|
453
|
-
}
|
|
454
|
-
}
|
|
429
|
+
const credTestFailures = collectCredentialTestFailures(remainingRequests, resumeData.credentials);
|
|
455
430
|
const credFailedNodeNames = new Set(credTestFailures.map((f) => f.nodeName));
|
|
456
431
|
const validCompletedNodes = completedNodes.filter((n) => !credFailedNodeNames.has(n.nodeName));
|
|
457
432
|
const allFailedNodes = [...(failedNodes ?? []), ...credTestFailures];
|
|
@@ -487,6 +462,42 @@ async function handleSetup(context, input, ctx, state) {
|
|
|
487
462
|
};
|
|
488
463
|
}
|
|
489
464
|
}
|
|
465
|
+
async function handleSetup(context, input, ctx, state) {
|
|
466
|
+
if (context.permissions?.updateWorkflow === 'blocked') {
|
|
467
|
+
return { success: false, denied: true, reason: 'Action blocked by admin' };
|
|
468
|
+
}
|
|
469
|
+
const resumeData = ctx.resumeData;
|
|
470
|
+
if (resumeData === undefined || resumeData === null) {
|
|
471
|
+
const setupRequests = await (0, setup_workflow_service_1.analyzeWorkflow)(context, input.workflowId);
|
|
472
|
+
if (setupRequests.length === 0) {
|
|
473
|
+
return { success: true, reason: 'No nodes require setup.' };
|
|
474
|
+
}
|
|
475
|
+
state.currentRequestId = (0, nanoid_1.nanoid)();
|
|
476
|
+
return await ctx.suspend({
|
|
477
|
+
requestId: state.currentRequestId,
|
|
478
|
+
message: 'Configure credentials for your workflow',
|
|
479
|
+
severity: 'info',
|
|
480
|
+
setupRequests,
|
|
481
|
+
workflowId: input.workflowId,
|
|
482
|
+
...(input.projectId ? { projectId: input.projectId } : {}),
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
if (!resumeData.approved) {
|
|
486
|
+
if (state.preTestSnapshot) {
|
|
487
|
+
await context.workflowService.updateFromWorkflowJSON(input.workflowId, state.preTestSnapshot);
|
|
488
|
+
state.preTestSnapshot = null;
|
|
489
|
+
}
|
|
490
|
+
return {
|
|
491
|
+
success: true,
|
|
492
|
+
deferred: true,
|
|
493
|
+
reason: 'User skipped workflow setup for now.',
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
if (resumeData.action === 'test-trigger' && resumeData.testTriggerNode) {
|
|
497
|
+
return await handleSetupTestTrigger(context, input, ctx, state, resumeData, resumeData.testTriggerNode);
|
|
498
|
+
}
|
|
499
|
+
return await handleSetupApply(context, input, state, resumeData);
|
|
500
|
+
}
|
|
490
501
|
async function handleValidate(context, input) {
|
|
491
502
|
try {
|
|
492
503
|
return await (0, validate_workflow_service_1.validateWorkflowConfig)(context, {
|
|
@@ -504,14 +515,11 @@ async function handleValidate(context, input) {
|
|
|
504
515
|
};
|
|
505
516
|
}
|
|
506
517
|
}
|
|
507
|
-
function isRecord(value) {
|
|
508
|
-
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
509
|
-
}
|
|
510
518
|
function isWorkflowJson(value) {
|
|
511
|
-
return (isRecord(value) &&
|
|
519
|
+
return ((0, utils_1.isRecord)(value) &&
|
|
512
520
|
typeof value.name === 'string' &&
|
|
513
521
|
Array.isArray(value.nodes) &&
|
|
514
|
-
isRecord(value.connections));
|
|
522
|
+
(0, utils_1.isRecord)(value.connections));
|
|
515
523
|
}
|
|
516
524
|
async function handleUpdate(context, input, ctx) {
|
|
517
525
|
const resumeData = ctx.resumeData;
|