@burdenoff/fluidgrids-fe-sdk 2026.1029.7 → 2026.1029.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/{ExecutionDetailPage-L7LZYFOT.js → ExecutionDetailPage-H6R3ZIXN.js} +10 -10
  2. package/dist/{ExecutionsListPage-7NMW6S5A.js → ExecutionsListPage-TLD2E442.js} +7 -7
  3. package/dist/{WorkflowBuilder-RXVUBDZJ.js → WorkflowBuilder-XVHY7XWJ.js} +10 -10
  4. package/dist/{WorkflowsList-5U74DYQ3.js → WorkflowsList-3GXXXURR.js} +7 -7
  5. package/dist/{chunk-FFOZ5VUJ.js → chunk-2NG5VZWI.js} +1 -1
  6. package/dist/{chunk-BZTVAUOQ.js → chunk-6CKDGT2N.js} +3 -3
  7. package/dist/{chunk-OJPJ2QXD.js → chunk-G3KZOX52.js} +2 -2
  8. package/dist/{chunk-YTUIGIVP.js → chunk-GQTEHWWY.js} +12 -8
  9. package/dist/{chunk-TYYSYSAL.js → chunk-H4AZBUWM.js} +1 -1
  10. package/dist/{chunk-AXMEATLG.js → chunk-HWEKWYXQ.js} +2 -2
  11. package/dist/{chunk-RZR3BDDZ.js → chunk-LJGC7RAL.js} +162 -99
  12. package/dist/{chunk-K4BF7PAW.js → chunk-NAYPOEYM.js} +290 -27
  13. package/dist/{chunk-VIZ7W5WJ.js → chunk-NNPXN4DI.js} +5 -5
  14. package/dist/{chunk-4MHWFZJV.js → chunk-NUBPALBK.js} +1 -1
  15. package/dist/{chunk-US4LPOB3.js → chunk-R7VHURPQ.js} +1 -1
  16. package/dist/{chunk-DEGCZCHP.js → chunk-S4JYBJ4X.js} +2 -2
  17. package/dist/{chunk-IDGDMJMJ.js → chunk-T22LICGX.js} +3 -3
  18. package/dist/{chunk-HAFUSBYP.js → chunk-TJ6RUV4R.js} +8 -8
  19. package/dist/{chunk-NL4JQFFA.js → chunk-UIDJT3YK.js} +1 -1
  20. package/dist/{chunk-7CTIVBBA.js → chunk-UWNCFMHV.js} +4 -4
  21. package/dist/{chunk-ZE5KS2YL.js → chunk-V5PA5KGV.js} +2 -2
  22. package/dist/{chunk-SZTKLZZR.js → chunk-VEZ7G2FE.js} +4 -4
  23. package/dist/{chunk-Z4YQTXCD.js → chunk-WEXO3KAY.js} +4 -4
  24. package/dist/{chunk-E7UAY3JJ.js → chunk-WTP343PG.js} +1 -1
  25. package/dist/{chunk-EGIEFGOV.js → chunk-X2J4ZXKD.js} +822 -62
  26. package/dist/{chunk-KANARCPR.js → chunk-XJBCRDWZ.js} +3 -3
  27. package/dist/{chunk-6SZXW2BF.js → chunk-XMKYZP6Q.js} +32 -15
  28. package/dist/{chunk-LAVHDFHI.js → chunk-Z6I6A47T.js} +1 -1
  29. package/dist/executions.js +11 -11
  30. package/dist/history.js +4 -4
  31. package/dist/index.d.ts +76 -3
  32. package/dist/index.js +34 -34
  33. package/dist/nodes.js +2 -2
  34. package/dist/observability.js +5 -5
  35. package/dist/settings.js +6 -6
  36. package/dist/templates.js +9 -9
  37. package/dist/{workflow-builder-CZFczcE7.d.ts → workflow-builder-BMGVSwpy.d.ts} +7 -0
  38. package/dist/workflow-builder.d.ts +1 -1
  39. package/dist/workflow-builder.js +11 -11
  40. package/dist/workflows-list.js +7 -7
  41. package/package.json +1 -1
@@ -2,11 +2,11 @@ import { cn as cn$1 } from './chunk-JL7CASN5.js';
2
2
  import { getGlobalStoreClient, createGlobalStoreClient, setGlobalStoreClient, resetGlobalStoreClient } from './chunk-PXIFUMLA.js';
3
3
  import { getFluidGridsConfig, validateTrustedOrigin, resetFluidGridsExecutionState, setFluidGridsConfig, resetFluidGridsConfig } from './chunk-6AMNEX2Y.js';
4
4
  import { GetMyNodeInstallationsDocument } from './chunk-JUUYPCFY.js';
5
- import { fetchAllNodeEndpointConfigs, NodeManifestDocument, UpdateWorkflowDefinitionDocument, CreateWorkflowDefinitionDocument, CreateWorkflowVersionDocument, ExecuteStepDocument, TriggerWorkflowDocument, RunFromNodeDocument, ExecutionDetailDocument, WorkflowDefinitionDocument, WorkflowRunDocument } from './chunk-YTUIGIVP.js';
5
+ import { fetchAllNodeEndpointConfigs, NodeManifestDocument, UpdateWorkflowDefinitionDocument, CreateWorkflowDefinitionDocument, CreateWorkflowVersionDocument, ExecuteStepDocument, TriggerWorkflowDocument, RunFromNodeDocument, ExecutionDetailDocument, WorkflowDefinitionDocument, WorkflowRunDocument } from './chunk-GQTEHWWY.js';
6
6
  import { useTr, ENGLISH_FALLBACK_TRANSLATOR, FluidGridsTranslationProvider } from './chunk-UULVIT25.js';
7
7
  import { waitForFluidGridsClient, getFluidGridsClient, getFluidGridsClientSafe, createFluidGridsClient, setFluidGridsClient, resetFluidGridsClient } from './chunk-NTWG3CJX.js';
8
8
  import * as React2 from 'react';
9
- import { forwardRef, useState, useImperativeHandle, useRef, useEffect, useMemo, createContext, memo, useCallback, useSyncExternalStore, useContext, cloneElement } from 'react';
9
+ import { forwardRef, useState, useImperativeHandle, useRef, useEffect, useMemo, createContext, memo, useCallback, useContext, useSyncExternalStore, cloneElement } from 'react';
10
10
  import { useOptionalFeatureFlags } from '@burdenoff/fe-libs/shared/feature-flags';
11
11
  import { CombinedGraphQLErrors, ServerError } from '@apollo/client/errors';
12
12
  import { dispatchUpgradePrompt } from '@burdenoff/fe-libs/shared/components';
@@ -4556,6 +4556,11 @@ function useDeleteNode() {
4556
4556
  [deleteElements, getEdges, getNode, deleteNodes]
4557
4557
  );
4558
4558
  }
