@burdenoff/fluidgrids-fe-sdk 2026.1105.3 → 2026.1106.1

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 (60) hide show
  1. package/README.md +16 -3
  2. package/dist/{ExecutionDetailPage-JXGPSLS3.js → ExecutionDetailPage-OOHJQR2L.js} +14 -14
  3. package/dist/{ExecutionsListPage-U3TC5JUI.js → ExecutionsListPage-6HS5VQOV.js} +10 -10
  4. package/dist/{WorkflowBuilder-6DOD6WWH.js → WorkflowBuilder-PICIS7FI.js} +16 -16
  5. package/dist/{WorkflowsList-XOWRQNST.js → WorkflowsList-SD5XQC4Q.js} +10 -10
  6. package/dist/{agentTools-YQBN33WG.js → agentTools-UH4LU6LA.js} +7 -7
  7. package/dist/{chunk-MY7SEUXM.js → chunk-43GSC5Y6.js} +1 -1
  8. package/dist/{chunk-EKDUYCTS.js → chunk-4XAXF5VP.js} +4 -4
  9. package/dist/{chunk-G774FI2E.js → chunk-5GG2FEKW.js} +2 -2
  10. package/dist/{chunk-TJAG2DQT.js → chunk-5Z4F24QT.js} +3 -3
  11. package/dist/{chunk-JYYN3CLL.js → chunk-6VIG44VF.js} +1 -1
  12. package/dist/{chunk-2WUVF4EQ.js → chunk-ASYYYJG2.js} +4 -4
  13. package/dist/{chunk-OXXXUAWM.js → chunk-CTKWMPQQ.js} +1 -1
  14. package/dist/{chunk-YGOGJDN4.js → chunk-EIMTOK6E.js} +3 -3
  15. package/dist/{chunk-AMXJLVZN.js → chunk-EXJW7EKR.js} +2 -2
  16. package/dist/{chunk-MP44TAOO.js → chunk-GBJWPSLJ.js} +70 -5
  17. package/dist/{chunk-LDWBMCX4.js → chunk-GBQC5WDH.js} +16 -9
  18. package/dist/{chunk-3ZYRLGDF.js → chunk-GPABUQTD.js} +650 -636
  19. package/dist/{chunk-ZBPRNWKY.js → chunk-HSTP2RX3.js} +35 -6
  20. package/dist/{chunk-US5QSLPV.js → chunk-JKLZ6YZ3.js} +22 -11
  21. package/dist/{chunk-KAWRHIJZ.js → chunk-JRLBPR5U.js} +3 -3
  22. package/dist/{chunk-IL343FKX.js → chunk-KHS2DZHH.js} +1 -1
  23. package/dist/{chunk-4NNF7DIB.js → chunk-KJT5TAOE.js} +3 -3
  24. package/dist/{chunk-TLHX4DK4.js → chunk-LLCVVRCE.js} +9 -9
  25. package/dist/{chunk-IJ7UIDCW.js → chunk-M72SMQOS.js} +8 -8
  26. package/dist/{chunk-TCIBTMJI.js → chunk-NZMUKAXG.js} +3 -69
  27. package/dist/{chunk-G33OMSW6.js → chunk-OLRIWGYM.js} +6 -6
  28. package/dist/{chunk-NMQENSPW.js → chunk-OTOQFZFO.js} +38 -38
  29. package/dist/{chunk-EYQ7GJRW.js → chunk-PASKZCII.js} +3 -3
  30. package/dist/{chunk-3IXU7WUC.js → chunk-PDODDDHY.js} +1 -1
  31. package/dist/{chunk-5DVP2UYH.js → chunk-TGWDFLEX.js} +11 -3
  32. package/dist/{chunk-AU7LACOY.js → chunk-TYI2XOSI.js} +1 -1
  33. package/dist/{chunk-L2N6DDOI.js → chunk-U7UNWR3D.js} +2 -2
  34. package/dist/{chunk-NZFPCTIS.js → chunk-UIS7KGHW.js} +4 -4
  35. package/dist/{chunk-KN37RIFC.js → chunk-UWCD7JUU.js} +8 -8
  36. package/dist/{chunk-MA6I4KY5.js → chunk-UYTPURFW.js} +16 -50
  37. package/dist/{chunk-ZLBTUCC2.js → chunk-WBRW67HX.js} +3 -3
  38. package/dist/{chunk-VESQH55Q.js → chunk-WC526MLS.js} +3 -3
  39. package/dist/{chunk-22U3TUKZ.js → chunk-XNARCHMT.js} +2 -2
  40. package/dist/{chunk-3MZOYJ5I.js → chunk-XWINH6CR.js} +1 -1
  41. package/dist/{chunk-FVWRGL7S.js → chunk-Y4UCHFGK.js} +1 -1
  42. package/dist/{client-YVZMLEQX.js → client-62VHXHKN.js} +2 -2
  43. package/dist/executions.js +15 -15
  44. package/dist/{global-client-N5EIFW6T.js → global-client-PJ5LANJA.js} +2 -2
  45. package/dist/history.js +9 -9
  46. package/dist/index.d.ts +10 -4
  47. package/dist/index.js +67 -53
  48. package/dist/{node-detail-view-U5HOP2WX.js → node-detail-view-P5NV5CMO.js} +11 -11
  49. package/dist/nodes.js +3 -3
  50. package/dist/observability.js +8 -8
  51. package/dist/{quick-config-panel-XAISBW6Y.js → quick-config-panel-ZNSBVF4G.js} +8 -8
  52. package/dist/settings.js +9 -9
  53. package/dist/templates.js +15 -15
  54. package/dist/{workflow-builder-7vv9dCdp.d.ts → workflow-builder-C-ekFbwR.d.ts} +37 -4
  55. package/dist/workflow-builder.d.ts +1 -1
  56. package/dist/workflow-builder.js +17 -17
  57. package/dist/workflow-preview.d.ts +10 -3
  58. package/dist/workflow-preview.js +78 -43
  59. package/dist/workflows-list.js +10 -10
  60. package/package.json +1 -1
@@ -1,12 +1,12 @@
1
1
  import { SdkPermissionGate, FLUIDGRIDS_PERMISSIONS } from './chunk-5375NUIO.js';
2
2
  import { useBuilderReadOnly } from './chunk-SDZEAIIE.js';
3
- import { STICKY_NOTE_TYPE, useFlowStore, resolveOperationName, synchronizeOperationUpdate, isNodeTrigger, resolveOutputHandles, resolveInputHandles, outputHandlesSpacerHeight, WAIT_FOR_SIGNAL_NODE_TYPE, CODE_WORKFLOW_NODE_TYPE, readSignalName, LogicNodeCard, NodeCard, NodeCardHeader, NodeCardBody, InputHandles, OutputHandles, NodeTypeIcon, nodeAccent, readCodeWorkflowState, partitionStickyNotes, interfaceFields, interfaceHandlers } from './chunk-5DVP2UYH.js';
4
- import { getGlobalStoreClient, createGlobalStoreClient, setGlobalStoreClient, resetGlobalStoreClient } from './chunk-AU7LACOY.js';
3
+ import { STICKY_NOTE_TYPE, useFlowStore, resolveOperationName, synchronizeOperationUpdate, isNodeTrigger, resolveOutputHandles, resolveInputHandles, outputHandlesSpacerHeight, WAIT_FOR_SIGNAL_NODE_TYPE, CODE_WORKFLOW_NODE_TYPE, readSignalName, LogicNodeCard, NodeCard, NodeCardHeader, NodeCardBody, InputHandles, OutputHandles, NodeTypeIcon, nodeAccent, readCodeWorkflowState, partitionStickyNotes, interfaceFields, interfaceHandlers } from './chunk-TGWDFLEX.js';
4
+ import { getGlobalStoreClient, createGlobalStoreClient, setGlobalStoreClient, resetGlobalStoreClient } from './chunk-TYI2XOSI.js';
5
5
  import { GetMyNodeInstallationsDocument } from './chunk-G77IGC3Y.js';
6
6
  import { fetchAllNodeEndpointConfigs, NodeManifestDocument, UpdateWorkflowDefinitionDocument, CreateWorkflowDefinitionDocument, CreateWorkflowVersionDocument, ExecuteStepDocument, TriggerWorkflowDocument, RunFromNodeDocument, ExecutionDetailDocument, WorkflowDefinitionDocument, WorkflowRunDocument } from './chunk-Z3ABLERJ.js';
7
7
  import { useTr, ENGLISH_FALLBACK_TRANSLATOR, FluidGridsTranslationProvider } from './chunk-UULVIT25.js';
