@burdenoff/fluidgrids-fe-sdk 2026.1102.1 → 2026.1102.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.
Files changed (49) hide show
  1. package/dist/{ExecutionDetailPage-DSLBVHNF.js → ExecutionDetailPage-XHII23QR.js} +11 -11
  2. package/dist/{ExecutionsListPage-4JAHYMBY.js → ExecutionsListPage-GTCSYSC6.js} +7 -7
  3. package/dist/{WorkflowBuilder-KY7WPG6S.js → WorkflowBuilder-ZIXEU7DQ.js} +12 -11
  4. package/dist/{WorkflowsList-R54WQMBJ.js → WorkflowsList-NYSQEZWU.js} +7 -7
  5. package/dist/{agentTools-4WNGUHVC.js → agentTools-PA62A53S.js} +4 -4
  6. package/dist/{chunk-UFT457ZJ.js → chunk-23LYGZ27.js} +1 -1
  7. package/dist/{chunk-MOMFAIGR.js → chunk-37BKVPO7.js} +12 -40
  8. package/dist/{chunk-WNZKFW7A.js → chunk-3Y4266JL.js} +3 -3
  9. package/dist/{chunk-K4UJ27ED.js → chunk-4FDMLKLL.js} +2 -2
  10. package/dist/{chunk-KD4O5ODO.js → chunk-6VODFT2Q.js} +5 -5
  11. package/dist/{chunk-VZ3KQIQE.js → chunk-7JLLH4YE.js} +4 -4
  12. package/dist/{chunk-IG5BMZXN.js → chunk-7SY2SL5Y.js} +6 -6
  13. package/dist/{chunk-WEE4WVMB.js → chunk-A4XNCGWT.js} +2 -2
  14. package/dist/{chunk-BTQBEF4H.js → chunk-A7QPQ6MO.js} +1 -1
  15. package/dist/{chunk-6OCQ3M5C.js → chunk-B2DNUVKW.js} +4 -4
  16. package/dist/{chunk-SRQ2RPRL.js → chunk-BDBSRN2O.js} +4 -4
  17. package/dist/{chunk-FQ4IYSLN.js → chunk-CXNJKM4D.js} +1 -1
  18. package/dist/{chunk-OOVWMJBF.js → chunk-DLKGWGRN.js} +1 -1
  19. package/dist/{chunk-KQ3SBSDS.js → chunk-EFOJEQDS.js} +2 -2
  20. package/dist/{chunk-QMDG54ST.js → chunk-JCHE4V55.js} +1 -1
  21. package/dist/{chunk-ZC7XPBZN.js → chunk-JTQFBZTV.js} +2 -1
  22. package/dist/{chunk-5YNWH64U.js → chunk-MY752OLT.js} +67 -195
  23. package/dist/{chunk-Z6UUJWJ6.js → chunk-OR7KZZ2D.js} +1 -1
  24. package/dist/{chunk-ZLOASEDO.js → chunk-OUYEMZT6.js} +1 -1
  25. package/dist/{chunk-M3XHFK3Y.js → chunk-OZCJHPMH.js} +3 -3
  26. package/dist/{chunk-LENZTZNB.js → chunk-P6IRD5SA.js} +10 -10
  27. package/dist/chunk-PBCBDSVA.js +1480 -0
  28. package/dist/{chunk-YBL4H324.js → chunk-PC3CICOW.js} +1 -1
  29. package/dist/{chunk-KI37QYJ7.js → chunk-QAXP5HON.js} +2 -2
  30. package/dist/{chunk-LN5LXMNA.js → chunk-TJ2PFY7I.js} +2 -2
  31. package/dist/{chunk-ENULBWW2.js → chunk-UETHT3KG.js} +2 -2
  32. package/dist/{chunk-DUE25AIG.js → chunk-VFLHURFM.js} +1 -1
  33. package/dist/{chunk-WOSFZWOQ.js → chunk-W74MXVFX.js} +1 -1
  34. package/dist/{chunk-QK76M4E5.js → chunk-XNVYPEBO.js} +129 -21
  35. package/dist/{chunk-3VEJGG5F.js → chunk-YVOHCC7J.js} +4 -4
  36. package/dist/{chunk-GAVK2EWX.js → chunk-ZTJX5ONT.js} +4 -4
  37. package/dist/executions.js +12 -12
  38. package/dist/history.js +5 -4
  39. package/dist/index.d.ts +21 -1
  40. package/dist/index.js +43 -42
  41. package/dist/{node-detail-view-6TN4ZLIC.js → node-detail-view-KET5DNEH.js} +8 -8
  42. package/dist/nodes.js +2 -2
  43. package/dist/observability.js +5 -5
  44. package/dist/{quick-config-panel-GNAQCCFQ.js → quick-config-panel-L6CTZQUG.js} +5 -5
  45. package/dist/settings.js +6 -6
  46. package/dist/templates.js +11 -10
  47. package/dist/workflow-builder.js +13 -12
  48. package/dist/workflows-list.js +7 -7
  49. package/package.json +1 -1
