n8n-editor-ui 1.86.0 → 1.87.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/assets/AnimatedSpinner-ChSRgyeI.css +39 -0
- package/dist/assets/AnimatedSpinner-urWn52iY.js +18 -0
- package/dist/assets/{AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-DofUIs9S.js → AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-DIbgkfAC.js} +1 -1
- package/dist/assets/{AuthView-CyY2quTd.js → AuthView-DIQI5asI.js} +2 -2
- package/dist/assets/{CanvasChatSwitch-CRtE2Fld.css → CanvasChatSwitch-0IWSu8RE.css} +249 -45
- package/dist/assets/{CanvasChatSwitch-BTInPgKl.js → CanvasChatSwitch-BIpZuY-n.js} +437 -268
- package/dist/assets/{ChangePasswordView-Db-MkXhZ.js → ChangePasswordView-D8Qv0tim.js} +3 -3
- package/dist/assets/CollectionParameter-DT1MnS63.js +4 -0
- package/dist/assets/{CredentialsView-CLr_6U2B.js → CredentialsView-tJ8-2RrO.js} +8 -8
- package/dist/assets/{ErrorView-CUS5vnCW.js → ErrorView-CZEZD7LB.js} +1 -1
- package/dist/assets/{ExecutionsTime-BOPJEomw.css → ExecutionsTime-DZHUIJjP.css} +6 -6
- package/dist/assets/{ExecutionsTime.vue_vue_type_script_setup_true_lang-D15zjPBZ.js → ExecutionsTime.vue_vue_type_script_setup_true_lang-gcknFyjA.js} +23 -20
- package/dist/assets/{ExecutionsView-1df-oH5P.js → ExecutionsView-BCfIz8EF.js} +48 -56
- package/dist/assets/{ExecutionsView-BnBpSqVn.css → ExecutionsView-ByQf9yli.css} +13 -47
- package/dist/assets/{FileSaver.min-DLKMtSuf.js → FileSaver.min-Bs2qHlKb.js} +1 -1
- package/dist/assets/{FixedCollectionParameter-CcqTLBeP.js → FixedCollectionParameter-E0LDqNW3.js} +1 -1
- package/dist/assets/{ForgotMyPasswordView-BHRWkO2H.js → ForgotMyPasswordView-YOnrzvKJ.js} +3 -3
- package/dist/assets/InsightsChartAverageRuntime-DWrrriYN.js +61 -0
- package/dist/assets/InsightsChartFailed-DRi6JC3m.js +57 -0
- package/dist/assets/InsightsChartFailureRate-BdFNsMpg.js +57 -0
- package/dist/assets/InsightsChartTimeSaved-C12GZzSQ.js +71 -0
- package/dist/assets/InsightsChartTotal-Cn386HO4.js +59 -0
- package/dist/assets/InsightsDashboard-BawwZ0Oo.js +154 -0
- package/dist/assets/InsightsDashboard-CB4vHnBh.css +152 -0
- package/dist/assets/InsightsPaywall-OeXh6LeZ.css +133 -0
- package/dist/assets/InsightsPaywall-g3JcqAYL.js +58 -0
- package/dist/assets/{InsightsSummary-DcRuPjLJ.css → InsightsSummary-W08OzElS.css} +57 -35
- package/dist/assets/InsightsSummary-vMmKUcie.js +185 -0
- package/dist/assets/InsightsTableWorkflows-DQQ1vvMz.js +129 -0
- package/dist/assets/InsightsTableWorkflows-Us3j4UTO.css +128 -0
- package/dist/assets/{Logo-DbXTFYA8.js → Logo-Vm92axlM.js} +1 -1
- package/dist/assets/{MainHeader-BfQR9Td3.js → MainHeader-BUhpvu2K.js} +9 -10
- package/dist/assets/{MainSidebar-CDUegYGN.js → MainSidebar-D5P5FSUQ.js} +11 -2
- package/dist/assets/{NodeCreation-BBXRRxZa.js → NodeCreation-BgW5u-Bc.js} +4 -4
- package/dist/assets/{NodeCreator-BiyvtIjb.js → NodeCreator-CFe2n6vJ.js} +3 -3
- package/dist/assets/{NodeDetailsView-BcVu3kf0.css → NodeDetailsView-BT-ro74o.css} +63 -70
- package/dist/assets/{NodeDetailsView-Ph7FVpa8.js → NodeDetailsView-CmtK-rDD.js} +138 -478
- package/dist/assets/{NodeView-BEJ48TF4.js → NodeView-BqaNPfpx.js} +19 -21
- package/dist/assets/{ProjectCardBadge-B7cCM6Eo.js → ProjectCardBadge-BKgtzWr1.js} +1 -1
- package/dist/assets/{ProjectHeader-BjPaep-H.js → ProjectHeader-BWVSdavS.js} +1 -1
- package/dist/assets/{ProjectSettings-C1By1g0Z.js → ProjectSettings-BL-2-uOg.js} +2 -2
- package/dist/assets/{PushConnectionTracker.vue_vue_type_script_setup_true_lang-UHiXbqwy.js → PushConnectionTracker.vue_vue_type_script_setup_true_lang-BL-bMMgn.js} +1 -2
- package/dist/assets/{ResourcesListLayout-CiiXWGd5.js → ResourcesListLayout-CozpmfUY.js} +1 -1
- package/dist/assets/{RunDataAi-CQE0VYut.js → RunDataAi-B_EadpzG.js} +88 -37
- package/dist/assets/{RunDataAi-CN9FrT9c.css → RunDataAi-CUUDqZRP.css} +128 -0
- package/dist/assets/{RunDataJson-BY9cOxFp.js → RunDataJson-CyNNCtyd.js} +11 -12
- package/dist/assets/{RunDataJsonActions-CuFjccfe.js → RunDataJsonActions-SQqaiBEP.js} +1 -2
- package/dist/assets/{RunDataSearch-afEc-21Y.js → RunDataSearch-BF9kshKq.js} +1 -1
- package/dist/assets/{RunDataTable-N6yWFXKt.js → RunDataTable-DsW7wuc2.js} +10 -8
- package/dist/assets/{SamlOnboarding-HDQzVmha.js → SamlOnboarding-BX7RiRJB.js} +3 -3
- package/dist/assets/{SettingsApiView-DQMZT3uc.js → SettingsApiView-CDIPYvaG.js} +1 -1
- package/dist/assets/{SettingsCommunityNodesView-BlQT_0E8.js → SettingsCommunityNodesView-BRSEkT73.js} +4 -5
- package/dist/assets/{SettingsExternalSecrets-BL_3qoNS.js → SettingsExternalSecrets-D7ASuAnS.js} +1 -1
- package/dist/assets/{SettingsLdapView-BMsfXg-A.js → SettingsLdapView-DA5fZZ51.js} +1 -1
- package/dist/assets/{SettingsLogStreamingView-Bm5vaSO2.js → SettingsLogStreamingView-C9qkYvCr.js} +1 -1
- package/dist/assets/{SettingsPersonalView-Djl1VXnE.js → SettingsPersonalView-BnNOJcvO.js} +1 -1
- package/dist/assets/{SettingsSourceControl-A-9nD8hG.js → SettingsSourceControl--ozL4427.js} +1 -1
- package/dist/assets/{SettingsSso-DZCscZY6.js → SettingsSso-Bfe_HRSr.js} +1 -1
- package/dist/assets/{SettingsUsageAndPlan-Rd5AGlNl.js → SettingsUsageAndPlan-CzvMNudh.js} +1 -1
- package/dist/assets/{SettingsUsersView-NEahsGVs.js → SettingsUsersView-DGu5ku48.js} +1 -1
- package/dist/assets/{SettingsView-CeXAUGXE.js → SettingsView-CvreVxXL.js} +1 -1
- package/dist/assets/{SetupView-BI7oJfg0.js → SetupView-BJT6GtIA.js} +3 -3
- package/dist/assets/{SetupWorkflowCredentialsButton-DMZX1S1F.js → SetupWorkflowCredentialsButton-BEq2gs_-.js} +2 -4
- package/dist/assets/{SetupWorkflowFromTemplateView-DZsPVdhN.js → SetupWorkflowFromTemplateView-F9oCDWX8.js} +3 -12
- package/dist/assets/{SigninView-CzVnEKyz.js → SigninView-DyoDtCBc.js} +3 -3
- package/dist/assets/{SignoutView-C4ynr4AN.js → SignoutView-DclBslYe.js} +1 -1
- package/dist/assets/{SignupView-9nwGonm9.js → SignupView-BhB0Hhj0.js} +3 -3
- package/dist/assets/{TemplateDetails-DT1tI4AF.js → TemplateDetails-B3utdyMi.js} +1 -1
- package/dist/assets/{TemplateList-DGPm_Qol.js → TemplateList-Bgz1iiiH.js} +1 -1
- package/dist/assets/{TemplatesCollectionView-DwXY5s5G.js → TemplatesCollectionView-CORzb8YZ.js} +7 -9
- package/dist/assets/{TemplatesSearchView-D0R7uF40.js → TemplatesSearchView-DTuv4-5C.js} +3 -3
- package/dist/assets/{TemplatesView-BZ-ntkfi.js → TemplatesView-CFV5SVF7.js} +1 -1
- package/dist/assets/{TemplatesWorkflowView-TwVAHvD7.js → TemplatesWorkflowView-CQVVdNty.js} +5 -7
- package/dist/assets/{TestDefinitionEditView-C3nnWQ4Q.css → TestDefinitionEditView-Cwkrz308.css} +12 -18
- package/dist/assets/{TestDefinitionEditView-o2Gc4BjN.js → TestDefinitionEditView-DX6GIeq2.js} +163 -199
- package/dist/assets/{TestDefinitionListView-BuUWjPAl.js → TestDefinitionListView-CLEkthYQ.js} +1 -1
- package/dist/assets/{TestDefinitionNewView-DmSFNxfn.js → TestDefinitionNewView-DWTTqvlN.js} +2 -2
- package/dist/assets/{TestDefinitionRootView-1dNmGZUI.js → TestDefinitionRootView-D0yLW0V6.js} +1 -1
- package/dist/assets/{VariablesView-D46tH9pw.js → VariablesView-Dsr4pqth.js} +3 -3
- package/dist/assets/{WorkerView-G0K849qT.js → WorkerView-Bbu5wv-g.js} +6 -7
- package/dist/assets/{WorkflowActivator-DfalOPsa.js → WorkflowActivator-C197X_D6.js} +2 -2
- package/dist/assets/{WorkflowExecutionsInfoAccordion-BcD7ZskD.js → WorkflowExecutionsInfoAccordion-CHPlRtMQ.js} +1 -1
- package/dist/assets/{WorkflowExecutionsLandingPage-BhPbJi5K.js → WorkflowExecutionsLandingPage-CnvMc3SA.js} +2 -2
- package/dist/assets/{WorkflowExecutionsPreview-CowaFwPg.js → WorkflowExecutionsPreview-CJBM3Awe.js} +24 -256
- package/dist/assets/{WorkflowExecutionsPreview-CHu6M3Dh.css → WorkflowExecutionsPreview-D7jTJ8GL.css} +16 -48
- package/dist/assets/{WorkflowExecutionsView-BAojAjIM.js → WorkflowExecutionsView-BwB6WS6M.js} +11 -17
- package/dist/assets/{WorkflowHistory-Bj5_YFN8.js → WorkflowHistory-U5a4aYts.js} +4 -4
- package/dist/assets/{WorkflowOnboardingView-D9peqUJs.js → WorkflowOnboardingView-DHUUTLOo.js} +1 -1
- package/dist/assets/{WorkflowPreview-gflk06YT.js → WorkflowPreview-D8pwehRe.js} +1 -1
- package/dist/assets/{WorkflowsView-CmgKYCQ6.js → WorkflowsView-DIh7kqZk.js} +10 -10
- package/dist/assets/chartjs.utils-DTEY3u-V.js +193 -0
- package/dist/assets/dateFormatter-C7xnNKzY.js +21 -0
- package/dist/assets/{easyAiWorkflowUtils-CLssJdgl.js → easyAiWorkflowUtils-V__OjFo9.js} +1 -1
- package/dist/assets/{global-link-actions-BphqczCY.js → global-link-actions-vGpWr9Uz.js} +1 -1
- package/dist/assets/{import-curl-C9KhAemD.js → import-curl-C6ERUxFe.js} +1 -1
- package/dist/assets/{index-C0DaAYgf.js → index-BrjPYODL.js} +3 -1
- package/dist/assets/{index-CkOV8f0Z.js → index-DD7Wuhk5.js} +9472 -3624
- package/dist/assets/{index-BaqhUIB7.css → index-DJ205bL0.css} +369 -44
- package/dist/assets/{pickBy-DUugkW7s.js → pickBy-BILEJ4hg.js} +1 -1
- package/dist/assets/{templateActions-Czp13jCM.js → templateActions-M3qRQiV6.js} +2 -7
- package/dist/assets/{useBeforeUnload-BBbiw-FV.js → useBeforeUnload-DTsj_abb.js} +1 -1
- package/dist/assets/{useCanvasMapping-Cla--atl.js → useCanvasMapping-DJvMRP2s.js} +6 -6
- package/dist/assets/{useCanvasOperations-FyzGfva5.js → useCanvasOperations-DCaSrD1N.js} +27 -256
- package/dist/assets/{useClearExecutionButtonVisible-fESJZE5R.js → useClearExecutionButtonVisible-CVPKhr9F.js} +2 -2
- package/dist/assets/{useExecutionDebugging-D4s4CdaL.js → useExecutionDebugging-yY2o_eNc.js} +1 -1
- package/dist/assets/{useExecutionHelpers-Bm91b8wb.js → useExecutionHelpers-BVY9xXbG.js} +2 -19
- package/dist/assets/{useImportCurlCommand-BPNuR5ZX.js → useImportCurlCommand-Chewi-_x.js} +2 -2
- package/dist/assets/{usePushConnection-BbQhNUm8.js → usePushConnection-9zsAnuvC.js} +3 -4
- package/dist/assets/{useTestDefinitionForm-ZJngcsSH.js → useTestDefinitionForm-CCVy0jKP.js} +1 -1
- package/dist/assets/{useWorkflowActivate-CkCvd-g6.js → useWorkflowActivate-DeEvbrsK.js} +1 -1
- package/dist/index.html +2 -2
- package/package.json +1 -1
- package/dist/assets/CollectionParameter-BD3jmKi_.js +0 -4
- package/dist/assets/InsightsSummary-CyilLKXz.js +0 -152
- package/dist/assets/pushConnection.store-Cb2TGyrZ.js +0 -238
- package/dist/assets/useRunWorkflow-DnbQqqcB.js +0 -527
|
@@ -1,527 +0,0 @@
|
|
|
1
|
-
import { bK as useHistoryStore, T as useWorkflowsStore, p as useSettingsStore, q as computed, bf as NodeConnectionTypes, dE as CanvasNodeDirtiness, dF as BulkCommand, dG as AddConnectionCommand, dH as RemoveConnectionCommand, dI as RemoveNodeCommand, dJ as AddNodeCommand, dK as EnableNodeToggleCommand, bw as useNodeHelpers, a6 as useWorkflowHelpers, a as useToast, a0 as useRootStore, L as useUIStore, au as useExecutionsStore, c as useI18n, bu as CHAT_TRIGGER_NODE_TYPE, bg as get, dL as SINGLE_WEBHOOK_TRIGGERS, dM as displayForm, aQ as useExternalHooks, dt as generateNodesGraph, ah as useTelemetry, dN as isEmpty } from "./index-CkOV8f0Z.js";
|
|
2
|
-
import { u as usePushConnectionStore } from "./pushConnection.store-Cb2TGyrZ.js";
|
|
3
|
-
function shouldCommandMarkDirty(command, nodeName, siblingCommands, getIncomingConnections, getOutgoingConnectors) {
|
|
4
|
-
if (command instanceof BulkCommand) {
|
|
5
|
-
return command.commands.some(
|
|
6
|
-
(cmd) => shouldCommandMarkDirty(
|
|
7
|
-
cmd,
|
|
8
|
-
nodeName,
|
|
9
|
-
command.commands,
|
|
10
|
-
getIncomingConnections,
|
|
11
|
-
getOutgoingConnectors
|
|
12
|
-
)
|
|
13
|
-
);
|
|
14
|
-
}
|
|
15
|
-
if (command instanceof AddConnectionCommand) {
|
|
16
|
-
return command.connectionData[1]?.node === nodeName;
|
|
17
|
-
}
|
|
18
|
-
if (command instanceof RemoveConnectionCommand) {
|
|
19
|
-
const [from, to] = command.connectionData;
|
|
20
|
-
if (to.node !== nodeName) {
|
|
21
|
-
return false;
|
|
22
|
-
}
|
|
23
|
-
return siblingCommands.some(
|
|
24
|
-
(sibling) => sibling instanceof RemoveNodeCommand && sibling.node.name === from.node
|
|
25
|
-
);
|
|
26
|
-
}
|
|
27
|
-
const incomingNodes = Object.values(getIncomingConnections(nodeName)).flat().flat().filter((connection) => connection !== null).map((connection) => connection.node);
|
|
28
|
-
if (command instanceof AddNodeCommand) {
|
|
29
|
-
return incomingNodes.includes(command.node.name);
|
|
30
|
-
}
|
|
31
|
-
if (command instanceof EnableNodeToggleCommand) {
|
|
32
|
-
return incomingNodes.includes(command.nodeName) && (command.newState || Object.keys(getOutgoingConnectors(command.nodeName)).some(
|
|
33
|
-
(type) => type !== NodeConnectionTypes.Main
|
|
34
|
-
));
|
|
35
|
-
}
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
function findLoop(nodeName, visited, getIncomingConnections) {
|
|
39
|
-
const index = visited.indexOf(nodeName);
|
|
40
|
-
if (index >= 0) {
|
|
41
|
-
return visited.slice(index);
|
|
42
|
-
}
|
|
43
|
-
const newVisited = [...visited, nodeName];
|
|
44
|
-
for (const [type, typeConnections] of Object.entries(getIncomingConnections(nodeName))) {
|
|
45
|
-
if (type !== NodeConnectionTypes.Main) {
|
|
46
|
-
continue;
|
|
47
|
-
}
|
|
48
|
-
for (const connections of typeConnections) {
|
|
49
|
-
for (const { node } of connections ?? []) {
|
|
50
|
-
const loop = findLoop(node, newVisited, getIncomingConnections);
|
|
51
|
-
if (loop) {
|
|
52
|
-
return loop;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
return void 0;
|
|
58
|
-
}
|
|
59
|
-
function useNodeDirtiness() {
|
|
60
|
-
const historyStore = useHistoryStore();
|
|
61
|
-
const workflowsStore = useWorkflowsStore();
|
|
62
|
-
const settingsStore = useSettingsStore();
|
|
63
|
-
function getParentSubNodes(nodeName) {
|
|
64
|
-
return Object.entries(workflowsStore.incomingConnectionsByNodeName(nodeName)).filter(([type]) => type !== NodeConnectionTypes.Main).flatMap(([, typeConnections]) => typeConnections.flat().filter((conn) => conn !== null));
|
|
65
|
-
}
|
|
66
|
-
function getDirtinessByParametersUpdate(nodeName, after) {
|
|
67
|
-
if ((workflowsStore.getParametersLastUpdate(nodeName) ?? 0) > after) {
|
|
68
|
-
return CanvasNodeDirtiness.PARAMETERS_UPDATED;
|
|
69
|
-
}
|
|
70
|
-
for (const connection of getParentSubNodes(nodeName)) {
|
|
71
|
-
if (getDirtinessByParametersUpdate(connection.node, after) !== void 0) {
|
|
72
|
-
return CanvasNodeDirtiness.UPSTREAM_DIRTY;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
return void 0;
|
|
76
|
-
}
|
|
77
|
-
function getDirtinessByConnectionsUpdate(nodeName, after) {
|
|
78
|
-
for (let i = historyStore.undoStack.length - 1; i >= 0; i--) {
|
|
79
|
-
const command = historyStore.undoStack[i];
|
|
80
|
-
if (command.getTimestamp() < after) {
|
|
81
|
-
break;
|
|
82
|
-
}
|
|
83
|
-
if (shouldCommandMarkDirty(
|
|
84
|
-
command,
|
|
85
|
-
nodeName,
|
|
86
|
-
[],
|
|
87
|
-
workflowsStore.incomingConnectionsByNodeName,
|
|
88
|
-
workflowsStore.outgoingConnectionsByNodeName
|
|
89
|
-
)) {
|
|
90
|
-
return CanvasNodeDirtiness.INCOMING_CONNECTIONS_UPDATED;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
for (const connection of getParentSubNodes(nodeName)) {
|
|
94
|
-
if (getDirtinessByConnectionsUpdate(connection.node, after) !== void 0) {
|
|
95
|
-
return CanvasNodeDirtiness.UPSTREAM_DIRTY;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
return void 0;
|
|
99
|
-
}
|
|
100
|
-
const depthByName = computed(() => {
|
|
101
|
-
const depth = {};
|
|
102
|
-
function setDepthRecursively(nodeName, current, visited) {
|
|
103
|
-
if (visited.has(nodeName)) {
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
const myVisited = new Set(visited);
|
|
107
|
-
myVisited.add(nodeName);
|
|
108
|
-
for (const [type, typeConnections] of Object.entries(
|
|
109
|
-
workflowsStore.outgoingConnectionsByNodeName(nodeName)
|
|
110
|
-
)) {
|
|
111
|
-
if (type !== NodeConnectionTypes.Main) {
|
|
112
|
-
continue;
|
|
113
|
-
}
|
|
114
|
-
for (const connections of typeConnections) {
|
|
115
|
-
for (const { node } of connections ?? []) {
|
|
116
|
-
if (!depth[node] || depth[node] > current) {
|
|
117
|
-
depth[node] = current;
|
|
118
|
-
}
|
|
119
|
-
setDepthRecursively(node, current + 1, myVisited);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
for (const startNode of workflowsStore.allNodes) {
|
|
125
|
-
const hasIncomingNode = Object.keys(workflowsStore.incomingConnectionsByNodeName(startNode.name)).length > 0;
|
|
126
|
-
if (hasIncomingNode) {
|
|
127
|
-
continue;
|
|
128
|
-
}
|
|
129
|
-
depth[startNode.name] = 0;
|
|
130
|
-
setDepthRecursively(startNode.name, 1, /* @__PURE__ */ new Set());
|
|
131
|
-
}
|
|
132
|
-
return depth;
|
|
133
|
-
});
|
|
134
|
-
const dirtinessByName = computed(() => {
|
|
135
|
-
if (settingsStore.partialExecutionVersion === 1) {
|
|
136
|
-
return {};
|
|
137
|
-
}
|
|
138
|
-
const dirtiness = {};
|
|
139
|
-
const runDataByNode = workflowsStore.getWorkflowRunData ?? {};
|
|
140
|
-
function setDirtiness(nodeName, value) {
|
|
141
|
-
dirtiness[nodeName] = dirtiness[nodeName] ?? value;
|
|
142
|
-
const loop = findLoop(nodeName, [], workflowsStore.incomingConnectionsByNodeName);
|
|
143
|
-
if (!loop) {
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
const loopEntryNodeName = [...loop].sort(
|
|
147
|
-
(a, b) => (depthByName.value[a] ?? Number.MAX_SAFE_INTEGER) - (depthByName.value[b] ?? Number.MAX_SAFE_INTEGER)
|
|
148
|
-
)?.[0];
|
|
149
|
-
if (loopEntryNodeName && depthByName.value[loopEntryNodeName]) {
|
|
150
|
-
dirtiness[loopEntryNodeName] = dirtiness[loopEntryNodeName] ?? CanvasNodeDirtiness.UPSTREAM_DIRTY;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
for (const [nodeName, runData] of Object.entries(runDataByNode)) {
|
|
154
|
-
const runAt = runData[0]?.startTime ?? 0;
|
|
155
|
-
if (!runAt) {
|
|
156
|
-
continue;
|
|
157
|
-
}
|
|
158
|
-
const parameterUpdate = getDirtinessByParametersUpdate(nodeName, runAt);
|
|
159
|
-
if (parameterUpdate) {
|
|
160
|
-
setDirtiness(nodeName, parameterUpdate);
|
|
161
|
-
continue;
|
|
162
|
-
}
|
|
163
|
-
const connectionUpdate = getDirtinessByConnectionsUpdate(nodeName, runAt);
|
|
164
|
-
if (connectionUpdate) {
|
|
165
|
-
setDirtiness(nodeName, connectionUpdate);
|
|
166
|
-
continue;
|
|
167
|
-
}
|
|
168
|
-
const hasInputPinnedDataChanged = Object.values(
|
|
169
|
-
workflowsStore.incomingConnectionsByNodeName(nodeName)
|
|
170
|
-
).flat().flat().filter((connection) => connection !== null).some((connection) => {
|
|
171
|
-
const pinnedDataLastUpdatedAt = workflowsStore.getPinnedDataLastUpdate(connection.node) ?? 0;
|
|
172
|
-
return pinnedDataLastUpdatedAt > runAt;
|
|
173
|
-
});
|
|
174
|
-
if (hasInputPinnedDataChanged) {
|
|
175
|
-
setDirtiness(nodeName, CanvasNodeDirtiness.PINNED_DATA_UPDATED);
|
|
176
|
-
continue;
|
|
177
|
-
}
|
|
178
|
-
const pinnedDataLastRemovedAt = workflowsStore.getPinnedDataLastRemovedAt(nodeName) ?? 0;
|
|
179
|
-
if (pinnedDataLastRemovedAt > runAt) {
|
|
180
|
-
setDirtiness(nodeName, CanvasNodeDirtiness.PINNED_DATA_UPDATED);
|
|
181
|
-
continue;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
return dirtiness;
|
|
185
|
-
});
|
|
186
|
-
return { dirtinessByName };
|
|
187
|
-
}
|
|
188
|
-
function useRunWorkflow(useRunWorkflowOpts) {
|
|
189
|
-
const nodeHelpers = useNodeHelpers();
|
|
190
|
-
const workflowHelpers = useWorkflowHelpers({ router: useRunWorkflowOpts.router });
|
|
191
|
-
const i18n = useI18n();
|
|
192
|
-
const toast = useToast();
|
|
193
|
-
const telemetry = useTelemetry();
|
|
194
|
-
const externalHooks = useExternalHooks();
|
|
195
|
-
const settingsStore = useSettingsStore();
|
|
196
|
-
const rootStore = useRootStore();
|
|
197
|
-
const pushConnectionStore = usePushConnectionStore();
|
|
198
|
-
const uiStore = useUIStore();
|
|
199
|
-
const workflowsStore = useWorkflowsStore();
|
|
200
|
-
const executionsStore = useExecutionsStore();
|
|
201
|
-
const { dirtinessByName } = useNodeDirtiness();
|
|
202
|
-
async function runWorkflowApi(runData) {
|
|
203
|
-
if (!pushConnectionStore.isConnected) {
|
|
204
|
-
throw new Error(i18n.baseText("workflowRun.noActiveConnectionToTheServer"));
|
|
205
|
-
}
|
|
206
|
-
workflowsStore.subWorkflowExecutionError = null;
|
|
207
|
-
uiStore.addActiveAction("workflowRunning");
|
|
208
|
-
let response;
|
|
209
|
-
try {
|
|
210
|
-
response = await workflowsStore.runWorkflow(runData);
|
|
211
|
-
} catch (error) {
|
|
212
|
-
uiStore.removeActiveAction("workflowRunning");
|
|
213
|
-
throw error;
|
|
214
|
-
}
|
|
215
|
-
if (response.executionId !== void 0) {
|
|
216
|
-
workflowsStore.activeExecutionId = response.executionId;
|
|
217
|
-
}
|
|
218
|
-
if (response.waitingForWebhook === true && useWorkflowsStore().nodesIssuesExist) {
|
|
219
|
-
uiStore.removeActiveAction("workflowRunning");
|
|
220
|
-
throw new Error(i18n.baseText("workflowRun.showError.resolveOutstandingIssues"));
|
|
221
|
-
}
|
|
222
|
-
if (response.waitingForWebhook === true) {
|
|
223
|
-
workflowsStore.executionWaitingForWebhook = true;
|
|
224
|
-
}
|
|
225
|
-
return response;
|
|
226
|
-
}
|
|
227
|
-
async function runWorkflow(options) {
|
|
228
|
-
const workflow = workflowHelpers.getCurrentWorkflow();
|
|
229
|
-
if (uiStore.isActionActive.workflowRunning) {
|
|
230
|
-
return;
|
|
231
|
-
}
|
|
232
|
-
toast.clearAllStickyNotifications();
|
|
233
|
-
try {
|
|
234
|
-
let directParentNodes = [];
|
|
235
|
-
if (options.destinationNode !== void 0) {
|
|
236
|
-
directParentNodes = workflow.getParentNodes(
|
|
237
|
-
options.destinationNode,
|
|
238
|
-
NodeConnectionTypes.Main,
|
|
239
|
-
-1
|
|
240
|
-
);
|
|
241
|
-
}
|
|
242
|
-
const runData = workflowsStore.getWorkflowRunData;
|
|
243
|
-
if (workflowsStore.isNewWorkflow) {
|
|
244
|
-
await workflowHelpers.saveCurrentWorkflow();
|
|
245
|
-
}
|
|
246
|
-
const workflowData = await workflowHelpers.getWorkflowDataToSave();
|
|
247
|
-
const consolidatedData = consolidateRunDataAndStartNodes(
|
|
248
|
-
directParentNodes,
|
|
249
|
-
runData,
|
|
250
|
-
workflowData.pinData,
|
|
251
|
-
workflow
|
|
252
|
-
);
|
|
253
|
-
const { startNodeNames } = consolidatedData;
|
|
254
|
-
const destinationNodeType = options.destinationNode ? workflowsStore.getNodeByName(options.destinationNode)?.type : "";
|
|
255
|
-
let { runData: newRunData } = consolidatedData;
|
|
256
|
-
let executedNode;
|
|
257
|
-
let triggerToStartFrom;
|
|
258
|
-
if (startNodeNames.length === 0 && "destinationNode" in options && options.destinationNode !== void 0) {
|
|
259
|
-
executedNode = options.destinationNode;
|
|
260
|
-
startNodeNames.push(options.destinationNode);
|
|
261
|
-
} else if (options.triggerNode && options.nodeData) {
|
|
262
|
-
startNodeNames.push(
|
|
263
|
-
...workflow.getChildNodes(options.triggerNode, NodeConnectionTypes.Main, 1)
|
|
264
|
-
);
|
|
265
|
-
newRunData = { [options.triggerNode]: [options.nodeData] };
|
|
266
|
-
executedNode = options.triggerNode;
|
|
267
|
-
}
|
|
268
|
-
if (options.triggerNode) {
|
|
269
|
-
triggerToStartFrom = {
|
|
270
|
-
name: options.triggerNode,
|
|
271
|
-
data: options.nodeData
|
|
272
|
-
};
|
|
273
|
-
}
|
|
274
|
-
if (options.destinationNode && (workflowsStore.checkIfNodeHasChatParent(options.destinationNode) || destinationNodeType === CHAT_TRIGGER_NODE_TYPE) && options.source !== "RunData.ManualChatMessage") {
|
|
275
|
-
const startNode = workflow.getStartNode(options.destinationNode);
|
|
276
|
-
if (startNode && startNode.type === CHAT_TRIGGER_NODE_TYPE) {
|
|
277
|
-
const chatHasInputData = nodeHelpers.getNodeInputData(startNode, 0, 0, "input")?.length > 0;
|
|
278
|
-
const chatHasPinData = !!workflowData.pinData?.[startNode.name];
|
|
279
|
-
if (!chatHasInputData && !chatHasPinData) {
|
|
280
|
-
workflowsStore.chatPartialExecutionDestinationNode = options.destinationNode;
|
|
281
|
-
workflowsStore.setPanelState("attached");
|
|
282
|
-
return;
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
const triggers = workflowData.nodes.filter(
|
|
287
|
-
(node) => node.type.toLowerCase().includes("trigger") && !node.disabled
|
|
288
|
-
);
|
|
289
|
-
if (!options.destinationNode && options.source !== "RunData.ManualChatMessage" && workflowData.nodes.some((node) => node.type === CHAT_TRIGGER_NODE_TYPE)) {
|
|
290
|
-
const otherTriggers = triggers.filter((node) => node.type !== CHAT_TRIGGER_NODE_TYPE);
|
|
291
|
-
if (otherTriggers.length) {
|
|
292
|
-
const chatTriggerNode = workflowData.nodes.find(
|
|
293
|
-
(node) => node.type === CHAT_TRIGGER_NODE_TYPE
|
|
294
|
-
);
|
|
295
|
-
if (chatTriggerNode) {
|
|
296
|
-
chatTriggerNode.disabled = true;
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
const isPartialExecution = options.destinationNode !== void 0;
|
|
301
|
-
const version = settingsStore.partialExecutionVersion;
|
|
302
|
-
const startNodes = startNodeNames.map((name) => {
|
|
303
|
-
let sourceData = get(runData, [name, 0, "source", 0], null);
|
|
304
|
-
if (sourceData === null) {
|
|
305
|
-
const parentNodes = workflow.getParentNodes(name, NodeConnectionTypes.Main, 1);
|
|
306
|
-
const executeData = workflowHelpers.executeData(
|
|
307
|
-
parentNodes,
|
|
308
|
-
name,
|
|
309
|
-
NodeConnectionTypes.Main,
|
|
310
|
-
0
|
|
311
|
-
);
|
|
312
|
-
sourceData = get(executeData, ["source", NodeConnectionTypes.Main, 0], null);
|
|
313
|
-
}
|
|
314
|
-
return {
|
|
315
|
-
name,
|
|
316
|
-
sourceData
|
|
317
|
-
};
|
|
318
|
-
});
|
|
319
|
-
const singleWebhookTrigger = triggers.find(
|
|
320
|
-
(node) => SINGLE_WEBHOOK_TRIGGERS.includes(node.type)
|
|
321
|
-
);
|
|
322
|
-
if (singleWebhookTrigger && workflowsStore.isWorkflowActive && !workflowData.pinData?.[singleWebhookTrigger.name]) {
|
|
323
|
-
toast.showMessage({
|
|
324
|
-
title: i18n.baseText("workflowRun.showError.deactivate"),
|
|
325
|
-
message: i18n.baseText("workflowRun.showError.productionActive", {
|
|
326
|
-
interpolate: { nodeName: singleWebhookTrigger.name }
|
|
327
|
-
}),
|
|
328
|
-
type: "error"
|
|
329
|
-
});
|
|
330
|
-
return void 0;
|
|
331
|
-
}
|
|
332
|
-
const startRunData = {
|
|
333
|
-
workflowData,
|
|
334
|
-
// With the new partial execution version the backend decides what run
|
|
335
|
-
// data to use and what to ignore.
|
|
336
|
-
runData: !isPartialExecution ? (
|
|
337
|
-
// if it's a full execution we don't want to send any run data
|
|
338
|
-
void 0
|
|
339
|
-
) : version === 2 ? (
|
|
340
|
-
// With the new partial execution version the backend decides
|
|
341
|
-
//what run data to use and what to ignore.
|
|
342
|
-
runData ?? void 0
|
|
343
|
-
) : (
|
|
344
|
-
// for v0 we send the run data the FE constructed
|
|
345
|
-
newRunData
|
|
346
|
-
),
|
|
347
|
-
startNodes,
|
|
348
|
-
triggerToStartFrom
|
|
349
|
-
};
|
|
350
|
-
if ("destinationNode" in options) {
|
|
351
|
-
startRunData.destinationNode = options.destinationNode;
|
|
352
|
-
}
|
|
353
|
-
if (startRunData.runData) {
|
|
354
|
-
const nodeNames = Object.entries(dirtinessByName.value).flatMap(
|
|
355
|
-
([nodeName, dirtiness]) => dirtiness ? [nodeName] : []
|
|
356
|
-
);
|
|
357
|
-
startRunData.dirtyNodeNames = nodeNames.length > 0 ? nodeNames : void 0;
|
|
358
|
-
}
|
|
359
|
-
const executionData = {
|
|
360
|
-
id: "__IN_PROGRESS__",
|
|
361
|
-
finished: false,
|
|
362
|
-
mode: "manual",
|
|
363
|
-
status: "running",
|
|
364
|
-
createdAt: /* @__PURE__ */ new Date(),
|
|
365
|
-
startedAt: /* @__PURE__ */ new Date(),
|
|
366
|
-
stoppedAt: void 0,
|
|
367
|
-
workflowId: workflow.id,
|
|
368
|
-
executedNode,
|
|
369
|
-
triggerNode: triggerToStartFrom?.name,
|
|
370
|
-
data: {
|
|
371
|
-
resultData: {
|
|
372
|
-
runData: startRunData.runData ?? {},
|
|
373
|
-
pinData: workflowData.pinData,
|
|
374
|
-
workflowData
|
|
375
|
-
}
|
|
376
|
-
},
|
|
377
|
-
workflowData: {
|
|
378
|
-
id: workflowsStore.workflowId,
|
|
379
|
-
name: workflowData.name,
|
|
380
|
-
active: workflowData.active,
|
|
381
|
-
createdAt: 0,
|
|
382
|
-
updatedAt: 0,
|
|
383
|
-
...workflowData
|
|
384
|
-
}
|
|
385
|
-
};
|
|
386
|
-
workflowsStore.setWorkflowExecutionData(executionData);
|
|
387
|
-
nodeHelpers.updateNodesExecutionIssues();
|
|
388
|
-
workflowHelpers.setDocumentTitle(workflow.name, "EXECUTING");
|
|
389
|
-
const runWorkflowApiResponse = await runWorkflowApi(startRunData);
|
|
390
|
-
const pinData = workflowData.pinData ?? {};
|
|
391
|
-
const getTestUrl = /* @__PURE__ */ (() => {
|
|
392
|
-
return (node) => {
|
|
393
|
-
const path = node.parameters.path || node.parameters.options?.path || node.webhookId;
|
|
394
|
-
return `${rootStore.formTestUrl}/${path}`;
|
|
395
|
-
};
|
|
396
|
-
})();
|
|
397
|
-
try {
|
|
398
|
-
displayForm({
|
|
399
|
-
nodes: workflowData.nodes,
|
|
400
|
-
runData: workflowsStore.getWorkflowExecution?.data?.resultData?.runData,
|
|
401
|
-
destinationNode: options.destinationNode,
|
|
402
|
-
triggerNode: options.triggerNode,
|
|
403
|
-
pinData,
|
|
404
|
-
directParentNodes,
|
|
405
|
-
source: options.source,
|
|
406
|
-
getTestUrl
|
|
407
|
-
});
|
|
408
|
-
} catch (error) {
|
|
409
|
-
}
|
|
410
|
-
await externalHooks.run("workflowRun.runWorkflow", {
|
|
411
|
-
nodeName: options.destinationNode,
|
|
412
|
-
source: options.source
|
|
413
|
-
});
|
|
414
|
-
return runWorkflowApiResponse;
|
|
415
|
-
} catch (error) {
|
|
416
|
-
workflowHelpers.setDocumentTitle(workflow.name, "ERROR");
|
|
417
|
-
toast.showError(error, i18n.baseText("workflowRun.showError.title"));
|
|
418
|
-
return void 0;
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
function consolidateRunDataAndStartNodes(directParentNodes, runData, pinData, workflow) {
|
|
422
|
-
const startNodeNames = /* @__PURE__ */ new Set();
|
|
423
|
-
let newRunData;
|
|
424
|
-
if (runData !== null && Object.keys(runData).length !== 0) {
|
|
425
|
-
newRunData = {};
|
|
426
|
-
for (const directParentNode of directParentNodes) {
|
|
427
|
-
const parentNodes = workflow.getParentNodes(directParentNode, NodeConnectionTypes.Main);
|
|
428
|
-
if (workflow.nodes[directParentNode].disabled) continue;
|
|
429
|
-
parentNodes.push(directParentNode);
|
|
430
|
-
for (const parentNode of parentNodes) {
|
|
431
|
-
if (!runData[parentNode]?.length && !pinData?.[parentNode]?.length || runData[parentNode]?.[0]?.error !== void 0) {
|
|
432
|
-
startNodeNames.add(parentNode);
|
|
433
|
-
break;
|
|
434
|
-
}
|
|
435
|
-
if (runData[parentNode] && !runData[parentNode]?.[0]?.error) {
|
|
436
|
-
newRunData[parentNode] = runData[parentNode]?.slice(0, 1);
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
if (isEmpty(newRunData)) {
|
|
441
|
-
newRunData = void 0;
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
return { runData: newRunData, startNodeNames: [...startNodeNames] };
|
|
445
|
-
}
|
|
446
|
-
async function stopCurrentExecution() {
|
|
447
|
-
const executionId = workflowsStore.activeExecutionId;
|
|
448
|
-
if (executionId === null) {
|
|
449
|
-
return;
|
|
450
|
-
}
|
|
451
|
-
try {
|
|
452
|
-
await executionsStore.stopCurrentExecution(executionId);
|
|
453
|
-
} catch (error) {
|
|
454
|
-
const execution = await workflowsStore.getExecution(executionId);
|
|
455
|
-
if (execution === void 0) {
|
|
456
|
-
toast.showMessage({
|
|
457
|
-
title: i18n.baseText("nodeView.showMessage.stopExecutionCatch.unsaved.title"),
|
|
458
|
-
message: i18n.baseText("nodeView.showMessage.stopExecutionCatch.unsaved.message"),
|
|
459
|
-
type: "success"
|
|
460
|
-
});
|
|
461
|
-
} else if (execution?.finished) {
|
|
462
|
-
const executedData = {
|
|
463
|
-
data: execution.data,
|
|
464
|
-
finished: execution.finished,
|
|
465
|
-
mode: execution.mode,
|
|
466
|
-
startedAt: execution.startedAt,
|
|
467
|
-
stoppedAt: execution.stoppedAt
|
|
468
|
-
};
|
|
469
|
-
workflowsStore.setWorkflowExecutionData(executedData);
|
|
470
|
-
toast.showMessage({
|
|
471
|
-
title: i18n.baseText("nodeView.showMessage.stopExecutionCatch.title"),
|
|
472
|
-
message: i18n.baseText("nodeView.showMessage.stopExecutionCatch.message"),
|
|
473
|
-
type: "success"
|
|
474
|
-
});
|
|
475
|
-
} else {
|
|
476
|
-
toast.showError(error, i18n.baseText("nodeView.showError.stopExecution.title"));
|
|
477
|
-
}
|
|
478
|
-
} finally {
|
|
479
|
-
for (let i = 0; i < 100; i++) {
|
|
480
|
-
if (workflowsStore.workflowExecutionData?.status !== "running") {
|
|
481
|
-
break;
|
|
482
|
-
}
|
|
483
|
-
await new Promise(requestAnimationFrame);
|
|
484
|
-
}
|
|
485
|
-
workflowsStore.markExecutionAsStopped();
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
async function stopWaitingForWebhook() {
|
|
489
|
-
try {
|
|
490
|
-
await workflowsStore.removeTestWebhook(workflowsStore.workflowId);
|
|
491
|
-
} catch (error) {
|
|
492
|
-
toast.showError(error, i18n.baseText("nodeView.showError.stopWaitingForWebhook.title"));
|
|
493
|
-
return;
|
|
494
|
-
}
|
|
495
|
-
}
|
|
496
|
-
async function runEntireWorkflow(source, triggerNode) {
|
|
497
|
-
const workflow = workflowHelpers.getCurrentWorkflow();
|
|
498
|
-
void workflowHelpers.getWorkflowDataToSave().then((workflowData) => {
|
|
499
|
-
const telemetryPayload = {
|
|
500
|
-
workflow_id: workflow.id,
|
|
501
|
-
node_graph_string: JSON.stringify(
|
|
502
|
-
generateNodesGraph(
|
|
503
|
-
workflowData,
|
|
504
|
-
workflowHelpers.getNodeTypes(),
|
|
505
|
-
{ isCloudDeployment: settingsStore.isCloudDeployment }
|
|
506
|
-
).nodeGraph
|
|
507
|
-
),
|
|
508
|
-
button_type: source
|
|
509
|
-
};
|
|
510
|
-
telemetry.track("User clicked execute workflow button", telemetryPayload);
|
|
511
|
-
void externalHooks.run("nodeView.onRunWorkflow", telemetryPayload);
|
|
512
|
-
});
|
|
513
|
-
void runWorkflow({ triggerNode });
|
|
514
|
-
}
|
|
515
|
-
return {
|
|
516
|
-
consolidateRunDataAndStartNodes,
|
|
517
|
-
runEntireWorkflow,
|
|
518
|
-
runWorkflow,
|
|
519
|
-
runWorkflowApi,
|
|
520
|
-
stopCurrentExecution,
|
|
521
|
-
stopWaitingForWebhook
|
|
522
|
-
};
|
|
523
|
-
}
|
|
524
|
-
export {
|
|
525
|
-
useNodeDirtiness as a,
|
|
526
|
-
useRunWorkflow as u
|
|
527
|
-
};
|