@burdenoff/fluidgrids-fe-sdk 2026.1102.3 → 2026.1103.2
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/{ExecutionDetailPage-XHII23QR.js → ExecutionDetailPage-JRBUIU5J.js} +9 -9
- package/dist/{ExecutionsListPage-GTCSYSC6.js → ExecutionsListPage-RC342VCZ.js} +5 -5
- package/dist/{WorkflowBuilder-ZIXEU7DQ.js → WorkflowBuilder-TCS4JELN.js} +10 -10
- package/dist/{WorkflowsList-NYSQEZWU.js → WorkflowsList-6ES2EDGZ.js} +6 -6
- package/dist/{agentTools-PA62A53S.js → agentTools-4JT66UQB.js} +3 -3
- package/dist/{chunk-JCHE4V55.js → chunk-52OIBKPO.js} +1 -1
- package/dist/{chunk-QAXP5HON.js → chunk-6WPW42TX.js} +1 -1
- package/dist/chunk-742OIXMP.js +18 -0
- package/dist/{chunk-B2DNUVKW.js → chunk-BP6YPKNK.js} +4 -4
- package/dist/{chunk-DLKGWGRN.js → chunk-BVCMAGLJ.js} +1 -1
- package/dist/{chunk-OR7KZZ2D.js → chunk-EKB3EIIC.js} +1 -1
- package/dist/{chunk-UETHT3KG.js → chunk-G2FPOWN5.js} +1 -1
- package/dist/{chunk-A4XNCGWT.js → chunk-H2KIJEYM.js} +1 -1
- package/dist/{chunk-7SY2SL5Y.js → chunk-ILPQAQB5.js} +5 -5
- package/dist/{chunk-ZTJX5ONT.js → chunk-K6HD5GC7.js} +2 -2
- package/dist/{chunk-MY752OLT.js → chunk-LTINUSLK.js} +49 -208
- package/dist/{chunk-XNVYPEBO.js → chunk-LVTOWRAM.js} +2 -2
- package/dist/{chunk-7JLLH4YE.js → chunk-M23H4LSY.js} +3 -3
- package/dist/{chunk-OZCJHPMH.js → chunk-MY4HMUWU.js} +3 -3
- package/dist/{chunk-PBCBDSVA.js → chunk-N6XYVO7N.js} +1 -1
- package/dist/{chunk-3Y4266JL.js → chunk-OBWB73Y7.js} +1 -1
- package/dist/{chunk-EFOJEQDS.js → chunk-QXACKASD.js} +1 -1
- package/dist/{chunk-P6IRD5SA.js → chunk-RFOKJE3A.js} +8 -8
- package/dist/{chunk-YVOHCC7J.js → chunk-SHYDX2LO.js} +4 -4
- package/dist/{chunk-4FDMLKLL.js → chunk-SIVS3XSV.js} +1 -1
- package/dist/{chunk-W74MXVFX.js → chunk-SUIH376K.js} +1 -1
- package/dist/{chunk-CXNJKM4D.js → chunk-UH7JKPUF.js} +1 -1
- package/dist/{chunk-37BKVPO7.js → chunk-UMULDJCK.js} +5 -5
- package/dist/{chunk-BDBSRN2O.js → chunk-UW5GY6LQ.js} +9 -5
- package/dist/{chunk-A7QPQ6MO.js → chunk-VQZEGCRF.js} +1 -1
- package/dist/{chunk-6VODFT2Q.js → chunk-Y7BNGLRI.js} +4 -4
- package/dist/{chunk-TJ2PFY7I.js → chunk-Y7MQ3LYB.js} +1 -1
- package/dist/{chunk-23LYGZ27.js → chunk-YC76QFWZ.js} +353 -7
- package/dist/executions.js +10 -10
- package/dist/history.js +4 -4
- package/dist/index.js +38 -38
- package/dist/{node-detail-view-KET5DNEH.js → node-detail-view-CMQ7DUYM.js} +7 -7
- package/dist/observability.js +4 -4
- package/dist/{quick-config-panel-L6CTZQUG.js → quick-config-panel-NJ72QZPM.js} +4 -4
- package/dist/settings.js +5 -5
- package/dist/templates.js +9 -9
- package/dist/workflow-builder.js +11 -11
- package/dist/workflows-list.js +6 -6
- package/package.json +1 -1
- package/dist/chunk-OUYEMZT6.js +0 -185
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useAgentDefinitions, useAgentDefinitionList, useConnections, describeOperationError } from './chunk-
|
|
1
|
+
import { useAgentDefinitions, useAgentDefinitionList, useConnections, describeOperationError } from './chunk-YC76QFWZ.js';
|
|
2
2
|
import { useTr } from './chunk-UULVIT25.js';
|
|
3
3
|
import { useState, useCallback, useEffect } from 'react';
|
|
4
4
|
import { Icon } from '@iconify/react';
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { AgentsTab } from './chunk-
|
|
2
|
-
import { ActionPoliciesTab } from './chunk-
|
|
3
|
-
import { LogStreamingTab } from './chunk-
|
|
1
|
+
import { AgentsTab } from './chunk-VQZEGCRF.js';
|
|
2
|
+
import { ActionPoliciesTab } from './chunk-BVCMAGLJ.js';
|
|
3
|
+
import { LogStreamingTab } from './chunk-UH7JKPUF.js';
|
|
4
4
|
import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
|
|
5
|
-
import { useFlowStore, useFluidGridsFlag, FLUIDGRIDS_FLAGS, useSaveStatusStore, findSaveConflict, useDurableParityEnabled, throwIfResultError, describeOperationError, useConnections } from './chunk-
|
|
5
|
+
import { useFlowStore, useFluidGridsFlag, FLUIDGRIDS_FLAGS, useSaveStatusStore, findSaveConflict, useDurableParityEnabled, throwIfResultError, describeOperationError, useConnections } from './chunk-YC76QFWZ.js';
|
|
6
6
|
import { useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS } from './chunk-ZUVFD5KV.js';
|
|
7
7
|
import { getGlobalStoreClient } from './chunk-PXIFUMLA.js';
|
|
8
8
|
import { getFluidGridsConfig } from './chunk-6AMNEX2Y.js';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { structuredParameterType, parseParameterValue, liveInternalOperations, resolveNodeOperation, readDisplayOptions, getNodeDetail, useFlowStore, useNodeRegistryRevision, fieldsFromIO, pathToExpression, NODE_CONFIGS, resolveUiSpec, fieldsFromValue, declaredOutputFields, subscribeWorkflowSaved } from './chunk-
|
|
1
|
+
import { structuredParameterType, parseParameterValue, liveInternalOperations, resolveNodeOperation, readDisplayOptions, getNodeDetail, useFlowStore, useNodeRegistryRevision, fieldsFromIO, pathToExpression, NODE_CONFIGS, resolveUiSpec, fieldsFromValue, declaredOutputFields, subscribeWorkflowSaved } from './chunk-YC76QFWZ.js';
|
|
2
2
|
import { useBuilderReadOnly } from './chunk-OCJTTHTS.js';
|
|
3
3
|
import { EventRegistrationsDocument } from './chunk-JTQFBZTV.js';
|
|
4
4
|
import { useTr } from './chunk-UULVIT25.js';
|
|
@@ -23,7 +23,7 @@ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
|
23
23
|
import { toast } from 'sonner';
|
|
24
24
|
import { nodeCategoryColor, chartSeriesColor, chartSeriesIndex } from '@burdenoff/fe-libs/shared/utils';
|
|
25
25
|
import { gql } from '@apollo/client';
|
|
26
|
-
import { Textarea, Input, Button, Card, Dialog, DialogTrigger, DialogContent, DialogHeader, DialogTitle, DialogDescription, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuLabel, DropdownMenuItem, DropdownMenuSeparator } from '@burdenoff/fe-libs/ui';
|
|
26
|
+
import { Textarea, Input, Button, Card, Dialog, DialogTrigger, DialogContent, DialogHeader, DialogTitle, DialogDescription, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuLabel, DropdownMenuItem, DropdownMenuSeparator, AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel } from '@burdenoff/fe-libs/ui';
|
|
27
27
|
import * as AdaptiveCards from 'adaptivecards';
|
|
28
28
|
import { formatDistanceToNow } from 'date-fns';
|
|
29
29
|
import { ProviderIcon, ConnectionDialog } from '@burdenoff/fe-libs/connections';
|
|
@@ -33,6 +33,7 @@ import { useEventBus } from '@burdenoff/fe-libs/shared/events';
|
|
|
33
33
|
import { ApolloProvider } from '@apollo/client/react';
|
|
34
34
|
import { useShallow } from 'zustand/shallow';
|
|
35
35
|
import { InfoCircledIcon } from '@radix-ui/react-icons';
|
|
36
|
+
import { Button as Button$1 } from '@burdenoff/fe-libs/button';
|
|
36
37
|
|
|
37
38
|
// src/feature-flags/durable-nodes.ts
|
|
38
39
|
var DURABLE_FUNCTION_NODE_TYPES = /* @__PURE__ */ new Set([
|
|
@@ -8674,6 +8675,348 @@ function useNodeExecution() {
|
|
|
8674
8675
|
findTriggerNode
|
|
8675
8676
|
};
|
|
8676
8677
|
}
|
|
8678
|
+
function findEdges(node, connectedEdges) {
|
|
8679
|
+
const outgoingEdges = connectedEdges.filter(
|
|
8680
|
+
(edge) => edge.source === node.id
|
|
8681
|
+
);
|
|
8682
|
+
const incomingEdges = connectedEdges.filter(
|
|
8683
|
+
(edge) => edge.target === node.id
|
|
8684
|
+
);
|
|
8685
|
+
return { outgoingEdges, incomingEdges };
|
|
8686
|
+
}
|
|
8687
|
+
function checkFlowTerminalNode(outgoingEdges, incomingEdges, isTrigger, type) {
|
|
8688
|
+
if (isTrigger) {
|
|
8689
|
+
return outgoingEdges.length >= 1;
|
|
8690
|
+
}
|
|
8691
|
+
switch (type) {
|
|
8692
|
+
case "end" /* END */:
|
|
8693
|
+
return incomingEdges.length >= 1;
|
|
8694
|
+
default:
|
|
8695
|
+
return false;
|
|
8696
|
+
}
|
|
8697
|
+
}
|
|
8698
|
+
function checkLoneNode(outgoingEdges, incomingEdges, isTrigger) {
|
|
8699
|
+
if (isTrigger) {
|
|
8700
|
+
return outgoingEdges.length === 0;
|
|
8701
|
+
}
|
|
8702
|
+
return incomingEdges.length === 0;
|
|
8703
|
+
}
|
|
8704
|
+
function isFlowComplete(nodes, edges) {
|
|
8705
|
+
const connectedEdges = getConnectedEdges(nodes, edges);
|
|
8706
|
+
let isTriggerConnected = false;
|
|
8707
|
+
let hasTriggerNode = false;
|
|
8708
|
+
let hasEndNode = false;
|
|
8709
|
+
let isEndConnected = false;
|
|
8710
|
+
const nodesWithEmptyTarget = [];
|
|
8711
|
+
for (const node of nodes) {
|
|
8712
|
+
if (node.type === STICKY_NOTE_TYPE) continue;
|
|
8713
|
+
const { outgoingEdges, incomingEdges } = findEdges(node, connectedEdges);
|
|
8714
|
+
const isTrigger = isNodeTrigger(node);
|
|
8715
|
+
if (isTrigger) {
|
|
8716
|
+
hasTriggerNode = true;
|
|
8717
|
+
if (checkFlowTerminalNode(
|
|
8718
|
+
outgoingEdges,
|
|
8719
|
+
incomingEdges,
|
|
8720
|
+
true,
|
|
8721
|
+
node.type
|
|
8722
|
+
)) {
|
|
8723
|
+
isTriggerConnected = true;
|
|
8724
|
+
}
|
|
8725
|
+
} else if (node.type === "end" /* END */) {
|
|
8726
|
+
hasEndNode = true;
|
|
8727
|
+
isEndConnected = checkFlowTerminalNode(
|
|
8728
|
+
outgoingEdges,
|
|
8729
|
+
incomingEdges,
|
|
8730
|
+
false,
|
|
8731
|
+
"end" /* END */
|
|
8732
|
+
);
|
|
8733
|
+
}
|
|
8734
|
+
if (checkLoneNode(outgoingEdges, incomingEdges, isTrigger))
|
|
8735
|
+
nodesWithEmptyTarget.push(node);
|
|
8736
|
+
}
|
|
8737
|
+
const hasAnyLoneNode = nodesWithEmptyTarget.length > 0;
|
|
8738
|
+
const isEndValid = !hasEndNode || isEndConnected;
|
|
8739
|
+
return hasTriggerNode && isTriggerConnected && isEndValid && !hasAnyLoneNode;
|
|
8740
|
+
}
|
|
8741
|
+
function useFlowValidator(onValidate) {
|
|
8742
|
+
const [isValidating, setIsValidating] = useState(false);
|
|
8743
|
+
const { getNodes, getEdges } = useReactFlow();
|
|
8744
|
+
const validate = useCallback(async () => {
|
|
8745
|
+
setIsValidating(true);
|
|
8746
|
+
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
8747
|
+
onValidate?.(isFlowComplete(getNodes(), getEdges()));
|
|
8748
|
+
setIsValidating(false);
|
|
8749
|
+
}, [getNodes, getEdges, onValidate]);
|
|
8750
|
+
return [isValidating, validate];
|
|
8751
|
+
}
|
|
8752
|
+
|
|
8753
|
+
// src/builder/lib/save-guards.ts
|
|
8754
|
+
function editingLeaseLocked() {
|
|
8755
|
+
return isLocked(useEditLeaseStore.getState().phase);
|
|
8756
|
+
}
|
|
8757
|
+
function autosaveAllowedFor(workflow) {
|
|
8758
|
+
return useSaveStatusStore.getState().autosaveEnabled && canAutosave(workflow);
|
|
8759
|
+
}
|
|
8760
|
+
function editStateFor(state) {
|
|
8761
|
+
return editStateOf(
|
|
8762
|
+
useSaveStatusStore.getState().baseline,
|
|
8763
|
+
{
|
|
8764
|
+
fingerprint: workflowFingerprint(state.workflow),
|
|
8765
|
+
generation: state.loadGeneration,
|
|
8766
|
+
editRevision: state.editRevision
|
|
8767
|
+
},
|
|
8768
|
+
Date.now()
|
|
8769
|
+
);
|
|
8770
|
+
}
|
|
8771
|
+
function departingSave(state) {
|
|
8772
|
+
const status = useSaveStatusStore.getState();
|
|
8773
|
+
if (status.autosavePaused || editingLeaseLocked()) return null;
|
|
8774
|
+
if (editStateFor(state) !== "dirty") return null;
|
|
8775
|
+
if (!autosaveAllowedFor(state.workflow)) return null;
|
|
8776
|
+
const { nodes, edges } = state.workflow;
|
|
8777
|
+
if (!isFlowComplete(nodes, edges)) return null;
|
|
8778
|
+
return snapshotForSave(state.workflow, state.loadGeneration);
|
|
8779
|
+
}
|
|
8780
|
+
function touchesSavedFields(state, previous) {
|
|
8781
|
+
return state.workflow.nodes !== previous.workflow.nodes || state.workflow.edges !== previous.workflow.edges || state.workflow.name !== previous.workflow.name || state.workflow.alias !== previous.workflow.alias || state.workflow.status !== previous.workflow.status || state.loadGeneration !== previous.loadGeneration;
|
|
8782
|
+
}
|
|
8783
|
+
function unsavedState() {
|
|
8784
|
+
const flow = useFlowStore.getState();
|
|
8785
|
+
const status = useSaveStatusStore.getState();
|
|
8786
|
+
return {
|
|
8787
|
+
// Checked fresh: the dirty flag trails the last edit by a moment.
|
|
8788
|
+
dirty: status.dirty || editStateFor(flow) === "dirty",
|
|
8789
|
+
// A paused autosave (a refused save), or a page someone else is editing
|
|
8790
|
+
// from, does not save on the way out either.
|
|
8791
|
+
autosaveAllowed: autosaveAllowedFor(flow.workflow) && !status.autosavePaused && !editingLeaseLocked(),
|
|
8792
|
+
incomplete: status.incomplete || !isFlowComplete(flow.workflow.nodes, flow.workflow.edges),
|
|
8793
|
+
failed: status.failure !== null
|
|
8794
|
+
};
|
|
8795
|
+
}
|
|
8796
|
+
function leavingLosesChanges() {
|
|
8797
|
+
return leaveNeedsConfirmation(unsavedState());
|
|
8798
|
+
}
|
|
8799
|
+
function runPreparation() {
|
|
8800
|
+
return runPreparationOf(unsavedState());
|
|
8801
|
+
}
|
|
8802
|
+
function savedEverythingBeforeLeaving() {
|
|
8803
|
+
return editStateFor(useFlowStore.getState()) !== "dirty";
|
|
8804
|
+
}
|
|
8805
|
+
function watchLeavingLosesChanges(onChange, delayMs) {
|
|
8806
|
+
let current;
|
|
8807
|
+
let timer;
|
|
8808
|
+
const report = (losesChanges) => {
|
|
8809
|
+
if (losesChanges === current) return;
|
|
8810
|
+
current = losesChanges;
|
|
8811
|
+
onChange(losesChanges);
|
|
8812
|
+
};
|
|
8813
|
+
const settle = () => {
|
|
8814
|
+
timer = void 0;
|
|
8815
|
+
report(leavingLosesChanges());
|
|
8816
|
+
};
|
|
8817
|
+
const settleLater = () => {
|
|
8818
|
+
if (timer) clearTimeout(timer);
|
|
8819
|
+
timer = setTimeout(settle, delayMs);
|
|
8820
|
+
};
|
|
8821
|
+
const settleNow = () => {
|
|
8822
|
+
if (timer) clearTimeout(timer);
|
|
8823
|
+
settle();
|
|
8824
|
+
};
|
|
8825
|
+
settle();
|
|
8826
|
+
const unsubscribeFlow = useFlowStore.subscribe((state, previous) => {
|
|
8827
|
+
if (!touchesSavedFields(state, previous)) return;
|
|
8828
|
+
if (state.loadGeneration === previous.loadGeneration) report(true);
|
|
8829
|
+
settleLater();
|
|
8830
|
+
});
|
|
8831
|
+
const unsubscribeStatus = useSaveStatusStore.subscribe(settleLater);
|
|
8832
|
+
const unsubscribeLease = useEditLeaseStore.subscribe((state, previous) => {
|
|
8833
|
+
if (isLocked(state.phase) !== isLocked(previous.phase)) settleNow();
|
|
8834
|
+
});
|
|
8835
|
+
return () => {
|
|
8836
|
+
unsubscribeFlow();
|
|
8837
|
+
unsubscribeStatus();
|
|
8838
|
+
unsubscribeLease();
|
|
8839
|
+
if (timer) clearTimeout(timer);
|
|
8840
|
+
};
|
|
8841
|
+
}
|
|
8842
|
+
|
|
8843
|
+
// src/builder/hooks/use-builder-save.ts
|
|
8844
|
+
function useManualSave() {
|
|
8845
|
+
const tr = useTr();
|
|
8846
|
+
const { saveToBackend } = useSaveWorkflow();
|
|
8847
|
+
return useCallback(async () => {
|
|
8848
|
+
const { nodes, edges } = useFlowStore.getState().workflow;
|
|
8849
|
+
if (!isFlowComplete(nodes, edges)) {
|
|
8850
|
+
toast.error(
|
|
8851
|
+
tr(
|
|
8852
|
+
"fluidgrids.builder.saveFlowButton.invalidToastTitle",
|
|
8853
|
+
"Flow is invalid"
|
|
8854
|
+
),
|
|
8855
|
+
{
|
|
8856
|
+
description: tr(
|
|
8857
|
+
"fluidgrids.builder.saveFlowButton.invalidToastDescription",
|
|
8858
|
+
"Please check if the flow is complete and has no lone nodes"
|
|
8859
|
+
)
|
|
8860
|
+
}
|
|
8861
|
+
);
|
|
8862
|
+
return false;
|
|
8863
|
+
}
|
|
8864
|
+
return saveToBackend();
|
|
8865
|
+
}, [saveToBackend, tr]);
|
|
8866
|
+
}
|
|
8867
|
+
function useGuardedNavigate() {
|
|
8868
|
+
const navigate = useNavigate();
|
|
8869
|
+
return useCallback(
|
|
8870
|
+
(to, options) => {
|
|
8871
|
+
if (leavingLosesChanges()) {
|
|
8872
|
+
useSaveStatusStore.getState().actions.requestLeave({ to, options });
|
|
8873
|
+
return;
|
|
8874
|
+
}
|
|
8875
|
+
navigate(to, options);
|
|
8876
|
+
},
|
|
8877
|
+
[navigate]
|
|
8878
|
+
);
|
|
8879
|
+
}
|
|
8880
|
+
function useRunGuard(startRun) {
|
|
8881
|
+
const { saveToBackend } = useSaveWorkflow();
|
|
8882
|
+
const [confirmOpen, setConfirmOpen] = useState(false);
|
|
8883
|
+
const [preparing, setPreparing] = useState(false);
|
|
8884
|
+
const requestRun = useCallback(async () => {
|
|
8885
|
+
const preparation = runPreparation();
|
|
8886
|
+
if (preparation === "run") {
|
|
8887
|
+
startRun();
|
|
8888
|
+
return;
|
|
8889
|
+
}
|
|
8890
|
+
if (preparation === "save-first") {
|
|
8891
|
+
setPreparing(true);
|
|
8892
|
+
let saved = false;
|
|
8893
|
+
try {
|
|
8894
|
+
saved = await saveToBackend({ silent: true }) && savedEverythingBeforeLeaving();
|
|
8895
|
+
} finally {
|
|
8896
|
+
setPreparing(false);
|
|
8897
|
+
}
|
|
8898
|
+
if (saved) {
|
|
8899
|
+
startRun();
|
|
8900
|
+
return;
|
|
8901
|
+
}
|
|
8902
|
+
}
|
|
8903
|
+
setConfirmOpen(true);
|
|
8904
|
+
}, [saveToBackend, startRun]);
|
|
8905
|
+
const dialog = /* @__PURE__ */ jsx(
|
|
8906
|
+
UnsavedRunDialog,
|
|
8907
|
+
{
|
|
8908
|
+
open: confirmOpen,
|
|
8909
|
+
onOpenChange: setConfirmOpen,
|
|
8910
|
+
onRunSaved: () => {
|
|
8911
|
+
setConfirmOpen(false);
|
|
8912
|
+
startRun();
|
|
8913
|
+
},
|
|
8914
|
+
onSavedAndRunnable: () => {
|
|
8915
|
+
setConfirmOpen(false);
|
|
8916
|
+
startRun();
|
|
8917
|
+
}
|
|
8918
|
+
}
|
|
8919
|
+
);
|
|
8920
|
+
return { requestRun, preparing, dialog };
|
|
8921
|
+
}
|
|
8922
|
+
function UnsavedRunDialog({
|
|
8923
|
+
open,
|
|
8924
|
+
onOpenChange,
|
|
8925
|
+
onRunSaved,
|
|
8926
|
+
onSavedAndRunnable
|
|
8927
|
+
}) {
|
|
8928
|
+
const tr = useTr();
|
|
8929
|
+
const manualSave = useManualSave();
|
|
8930
|
+
const [version, dbId, status, codeBuildId] = useFlowStore(
|
|
8931
|
+
useShallow((s) => [
|
|
8932
|
+
s.workflow.version,
|
|
8933
|
+
s.workflow.dbId,
|
|
8934
|
+
s.workflow.status,
|
|
8935
|
+
s.workflow.codeBuildId
|
|
8936
|
+
])
|
|
8937
|
+
);
|
|
8938
|
+
const [saving, setSaving] = useState(false);
|
|
8939
|
+
const hasSavedVersion = !!dbId;
|
|
8940
|
+
const runsAfterSave = !hasSavedVersion || savesInPlace({ dbId, status, codeBuildId });
|
|
8941
|
+
const save = useCallback(async () => {
|
|
8942
|
+
setSaving(true);
|
|
8943
|
+
try {
|
|
8944
|
+
const saved = await manualSave();
|
|
8945
|
+
if (!saved) return;
|
|
8946
|
+
if (!runsAfterSave) {
|
|
8947
|
+
onOpenChange(false);
|
|
8948
|
+
return;
|
|
8949
|
+
}
|
|
8950
|
+
if (savedEverythingBeforeLeaving()) onSavedAndRunnable();
|
|
8951
|
+
} finally {
|
|
8952
|
+
setSaving(false);
|
|
8953
|
+
}
|
|
8954
|
+
}, [runsAfterSave, manualSave, onOpenChange, onSavedAndRunnable]);
|
|
8955
|
+
return /* @__PURE__ */ jsx(
|
|
8956
|
+
AlertDialog,
|
|
8957
|
+
{
|
|
8958
|
+
open,
|
|
8959
|
+
onOpenChange: (next) => {
|
|
8960
|
+
if (!next && saving) return;
|
|
8961
|
+
onOpenChange(next);
|
|
8962
|
+
},
|
|
8963
|
+
children: /* @__PURE__ */ jsxs(AlertDialogContent, { "data-testid": "fluidgrids-unsaved-run-dialog", children: [
|
|
8964
|
+
/* @__PURE__ */ jsxs(AlertDialogHeader, { children: [
|
|
8965
|
+
/* @__PURE__ */ jsx(AlertDialogTitle, { children: tr(
|
|
8966
|
+
"fluidgrids.builder.runGuard.title",
|
|
8967
|
+
"Run without your unsaved changes?"
|
|
8968
|
+
) }),
|
|
8969
|
+
/* @__PURE__ */ jsxs(AlertDialogDescription, { children: [
|
|
8970
|
+
hasSavedVersion ? tr(
|
|
8971
|
+
"fluidgrids.builder.runGuard.description",
|
|
8972
|
+
"This workflow has changes that are not saved. A run uses the saved version {{version}}, without them.",
|
|
8973
|
+
{ version }
|
|
8974
|
+
) : tr(
|
|
8975
|
+
"fluidgrids.builder.runGuard.descriptionNotSaved",
|
|
8976
|
+
"This workflow has not been saved yet. Save it before you run it."
|
|
8977
|
+
),
|
|
8978
|
+
" ",
|
|
8979
|
+
runsAfterSave ? null : tr(
|
|
8980
|
+
"fluidgrids.builder.runGuard.newVersionHint",
|
|
8981
|
+
"Saving keeps your changes as a new version and opens it; run that version."
|
|
8982
|
+
)
|
|
8983
|
+
] })
|
|
8984
|
+
] }),
|
|
8985
|
+
/* @__PURE__ */ jsxs(AlertDialogFooter, { children: [
|
|
8986
|
+
/* @__PURE__ */ jsx(AlertDialogCancel, { disabled: saving, children: tr("fluidgrids.builder.runGuard.cancelButton", "Cancel") }),
|
|
8987
|
+
hasSavedVersion && /* @__PURE__ */ jsx(
|
|
8988
|
+
Button$1,
|
|
8989
|
+
{
|
|
8990
|
+
"data-agent": "confirm",
|
|
8991
|
+
variant: "outline",
|
|
8992
|
+
onClick: onRunSaved,
|
|
8993
|
+
disabled: saving,
|
|
8994
|
+
children: tr(
|
|
8995
|
+
"fluidgrids.builder.runGuard.runSavedButton",
|
|
8996
|
+
"Run saved version"
|
|
8997
|
+
)
|
|
8998
|
+
}
|
|
8999
|
+
),
|
|
9000
|
+
/* @__PURE__ */ jsx(
|
|
9001
|
+
Button$1,
|
|
9002
|
+
{
|
|
9003
|
+
"data-agent": "confirm",
|
|
9004
|
+
onClick: () => void save(),
|
|
9005
|
+
disabled: saving,
|
|
9006
|
+
children: saving ? tr("fluidgrids.builder.runGuard.savingButton", "Saving\u2026") : runsAfterSave ? tr(
|
|
9007
|
+
"fluidgrids.builder.runGuard.saveAndRunButton",
|
|
9008
|
+
"Save and run"
|
|
9009
|
+
) : tr(
|
|
9010
|
+
"fluidgrids.builder.runGuard.saveAsNewVersionButton",
|
|
9011
|
+
"Save as new version"
|
|
9012
|
+
)
|
|
9013
|
+
}
|
|
9014
|
+
)
|
|
9015
|
+
] })
|
|
9016
|
+
] })
|
|
9017
|
+
}
|
|
9018
|
+
);
|
|
9019
|
+
}
|
|
8677
9020
|
function buildOperationSeed(type, operationName, existingData) {
|
|
8678
9021
|
const config = NODE_CONFIGS.find((c) => c.type === type);
|
|
8679
9022
|
if (!config) return null;
|
|
@@ -9266,6 +9609,7 @@ var getNodeMetadata = (value) => {
|
|
|
9266
9609
|
console.error("[NodeComponent] Execute step error:", error);
|
|
9267
9610
|
});
|
|
9268
9611
|
}, [executeStep, id]);
|
|
9612
|
+
const stepGuard = useRunGuard(handleExecuteStep);
|
|
9269
9613
|
const missingCredentials = useMemo(() => {
|
|
9270
9614
|
const visibleAdapters = getVisibleConnectionAdapters(
|
|
9271
9615
|
String(value?.type ?? ""),
|
|
@@ -9345,14 +9689,14 @@ var getNodeMetadata = (value) => {
|
|
|
9345
9689
|
executionStatus,
|
|
9346
9690
|
itemCount,
|
|
9347
9691
|
isTrigger,
|
|
9348
|
-
isExecuting: isThisNodeExecuting,
|
|
9692
|
+
isExecuting: isThisNodeExecuting || stepGuard.preparing,
|
|
9349
9693
|
inputHandles,
|
|
9350
9694
|
outputHandles,
|
|
9351
9695
|
isConnectable: typeof isConnectable === "boolean" ? isConnectable : void 0,
|
|
9352
9696
|
onClick: handleCardClick,
|
|
9353
9697
|
onDoubleClick: handleOpenNdv,
|
|
9354
9698
|
onSettings: handleOpenNdv,
|
|
9355
|
-
onExecute:
|
|
9699
|
+
onExecute: () => void stepGuard.requestRun(),
|
|
9356
9700
|
onDelete: readOnly ? void 0 : handleDeleteNode,
|
|
9357
9701
|
infoButton: /* @__PURE__ */ jsx(NodeInfoButtonWithModal, { metadata: nodeInfoMetadata }),
|
|
9358
9702
|
disabled: isDisabled,
|
|
@@ -9369,7 +9713,8 @@ var getNodeMetadata = (value) => {
|
|
|
9369
9713
|
nodeId: id,
|
|
9370
9714
|
adapters: data?.nodeData?.nodeAdapters
|
|
9371
9715
|
}
|
|
9372
|
-
)
|
|
9716
|
+
),
|
|
9717
|
+
stepGuard.dialog
|
|
9373
9718
|
] });
|
|
9374
9719
|
}
|
|
9375
9720
|
return /* @__PURE__ */ jsxs("div", { children: [
|
|
@@ -9384,9 +9729,9 @@ var getNodeMetadata = (value) => {
|
|
|
9384
9729
|
itemCount,
|
|
9385
9730
|
isTrigger,
|
|
9386
9731
|
accent: roleAccent,
|
|
9387
|
-
isExecuting: isThisNodeExecuting,
|
|
9732
|
+
isExecuting: isThisNodeExecuting || stepGuard.preparing,
|
|
9388
9733
|
onSettings: handleOpenNdv,
|
|
9389
|
-
onExecute:
|
|
9734
|
+
onExecute: () => void stepGuard.requestRun(),
|
|
9390
9735
|
onDelete: readOnly ? void 0 : handleDeleteNode,
|
|
9391
9736
|
infoButton: /* @__PURE__ */ jsx(NodeInfoButtonWithModal, { metadata: nodeInfoMetadata }),
|
|
9392
9737
|
disabled: isDisabled,
|
|
@@ -9441,6 +9786,7 @@ var getNodeMetadata = (value) => {
|
|
|
9441
9786
|
]
|
|
9442
9787
|
}
|
|
9443
9788
|
),
|
|
9789
|
+
stepGuard.dialog,
|
|
9444
9790
|
/* @__PURE__ */ jsx(
|
|
9445
9791
|
AdapterConnectors,
|
|
9446
9792
|
{
|
|
@@ -9791,4 +10137,4 @@ function createNodeWithDefaultData(type, data) {
|
|
|
9791
10137
|
return Object.assign(createNodeData(type, defaultData), data);
|
|
9792
10138
|
}
|
|
9793
10139
|
|
|
9794
|
-
export { AUTOSAVE_DEBOUNCE_MS, AUTOSAVE_RETRY_DELAYS_MS, AVAILABLE_NODES, BILLING_PLANS_PATH, CODE_WORKFLOW_NODE_TYPE, ConnectionFormDialog, ConnectionSelector, DURABLE_FUNCTION_NODE_TYPES, EDIT_SESSION_ID, ExpressionEditor, FLUIDGRIDS_FLAGS, FLUIDGRIDS_FLAG_DEFAULTS, FluidGridsContext, FluidGridsProvider, NODES, NODES_METADATA, NODE_CONFIGS, NODE_OPERATION_DRAG_DATA_FORMAT, NODE_TYPES, NODE_TYPE_DRAG_DATA_FORMAT, NodePropertyPanel, NodeTypeIcon, PHASE_C_FLAGS_OFF, RUNS_QUOTA_NAME, RUN_CONTROL_NODE_TYPES, STICKY_NOTE_TYPE, WORKFLOWS_QUOTA_NAME, WORKFLOW_TEST_NODE_TYPES, bannerOf, blankWorkflowCreateInput, buildOperationSeed, buildStickyNode, builderPathOf, canAutosave, canRenderOperationPanel, canSignalRun, changedSourceFiles, childRunIdOf, classifyCreateRefusal, clearCodeWorkflowDefinitionCache, codeBuildIdOf, components_default, createConfiguredNode, createThenOpen, declaredOutputFields, declaredSignals, defaultSourcePath, describeOperationError, diagnosticsByPath,
|
|
10140
|
+
export { AUTOSAVE_DEBOUNCE_MS, AUTOSAVE_RETRY_DELAYS_MS, AVAILABLE_NODES, BILLING_PLANS_PATH, CODE_WORKFLOW_NODE_TYPE, ConnectionFormDialog, ConnectionSelector, DURABLE_FUNCTION_NODE_TYPES, EDIT_SESSION_ID, ExpressionEditor, FLUIDGRIDS_FLAGS, FLUIDGRIDS_FLAG_DEFAULTS, FluidGridsContext, FluidGridsProvider, NODES, NODES_METADATA, NODE_CONFIGS, NODE_OPERATION_DRAG_DATA_FORMAT, NODE_TYPES, NODE_TYPE_DRAG_DATA_FORMAT, NodePropertyPanel, NodeTypeIcon, PHASE_C_FLAGS_OFF, RUNS_QUOTA_NAME, RUN_CONTROL_NODE_TYPES, STICKY_NOTE_TYPE, WORKFLOWS_QUOTA_NAME, WORKFLOW_TEST_NODE_TYPES, autosaveAllowedFor, bannerOf, blankWorkflowCreateInput, buildOperationSeed, buildStickyNode, builderPathOf, canAutosave, canRenderOperationPanel, canSignalRun, changedSourceFiles, childRunIdOf, classifyCreateRefusal, clearCodeWorkflowDefinitionCache, codeBuildIdOf, components_default, createConfiguredNode, createThenOpen, declaredOutputFields, declaredSignals, defaultSourcePath, departingSave, describeOperationError, diagnosticsByPath, editStateFor, editingLeaseLocked, emitNodeInstalled, emitRunFailed, emitRunLimitHit, emitRunStarted, emitTemplateUsed, emitUpgradeClicked, emitWorkflowCreated, emitWorkflowLimitHit, emitWorkflowPublished, ensureNodeConfigsLoaded, fieldsFromIO, fieldsFromValue, filterPaletteNodes, findQuotaRefusal, findSaveConflict, forgetSessionForReload, formatParameterValue, getNodeDetail, getNodeMetadata, inAppLeaveTarget, interfaceFields, interfaceHandlers, isDurableFunctionNodeType, isEditableSourcePath, isFlowComplete, isForbiddenError, isImageIcon, isLocked, isNodeConfigsInitialized, isNodeTypeHiddenFromPalette, isParamVisible, isQuotaExhaustedFailure, isRunControlNodeType, isTriggerOperation, leaseCallQueue, leavingLosesChanges, listCustomBlocks, liveInternalOperations, loadDefinitionJson, mergeStickyNotes, nodeAccent, nodesOf, onNodeTypesUpdate, openRunQuotaUpgradePrompt, parseParameterValue, parseRawSignalPayload, pathToExpression, payloadFromCardValues, phaseAfterAcquire, phaseAfterTakeOver, projectLanguage, readCodeWorkflowState, readDisplayOptions, refetchStoreNodes, registerCustomBlock, registerWorkflowNodeTypes, releasesOnClose, rememberOwnStatusChange, rememberRevision, rememberSessionForReload, resolveInputHandles, resolveNodeOperation, resolveOperationName, resolveOutputHandles, resolvePhaseCFlags, resolveUiSpec, runSignalTargets, runTriggerFromMode, saveIndicatorOf, savedEverythingBeforeLeaving, sessionBeforeReload, shouldReleaseForIdle, signalPayloadCard, sourceLanguageOf, stripSubmitActions, structuredParameterType, subscribeWorkflowSaved, synchronizeOperationUpdate, throwIfResultError, tickAction, touchesSavedFields, useAgentDefinitionList, useAgentDefinitions, useCodeWorkflowInterface, useConnection, useConnections, useConnectionsByProvider, useContinuousOptimisationEnabled, useCreateConnection, useDurableFunctionNodesEnabled, useDurableParityEnabled, useEditLeaseLocked, useEditLeaseStore, useFlowStore, useFlowValidator, useFluidGridsAnalytics, useFluidGridsContext, useFluidGridsFlag, useGuardedNavigate, useInitiateOAuth, useInsertNode, useIsValidConnection, useManualSave, useNodeExecution, useNodeRegistryRevision, usePaletteGates, usePhaseCFlags, useProviders, useRunGuard, useSaveStatusStore, useSaveWorkflow, useSelfHostedWorkersEnabled, useWorkflowTestsEnabled, watchLeavingLosesChanges, workflowFingerprint };
|
package/dist/executions.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
import './chunk-AD3BXTJS.js';
|
|
2
|
-
export { ExecutionsListPage } from './chunk-
|
|
3
|
-
export { ExecutionDetailPage } from './chunk-
|
|
4
|
-
import './chunk-
|
|
5
|
-
import './chunk-
|
|
6
|
-
import './chunk-
|
|
7
|
-
import './chunk-
|
|
8
|
-
import './chunk-
|
|
2
|
+
export { ExecutionsListPage } from './chunk-BP6YPKNK.js';
|
|
3
|
+
export { ExecutionDetailPage } from './chunk-RFOKJE3A.js';
|
|
4
|
+
import './chunk-G2FPOWN5.js';
|
|
5
|
+
import './chunk-K6HD5GC7.js';
|
|
6
|
+
import './chunk-6WPW42TX.js';
|
|
7
|
+
import './chunk-H2KIJEYM.js';
|
|
8
|
+
import './chunk-BVCMAGLJ.js';
|
|
9
9
|
import './chunk-5ERAJC2I.js';
|
|
10
|
-
import './chunk-
|
|
10
|
+
import './chunk-OBWB73Y7.js';
|
|
11
11
|
import './chunk-JDLQ6QIB.js';
|
|
12
12
|
import './chunk-PC3CICOW.js';
|
|
13
13
|
import './chunk-Y53CVZVV.js';
|
|
14
14
|
import './chunk-FNZZ5JJL.js';
|
|
15
|
-
import './chunk-
|
|
15
|
+
import './chunk-QXACKASD.js';
|
|
16
16
|
import './chunk-PJAWNFJV.js';
|
|
17
17
|
import './chunk-AOLY5INN.js';
|
|
18
18
|
import './chunk-4VJ3MDOV.js';
|
|
19
|
-
import './chunk-
|
|
19
|
+
import './chunk-YC76QFWZ.js';
|
|
20
20
|
import './chunk-ZUVFD5KV.js';
|
|
21
21
|
import './chunk-JL7CASN5.js';
|
|
22
22
|
import './chunk-OCJTTHTS.js';
|
package/dist/history.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
export { HistoryPage } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { HistoryPage } from './chunk-LVTOWRAM.js';
|
|
2
|
+
import './chunk-N6XYVO7N.js';
|
|
3
3
|
import './chunk-FNZZ5JJL.js';
|
|
4
|
-
import './chunk-
|
|
4
|
+
import './chunk-QXACKASD.js';
|
|
5
5
|
import './chunk-PJAWNFJV.js';
|
|
6
6
|
import './chunk-4VJ3MDOV.js';
|
|
7
|
-
import './chunk-
|
|
7
|
+
import './chunk-YC76QFWZ.js';
|
|
8
8
|
import './chunk-ZUVFD5KV.js';
|
|
9
9
|
import './chunk-JL7CASN5.js';
|
|
10
10
|
import './chunk-OCJTTHTS.js';
|