@@ -3,23 +3,24 @@ import { templatePreview } from './chunk-B6CCE2RW.js';
3
3
  import { Input } from './chunk-IEVSFCFS.js';
4
4
  import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter as DialogFooter$1 } from './chunk-YXMFRQYV.js';
5
5
  import { Badge as Badge$1, Button } from './chunk-BQXVT32O.js';
6
- import { LogsPanel } from './chunk-WOSFZWOQ.js';
7
- import { editStateFor, isFlowComplete, touchesSavedFields, watchLeavingLosesChanges, savedEverythingBeforeLeaving, leavingLosesChanges, useFlowValidator, departingSave, runPreparation, computeAttachPosition, firstInputHandleId, editingLeaseLocked, autosaveAllowedFor } from './chunk-ZLOASEDO.js';
8
- import { QuotaExhaustedDialog, useWorkflowCodeExport, orderedExportFiles, fileBaseName, downloadWorkflowCodeExport, isLosslessReport, sortFidelityItems, isLossyFidelityItem, lineOfNode } from './chunk-K4UJ27ED.js';
9
- import { emptyTestCaseDraft, EntityTagPicker, useWorkflowProposal, WorkflowProposalCard, useWorkflowTests, pinnedOutputsFromCanvas, enabledCaseIds, isTestRunOpen, MAX_TEST_CASES, draftFromTestCase, testRunSummaryText, testStatusLabel, TEST_STATUS_TONE_CLASS, testStatusTone, MAX_CASE_NAME, nextSortOrder, draftToInput } from './chunk-WNZKFW7A.js';
10
- import { buildNodeDisplayMap } from './chunk-YBL4H324.js';
6
+ import { LogsPanel } from './chunk-W74MXVFX.js';
7
+ import { editStateFor, isFlowComplete, touchesSavedFields, watchLeavingLosesChanges, savedEverythingBeforeLeaving, leavingLosesChanges, useFlowValidator, departingSave, runPreparation, computeAttachPosition, firstInputHandleId, editingLeaseLocked, autosaveAllowedFor } from './chunk-OUYEMZT6.js';
8
+ import { QuotaExhaustedDialog, useWorkflowCodeExport, orderedExportFiles, fileBaseName, downloadWorkflowCodeExport, isLosslessReport, sortFidelityItems, isLossyFidelityItem, lineOfNode } from './chunk-4FDMLKLL.js';
9
+ import { emptyTestCaseDraft, EntityTagPicker, useWorkflowProposal, WorkflowProposalCard, useWorkflowTests, pinnedOutputsFromCanvas, enabledCaseIds, isTestRunOpen, MAX_TEST_CASES, draftFromTestCase, testRunSummaryText, testStatusLabel, TEST_STATUS_TONE_CLASS, testStatusTone, MAX_CASE_NAME, nextSortOrder, draftToInput } from './chunk-3Y4266JL.js';
10
+ import { buildNodeDisplayMap } from './chunk-PC3CICOW.js';
11
11
  import { AiCreditBalanceSlot } from './chunk-Y53CVZVV.js';
12
- import { useRestoreWorkflowVersion, useWorkflowVersions, useActivateWorkflow, useDeleteWorkflow, useLazyWorkflowDefinition, useDeactivateWorkflow } from './chunk-KQ3SBSDS.js';
12
+ import { countLifecycle, VersionLifecycleBar, VersionDiffDialog } from './chunk-PBCBDSVA.js';
13
+ import { useRestoreWorkflowVersion, useWorkflowVersions, useActivateWorkflow, useDeleteWorkflow, useDeactivateWorkflow } from './chunk-EFOJEQDS.js';
13
14
  import { useRequestedProposal } from './chunk-GLYINMOR.js';