8
- import { waitForFluidGridsClient, getFluidGridsClient, getFluidGridsClientSafe, createFluidGridsClient, setFluidGridsClient, resetFluidGridsClient } from './chunk-3IXU7WUC.js';
9
- import { throwIfResultError, emitFluidGridsEvent, emitOperationErrorEvent, describeOperationError, emitRunCompletedOnce } from './chunk-US5QSLPV.js';
8
+ import { waitForFluidGridsClient, getFluidGridsClient, getFluidGridsClientSafe, createFluidGridsClient, setFluidGridsClient, resetFluidGridsClient } from './chunk-PDODDDHY.js';
9
+ import { throwIfResultError, emitFluidGridsEvent, emitOperationErrorEvent, describeOperationError, emitRunCompletedOnce } from './chunk-JKLZ6YZ3.js';
10
10
  import { getFluidGridsConfig, validateTrustedOrigin, resetFluidGridsExecutionState, resetFluidGridsConfig, setFluidGridsConfig } from './chunk-UEG2WC3G.js';
11
11
  import { memo, forwardRef, useState, useImperativeHandle, useRef, useEffect, useMemo, createContext, useCallback, useSyncExternalStore, useContext } from 'react';
12
12
  import { useOptionalFeatureFlags } from '@burdenoff/fe-libs/shared/feature-flags';
@@ -275,6 +275,35 @@ function usePaletteGates() {
275
275
  return useMemo(() => resolvePaletteGates(context), [context]);
276
276
  }
277
277
 
278
+ // src/modules/executions/utils/duration.ts
279
+ function spanMs(start, end) {
280
+ if (!start || !end) return null;
281
+ const ms = new Date(end).getTime() - new Date(start).getTime();
282
+ return Number.isFinite(ms) && ms >= 0 ? ms : null;
283
+ }
284
+ function secondsToMs(seconds) {
285
+ return typeof seconds === "number" && Number.isFinite(seconds) && seconds >= 0 ? Math.round(seconds * 1e3) : null;
286
+ }
287
+ function nodeStateDurationMs(node) {
288
+ return spanMs(node.startTime, node.endTime) ?? secondsToMs(node.duration);
289
+ }
290
+ function runDurationMs(run) {
291
+ return spanMs(run.startedAt, run.completedAt) ?? secondsToMs(run.duration);
292
+ }
293
+ function formatElapsedMs(ms, empty = "-") {
294
+ if (ms === null || ms === void 0 || !Number.isFinite(ms) || ms < 0) {
295
+ return empty;
296
+ }
297
+ if (ms < 999.5) return `${Math.round(ms)}ms`;
298
+ if (ms < 59950) return `${(ms / 1e3).toFixed(1)}s`;
299
+ const totalSeconds = Math.round(ms / 1e3);
300
+ if (totalSeconds < 3600) {
301
+ return `${Math.floor(totalSeconds / 60)}m ${totalSeconds % 60}s`;
302
+ }
303
+ const totalMinutes = Math.floor(totalSeconds / 60);
304
+ return `${Math.floor(totalMinutes / 60)}h ${totalMinutes % 60}m`;
305
+ }
306
+
278
307
  // src/billing/quota.ts
279
308
  var RUNS_QUOTA_NAME = "fluidgrids.runs.monthly";
280
309
  var WORKFLOWS_QUOTA_NAME = "fluidgrids.workflows.count";
@@ -6339,7 +6368,7 @@ function useNodeExecution() {
6339
6368
  executionId: runId,
6340
6369
  trigger: analyticsTrigger,
6341
6370
  errorCode: run.errorType,
6342
- durationMs: run.duration
6371
+ durationMs: runDurationMs(run)
6343
6372
  });
6344
6373
  }
6345
6374
  completeExecution();
@@ -8208,4 +8237,4 @@ function createNodeWithDefaultData(type, data) {
8208
8237
  return Object.assign(createNodeData(type, defaultData), data);
8209
8238
  }
8210
8239
 
