@burdenoff/fluidgrids-fe-sdk 2026.1028.7 → 2026.1028.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 (44) hide show
  1. package/dist/ExecutionDetailPage-ACTSQG5E.js +20 -0
  2. package/dist/{ExecutionsListPage-BT3ADBXP.js → ExecutionsListPage-FABXLXWT.js} +7 -7
  3. package/dist/WorkflowBuilder-OECFTQDQ.js +24 -0
  4. package/dist/{WorkflowsList-FZ4W64YZ.js → WorkflowsList-4HG3KBMR.js} +9 -7
  5. package/dist/{chunk-JNJDVC7V.js → chunk-2ZV6UJD6.js} +2 -2
  6. package/dist/{chunk-5YP3U7BU.js → chunk-3GOZYLTM.js} +3 -3
  7. package/dist/{chunk-U7WLROQT.js → chunk-3LYRZ4KN.js} +3 -3
  8. package/dist/{chunk-MKKBEVXO.js → chunk-6T5EBO7G.js} +1 -1
  9. package/dist/chunk-77NA7TPJ.js +38 -0
  10. package/dist/{chunk-QW24ZBSR.js → chunk-7OJDILWM.js} +1 -1
  11. package/dist/{chunk-6J4RR46J.js → chunk-7PBOU7JC.js} +2 -1
  12. package/dist/{chunk-2YDUYSB3.js → chunk-DL2OCKHC.js} +4 -4
  13. package/dist/{chunk-LOZ6XNOX.js → chunk-DOPSPCO3.js} +26 -1
  14. package/dist/{chunk-RJ3YK6O7.js → chunk-EAF47LYM.js} +368 -103
  15. package/dist/{chunk-PBX42F4Q.js → chunk-GGINSR75.js} +6 -5
  16. package/dist/{chunk-DUXOFCPO.js → chunk-GQQV2L74.js} +1 -1
  17. package/dist/{chunk-ZB4BNTWR.js → chunk-ILTWXDRG.js} +4 -4
  18. package/dist/{chunk-QMBXEECD.js → chunk-J3PETXDA.js} +7 -7
  19. package/dist/chunk-M62CJVTR.js +458 -0
  20. package/dist/{chunk-6NUHJPGJ.js → chunk-NVUJFHTQ.js} +1 -1
  21. package/dist/{chunk-27XYEFCK.js → chunk-OAFNNQN7.js} +1 -1
  22. package/dist/{chunk-IRKB2GGJ.js → chunk-OYFBLD5F.js} +3 -3
  23. package/dist/{chunk-XYZKIFXY.js → chunk-QBEQOQF7.js} +464 -31
  24. package/dist/{chunk-MUOJVRW7.js → chunk-SQ6VSXFI.js} +2 -2
  25. package/dist/{chunk-3ENHRYM5.js → chunk-TX6WIT3N.js} +1 -1
  26. package/dist/{chunk-T7TRJBCG.js → chunk-VFPIMW52.js} +3 -14
  27. package/dist/{chunk-NW6H7EN3.js → chunk-VZHR7FCD.js} +3 -3
  28. package/dist/{chunk-RKMTSOYH.js → chunk-YNOR2AGJ.js} +2 -2
  29. package/dist/{chunk-PYCKEQ4W.js → chunk-YQZ7HBOJ.js} +5 -3
  30. package/dist/{chunk-BBORXXGZ.js → chunk-ZFCXCSY4.js} +1 -1
  31. package/dist/executions.js +12 -12
  32. package/dist/history.js +4 -4
  33. package/dist/index.d.ts +1292 -55
  34. package/dist/index.js +36 -35
  35. package/dist/nodes.js +2 -2
  36. package/dist/observability.js +7 -6
  37. package/dist/settings.js +7 -6
  38. package/dist/templates.js +11 -10
  39. package/dist/workflow-builder.js +13 -12
  40. package/dist/workflows-list.js +9 -7
  41. package/package.json +1 -1
  42. package/dist/ExecutionDetailPage-A4JQGL34.js +0 -20
  43. package/dist/WorkflowBuilder-SQQI4VSF.js +0 -23
  44. package/dist/chunk-HDUCP6EO.js +0 -59
@@ -2,17 +2,18 @@ import { deepClone, applyTemplateInputs } from './chunk-GEMNVFPK.js';
2
2
  import { Input } from './chunk-IEVSFCFS.js';
3
3
  import { Dialog as Dialog$1, DialogContent as DialogContent$1, DialogHeader as DialogHeader$1, DialogTitle as DialogTitle$1, DialogDescription as DialogDescription$1, DialogFooter } from './chunk-YXMFRQYV.js';
4
4
  import { Badge as Badge$1, Button } from './chunk-BQXVT32O.js';