14
15
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
15
- import { leaseCallQueue, RUNS_QUOTA_NAME, useFlowStore, BILLING_PLANS_PATH, emitUpgradeClicked, FluidGridsContext, throwIfResultError, emitWorkflowCreated, emitTemplateUsed, describeOperationError, ensureNodeConfigsLoaded, NODE_CONFIGS, useEditLeaseStore, useEditLeaseLocked, registerWorkflowNodeTypes, emitNodeInstalled, useNodeExecution, usePaletteGates, onNodeTypesUpdate, NODE_TYPES, getNodeMetadata, useIsValidConnection, refetchStoreNodes, AVAILABLE_NODES, EDIT_SESSION_ID, useInsertNode, NODE_TYPE_DRAG_DATA_FORMAT, NODE_OPERATION_DRAG_DATA_FORMAT, useSaveStatusStore, useDurableFunctionNodesEnabled, CODE_WORKFLOW_NODE_TYPE, bannerOf, useSaveWorkflow, STICKY_NOTE_TYPE, filterPaletteNodes, useFluidGridsAnalytics, sessionBeforeReload, forgetSessionForReload, releasesOnClose, isLocked, workflowFingerprint, buildStickyNode, NODES_METADATA, NodeTypeIcon, shouldReleaseForIdle, tickAction, rememberSessionForReload, buildOperationSeed, useDurableParityEnabled, useConnections, ConnectionFormDialog, useWorkflowTestsEnabled, useFluidGridsFlag, FLUIDGRIDS_FLAGS, saveIndicatorOf, inAppLeaveTarget, isNodeConfigsInitialized, phaseAfterAcquire, rememberOwnStatusChange, getNodeDetail, isImageIcon, NODES, synchronizeOperationUpdate, NodePropertyPanel, loadDefinitionJson, canAutosave, isNodeTypeHiddenFromPalette, isTriggerOperation, canRenderOperationPanel, resolveOperationName, ConnectionSelector, savesInPlace, AUTOSAVE_RETRY_DELAYS_MS, AUTOSAVE_DEBOUNCE_MS, rememberRevision, phaseAfterTakeOver } from './chunk-UFT457ZJ.js';
16
+ import { leaseCallQueue, RUNS_QUOTA_NAME, useFlowStore, BILLING_PLANS_PATH, emitUpgradeClicked, FluidGridsContext, throwIfResultError, emitWorkflowCreated, emitTemplateUsed, describeOperationError, ensureNodeConfigsLoaded, NODE_CONFIGS, useEditLeaseStore, useEditLeaseLocked, registerWorkflowNodeTypes, emitNodeInstalled, useNodeExecution, usePaletteGates, onNodeTypesUpdate, NODE_TYPES, getNodeMetadata, useIsValidConnection, refetchStoreNodes, AVAILABLE_NODES, EDIT_SESSION_ID, useInsertNode, NODE_TYPE_DRAG_DATA_FORMAT, NODE_OPERATION_DRAG_DATA_FORMAT, useSaveStatusStore, useDurableFunctionNodesEnabled, CODE_WORKFLOW_NODE_TYPE, bannerOf, useSaveWorkflow, STICKY_NOTE_TYPE, filterPaletteNodes, useFluidGridsAnalytics, sessionBeforeReload, forgetSessionForReload, releasesOnClose, isLocked, workflowFingerprint, buildStickyNode, NODES_METADATA, NodeTypeIcon, shouldReleaseForIdle, tickAction, rememberSessionForReload, buildOperationSeed, useDurableParityEnabled, useConnections, ConnectionFormDialog, useWorkflowTestsEnabled, useFluidGridsFlag, FLUIDGRIDS_FLAGS, saveIndicatorOf, inAppLeaveTarget, isNodeConfigsInitialized, phaseAfterAcquire, rememberOwnStatusChange, getNodeDetail, isImageIcon, NODES, synchronizeOperationUpdate, NodePropertyPanel, loadDefinitionJson, canAutosave, isNodeTypeHiddenFromPalette, isTriggerOperation, canRenderOperationPanel, resolveOperationName, ConnectionSelector, savesInPlace, AUTOSAVE_RETRY_DELAYS_MS, AUTOSAVE_DEBOUNCE_MS, rememberRevision, phaseAfterTakeOver } from './chunk-23LYGZ27.js';
16
17
  import { SdkPermissionButton, FLUIDGRIDS_PERMISSIONS, useFluidGridsPermission } from './chunk-ZUVFD5KV.js';
17
18
  import { cn } from './chunk-JL7CASN5.js';
18
19
  import { BuilderReadOnlyProvider, useBuilderReadOnly } from './chunk-OCJTTHTS.js';
19
20
  import { getGlobalStoreClient } from './chunk-PXIFUMLA.js';
20
21
  import { getFluidGridsConfig } from './chunk-6AMNEX2Y.js';
21
22
  import { GetMyNodeInstallationsDocument, BrowseWorkflowTemplatesDocument, InstallWorkflowNodeDocument, SubmitWorkflowTemplateDocument, MyWorkflowTemplateSubmissionsDocument, WithdrawWorkflowTemplateSubmissionDocument, InstallPurchasedNodeDocument, BrowseWorkflowNodesDocument, UninstallWorkflowNodeDocument, CreateStoreOrderDocument, GetNodeInstallableVersionsDocument, OrganizationPrivateNodesDocument, InstallOrganizationPrivateNodeDocument, UninstallOrganizationPrivateNodeDocument } from './chunk-G77IGC3Y.js';
