@openapi-flow/n8n 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -1
- package/dist/nodes/inputs/compile-template-input-validators.d.ts +3 -0
- package/dist/nodes/inputs/compile-template-input-validators.js +26 -0
- package/dist/nodes/inputs/create-template-input-nodes.d.ts +4 -0
- package/dist/nodes/inputs/create-template-input-nodes.js +61 -0
- package/dist/nodes/native/arrays/create-bound-native-array-capability.d.ts +4 -0
- package/dist/nodes/native/arrays/create-bound-native-array-capability.js +81 -0
- package/dist/nodes/native/arrays/create-native-array-capability.d.ts +1 -0
- package/dist/nodes/native/arrays/create-native-array-capability.js +7 -59
- package/dist/nodes/native/arrays/native-array-definition.d.ts +2 -0
- package/dist/nodes/native/arrays/native-array-definition.js +27 -0
- package/dist/nodes/native/common/create-material-planning-capability.d.ts +4 -0
- package/dist/nodes/native/common/create-material-planning-capability.js +14 -0
- package/dist/nodes/native/common/define-material-bound-capability.d.ts +4 -0
- package/dist/nodes/native/common/define-material-bound-capability.js +33 -0
- package/dist/nodes/native/common/resolve-native-runtime-source.d.ts +3 -0
- package/dist/nodes/native/common/resolve-native-runtime-source.js +15 -0
- package/dist/nodes/native/common/response-reference-bindings.d.ts +4 -0
- package/dist/nodes/native/common/response-reference-bindings.js +15 -0
- package/dist/nodes/native/create-exclusive-branch-merge-capability.js +10 -0
- package/dist/nodes/native/create-json-output-capability.js +14 -4
- package/dist/nodes/native/create-native-capabilities.js +13 -12
- package/dist/nodes/native/create-pass-through-capability.js +2 -0
- package/dist/nodes/native/create-response-array-capability.js +13 -8
- package/dist/nodes/native/create-response-collection-capability.js +10 -8
- package/dist/nodes/native/if-capability.js +6 -2
- package/dist/nodes/native/inputs/native-input-runtime.bundle.js +24 -0
- package/dist/nodes/native/inputs/prepend-native-parameter-guard.d.ts +4 -0
- package/dist/nodes/native/inputs/prepend-native-parameter-guard.js +52 -0
- package/dist/nodes/native/item-join/create-bound-item-join-capability.d.ts +3 -0
- package/dist/nodes/native/item-join/create-bound-item-join-capability.js +169 -0
- package/dist/nodes/native/item-join/create-item-join-capability.d.ts +2 -1
- package/dist/nodes/native/item-join/create-item-join-capability.js +8 -151
- package/dist/nodes/native/item-join/item-join-definition.d.ts +2 -0
- package/dist/nodes/native/item-join/item-join-definition.js +33 -0
- package/dist/nodes/native/merge-append-capability.js +2 -0
- package/dist/nodes/native/registry/native-feature-definitions.d.ts +4 -0
- package/dist/nodes/native/registry/native-feature-definitions.js +93 -0
- package/dist/nodes/native/registry/native-feature-material-requirements.d.ts +3 -0
- package/dist/nodes/native/registry/native-feature-material-requirements.js +10 -0
- package/dist/nodes/native/registry/resolve-n8n-native-features.d.ts +3 -0
- package/dist/nodes/native/registry/resolve-n8n-native-features.js +6 -0
- package/dist/nodes/native/registry/resolve-n8n-native-planning-features.d.ts +3 -0
- package/dist/nodes/native/registry/resolve-n8n-native-planning-features.js +5 -0
- package/dist/nodes/native/registry/resolve-native-feature-registry.d.ts +3 -0
- package/dist/nodes/native/registry/resolve-native-feature-registry.js +99 -0
- package/dist/nodes/native/registry/validate-native-feature-context.d.ts +2 -0
- package/dist/nodes/native/registry/validate-native-feature-context.js +46 -0
- package/dist/nodes/native/response-array-definition.d.ts +2 -0
- package/dist/nodes/native/response-array-definition.js +27 -0
- package/dist/nodes/native/response-assertion-capability.js +5 -1
- package/dist/nodes/native/response-check-code.d.ts +1 -1
- package/dist/nodes/native/response-check-code.js +13 -7
- package/dist/nodes/native/response-checks/create-response-check-reader.d.ts +1 -1
- package/dist/nodes/native/response-checks/create-response-check-reader.js +2 -2
- package/dist/nodes/native/response-collection-definition.d.ts +2 -0
- package/dist/nodes/native/response-collection-definition.js +27 -0
- package/dist/nodes/native/stop-and-error-capability.js +28 -14
- package/dist/nodes/request/bindings/compile-request-validator.d.ts +1 -1
- package/dist/nodes/request/bindings/compile-request-validator.js +2 -2
- package/dist/nodes/request/bindings/create-bound-request-fragment.js +8 -3
- package/dist/nodes/request/bindings/create-output-item-reader-code.d.ts +2 -0
- package/dist/nodes/request/bindings/create-output-item-reader-code.js +7 -0
- package/dist/nodes/request/bindings/create-output-reader-code.d.ts +1 -1
- package/dist/nodes/request/bindings/create-output-reader-code.js +4 -4
- package/dist/nodes/request/create-http-request-node.js +23 -44
- package/dist/nodes/request/finalize-http-request-fragment.d.ts +3 -0
- package/dist/nodes/request/finalize-http-request-fragment.js +22 -0
- package/dist/nodes/request/resolve-http-request-node-configuration.d.ts +4 -0
- package/dist/nodes/request/resolve-http-request-node-configuration.js +41 -0
- package/dist/nodes/request/response/create-http-response-decoder.js +2 -1
- package/dist/nodes/request/response/http-response-node-name.d.ts +2 -0
- package/dist/nodes/request/response/http-response-node-name.js +4 -0
- package/dist/nodes/request/response/response-runtime.bundle.js +1 -1
- package/dist/nodes/request/runtime/materialize-http-request.d.ts +2 -1
- package/dist/nodes/request/runtime/materialize-http-request.js +21 -3
- package/dist/nodes/request/runtime/request-runtime.bundle.js +1 -1
- package/dist/public-api.d.ts +13 -0
- package/dist/public-api.js +9 -0
- package/dist/schemas/native-feature-registry-schema.d.ts +17 -0
- package/dist/schemas/native-feature-registry-schema.js +8 -0
- package/dist/schemas/native-runtime-input-schema.d.ts +5 -0
- package/dist/schemas/native-runtime-input-schema.js +5 -0
- package/dist/schemas/template-deployment-selection-schema.d.ts +3 -0
- package/dist/schemas/template-deployment-selection-schema.js +10 -0
- package/dist/schemas/workflow-input-value-map-schema.d.ts +5 -0
- package/dist/schemas/workflow-input-value-map-schema.js +5 -0
- package/dist/schemas/workflow-template-schema.d.ts +11 -0
- package/dist/schemas/workflow-template-schema.js +10 -0
- package/dist/types/native-capability.d.ts +10 -1
- package/dist/types/native-feature-registry.d.ts +70 -0
- package/dist/types/native-feature-registry.js +14 -0
- package/dist/types/native-material-binding.d.ts +56 -0
- package/dist/types/native-material-binding.js +1 -0
- package/dist/types/native-runtime-parameters.d.ts +55 -0
- package/dist/types/native-runtime-parameters.js +1 -0
- package/dist/types/output-binding-source.d.ts +5 -0
- package/dist/types/request-materialization.d.ts +9 -1
- package/dist/types/request-node-configuration.d.ts +13 -0
- package/dist/types/request-node-configuration.js +1 -0
- package/dist/types/response-check-compilation.d.ts +1 -1
- package/dist/types/reviewable-workflow.d.ts +2 -0
- package/dist/types/workflow-compilation.d.ts +3 -0
- package/dist/types/workflow-template.d.ts +121 -0
- package/dist/types/workflow-template.js +1 -0
- package/dist/workflow/batch/compile-batched-n8n-workflow.js +22 -4
- package/dist/workflow/build-n8n-workflow.js +3 -6
- package/dist/workflow/compile-native-material-fragments.d.ts +3 -0
- package/dist/workflow/compile-native-material-fragments.js +76 -0
- package/dist/workflow/compile-native-workflow-nodes.js +22 -23
- package/dist/workflow/compile-planned-n8n-workflow.js +28 -3
- package/dist/workflow/compile-reviewable-n8n-workflow.js +31 -3
- package/dist/workflow/compile-validated-workflow-fragments.js +14 -14
- package/dist/workflow/compile-workflow-material-fragments.d.ts +4 -0
- package/dist/workflow/compile-workflow-material-fragments.js +18 -0
- package/dist/workflow/create-n8n-native-output-sources.js +53 -12
- package/dist/workflow/entrypoint/manual-trigger.d.ts +4 -0
- package/dist/workflow/entrypoint/manual-trigger.js +16 -0
- package/dist/workflow/find-singleton-api-responses.d.ts +3 -0
- package/dist/workflow/find-singleton-api-responses.js +22 -0
- package/dist/workflow/inputs/compile-native-runtime-inputs.d.ts +5 -0
- package/dist/workflow/inputs/compile-native-runtime-inputs.js +129 -0
- package/dist/workflow/inputs/create-runtime-input-native-capabilities.d.ts +4 -0
- package/dist/workflow/inputs/create-runtime-input-native-capabilities.js +36 -0
- package/dist/workflow/resolve-n8n-native-materials.d.ts +2 -0
- package/dist/workflow/resolve-n8n-native-materials.js +16 -0
- package/dist/workflow/templates/compile-n8n-workflow-template.d.ts +3 -0
- package/dist/workflow/templates/compile-n8n-workflow-template.js +211 -0
- package/dist/workflow/templates/create-template-artifact-mapping.d.ts +2 -0
- package/dist/workflow/templates/create-template-artifact-mapping.js +58 -0
- package/dist/workflow/templates/create-template-gap-regions.d.ts +5 -0
- package/dist/workflow/templates/create-template-gap-regions.js +22 -0
- package/dist/workflow/templates/create-workflow-template-guide.d.ts +3 -0
- package/dist/workflow/templates/create-workflow-template-guide.js +44 -0
- package/dist/workflow/templates/prepare-template-api-fragments.d.ts +3 -0
- package/dist/workflow/templates/prepare-template-api-fragments.js +74 -0
- package/dist/workflow/templates/select-n8n-template-deployments.d.ts +3 -0
- package/dist/workflow/templates/select-n8n-template-deployments.js +12 -0
- package/dist/workflow/templates/workflow-template-identities.d.ts +5 -0
- package/dist/workflow/templates/workflow-template-identities.js +5 -0
- package/package.json +9 -4
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Supported OSS feature families, not every built-in node in n8n. */
|
|
2
|
+
export const N8nNativeFeature = Object.freeze({
|
|
3
|
+
If: 'if',
|
|
4
|
+
MergeAppend: 'merge-append',
|
|
5
|
+
AssertResponses: 'assert-responses',
|
|
6
|
+
StopAndError: 'stop-and-error',
|
|
7
|
+
PassThrough: 'pass-through',
|
|
8
|
+
RejoinExclusiveBranches: 'rejoin-exclusive-branches',
|
|
9
|
+
JsonOutput: 'json-output',
|
|
10
|
+
SplitApiResponseArray: 'split-api-response-array',
|
|
11
|
+
CollectApiResponses: 'collect-api-responses',
|
|
12
|
+
SplitNativeOutputArray: 'split-native-output-array',
|
|
13
|
+
JoinApiItems: 'join-api-items',
|
|
14
|
+
});
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { NativeOutputContract, ApiBindingMaterial, PlannedNativeNode, WorkflowNativeMaterialSources } from '@openapi-flow/core';
|
|
2
|
+
import type { N8nNativeOutputSource } from './output-binding-source.js';
|
|
3
|
+
import type { NativeItemExecutionOptions } from './native-capability.js';
|
|
4
|
+
import type { N8nNativeCapability } from './native-capability.js';
|
|
5
|
+
import type { N8nNodeFragment } from './node-fragment.js';
|
|
6
|
+
export type NativeRuntimeSourceBinding = {
|
|
7
|
+
kind: 'provided';
|
|
8
|
+
sources: N8nNativeOutputSource[];
|
|
9
|
+
} | {
|
|
10
|
+
kind: 'compiled';
|
|
11
|
+
};
|
|
12
|
+
export interface ResolveNativeRuntimeSourceInput {
|
|
13
|
+
binding: NativeRuntimeSourceBinding;
|
|
14
|
+
contract: NativeOutputContract;
|
|
15
|
+
compiledSources?: N8nNativeOutputSource[];
|
|
16
|
+
consumerId: string;
|
|
17
|
+
}
|
|
18
|
+
export interface BoundNativeArrayCapabilityInput extends NativeItemExecutionOptions {
|
|
19
|
+
sources: NativeOutputContract[];
|
|
20
|
+
runtime: NativeRuntimeSourceBinding;
|
|
21
|
+
}
|
|
22
|
+
export interface BoundItemJoinCapabilityInput {
|
|
23
|
+
materials: ApiBindingMaterial[];
|
|
24
|
+
scopes: NativeOutputContract[];
|
|
25
|
+
runtime: NativeRuntimeSourceBinding;
|
|
26
|
+
}
|
|
27
|
+
export interface ResolveN8nNativeMaterialsInput {
|
|
28
|
+
apiMaterials: ApiBindingMaterial[];
|
|
29
|
+
nativeOutputs: NativeOutputContract[];
|
|
30
|
+
nativeNodes: PlannedNativeNode[];
|
|
31
|
+
capabilities: N8nNativeCapability[];
|
|
32
|
+
}
|
|
33
|
+
export interface ResolvedN8nNativeMaterials {
|
|
34
|
+
capabilities: N8nNativeCapability[];
|
|
35
|
+
outputs: NativeOutputContract[];
|
|
36
|
+
}
|
|
37
|
+
export interface CompileNativeMaterialFragmentsInput {
|
|
38
|
+
nativeNodes: PlannedNativeNode[];
|
|
39
|
+
materials: ResolvedN8nNativeMaterials;
|
|
40
|
+
apiMaterials: ApiBindingMaterial[];
|
|
41
|
+
apiNodeNames: Record<string, string>;
|
|
42
|
+
singletonApiResponseIds?: string[];
|
|
43
|
+
externalNativeOutputSources: N8nNativeOutputSource[];
|
|
44
|
+
nodeIds: string[];
|
|
45
|
+
}
|
|
46
|
+
export interface CompiledNativeMaterialFragments {
|
|
47
|
+
fragments: N8nNodeFragment[];
|
|
48
|
+
outputSources: N8nNativeOutputSource[];
|
|
49
|
+
}
|
|
50
|
+
export interface MaterialBindableN8nCapability extends N8nNativeCapability {
|
|
51
|
+
bindMaterialContracts: NonNullable<N8nNativeCapability['bindMaterialContracts']>;
|
|
52
|
+
}
|
|
53
|
+
export interface MaterialBoundN8nCapability extends MaterialBindableN8nCapability {
|
|
54
|
+
materialSources: WorkflowNativeMaterialSources;
|
|
55
|
+
}
|
|
56
|
+
export type NativeMaterialFeatureDefinition = Pick<N8nNativeCapability, 'name' | 'description' | 'parametersSchema' | 'parameterReferenceSources' | 'referenceStructureSchema' | 'parameterReferenceBindings' | 'waitsForAllInputs' | 'exclusiveOutputPorts' | 'materialRequirements' | 'inputPorts' | 'outputPorts'>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { NativeRuntimeParameterMaterialization, NativeRuntimeInputSlot, NativeRuntimeInputValues, PlannedNativeNode, ApiBindingMaterial, NativeOutputContract } from '@openapi-flow/core';
|
|
2
|
+
import type { N8nTemplateInputSlotMapping } from './workflow-template.js';
|
|
3
|
+
import type { BuildN8nWorkflowInput, N8nWorkflowJSON } from './workflow-compilation.js';
|
|
4
|
+
import type { CompileNativeNodeInput, N8nNativeCapability } from './native-capability.js';
|
|
5
|
+
import type { N8nNodeFragment } from './node-fragment.js';
|
|
6
|
+
export interface N8nNativeRuntimeInput {
|
|
7
|
+
materialization: NativeRuntimeParameterMaterialization;
|
|
8
|
+
revision: number;
|
|
9
|
+
inputNodeName: string;
|
|
10
|
+
}
|
|
11
|
+
export interface PrependNativeParameterGuardInput {
|
|
12
|
+
input: CompileNativeNodeInput;
|
|
13
|
+
capability: N8nNativeCapability;
|
|
14
|
+
fragment: N8nNodeFragment;
|
|
15
|
+
}
|
|
16
|
+
export interface N8nNativeInputConfiguration {
|
|
17
|
+
revision: number;
|
|
18
|
+
/** Omission leaves actual execution values absent; no dummy values are generated. */
|
|
19
|
+
inputValues?: NativeRuntimeInputValues;
|
|
20
|
+
}
|
|
21
|
+
export type N8nNativeInputSlot = NativeRuntimeInputSlot & N8nTemplateInputSlotMapping;
|
|
22
|
+
export interface N8nNativeInputTemplate {
|
|
23
|
+
revision: number;
|
|
24
|
+
inputsReady: boolean;
|
|
25
|
+
inputSlots: N8nNativeInputSlot[];
|
|
26
|
+
guide: string;
|
|
27
|
+
}
|
|
28
|
+
export interface PrepareNativeRuntimeInputsInput {
|
|
29
|
+
nativeNodes: PlannedNativeNode[];
|
|
30
|
+
capabilities: N8nNativeCapability[];
|
|
31
|
+
apiMaterials: ApiBindingMaterial[];
|
|
32
|
+
nativeOutputs: NativeOutputContract[];
|
|
33
|
+
nativeInputs?: N8nNativeInputConfiguration;
|
|
34
|
+
}
|
|
35
|
+
export interface PreparedNativeRuntimeInputs {
|
|
36
|
+
revision: number;
|
|
37
|
+
inputValues: NativeRuntimeInputValues;
|
|
38
|
+
inputsReady: boolean;
|
|
39
|
+
slots: NativeRuntimeInputSlot[];
|
|
40
|
+
nativeParameters: NativeRuntimeParameterMaterialization[];
|
|
41
|
+
capabilities: N8nNativeCapability[];
|
|
42
|
+
}
|
|
43
|
+
export interface CreateRuntimeInputNativeCapabilitiesInput {
|
|
44
|
+
capabilities: N8nNativeCapability[];
|
|
45
|
+
slots: NativeRuntimeInputSlot[];
|
|
46
|
+
revision: number;
|
|
47
|
+
inputNodeName: string;
|
|
48
|
+
}
|
|
49
|
+
export interface AssembleNativeRuntimeInputsInput extends BuildN8nWorkflowInput {
|
|
50
|
+
nativeInputs: PreparedNativeRuntimeInputs;
|
|
51
|
+
}
|
|
52
|
+
export interface N8nNativeInputCompilationResult {
|
|
53
|
+
workflow: N8nWorkflowJSON;
|
|
54
|
+
nativeInputTemplate: N8nNativeInputTemplate;
|
|
55
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -2,6 +2,7 @@ import type { NativeOutputContract } from '@openapi-flow/core';
|
|
|
2
2
|
import type { PlannedNativeNode } from '@openapi-flow/core';
|
|
3
3
|
import type { N8nNativeCapability } from './native-capability.js';
|
|
4
4
|
import type { ApiOperationContract } from '@openapi-flow/core';
|
|
5
|
+
import type { N8nNativeInputConfiguration } from './native-runtime-parameters.js';
|
|
5
6
|
export interface N8nNativeOutputSource extends NativeOutputContract {
|
|
6
7
|
nodeName: string;
|
|
7
8
|
}
|
|
@@ -19,4 +20,8 @@ export interface CreateN8nNativeOutputSourcesInput {
|
|
|
19
20
|
nativeNodes: PlannedNativeNode[];
|
|
20
21
|
capabilities: N8nNativeCapability[];
|
|
21
22
|
apiNodeNames: Record<string, string>;
|
|
23
|
+
apiResponseContracts?: Record<string, ApiOperationContract>;
|
|
24
|
+
/** Actual SDK output sources outside this explicitly supplied native subset. */
|
|
25
|
+
externalNativeOutputSources?: N8nNativeOutputSource[];
|
|
26
|
+
nativeInputs?: N8nNativeInputConfiguration;
|
|
22
27
|
}
|
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
import type { ApiCallArguments, ApiOperationContract, JsonValue } from '@openapi-flow/core';
|
|
2
2
|
import type { Operation } from '@openapi-flow/core/internal';
|
|
3
|
+
import type { DeferredApiInputSlot } from '@openapi-flow/core';
|
|
3
4
|
import type { PreparedRequestBody, RequestHeader } from './legacy/request-node.js';
|
|
4
5
|
export interface RequestMaterializationConfig {
|
|
5
6
|
contract: ApiOperationContract;
|
|
6
7
|
operation: Operation;
|
|
7
|
-
arguments:
|
|
8
|
+
arguments: RequestMaterializationArguments;
|
|
8
9
|
templateUrl: string;
|
|
10
|
+
deferredInputs?: DeferredRequestRuntimeInputs;
|
|
11
|
+
}
|
|
12
|
+
export type RequestMaterializationArguments = Pick<ApiCallArguments, 'callId' | 'values' | 'bindings' | 'unresolvedInputs' | 'requestMediaType' | 'requestedInputs'>;
|
|
13
|
+
export interface DeferredRequestRuntimeInputs {
|
|
14
|
+
revision: number;
|
|
15
|
+
inputNodeName: string;
|
|
16
|
+
slots: DeferredApiInputSlot[];
|
|
9
17
|
}
|
|
10
18
|
export interface MaterializedHttpRequest {
|
|
11
19
|
url: string;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CreateBoundHttpRequestNodeInput, N8nNodeFragment } from './node-fragment.js';
|
|
2
|
+
import type { RequestMaterializationConfig } from './request-materialization.js';
|
|
3
|
+
import type { ResolvedHttpRequestDeployment } from './request-deployment.js';
|
|
4
|
+
export interface ResolveHttpRequestNodeConfigurationResult {
|
|
5
|
+
input: CreateBoundHttpRequestNodeInput;
|
|
6
|
+
config: RequestMaterializationConfig;
|
|
7
|
+
}
|
|
8
|
+
export interface FinalizeHttpRequestFragmentInput {
|
|
9
|
+
fragment: N8nNodeFragment;
|
|
10
|
+
method: string;
|
|
11
|
+
documentId: string;
|
|
12
|
+
deployment: ResolvedHttpRequestDeployment;
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { CompileNativeNodeInput, NativeCheck } from './native-capability.js';
|
|
2
2
|
import type { N8nApiResponseSource } from './output-binding-source.js';
|
|
3
|
-
export interface CreateResponseCheckReaderInput extends Pick<CompileNativeNodeInput, 'apiNodeNames' | 'apiResponseContracts'> {
|
|
3
|
+
export interface CreateResponseCheckReaderInput extends Pick<CompileNativeNodeInput, 'apiNodeNames' | 'apiResponseContracts' | 'singletonApiResponseIds'> {
|
|
4
4
|
nodeId: string;
|
|
5
5
|
checks: NativeCheck[];
|
|
6
6
|
linked: boolean;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ReviewableWorkflowGraphPlan, ReviewableWorkflowApiMaterial, WorkflowReviewGap, ApiOperationContract } from '@openapi-flow/core';
|
|
2
2
|
import type { N8nNativeCapability } from './native-capability.js';
|
|
3
3
|
import type { N8nNodeFragment, N8nSdkNode } from './node-fragment.js';
|
|
4
|
+
import type { N8nNativeInputConfiguration } from './native-runtime-parameters.js';
|
|
4
5
|
export interface CompileReviewableN8nWorkflowInput {
|
|
5
6
|
id: string;
|
|
6
7
|
name: string;
|
|
@@ -8,6 +9,7 @@ export interface CompileReviewableN8nWorkflowInput {
|
|
|
8
9
|
materials: ReviewableWorkflowApiMaterial[];
|
|
9
10
|
apiNodes: N8nNodeFragment[];
|
|
10
11
|
capabilities: N8nNativeCapability[];
|
|
12
|
+
nativeInputs?: N8nNativeInputConfiguration;
|
|
11
13
|
}
|
|
12
14
|
export interface CreateGapNodeInput {
|
|
13
15
|
nodeId: string;
|
|
@@ -3,6 +3,7 @@ import type { N8nNodeFragment } from './node-fragment.js';
|
|
|
3
3
|
import type { N8nSdkNode } from './node-fragment.js';
|
|
4
4
|
import type { WorkflowReviewGap } from '@openapi-flow/core';
|
|
5
5
|
import type { N8nBatchExecutionScope } from './batch-execution.js';
|
|
6
|
+
import type { N8nNativeInputTemplate } from './native-runtime-parameters.js';
|
|
6
7
|
export interface N8nGraphEdge {
|
|
7
8
|
from: string;
|
|
8
9
|
output: string;
|
|
@@ -19,6 +20,7 @@ export interface AssembleN8nWorkflowInput {
|
|
|
19
20
|
export interface N8nCompileResult {
|
|
20
21
|
status: 'complete';
|
|
21
22
|
workflow: WorkflowJSON;
|
|
23
|
+
nativeInputTemplate?: N8nNativeInputTemplate;
|
|
22
24
|
}
|
|
23
25
|
export interface BuildN8nWorkflowInput extends AssembleN8nWorkflowInput {
|
|
24
26
|
triggerConnections: 'connected' | 'detached';
|
|
@@ -32,5 +34,6 @@ export interface N8nNeedsReviewResult {
|
|
|
32
34
|
status: 'needs-review';
|
|
33
35
|
workflow: N8nWorkflowJSON;
|
|
34
36
|
diagnostics: WorkflowReviewGap[];
|
|
37
|
+
nativeInputTemplate?: N8nNativeInputTemplate;
|
|
35
38
|
}
|
|
36
39
|
export type N8nWorkflowResult = N8nCompileResult | N8nNeedsReviewResult;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import type { WorkflowDraft, WorkflowDraftContext, WorkflowDraftReadiness, DeferredApiInputSlot, DeferredApiInputValues, WorkflowApiMaterial, WorkflowGraphPlan, ApiOperationContract, NativeRuntimeInputSlot, WorkflowRuntimeInputSlot, NativeRuntimeParameterMaterialization, WorkflowDraftCapabilityGap } from '@openapi-flow/core';
|
|
2
|
+
import type { N8nNativeCapability } from './native-capability.js';
|
|
3
|
+
import type { N8nNodeFragment } from './node-fragment.js';
|
|
4
|
+
import type { HttpRequestDeploymentOptions } from './request-deployment.js';
|
|
5
|
+
import type { RequestMaterializationConfig } from './request-materialization.js';
|
|
6
|
+
import type { N8nWorkflowJSON } from './workflow-compilation.js';
|
|
7
|
+
export interface N8nTemplateDeployment extends HttpRequestDeploymentOptions {
|
|
8
|
+
documentId: string;
|
|
9
|
+
}
|
|
10
|
+
export interface SelectN8nTemplateDeploymentsInput {
|
|
11
|
+
deployments: N8nTemplateDeployment[];
|
|
12
|
+
availableDocumentIds: string[];
|
|
13
|
+
selectedDocumentIds: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface N8nTemplateContext extends Omit<WorkflowDraftContext, 'capabilities'> {
|
|
16
|
+
capabilities: N8nNativeCapability[];
|
|
17
|
+
}
|
|
18
|
+
export interface CompileN8nWorkflowTemplateInput {
|
|
19
|
+
draft: WorkflowDraft;
|
|
20
|
+
context: N8nTemplateContext;
|
|
21
|
+
name: string;
|
|
22
|
+
/** Resolve each request's declared references by actual n8n item ancestry. */
|
|
23
|
+
itemMode?: 'linked';
|
|
24
|
+
deployments?: N8nTemplateDeployment[];
|
|
25
|
+
/** Only explicit actual values; omission means no supplied runtime values. */
|
|
26
|
+
inputValues?: DeferredApiInputValues;
|
|
27
|
+
}
|
|
28
|
+
export interface N8nTemplateNodeMappingBase {
|
|
29
|
+
nodeId: string;
|
|
30
|
+
sdkNodeIds: string[];
|
|
31
|
+
entryNodeName: string;
|
|
32
|
+
exitNodeName: string;
|
|
33
|
+
}
|
|
34
|
+
export interface N8nTemplateApiNodeMapping extends N8nTemplateNodeMappingBase {
|
|
35
|
+
kind: 'api';
|
|
36
|
+
operation: N8nTemplateOperationMapping;
|
|
37
|
+
}
|
|
38
|
+
export interface N8nTemplateOperationMapping extends Pick<ApiOperationContract, 'key' | 'method' | 'path'> {
|
|
39
|
+
summary?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface N8nTemplateNativeNodeMapping extends N8nTemplateNodeMappingBase {
|
|
42
|
+
kind: 'native';
|
|
43
|
+
capability: string;
|
|
44
|
+
}
|
|
45
|
+
export type N8nTemplateNodeMapping = N8nTemplateApiNodeMapping | N8nTemplateNativeNodeMapping | N8nTemplateGapNodeMapping;
|
|
46
|
+
export interface N8nTemplateGapNodeMapping extends N8nTemplateNodeMappingBase {
|
|
47
|
+
kind: 'capability-gap';
|
|
48
|
+
gap: WorkflowDraftCapabilityGap;
|
|
49
|
+
inventoryCurrent: boolean;
|
|
50
|
+
}
|
|
51
|
+
export interface N8nTemplateInputSlotMapping {
|
|
52
|
+
editNodeId: string;
|
|
53
|
+
editNodeName: string;
|
|
54
|
+
editParameter: 'jsCode';
|
|
55
|
+
materializerNodeName: string;
|
|
56
|
+
}
|
|
57
|
+
export type N8nTemplateInputSlot = WorkflowRuntimeInputSlot & N8nTemplateInputSlotMapping;
|
|
58
|
+
export interface N8nTemplateDeploymentRequirement {
|
|
59
|
+
callId: string;
|
|
60
|
+
documentId: string;
|
|
61
|
+
fields: string[];
|
|
62
|
+
materializerNodeName: string;
|
|
63
|
+
requestNodeName: string;
|
|
64
|
+
}
|
|
65
|
+
export interface N8nWorkflowTemplateResult {
|
|
66
|
+
revision: number;
|
|
67
|
+
workflow: N8nWorkflowJSON;
|
|
68
|
+
/** Canonical draft state, separate from supplied execution-time values. */
|
|
69
|
+
draftReadiness: WorkflowDraftReadiness;
|
|
70
|
+
requestInputsReady: boolean;
|
|
71
|
+
nativeInputsReady: boolean;
|
|
72
|
+
runtimeInputsReady: boolean;
|
|
73
|
+
/** References supplied, not proof of access to the user's n8n credentials. */
|
|
74
|
+
deploymentConfigured: boolean;
|
|
75
|
+
triggerConnected: boolean;
|
|
76
|
+
inputSlots: N8nTemplateInputSlot[];
|
|
77
|
+
deploymentRequirements: N8nTemplateDeploymentRequirement[];
|
|
78
|
+
nodeMappings: N8nTemplateNodeMapping[];
|
|
79
|
+
guide: string;
|
|
80
|
+
}
|
|
81
|
+
export interface CreateTemplateInputNodesInput {
|
|
82
|
+
revision: number;
|
|
83
|
+
slots: WorkflowRuntimeInputSlot[];
|
|
84
|
+
inputValues: DeferredApiInputValues;
|
|
85
|
+
requests: RequestMaterializationConfig[];
|
|
86
|
+
nativeParameters: NativeRuntimeParameterMaterialization[];
|
|
87
|
+
}
|
|
88
|
+
export interface CreateTemplateGuideInput {
|
|
89
|
+
draft: WorkflowDraft;
|
|
90
|
+
readiness: WorkflowDraftReadiness;
|
|
91
|
+
slots: N8nTemplateInputSlot[];
|
|
92
|
+
mappings: N8nTemplateNodeMapping[];
|
|
93
|
+
deploymentRequirements: N8nTemplateDeploymentRequirement[];
|
|
94
|
+
requestInputsReady: boolean;
|
|
95
|
+
nativeInputsReady: boolean;
|
|
96
|
+
triggerConnected: boolean;
|
|
97
|
+
}
|
|
98
|
+
export interface PrepareTemplateApiFragmentsInput {
|
|
99
|
+
template: CompileN8nWorkflowTemplateInput;
|
|
100
|
+
/** Runtime-bound compilers, separate from original planning/evidence context. */
|
|
101
|
+
capabilities: N8nNativeCapability[];
|
|
102
|
+
materials: WorkflowApiMaterial[];
|
|
103
|
+
slots: DeferredApiInputSlot[];
|
|
104
|
+
plan: WorkflowGraphPlan;
|
|
105
|
+
}
|
|
106
|
+
export interface PreparedTemplateApiFragments {
|
|
107
|
+
apiNodes: N8nNodeFragment[];
|
|
108
|
+
requests: RequestMaterializationConfig[];
|
|
109
|
+
deploymentRequirements: N8nTemplateDeploymentRequirement[];
|
|
110
|
+
}
|
|
111
|
+
export interface CreateTemplateArtifactMappingInput {
|
|
112
|
+
context: WorkflowDraftContext;
|
|
113
|
+
draft: WorkflowDraft;
|
|
114
|
+
materials: WorkflowApiMaterial[];
|
|
115
|
+
fragments: N8nNodeFragment[];
|
|
116
|
+
slots: (DeferredApiInputSlot | NativeRuntimeInputSlot)[];
|
|
117
|
+
}
|
|
118
|
+
export interface TemplateArtifactMapping {
|
|
119
|
+
mappings: N8nTemplateNodeMapping[];
|
|
120
|
+
inputSlots: N8nTemplateInputSlot[];
|
|
121
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,18 +1,36 @@
|
|
|
1
1
|
import { batchExecutionScopesSchema } from '../../schemas/batch-execution-schema.js';
|
|
2
2
|
import { compileValidatedWorkflowFragments } from '../compile-validated-workflow-fragments.js';
|
|
3
3
|
import { buildN8nWorkflow } from '../build-n8n-workflow.js';
|
|
4
|
+
import { prepareNativeRuntimeInputs, assembleNativeRuntimeInputs, } from '../inputs/compile-native-runtime-inputs.js';
|
|
4
5
|
export function compileBatchedN8nWorkflow(input) {
|
|
5
6
|
const batchScopes = batchExecutionScopesSchema.parse(input.batchScopes);
|
|
6
|
-
const
|
|
7
|
+
const nativeInputs = prepareNativeRuntimeInputs({
|
|
8
|
+
nativeInputs: input.nativeInputs,
|
|
9
|
+
nativeNodes: input.plan.nativeNodes,
|
|
10
|
+
capabilities: input.capabilities,
|
|
11
|
+
apiMaterials: input.materials.map((item) => ({
|
|
12
|
+
callId: item.arguments.callId,
|
|
13
|
+
operation: item.operation,
|
|
14
|
+
requestMediaType: item.arguments.requestMediaType,
|
|
15
|
+
})),
|
|
16
|
+
nativeOutputs: [],
|
|
17
|
+
});
|
|
18
|
+
const graph = {
|
|
7
19
|
id: input.id,
|
|
8
20
|
name: input.name,
|
|
9
|
-
nodes: compileValidatedWorkflowFragments(
|
|
21
|
+
nodes: compileValidatedWorkflowFragments(nativeInputs === undefined
|
|
22
|
+
? input
|
|
23
|
+
: { ...input, capabilities: nativeInputs.capabilities }),
|
|
10
24
|
edges: input.plan.edges,
|
|
11
25
|
starts: input.plan.starts,
|
|
12
26
|
triggerConnections: 'connected',
|
|
13
27
|
annotations: [],
|
|
14
28
|
batchScopes,
|
|
15
|
-
}
|
|
29
|
+
};
|
|
30
|
+
const result = nativeInputs === undefined
|
|
31
|
+
? { workflow: buildN8nWorkflow(graph) }
|
|
32
|
+
: assembleNativeRuntimeInputs({ ...graph, nativeInputs });
|
|
33
|
+
const workflow = result.workflow;
|
|
16
34
|
workflow.settings = { ...workflow.settings, executionOrder: 'v1' };
|
|
17
|
-
return { status: 'complete',
|
|
35
|
+
return { status: 'complete', ...result };
|
|
18
36
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { workflow, validateWorkflow } from '@n8n/workflow-sdk';
|
|
2
|
+
import { createN8nManualTrigger } from './entrypoint/manual-trigger.js';
|
|
2
3
|
import { validateNodeFragments } from './validate-node-fragments.js';
|
|
3
4
|
import { createBatchExecutionScopes } from './batch/create-batch-execution-scopes.js';
|
|
4
5
|
export function buildN8nWorkflow({ id, name, nodes, edges, starts, triggerConnections, annotations, batchScopes, }) {
|
|
@@ -92,11 +93,7 @@ export function buildN8nWorkflow({ id, name, nodes, edges, starts, triggerConnec
|
|
|
92
93
|
}
|
|
93
94
|
if (visited !== nodes.length)
|
|
94
95
|
throw new Error('workflow DAG has a cycle');
|
|
95
|
-
const start =
|
|
96
|
-
type: 'n8n-nodes-base.manualTrigger',
|
|
97
|
-
version: 1,
|
|
98
|
-
config: { id: 'openapi-flow-start', name: 'Start', position: [0, 0] },
|
|
99
|
-
});
|
|
96
|
+
const start = createN8nManualTrigger();
|
|
100
97
|
let built = workflow(id, name).add(start);
|
|
101
98
|
for (const fragment of nodes)
|
|
102
99
|
for (const node of fragment.nodes)
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { CompileNativeMaterialFragmentsInput, CompiledNativeMaterialFragments } from '../types/native-material-binding.js';
|
|
2
|
+
/** Compile dependency names from actual SDK exits; graph execution order is still owned by explicit edges. */
|
|
3
|
+
export declare function compileNativeMaterialFragments(input: CompileNativeMaterialFragmentsInput): CompiledNativeMaterialFragments;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/** Compile dependency names from actual SDK exits; graph execution order is still owned by explicit edges. */
|
|
2
|
+
export function compileNativeMaterialFragments(input) {
|
|
3
|
+
const registry = new Map(input.materials.capabilities.map((capability) => [
|
|
4
|
+
capability.name,
|
|
5
|
+
capability,
|
|
6
|
+
]));
|
|
7
|
+
const selected = new Set(input.nodeIds);
|
|
8
|
+
if (selected.size !== input.nodeIds.length ||
|
|
9
|
+
input.nodeIds.some((id) => !input.nativeNodes.some((node) => node.id === id)))
|
|
10
|
+
throw new Error('Native compilation requires distinct actual selected nodeIds');
|
|
11
|
+
const pending = input.nativeNodes.filter((node) => selected.has(node.id));
|
|
12
|
+
const sources = [...input.externalNativeOutputSources];
|
|
13
|
+
const fragments = new Map();
|
|
14
|
+
const apiResponseContracts = Object.fromEntries(input.apiMaterials.map((material) => [material.callId, material.operation]));
|
|
15
|
+
let progressed = true;
|
|
16
|
+
while (pending.length && progressed) {
|
|
17
|
+
progressed = false;
|
|
18
|
+
for (let index = 0; index < pending.length;) {
|
|
19
|
+
const node = pending[index];
|
|
20
|
+
const capability = registry.get(node.capability);
|
|
21
|
+
if (!capability)
|
|
22
|
+
throw new Error(`Missing current native compiler ${node.capability}`);
|
|
23
|
+
const references = [
|
|
24
|
+
...(capability.nodeOutputReferences
|
|
25
|
+
? capability.nodeOutputReferences(node.parameters)
|
|
26
|
+
: []),
|
|
27
|
+
...Object.values(capability.inputReferences
|
|
28
|
+
? capability.inputReferences(node.parameters)
|
|
29
|
+
: {})
|
|
30
|
+
.flat()
|
|
31
|
+
.filter((reference) => reference.source === 'node-output'),
|
|
32
|
+
];
|
|
33
|
+
if (references.some((reference) => !sources.some((source) => source.nodeId === reference.nodeId))) {
|
|
34
|
+
index++;
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const compiled = capability.compile({
|
|
38
|
+
planned: node,
|
|
39
|
+
apiNodeNames: input.apiNodeNames,
|
|
40
|
+
apiResponseContracts,
|
|
41
|
+
singletonApiResponseIds: input.singletonApiResponseIds,
|
|
42
|
+
nativeOutputSources: sources,
|
|
43
|
+
position: [
|
|
44
|
+
600 +
|
|
45
|
+
input.nativeNodes.findIndex((planned) => planned.id === node.id) *
|
|
46
|
+
250,
|
|
47
|
+
300,
|
|
48
|
+
],
|
|
49
|
+
});
|
|
50
|
+
if (compiled.nodeId !== node.id ||
|
|
51
|
+
!compiled.exit.name.trim() ||
|
|
52
|
+
JSON.stringify(Object.keys(compiled.inputPorts)) !==
|
|
53
|
+
JSON.stringify(capability.inputPorts(node.parameters)) ||
|
|
54
|
+
JSON.stringify(Object.keys(compiled.outputPorts)) !==
|
|
55
|
+
JSON.stringify(capability.outputPorts(node.parameters)))
|
|
56
|
+
throw new Error(`Native compiler ${node.capability} violated declared node identity/ports`);
|
|
57
|
+
if (compiled.rejoinsExclusiveOutputs !==
|
|
58
|
+
capability.rejoinsExclusiveOutputs?.(node.parameters))
|
|
59
|
+
throw new Error(`Native compiler ${node.capability} violated declared rejoinsExclusiveOutputs`);
|
|
60
|
+
fragments.set(node.id, compiled);
|
|
61
|
+
const output = input.materials.outputs.find((output) => output.nodeId === node.id);
|
|
62
|
+
if (output)
|
|
63
|
+
sources.push({ ...output, nodeName: compiled.exit.name });
|
|
64
|
+
pending.splice(index, 1);
|
|
65
|
+
progressed = true;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (pending.length)
|
|
69
|
+
throw new Error(`Native compilation is missing actual producer exits for ${pending.map((node) => node.id).join(', ')}`);
|
|
70
|
+
return {
|
|
71
|
+
fragments: input.nativeNodes
|
|
72
|
+
.filter((node) => selected.has(node.id))
|
|
73
|
+
.map((node) => fragments.get(node.id)),
|
|
74
|
+
outputSources: sources.filter((source) => selected.has(source.nodeId)),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
@@ -1,26 +1,25 @@
|
|
|
1
|
+
import { resolveN8nNativeMaterials } from './resolve-n8n-native-materials.js';
|
|
2
|
+
import { compileNativeMaterialFragments } from './compile-native-material-fragments.js';
|
|
3
|
+
import { findSingletonApiResponses } from './find-singleton-api-responses.js';
|
|
1
4
|
export function compileNativeWorkflowNodes(input) {
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
position: [600 + index * 250, 300],
|
|
13
|
-
});
|
|
14
|
-
if (compiled.nodeId !== planned.id ||
|
|
15
|
-
JSON.stringify(Object.keys(compiled.inputPorts)) !==
|
|
16
|
-
JSON.stringify(capability.inputPorts(planned.parameters)) ||
|
|
17
|
-
JSON.stringify(Object.keys(compiled.outputPorts)) !==
|
|
18
|
-
JSON.stringify(capability.outputPorts(planned.parameters)))
|
|
19
|
-
throw new Error(`Native compiler ${planned.capability} violated declared node identity/ports`);
|
|
20
|
-
if (compiled.rejoinsExclusiveOutputs !==
|
|
21
|
-
capability.rejoinsExclusiveOutputs?.(planned.parameters))
|
|
22
|
-
throw new Error(`Native compiler ${planned.capability} violated declared rejoinsExclusiveOutputs`);
|
|
23
|
-
return compiled;
|
|
5
|
+
const apiMaterials = input.materials.map((item) => ({
|
|
6
|
+
callId: item.arguments.callId,
|
|
7
|
+
operation: item.operation,
|
|
8
|
+
requestMediaType: item.arguments.requestMediaType,
|
|
9
|
+
}));
|
|
10
|
+
const materials = resolveN8nNativeMaterials({
|
|
11
|
+
apiMaterials,
|
|
12
|
+
nativeOutputs: [],
|
|
13
|
+
nativeNodes: input.plan.nativeNodes,
|
|
14
|
+
capabilities: input.capabilities,
|
|
24
15
|
});
|
|
25
|
-
return
|
|
16
|
+
return compileNativeMaterialFragments({
|
|
17
|
+
nativeNodes: input.plan.nativeNodes,
|
|
18
|
+
materials,
|
|
19
|
+
apiMaterials,
|
|
20
|
+
apiNodeNames: Object.fromEntries(input.apiNodes.map((item) => [item.nodeId, item.exit.name])),
|
|
21
|
+
singletonApiResponseIds: findSingletonApiResponses(input),
|
|
22
|
+
externalNativeOutputSources: [],
|
|
23
|
+
nodeIds: input.plan.nativeNodes.map((node) => node.id),
|
|
24
|
+
}).fragments;
|
|
26
25
|
}
|
|
@@ -1,14 +1,39 @@
|
|
|
1
1
|
import { assembleN8nWorkflow } from './assemble-n8n-workflow.js';
|
|
2
2
|
import { compileValidatedWorkflowFragments } from './compile-validated-workflow-fragments.js';
|
|
3
|
+
import { prepareNativeRuntimeInputs, assembleNativeRuntimeInputs, } from './inputs/compile-native-runtime-inputs.js';
|
|
3
4
|
export function compilePlannedN8nWorkflow(input) {
|
|
4
|
-
const
|
|
5
|
-
|
|
5
|
+
const nativeInputs = prepareNativeRuntimeInputs({
|
|
6
|
+
nativeInputs: input.nativeInputs,
|
|
7
|
+
nativeNodes: input.plan.nativeNodes,
|
|
8
|
+
capabilities: input.capabilities,
|
|
9
|
+
apiMaterials: input.materials.map((item) => ({
|
|
10
|
+
callId: item.arguments.callId,
|
|
11
|
+
operation: item.operation,
|
|
12
|
+
requestMediaType: item.arguments.requestMediaType,
|
|
13
|
+
})),
|
|
14
|
+
nativeOutputs: [],
|
|
15
|
+
});
|
|
16
|
+
const nodes = compileValidatedWorkflowFragments(nativeInputs === undefined
|
|
17
|
+
? input
|
|
18
|
+
: { ...input, capabilities: nativeInputs.capabilities });
|
|
19
|
+
const graph = {
|
|
6
20
|
id: input.id,
|
|
7
21
|
name: input.name,
|
|
8
22
|
nodes,
|
|
9
23
|
edges: input.plan.edges,
|
|
10
24
|
starts: input.plan.starts,
|
|
11
|
-
}
|
|
25
|
+
};
|
|
26
|
+
const result = nativeInputs === undefined
|
|
27
|
+
? assembleN8nWorkflow(graph)
|
|
28
|
+
: {
|
|
29
|
+
status: 'complete',
|
|
30
|
+
...assembleNativeRuntimeInputs({
|
|
31
|
+
...graph,
|
|
32
|
+
nativeInputs,
|
|
33
|
+
triggerConnections: 'connected',
|
|
34
|
+
annotations: [],
|
|
35
|
+
}),
|
|
36
|
+
};
|
|
12
37
|
result.workflow.settings = {
|
|
13
38
|
...result.workflow.settings,
|
|
14
39
|
executionOrder: 'v1',
|