5
- import { QuotaExhaustedDialog } from './chunk-HDUCP6EO.js';
6
- import { EntityTagPicker, useWorkflowProposal, WorkflowProposalCard } from './chunk-NW6H7EN3.js';
7
- import { useRestoreWorkflowVersion, useWorkflowVersions, useActivateWorkflow, useDeleteWorkflow, useLazyWorkflowDefinition, useDeactivateWorkflow } from './chunk-PYCKEQ4W.js';
8
- import { isAgentNodeType, AgentDefinitionSelectField } from './chunk-3ENHRYM5.js';
5
+ import { QuotaExhaustedDialog, useWorkflowCodeExport, orderedExportFiles, fileBaseName, downloadWorkflowCodeExport, isLosslessReport, sortFidelityItems, isLossyFidelityItem, lineOfNode } from './chunk-M62CJVTR.js';
6
+ import { EntityTagPicker, useWorkflowProposal, WorkflowProposalCard } from './chunk-VZHR7FCD.js';
7
+ import { useRestoreWorkflowVersion, useWorkflowVersions, useActivateWorkflow, useDeleteWorkflow, useLazyWorkflowDefinition, useDeactivateWorkflow } from './chunk-YQZ7HBOJ.js';
8
+ import { isAgentNodeType, AgentDefinitionSelectField } from './chunk-TX6WIT3N.js';
9
9
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
10
- import { NODE_CONFIGS, createConfiguredNode, resolveOutputHandles, resolveInputHandles, isNodeConfigsInitialized, useFlowStore, getNodeDetail, useSaveStatusStore, liveInternalOperations, resolveNodeOperation, readDisplayOptions, parseParameterValue, canAutosave, STICKY_NOTE_TYPE, isNodeTrigger, resolveUiSpec, RUNS_QUOTA_NAME, throwIfResultError, BILLING_PLANS_PATH, emitUpgradeClicked, FluidGridsContext, emitWorkflowCreated, emitTemplateUsed, ensureNodeConfigsLoaded, registerWorkflowNodeTypes, emitNodeInstalled, useNodeExecution, onNodeTypesUpdate, NODE_TYPES, getNodeMetadata, useIsValidConnection, refetchStoreNodes, AVAILABLE_NODES, useInsertNode, NODE_TYPE_DRAG_DATA_FORMAT, NODE_OPERATION_DRAG_DATA_FORMAT, fieldsFromValue, useFluidGridsAnalytics, useSaveWorkflow, workflowFingerprint, buildStickyNode, useNodeRegistryRevision, fieldsFromIO, isParamVisible, ConnectionSelector, structuredParameterType, nodeAccent, NodeTypeIcon, NODES_METADATA, useConnections, ConnectionFormDialog, SdkPermissionButton, FLUIDGRIDS_PERMISSIONS, saveIndicatorOf, inAppLeaveTarget, declaredOutputFields, subscribeWorkflowSaved, pathToExpression, ExpressionEditor, formatParameterValue, leaveNeedsConfirmation, buildOperationSeed, snapshotForSave, editStateOf, isImageIcon, NODES, synchronizeOperationUpdate, NodePropertyPanel, openRunQuotaUpgradePrompt, describeOperationError, isTriggerOperation, canRenderOperationPanel, resolveOperationName, AUTOSAVE_RETRY_DELAYS_MS, AUTOSAVE_DEBOUNCE_MS } from './chunk-6NUHJPGJ.js';
10
+ import { useFluidGridsFlag, FLUIDGRIDS_FLAGS } from './chunk-77NA7TPJ.js';
11
+ import { NODE_CONFIGS, createConfiguredNode, resolveOutputHandles, resolveInputHandles, isNodeConfigsInitialized, useFlowStore, getNodeDetail, useSaveStatusStore, liveInternalOperations, resolveNodeOperation, readDisplayOptions, parseParameterValue, canAutosave, STICKY_NOTE_TYPE, isNodeTrigger, resolveUiSpec, RUNS_QUOTA_NAME, throwIfResultError, BILLING_PLANS_PATH, emitUpgradeClicked, FluidGridsContext, emitWorkflowCreated, emitTemplateUsed, ensureNodeConfigsLoaded, registerWorkflowNodeTypes, emitNodeInstalled, useNodeExecution, onNodeTypesUpdate, NODE_TYPES, getNodeMetadata, useIsValidConnection, refetchStoreNodes, AVAILABLE_NODES, useInsertNode, NODE_TYPE_DRAG_DATA_FORMAT, NODE_OPERATION_DRAG_DATA_FORMAT, fieldsFromValue, useFluidGridsAnalytics, useSaveWorkflow, workflowFingerprint, buildStickyNode, useNodeRegistryRevision, fieldsFromIO, isParamVisible, ConnectionSelector, structuredParameterType, nodeAccent, NodeTypeIcon, NODES_METADATA, useConnections, ConnectionFormDialog, SdkPermissionButton, FLUIDGRIDS_PERMISSIONS, saveIndicatorOf, inAppLeaveTarget, declaredOutputFields, subscribeWorkflowSaved, pathToExpression, ExpressionEditor, formatParameterValue, leaveNeedsConfirmation, buildOperationSeed, snapshotForSave, editStateOf, isImageIcon, NODES, synchronizeOperationUpdate, NodePropertyPanel, describeOperationError, openRunQuotaUpgradePrompt, isTriggerOperation, canRenderOperationPanel, resolveOperationName, AUTOSAVE_RETRY_DELAYS_MS, AUTOSAVE_DEBOUNCE_MS } from './chunk-NVUJFHTQ.js';
11
12
  import { cn } from './chunk-JL7CASN5.js';
12
13
  import { getGlobalStoreClient } from './chunk-PXIFUMLA.js';
13
14
  import { getFluidGridsConfig } from './chunk-CY6KX4RG.js';
14
15
  import { GetMyNodeInstallationsDocument, BrowseWorkflowTemplatesDocument, InstallWorkflowNodeDocument, InstallPurchasedNodeDocument, BrowseWorkflowNodesDocument, UninstallWorkflowNodeDocument, CreateStoreOrderDocument, GetNodeInstallableVersionsDocument, OrganizationPrivateNodesDocument, InstallOrganizationPrivateNodeDocument, UninstallOrganizationPrivateNodeDocument } from './chunk-JUUYPCFY.js';