4559
+ var BuilderReadOnlyContext = createContext(false);
4560
+ var BuilderReadOnlyProvider = BuilderReadOnlyContext.Provider;
4561
+ function useBuilderReadOnly() {
4562
+ return useContext(BuilderReadOnlyContext);
4563
+ }
4559
4564
 
4560
4565
  // src/builder/contants/symbols.ts
4561
4566
  var NODE_TYPE_DRAG_DATA_FORMAT = "application/flow-builder.node-type";
@@ -4605,6 +4610,7 @@ function StickyNoteNodeComponent({
4605
4610
  const { setNodes, getNode } = useReactFlow();
4606
4611
  const zustandSetNodes = useFlowStore((s) => s.actions.nodes.setNodes);
4607
4612
  const deleteNode = useDeleteNode();
4613
+ const readOnly = useBuilderReadOnly();
4608
4614
  const [editing, setEditing] = useState(false);
4609
4615
  const [showPalette, setShowPalette] = useState(false);
4610
4616
  const [draft, setDraft] = useState(String(data.content ?? ""));
@@ -4680,7 +4686,7 @@ function StickyNoteNodeComponent({
4680
4686
  /* @__PURE__ */ jsx(
4681
4687
  NodeResizer,
4682
4688
  {
4683
- isVisible: !!selected,
4689
+ isVisible: !!selected && !readOnly,
4684
4690
  minWidth: STICKY_MIN_SIZE.width,
4685
4691
  minHeight: STICKY_MIN_SIZE.height,
4686
4692
  lineStyle: { border: "none", zIndex: 20 },
@@ -4698,7 +4704,9 @@ function StickyNoteNodeComponent({
4698
4704
  {
4699
4705
  className: cn(
4700
4706
  "absolute right-1 z-30 flex items-center gap-0.5 rounded-lg border border-border bg-card p-0.5 shadow-md transition-all duration-150",
4701
- selected || showPalette ? "pointer-events-auto opacity-100" : "pointer-events-none opacity-0 group-hover:pointer-events-auto group-hover:opacity-100"
4707
+ selected || showPalette ? "pointer-events-auto opacity-100" : "pointer-events-none opacity-0 group-hover:pointer-events-auto group-hover:opacity-100",
4708
+ // Nothing to change on a read-only canvas (BOFF-9725).
4709
+ readOnly && "hidden"
4702
4710
  ),
4703
4711
  style: { top: -15 },
4704
4712
  onDoubleClick: (e) => e.stopPropagation(),
@@ -4786,12 +4794,13 @@ function StickyNoteNodeComponent({
4786
4794
  },
4787
4795
  onDoubleClick: (e) => {
4788
4796
  e.stopPropagation();
4789
- startEditing();
4797
+ if (!readOnly) startEditing();
4790
4798
  },
4791
4799
  children: editing ? /* @__PURE__ */ jsx(
4792
4800
  "textarea",
4793
4801
  {
4794
4802
  ref: textareaRef,
4803
+ readOnly,
4795
4804
  value: draft,
4796
4805
  onChange: (e) => setDraft(e.target.value),
4797
4806
  onBlur: commitEdit,
@@ -6580,8 +6589,26 @@ var PERMANENT_ERROR_CODES = /* @__PURE__ */ new Set([
6580
6589
  "FAILED_PRECONDITION",
6581
6590
  "CONFLICT"
6582
6591
  ]);
6592
+ function textOf(value) {
6593
+ return typeof value === "string" && value.length > 0 ? value : null;
6594
+ }
6595
+ function findSaveConflict(error) {
6596
+ const extensions = collectExtensions(error).find(
6597
+ (ext) => ext.code === "CONFLICT" && (ext.reason === "STALE_REVISION" || ext.reason === "EDIT_LEASE_HELD")
6598
+ );
6599
+ if (!extensions) return null;
6600
+ const revision = extensions.currentRevision;
6601
+ return {
6602
+ reason: extensions.reason,
6603
+ currentRevision: typeof revision === "number" && Number.isFinite(revision) ? revision : null,
6604
+ currentStatus: textOf(extensions.currentStatus),
6605
+ updatedById: textOf(extensions.updatedById),
6606
+ holderActorId: textOf(extensions.holderActorId)
6607
+ };
6608
+ }
6583
6609
  function classifySaveFailure(error) {
6584
6610
  if (findQuotaRefusal(error)) return "quota";
6611
+ if (findSaveConflict(error)) return "conflict";
6585
6612
  if (errorCodesOf(error).some((code) => PERMANENT_ERROR_CODES.has(code))) {
6586
6613
  return "permanent";
6587
6614
  }
@@ -6691,6 +6718,196 @@ function editStateOf(baseline, current, now) {
6691
6718
  return "dirty";
6692
6719
  }
6693
6720
 
6721
+ // src/builder/lib/workflow-revisions.ts
6722
+ var known = /* @__PURE__ */ new Map();
6723
+ function rememberRevision(dbId, revision) {
6724
+ if (!dbId || typeof revision !== "number" || !Number.isFinite(revision)) {
6725
+ return;
6726
+ }
6727
+ const current = known.get(dbId);
6728
+ if (current === void 0 || revision > current) known.set(dbId, revision);
6729
+ }
6730
+ function rememberOwnStatusChange(dbId, revision) {
6731
+ if (!dbId || typeof revision !== "number") return;
6732
+ const current = known.get(dbId);
6733
+ if (current !== void 0 && revision === current + 1) {
6734
+ known.set(dbId, revision);
6735
+ }
6736
+ }
6737
+ function revisionOf(dbId) {
6738
+ return dbId ? known.get(dbId) : void 0;
6739
+ }
6740
+
6741
+ // src/builder/lib/edit-session.ts
6742
+ var SESSION_ID_PATTERN = /^[A-Za-z0-9_-]{8,64}$/;
6743
+ function randomSessionId() {
6744
+ const cryptoApi = globalThis.crypto;
6745
+ if (cryptoApi?.randomUUID) return cryptoApi.randomUUID();
6746
+ const bytes = new Uint8Array(16);
6747
+ cryptoApi?.getRandomValues?.(bytes);
6748
+ if (bytes.every((byte) => byte === 0)) {
6749
+ for (let i = 0; i < bytes.length; i += 1) {
6750
+ bytes[i] = Math.floor(Math.random() * 256);
6751
+ }
6752
+ }
6753
+ return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join(
6754
+ ""
6755
+ );
6756
+ }
6757
+ var EDIT_SESSION_ID = randomSessionId();
6758
+ var storageKey = (workflowKey) => `fluidgrids.builder.editSession.${workflowKey}`;
6759
+ function rememberSessionForReload(storage, workflowKey, sessionId) {
6760
+ try {
6761
+ storage?.setItem(storageKey(workflowKey), sessionId);
6762
+ } catch {
6763
+ }
6764
+ }
6765
+ function sessionBeforeReload(storage, workflowKey, currentSessionId = EDIT_SESSION_ID) {
6766
+ try {
6767
+ const stored = storage?.getItem(storageKey(workflowKey)) ?? null;
6768
+ if (!stored || stored === currentSessionId) return null;
6769
+ return SESSION_ID_PATTERN.test(stored) ? stored : null;
6770
+ } catch {
6771
+ return null;
6772
+ }
6773
+ }
6774
+ function forgetSessionForReload(storage, workflowKey) {
6775
+ try {
6776
+ storage?.removeItem(storageKey(workflowKey));
6777
+ } catch {
6778
+ }
6779
+ }
6780
+
6781
+ // src/builder/lib/edit-lease.ts
6782
+ var LEASE_RENEW_MS = 2e4;
6783
+ var LEASE_VIEW_POLL_MS = 1e4;
6784
+ var LEASE_IDLE_RELEASE_MS = 15 * 6e4;
6785
+ function isLocked(phase) {
6786
+ return phase === "viewing" || phase === "lost" || phase === "idle" || phase === "reloading";
6787
+ }
6788
+ function phaseAfterAcquire(previous, answer) {
6789
+ if (!answer.available) {
6790
+ return isLocked(previous) || previous === "holding" ? previous : "unavailable";
6791
+ }
6792
+ if (answer.heldBySelf) return "holding";
6793
+ if (answer.held) return previous === "holding" ? "lost" : "viewing";
6794
+ return previous;
6795
+ }
6796
+ function phaseAfterTakeOver(answer) {
6797
+ if (!answer.available) return "unavailable";
6798
+ return answer.heldBySelf ? "reloading" : "viewing";
6799
+ }
6800
+ function releasesOnClose(phase) {
6801
+ return phase === "starting" || phase === "holding" || phase === "unavailable";
6802
+ }
6803
+ var LEASE_CALL_MAX_WAIT_MS = 15e3;
6804
+ function leaseCallQueue(maxWaitMs = LEASE_CALL_MAX_WAIT_MS) {
6805
+ const tails = /* @__PURE__ */ new Map();
6806
+ return {
6807
+ run(workflowKey, call) {
6808
+ const previous = tails.get(workflowKey) ?? Promise.resolve();
6809
+ const result = previous.then(call);
6810
+ const tail = previous.then(
6811
+ () => new Promise((resolve) => {
6812
+ const timer = setTimeout(resolve, maxWaitMs);
6813
+ const done = () => {
6814
+ clearTimeout(timer);
6815
+ resolve();
6816
+ };
6817
+ result.then(done, done);
6818
+ })
6819
+ );
6820
+ tails.set(workflowKey, tail);
6821
+ void tail.then(() => {
6822
+ if (tails.get(workflowKey) === tail) tails.delete(workflowKey);
6823
+ });
6824
+ return result;
6825
+ }
6826
+ };
6827
+ }
6828
+ function shouldReleaseForIdle(phase, lastInputAt, now) {
6829
+ return phase === "holding" && now - lastInputAt >= LEASE_IDLE_RELEASE_MS;
6830
+ }
6831
+ function tickAction(phase, state, now) {
6832
+ if (phase === "holding" || phase === "unavailable") {
6833
+ return now - state.lastRenewAt >= LEASE_RENEW_MS ? "renew" : "none";
6834
+ }
6835
+ if (phase === "viewing" || phase === "lost" || phase === "idle") {
6836
+ return state.visible && now - state.lastPeekAt >= LEASE_VIEW_POLL_MS ? "peek" : "none";
6837
+ }
6838
+ return "none";
6839
+ }
6840
+ function bannerOf(state) {
6841
+ switch (state.phase) {
6842
+ case "viewing":
6843
+ return state.held ? {
6844
+ kind: "editing",
6845
+ actorId: state.holderActorId,
6846
+ self: state.heldByCaller
6847
+ } : { kind: "free" };
6848
+ case "lost":
6849
+ return {
6850
+ kind: "taken",
6851
+ actorId: state.takenBy,
6852
+ self: state.takenByCaller
6853
+ };
6854
+ case "idle":
6855
+ return { kind: "idle" };
6856
+ case "reloading":
6857
+ return { kind: "reloading" };
6858
+ default:
6859
+ return null;
6860
+ }
6861
+ }
6862
+ var IDLE = {
6863
+ workflowKey: null,
6864
+ phase: "inactive",
6865
+ held: false,
6866
+ holderActorId: null,
6867
+ heldByCaller: false,
6868
+ takenBy: null,
6869
+ takenByCaller: false
6870
+ };
6871
+ function commitFocusedEdit() {
6872
+ if (typeof document === "undefined") return;
6873
+ const focused = document.activeElement;
6874
+ if (!focused || typeof focused.blur !== "function") return;
6875
+ const editable = focused.isContentEditable || typeof focused.matches === "function" && focused.matches("input, textarea, select");
6876
+ if (editable) focused.blur();
6877
+ }
6878
+ var useEditLeaseStore = create()((set, get) => ({
6879
+ ...IDLE,
6880
+ actions: {
6881
+ begin: (workflowKey) => set(
6882
+ (state) => (
6883
+ // A reload of the same workflow keeps "reloading" (and its lock)
6884
+ // until the lease is confirmed again.
6885
+ state.workflowKey === workflowKey && state.phase === "reloading" ? state : { ...IDLE, workflowKey, phase: "starting" }
6886
+ )
6887
+ ),
6888
+ record: (phase, answer) => {
6889
+ if (isLocked(phase) && !isLocked(get().phase)) commitFocusedEdit();
6890
+ set(() => {
6891
+ if (!answer || !answer.available) return { phase };
6892
+ const holderActorId = answer.held ? answer.holderActorId ?? null : null;
6893
+ const heldByCaller = answer.held && !!answer.heldByCaller;
6894
+ const taken = phase !== "lost" ? { takenBy: null, takenByCaller: false } : answer.held ? { takenBy: holderActorId, takenByCaller: heldByCaller } : {};
6895
+ return {
6896
+ phase,
6897
+ held: answer.held,
6898
+ holderActorId,
6899
+ heldByCaller,
6900
+ ...taken
6901
+ };
6902
+ });
6903
+ },
6904
+ reset: () => set({ ...IDLE })
6905
+ }
6906
+ }));
6907
+ function useEditLeaseLocked() {
6908
+ return useEditLeaseStore((s) => isLocked(s.phase));
6909
+ }
6910
+
6694
6911
  // src/builder/lib/workflow-save-snapshot.ts
6695
6912
  function snapshotForSave(workflow, generation, route = {}) {
6696
6913
  const copy = {
@@ -6728,7 +6945,8 @@ var PRISTINE = {
6728
6945
  baseline: null,
6729
6946
  quotaExhausted: false,
6730
6947
  leaveRequest: null,
6731
- autosavePaused: false
6948
+ autosavePaused: false,
6949
+ conflictOpen: false
6732
6950
  };
6733
6951
  var useSaveStatusStore = create()((set) => ({
6734
6952
  ...PRISTINE,
@@ -6745,10 +6963,15 @@ var useSaveStatusStore = create()((set) => ({
6745
6963
  failure: null,
6746
6964
  incomplete: false,
6747
6965
  autosavePaused: false,
6966
+ conflictOpen: false,
6748
6967
  lastSavedAt: at
6749
6968
  } : { saving: false }
6750
6969
  ),
6751
- saveFailed: (failure) => set({ saving: false, failure }),
6970
+ saveFailed: (failure) => set({
6971
+ saving: false,
6972
+ failure,
6973
+ conflictOpen: failure.conflict?.reason === "STALE_REVISION"
6974
+ }),
6752
6975
  clearFailure: () => set({ failure: null }),
6753
6976
  setQuotaExhausted: (quotaExhausted) => set({ quotaExhausted }),
6754
6977
  setAutosaveEnabled: (autosaveEnabled) => {
@@ -6757,6 +6980,7 @@ var useSaveStatusStore = create()((set) => ({
6757
6980
  },
6758
6981
  requestLeave: (leaveRequest) => set({ leaveRequest }),
6759
6982
  setAutosavePaused: (autosavePaused) => set({ autosavePaused }),
6983
+ setConflictOpen: (conflictOpen) => set({ conflictOpen }),
6760
6984
  reset: () => set({ ...PRISTINE })
6761
6985
  }
6762
6986
  }));
@@ -6875,13 +7099,15 @@ function useSaveWorkflow() {
6875
7099
  const { bus, workspaceId } = useFluidGridsAnalytics();
6876
7100
  const setWorkflow = useFlowStore((s) => s.actions.setWorkflow);
6877
7101
  const performSave = useCallback(
6878
- async (snapshot, silent) => {
7102
+ async (snapshot, silent, asNewVersion) => {
6879
7103
  const stillOpen = () => useFlowStore.getState().loadGeneration === snapshot.generation;
6880
7104
  try {
6881
7105
  const { workflow } = snapshot;
6882
7106
  const mintedKey = snapshot.key ? null : v4();
6883
7107
  const workflowKey = snapshot.key || mintedKey || "";
6884
- const isDraft = !workflow.status || workflow.status === "DRAFT";
7108
+ const forkRequested = asNewVersion && !!workflow.dbId;
7109
+ const isDraft = !forkRequested && (!workflow.status || workflow.status === "DRAFT");
7110
+ const expectedRevision = revisionOf(workflow.dbId);
6885
7111
  const client = getFluidGridsClient();
6886
7112
  const { preparedWorkflow, owned } = builderDefinition(
6887
7113
  snapshot,
@@ -6907,7 +7133,11 @@ function useSaveWorkflow() {
6907
7133
  description: workflow.name || "Workflow update",
6908
7134
  // null (not undefined) so an emptied alias field actually
6909
7135
  // CLEARS the alias — undefined is dropped by the resolver.
6910
- alias: workflow.alias?.trim() ? workflow.alias.trim() : null
7136
+ alias: workflow.alias?.trim() ? workflow.alias.trim() : null,
7137
+ // Refused instead of overwriting a change made elsewhere,
7138
+ // or a save from a page that no longer holds the edit lease.
7139
+ ...expectedRevision !== void 0 ? { expectedRevision } : {},
7140
+ editSessionId: EDIT_SESSION_ID
6911
7141
  }
6912
7142
  }
6913
7143
  })
@@ -6917,6 +7147,7 @@ function useSaveWorkflow() {
6917
7147
  }
6918
7148
  savedVersion = data.updateWorkflowDefinition.version;
6919
7149
  savedDbId = data.updateWorkflowDefinition.id;
7150
+ rememberRevision(savedDbId, data.updateWorkflowDefinition.revision);
6920
7151
  operation = "updated";
6921
7152
  if (!silent) {
6922
7153
  toast.success("Workflow saved", {
@@ -6944,6 +7175,7 @@ function useSaveWorkflow() {
6944
7175
  }
6945
7176
  savedVersion = data.createWorkflowDefinition.version;
6946
7177
  savedDbId = data.createWorkflowDefinition.id;
7178
+ rememberRevision(savedDbId, data.createWorkflowDefinition.revision);
6947
7179
  operation = "created";
6948
7180
  emitWorkflowCreated(bus, {
6949
7181
  workspaceId,
@@ -6984,7 +7216,15 @@ function useSaveWorkflow() {
6984
7216
  // pointer — the backend clears it from siblings). Included
6985
7217
  // only when set so saves without an alias don't depend on the
6986
7218
  // new schema field being deployed.
6987
- ...workflow.alias?.trim() ? { alias: workflow.alias.trim() } : {}
7219
+ ...workflow.alias?.trim() ? { alias: workflow.alias.trim() } : {},
7220
+ // A save of an ACTIVE or ARCHIVED version claims it, so two
7221
+ // pages that loaded it never create rival drafts. Keeping
7222
+ // the canvas as a new version on purpose skips the claim.
7223
+ ...forkRequested ? {} : {
7224
+ baseVersion: workflow.version,
7225
+ ...expectedRevision !== void 0 ? { expectedRevision } : {},
7226
+ editSessionId: EDIT_SESSION_ID
7227
+ }
6988
7228
  }
6989
7229
  }
6990
7230
  })
@@ -6997,6 +7237,7 @@ function useSaveWorkflow() {
6997
7237
  const newWorkflow = data.createWorkflowVersion.workflow;
6998
7238
  savedVersion = newWorkflow?.version ?? workflow.version;
6999
7239
  savedDbId = newWorkflow?.id ?? workflow.dbId;
7240
+ rememberRevision(newWorkflow?.id, newWorkflow?.revision);
7000
7241
  operation = "versioned";
7001
7242
  if (stillOpen()) {
7002
7243
  setWorkflow({
@@ -7042,15 +7283,30 @@ function useSaveWorkflow() {
7042
7283
  console.error("Error saving workflow:", message);
7043
7284
  const cause = error instanceof Error ? error.cause : void 0;
7044
7285
  const quotaExhausted2 = isQuotaExhaustedFailure(cause) || isQuotaExhaustedFailure(error);
7045
- if (!quotaExhausted2 && !silent) {
7286
+ const conflict = findSaveConflict(error);
7287
+ if (!quotaExhausted2 && !conflict && !silent) {
7046
7288
  toast.error("Failed to save workflow", {
7047
7289
  description: message
7048
7290
  });
7049
7291
  }
7292
+ if (conflict?.reason === "EDIT_LEASE_HELD" && stillOpen()) {
7293
+ const lease = useEditLeaseStore.getState();
7294
+ const answer = {
7295
+ available: true,
7296
+ held: true,
7297
+ heldBySelf: false,
7298
+ holderActorId: conflict.holderActorId
7299
+ };
7300
+ lease.actions.record(phaseAfterAcquire(lease.phase, answer), answer);
7301
+ }
7050
7302
  return {
7051
7303
  saved: false,
7052
7304
  quotaExhausted: quotaExhausted2,
7053
- failure: { message, kind: classifySaveFailure(error) }
7305
+ failure: {
7306
+ message,
7307
+ kind: classifySaveFailure(error),
7308
+ ...conflict ? { conflict } : {}
7309
+ }
7054
7310
  };
7055
7311
  }
7056
7312
  },
@@ -7066,7 +7322,11 @@ function useSaveWorkflow() {
7066
7322
  statusActions.beginSave();
7067
7323
  statusActions.setQuotaExhausted(false);
7068
7324
  }
7069
- const outcome = await performSave(snapshot, options.silent ?? false);
7325
+ const outcome = await performSave(
7326
+ snapshot,
7327
+ options.silent ?? false,
7328
+ options.asNewVersion ?? false
7329
+ );
7070
7330
  recordSaveOutcome(outcome, {
7071
7331
  open: isOpen(),
7072
7332
  baseline: {
@@ -7840,6 +8100,7 @@ function AdapterPort({
7840
8100
  const onConnect = useFlowStore((s) => s.actions.edges.onConnect);
7841
8101
  const [pickerOpen, setPickerOpen] = useState(false);
7842
8102
  const candidates = useCompatibleSubNodes(adapter);
8103
+ const readOnly = useBuilderReadOnly();
7843
8104
  const connectionCount = edges.filter(
7844
8105
  (e) => e.source === nodeId && e.sourceHandle === adapter.name
7845
8106
  ).length;
@@ -7893,7 +8154,7 @@ function AdapterPort({
7893
8154
  adapter?.required && /* @__PURE__ */ jsx("span", { className: "text-[var(--color-status-error-text)] absolute -right-2 top-[1px]", children: "*" })
7894
8155
  ] }) }),
7895
8156
  /* @__PURE__ */ jsxs("div", { className: "mt-16 flex flex-col items-center gap-1.5", children: [
7896
- !isAtMaxConnections && /* @__PURE__ */ jsx(
8157
+ !isAtMaxConnections && !readOnly && /* @__PURE__ */ jsx(
7897
8158
  "button",
7898
8159
  {
7899
8160
  type: "button",
@@ -8024,6 +8285,7 @@ function SubNodeComponent({
8024
8285
  }) {
8025
8286
  const meta = useMemo(() => getNodeDetail(nodeType), [nodeType]);
8026
8287
  const deleteNode = useDeleteNode();
8288
+ const readOnly = useBuilderReadOnly();
8027
8289
  const [showNodePropertiesOf] = useFlowStore(
8028
8290
  useShallow((s) => [s.actions.sidebar.showNodePropertiesOf])
8029
8291
  );
@@ -8069,7 +8331,7 @@ function SubNodeComponent({
8069
8331
  }
8070
8332
  ),
8071
8333
  /* @__PURE__ */ jsx("span", { className: "mt-1.5 text-xs text-[var(--color-text-secondary)] font-medium text-center max-w-24 leading-tight", children: data?.label || data?.args?.state?.operation || meta.title }),
8072
- /* @__PURE__ */ jsx(
8334
+ !readOnly && /* @__PURE__ */ jsx(
8073
8335
  "button",
8074
8336
  {
8075
8337
  onClick: () => deleteNode(id),
@@ -8141,8 +8403,9 @@ var getNodeMetadata = (value) => {
8141
8403
  s.actions.nodes.endRename
8142
8404
  ])
8143
8405
  );
8406
+ const readOnly = useBuilderReadOnly();
8144
8407
  useEffect(() => {
8145
- if (nodeType !== "integration/channel") return;
8408
+ if (readOnly || nodeType !== "integration/channel") return;
8146
8409
  const nodeData = data;
8147
8410
  const explicitRole = nodeData?.args?.state?.role;
8148
8411
  const hasIncomingEdge = edges.some((e) => e.target === id);
@@ -8169,7 +8432,7 @@ var getNodeMetadata = (value) => {
8169
8432
  zustandSetNodes(updated);
8170
8433
  return updated;
8171
8434
  });
8172
- }, [nodeType, id, edges, data, setNodes, zustandSetNodes]);
8435
+ }, [readOnly, nodeType, id, edges, data, setNodes, zustandSetNodes]);
8173
8436
  const { executeStep } = useNodeExecution();
8174
8437
  const deleteNode = useDeleteNode();
8175
8438
  const handleDeleteNode = () => {
@@ -8327,12 +8590,12 @@ var getNodeMetadata = (value) => {
8327
8590
  onDoubleClick: handleOpenNdv,
8328
8591
  onSettings: handleOpenNdv,
8329
8592
  onExecute: handleExecuteStep,
8330
- onDelete: handleDeleteNode,
8593
+ onDelete: readOnly ? void 0 : handleDeleteNode,
8331
8594
  infoButton: /* @__PURE__ */ jsx(NodeInfoButtonWithModal, { metadata: nodeInfoMetadata }),
8332
8595
  disabled: isDisabled,
8333
- onToggleDisabled: handleToggleDisabled,
8334
- isRenaming: isRenamingThisNode,
8335
- onStartRename: handleStartRename,
8596
+ onToggleDisabled: readOnly ? void 0 : handleToggleDisabled,
8597
+ isRenaming: isRenamingThisNode && !readOnly,
8598
+ onStartRename: readOnly ? void 0 : handleStartRename,
8336
8599
  onCommitRename: handleCommitRename,
8337
8600
  onCancelRename: handleCancelRename
8338
8601
  }
@@ -8361,10 +8624,10 @@ var getNodeMetadata = (value) => {
8361
8624
  isExecuting: isThisNodeExecuting,
8362
8625
  onSettings: handleOpenNdv,
8363
8626
  onExecute: handleExecuteStep,
8364
- onDelete: handleDeleteNode,
8627
+ onDelete: readOnly ? void 0 : handleDeleteNode,
8365
8628
  infoButton: /* @__PURE__ */ jsx(NodeInfoButtonWithModal, { metadata: nodeInfoMetadata }),
8366
8629
  disabled: isDisabled,
8367
- onToggleDisabled: handleToggleDisabled,
8630
+ onToggleDisabled: readOnly ? void 0 : handleToggleDisabled,
8368
8631
  children: [
8369
8632
  /* @__PURE__ */ jsx(
8370
8633
  NodeCardHeader,
@@ -8374,8 +8637,8 @@ var getNodeMetadata = (value) => {
8374
8637
  accentKey: value?.type || meta.title,
8375
8638
  missingCredentials,
8376
8639
  label: nodeLabel,
8377
- isRenaming: isRenamingThisNode,
8378
- onStartRename: handleStartRename,
8640
+ isRenaming: isRenamingThisNode && !readOnly,
8641
+ onStartRename: readOnly ? void 0 : handleStartRename,
8379
8642
  onCommitRename: handleCommitRename,
8380
8643
  onCancelRename: handleCancelRename
8381
8644
  }
@@ -9585,4 +9848,4 @@ function useNodeExecution() {
9585
9848
  };
9586
9849
  }
9587
9850
 
9588
- export { ALLOW_ALL_PERMISSIONS, AUTOSAVE_DEBOUNCE_MS, AUTOSAVE_RETRY_DELAYS_MS, AVAILABLE_NODES, BILLING_PLANS_PATH, CODE_WORKFLOW_NODE_TYPE, ConnectionFormDialog, ConnectionSelector, DURABLE_FUNCTION_NODE_TYPES, ExpressionEditor, FLUIDGRIDS_FLAGS, FLUIDGRIDS_FLAG_DEFAULTS, FLUIDGRIDS_PERMISSIONS, FluidGridsContext, FluidGridsPermissionsProvider, FluidGridsProvider, NODES, NODES_METADATA, NODE_CONFIGS, NODE_OPERATION_DRAG_DATA_FORMAT, NODE_TYPES, NODE_TYPE_DRAG_DATA_FORMAT, NodePropertyPanel, NodeTypeIcon, RUNS_QUOTA_NAME, STICKY_NOTE_TYPE, SdkPermissionButton, SdkPermissionGate, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, WORKFLOWS_QUOTA_NAME, blankWorkflowCreateInput, buildOperationSeed, buildStickyNode, canAutosave, canRenderOperationPanel, canSignalRun, changedSourceFiles, childRunIdOf, classifyCreateRefusal, clearCodeWorkflowDefinitionCache, codeBuildIdOf, components_default, createConfiguredNode, createThenOpen, declaredOutputFields, declaredSignals, defaultSourcePath, describeOperationError, diagnosticsByPath, editStateOf, emitNodeInstalled, emitRunFailed, emitRunLimitHit, emitRunStarted, emitTemplateUsed, emitUpgradeClicked, emitWorkflowCreated, emitWorkflowLimitHit, emitWorkflowPublished, ensureNodeConfigsLoaded, evaluatePermissionCheck, fieldsFromIO, fieldsFromValue, filterPaletteNodes, findQuotaRefusal, formatParameterValue, getNodeDetail, getNodeMetadata, inAppLeaveTarget, interfaceFields, interfaceHandlers, isDurableFunctionNodeType, isEditableSourcePath, isForbiddenError, isImageIcon, isNodeConfigsInitialized, isNodeTrigger, isNodeTypeHiddenFromPalette, isParamVisible, isQuotaExhaustedFailure, isTriggerOperation, leaveNeedsConfirmation, listCustomBlocks, liveInternalOperations, loadDefinitionJson, mergeStickyNotes, nodeAccent, nodesOf, onNodeTypesUpdate, openRunQuotaUpgradePrompt, parseParameterValue, parseRawSignalPayload, pathToExpression, payloadFromCardValues, projectLanguage, readCodeWorkflowState, readDisplayOptions, refetchStoreNodes, registerCustomBlock, registerWorkflowNodeTypes, resolveInputHandles, resolveNodeOperation, resolveOperationName, resolveOutputHandles, resolveUiSpec, runPreparationOf, runSignalTargets, runTriggerFromMode, saveIndicatorOf, savesInPlace, signalPayloadCard, snapshotForSave, sourceLanguageOf, stripSubmitActions, structuredParameterType, subscribeWorkflowSaved, synchronizeOperationUpdate, throwIfResultError, toCodeMirrorDiagnostics, useAgentDefinitionList, useAgentDefinitions, useCodeWorkflowInterface, useConnection, useConnections, useConnectionsByProvider, useCreateConnection, useDurableFunctionNodesEnabled, useDurableParityEnabled, useFlowStore, useFluidGridsAnalytics, useFluidGridsContext, useFluidGridsFlag, useFluidGridsPermission, useInitiateOAuth, useInsertNode, useIsValidConnection, useNodeExecution, useNodeRegistryRevision, useProviders, useSaveStatusStore, useSaveWorkflow, workflowFingerprint };
9851
+ export { ALLOW_ALL_PERMISSIONS, AUTOSAVE_DEBOUNCE_MS, AUTOSAVE_RETRY_DELAYS_MS, AVAILABLE_NODES, BILLING_PLANS_PATH, BuilderReadOnlyProvider, CODE_WORKFLOW_NODE_TYPE, ConnectionFormDialog, ConnectionSelector, DURABLE_FUNCTION_NODE_TYPES, EDIT_SESSION_ID, ExpressionEditor, FLUIDGRIDS_FLAGS, FLUIDGRIDS_FLAG_DEFAULTS, FLUIDGRIDS_PERMISSIONS, FluidGridsContext, FluidGridsPermissionsProvider, FluidGridsProvider, NODES, NODES_METADATA, NODE_CONFIGS, NODE_OPERATION_DRAG_DATA_FORMAT, NODE_TYPES, NODE_TYPE_DRAG_DATA_FORMAT, NodePropertyPanel, NodeTypeIcon, RUNS_QUOTA_NAME, STICKY_NOTE_TYPE, SdkPermissionButton, SdkPermissionGate, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, WORKFLOWS_QUOTA_NAME, bannerOf, blankWorkflowCreateInput, buildOperationSeed, buildStickyNode, canAutosave, canRenderOperationPanel, canSignalRun, changedSourceFiles, childRunIdOf, classifyCreateRefusal, clearCodeWorkflowDefinitionCache, codeBuildIdOf, components_default, createConfiguredNode, createThenOpen, declaredOutputFields, declaredSignals, defaultSourcePath, describeOperationError, diagnosticsByPath, editStateOf, emitNodeInstalled, emitRunFailed, emitRunLimitHit, emitRunStarted, emitTemplateUsed, emitUpgradeClicked, emitWorkflowCreated, emitWorkflowLimitHit, emitWorkflowPublished, ensureNodeConfigsLoaded, evaluatePermissionCheck, fieldsFromIO, fieldsFromValue, filterPaletteNodes, findQuotaRefusal, findSaveConflict, forgetSessionForReload, formatParameterValue, getNodeDetail, getNodeMetadata, inAppLeaveTarget, interfaceFields, interfaceHandlers, isDurableFunctionNodeType, isEditableSourcePath, isForbiddenError, isImageIcon, isLocked, isNodeConfigsInitialized, isNodeTrigger, isNodeTypeHiddenFromPalette, isParamVisible, isQuotaExhaustedFailure, isTriggerOperation, leaseCallQueue, leaveNeedsConfirmation, 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, resolveUiSpec, runPreparationOf, runSignalTargets, runTriggerFromMode, saveIndicatorOf, savesInPlace, sessionBeforeReload, shouldReleaseForIdle, signalPayloadCard, snapshotForSave, sourceLanguageOf, stripSubmitActions, structuredParameterType, subscribeWorkflowSaved, synchronizeOperationUpdate, throwIfResultError, tickAction, toCodeMirrorDiagnostics, useAgentDefinitionList, useAgentDefinitions, useBuilderReadOnly, useCodeWorkflowInterface, useConnection, useConnections, useConnectionsByProvider, useCreateConnection, useDurableFunctionNodesEnabled, useDurableParityEnabled, useEditLeaseLocked, useEditLeaseStore, useFlowStore, useFluidGridsAnalytics, useFluidGridsContext, useFluidGridsFlag, useFluidGridsPermission, useInitiateOAuth, useInsertNode, useIsValidConnection, useNodeExecution, useNodeRegistryRevision, useProviders, useSaveStatusStore, useSaveWorkflow, workflowFingerprint };
@@ -1,11 +1,11 @@
1
- import { CreateWorkflowRefusalDialog, firstWorkflowProgress, GUIDED_TOUR_STATE, builderPathFor } from './chunk-FFOZ5VUJ.js';
2
- import { useExecutions } from './chunk-AXMEATLG.js';
3
- import { useExportWorkflowAs, downloadWorkflowExport, importAcceptAttribute, QuotaExhaustedDialog, importFileKind, parseWorkflowImport, CODE_EXPORT_FORMATS, ImportSourceError, assertImportByteSize, MAX_IMPORT_ARCHIVE_BYTES, readProjectArchive, checkTypeScriptImport, MAX_IMPORT_SOURCE_BYTES, typeScriptModuleFile, typeScriptImportSource, workflowNameFromFile, primaryImportModule } from './chunk-DEGCZCHP.js';
1
+ import { CreateWorkflowRefusalDialog, firstWorkflowProgress, GUIDED_TOUR_STATE, builderPathFor } from './chunk-2NG5VZWI.js';
2
+ import { useExecutions } from './chunk-HWEKWYXQ.js';
3
+ import { useExportWorkflowAs, downloadWorkflowExport, importAcceptAttribute, QuotaExhaustedDialog, importFileKind, parseWorkflowImport, CODE_EXPORT_FORMATS, ImportSourceError, assertImportByteSize, MAX_IMPORT_ARCHIVE_BYTES, readProjectArchive, checkTypeScriptImport, MAX_IMPORT_SOURCE_BYTES, typeScriptModuleFile, typeScriptImportSource, workflowNameFromFile, primaryImportModule } from './chunk-S4JYBJ4X.js';
4
4
  import { workflowsListControls } from './chunk-D3UWK7GY.js';
5
- import { useCreateWorkflow, useWorkflowDefinitions, useLazyWorkflowDefinition, useImportWorkflow, useDuplicateWorkflow, useDeleteWorkflow } from './chunk-OJPJ2QXD.js';
5
+ import { useCreateWorkflow, useWorkflowDefinitions, useLazyWorkflowDefinition, useImportWorkflow, useDuplicateWorkflow, useDeleteWorkflow } from './chunk-G3KZOX52.js';
6
6
  import { useFluidGridsPageControls } from './chunk-PJAWNFJV.js';
7
7
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
8
- import { createThenOpen, useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS, useFluidGridsFlag, FLUIDGRIDS_FLAGS, SdkPermissionButton, BILLING_PLANS_PATH, describeOperationError, useFlowStore, SdkPermissionGate, isQuotaExhaustedFailure } from './chunk-K4BF7PAW.js';
8
+ import { createThenOpen, useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS, useFluidGridsFlag, FLUIDGRIDS_FLAGS, SdkPermissionButton, BILLING_PLANS_PATH, describeOperationError, useFlowStore, SdkPermissionGate, isQuotaExhaustedFailure } from './chunk-NAYPOEYM.js';
9
9
  import { useTr } from './chunk-UULVIT25.js';
10
10
  import { useState, useRef, useCallback, useMemo } from 'react';
11
11
  import { useNavigate } from 'react-router';
@@ -1,4 +1,4 @@
1
- import { useAgentDefinitions, useAgentDefinitionList, useConnections, describeOperationError } from './chunk-K4BF7PAW.js';
1
+ import { useAgentDefinitions, useAgentDefinitionList, useConnections, describeOperationError } from './chunk-NAYPOEYM.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,5 +1,5 @@
1
1
  import { LOG_STREAM_DESTINATIONS, CREATE_LOG_STREAM_DESTINATION, UPDATE_LOG_STREAM_DESTINATION, DELETE_LOG_STREAM_DESTINATION, TEST_LOG_STREAM_DESTINATION, REPLAY_WORKFLOW_RUN, RETRY_WORKFLOW_RUNS, OBSERVABILITY_DASHBOARD_SUMMARY, OBSERVABILITY_FAILED_RUNS, OBSERVABILITY_DATA_SINKS, OBSERVABILITY_DATA_SINK_DATA } from './chunk-5ERAJC2I.js';
2
- import { throwIfResultError, describeOperationError, useFluidGridsAnalytics, emitRunStarted, openRunQuotaUpgradePrompt, useFluidGridsFlag, FLUIDGRIDS_FLAGS } from './chunk-K4BF7PAW.js';
2
+ import { throwIfResultError, describeOperationError, useFluidGridsAnalytics, emitRunStarted, openRunQuotaUpgradePrompt, useFluidGridsFlag, FLUIDGRIDS_FLAGS } from './chunk-NAYPOEYM.js';
3
3
  import { useTr } from './chunk-UULVIT25.js';
4
4
  import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
5
5
  import { useCallback, useState, useMemo, useEffect } from 'react';
@@ -1,5 +1,5 @@
1
- import { describeOperationError, useFluidGridsAnalytics, emitWorkflowLimitHit, emitUpgradeClicked, WORKFLOWS_QUOTA_NAME, throwIfResultError } from './chunk-K4BF7PAW.js';
2
- import { ExportWorkflowCodeDocument } from './chunk-YTUIGIVP.js';
1
+ import { describeOperationError, useFluidGridsAnalytics, emitWorkflowLimitHit, emitUpgradeClicked, WORKFLOWS_QUOTA_NAME, throwIfResultError } from './chunk-NAYPOEYM.js';
2
+ import { ExportWorkflowCodeDocument } from './chunk-GQTEHWWY.js';
3
3
  import { useTr } from './chunk-UULVIT25.js';
4
4
  import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
5
5
  import { useState, useRef, useCallback, useEffect } from 'react';
@@ -1,8 +1,8 @@
1
- import { useEntityTags, useTagEntity, useUntagEntity } from './chunk-LAVHDFHI.js';
1
+ import { useEntityTags, useTagEntity, useUntagEntity } from './chunk-Z6I6A47T.js';
2
2
  import { notifyFluidGridsAiCreditsUpdated } from './chunk-Y53CVZVV.js';
3
- import { throwIfResultError, describeOperationError, signalPayloadCard, components_default, payloadFromCardValues, parseRawSignalPayload } from './chunk-K4BF7PAW.js';
3
+ import { throwIfResultError, describeOperationError, signalPayloadCard, components_default, payloadFromCardValues, parseRawSignalPayload } from './chunk-NAYPOEYM.js';
4
4
  import { getFluidGridsConfig } from './chunk-6AMNEX2Y.js';
5
- import { TerminateWorkflowRunDocument, WorkflowRunHistoryDocument, RunEventAppendedDocument, WorkflowProposalDocument, ProposeRunFixDocument, ProposeWorkflowChangeDocument, ApplyWorkflowProposalDocument, RejectWorkflowProposalDocument, CancelWorkflowProposalDocument, DurableRunFieldsDocument, WorkflowRunDeterminismStatusDocument, WorkflowRunStackTraceDocument, SignalWorkflowRunDocument } from './chunk-YTUIGIVP.js';
5
+ import { TerminateWorkflowRunDocument, WorkflowRunHistoryDocument, RunEventAppendedDocument, WorkflowProposalDocument, ProposeRunFixDocument, ProposeWorkflowChangeDocument, ApplyWorkflowProposalDocument, RejectWorkflowProposalDocument, CancelWorkflowProposalDocument, DurableRunFieldsDocument, WorkflowRunDeterminismStatusDocument, WorkflowRunStackTraceDocument, SignalWorkflowRunDocument } from './chunk-GQTEHWWY.js';
6
6
  import { useTr } from './chunk-UULVIT25.js';
7
7
  import { getFluidGridsClient, getFluidGridsClientSafe } from './chunk-NTWG3CJX.js';
8
8
  import { useState, useRef, useEffect, useCallback, useMemo } from 'react';
@@ -1,13 +1,13 @@
1
- import { useDurableParityRunFields, buildNodeDisplayMap, useRunMetadata, useRunPending, ExecutionStatusBadge, formatRunVersion, NodeTimeline, RunLogViewer, setRunVersioningOverride } from './chunk-7CTIVBBA.js';
2
- import { useExecution, useExecutionActions, useAutoRefresh, runChainLinks, shortRunId, callbackTone, parseMetadataDefinition, overrideRequestOf } from './chunk-AXMEATLG.js';
3
- import { fetchRunFailureClusters, OPEN_STATUSES, dismissRunFailureCluster, BUCKET_LABELS } from './chunk-ZE5KS2YL.js';
4
- import { useRunPolicyDecisions, RunPolicyDecisions } from './chunk-NL4JQFFA.js';
5
- import { useDurableRunFields, useRunHistory, useDeterminismStatus, useRunStackTrace, EntityTagPicker, RunHistoryView, SignalRunDialog, terminateDurableRun, useWorkflowProposal, WorkflowProposalCard } from './chunk-IDGDMJMJ.js';
1
+ import { useDurableParityRunFields, buildNodeDisplayMap, useRunMetadata, useRunPending, ExecutionStatusBadge, formatRunVersion, NodeTimeline, RunLogViewer, setRunVersioningOverride } from './chunk-UWNCFMHV.js';
2
+ import { useExecution, useExecutionActions, useAutoRefresh, runChainLinks, shortRunId, callbackTone, parseMetadataDefinition, overrideRequestOf } from './chunk-HWEKWYXQ.js';
3
+ import { fetchRunFailureClusters, OPEN_STATUSES, dismissRunFailureCluster, BUCKET_LABELS } from './chunk-V5PA5KGV.js';
4
+ import { useRunPolicyDecisions, RunPolicyDecisions } from './chunk-UIDJT3YK.js';
5
+ import { useDurableRunFields, useRunHistory, useDeterminismStatus, useRunStackTrace, EntityTagPicker, RunHistoryView, SignalRunDialog, terminateDurableRun, useWorkflowProposal, WorkflowProposalCard } from './chunk-T22LICGX.js';
6
6
  import { AiCreditBalanceSlot } from './chunk-Y53CVZVV.js';
7
- import { useWorkflowVersions } from './chunk-OJPJ2QXD.js';
8
- import { throwIfResultError, useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS, useDurableFunctionNodesEnabled, useDurableParityEnabled, runSignalTargets, canSignalRun, describeOperationError } from './chunk-K4BF7PAW.js';
7
+ import { useWorkflowVersions } from './chunk-G3KZOX52.js';
8
+ import { throwIfResultError, useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS, useDurableFunctionNodesEnabled, useDurableParityEnabled, runSignalTargets, canSignalRun, describeOperationError } from './chunk-NAYPOEYM.js';
9
9
  import { getFluidGridsConfig } from './chunk-6AMNEX2Y.js';
10
- import { RunLogsDocument, RunLogAppendedDocument, ExplainRunDocument } from './chunk-YTUIGIVP.js';
10
+ import { RunLogsDocument, RunLogAppendedDocument, ExplainRunDocument } from './chunk-GQTEHWWY.js';
11
11
  import { useTr } from './chunk-UULVIT25.js';
12
12
  import { getFluidGridsClient, getFluidGridsClientSafe } from './chunk-NTWG3CJX.js';
13
13
  import { useState, useRef, useCallback, useEffect, useMemo } from 'react';
@@ -1,4 +1,4 @@
1
- import { throwIfResultError, describeOperationError } from './chunk-K4BF7PAW.js';
1
+ import { throwIfResultError, describeOperationError } from './chunk-NAYPOEYM.js';
2
2
  import { useTr } from './chunk-UULVIT25.js';
3
3
  import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
4
4
  import { useState, useCallback, useEffect, useMemo } from 'react';
@@ -1,10 +1,10 @@
1
- import { validateDateRange, statusCountFilter, STATUS_COUNT_GROUP_BY, statusCountsOf } from './chunk-AXMEATLG.js';
2
- import { useAvailableTags } from './chunk-LAVHDFHI.js';
1
+ import { validateDateRange, statusCountFilter, STATUS_COUNT_GROUP_BY, statusCountsOf } from './chunk-HWEKWYXQ.js';
2
+ import { useAvailableTags } from './chunk-Z6I6A47T.js';
3
3
  import { executionsControls } from './chunk-D3UWK7GY.js';
4
4
  import { useFluidGridsPageControls } from './chunk-PJAWNFJV.js';
5
- import { useDurableParityEnabled, throwIfResultError, describeOperationError } from './chunk-K4BF7PAW.js';
5
+ import { useDurableParityEnabled, throwIfResultError, describeOperationError } from './chunk-NAYPOEYM.js';
6
6
  import { useExecutionsStore } from './chunk-6AMNEX2Y.js';
7
- import { SetWorkflowRunVersioningOverrideDocument, WorkflowRunsCountDocument, DurableParityRunFieldsDocument, WorkflowRunPendingDocument, WorkflowRunMetadataDocument } from './chunk-YTUIGIVP.js';
7
+ import { SetWorkflowRunVersioningOverrideDocument, WorkflowRunsCountDocument, DurableParityRunFieldsDocument, WorkflowRunPendingDocument, WorkflowRunMetadataDocument } from './chunk-GQTEHWWY.js';
8
8
  import { useTr } from './chunk-UULVIT25.js';
9
9
  import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
10
10
  import { Icon } from '@iconify/react';