8211
- export { AUTOSAVE_DEBOUNCE_MS, AUTOSAVE_RETRY_DELAYS_MS, AVAILABLE_NODES, BILLING_PLANS_PATH, ConnectionFormDialog, ConnectionSelector, DURABLE_FUNCTION_NODE_TYPES, EDIT_SESSION_ID, ExpressionEditor, FLUIDGRIDS_FLAGS, FLUIDGRIDS_FLAG_DEFAULTS, FluidGridsContext, FluidGridsProvider, NODES, NODES_METADATA, NODE_CONFIGS, NODE_TYPES, NodePropertyPanel, PHASE_C_FLAGS_OFF, RUNS_QUOTA_NAME, RUN_CONTROL_NODE_TYPES, WORKFLOWS_QUOTA_NAME, WORKFLOW_TEST_NODE_TYPES, autosaveAllowedFor, bannerOf, blankWorkflowCreateInput, buildOperationSeed, buildStickyNode, builderPathOf, canAutosave, canSignalRun, classifyCreateRefusal, clearCodeWorkflowDefinitionCache, codeBuildIdOf, components_default, createConfiguredNode, createThenOpen, declaredOutputFields, declaredSignals, departingSave, editStateFor, editingLeaseLocked, emitNodeInstalled, emitRunFailed, emitRunLimitHit, emitRunStarted, emitTemplateUsed, emitUpgradeClicked, emitWorkflowCreated, emitWorkflowLimitHit, emitWorkflowPublished, ensureNodeConfigsLoaded, fieldsFromIO, fieldsFromValue, filterPaletteNodes, findQuotaRefusal, findSaveConflict, forgetSessionForReload, formatParameterValue, getNodeDetail, getNodeMetadata, inAppLeaveTarget, isDurableFunctionNodeType, isFlowComplete, isLocked, isNodeConfigsInitialized, isNodeTypeHiddenFromPalette, isParamVisible, isQuotaExhaustedFailure, isRunControlNodeType, leaseCallQueue, leavingLosesChanges, listCustomBlocks, liveInternalOperations, loadDefinitionJson, nodesOf, onNodeTypesUpdate, openRunQuotaUpgradePrompt, parseParameterValue, parseRawSignalPayload, pathToExpression, payloadFromCardValues, phaseAfterAcquire, phaseAfterTakeOver, readDisplayOptions, refetchStoreNodes, registerCustomBlock, registerWorkflowNodeTypes, releasesOnClose, rememberOwnStatusChange, rememberRevision, rememberSessionForReload, resolveNodeOperation, resolvePhaseCFlags, resolveUiSpec, runSignalTargets, runTriggerFromMode, saveIndicatorOf, savedEverythingBeforeLeaving, sessionBeforeReload, shouldReleaseForIdle, signalPayloadCard, stripSubmitActions, structuredParameterType, subscribeWorkflowSaved, tickAction, touchesSavedFields, useAgentDefinitionList, useAgentDefinitions, useCodeWorkflowInterface, useConnection, useConnections, useConnectionsByProvider, useContinuousOptimisationEnabled, useCreateConnection, useDurableFunctionNodesEnabled, useDurableParityEnabled, useEditLeaseLocked, useEditLeaseStore, useFlowValidator, useFluidGridsAnalytics, useFluidGridsContext, useFluidGridsFlag, useGuardedNavigate, useInitiateOAuth, useInsertNode, useManualSave, useNodeExecution, useNodeRegistryRevision, usePaletteGates, usePhaseCFlags, useProviders, useRunGuard, useSaveStatusStore, useSaveWorkflow, useSelfHostedWorkersEnabled, useWorkflowTestsEnabled, watchLeavingLosesChanges, workflowFingerprint };
8240
+ export { AUTOSAVE_DEBOUNCE_MS, AUTOSAVE_RETRY_DELAYS_MS, AVAILABLE_NODES, BILLING_PLANS_PATH, ConnectionFormDialog, ConnectionSelector, DURABLE_FUNCTION_NODE_TYPES, EDIT_SESSION_ID, ExpressionEditor, FLUIDGRIDS_FLAGS, FLUIDGRIDS_FLAG_DEFAULTS, FluidGridsContext, FluidGridsProvider, NODES, NODES_METADATA, NODE_CONFIGS, NODE_TYPES, NodePropertyPanel, PHASE_C_FLAGS_OFF, RUNS_QUOTA_NAME, RUN_CONTROL_NODE_TYPES, WORKFLOWS_QUOTA_NAME, WORKFLOW_TEST_NODE_TYPES, autosaveAllowedFor, bannerOf, blankWorkflowCreateInput, buildOperationSeed, buildStickyNode, builderPathOf, canAutosave, canSignalRun, classifyCreateRefusal, clearCodeWorkflowDefinitionCache, codeBuildIdOf, components_default, createConfiguredNode, createThenOpen, declaredOutputFields, declaredSignals, departingSave, editStateFor, editingLeaseLocked, emitNodeInstalled, emitRunFailed, emitRunLimitHit, emitRunStarted, emitTemplateUsed, emitUpgradeClicked, emitWorkflowCreated, emitWorkflowLimitHit, emitWorkflowPublished, ensureNodeConfigsLoaded, fieldsFromIO, fieldsFromValue, filterPaletteNodes, findQuotaRefusal, findSaveConflict, forgetSessionForReload, formatElapsedMs, formatParameterValue, getNodeDetail, getNodeMetadata, inAppLeaveTarget, isDurableFunctionNodeType, isFlowComplete, isLocked, isNodeConfigsInitialized, isNodeTypeHiddenFromPalette, isParamVisible, isQuotaExhaustedFailure, isRunControlNodeType, leaseCallQueue, leavingLosesChanges, listCustomBlocks, liveInternalOperations, loadDefinitionJson, nodeStateDurationMs, nodesOf, onNodeTypesUpdate, openRunQuotaUpgradePrompt, parseParameterValue, parseRawSignalPayload, pathToExpression, payloadFromCardValues, phaseAfterAcquire, phaseAfterTakeOver, readDisplayOptions, refetchStoreNodes, registerCustomBlock, registerWorkflowNodeTypes, releasesOnClose, rememberOwnStatusChange, rememberRevision, rememberSessionForReload, resolveNodeOperation, resolvePhaseCFlags, resolveUiSpec, runDurationMs, runSignalTargets, runTriggerFromMode, saveIndicatorOf, savedEverythingBeforeLeaving, sessionBeforeReload, shouldReleaseForIdle, signalPayloadCard, stripSubmitActions, structuredParameterType, subscribeWorkflowSaved, tickAction, touchesSavedFields, useAgentDefinitionList, useAgentDefinitions, useCodeWorkflowInterface, useConnection, useConnections, useConnectionsByProvider, useContinuousOptimisationEnabled, useCreateConnection, useDurableFunctionNodesEnabled, useDurableParityEnabled, useEditLeaseLocked, useEditLeaseStore, useFlowValidator, useFluidGridsAnalytics, useFluidGridsContext, useFluidGridsFlag, useGuardedNavigate, useInitiateOAuth, useInsertNode, useManualSave, useNodeExecution, useNodeRegistryRevision, usePaletteGates, usePhaseCFlags, useProviders, useRunGuard, useSaveStatusStore, useSaveWorkflow, useSelfHostedWorkersEnabled, useWorkflowTestsEnabled, watchLeavingLosesChanges, workflowFingerprint };
@@ -186,6 +186,8 @@ function emitRunCompletedOnce(payload) {
186
186
  var inFlight = null;
187
187
  var refreshGeneration = 0;
188
188
  var lastRefreshed = null;
189
+ var settledAttempts = 0;
190
+ var lastFailedAttempt = 0;
189
191
  function normalizeTokens(value) {
190
192
  if (typeof value === "string") {
191
193
  return value.trim() ? { authToken: value } : null;
@@ -205,24 +207,23 @@ function storeInConfig(tokens) {
205
207
  }
206
208
  function refreshTokens(callback, store) {
207
209
  if (inFlight) return inFlight;
210
+ const fail = (message) => {
211
+ settledAttempts += 1;
212
+ lastFailedAttempt = settledAttempts;
213
+ emitFluidGridsEvent("auth:failed", { message });
214
+ return null;
215
+ };
208
216
  const run = (async () => {
209
217
  try {
210
218
  const tokens = normalizeTokens(await callback());
211
- if (!tokens) {
212
- emitFluidGridsEvent("auth:failed", {
213
- message: "onTokenExpired returned no token."
214
- });
215
- return null;
216
- }
219
+ if (!tokens) return fail("onTokenExpired returned no token.");
217
220
  store(tokens);
221
+ settledAttempts += 1;
218
222
  refreshGeneration += 1;
219
223
  lastRefreshed = tokens;
220
224
  return tokens;
221
225
  } catch (error) {
222
- emitFluidGridsEvent("auth:failed", {
223
- message: describeOperationError(error, "Token refresh failed.")
224
- });
225
- return null;
226
+ return fail(describeOperationError(error, "Token refresh failed."));
226
227
  }
227
228
  })();
228
229
  inFlight = run;
@@ -248,16 +249,26 @@ function createFluidGridsTokenRefreshLink(options = {}) {
248
249
  const store = options.onTokenRefreshed ?? storeInConfig;
249
250
  return new Observable((observer) => {
250
251
  const sentInGeneration = refreshGeneration;
252
+ const sentAfterAttempts = settledAttempts;
251
253
  let retried = false;
252
254
  let closed = false;
253
255
  let current = null;
256
+ const pickRefresh = (callback) => {
257
+ if (refreshGeneration !== sentInGeneration && lastRefreshed) {
258
+ return Promise.resolve(lastRefreshed);
259
+ }
260
+ if (lastFailedAttempt > sentAfterAttempts) {
261
+ return Promise.resolve(null);
262
+ }
263
+ return refreshTokens(callback, store);
264
+ };
254
265
  const retryOrFail = (fail) => {
255
266
  const callback = options.onTokenExpired ?? config.auth?.onTokenExpired;
256
267
  if (!callback) return false;
257
268
  retried = true;
258
269
  current?.unsubscribe();
259
270
  current = null;
260
- const refreshed = refreshGeneration !== sentInGeneration && lastRefreshed ? Promise.resolve(lastRefreshed) : refreshTokens(callback, store);
271
+ const refreshed = pickRefresh(callback);
261
272
  void refreshed.then((tokens) => {
262
273
  if (closed) return;
263
274
  if (!tokens) {
@@ -1,8 +1,8 @@
1
- import { useFluidGridsAnalytics, emitWorkflowLimitHit, emitUpgradeClicked, WORKFLOWS_QUOTA_NAME } from './chunk-ZBPRNWKY.js';
1
+ import { useFluidGridsAnalytics, emitWorkflowLimitHit, emitUpgradeClicked, WORKFLOWS_QUOTA_NAME } from './chunk-HSTP2RX3.js';
2
2
  import { ExportWorkflowCodeDocument, ShareWorkflowDocument, WorkflowSharingDocument } from './chunk-Z3ABLERJ.js';
3
3
  import { useTr } from './chunk-UULVIT25.js';
4
- import { getFluidGridsClient } from './chunk-3IXU7WUC.js';
5
- import { describeOperationError, throwIfResultError } from './chunk-US5QSLPV.js';
4
+ import { getFluidGridsClient } from './chunk-PDODDDHY.js';
5
+ import { describeOperationError, throwIfResultError } from './chunk-JKLZ6YZ3.js';
6
6
  import { useState, useRef, useCallback, useEffect, useMemo } from 'react';
7
7
  import { createSharePrincipalLister, ResourceShareDialog } from '@burdenoff/fe-libs/connections';
8
8
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -1,5 +1,5 @@
1
1
  import { FluidgridsEntityTagsDocument, AvailableFluidgridsTagsDocument, SearchFluidgridsTagsDocument, TagFluidgridsEntityDocument, UntagFluidgridsEntityDocument, ReplaceFluidgridsEntityTagsDocument, CreateFluidgridsTagDocument, DataTablesTagsDocument } from './chunk-Z3ABLERJ.js';
2
- import { getFluidGridsClient } from './chunk-3IXU7WUC.js';
2
+ import { getFluidGridsClient } from './chunk-PDODDDHY.js';
3
3
  import { useState, useCallback, useEffect } from 'react';
4
4
 
5
5
  var FLUIDGRIDS_ENTITY_TYPES = [
@@ -1,8 +1,8 @@
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 { useFluidGridsAnalytics, emitRunStarted, openRunQuotaUpgradePrompt, useFluidGridsFlag, FLUIDGRIDS_FLAGS } from './chunk-ZBPRNWKY.js';
2
+ import { useFluidGridsAnalytics, emitRunStarted, openRunQuotaUpgradePrompt, useFluidGridsFlag, FLUIDGRIDS_FLAGS } from './chunk-HSTP2RX3.js';
3
3
  import { useTr } from './chunk-UULVIT25.js';
4
- import { getFluidGridsClient } from './chunk-3IXU7WUC.js';
5
- import { throwIfResultError, describeOperationError, emitFluidGridsEvent } from './chunk-US5QSLPV.js';
4
+ import { getFluidGridsClient } from './chunk-PDODDDHY.js';
5
+ import { throwIfResultError, describeOperationError, emitFluidGridsEvent } from './chunk-JKLZ6YZ3.js';
6
6
  import { useCallback, useState, useMemo, useEffect } from 'react';
7
7
  import { Icon } from '@iconify/react';
8
8
  import { toast } from 'sonner';
@@ -1,14 +1,14 @@
1
- import { isGuidedTourIntent, pickGuidedTour, withoutGuidedTourIntent, isCreateIntent, CreateWorkflowRefusalDialog, decideMissingWorkflow } from './chunk-FVWRGL7S.js';
1
+ import { isGuidedTourIntent, pickGuidedTour, withoutGuidedTourIntent, isCreateIntent, CreateWorkflowRefusalDialog, decideMissingWorkflow } from './chunk-Y4UCHFGK.js';
2
2
  import { registerLiveCanvasHandler } from './chunk-PIKYQE7P.js';
3
- import { useWorkflowReloadStore, releaseLeaseKeptForReload, useInstalledNodes, buildNodeCheck, FlowBuilderPage, buildRequiredNodeTypes } from './chunk-NMQENSPW.js';
4
- import { canvasFromDefinition } from './chunk-JYYN3CLL.js';
5
- import { useLazyWorkflowDefinition, useCreateWorkflow } from './chunk-YGOGJDN4.js';
6
- import { refetchStoreNodes, BILLING_PLANS_PATH, codeBuildIdOf, rememberRevision, blankWorkflowCreateInput, classifyCreateRefusal, useSaveStatusStore, workflowFingerprint, registerWorkflowNodeTypes } from './chunk-ZBPRNWKY.js';
7
- import { useFlowStore, mergeStickyNotes } from './chunk-5DVP2UYH.js';
3
+ import { useWorkflowReloadStore, releaseLeaseKeptForReload, useInstalledNodes, buildNodeCheck, FlowBuilderPage, buildRequiredNodeTypes } from './chunk-OTOQFZFO.js';
4
+ import { canvasFromDefinition } from './chunk-6VIG44VF.js';
5
+ import { useLazyWorkflowDefinition, useCreateWorkflow } from './chunk-EIMTOK6E.js';
6
+ import { refetchStoreNodes, BILLING_PLANS_PATH, codeBuildIdOf, rememberRevision, blankWorkflowCreateInput, classifyCreateRefusal, useSaveStatusStore, workflowFingerprint, registerWorkflowNodeTypes } from './chunk-HSTP2RX3.js';
7
+ import { useFlowStore, mergeStickyNotes } from './chunk-TGWDFLEX.js';
8
8
  import { WorkflowDefinitionDocument } from './chunk-Z3ABLERJ.js';
9
9
  import { useTr } from './chunk-UULVIT25.js';
10
- import { getFluidGridsClient } from './chunk-3IXU7WUC.js';
11
- import { throwIfResultError } from './chunk-US5QSLPV.js';
10
+ import { getFluidGridsClient } from './chunk-PDODDDHY.js';
11
+ import { throwIfResultError } from './chunk-JKLZ6YZ3.js';
12
12
  import { getFluidGridsConfig } from './chunk-UEG2WC3G.js';
13
13
  import { useLocation, useNavigate, useParams } from 'react-router';
14
14
  import { toast } from 'sonner';
@@ -794,7 +794,7 @@ function WorkflowItem({
794
794
  setInstalling(true);
795
795
  setInstallErrors([]);
796
796
  try {
797
- const { getGlobalStoreClient } = await import('./global-client-N5EIFW6T.js');
797
+ const { getGlobalStoreClient } = await import('./global-client-PJ5LANJA.js');
798
798
  const { InstallWorkflowNodeDocument } = await import('./global-operations-BZDHTSYP.js');
799
799
  const { getFluidGridsConfig: getFluidGridsConfig2 } = await import('./config-66FUPSG5.js');
800
800
  const storeClient = getGlobalStoreClient();
@@ -1,17 +1,17 @@
1
- import { CreateWorkflowRefusalDialog, firstWorkflowProgress, GUIDED_TOUR_STATE, builderPathFor } from './chunk-FVWRGL7S.js';
2
- import { useExecutions } from './chunk-VESQH55Q.js';
3
- import { useExportWorkflowAs, WorkflowShareDialog, downloadWorkflowExport, importAcceptAttribute, canEditWorkflow, canShareWorkflow, QuotaExhaustedDialog, importFileKind, parseWorkflowImport, CODE_EXPORT_FORMATS, ImportSourceError, assertImportByteSize, MAX_IMPORT_ARCHIVE_BYTES, readProjectArchive, checkTypeScriptImport, MAX_IMPORT_SOURCE_BYTES, typeScriptModuleFile, typeScriptImportSource, workflowNameFromFile, primaryImportModule } from './chunk-KAWRHIJZ.js';
1
+ import { CreateWorkflowRefusalDialog, firstWorkflowProgress, GUIDED_TOUR_STATE, builderPathFor } from './chunk-Y4UCHFGK.js';
2
+ import { useExecutions } from './chunk-WC526MLS.js';
3
+ import { useExportWorkflowAs, WorkflowShareDialog, downloadWorkflowExport, importAcceptAttribute, canEditWorkflow, canShareWorkflow, QuotaExhaustedDialog, importFileKind, parseWorkflowImport, CODE_EXPORT_FORMATS, ImportSourceError, assertImportByteSize, MAX_IMPORT_ARCHIVE_BYTES, readProjectArchive, checkTypeScriptImport, MAX_IMPORT_SOURCE_BYTES, typeScriptModuleFile, typeScriptImportSource, workflowNameFromFile, primaryImportModule } from './chunk-JRLBPR5U.js';
4
4
  import { workflowsListControls } from './chunk-FNZZ5JJL.js';
5
- import { useCreateWorkflow, useWorkflowDefinitions, useLazyWorkflowDefinition, useImportWorkflow, usePreviewN8nImport, useDuplicateWorkflow, useDeleteWorkflow } from './chunk-YGOGJDN4.js';
5
+ import { useCreateWorkflow, useWorkflowDefinitions, useLazyWorkflowDefinition, useImportWorkflow, usePreviewN8nImport, useDuplicateWorkflow, useDeleteWorkflow } from './chunk-EIMTOK6E.js';
6
6
  import { useFluidGridsPageControls } from './chunk-PJAWNFJV.js';
7
7
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
8
- import { createThenOpen, FluidGridsContext, useFluidGridsFlag, FLUIDGRIDS_FLAGS, BILLING_PLANS_PATH, isQuotaExhaustedFailure } from './chunk-ZBPRNWKY.js';
8
+ import { createThenOpen, FluidGridsContext, useFluidGridsFlag, FLUIDGRIDS_FLAGS, BILLING_PLANS_PATH, isQuotaExhaustedFailure } from './chunk-HSTP2RX3.js';
9
9
  import { useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS, SdkPermissionButton, SdkPermissionGate } from './chunk-5375NUIO.js';
10
- import { useFlowStore } from './chunk-5DVP2UYH.js';
10
+ import { useFlowStore } from './chunk-TGWDFLEX.js';
11
11
  import { WorkflowFoldersDocument, CreateWorkflowFolderDocument, RenameWorkflowFolderDocument, MoveWorkflowFolderDocument, DeleteWorkflowFolderDocument, WorkflowProjectsDocument, CreateWorkflowProjectDocument, RenameWorkflowProjectDocument, DeleteWorkflowProjectDocument, BulkMoveWorkflowsToFolderDocument, BulkAssignWorkflowsToProjectDocument, BulkDeleteWorkflowsDocument } from './chunk-Z3ABLERJ.js';
12
12
  import { useTr } from './chunk-UULVIT25.js';
13
- import { getFluidGridsClient } from './chunk-3IXU7WUC.js';
14
- import { describeOperationError, throwIfResultError } from './chunk-US5QSLPV.js';
13
+ import { getFluidGridsClient } from './chunk-PDODDDHY.js';
14
+ import { describeOperationError, throwIfResultError } from './chunk-JKLZ6YZ3.js';
15
15
  import { useState, useRef, useCallback, useContext, useMemo, useEffect } from 'react';
16
16
  import { useNavigate } from 'react-router';
17
17
  import { v4 } from 'uuid';
@@ -1,7 +1,7 @@
1
1
  import { RunFailureClustersDocument, DismissRunFailureClusterDocument, RunFailureTriageSettingsDocument, SetRunFailureTriageEnabledDocument, FgTriageFailedRunsDocument } from './chunk-Z3ABLERJ.js';
2
2
  import { useTr } from './chunk-UULVIT25.js';
3
- import { getFluidGridsClient } from './chunk-3IXU7WUC.js';
4
- import { throwIfResultError } from './chunk-US5QSLPV.js';
3
+ import { getFluidGridsClient } from './chunk-PDODDDHY.js';
4
+ import { throwIfResultError } from './chunk-JKLZ6YZ3.js';
5
5
  import { useState, useCallback, useEffect } from 'react';
6
6
  import { Icon } from '@iconify/react';
7
7
  import { Button } from '@burdenoff/fe-libs/ui';
@@ -325,70 +325,4 @@ function FailureTriagePanel({
325
325
  );
326
326
  }
327
327
 
328
- // src/modules/observability/utils.ts
329
- function percentage(value, total) {
330
- if (total <= 0) return 0;
331
- return Math.round(value / total * 1e3) / 10;
332
- }
333
- function getFailureBreakdown(runs) {
334
- const counts = /* @__PURE__ */ new Map();
335
- for (const run of runs) {
336
- const key = run.errorType || "UNKNOWN";
337
- counts.set(key, (counts.get(key) ?? 0) + 1);
338
- }
339
- return [...counts.entries()].map(([key, count]) => ({ key, count })).sort((a, b) => b.count - a.count || a.key.localeCompare(b.key));
340
- }
341
- function getTopFailingWorkflows(runs) {
342
- const counts = /* @__PURE__ */ new Map();
343
- for (const run of runs) {
344
- const current = counts.get(run.workflowKey);
345
- if (current) {
346
- current.count += 1;
347
- } else {
348
- counts.set(run.workflowKey, {
349
- workflowKey: run.workflowKey,
350
- label: run.workflow?.name || run.workflowKey,
351
- count: 1
352
- });
353
- }
354
- }
355
- return [...counts.values()].sort(
356
- (a, b) => b.count - a.count || a.label.localeCompare(b.label)
357
- );
358
- }
359
- function getTopFailingNodes(nodeUsageStats) {
360
- return [...nodeUsageStats].filter((stat) => stat.failureCount > 0).sort(
361
- (a, b) => b.failureCount - a.failureCount || a.nodeType.localeCompare(b.nodeType)
362
- );
363
- }
364
- function formatDuration(seconds) {
365
- if (seconds === null || seconds === void 0 || !Number.isFinite(seconds)) {
366
- return "\u2014";
367
- }
368
- if (seconds < 1) return `${Math.round(seconds * 1e3)}ms`;
369
- if (seconds < 60) return `${seconds.toFixed(1)}s`;
370
- const minutes = Math.floor(seconds / 60);
371
- const remainingSeconds = Math.round(seconds % 60);
372
- return `${minutes}m ${remainingSeconds}s`;
373
- }
374
- function formatBytes(bytes) {
375
- if (!Number.isFinite(bytes) || bytes < 0) return "\u2014";
376
- if (bytes < 1024) return `${bytes} B`;
377
- const units = ["KB", "MB", "GB", "TB"];
378
- let value = bytes / 1024;
379
- let unit = units[0];
380
- for (let i = 1; i < units.length && value >= 1024; i += 1) {
381
- value /= 1024;
382
- unit = units[i];
383
- }
384
- return `${value.toFixed(value >= 10 ? 0 : 1)} ${unit}`;
385
- }
386
- function prettyJson(value) {
387
- try {
388
- return JSON.stringify(value, null, 2) ?? "null";
389
- } catch {
390
- return String(value);
391
- }
392
- }
393
-
394
- export { BUCKET_LABELS, FailureTriagePanel, OPEN_STATUSES, dismissRunFailureCluster, fetchRunFailureClusters, formatBytes, formatDuration, getFailureBreakdown, getTopFailingNodes, getTopFailingWorkflows, percentage, prettyJson };
328
+ export { BUCKET_LABELS, FailureTriagePanel, OPEN_STATUSES, dismissRunFailureCluster, fetchRunFailureClusters };
@@ -1,16 +1,16 @@
1
- import { asRecord, ConditionTreeBuilder, SwitchRulesEditor, casesFromRules, isStringOptionList, optionText, coerceNumber, paramsFromOperation, resolveLoadOptionsSpec, optionListValues, parseMappingValue, optionListText } from './chunk-ZLBTUCC2.js';
1
+ import { asRecord, ConditionTreeBuilder, SwitchRulesEditor, casesFromRules, isStringOptionList, optionText, coerceNumber, paramsFromOperation, resolveLoadOptionsSpec, optionListValues, parseMappingValue, optionListText } from './chunk-WBRW67HX.js';
2
2
  import { CodeEditorField, normalizeCodeLanguage } from './chunk-KZCNJAMK.js';
3
3
  import { Popover, PopoverTrigger, PopoverContent } from './chunk-GTEBQQ7J.js';
4
- import { AgentDefinitionSelectField } from './chunk-22U3TUKZ.js';
4
+ import { AgentDefinitionSelectField } from './chunk-XNARCHMT.js';
5
5
  import { isAgentNodeType } from './chunk-WZ3EJVS6.js';
6
6
  import { readAssertRulesSetting, rowsFromRules, normaliseAssertRules, ruleFromRow, describeAssertRuleProblem, operatorSpec, ASSERT_OPERATORS, emptyAssertRuleRow } from './chunk-JDLQ6QIB.js';
7
- import { isParamVisible, ConnectionSelector, structuredParameterType, useRunGuard, FluidGridsContext, ExpressionEditor, formatParameterValue, parseParameterValue, useFluidGridsAnalytics, openRunQuotaUpgradePrompt } from './chunk-ZBPRNWKY.js';
7
+ import { isParamVisible, ConnectionSelector, structuredParameterType, useRunGuard, FluidGridsContext, ExpressionEditor, formatParameterValue, parseParameterValue, useFluidGridsAnalytics, openRunQuotaUpgradePrompt } from './chunk-HSTP2RX3.js';
8
8
  import { useBuilderReadOnly } from './chunk-SDZEAIIE.js';
9
- import { useFlowStore } from './chunk-5DVP2UYH.js';
9
+ import { useFlowStore } from './chunk-TGWDFLEX.js';
10
10
  import { useRunFromNodeEligibilityQuery, PreviewScheduleDocument, WebhookTestListenerDocument, StopWebhookTestListenerDocument, ListenForWebhookTestEventDocument } from './chunk-Z3ABLERJ.js';
11
11
  import { useTr } from './chunk-UULVIT25.js';
12
- import { getFluidGridsClientSafe, getFluidGridsClient } from './chunk-3IXU7WUC.js';
13
- import { throwIfResultError, describeOperationError } from './chunk-US5QSLPV.js';
12
+ import { getFluidGridsClientSafe, getFluidGridsClient } from './chunk-PDODDDHY.js';
13
+ import { throwIfResultError, describeOperationError } from './chunk-JKLZ6YZ3.js';
14
14
  import { useId, useState, useMemo, useRef, useEffect, useContext, useCallback } from 'react';
15
15
  import { Icon } from '@iconify/react';
16
16
  import { cn } from '@burdenoff/fe-libs/utils';
@@ -1,29 +1,29 @@
1
- import { computeAttachPosition, firstInputHandleId } from './chunk-3MZOYJ5I.js';
1
+ import { computeAttachPosition, firstInputHandleId } from './chunk-XWINH6CR.js';
2
2
  import { deepClone, applyTemplateInputs } from './chunk-GEMNVFPK.js';
3
3
  import { templatePreview } from './chunk-B6CCE2RW.js';
4
4
  import { Input } from './chunk-IEVSFCFS.js';
5
5
  import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter as DialogFooter$1 } from './chunk-YXMFRQYV.js';
6
6
  import { Badge as Badge$1, Button } from './chunk-BQXVT32O.js';
7
- import { LogsPanel } from './chunk-MY7SEUXM.js';
8
- import { QuotaExhaustedDialog, WorkflowShareDialog, useWorkflowCodeExport, orderedExportFiles, fileBaseName, downloadWorkflowCodeExport, isLosslessReport, sortFidelityItems, isLossyFidelityItem, lineOfNode } from './chunk-KAWRHIJZ.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-EYQ7GJRW.js';
10
- import { buildNodeDisplayMap } from './chunk-IL343FKX.js';
7
+ import { LogsPanel } from './chunk-43GSC5Y6.js';
8
+ import { QuotaExhaustedDialog, WorkflowShareDialog, useWorkflowCodeExport, orderedExportFiles, fileBaseName, downloadWorkflowCodeExport, isLosslessReport, sortFidelityItems, isLossyFidelityItem, lineOfNode } from './chunk-JRLBPR5U.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-PASKZCII.js';
10
+ import { buildNodeDisplayMap } from './chunk-KHS2DZHH.js';
11
11
  import { AiCreditBalanceSlot } from './chunk-Y53CVZVV.js';
12
- import { countLifecycle, VersionLifecycleBar, VersionDiffDialog } from './chunk-TJAG2DQT.js';
13
- import { useRestoreWorkflowVersion, useWorkflowVersions, useActivateWorkflow, useDeleteWorkflow, useDeactivateWorkflow } from './chunk-YGOGJDN4.js';
12
+ import { countLifecycle, VersionLifecycleBar, VersionDiffDialog } from './chunk-5Z4F24QT.js';
13
+ import { useRestoreWorkflowVersion, useWorkflowVersions, useActivateWorkflow, useDeleteWorkflow, useDeactivateWorkflow } from './chunk-EIMTOK6E.js';
14
14
  import { useRequestedProposal } from './chunk-GLYINMOR.js';
15
15
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
16
- import { leaseCallQueue, RUNS_QUOTA_NAME, BILLING_PLANS_PATH, emitUpgradeClicked, FluidGridsContext, emitWorkflowCreated, emitTemplateUsed, ensureNodeConfigsLoaded, NODE_CONFIGS, useEditLeaseStore, useEditLeaseLocked, registerWorkflowNodeTypes, emitNodeInstalled, useNodeExecution, usePaletteGates, onNodeTypesUpdate, NODE_TYPES, getNodeMetadata, refetchStoreNodes, AVAILABLE_NODES, EDIT_SESSION_ID, useInsertNode, useSaveStatusStore, useManualSave, useDurableFunctionNodesEnabled, bannerOf, editStateFor, useSaveWorkflow, filterPaletteNodes, useFluidGridsAnalytics, useGuardedNavigate, sessionBeforeReload, forgetSessionForReload, releasesOnClose, touchesSavedFields, isLocked, watchLeavingLosesChanges, workflowFingerprint, savedEverythingBeforeLeaving, buildStickyNode, NODES_METADATA, shouldReleaseForIdle, tickAction, rememberSessionForReload, leavingLosesChanges, buildOperationSeed, useDurableParityEnabled, useConnections, ConnectionFormDialog, useWorkflowTestsEnabled, useFluidGridsFlag, FLUIDGRIDS_FLAGS, useFlowValidator, saveIndicatorOf, departingSave, inAppLeaveTarget, isNodeConfigsInitialized, phaseAfterAcquire, rememberOwnStatusChange, useRunGuard, getNodeDetail, NODES, NodePropertyPanel, loadDefinitionJson, canAutosave, isNodeTypeHiddenFromPalette, ConnectionSelector, AUTOSAVE_RETRY_DELAYS_MS, AUTOSAVE_DEBOUNCE_MS, editingLeaseLocked, autosaveAllowedFor, isFlowComplete, rememberRevision, phaseAfterTakeOver } from './chunk-ZBPRNWKY.js';
16
+ import { leaseCallQueue, RUNS_QUOTA_NAME, BILLING_PLANS_PATH, emitUpgradeClicked, FluidGridsContext, emitWorkflowCreated, emitTemplateUsed, ensureNodeConfigsLoaded, NODE_CONFIGS, useEditLeaseStore, useEditLeaseLocked, registerWorkflowNodeTypes, emitNodeInstalled, useNodeExecution, usePaletteGates, onNodeTypesUpdate, NODE_TYPES, getNodeMetadata, refetchStoreNodes, AVAILABLE_NODES, EDIT_SESSION_ID, useInsertNode, useSaveStatusStore, useManualSave, useDurableFunctionNodesEnabled, bannerOf, editStateFor, useSaveWorkflow, filterPaletteNodes, useFluidGridsAnalytics, useGuardedNavigate, sessionBeforeReload, forgetSessionForReload, releasesOnClose, touchesSavedFields, isLocked, watchLeavingLosesChanges, workflowFingerprint, savedEverythingBeforeLeaving, buildStickyNode, NODES_METADATA, shouldReleaseForIdle, tickAction, rememberSessionForReload, leavingLosesChanges, buildOperationSeed, useDurableParityEnabled, useConnections, ConnectionFormDialog, useWorkflowTestsEnabled, useFluidGridsFlag, FLUIDGRIDS_FLAGS, useFlowValidator, saveIndicatorOf, departingSave, inAppLeaveTarget, isNodeConfigsInitialized, phaseAfterAcquire, rememberOwnStatusChange, useRunGuard, getNodeDetail, NODES, NodePropertyPanel, loadDefinitionJson, canAutosave, isNodeTypeHiddenFromPalette, ConnectionSelector, AUTOSAVE_RETRY_DELAYS_MS, AUTOSAVE_DEBOUNCE_MS, editingLeaseLocked, autosaveAllowedFor, isFlowComplete, rememberRevision, phaseAfterTakeOver } from './chunk-HSTP2RX3.js';
17
17
  import { SdkPermissionButton, FLUIDGRIDS_PERMISSIONS, useFluidGridsPermission, SdkPermissionGate } from './chunk-5375NUIO.js';
18
18
  import { cn } from './chunk-JL7CASN5.js';
19
19
  import { BuilderReadOnlyProvider, useBuilderReadOnly } from './chunk-SDZEAIIE.js';
20
- import { useFlowStore, useIsValidConnection, NODE_TYPE_DRAG_DATA_FORMAT, NODE_OPERATION_DRAG_DATA_FORMAT, CODE_WORKFLOW_NODE_TYPE, STICKY_NOTE_TYPE, NodeTypeIcon, isImageIcon, synchronizeOperationUpdate, isTriggerOperation, canRenderOperationPanel, resolveOperationName } from './chunk-5DVP2UYH.js';
21
- import { getGlobalStoreClient } from './chunk-AU7LACOY.js';
20
+ import { useFlowStore, useIsValidConnection, NODE_TYPE_DRAG_DATA_FORMAT, NODE_OPERATION_DRAG_DATA_FORMAT, CODE_WORKFLOW_NODE_TYPE, STICKY_NOTE_TYPE, NodeTypeIcon, isImageIcon, synchronizeOperationUpdate, isTriggerOperation, canRenderOperationPanel, resolveOperationName } from './chunk-TGWDFLEX.js';
21
+ import { getGlobalStoreClient } from './chunk-TYI2XOSI.js';
22
22
  import { GetMyNodeInstallationsDocument, BrowseWorkflowTemplatesDocument, InstallWorkflowNodeDocument, SubmitWorkflowTemplateDocument, MyWorkflowTemplateSubmissionsDocument, WithdrawWorkflowTemplateSubmissionDocument, InstallPurchasedNodeDocument, BrowseWorkflowNodesDocument, UninstallWorkflowNodeDocument, CreateStoreOrderDocument, GetNodeInstallableVersionsDocument, OrganizationPrivateNodesDocument, InstallOrganizationPrivateNodeDocument, UninstallOrganizationPrivateNodeDocument } from './chunk-G77IGC3Y.js';
23
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-Z3ABLERJ.js';
24
24
  import { useTr } from './chunk-UULVIT25.js';
25
- import { waitForFluidGridsClient, getFluidGridsClient } from './chunk-3IXU7WUC.js';
26
- import { throwIfResultError, describeOperationError, emitFluidGridsEvent } from './chunk-US5QSLPV.js';
25
+ import { waitForFluidGridsClient, getFluidGridsClient } from './chunk-PDODDDHY.js';
26
+ import { throwIfResultError, describeOperationError, emitFluidGridsEvent } from './chunk-JKLZ6YZ3.js';
27
27
  import { getFluidGridsConfig } from './chunk-UEG2WC3G.js';
28
28
  import * as React3 from 'react';
29
29
  import React3__default, { forwardRef, lazy, memo, createContext, useState, useRef, useCallback, useEffect, useContext, useMemo, useLayoutEffect, Suspense, useDeferredValue } from 'react';
@@ -35,10 +35,10 @@ import { useQuery, useMutation } from '@apollo/client/react';
35
35
  import { gql } from '@apollo/client/core';
36
36
  import { Sparkles, Star, Download, Eye, Maximize2, Undo2, Redo2, LayoutGrid, Keyboard, Plus, Trash2, GitBranch, Loader2, AlertCircle, Search, RefreshCw, History, GitCompareArrows, Play, RotateCcw, Layers, Upload, Rocket, ArrowRight, Check, X, Link2, Unlink, GitCompare, ExternalLink, GitCommitHorizontal, Share2, CircleHelp, CheckCircle2, Package, SlidersHorizontal, FlaskConical, Pencil, Info, Copy, BadgeCheck, DollarSign, Type, Code, Hash, List, Braces, Workflow, PlusCircle, ChevronDown, ChevronRight, AlertTriangle } from 'lucide-react';
37
37
  import { Icon } from '@iconify/react';
38
+ import { Handle, Position, getBezierPath, MarkerType, useOnSelectionChange, ReactFlowProvider, useReactFlow, ReactFlow, Background, useStore, MiniMap, EdgeLabelRenderer, useNodes, useNodesState, useEdgesState, addEdge, Controls, Panel } from '@xyflow/react';
38
39
  import { create } from 'zustand';
39
40
  import { toast } from 'sonner';
40
41
  import { useShallow, shallow } from 'zustand/shallow';
41
- import { Handle, Position, getBezierPath, MarkerType, ReactFlowProvider, useReactFlow, ReactFlow, Background, useOnSelectionChange, useStore, MiniMap, EdgeLabelRenderer, useNodes, useNodesState, useEdgesState, addEdge, Controls, Panel } from '@xyflow/react';
42
42
  import { produce } from 'immer';
43
43
  import { Card as Card$1, Badge, CardContent as CardContent$1, Button as Button$1, Popover, PopoverTrigger, PopoverContent, AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, Toaster, Tabs, TabsList, TabsTrigger, TabsContent, CardHeader as CardHeader$1, CardTitle as CardTitle$1, CardDescription as CardDescription$1, ScrollArea, Sheet, SheetTrigger, SheetContent, SheetHeader, SheetTitle, SheetDescription, Label, Textarea, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, AlertDialogAction, TooltipProvider, Switch, Input as Input$1, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, Tooltip, TooltipTrigger, TooltipContent, Dialog as Dialog$1, DialogContent as DialogContent$1, DialogHeader as DialogHeader$1, DialogTitle as DialogTitle$1, DialogDescription as DialogDescription$1, DialogFooter, DropdownMenuLabel, DropdownMenuSeparator } from '@burdenoff/fe-libs/ui';
44
44
  import { isEmpty } from 'radash';
@@ -1792,6 +1792,23 @@ function buildNodeCheck(requiredNodeTypes, installedAppIds) {
1792
1792
  canImport: missingPaid.length === 0
1793
1793
  };
1794
1794
  }
1795
+ function nodeSelectionPayload(nodes) {
1796
+ if (nodes.length === 0) return { nodeId: null };
1797
+ if (nodes.length > 1) return void 0;
1798
+ const [node] = nodes;
1799
+ if (!node) return void 0;
1800
+ return { nodeId: node.id, nodeType: node.type };
1801
+ }
1802
+ function useNodeSelectedEvent() {
1803
+ const lastReported = useRef(null);
1804
+ const onChange = useCallback(({ nodes }) => {
1805
+ const payload = nodeSelectionPayload(nodes);
1806
+ if (!payload || payload.nodeId === lastReported.current) return;
1807
+ lastReported.current = payload.nodeId;
1808
+ emitFluidGridsEvent("node:selected", payload);
1809
+ }, []);
1810
+ useOnSelectionChange({ onChange });
1811
+ }
1795
1812
  var FLUIDGRIDS_BRAND = "FluidGrids";
1796
1813
  var FLUIDGRIDS_SITE_URL = "https://www.fluidgrids.ai";
1797
1814
  var ENGLISH_LABEL = `Powered by ${FLUIDGRIDS_BRAND}`;
@@ -5531,7 +5548,7 @@ function DesktopSidebarFragment({
5531
5548
  (n) => !!n.storeProductId
5532
5549
  );
5533
5550
  if (nodesToInstall.length > 0) {
5534
- const { getGlobalStoreClient: getStore } = await import('./global-client-N5EIFW6T.js');
5551
+ const { getGlobalStoreClient: getStore } = await import('./global-client-PJ5LANJA.js');
5535
5552
  const { InstallWorkflowNodeDocument: InstallWorkflowNodeDocument2 } = await import('./global-operations-BZDHTSYP.js');
5536
5553
  const { getFluidGridsConfig: getFluidGridsConfig3 } = await import('./config-66FUPSG5.js');
5537
5554
  const storeClient = getStore();
@@ -5593,7 +5610,7 @@ function DesktopSidebarFragment({
5593
5610
  overrides.templateInputs
5594
5611
  );
5595
5612
  }
5596
- const { getFluidGridsClient: getFluidGridsClient2 } = await import('./client-YVZMLEQX.js');
5613
+ const { getFluidGridsClient: getFluidGridsClient2 } = await import('./client-62VHXHKN.js');
5597
5614
  const { getFluidGridsConfig: getFluidGridsConfig2 } = await import('./config-66FUPSG5.js');
5598
5615
  const { gql: gql5 } = await import('@apollo/client/core');
5599
5616
  const IMPORT_MUTATION = gql5`
@@ -5651,7 +5668,7 @@ function DesktopSidebarFragment({
5651
5668
  category: content.defaultCategory || template.category
5652
5669
  });
5653
5670
  try {
5654
- const { getGlobalStoreClient: getStoreClient } = await import('./global-client-N5EIFW6T.js');
5671
+ const { getGlobalStoreClient: getStoreClient } = await import('./global-client-PJ5LANJA.js');
5655
5672
  const { InstallWorkflowNodeDocument: InstallWorkflowNodeDocument2 } = await import('./global-operations-BZDHTSYP.js');
5656
5673
  const storeClient = getStoreClient();
5657
5674
  if (storeClient) {
@@ -5751,7 +5768,7 @@ function DesktopSidebarFragment({
5751
5768
  ),
5752
5769
  { id: "template-load" }
5753
5770
  );
5754
- const { getGlobalStoreClient: getGlobalStoreClient2 } = await import('./global-client-N5EIFW6T.js');
5771
+ const { getGlobalStoreClient: getGlobalStoreClient2 } = await import('./global-client-PJ5LANJA.js');
5755
5772
  const { gql: gql5 } = await import('@apollo/client/core');
5756
5773
  const GET_TEMPLATE_DETAIL = gql5`
5757
5774
  query GetWorkflowTemplateDetail($id: ID!) {
@@ -6007,23 +6024,6 @@ function useDeleteKeyCode() {
6007
6024
  });
6008
6025
  return deleteKeyCode;
6009
6026
  }
6010
- function nodeSelectionPayload(nodes) {
6011
- if (nodes.length === 0) return { nodeId: null };
6012
- if (nodes.length > 1) return void 0;
6013
- const [node] = nodes;
6014
- if (!node) return void 0;
6015
- return { nodeId: node.id, nodeType: node.type };
6016
- }
6017
- function useNodeSelectedEvent() {
6018
- const lastReported = useRef(null);
6019
- const onChange = useCallback(({ nodes }) => {
6020
- const payload = nodeSelectionPayload(nodes);
6021
- if (!payload || payload.nodeId === lastReported.current) return;
6022
- lastReported.current = payload.nodeId;
6023
- emitFluidGridsEvent("node:selected", payload);
6024
- }, []);
6025
- useOnSelectionChange({ onChange });
6026
- }
6027
6027
  function useOnNodesDelete(nodes) {
6028
6028
  const [nodePropertiesSelectedNode, nodePropertiesSetSelectedNode] = useFlowStore(
6029
6029
  useShallow((state) => [
@@ -21241,12 +21241,12 @@ function EditLeaseBanner() {
21241
21241
  );
21242
21242
  }
21243
21243
  var LazyNodeDetailView = lazy(
21244
- () => import('./node-detail-view-U5HOP2WX.js').then((m) => ({
21244
+ () => import('./node-detail-view-P5NV5CMO.js').then((m) => ({
21245
21245
  default: m.NodeDetailView
21246
21246
  }))
21247
21247
  );
21248
21248
  var LazyQuickConfigPanel = lazy(
21249
- () => import('./quick-config-panel-XAISBW6Y.js').then((m) => ({
21249
+ () => import('./quick-config-panel-ZNSBVF4G.js').then((m) => ({
21250
21250
  default: m.QuickConfigPanel
21251
21251
  }))
21252
21252
  );
@@ -21308,7 +21308,7 @@ var FlowBuilder = ({ readOnly = false }) => {
21308
21308
  );
21309
21309
  useEffect(() => {
21310
21310
  let cancelled = false;
21311
- void import('./agentTools-YQBN33WG.js').then(({ createBuilderAgentTools }) => {
21311
+ void import('./agentTools-UH4LU6LA.js').then(({ createBuilderAgentTools }) => {
21312
21312
  if (cancelled) return;
21313
21313
  setAgentTools(
21314
21314
  createBuilderAgentTools({
@@ -21648,4 +21648,4 @@ var FlowBuilderPage = ({
21648
21648
  ] });
21649
21649
  };
21650
21650
 
21651
- export { AI_DRAFT_MAX_PROMPT_LENGTH, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, FlowBuilderPage, FluidGridsMark, RunsUsageMeter, RunsUsageMeterView, TEMPLATE_STORE_CATEGORIES, TemplateCard, buildNodeCheck, buildRequiredNodeTypes, draftToCanvas, enrichDraftNodes, readRunsQuota, releaseLeaseKeptForReload, runsQuotaLevel, summarizeRunsQuota, useAiWorkflowTemplates, useImportWorkflowTemplate, useInstalledNodes, usePublishToStore, useRunsQuota, useTemplateSubmissions, useWorkflowReloadStore, useWorkflowTemplates };
21651
+ export { AI_DRAFT_MAX_PROMPT_LENGTH, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, FlowBuilderPage, FluidGridsMark, RunsUsageMeter, RunsUsageMeterView, TEMPLATE_STORE_CATEGORIES, TemplateCard, buildNodeCheck, buildRequiredNodeTypes, draftToCanvas, enrichDraftNodes, readRunsQuota, releaseLeaseKeptForReload, runsQuotaLevel, summarizeRunsQuota, useAiWorkflowTemplates, useImportWorkflowTemplate, useInstalledNodes, useNodeSelectedEvent, usePublishToStore, useRunsQuota, useTemplateSubmissions, useWorkflowReloadStore, useWorkflowTemplates };
@@ -1,11 +1,11 @@
1
1
  import { operatorSpec, normaliseAssertRules, describeAssertRuleProblem } from './chunk-JDLQ6QIB.js';
2
- import { useEntityTags, useTagEntity, useUntagEntity } from './chunk-IL343FKX.js';
2
+ import { useEntityTags, useTagEntity, useUntagEntity } from './chunk-KHS2DZHH.js';
3
3
  import { notifyFluidGridsAiCreditsUpdated } from './chunk-Y53CVZVV.js';
4
4
  import { ErrorType } from './chunk-H4ERTSMX.js';
5
5
  import { WorkflowProposalDocument, ProposeRunFixDocument, ProposeWorkflowChangeDocument, ApplyWorkflowProposalDocument, RejectWorkflowProposalDocument, CancelWorkflowProposalDocument, WorkflowTestCasesDocument, WorkflowTestRunsDocument, WorkflowTestRunDocument, CreateWorkflowTestCaseDocument, UpdateWorkflowTestCaseDocument, DeleteWorkflowTestCaseDocument, RunWorkflowTestsDocument, CreateWorkflowTestCaseFromRunDocument } from './chunk-Z3ABLERJ.js';
6
6
  import { useTr } from './chunk-UULVIT25.js';
7
- import { getFluidGridsClient } from './chunk-3IXU7WUC.js';
8
- import { throwIfResultError, isForbiddenError } from './chunk-US5QSLPV.js';
7
+ import { getFluidGridsClient } from './chunk-PDODDDHY.js';
8
+ import { throwIfResultError, isForbiddenError } from './chunk-JKLZ6YZ3.js';
9
9
  import { getFluidGridsConfig } from './chunk-UEG2WC3G.js';
10
10
  import { useState, useRef, useEffect, useCallback } from 'react';
11
11
  import { TagBadge, TagsWidget } from '@burdenoff/fe-libs/tag';
@@ -1,4 +1,4 @@
1
- import { createLiveTokenReader, createFluidGridsTokenRefreshLink } from './chunk-US5QSLPV.js';
1
+ import { createLiveTokenReader, createFluidGridsTokenRefreshLink } from './chunk-JKLZ6YZ3.js';
2
2
  import { createHttpLink, split, ApolloClient, InMemoryCache } from '@apollo/client/core';
3
3
  import { setContext } from '@apollo/client/link/context';
4
4
  import { getMainDefinition } from '@apollo/client/utilities';
@@ -944,6 +944,7 @@ function nodeAccent(key) {
944
944
  for (const [re, color] of PROVIDER_ACCENTS) if (re.test(k)) return color;
945
945
  return chartSeriesColor(chartSeriesIndex(k));
946
946
  }
947
+ var NODE_CARD_RADIUS = "var(--radius-card, 12px)";
947
948
  function tint(color, pct = 14) {
948
949
  return `color-mix(in srgb, ${color} ${pct}%, transparent)`;
949
950
  }
@@ -1154,13 +1155,14 @@ var NodeCard = React.forwardRef(
1154
1155
  ref,
1155
1156
  "data-selected": selected,
1156
1157
  className: cn(
1157
- "relative w-72 rounded-xl border border-border bg-card shadow-sm will-change-transform",
1158
+ "relative w-72 border border-border bg-card shadow-sm will-change-transform",
1158
1159
  statusRing,
1159
1160
  executionStatus === "success" && "animate-success-glow",
1160
1161
  disabled && "opacity-50 grayscale-[0.6]",
1161
1162
  className
1162
1163
  ),
1163
1164
  style: {
1165
+ borderRadius: NODE_CARD_RADIUS,
1164
1166
  borderTop: `3px solid ${accent}`,
1165
1167
  transition: "transform 0.15s ease, box-shadow 0.15s ease",
1166
1168
  transform: hovered ? "translateY(-2px)" : "none",
@@ -1173,7 +1175,9 @@ var NodeCard = React.forwardRef(
1173
1175
  {
1174
1176
  className: "pointer-events-none absolute -inset-0.5 transition-opacity duration-150",
1175
1177
  style: {
1176
- borderRadius: 14,
1178
+ // The ring sits 2px outside the card (-inset-0.5), so its corners
1179
+ // are the card radius plus 2px to stay concentric.
1180
+ borderRadius: `calc(${NODE_CARD_RADIUS} + 2px)`,
1177
1181
  opacity: selected || hovered ? 1 : 0,
1178
1182
  boxShadow: selected ? `0 0 0 2px ${accent}, 0 0 0 5px ${tint(accent, 18)}` : `0 0 0 2px ${accent}`
1179
1183
  }
@@ -1311,7 +1315,11 @@ var NodeCardBody = React.forwardRef(
1311
1315
  "div",
1312
1316
  {
1313
1317
  ref,
1314
- className: "rounded-b-xl border-t border-border/60 px-3 pb-3 pt-2.5",
1318
+ className: "border-t border-border/60 px-3 pb-3 pt-2.5",
1319
+ style: {
1320
+ borderBottomLeftRadius: NODE_CARD_RADIUS,
1321
+ borderBottomRightRadius: NODE_CARD_RADIUS
1322
+ },
1315
1323
  children: [
1316
1324
  /* @__PURE__ */ jsx("div", { className: "text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: tr("fluidgrids.builder.nodeCard.operationLabel", "Operation") }),
1317
1325
  /* @__PURE__ */ jsx("div", { className: "mt-0.5 truncate font-mono text-[13px] font-bold text-card-foreground", children: operationName }),
@@ -1,4 +1,4 @@
1
- import { createLiveTokenReader, createFluidGridsTokenRefreshLink } from './chunk-US5QSLPV.js';
1
+ import { createLiveTokenReader, createFluidGridsTokenRefreshLink } from './chunk-JKLZ6YZ3.js';
2
2
  import { createHttpLink, ApolloClient, InMemoryCache } from '@apollo/client/core';
3
3
  import { setContext } from '@apollo/client/link/context';
4
4
 
@@ -1,6 +1,6 @@
1
1
  import { useTr } from './chunk-UULVIT25.js';
2
- import { getFluidGridsClient } from './chunk-3IXU7WUC.js';
3
- import { throwIfResultError } from './chunk-US5QSLPV.js';
2
+ import { getFluidGridsClient } from './chunk-PDODDDHY.js';
3
+ import { throwIfResultError } from './chunk-JKLZ6YZ3.js';
4
4
  import { useState, useRef, useCallback, useEffect } from 'react';
5
5
  import { gql } from '@apollo/client';
6
6
  import { cn } from '@burdenoff/fe-libs/utils';