22
- import { WorkspaceRunsQuotaDocument, WorkflowGenerationTemplatesDocument, ReleaseWorkflowEditLeaseDocument, NodeSchemaIntrospectionDocument, AcquireWorkflowEditLeaseDocument, WorkflowEnvironmentsDocument, WorkflowPromotionRequestsDocument, DeployWorkflowVersionToDevDocument, RequestWorkflowPromotionDocument, ApproveWorkflowPromotionDocument, RejectWorkflowPromotionDocument, CancelWorkflowPromotionDocument, UpdateWorkflowEnvironmentPolicyDocument, WorkflowGitRepositoryDocument, WorkflowGitPushesDocument, WorkflowGitCommitsDocument, LinkWorkflowGitRepositoryDocument, UnlinkWorkflowGitRepositoryDocument, PushWorkflowToGitDocument, WorkflowGitDiffDocument, RestoreWorkflowFromGitDocument, WorkflowAuthoringDocument, WorkflowEditLeaseDocument, WorkflowVersioningDocument, WorkflowVersionDrainageDocument, ActivateWorkflowVersionCheckedDocument, WorkflowDefinitionDocument, NodeUsageStatusDocument, RemoveNodeFromWorkflowsDocument, SetWorkflowRolloutDocument, DeleteWorkflowRolloutDocument, TakeOverWorkflowEditLeaseDocument } from './chunk-ZC7XPBZN.js';
23
+ import { WorkspaceRunsQuotaDocument, WorkflowGenerationTemplatesDocument, ReleaseWorkflowEditLeaseDocument, NodeSchemaIntrospectionDocument, AcquireWorkflowEditLeaseDocument, WorkflowEnvironmentsDocument, WorkflowPromotionRequestsDocument, DeployWorkflowVersionToDevDocument, RequestWorkflowPromotionDocument, ApproveWorkflowPromotionDocument, RejectWorkflowPromotionDocument, CancelWorkflowPromotionDocument, UpdateWorkflowEnvironmentPolicyDocument, WorkflowGitRepositoryDocument, WorkflowGitPushesDocument, WorkflowGitCommitsDocument, LinkWorkflowGitRepositoryDocument, UnlinkWorkflowGitRepositoryDocument, PushWorkflowToGitDocument, WorkflowGitDiffDocument, RestoreWorkflowFromGitDocument, WorkflowAuthoringDocument, WorkflowEditLeaseDocument, WorkflowVersioningDocument, WorkflowVersionDrainageDocument, ActivateWorkflowVersionCheckedDocument, WorkflowDefinitionDocument, NodeUsageStatusDocument, RemoveNodeFromWorkflowsDocument, SetWorkflowRolloutDocument, DeleteWorkflowRolloutDocument, TakeOverWorkflowEditLeaseDocument } from './chunk-JTQFBZTV.js';
23
24
  import { useTr } from './chunk-UULVIT25.js';
24
25
  import { waitForFluidGridsClient, getFluidGridsClient } from './chunk-NTWG3CJX.js';
25
26
  import * as React3 from 'react';
@@ -15601,81 +15602,6 @@ async function refreshOpenRevision() {
15601
15602
  } catch {
15602
15603
  }
15603
15604
  }
15604
-
15605
- // src/utils/workflow-definition-diff.ts
15606
- function isRecord2(value) {
15607
- return typeof value === "object" && value !== null && !Array.isArray(value);
15608
- }
15609
- function equalJson(left, right) {
15610
- if (Object.is(left, right)) return true;
15611
- if (Array.isArray(left) && Array.isArray(right)) {
15612
- return left.length === right.length && left.every((value, index) => equalJson(value, right[index]));
15613
- }
15614
- if (isRecord2(left) && isRecord2(right)) {
15615
- const leftKeys = Object.keys(left).sort((a, b) => a.localeCompare(b));
15616
- const rightKeys = Object.keys(right).sort((a, b) => a.localeCompare(b));
15617
- return leftKeys.length === rightKeys.length && leftKeys.every(
15618
- (key, index) => key === rightKeys[index] && equalJson(left[key], right[key])
15619
- );
15620
- }
15621
- return false;
15622
- }
15623
- function diffWorkflowDefinitionJson(before, after, maxEntries = 2e3) {
15624
- const entries = [];
15625
- const visit = (left, right, path) => {
15626
- if (entries.length >= maxEntries || equalJson(left, right)) return;
15627
- if (isRecord2(left) && isRecord2(right)) {
15628
- const keys = [
15629
- .../* @__PURE__ */ new Set([...Object.keys(left), ...Object.keys(right)])
15630
- ].sort((a, b) => a.localeCompare(b));
15631
- for (const key of keys) {
15632
- const childPath = `${path}.${key}`;
15633
- if (!(key in left))
15634
- entries.push({
15635
- path: childPath,
15636
- kind: "ADDED",
15637
- before: void 0,
15638
- after: right[key]
15639
- });
15640
- else if (!(key in right))
15641
- entries.push({
15642
- path: childPath,
15643
- kind: "REMOVED",
15644
- before: left[key],
15645
- after: void 0
15646
- });
15647
- else visit(left[key], right[key], childPath);
15648
- if (entries.length >= maxEntries) return;
15649
- }
15650
- return;
15651
- }
15652
- if (Array.isArray(left) && Array.isArray(right)) {
15653
- for (let index = 0; index < Math.max(left.length, right.length); index += 1) {
15654
- const childPath = `${path}[${index}]`;
15655
- if (index >= left.length)
15656
- entries.push({
15657
- path: childPath,
15658
- kind: "ADDED",
15659
- before: void 0,
15660
- after: right[index]
15661
- });
15662
- else if (index >= right.length)
15663
- entries.push({
15664
- path: childPath,
15665
- kind: "REMOVED",
15666
- before: left[index],
15667
- after: void 0
15668
- });
15669
- else visit(left[index], right[index], childPath);
15670
- if (entries.length >= maxEntries) return;
15671
- }
15672
- return;
15673
- }
15674
- entries.push({ path, kind: "CHANGED", before: left, after: right });
15675
- };
15676
- visit(before, after, "$");
15677
- return entries;
15678
- }
15679
15605
  function aiAuthoringKind(facts) {
15680
15606
  if (facts?.aiAuthored) return "authored";
15681
15607
  if (facts?.aiEdited) return "edited";
@@ -15814,13 +15740,13 @@ function prodRollout(rollouts) {
15814
15740
  ) ?? null;
15815
15741
  }