15
- import { WorkspaceRunsQuotaDocument, NodeSchemaIntrospectionDocument, useWorkflowPinnedDataQuery, usePinNodeDataMutation, useUnpinNodeDataMutation, useRunFromNodeEligibilityQuery, EventRegistrationsDocument, WorkflowGenerationTemplatesDocument, WorkflowEnvironmentsDocument, WorkflowPromotionRequestsDocument, DeployWorkflowVersionToDevDocument, RequestWorkflowPromotionDocument, ApproveWorkflowPromotionDocument, RejectWorkflowPromotionDocument, CancelWorkflowPromotionDocument, UpdateWorkflowEnvironmentPolicyDocument, WorkflowGitRepositoryDocument, WorkflowGitPushesDocument, WorkflowGitCommitsDocument, LinkWorkflowGitRepositoryDocument, UnlinkWorkflowGitRepositoryDocument, PushWorkflowToGitDocument, WorkflowGitDiffDocument, RestoreWorkflowFromGitDocument, WorkflowAuthoringDocument, PreviewScheduleDocument, WebhookTestListenerDocument, StopWebhookTestListenerDocument, ListenForWebhookTestEventDocument, NodeUsageStatusDocument, RemoveNodeFromWorkflowsDocument } from './chunk-6J4RR46J.js';
16
+ import { WorkspaceRunsQuotaDocument, NodeSchemaIntrospectionDocument, useWorkflowPinnedDataQuery, usePinNodeDataMutation, useUnpinNodeDataMutation, useRunFromNodeEligibilityQuery, EventRegistrationsDocument, WorkflowGenerationTemplatesDocument, WorkflowEnvironmentsDocument, WorkflowPromotionRequestsDocument, DeployWorkflowVersionToDevDocument, RequestWorkflowPromotionDocument, ApproveWorkflowPromotionDocument, RejectWorkflowPromotionDocument, CancelWorkflowPromotionDocument, UpdateWorkflowEnvironmentPolicyDocument, WorkflowGitRepositoryDocument, WorkflowGitPushesDocument, WorkflowGitCommitsDocument, LinkWorkflowGitRepositoryDocument, UnlinkWorkflowGitRepositoryDocument, PushWorkflowToGitDocument, WorkflowGitDiffDocument, RestoreWorkflowFromGitDocument, WorkflowAuthoringDocument, PreviewScheduleDocument, WebhookTestListenerDocument, StopWebhookTestListenerDocument, ListenForWebhookTestEventDocument, NodeUsageStatusDocument, RemoveNodeFromWorkflowsDocument } from './chunk-7PBOU7JC.js';
16
17
  import { useTr } from './chunk-UULVIT25.js';
17
18
  import { getFluidGridsClient, waitForFluidGridsClient, getFluidGridsClientSafe } from './chunk-NTWG3CJX.js';
18
19
  import { __export } from './chunk-62GWEYJ5.js';