15816
15742
  function isDurableDefinition(definitionJson) {
15817
- if (!isRecord3(definitionJson)) return false;
15743
+ if (!isRecord2(definitionJson)) return false;
15818
15744
  const code = definitionJson.code;
15819
- if (!isRecord3(code) || typeof code.buildId !== "string") return false;
15820
- const workflows = isRecord3(code.exports) ? code.exports.workflows : null;
15821
- return isRecord3(workflows) && Object.keys(workflows).length > 0;
15745
+ if (!isRecord2(code) || typeof code.buildId !== "string") return false;
15746
+ const workflows = isRecord2(code.exports) ? code.exports.workflows : null;
15747
+ return isRecord2(workflows) && Object.keys(workflows).length > 0;
15822
15748
  }
15823
- function isRecord3(value) {
15749
+ function isRecord2(value) {
15824
15750
  return typeof value === "object" && value !== null && !Array.isArray(value);
15825
15751
  }
15826
15752
  var EMPTY_STATE = {
@@ -16295,14 +16221,6 @@ function absoluteTime(dateStr) {
16295
16221
  return dateStr;
16296
16222
  }
16297
16223
  }
16298
- function formatDiffValue(value) {
16299
- if (value === void 0) return "\u2014";
16300
- try {
16301
- return JSON.stringify(value);
16302
- } catch {
16303
- return String(value);
16304
- }
16305
- }
16306
16224
  function ActionButton({
16307
16225
  label,
16308
16226
  onClick,
@@ -16366,12 +16284,10 @@ function VersionHistoryPanel({
16366
16284
  const { restoreVersion } = useRestoreWorkflowVersion();
16367
16285
  const { activateWorkflow } = useActivateWorkflow();
16368
16286
  const { deleteWorkflow } = useDeleteWorkflow();
16369
- const { getWorkflow } = useLazyWorkflowDefinition();
16370
16287
  const setWorkflow = useFlowStore((s) => s.actions.setWorkflow);
16371
16288
  const [compareFrom, setCompareFrom] = useState("");
16372
16289
  const [compareTo, setCompareTo] = useState("");
16373
- const [comparison, setComparison] = useState(null);
16374
- const [compareLoading, setCompareLoading] = useState(false);
16290
+ const [diffOpen, setDiffOpen] = useState(false);
16375
16291
  const [busy, setBusy] = useState(null);
16376
16292
  const [deleteTarget, setDeleteTarget] = useState(null);
16377
16293
  const parityEnabled = useDurableParityEnabled();
@@ -16390,7 +16306,7 @@ function VersionHistoryPanel({
16390
16306
  if (versions.length < 2) {
16391
16307
  setCompareFrom("");
16392
16308
  setCompareTo("");
16393
- setComparison(null);
16309
+ setDiffOpen(false);
16394
16310
  return;
16395
16311
  }
16396
16312
  setCompareFrom((current) => current || versions[1]?.version || "");
@@ -16415,39 +16331,8 @@ function VersionHistoryPanel({
16415
16331
  if (!createdById) return null;
16416
16332
  return actorProfiles[createdById]?.displayName ?? buildActorFallback({ actorId: createdById, actorType: "user" }).displayName;
16417
16333
  };
16418
- const handleCompare = async () => {
16419
- if (!compareFrom || !compareTo || compareFrom === compareTo) return;
16420
- setCompareLoading(true);
16421
- try {
16422
- const [fromWorkflow, toWorkflow] = await Promise.all([
16423
- getWorkflow(workflowKey, void 0, compareFrom),
16424
- getWorkflow(workflowKey, void 0, compareTo)
16425
- ]);
16426
- if (!fromWorkflow || !toWorkflow)
16427
- throw new Error("Unable to load both workflow versions");
16428
- setComparison({
16429
- fromVersion: compareFrom,
16430
- toVersion: compareTo,
16431
- entries: diffWorkflowDefinitionJson(
16432
- fromWorkflow.definitionJson,
16433
- toWorkflow.definitionJson
16434
- )
16435
- });
16436
- } catch (error) {
16437
- toast.error(
16438
- tr(
16439
- "fluidgrids.builder.versionHistory.compareError",
16440
- "Failed to compare versions"
16441
- ),
16442
- {
16443
- description: error instanceof Error ? error.message : "Unknown error"
16444
- }
16445
- );
16446
- setComparison(null);
16447
- } finally {
16448
- setCompareLoading(false);
16449
- }
16450
- };
16334
+ const lifecycleCounts = useMemo(() => countLifecycle(versions), [versions]);
16335
+ const openVersion = versions.find((v) => v.version === currentVersion);
16451
16336
  const handleRestore = async (version) => {
16452
16337
  setBusy(`restore:${version}`);
16453
16338
  try {
@@ -16664,6 +16549,20 @@ function VersionHistoryPanel({
16664
16549
  }
16665
16550
  }
16666
16551
  ),
16552
+ !loading && openVersion && /* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
16553
+ /* @__PURE__ */ jsx("p", { className: "mb-1.5 text-xs text-muted-foreground", children: tr(
16554
+ "fluidgrids.builder.versionHistory.lifecycleCaption",
16555
+ "Lifecycle of version {{version}} (number of versions per stage)",
16556
+ { version: openVersion.version }
16557
+ ) }),
16558
+ /* @__PURE__ */ jsx(
16559
+ VersionLifecycleBar,
16560
+ {
16561
+ status: openVersion.status,
16562
+ counts: lifecycleCounts
16563
+ }
16564
+ )
16565
+ ] }),
16667
16566
  !loading && versions.length > 1 && /* @__PURE__ */ jsxs(
16668
16567
  "section",
16669
16568
  {
@@ -16726,68 +16625,18 @@ function VersionHistoryPanel({
16726
16625
  className: "mt-2 w-full",
16727
16626
  size: "sm",
16728
16627
  variant: "secondary",
16729
- disabled: compareLoading || !compareFrom || !compareTo || compareFrom === compareTo,
16730
- onClick: () => void handleCompare(),
16628
+ disabled: !compareFrom || !compareTo || compareFrom === compareTo,
16629
+ onClick: () => setDiffOpen(true),
16630
+ "data-testid": "fluidgrids-version-compare-button",
16731
16631
  children: [
16732
- compareLoading ? /* @__PURE__ */ jsx(Loader2, { className: "mr-2 size-3.5 animate-spin" }) : /* @__PURE__ */ jsx(GitCompareArrows, { className: "mr-2 size-3.5" }),
16733
- compareLoading ? tr(
16734
- "fluidgrids.builder.versionHistory.comparing",
16735
- "Comparing\u2026"
16736
- ) : tr(
16632
+ /* @__PURE__ */ jsx(GitCompareArrows, { className: "mr-2 size-3.5" }),
16633
+ tr(
16737
16634
  "fluidgrids.builder.versionHistory.compareButton",
16738
16635
  "Compare"
16739
16636
  )
16740
16637
  ]
16741
16638
  }
16742
- ),
16743
- comparison && /* @__PURE__ */ jsxs("div", { className: "mt-3 space-y-2 border-t border-border pt-3", children: [
16744
- /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
16745
- comparison.fromVersion,
16746
- " \u2192 ",
16747
- comparison.toVersion,
16748
- ":",
16749
- " ",
16750
- comparison.entries.length,
16751
- " ",
16752
- tr(
16753
- "fluidgrids.builder.versionHistory.changes",
16754
- "changes"
16755
- )
16756
- ] }),
16757
- comparison.entries.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: tr(
16758
- "fluidgrids.builder.versionHistory.noChanges",
16759
- "Definitions are identical"
16760
- ) }) : /* @__PURE__ */ jsx("ul", { className: "max-h-64 space-y-1 overflow-y-auto", children: comparison.entries.map((entry) => /* @__PURE__ */ jsxs(
16761
- "li",
16762
- {
16763
- className: "rounded border border-border p-2 text-xs",
16764
- children: [
16765
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
16766
- /* @__PURE__ */ jsx(
16767
- Badge,
16768
- {
16769
- variant: entry.kind === "CHANGED" ? "secondary" : entry.kind === "ADDED" ? "default" : "destructive",
16770
- className: "text-[10px]",
16771
- children: entry.kind
16772
- }
16773
- ),
16774
- /* @__PURE__ */ jsx("code", { className: "min-w-0 truncate font-mono", children: entry.path })
16775
- ] }),
16776
- entry.kind === "CHANGED" && /* @__PURE__ */ jsxs("div", { className: "mt-1 grid gap-1 text-[11px] text-muted-foreground", children: [
16777
- /* @__PURE__ */ jsxs("span", { className: "truncate", children: [
16778
- "\u2212 ",
16779
- formatDiffValue(entry.before)
16780
- ] }),
16781
- /* @__PURE__ */ jsxs("span", { className: "truncate", children: [
16782
- "+ ",
16783
- formatDiffValue(entry.after)
16784
- ] })
16785
- ] })
16786
- ]
16787
- },
16788
- `${entry.kind}-${entry.path}`
16789
- )) })
16790
- ] })
16639
+ )
16791
16640
  ]
16792
16641
  }
16793
16642
  ),
@@ -16981,6 +16830,29 @@ function VersionHistoryPanel({
16981
16830
  }) })
16982
16831
  ] }) })
16983
16832
  ] }),
16833
+ diffOpen && compareFrom && compareTo && /* @__PURE__ */ jsx(
16834
+ VersionDiffDialog,
16835
+ {
16836
+ open: diffOpen,
16837
+ onOpenChange: setDiffOpen,
16838
+ workflowKey,
16839
+ workflowName: openVersion?.name ?? versions[0]?.name,
16840
+ versions,
16841
+ initialFrom: compareFrom,
16842
+ initialTo: compareTo,
16843
+ currentVersion,
16844
+ authorName,
16845
+ onRestore: async (version) => {
16846
+ await handleRestore(version);
16847
+ setDiffOpen(false);
16848
+ },
16849
+ onOpenVersion: (version) => {
16850
+ setDiffOpen(false);
16851
+ handleSwitchVersion(version);
16852
+ },
16853
+ className: "z-[120]"
16854
+ }
16855
+ ),
16984
16856
  parityEnabled && /* @__PURE__ */ jsx(
16985
16857
  ForceActivateDialog,
16986
16858
  {
@@ -18200,7 +18072,7 @@ var EMPTY_FORM = {
18200
18072
  pushOnActivation: true,
18201
18073
  pushOnPromotion: true
18202
18074
  };
18203
- function formatDiffValue2(value) {
18075
+ function formatDiffValue(value) {
18204
18076
  if (value === void 0 || value === null) return "\u2014";
18205
18077
  try {
18206
18078
  return JSON.stringify(value);
@@ -18942,11 +18814,11 @@ function GitSyncPanel({
18942
18814
  entry.kind === "CHANGED" && /* @__PURE__ */ jsxs("div", { className: "mt-1 grid gap-1 text-[11px] text-muted-foreground", children: [
18943
18815
  /* @__PURE__ */ jsxs("span", { className: "truncate", children: [
18944
18816
  "\u2212 ",
18945
- formatDiffValue2(entry.before)
18817
+ formatDiffValue(entry.before)
18946
18818
  ] }),
18947
18819
  /* @__PURE__ */ jsxs("span", { className: "truncate", children: [
18948
18820
  "+ ",
18949
- formatDiffValue2(entry.after)
18821
+ formatDiffValue(entry.after)
18950
18822
  ] })
18951
18823
  ] })
18952
18824
  ]
@@ -21466,12 +21338,12 @@ function EditLeaseBanner() {
21466
21338
  );
21467
21339
  }
21468
21340
  var LazyNodeDetailView = lazy(
21469
- () => import('./node-detail-view-6TN4ZLIC.js').then((m) => ({
21341
+ () => import('./node-detail-view-KET5DNEH.js').then((m) => ({
21470
21342
  default: m.NodeDetailView
21471
21343
  }))
21472
21344
  );
21473
21345
  var LazyQuickConfigPanel = lazy(
21474
- () => import('./quick-config-panel-GNAQCCFQ.js').then((m) => ({
21346
+ () => import('./quick-config-panel-L6CTZQUG.js').then((m) => ({
21475
21347
  default: m.QuickConfigPanel
21476
21348
  }))
21477
21349
  );
@@ -21533,7 +21405,7 @@ var FlowBuilder = ({ readOnly = false }) => {
21533
21405
  );
21534
21406
  useEffect(() => {
21535
21407
  let cancelled = false;
21536
- void import('./agentTools-4WNGUHVC.js').then(({ createBuilderAgentTools }) => {
21408
+ void import('./agentTools-PA62A53S.js').then(({ createBuilderAgentTools }) => {
21537
21409
  if (cancelled) return;
21538
21410
  setAgentTools(
21539
21411
  createBuilderAgentTools({
@@ -1,4 +1,4 @@
1
- import { throwIfResultError } from './chunk-UFT457ZJ.js';
1
+ import { throwIfResultError } from './chunk-23LYGZ27.js';
2
2
  import { useTr } from './chunk-UULVIT25.js';
3
3
  import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
4
4
  import { useState, useRef, useCallback, useEffect } from 'react';
@@ -1,4 +1,4 @@
1
- import { STICKY_NOTE_TYPE, isNodeTrigger, isLocked, useEditLeaseStore, useSaveStatusStore, canAutosave, editStateOf, workflowFingerprint, snapshotForSave, leaveNeedsConfirmation, runPreparationOf, useFlowStore, resolveInputHandles } from './chunk-UFT457ZJ.js';
1
+ import { STICKY_NOTE_TYPE, isNodeTrigger, isLocked, useEditLeaseStore, useSaveStatusStore, canAutosave, editStateOf, workflowFingerprint, snapshotForSave, leaveNeedsConfirmation, runPreparationOf, useFlowStore, resolveInputHandles } from './chunk-23LYGZ27.js';
2
2
  import { getConnectedEdges, useReactFlow } from '@xyflow/react';
3
3
  import { useState, useCallback } from 'react';
4
4
 
@@ -1,8 +1,8 @@
1
- import { Card, FluidGridsMark } from './chunk-5YNWH64U.js';
1
+ import { Card, FluidGridsMark } from './chunk-MY752OLT.js';
2
2
  import { Input } from './chunk-IEVSFCFS.js';
3
3
  import { Button } from './chunk-BQXVT32O.js';
4
- import { useWorkflowDefinition } from './chunk-KQ3SBSDS.js';
5
- import { FluidGridsProvider, useFlowStore } from './chunk-UFT457ZJ.js';
4
+ import { useWorkflowDefinition } from './chunk-EFOJEQDS.js';
5
+ import { FluidGridsProvider, useFlowStore } from './chunk-23LYGZ27.js';
6
6
  import { cn } from './chunk-JL7CASN5.js';
7
7
  import { useTr } from './chunk-UULVIT25.js';
8
8
  import { useState, useRef, useEffect, useCallback } from 'react';
@@ -1,16 +1,16 @@
1
- import { useDurableRunFields, useRunHistory, useDeterminismStatus, useRunStackTrace, RunHistoryView, SignalRunDialog, terminateDurableRun } from './chunk-ENULBWW2.js';
2
- import { useDurableParityRunFields, useRunMetadata, useRunPending, ExecutionStatusBadge, NodeTimeline, RunLogViewer, setRunVersioningOverride } from './chunk-GAVK2EWX.js';
3
- import { useExecution, useExecutionActions, useAutoRefresh, runChainLinks, shortRunId, callbackTone, parseMetadataDefinition, overrideRequestOf } from './chunk-KI37QYJ7.js';
4
- import { fetchRunFailureClusters, OPEN_STATUSES, dismissRunFailureCluster, BUCKET_LABELS } from './chunk-WEE4WVMB.js';
5
- import { useRunPolicyDecisions, RunPolicyDecisions } from './chunk-OOVWMJBF.js';
6
- import { EntityTagPicker, canSaveRunAsTestCase, useWorkflowProposal, WorkflowProposalCard, MAX_CASE_NAME, saveRunAsTestCase } from './chunk-WNZKFW7A.js';
7
- import { buildNodeDisplayMap, formatRunVersion } from './chunk-YBL4H324.js';
1
+ import { useDurableRunFields, useRunHistory, useDeterminismStatus, useRunStackTrace, RunHistoryView, SignalRunDialog, terminateDurableRun } from './chunk-UETHT3KG.js';
2
+ import { useDurableParityRunFields, useRunMetadata, useRunPending, ExecutionStatusBadge, NodeTimeline, RunLogViewer, setRunVersioningOverride } from './chunk-ZTJX5ONT.js';
3
+ import { useExecution, useExecutionActions, useAutoRefresh, runChainLinks, shortRunId, callbackTone, parseMetadataDefinition, overrideRequestOf } from './chunk-QAXP5HON.js';
4
+ import { fetchRunFailureClusters, OPEN_STATUSES, dismissRunFailureCluster, BUCKET_LABELS } from './chunk-A4XNCGWT.js';
5
+ import { useRunPolicyDecisions, RunPolicyDecisions } from './chunk-DLKGWGRN.js';
6
+ import { EntityTagPicker, canSaveRunAsTestCase, useWorkflowProposal, WorkflowProposalCard, MAX_CASE_NAME, saveRunAsTestCase } from './chunk-3Y4266JL.js';
7
+ import { buildNodeDisplayMap, formatRunVersion } from './chunk-PC3CICOW.js';
8
8
  import { AiCreditBalanceSlot } from './chunk-Y53CVZVV.js';
9
- import { useWorkflowVersions } from './chunk-KQ3SBSDS.js';
10
- import { throwIfResultError, useDurableFunctionNodesEnabled, useDurableParityEnabled, runSignalTargets, canSignalRun, useWorkflowTestsEnabled, describeOperationError } from './chunk-UFT457ZJ.js';
9
+ import { useWorkflowVersions } from './chunk-EFOJEQDS.js';
10
+ import { throwIfResultError, useDurableFunctionNodesEnabled, useDurableParityEnabled, runSignalTargets, canSignalRun, useWorkflowTestsEnabled, describeOperationError } from './chunk-23LYGZ27.js';
11
11
  import { useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS, SdkPermissionButton } from './chunk-ZUVFD5KV.js';
12
12
  import { getFluidGridsConfig } from './chunk-6AMNEX2Y.js';
13
- import { RunLogsDocument, RunLogAppendedDocument, ExplainRunDocument } from './chunk-ZC7XPBZN.js';
13
+ import { RunLogsDocument, RunLogAppendedDocument, ExplainRunDocument } from './chunk-JTQFBZTV.js';
14
14
  import { useTr } from './chunk-UULVIT25.js';
15
15
  import { getFluidGridsClient, getFluidGridsClientSafe } from './chunk-NTWG3CJX.js';
16
16
  import { useState, useRef, useCallback, useEffect, useMemo } from 'react';