@@ -26685,8 +26686,8 @@ var reducer = (state, action) => {
26685
26686
  if (toastId) {
26686
26687
  addToRemoveQueue(toastId);
26687
26688
  } else {
26688
- state.toasts.forEach((toast16) => {
26689
- addToRemoveQueue(toast16.id);
26689
+ state.toasts.forEach((toast17) => {
26690
+ addToRemoveQueue(toast17.id);
26690
26691
  });
26691
26692
  }
26692
26693
  return {
@@ -28062,7 +28063,7 @@ function VisualMapperContent({
28062
28063
  mapping,
28063
28064
  onMappingChange
28064
28065
  }) {
28065
- const { toast: toast16 } = useToast();
28066
+ const { toast: toast17 } = useToast();
28066
28067
  const tr = useTr();
28067
28068
  const reactFlowWrapper = useRef(null);
28068
28069
  const [selectedSourceNode, setSelectedSourceNode] = useState(null);
@@ -28082,7 +28083,7 @@ function VisualMapperContent({
28082
28083
  targetOperation
28083
28084
  );
28084
28085
  if (generatedNodes.length === 0) {
28085
- toast16({
28086
+ toast17({
28086
28087
  title: tr(
28087
28088
  "fluidgrids.builder.visualMapper.noFieldsFoundTitle",
28088
28089
  "No fields found"
@@ -28108,7 +28109,7 @@ function VisualMapperContent({
28108
28109
  targetNode,
28109
28110
  targetOperation,
28110
28111
  setNodes,
28111
- toast16,
28112
+ toast17,
28112
28113
  tr
28113
28114
  ]);
28114
28115
  useEffect(() => {
@@ -28215,7 +28216,7 @@ function VisualMapperContent({
28215
28216
  }
28216
28217
  onMappingChange(updatedMapping);
28217
28218
  if (isCompatible) {
28218
- toast16({
28219
+ toast17({
28219
28220
  title: tr(
28220
28221
  "fluidgrids.builder.visualMapper.mappingCreatedTitle",
28221
28222
  "Mapping created"
@@ -28223,7 +28224,7 @@ function VisualMapperContent({
28223
28224
  description: `Mapped ${sourcePath} (${sourceType}) to ${targetPath} (${targetType})`
28224
28225
  });
28225
28226
  } else {
28226
- toast16({
28227
+ toast17({
28227
28228
  title: tr(
28228
28229
  "fluidgrids.builder.visualMapper.typeMismatchTitle",
28229
28230
  "Type mismatch warning"
@@ -28233,7 +28234,7 @@ function VisualMapperContent({
28233
28234
  });
28234
28235
  }
28235
28236
  } else {
28236
- toast16({
28237
+ toast17({
28237
28238
  title: tr(
28238
28239
  "fluidgrids.builder.visualMapper.invalidMappingTitle",
28239
28240
  "Invalid mapping"
@@ -28246,7 +28247,7 @@ function VisualMapperContent({
28246
28247
  });
28247
28248
  }
28248
28249
  },
28249
- [nodes, mapping, onMappingChange, toast16, tr, setEdges]
28250
+ [nodes, mapping, onMappingChange, toast17, tr, setEdges]
28250
28251
  );
28251
28252
  const onEdgeDelete = useCallback(
28252
28253
  (edge) => {
@@ -28303,7 +28304,7 @@ function VisualMapperContent({
28303
28304
  const handleSaveMappingDialog = (expression, targetFieldName) => {
28304
28305
  const targetPath = targetFieldName || selectedTargetNode?.data?.path;
28305
28306
  if (!targetPath) {
28306
- toast16({
28307
+ toast17({
28307
28308
  title: tr(
28308
28309
  "fluidgrids.builder.visualMapper.noTargetFieldTitle",
28309
28310
  "No target field specified"
@@ -28335,7 +28336,7 @@ function VisualMapperContent({
28335
28336
  }
28336
28337
  onMappingChange(updatedMapping);
28337
28338
  const mappingType = detectMappingType(expression);
28338
- toast16({
28339
+ toast17({
28339
28340
  title: `${mappingType.charAt(0).toUpperCase() + mappingType.slice(1)} mapping created`,
28340
28341
  description: `${tr("fluidgrids.builder.visualMapper.appliedMappingTo", "Applied mapping to")} ${targetPath}`
28341
28342
  });
@@ -28634,7 +28635,7 @@ function MappingEditor({
28634
28635
  setEdges,
28635
28636
  edgeId
28636
28637
  }) {
28637
- const { toast: toast16 } = useToast();
28638
+ const { toast: toast17 } = useToast();
28638
28639
  const tr = useTr();
28639
28640
  const [mappingJson, setMappingJson] = useState({});
28640
28641
  const [jsonDataString, setJsonDataString] = useState(
@@ -28758,7 +28759,7 @@ function MappingEditor({
28758
28759
  const handleSaveMapping = () => {
28759
28760
  try {
28760
28761
  checkJsonValidity();
28761
- toast16({
28762
+ toast17({
28762
28763
  title: tr(
28763
28764
  "fluidgrids.builder.mappingEditor.mappingSavedTitle",
28764
28765
  "Mapping saved"
@@ -28769,7 +28770,7 @@ function MappingEditor({
28769
28770
  )
28770
28771
  });
28771
28772
  } catch (error62) {
28772
- toast16({
28773
+ toast17({
28773
28774
  title: tr(
28774
28775
  "fluidgrids.builder.mappingEditor.errorSavingTitle",
28775
28776
  "Error saving mapping"
@@ -28788,7 +28789,7 @@ function MappingEditor({
28788
28789
  const parsedData = checkJsonValidity();
28789
28790
  const result = await applyMapping(parsedData, sampleInput);
28790
28791
  setPreviewOutput(result);
28791
- toast16({
28792
+ toast17({
28792
28793
  title: tr(
28793
28794
  "fluidgrids.builder.mappingEditor.mappingTestedTitle",
28794
28795
  "Mapping tested"
@@ -28800,7 +28801,7 @@ function MappingEditor({
28800
28801
  });
28801
28802
  } catch (error62) {
28802
28803
  console.error("Test mapping error:", error62);
28803
- toast16({
28804
+ toast17({
28804
28805
  title: tr(
28805
28806
  "fluidgrids.builder.mappingEditor.mappingTestFailedTitle",
28806
28807
  "Mapping test failed"
@@ -35899,6 +35900,10 @@ function loopReturnStatus(nodeId2, edges, loopHandle = "loop") {
35899
35900
  if (!returns) return "missing-return";
35900
35901
  return exits ? "conditional-exit" : "connected";
35901
35902
  }
35903
+ function languageExtension(language) {
35904
+ if (language === "python") return python();
35905
+ return javascript({ typescript: language === "typescript" });
35906
+ }
35902
35907
  function normalizeCodeLanguage(value) {
35903
35908
  return typeof value === "string" && value.toLowerCase().startsWith("py") ? "python" : "javascript";
35904
35909
  }
@@ -35922,13 +35927,16 @@ function CodeEditorField({
35922
35927
  placeholder,
35923
35928
  label,
35924
35929
  onChange,
35930
+ readOnly = false,
35931
+ minHeight = "180px",
35932
+ maxHeight = "420px",
35925
35933
  className,
35926
35934
  "data-testid": testId
35927
35935
  }) {
35928
35936
  const dark = useIsDarkTheme();
35929
35937
  const extensions = useMemo(
35930
35938
  () => [
35931
- language === "python" ? python() : javascript(),
35939
+ languageExtension(language),
35932
35940
  // CodeMirror's contenteditable is the control assistive tech focuses; name it.
35933
35941
  ...label ? [EditorView.contentAttributes.of({ "aria-label": label })] : []
35934
35942
  ],
@@ -35948,20 +35956,22 @@ function CodeEditorField({
35948
35956
  CodeMirror,
35949
35957
  {
35950
35958
  value,
35951
- onChange,
35959
+ onChange: readOnly ? void 0 : onChange,
35952
35960
  extensions,
35953
35961
  theme: dark ? "dark" : "light",
35954
35962
  placeholder,
35955
- minHeight: "180px",
35956
- maxHeight: "420px",
35963
+ minHeight,
35964
+ maxHeight,
35965
+ editable: !readOnly,
35966
+ readOnly,
35957
35967
  basicSetup: {
35958
35968
  lineNumbers: true,
35959
35969
  foldGutter: true,
35960
- highlightActiveLine: true,
35961
- autocompletion: true,
35970
+ highlightActiveLine: !readOnly,
35971
+ autocompletion: !readOnly,
35962
35972
  bracketMatching: true,
35963
- closeBrackets: true,
35964
- indentOnInput: true
35973
+ closeBrackets: !readOnly,
35974
+ indentOnInput: !readOnly
35965
35975
  }
35966
35976
  }
35967
35977
  )
@@ -45104,6 +45114,427 @@ function AiDraftPanel({
45104
45114
  ] }) })
45105
45115
  ] });
45106
45116
  }
45117
+ function FidelityLevelBadge({
45118
+ fidelity
45119
+ }) {
45120
+ const tr = useTr();
45121
+ const lossless = isLosslessReport(fidelity);
45122
+ return /* @__PURE__ */ jsxs(
45123
+ Badge,
45124
+ {
45125
+ variant: lossless ? "secondary" : "destructive",
45126
+ "data-testid": "fluidgrids-code-fidelity-level",
45127
+ "data-level": lossless ? "lossless" : "lossy",
45128
+ className: "gap-1",
45129
+ children: [
45130
+ /* @__PURE__ */ jsx(
45131
+ Icon,
45132
+ {
45133
+ icon: lossless ? "mynaui:check-circle" : "mynaui:danger-triangle",
45134
+ className: "size-3.5"
45135
+ }
45136
+ ),
45137
+ lossless ? tr("fluidgrids.builder.codeView.lossless", "Lossless") : tr("fluidgrids.builder.codeView.lossy", "Lossy")
45138
+ ]
45139
+ }
45140
+ );
45141
+ }
45142
+ function FidelityReportList({
45143
+ fidelity,
45144
+ source,
45145
+ hasNode,
45146
+ onShowNode
45147
+ }) {
45148
+ const tr = useTr();
45149
+ const items = sortFidelityItems(fidelity.items);
45150
+ return /* @__PURE__ */ jsxs(
45151
+ "section",
45152
+ {
45153
+ "aria-labelledby": "fg-code-fidelity",
45154
+ "data-testid": "fluidgrids-code-fidelity",
45155
+ className: "space-y-2",
45156
+ children: [
45157
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
45158
+ /* @__PURE__ */ jsx(
45159
+ "h3",
45160
+ {
45161
+ id: "fg-code-fidelity",
45162
+ className: "text-xs font-semibold uppercase tracking-wide text-muted-foreground",
45163
+ children: tr("fluidgrids.builder.codeView.fidelityTitle", "Fidelity")
45164
+ }
45165
+ ),
45166
+ /* @__PURE__ */ jsx(FidelityLevelBadge, { fidelity })
45167
+ ] }),
45168
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: isLosslessReport(fidelity) ? tr(
45169
+ "fluidgrids.builder.codeView.losslessHint",
45170
+ "Lowering this code gives back exactly this workflow."
45171
+ ) : tr(
45172
+ "fluidgrids.builder.codeView.lossyHint",
45173
+ "Lowering this code does not give back exactly this workflow. The items marked lossy say what differs."
45174
+ ) }),
45175
+ items.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: tr(
45176
+ "fluidgrids.builder.codeView.noFidelityItems",
45177
+ "Nothing to report."
45178
+ ) }) : /* @__PURE__ */ jsx("ul", { className: "space-y-1.5", children: items.map((item, index) => {
45179
+ const lossy = isLossyFidelityItem(item);
45180
+ const nodeId2 = item.nodeId ?? null;
45181
+ const line = nodeId2 && source !== void 0 ? lineOfNode(source, nodeId2) : null;
45182
+ return /* @__PURE__ */ jsxs(
45183
+ "li",
45184
+ {
45185
+ "data-testid": "fluidgrids-code-fidelity-item",
45186
+ "data-kind": item.kind,
45187
+ "data-lossy": lossy ? "true" : "false",
45188
+ className: cn$1(
45189
+ "rounded-md border p-2 text-xs",
45190
+ lossy ? "border-[var(--color-status-error-border)] bg-[var(--color-status-error-bg)]" : "border-border bg-muted/30"
45191
+ ),
45192
+ children: [
45193
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-1.5", children: [
45194
+ /* @__PURE__ */ jsx(
45195
+ Badge,
45196
+ {
45197
+ variant: lossy ? "destructive" : "outline",
45198
+ className: "text-[10px]",
45199
+ children: lossy ? tr("fluidgrids.builder.codeView.itemLossy", "Lossy") : tr("fluidgrids.builder.codeView.itemLossless", "Kept")
45200
+ }
45201
+ ),
45202
+ /* @__PURE__ */ jsx("code", { className: "font-mono text-[11px] text-card-foreground", children: item.kind }),
45203
+ line !== null && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: tr(
45204
+ "fluidgrids.builder.codeView.itemLine",
45205
+ "line {{line}}",
45206
+ {
45207
+ line: String(line)
45208
+ }
45209
+ ) })
45210
+ ] }),
45211
+ /* @__PURE__ */ jsx("p", { className: "mt-1 break-words text-card-foreground", children: item.detail }),
45212
+ item.path && /* @__PURE__ */ jsx("p", { className: "mt-0.5 break-all font-mono text-[11px] text-muted-foreground", children: item.path }),
45213
+ nodeId2 && /* @__PURE__ */ jsxs(
45214
+ Button$1,
45215
+ {
45216
+ variant: "link",
45217
+ size: "sm",
45218
+ className: "mt-1 h-auto gap-1 p-0 text-xs",
45219
+ disabled: !hasNode(nodeId2),
45220
+ onClick: () => onShowNode(nodeId2),
45221
+ "data-testid": "fluidgrids-code-fidelity-node",
45222
+ children: [
45223
+ /* @__PURE__ */ jsx(Icon, { icon: "mynaui:location", className: "size-3.5" }),
45224
+ tr(
45225
+ "fluidgrids.builder.codeView.showNode",
45226
+ "Show node {{nodeId}}",
45227
+ { nodeId: nodeId2 }
45228
+ )
45229
+ ]
45230
+ }
45231
+ )
45232
+ ]
45233
+ },
45234
+ `${item.kind}-${nodeId2 ?? ""}-${item.path ?? ""}-${index}`
45235
+ );
45236
+ }) })
45237
+ ]
45238
+ }
45239
+ );
45240
+ }
45241
+ function editorLanguageOf(path) {
45242
+ if (path.endsWith(".py")) return "python";
45243
+ if (path.endsWith(".ts")) return "typescript";
45244
+ return "javascript";
45245
+ }
45246
+ function isCodeViewFormat(value) {
45247
+ return value === "TYPESCRIPT" /* Typescript */ || value === "PYTHON" /* Python */;
45248
+ }
45249
+ function CodeViewPanel({
45250
+ className,
45251
+ compact = false
45252
+ }) {
45253
+ const enabled = useFluidGridsFlag(FLUIDGRIDS_FLAGS.codeFirst);
45254
+ if (!enabled) return null;
45255
+ return /* @__PURE__ */ jsx(CodeViewSheet, { className, compact });
45256
+ }
45257
+ function CodeViewSheet({
45258
+ className,
45259
+ compact
45260
+ }) {
45261
+ const tr = useTr();
45262
+ const params = useParams();
45263
+ const workflowKey = params?.id ?? "";
45264
+ const version2 = params?.version ?? null;
45265
+ const [open2, setOpen] = useState(false);
45266
+ const [format, setFormat2] = useState(
45267
+ "TYPESCRIPT" /* Typescript */
45268
+ );
45269
+ const [selectedPath, setSelectedPath] = useState(null);
45270
+ const [downloading, setDownloading] = useState(false);
45271
+ const { data, loading, error: error62, refetch } = useWorkflowCodeExport(
45272
+ { workflowKey, version: version2, format },
45273
+ open2 && !!workflowKey
45274
+ );
45275
+ const dirty = useSaveStatusStore((s) => s.dirty);
45276
+ const lastSavedAt = useSaveStatusStore((s) => s.lastSavedAt);
45277
+ const seenSave = useRef(lastSavedAt);
45278
+ useEffect(() => {
45279
+ if (seenSave.current === lastSavedAt) return;
45280
+ seenSave.current = lastSavedAt;
45281
+ if (open2) void refetch();
45282
+ }, [lastSavedAt, open2, refetch]);
45283
+ const files = useMemo(
45284
+ () => data ? orderedExportFiles(data.files, format) : [],
45285
+ [data, format]
45286
+ );
45287
+ const shown = files.find((file2) => file2.path === selectedPath) ?? files[0] ?? null;
45288
+ const shownContent = shown?.content ?? "";
45289
+ useEffect(() => setSelectedPath(null), [format]);
45290
+ const { fitView } = useReactFlow();
45291
+ const nodes = useFlowStore((s) => s.workflow.nodes);
45292
+ const onNodesChange = useFlowStore((s) => s.actions.nodes.onNodesChange);
45293
+ const showNodePropertiesOf = useFlowStore(
45294
+ (s) => s.actions.sidebar.showNodePropertiesOf
45295
+ );
45296
+ const nodeIds = useMemo(() => new Set(nodes.map((n) => n.id)), [nodes]);
45297
+ const hasNode = useCallback((id) => nodeIds.has(id), [nodeIds]);
45298
+ const showNode = useCallback(
45299
+ (id) => {
45300
+ const node2 = nodes.find((n) => n.id === id);
45301
+ if (!node2) return;
45302
+ setOpen(false);
45303
+ onNodesChange(
45304
+ nodes.map((n) => ({ type: "select", id: n.id, selected: n.id === id }))
45305
+ );
45306
+ if (node2.type)
45307
+ showNodePropertiesOf({ id, type: node2.type });
45308
+ setTimeout(
45309
+ () => void fitView({
45310
+ nodes: [{ id }],
45311
+ duration: 300,
45312
+ padding: 0.4,
45313
+ maxZoom: 1.2
45314
+ }),
45315
+ 50
45316
+ );
45317
+ },
45318
+ [nodes, onNodesChange, showNodePropertiesOf, fitView]
45319
+ );
45320
+ const copy = async () => {
45321
+ if (!shown) return;
45322
+ try {
45323
+ await navigator.clipboard.writeText(shownContent);
45324
+ toast.success(tr("fluidgrids.builder.codeView.copied", "Code copied"));
45325
+ } catch (err) {
45326
+ toast.error(tr("fluidgrids.builder.codeView.copyError", "Copy failed"), {
45327
+ description: describeOperationError(err)
45328
+ });
45329
+ }
45330
+ };
45331
+ const download = async () => {
45332
+ if (!data) return;
45333
+ setDownloading(true);
45334
+ try {
45335
+ await downloadWorkflowCodeExport(data, format);
45336
+ } catch (err) {
45337
+ toast.error(
45338
+ tr("fluidgrids.builder.codeView.downloadError", "Download failed"),
45339
+ { description: describeOperationError(err) }
45340
+ );
45341
+ } finally {
45342
+ setDownloading(false);
45343
+ }
45344
+ };
45345
+ const label = tr("fluidgrids.builder.codeView.triggerButton", "Code");
45346
+ return /* @__PURE__ */ jsxs(Sheet, { open: open2, onOpenChange: setOpen, children: [
45347
+ /* @__PURE__ */ jsx(SheetTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
45348
+ Button$1,
45349
+ {
45350
+ "data-tour": "fluidgrids-builder-code",
45351
+ variant: "outline",
45352
+ size: compact ? "icon" : "sm",
45353
+ className: cn$1(!compact && "flex gap-1", className),
45354
+ "aria-label": label,
45355
+ title: compact ? label : void 0,
45356
+ disabled: !workflowKey,
45357
+ children: [
45358
+ /* @__PURE__ */ jsx(Icon, { icon: "mynaui:code", className: "size-4" }),
45359
+ !compact && label
45360
+ ]
45361
+ }
45362
+ ) }),
45363
+ /* @__PURE__ */ jsxs(
45364
+ SheetContent,
45365
+ {
45366
+ side: "right",
45367
+ className: "flex w-[420px] flex-col overflow-y-auto sm:w-[640px] sm:max-w-[640px]",
45368
+ "data-testid": "fluidgrids-code-panel",
45369
+ children: [
45370
+ /* @__PURE__ */ jsxs(SheetHeader, { children: [
45371
+ /* @__PURE__ */ jsxs(SheetTitle, { className: "flex items-center gap-2", children: [
45372
+ /* @__PURE__ */ jsx(Icon, { icon: "mynaui:code", className: "size-5" }),
45373
+ tr("fluidgrids.builder.codeView.title", "Code")
45374
+ ] }),
45375
+ /* @__PURE__ */ jsx(SheetDescription, { children: tr(
45376
+ "fluidgrids.builder.codeView.description",
45377
+ "This version as code, read-only. It is what the FluidGrids CLI pulls; edit the canvas or push code with the CLI to change it."
45378
+ ) })
45379
+ ] }),
45380
+ /* @__PURE__ */ jsxs("div", { className: "mt-4 flex flex-1 flex-col gap-4 pb-6", children: [
45381
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [
45382
+ /* @__PURE__ */ jsx(
45383
+ Tabs,
45384
+ {
45385
+ value: format,
45386
+ onValueChange: (value) => {
45387
+ if (isCodeViewFormat(value)) setFormat2(value);
45388
+ },
45389
+ children: /* @__PURE__ */ jsxs(TabsList, { children: [
45390
+ /* @__PURE__ */ jsx(
45391
+ TabsTrigger,
45392
+ {
45393
+ value: "TYPESCRIPT" /* Typescript */,
45394
+ "data-testid": "fluidgrids-code-tab-typescript",
45395
+ children: tr("fluidgrids.builder.codeView.typescript", "TypeScript")
45396
+ }
45397
+ ),
45398
+ /* @__PURE__ */ jsx(
45399
+ TabsTrigger,
45400
+ {
45401
+ value: "PYTHON" /* Python */,
45402
+ "data-testid": "fluidgrids-code-tab-python",
45403
+ children: tr("fluidgrids.builder.codeView.python", "Python")
45404
+ }
45405
+ )
45406
+ ] })
45407
+ }
45408
+ ),
45409
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
45410
+ /* @__PURE__ */ jsxs(
45411
+ Button$1,
45412
+ {
45413
+ variant: "outline",
45414
+ size: "sm",
45415
+ className: "h-8 gap-1 text-xs",
45416
+ onClick: () => void copy(),
45417
+ disabled: !shown || loading,
45418
+ children: [
45419
+ /* @__PURE__ */ jsx(Icon, { icon: "mynaui:copy", className: "size-3.5" }),
45420
+ tr("fluidgrids.builder.codeView.copy", "Copy")
45421
+ ]
45422
+ }
45423
+ ),
45424
+ /* @__PURE__ */ jsxs(
45425
+ Button$1,
45426
+ {
45427
+ variant: "outline",
45428
+ size: "sm",
45429
+ className: "h-8 gap-1 text-xs",
45430
+ onClick: () => void download(),
45431
+ disabled: !data || loading || downloading,
45432
+ children: [
45433
+ /* @__PURE__ */ jsx(Icon, { icon: "mynaui:download", className: "size-3.5" }),
45434
+ tr("fluidgrids.builder.codeView.download", "Download")
45435
+ ]
45436
+ }
45437
+ )
45438
+ ] })
45439
+ ] }),
45440
+ dirty && /* @__PURE__ */ jsx(
45441
+ "p",
45442
+ {
45443
+ role: "status",
45444
+ className: "rounded-md border border-[var(--color-status-warning-border)] bg-[var(--color-status-warning-bg)] px-3 py-2 text-xs text-[var(--color-status-warning-text)]",
45445
+ children: tr(
45446
+ "fluidgrids.builder.codeView.unsavedNotice",
45447
+ "You have unsaved changes. The code shows the saved version and updates after the next save."
45448
+ )
45449
+ }
45450
+ ),
45451
+ loading && !data ? /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center py-8 text-sm text-muted-foreground", children: [
45452
+ /* @__PURE__ */ jsx(
45453
+ Icon,
45454
+ {
45455
+ icon: "mynaui:spinner",
45456
+ className: "mr-2 size-4 animate-spin"
45457
+ }
45458
+ ),
45459
+ tr(
45460
+ "fluidgrids.builder.codeView.loading",
45461
+ "Lifting the workflow\u2026"
45462
+ )
45463
+ ] }) : error62 ? /* @__PURE__ */ jsxs("div", { className: "py-6 text-sm", role: "alert", children: [
45464
+ /* @__PURE__ */ jsx("p", { className: "text-[var(--color-status-error-text)]", children: error62 }),
45465
+ /* @__PURE__ */ jsx(
45466
+ Button$1,
45467
+ {
45468
+ variant: "outline",
45469
+ size: "sm",
45470
+ className: "mt-3",
45471
+ onClick: () => void refetch(),
45472
+ children: tr("fluidgrids.builder.codeView.retry", "Retry")
45473
+ }
45474
+ )
45475
+ ] }) : data && shown ? /* @__PURE__ */ jsxs(Fragment, { children: [
45476
+ files.length > 1 && /* @__PURE__ */ jsx(
45477
+ "div",
45478
+ {
45479
+ className: "flex flex-wrap gap-1",
45480
+ role: "group",
45481
+ "aria-label": tr("fluidgrids.builder.codeView.files", "Files"),
45482
+ children: files.map((file2) => /* @__PURE__ */ jsx(
45483
+ Button$1,
45484
+ {
45485
+ variant: file2 === shown ? "secondary" : "ghost",
45486
+ size: "sm",
45487
+ className: "h-7 font-mono text-[11px]",
45488
+ title: file2.path,
45489
+ "aria-pressed": file2 === shown,
45490
+ onClick: () => setSelectedPath(file2.path),
45491
+ children: fileBaseName(file2.path)
45492
+ },
45493
+ file2.path
45494
+ ))
45495
+ }
45496
+ ),
45497
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2 text-[11px] text-muted-foreground", children: [
45498
+ /* @__PURE__ */ jsx("span", { className: "truncate font-mono", title: shown.path, children: shown.path }),
45499
+ /* @__PURE__ */ jsxs("span", { className: "flex shrink-0 items-center gap-2", children: [
45500
+ /* @__PURE__ */ jsx("span", { className: "font-mono", title: data.irHash, children: data.irHash.slice(0, 19) }),
45501
+ /* @__PURE__ */ jsx(FidelityLevelBadge, { fidelity: data.fidelity })
45502
+ ] })
45503
+ ] }),
45504
+ /* @__PURE__ */ jsx(
45505
+ CodeEditorField,
45506
+ {
45507
+ value: shownContent,
45508
+ language: editorLanguageOf(shown.path),
45509
+ label: tr(
45510
+ "fluidgrids.builder.codeView.editorLabel",
45511
+ "Workflow code (read-only)"
45512
+ ),
45513
+ readOnly: true,
45514
+ minHeight: "260px",
45515
+ maxHeight: "55vh",
45516
+ "data-testid": "fluidgrids-code-editor"
45517
+ }
45518
+ ),
45519
+ /* @__PURE__ */ jsx(
45520
+ FidelityReportList,
45521
+ {
45522
+ fidelity: data.fidelity,
45523
+ source: shownContent,
45524
+ hasNode,
45525
+ onShowNode: showNode
45526
+ }
45527
+ )
45528
+ ] }) : /* @__PURE__ */ jsx("p", { className: "py-6 text-sm text-muted-foreground", children: tr(
45529
+ "fluidgrids.builder.codeView.empty",
45530
+ "The export returned no files."
45531
+ ) })
45532
+ ] })
45533
+ ]
45534
+ }
45535
+ )
45536
+ ] });
45537
+ }
45107
45538
  function RunWithViewRuns({
45108
45539
  onViewRuns,
45109
45540
  canViewRuns,
@@ -45375,7 +45806,8 @@ function PanelIcons() {
45375
45806
  return /* @__PURE__ */ jsxs(Fragment, { children: [
45376
45807
  /* @__PURE__ */ jsx(AiDraftPanel, { compact: true }),
45377
45808
  /* @__PURE__ */ jsx(EnvironmentsPanel, { compact: true }),
45378
- /* @__PURE__ */ jsx(GitSyncPanel, { compact: true })
45809
+ /* @__PURE__ */ jsx(GitSyncPanel, { compact: true }),
45810
+ /* @__PURE__ */ jsx(CodeViewPanel, { compact: true })
45379
45811
  ] });
45380
45812
  }
45381
45813
  function HeaderActions({ tier }) {
@@ -45393,6 +45825,7 @@ function HeaderActions({ tier }) {
45393
45825
  /* @__PURE__ */ jsx(VersionHistoryPanel, { compact: true }),
45394
45826
  /* @__PURE__ */ jsx(EnvironmentsPanel, { compact: true }),
45395
45827
  /* @__PURE__ */ jsx(GitSyncPanel, { compact: true }),
45828
+ /* @__PURE__ */ jsx(CodeViewPanel, { compact: true }),
45396
45829
  /* @__PURE__ */ jsx(GuideIcon, {}),
45397
45830
  /* @__PURE__ */ jsx(Divider, {}),
45398
45831
  /* @__PURE__ */ jsx(SaveFlowButton, {}),
@@ -1,5 +1,5 @@
1
- import { throwIfResultError } from './chunk-6NUHJPGJ.js';
2
- import { RunFailureClustersDocument, DismissRunFailureClusterDocument, RunFailureTriageSettingsDocument, SetRunFailureTriageEnabledDocument, FgTriageFailedRunsDocument } from './chunk-6J4RR46J.js';
1
+ import { throwIfResultError } from './chunk-NVUJFHTQ.js';
2
+ import { RunFailureClustersDocument, DismissRunFailureClusterDocument, RunFailureTriageSettingsDocument, SetRunFailureTriageEnabledDocument, FgTriageFailedRunsDocument } from './chunk-7PBOU7JC.js';
3
3
  import { useTr } from './chunk-UULVIT25.js';
4
4
  import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
5
5
  import { useState, useCallback, useEffect } from 'react';