@burdenoff/fluidgrids-fe-sdk 2026.1104.3 → 2026.1105.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 (63) hide show
  1. package/README.md +38 -0
  2. package/dist/ExecutionDetailPage-YBAMVPMB.js +26 -0
  3. package/dist/{WorkflowsList-YFD2RKKQ.js → ExecutionsListPage-NQIQXMTY.js} +10 -9
  4. package/dist/{WorkflowBuilder-4I44FWII.js → WorkflowBuilder-CRR5WP4V.js} +15 -14
  5. package/dist/{ExecutionsListPage-EZ65FXER.js → WorkflowsList-EV725VG5.js} +10 -9
  6. package/dist/{agentTools-SZZN6TP3.js → agentTools-PN4W7QZH.js} +7 -6
  7. package/dist/{chunk-4YCMMBSK.js → chunk-2QOAJF7V.js} +2 -2
  8. package/dist/{chunk-NTWG3CJX.js → chunk-3IXU7WUC.js} +32 -21
  9. package/dist/{chunk-KHXRYQYP.js → chunk-4QB6S7YW.js} +3 -2
  10. package/dist/{chunk-NJRCAE6K.js → chunk-6EZJ5J3B.js} +5 -5
  11. package/dist/{chunk-BIB7IH26.js → chunk-6P7DOBVN.js} +4 -4
  12. package/dist/{chunk-5D4XS3WJ.js → chunk-AG3VC7Y2.js} +17 -3
  13. package/dist/{chunk-NGXJHYV5.js → chunk-AMXJLVZN.js} +2 -2
  14. package/dist/{chunk-PXIFUMLA.js → chunk-AU7LACOY.js} +16 -11
  15. package/dist/{chunk-NIY6R42C.js → chunk-AZKVI4YN.js} +5 -4
  16. package/dist/{chunk-Q72EOY4T.js → chunk-BHAKNT5M.js} +9 -3
  17. package/dist/{chunk-AAIZ6S6E.js → chunk-C26QAWCT.js} +69 -87
  18. package/dist/{chunk-SS7Y66P5.js → chunk-CGR3AEZU.js} +2 -2
  19. package/dist/{chunk-NYBL5WHP.js → chunk-D7G5VWSH.js} +3 -3
  20. package/dist/{chunk-XCSCD3IU.js → chunk-DANOMJ5I.js} +7 -6
  21. package/dist/{chunk-F7LQL43U.js → chunk-EC2AN74G.js} +1 -1
  22. package/dist/{chunk-MF7JLSJX.js → chunk-FCT6POFX.js} +11 -2
  23. package/dist/{chunk-YYVRBROH.js → chunk-FJSXXO5W.js} +1 -1
  24. package/dist/{chunk-5UHAB75U.js → chunk-GVIYGJQG.js} +1 -1
  25. package/dist/{chunk-TBHAZK52.js → chunk-HLAUK5GM.js} +1 -1
  26. package/dist/{chunk-AFX3EKFN.js → chunk-HOTVUVZG.js} +15 -3
  27. package/dist/{chunk-DFIX6YWP.js → chunk-I3QPAEL6.js} +39 -20
  28. package/dist/{chunk-IK7IGG6T.js → chunk-JC4D7RQ6.js} +8 -7
  29. package/dist/{chunk-GEY7RXRZ.js → chunk-JDQYGH4Q.js} +4 -4
  30. package/dist/{chunk-4EUEKSEQ.js → chunk-L2N6DDOI.js} +2 -2
  31. package/dist/{chunk-WTV6SQYK.js → chunk-L44BRLW5.js} +12 -11
  32. package/dist/{chunk-OMB3WMDQ.js → chunk-MQN6YDX4.js} +10 -9
  33. package/dist/{chunk-XNU2PLJ2.js → chunk-MSQAULLG.js} +6 -5
  34. package/dist/{chunk-ZDCJPQ5M.js → chunk-MZFJL4X3.js} +1 -1
  35. package/dist/{chunk-X6PIU7FE.js → chunk-O2EB7UT2.js} +3 -2
  36. package/dist/{chunk-ON7LK6QH.js → chunk-R3Z7W4EX.js} +5 -4
  37. package/dist/chunk-UEG2WC3G.js +502 -0
  38. package/dist/chunk-US5QSLPV.js +316 -0
  39. package/dist/{chunk-VDJFTZ2H.js → chunk-VFVN7D3A.js} +2 -1
  40. package/dist/{chunk-D4WA2M2N.js → chunk-XLI75E3D.js} +3 -2
  41. package/dist/client-YVZMLEQX.js +3 -0
  42. package/dist/config-66FUPSG5.js +1 -0
  43. package/dist/executions.js +15 -14
  44. package/dist/global-client-N5EIFW6T.js +3 -0
  45. package/dist/history.js +8 -7
  46. package/dist/index.d.ts +96 -133
  47. package/dist/index.js +91 -72
  48. package/dist/{node-detail-view-GAGSLHAO.js → node-detail-view-3VG7XFIZ.js} +11 -10
  49. package/dist/nodes.js +4 -2
  50. package/dist/observability.js +8 -7
  51. package/dist/{quick-config-panel-44RBX6YR.js → quick-config-panel-GB7SDWHD.js} +8 -7
  52. package/dist/settings.js +9 -8
  53. package/dist/templates.js +14 -13
  54. package/dist/{workflow-builder-BMGVSwpy.d.ts → workflow-builder-7vv9dCdp.d.ts} +413 -2
  55. package/dist/workflow-builder.d.ts +2 -1
  56. package/dist/workflow-builder.js +16 -15
  57. package/dist/workflows-list.js +10 -9
  58. package/package.json +1 -1
  59. package/dist/ExecutionDetailPage-ND2VMU45.js +0 -25
  60. package/dist/chunk-6AMNEX2Y.js +0 -214
  61. package/dist/client-EYQDMR4O.js +0 -1
  62. package/dist/config-3DBXLCK3.js +0 -1
  63. package/dist/global-client-O2HCG5CJ.js +0 -1
@@ -1,15 +1,15 @@
1
1
  import { SdkPermissionGate, FLUIDGRIDS_PERMISSIONS } from './chunk-5375NUIO.js';
2
2
  import { useBuilderReadOnly, editorSeverity } from './chunk-OCJTTHTS.js';
3
- import { getGlobalStoreClient, createGlobalStoreClient, setGlobalStoreClient, resetGlobalStoreClient } from './chunk-PXIFUMLA.js';
4
- import { getFluidGridsConfig, validateTrustedOrigin, resetFluidGridsExecutionState, setFluidGridsConfig, resetFluidGridsConfig } from './chunk-6AMNEX2Y.js';
3
+ import { getGlobalStoreClient, createGlobalStoreClient, setGlobalStoreClient, resetGlobalStoreClient } from './chunk-AU7LACOY.js';
5
4
  import { GetMyNodeInstallationsDocument } from './chunk-G77IGC3Y.js';
6
5
  import { fetchAllNodeEndpointConfigs, NodeManifestDocument, UpdateWorkflowDefinitionDocument, CreateWorkflowDefinitionDocument, CreateWorkflowVersionDocument, ExecuteStepDocument, TriggerWorkflowDocument, RunFromNodeDocument, ExecutionDetailDocument, WorkflowDefinitionDocument, WorkflowRunDocument } from './chunk-AVHBWJRY.js';
7
6
  import { useTr, ENGLISH_FALLBACK_TRANSLATOR, FluidGridsTranslationProvider } from './chunk-UULVIT25.js';
8
- import { waitForFluidGridsClient, getFluidGridsClient, getFluidGridsClientSafe, createFluidGridsClient, setFluidGridsClient, resetFluidGridsClient } from './chunk-NTWG3CJX.js';
7
+ import { waitForFluidGridsClient, getFluidGridsClient, getFluidGridsClientSafe, createFluidGridsClient, setFluidGridsClient, resetFluidGridsClient } from './chunk-3IXU7WUC.js';
8
+ import { throwIfResultError, emitFluidGridsEvent, emitOperationErrorEvent, describeOperationError, emitRunCompletedOnce } from './chunk-US5QSLPV.js';
9
+ import { getFluidGridsConfig, validateTrustedOrigin, resetFluidGridsExecutionState, resetFluidGridsConfig, setFluidGridsConfig } from './chunk-UEG2WC3G.js';
9
10
  import * as React from 'react';
10
11
  import { memo, forwardRef, useState, useImperativeHandle, useRef, useEffect, useMemo, createContext, useCallback, useSyncExternalStore, useContext } from 'react';
11
12
  import { useOptionalFeatureFlags } from '@burdenoff/fe-libs/shared/feature-flags';
12
- import { CombinedGraphQLErrors, ServerError } from '@apollo/client/errors';
13
13
  import { dispatchUpgradePrompt } from '@burdenoff/fe-libs/shared/components';
14
14
  import { nanoid } from 'nanoid/non-secure';
15
15
  import { addEdge, applyEdgeChanges, applyNodeChanges, useReactFlow, NodeResizer, getConnectedEdges, useStore, Handle, Position, useUpdateNodeInternals, useNodeId } from '@xyflow/react';
@@ -275,81 +275,6 @@ function usePaletteGates() {
275
275
  const context = useOptionalFeatureFlags();
276
276
  return useMemo(() => resolvePaletteGates(context), [context]);
277
277
  }
278
- function describeGraphQLError(error) {
279
- const code = typeof error.extensions?.code === "string" ? error.extensions.code : void 0;
280
- switch (code) {
281
- case "QUOTA_EXHAUSTED": {
282
- const quota = /Quota exhausted for (\S+)/.exec(error.message)?.[1];
283
- const allowance = quota ? `"${quota}" quota` : "usage quota";
284
- return `Quota exhausted \u2014 your workspace has used up its ${allowance}. Upgrade your plan or wait for the quota to reset.`;
285
- }
286
- case "QUOTA_NOT_PROVISIONED":
287
- return "This workspace's plan does not include this usage allowance yet. Contact your workspace admin or support to have it provisioned.";
288
- case "UNAUTHENTICATED":
289
- return "Your session has expired. Please sign in again.";
290
- case "FORBIDDEN":
291
- return error.message || "You don't have permission to perform this action.";
292
- default:
293
- return error.message || "Unknown error";
294
- }
295
- }
296
- function firstGraphQLErrorInBody(bodyText) {
297
- try {
298
- const parsed = JSON.parse(bodyText);
299
- if (typeof parsed !== "object" || parsed === null) return null;
300
- const errors = parsed.errors;
301
- if (!Array.isArray(errors) || errors.length === 0) return null;
302
- const first = errors[0];
303
- if (typeof first !== "object" || first === null) return null;
304
- const message = first.message;
305
- if (typeof message !== "string") return null;
306
- return first;
307
- } catch {
308
- return null;
309
- }
310
- }
311
- function describeOperationError(error, fallback = "Unknown error") {
312
- if (CombinedGraphQLErrors.is(error)) {
313
- const first = error.errors[0];
314
- return first ? describeGraphQLError(first) : error.message || fallback;
315
- }
316
- if (ServerError.is(error)) {
317
- const first = firstGraphQLErrorInBody(error.bodyText);
318
- if (first) return describeGraphQLError(first);
319
- }
320
- if (error instanceof Error) {
321
- return error.message || fallback;
322
- }
323
- if (typeof error === "string" && error.length > 0) {
324
- return error;
325
- }
326
- return fallback;
327
- }
328
- function throwIfResultError(result) {
329
- if (result.error) {
330
- throw new Error(describeOperationError(result.error), {
331
- cause: result.error
332
- });
333
- }
334
- return result;
335
- }
336
- function hasForbiddenCode(errors) {
337
- return (errors ?? []).some((error) => error.extensions?.code === "FORBIDDEN");
338
- }
339
- function isForbiddenError(error) {
340
- if (CombinedGraphQLErrors.is(error)) {
341
- return hasForbiddenCode(error.errors);
342
- }
343
- if (ServerError.is(error)) {
344
- if (error.statusCode === 403) return true;
345
- const first = firstGraphQLErrorInBody(error.bodyText);
346
- return first ? hasForbiddenCode([first]) : false;
347
- }
348
- if (error instanceof Error && error.cause !== void 0) {
349
- return isForbiddenError(error.cause);
350
- }
351
- return false;
352
- }
353
278
 
354
279
  // src/billing/quota.ts
355
280
  var RUNS_QUOTA_NAME = "fluidgrids.runs.monthly";
@@ -6358,6 +6283,9 @@ function FluidGridsProvider({
6358
6283
  tenantId,
6359
6284
  organizationId,
6360
6285
  t,
6286
+ theme,
6287
+ auth,
6288
+ onEvent,
6361
6289
  workspaceClient: externalWorkspaceClient,
6362
6290
  globalClient: externalGlobalClient,
6363
6291
  apolloClient: legacyClient,
@@ -6476,21 +6404,44 @@ function FluidGridsProvider({
6476
6404
  resetGlobalStoreClient();
6477
6405
  };
6478
6406
  }, [globalClient]);
6407
+ const appliedTokens = useRef(null);
6408
+ const ownedHostHooks = useRef(/* @__PURE__ */ new Set());
6409
+ useEffect(
6410
+ () => () => {
6411
+ appliedTokens.current = null;
6412
+ ownedHostHooks.current.clear();
6413
+ resetFluidGridsConfig();
6414
+ },
6415
+ []
6416
+ );
6479
6417
  useEffect(() => {
6480
- setFluidGridsConfig({
6418
+ const patch = {
6481
6419
  apiGatewayUrl,
6482
6420
  globalApiUrl,
6483
- authToken,
6484
- workspaceToken,
6485
6421
  workspaceId,
6486
6422
  productId: resolvedProductId,
6487
6423
  trustedOrigins,
6488
6424
  tenantId,
6489
6425
  organizationId
6490
- });
6491
- return () => {
6492
- resetFluidGridsConfig();
6493
6426
  };
6427
+ const applied = appliedTokens.current;
6428
+ if (!applied || applied.authToken !== authToken || applied.workspaceToken !== workspaceToken) {
6429
+ patch.authToken = authToken;
6430
+ patch.workspaceToken = workspaceToken;
6431
+ appliedTokens.current = { authToken, workspaceToken };
6432
+ }
6433
+ const owned = ownedHostHooks.current;
6434
+ const writes = (key, value) => {
6435
+ if (value !== void 0) {
6436
+ owned.add(key);
6437
+ return true;
6438
+ }
6439
+ return owned.delete(key);
6440
+ };
6441
+ if (writes("theme", theme)) patch.theme = theme;
6442
+ if (writes("auth", auth)) patch.auth = auth;
6443
+ if (writes("onEvent", onEvent)) patch.onEvent = onEvent;
6444
+ setFluidGridsConfig(patch);
6494
6445
  }, [
6495
6446
  apiGatewayUrl,
6496
6447
  globalApiUrl,
@@ -6500,7 +6451,10 @@ function FluidGridsProvider({
6500
6451
  resolvedProductId,
6501
6452
  trustedOrigins,
6502
6453
  tenantId,
6503
- organizationId
6454
+ organizationId,
6455
+ theme,
6456
+ auth,
6457
+ onEvent
6504
6458
  ]);
6505
6459
  const contextValue = useMemo(() => {
6506
6460
  return {
@@ -7389,6 +7343,11 @@ function useSaveWorkflow() {
7389
7343
  }
7390
7344
  if (savedDbId) {
7391
7345
  notifyWorkflowSaved(workflowKey);
7346
+ emitFluidGridsEvent("workflow:saved", {
7347
+ workflowKey,
7348
+ version: savedVersion || void 0,
7349
+ id: savedDbId
7350
+ });
7392
7351
  const config = getFluidGridsConfig();
7393
7352
  if (config.onWorkflowSaved) {
7394
7353
  try {
@@ -7412,6 +7371,7 @@ function useSaveWorkflow() {
7412
7371
  } catch (error) {
7413
7372
  const message = error instanceof Error ? error.message : "Unknown error";
7414
7373
  console.error("Error saving workflow:", message);
7374
+ emitOperationErrorEvent("workflow:save", error);
7415
7375
  const cause = error instanceof Error ? error.cause : void 0;
7416
7376
  const quotaExhausted2 = isQuotaExhaustedFailure(cause) || isQuotaExhaustedFailure(error);
7417
7377
  const conflict = findSaveConflict(error);
@@ -8240,6 +8200,11 @@ function useNodeExecution() {
8240
8200
  processNodeStates(runId, run.nodeStates);
8241
8201
  }
8242
8202
  if (TERMINAL_STATUSES.has(run.status)) {
8203
+ emitRunCompletedOnce({
8204
+ runId,
8205
+ status: run.status,
8206
+ workflowKey: run.workflowKey ?? void 0
8207
+ });
8243
8208
  if (analyticsTrigger && run.status === "FAILED") {
8244
8209
  emitRunFailed(bus, {
8245
8210
  workspaceId,
@@ -8438,6 +8403,11 @@ function useNodeExecution() {
8438
8403
  executionId: backendRunId,
8439
8404
  trigger: "test"
8440
8405
  });
8406
+ emitFluidGridsEvent("run:started", {
8407
+ runId: backendRunId,
8408
+ workflowKey: triggerResult.workflowKey,
8409
+ mode: "TEST"
8410
+ });
8441
8411
  pollRunUpdates(backendRunId, "test");
8442
8412
  return { success: true, runId: backendRunId };
8443
8413
  }
@@ -8446,6 +8416,7 @@ function useNodeExecution() {
8446
8416
  return { success: false, error: "No result from trigger" };
8447
8417
  } catch (error) {
8448
8418
  console.error("[useNodeExecution] Error triggering workflow:", error);
8419
+ emitOperationErrorEvent("run:start", error);
8449
8420
  const quotaExhausted = openRunQuotaUpgradePrompt(error, tr, {
8450
8421
  bus,
8451
8422
  workspaceId,
@@ -8504,6 +8475,11 @@ function useNodeExecution() {
8504
8475
  executionId: runId,
8505
8476
  trigger: "webhook"
8506
8477
  });
8478
+ emitFluidGridsEvent("run:started", {
8479
+ runId,
8480
+ workflowKey: workflow.workflowKey || workflow.id,
8481
+ mode: "TEST"
8482
+ });
8507
8483
  pollRunUpdates(runId, "webhook");
8508
8484
  },
8509
8485
  [
@@ -8553,6 +8529,11 @@ function useNodeExecution() {
8553
8529
  executionId: backendRunId,
8554
8530
  trigger: "test"
8555
8531
  });
8532
+ emitFluidGridsEvent("run:started", {
8533
+ runId: backendRunId,
8534
+ workflowKey: runFromNodeResult.workflowKey,
8535
+ mode: "TEST"
8536
+ });
8556
8537
  pollRunUpdates(backendRunId, "test");
8557
8538
  return { success: true, runId: backendRunId };
8558
8539
  }
@@ -8561,6 +8542,7 @@ function useNodeExecution() {
8561
8542
  return { success: false, error: "No result from runFromNode" };
8562
8543
  } catch (error) {
8563
8544
  console.error("[useNodeExecution] Error running from node:", error);
8545
+ emitOperationErrorEvent("run:start", error);
8564
8546
  const quotaExhausted = openRunQuotaUpgradePrompt(error, tr, {
8565
8547
  bus,
8566
8548
  workspaceId,
@@ -10137,4 +10119,4 @@ function createNodeWithDefaultData(type, data) {
10137
10119
  return Object.assign(createNodeData(type, defaultData), data);
10138
10120
  }
10139
10121
 
10140
- export { AUTOSAVE_DEBOUNCE_MS, AUTOSAVE_RETRY_DELAYS_MS, AVAILABLE_NODES, BILLING_PLANS_PATH, CODE_WORKFLOW_NODE_TYPE, ConnectionFormDialog, ConnectionSelector, DURABLE_FUNCTION_NODE_TYPES, EDIT_SESSION_ID, ExpressionEditor, FLUIDGRIDS_FLAGS, FLUIDGRIDS_FLAG_DEFAULTS, FluidGridsContext, FluidGridsProvider, NODES, NODES_METADATA, NODE_CONFIGS, NODE_OPERATION_DRAG_DATA_FORMAT, NODE_TYPES, NODE_TYPE_DRAG_DATA_FORMAT, NodePropertyPanel, NodeTypeIcon, PHASE_C_FLAGS_OFF, RUNS_QUOTA_NAME, RUN_CONTROL_NODE_TYPES, STICKY_NOTE_TYPE, WORKFLOWS_QUOTA_NAME, WORKFLOW_TEST_NODE_TYPES, autosaveAllowedFor, bannerOf, blankWorkflowCreateInput, buildOperationSeed, buildStickyNode, builderPathOf, canAutosave, canRenderOperationPanel, canSignalRun, changedSourceFiles, childRunIdOf, classifyCreateRefusal, clearCodeWorkflowDefinitionCache, codeBuildIdOf, components_default, createConfiguredNode, createThenOpen, declaredOutputFields, declaredSignals, defaultSourcePath, departingSave, describeOperationError, diagnosticsByPath, editStateFor, editingLeaseLocked, emitNodeInstalled, emitRunFailed, emitRunLimitHit, emitRunStarted, emitTemplateUsed, emitUpgradeClicked, emitWorkflowCreated, emitWorkflowLimitHit, emitWorkflowPublished, ensureNodeConfigsLoaded, fieldsFromIO, fieldsFromValue, filterPaletteNodes, findQuotaRefusal, findSaveConflict, forgetSessionForReload, formatParameterValue, getNodeDetail, getNodeMetadata, inAppLeaveTarget, interfaceFields, interfaceHandlers, isDurableFunctionNodeType, isEditableSourcePath, isFlowComplete, isForbiddenError, isImageIcon, isLocked, isNodeConfigsInitialized, isNodeTypeHiddenFromPalette, isParamVisible, isQuotaExhaustedFailure, isRunControlNodeType, isTriggerOperation, leaseCallQueue, leavingLosesChanges, listCustomBlocks, liveInternalOperations, loadDefinitionJson, mergeStickyNotes, nodeAccent, nodesOf, onNodeTypesUpdate, openRunQuotaUpgradePrompt, parseParameterValue, parseRawSignalPayload, pathToExpression, payloadFromCardValues, phaseAfterAcquire, phaseAfterTakeOver, projectLanguage, readCodeWorkflowState, readDisplayOptions, refetchStoreNodes, registerCustomBlock, registerWorkflowNodeTypes, releasesOnClose, rememberOwnStatusChange, rememberRevision, rememberSessionForReload, resolveInputHandles, resolveNodeOperation, resolveOperationName, resolveOutputHandles, resolvePhaseCFlags, resolveUiSpec, runSignalTargets, runTriggerFromMode, saveIndicatorOf, savedEverythingBeforeLeaving, sessionBeforeReload, shouldReleaseForIdle, signalPayloadCard, sourceLanguageOf, stripSubmitActions, structuredParameterType, subscribeWorkflowSaved, synchronizeOperationUpdate, throwIfResultError, tickAction, touchesSavedFields, useAgentDefinitionList, useAgentDefinitions, useCodeWorkflowInterface, useConnection, useConnections, useConnectionsByProvider, useContinuousOptimisationEnabled, useCreateConnection, useDurableFunctionNodesEnabled, useDurableParityEnabled, useEditLeaseLocked, useEditLeaseStore, useFlowStore, useFlowValidator, useFluidGridsAnalytics, useFluidGridsContext, useFluidGridsFlag, useGuardedNavigate, useInitiateOAuth, useInsertNode, useIsValidConnection, useManualSave, useNodeExecution, useNodeRegistryRevision, usePaletteGates, usePhaseCFlags, useProviders, useRunGuard, useSaveStatusStore, useSaveWorkflow, useSelfHostedWorkersEnabled, useWorkflowTestsEnabled, watchLeavingLosesChanges, workflowFingerprint };
10122
+ export { AUTOSAVE_DEBOUNCE_MS, AUTOSAVE_RETRY_DELAYS_MS, AVAILABLE_NODES, BILLING_PLANS_PATH, CODE_WORKFLOW_NODE_TYPE, ConnectionFormDialog, ConnectionSelector, DURABLE_FUNCTION_NODE_TYPES, EDIT_SESSION_ID, ExpressionEditor, FLUIDGRIDS_FLAGS, FLUIDGRIDS_FLAG_DEFAULTS, FluidGridsContext, FluidGridsProvider, NODES, NODES_METADATA, NODE_CONFIGS, NODE_OPERATION_DRAG_DATA_FORMAT, NODE_TYPES, NODE_TYPE_DRAG_DATA_FORMAT, NodePropertyPanel, NodeTypeIcon, PHASE_C_FLAGS_OFF, RUNS_QUOTA_NAME, RUN_CONTROL_NODE_TYPES, STICKY_NOTE_TYPE, WORKFLOWS_QUOTA_NAME, WORKFLOW_TEST_NODE_TYPES, autosaveAllowedFor, bannerOf, blankWorkflowCreateInput, buildOperationSeed, buildStickyNode, builderPathOf, canAutosave, canRenderOperationPanel, canSignalRun, changedSourceFiles, childRunIdOf, classifyCreateRefusal, clearCodeWorkflowDefinitionCache, codeBuildIdOf, components_default, createConfiguredNode, createThenOpen, declaredOutputFields, declaredSignals, defaultSourcePath, departingSave, diagnosticsByPath, editStateFor, editingLeaseLocked, emitNodeInstalled, emitRunFailed, emitRunLimitHit, emitRunStarted, emitTemplateUsed, emitUpgradeClicked, emitWorkflowCreated, emitWorkflowLimitHit, emitWorkflowPublished, ensureNodeConfigsLoaded, fieldsFromIO, fieldsFromValue, filterPaletteNodes, findQuotaRefusal, findSaveConflict, forgetSessionForReload, formatParameterValue, getNodeDetail, getNodeMetadata, inAppLeaveTarget, interfaceFields, interfaceHandlers, isDurableFunctionNodeType, isEditableSourcePath, isFlowComplete, isImageIcon, isLocked, isNodeConfigsInitialized, isNodeTypeHiddenFromPalette, isParamVisible, isQuotaExhaustedFailure, isRunControlNodeType, isTriggerOperation, leaseCallQueue, leavingLosesChanges, listCustomBlocks, liveInternalOperations, loadDefinitionJson, mergeStickyNotes, nodeAccent, nodesOf, onNodeTypesUpdate, openRunQuotaUpgradePrompt, parseParameterValue, parseRawSignalPayload, pathToExpression, payloadFromCardValues, phaseAfterAcquire, phaseAfterTakeOver, projectLanguage, readCodeWorkflowState, readDisplayOptions, refetchStoreNodes, registerCustomBlock, registerWorkflowNodeTypes, releasesOnClose, rememberOwnStatusChange, rememberRevision, rememberSessionForReload, resolveInputHandles, resolveNodeOperation, resolveOperationName, resolveOutputHandles, resolvePhaseCFlags, resolveUiSpec, runSignalTargets, runTriggerFromMode, saveIndicatorOf, savedEverythingBeforeLeaving, sessionBeforeReload, shouldReleaseForIdle, signalPayloadCard, sourceLanguageOf, stripSubmitActions, structuredParameterType, subscribeWorkflowSaved, synchronizeOperationUpdate, tickAction, touchesSavedFields, useAgentDefinitionList, useAgentDefinitions, useCodeWorkflowInterface, useConnection, useConnections, useConnectionsByProvider, useContinuousOptimisationEnabled, useCreateConnection, useDurableFunctionNodesEnabled, useDurableParityEnabled, useEditLeaseLocked, useEditLeaseStore, useFlowStore, useFlowValidator, useFluidGridsAnalytics, useFluidGridsContext, useFluidGridsFlag, useGuardedNavigate, useInitiateOAuth, useInsertNode, useIsValidConnection, useManualSave, useNodeExecution, useNodeRegistryRevision, usePaletteGates, usePhaseCFlags, useProviders, useRunGuard, useSaveStatusStore, useSaveWorkflow, useSelfHostedWorkersEnabled, useWorkflowTestsEnabled, watchLeavingLosesChanges, workflowFingerprint };
@@ -1,7 +1,7 @@
1
- import { throwIfResultError } from './chunk-AAIZ6S6E.js';
2
1
  import { RunFailureClustersDocument, DismissRunFailureClusterDocument, RunFailureTriageSettingsDocument, SetRunFailureTriageEnabledDocument, FgTriageFailedRunsDocument } from './chunk-AVHBWJRY.js';
3
2
  import { useTr } from './chunk-UULVIT25.js';
4
- import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
3
+ import { getFluidGridsClient } from './chunk-3IXU7WUC.js';
4
+ import { throwIfResultError } from './chunk-US5QSLPV.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';
@@ -1,10 +1,10 @@
1
- import { versionsOfWorkflow, VersionDiffDialog } from './chunk-KHXRYQYP.js';
1
+ import { versionsOfWorkflow, VersionDiffDialog } from './chunk-4QB6S7YW.js';
2
2
  import { historyControls } from './chunk-FNZZ5JJL.js';
3
- import { useWorkflowDefinitions, useRestoreWorkflowVersion } from './chunk-AFX3EKFN.js';
3
+ import { useWorkflowDefinitions, useRestoreWorkflowVersion } from './chunk-HOTVUVZG.js';
4
4
  import { useFluidGridsPageControls } from './chunk-PJAWNFJV.js';
5
5
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
6
- import { getFluidGridsConfig } from './chunk-6AMNEX2Y.js';
7
6
  import { useTr } from './chunk-UULVIT25.js';
7
+ import { getFluidGridsConfig } from './chunk-UEG2WC3G.js';
8
8
  import { useState, useMemo, useCallback } from 'react';
9
9
  import { useNavigate } from 'react-router';
10
10
  import { Icon } from '@iconify/react';
@@ -1,15 +1,16 @@
1
- import { CreateWorkflowRefusalDialog, firstWorkflowProgress, GUIDED_TOUR_STATE, builderPathFor } from './chunk-TBHAZK52.js';
2
- import { useExecutions } from './chunk-5D4XS3WJ.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-X6PIU7FE.js';
1
+ import { CreateWorkflowRefusalDialog, firstWorkflowProgress, GUIDED_TOUR_STATE, builderPathFor } from './chunk-HLAUK5GM.js';
2
+ import { useExecutions } from './chunk-AG3VC7Y2.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-O2EB7UT2.js';
4
4
  import { workflowsListControls } from './chunk-FNZZ5JJL.js';
5
- import { useCreateWorkflow, useWorkflowDefinitions, useLazyWorkflowDefinition, useImportWorkflow, usePreviewN8nImport, useDuplicateWorkflow, useDeleteWorkflow } from './chunk-AFX3EKFN.js';
5
+ import { useCreateWorkflow, useWorkflowDefinitions, useLazyWorkflowDefinition, useImportWorkflow, usePreviewN8nImport, useDuplicateWorkflow, useDeleteWorkflow } from './chunk-HOTVUVZG.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, describeOperationError, useFlowStore, throwIfResultError, isQuotaExhaustedFailure } from './chunk-AAIZ6S6E.js';
8
+ import { createThenOpen, FluidGridsContext, useFluidGridsFlag, FLUIDGRIDS_FLAGS, BILLING_PLANS_PATH, useFlowStore, isQuotaExhaustedFailure } from './chunk-C26QAWCT.js';
9
9
  import { useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS, SdkPermissionButton, SdkPermissionGate } from './chunk-5375NUIO.js';
10
10
  import { WorkflowFoldersDocument, CreateWorkflowFolderDocument, RenameWorkflowFolderDocument, MoveWorkflowFolderDocument, DeleteWorkflowFolderDocument, WorkflowProjectsDocument, CreateWorkflowProjectDocument, RenameWorkflowProjectDocument, DeleteWorkflowProjectDocument, BulkMoveWorkflowsToFolderDocument, BulkAssignWorkflowsToProjectDocument, BulkDeleteWorkflowsDocument } from './chunk-AVHBWJRY.js';
11
11
  import { useTr } from './chunk-UULVIT25.js';
12
- import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
12
+ import { getFluidGridsClient } from './chunk-3IXU7WUC.js';
13
+ import { describeOperationError, throwIfResultError } from './chunk-US5QSLPV.js';
13
14
  import { useState, useRef, useCallback, useContext, useMemo, useEffect } from 'react';
14
15
  import { useNavigate } from 'react-router';
15
16
  import { v4 } from 'uuid';
@@ -1,5 +1,5 @@
1
1
  import { FluidgridsEntityTagsDocument, AvailableFluidgridsTagsDocument, SearchFluidgridsTagsDocument, TagFluidgridsEntityDocument, UntagFluidgridsEntityDocument, ReplaceFluidgridsEntityTagsDocument, CreateFluidgridsTagDocument, DataTablesTagsDocument } from './chunk-AVHBWJRY.js';
2
- import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
2
+ import { getFluidGridsClient } from './chunk-3IXU7WUC.js';
3
3
  import { useState, useCallback, useEffect } from 'react';
4
4
 
5
5
  var FLUIDGRIDS_ENTITY_TYPES = [
@@ -1,7 +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 { throwIfResultError, describeOperationError, useFluidGridsAnalytics, emitRunStarted, openRunQuotaUpgradePrompt, useFluidGridsFlag, FLUIDGRIDS_FLAGS } from './chunk-AAIZ6S6E.js';
2
+ import { useFluidGridsAnalytics, emitRunStarted, openRunQuotaUpgradePrompt, useFluidGridsFlag, FLUIDGRIDS_FLAGS } from './chunk-C26QAWCT.js';
3
3
  import { useTr } from './chunk-UULVIT25.js';
4
- import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
4
+ import { getFluidGridsClient } from './chunk-3IXU7WUC.js';
5
+ import { throwIfResultError, describeOperationError, emitFluidGridsEvent } from './chunk-US5QSLPV.js';
5
6
  import { useCallback, useState, useMemo, useEffect } from 'react';
6
7
  import { Icon } from '@iconify/react';
7
8
  import { toast } from 'sonner';
@@ -138,6 +139,10 @@ function useRunReplayActions() {
138
139
  executionId: replayed.runId,
139
140
  trigger: "manual"
140
141
  });
142
+ emitFluidGridsEvent("run:started", {
143
+ runId: replayed.runId,
144
+ workflowKey: replayed.workflowKey
145
+ });
141
146
  }
142
147
  return replayed;
143
148
  } catch (cause) {
@@ -173,6 +178,10 @@ function useRunReplayActions() {
173
178
  executionId: run.runId,
174
179
  trigger: "manual"
175
180
  });
181
+ emitFluidGridsEvent("run:started", {
182
+ runId: run.runId,
183
+ workflowKey: run.workflowKey
184
+ });
176
185
  }
177
186
  return retried;
178
187
  } catch (cause) {
@@ -1,4 +1,4 @@
1
- import { useFlowStore } from './chunk-AAIZ6S6E.js';
1
+ import { useFlowStore } from './chunk-C26QAWCT.js';
2
2
  import { useTr } from './chunk-UULVIT25.js';
3
3
  import { useState, useRef, useCallback, useEffect } from 'react';
4
4
  import { cn } from '@burdenoff/fe-libs/utils';
@@ -1,4 +1,4 @@
1
- import { resolveInputHandles } from './chunk-AAIZ6S6E.js';
1
+ import { resolveInputHandles } from './chunk-C26QAWCT.js';
2
2
 
3
3
  // src/builder/hooks/attach-node-helpers.ts
4
4
  var ATTACH_GAP_X = 120;
@@ -1,4 +1,4 @@
1
- import { QuotaExhaustedDialog } from './chunk-X6PIU7FE.js';
1
+ import { QuotaExhaustedDialog } from './chunk-O2EB7UT2.js';
2
2
  import { useTr } from './chunk-UULVIT25.js';
3
3
  import { jsx } from 'react/jsx-runtime';
4
4
 
@@ -1,8 +1,9 @@
1
- import { useFluidGridsAnalytics, throwIfResultError, emitWorkflowCreated, emitRunStarted, runTriggerFromMode, openRunQuotaUpgradePrompt, emitWorkflowPublished } from './chunk-AAIZ6S6E.js';
2
- import { getFluidGridsConfig } from './chunk-6AMNEX2Y.js';
1
+ import { useFluidGridsAnalytics, emitWorkflowCreated, emitRunStarted, runTriggerFromMode, openRunQuotaUpgradePrompt, emitWorkflowPublished } from './chunk-C26QAWCT.js';
3
2
  import { WorkflowDefinitionsDocument, WorkflowDefinitionDocument, WorkflowVersionsDocument, CreateWorkflowDefinitionDocument, ImportWorkflowDocument, PreviewN8nImportDocument, UpdateWorkflowDefinitionDocument, CreateWorkflowVersionDocument, DeleteWorkflowDefinitionDocument, DuplicateWorkflowDocument, RestoreWorkflowVersionDocument, TriggerWorkflowDocument, WorkflowRunsDocument, WorkflowRunDocument, DashboardSummaryDocument, ActivateWorkflowDefinitionDocument, DeactivateWorkflowDefinitionDocument } from './chunk-AVHBWJRY.js';
4
3
  import { useTr } from './chunk-UULVIT25.js';
5
- import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
4
+ import { getFluidGridsClient } from './chunk-3IXU7WUC.js';
5
+ import { throwIfResultError, emitFluidGridsEvent, emitOperationErrorEvent } from './chunk-US5QSLPV.js';
6
+ import { getFluidGridsConfig } from './chunk-UEG2WC3G.js';
6
7
  import { useState, useCallback, useEffect, useMemo } from 'react';
7
8
 
8
9
  var WORKFLOW_DEFINITIONS = WorkflowDefinitionsDocument;
@@ -552,10 +553,16 @@ function useTriggerWorkflow() {
552
553
  executionId: data.runId,
553
554
  trigger: runTriggerFromMode(input.mode)
554
555
  });
556
+ emitFluidGridsEvent("run:started", {
557
+ runId: data.runId,
558
+ workflowKey: data.workflowKey,
559
+ mode: input.mode ?? void 0
560
+ });
555
561
  }
556
562
  return data;
557
563
  } catch (err) {
558
564
  setError(err);
565
+ emitOperationErrorEvent("run:start", err);
559
566
  openRunQuotaUpgradePrompt(err, tr, {
560
567
  bus,
561
568
  workspaceId,
@@ -704,10 +711,15 @@ function useActivateWorkflow() {
704
711
  workflowId: activated.id,
705
712
  definition: options?.definition
706
713
  });
714
+ emitFluidGridsEvent("workflow:activated", {
715
+ workflowKey: activated.workflowKey,
716
+ version: activated.version ?? void 0
717
+ });
707
718
  }
708
719
  return activated;
709
720
  } catch (err) {
710
721
  console.error("Error activating workflow:", err);
722
+ emitOperationErrorEvent("workflow:activate", err);
711
723
  throw err;
712
724
  } finally {
713
725
  setLoading(false);
@@ -3,26 +3,27 @@ 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-YYVRBROH.js';
7
- import { computeAttachPosition, firstInputHandleId } from './chunk-5UHAB75U.js';
8
- import { QuotaExhaustedDialog, WorkflowShareDialog, useWorkflowCodeExport, orderedExportFiles, fileBaseName, downloadWorkflowCodeExport, isLosslessReport, sortFidelityItems, isLossyFidelityItem, lineOfNode } from './chunk-X6PIU7FE.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-BIB7IH26.js';
10
- import { buildNodeDisplayMap } from './chunk-F7LQL43U.js';
6
+ import { LogsPanel } from './chunk-FJSXXO5W.js';
7
+ import { computeAttachPosition, firstInputHandleId } from './chunk-GVIYGJQG.js';
8
+ import { QuotaExhaustedDialog, WorkflowShareDialog, useWorkflowCodeExport, orderedExportFiles, fileBaseName, downloadWorkflowCodeExport, isLosslessReport, sortFidelityItems, isLossyFidelityItem, lineOfNode } from './chunk-O2EB7UT2.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-6P7DOBVN.js';
10
+ import { buildNodeDisplayMap } from './chunk-EC2AN74G.js';
11
11
  import { AiCreditBalanceSlot } from './chunk-Y53CVZVV.js';
12
- import { countLifecycle, VersionLifecycleBar, VersionDiffDialog } from './chunk-KHXRYQYP.js';
13
- import { useRestoreWorkflowVersion, useWorkflowVersions, useActivateWorkflow, useDeleteWorkflow, useDeactivateWorkflow } from './chunk-AFX3EKFN.js';
12
+ import { countLifecycle, VersionLifecycleBar, VersionDiffDialog } from './chunk-4QB6S7YW.js';
13
+ import { useRestoreWorkflowVersion, useWorkflowVersions, useActivateWorkflow, useDeleteWorkflow, useDeactivateWorkflow } from './chunk-HOTVUVZG.js';
14
14
  import { useRequestedProposal } from './chunk-GLYINMOR.js';
15
15
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.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, useManualSave, useDurableFunctionNodesEnabled, CODE_WORKFLOW_NODE_TYPE, bannerOf, editStateFor, useSaveWorkflow, STICKY_NOTE_TYPE, filterPaletteNodes, useFluidGridsAnalytics, useGuardedNavigate, sessionBeforeReload, forgetSessionForReload, releasesOnClose, touchesSavedFields, isLocked, watchLeavingLosesChanges, workflowFingerprint, savedEverythingBeforeLeaving, buildStickyNode, NODES_METADATA, NodeTypeIcon, shouldReleaseForIdle, tickAction, rememberSessionForReload, leavingLosesChanges, buildOperationSeed, useDurableParityEnabled, useConnections, ConnectionFormDialog, useWorkflowTestsEnabled, useFluidGridsFlag, FLUIDGRIDS_FLAGS, useFlowValidator, saveIndicatorOf, departingSave, inAppLeaveTarget, isNodeConfigsInitialized, phaseAfterAcquire, rememberOwnStatusChange, useRunGuard, getNodeDetail, isImageIcon, NODES, synchronizeOperationUpdate, NodePropertyPanel, loadDefinitionJson, canAutosave, isNodeTypeHiddenFromPalette, isTriggerOperation, canRenderOperationPanel, resolveOperationName, ConnectionSelector, AUTOSAVE_RETRY_DELAYS_MS, AUTOSAVE_DEBOUNCE_MS, editingLeaseLocked, autosaveAllowedFor, isFlowComplete, rememberRevision, phaseAfterTakeOver } from './chunk-AAIZ6S6E.js';
16
+ import { leaseCallQueue, RUNS_QUOTA_NAME, useFlowStore, BILLING_PLANS_PATH, emitUpgradeClicked, FluidGridsContext, emitWorkflowCreated, emitTemplateUsed, 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, useManualSave, useDurableFunctionNodesEnabled, CODE_WORKFLOW_NODE_TYPE, bannerOf, editStateFor, useSaveWorkflow, STICKY_NOTE_TYPE, filterPaletteNodes, useFluidGridsAnalytics, useGuardedNavigate, sessionBeforeReload, forgetSessionForReload, releasesOnClose, touchesSavedFields, isLocked, watchLeavingLosesChanges, workflowFingerprint, savedEverythingBeforeLeaving, buildStickyNode, NODES_METADATA, NodeTypeIcon, shouldReleaseForIdle, tickAction, rememberSessionForReload, leavingLosesChanges, buildOperationSeed, useDurableParityEnabled, useConnections, ConnectionFormDialog, useWorkflowTestsEnabled, useFluidGridsFlag, FLUIDGRIDS_FLAGS, useFlowValidator, saveIndicatorOf, departingSave, inAppLeaveTarget, isNodeConfigsInitialized, phaseAfterAcquire, rememberOwnStatusChange, useRunGuard, getNodeDetail, isImageIcon, NODES, synchronizeOperationUpdate, NodePropertyPanel, loadDefinitionJson, canAutosave, isNodeTypeHiddenFromPalette, isTriggerOperation, canRenderOperationPanel, resolveOperationName, ConnectionSelector, AUTOSAVE_RETRY_DELAYS_MS, AUTOSAVE_DEBOUNCE_MS, editingLeaseLocked, autosaveAllowedFor, isFlowComplete, rememberRevision, phaseAfterTakeOver } from './chunk-C26QAWCT.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-OCJTTHTS.js';
20
- import { getGlobalStoreClient } from './chunk-PXIFUMLA.js';
21
- import { getFluidGridsConfig } from './chunk-6AMNEX2Y.js';
20
+ import { getGlobalStoreClient } from './chunk-AU7LACOY.js';
22
21
  import { GetMyNodeInstallationsDocument, BrowseWorkflowTemplatesDocument, InstallWorkflowNodeDocument, SubmitWorkflowTemplateDocument, MyWorkflowTemplateSubmissionsDocument, WithdrawWorkflowTemplateSubmissionDocument, InstallPurchasedNodeDocument, BrowseWorkflowNodesDocument, UninstallWorkflowNodeDocument, CreateStoreOrderDocument, GetNodeInstallableVersionsDocument, OrganizationPrivateNodesDocument, InstallOrganizationPrivateNodeDocument, UninstallOrganizationPrivateNodeDocument } from './chunk-G77IGC3Y.js';
23
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-AVHBWJRY.js';
24
23
  import { useTr } from './chunk-UULVIT25.js';
25
- import { waitForFluidGridsClient, getFluidGridsClient } from './chunk-NTWG3CJX.js';
24
+ import { waitForFluidGridsClient, getFluidGridsClient } from './chunk-3IXU7WUC.js';
25
+ import { throwIfResultError, describeOperationError, emitFluidGridsEvent } from './chunk-US5QSLPV.js';
26
+ import { getFluidGridsConfig } from './chunk-UEG2WC3G.js';
26
27
  import * as React3 from 'react';
27
28
  import React3__default, { forwardRef, lazy, memo, createContext, useState, useRef, useCallback, useEffect, useContext, useMemo, useLayoutEffect, Suspense, useDeferredValue } from 'react';
28
29
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -5529,9 +5530,9 @@ function DesktopSidebarFragment({
5529
5530
  (n) => !!n.storeProductId
5530
5531
  );
5531
5532
  if (nodesToInstall.length > 0) {
5532
- const { getGlobalStoreClient: getStore } = await import('./global-client-O2HCG5CJ.js');
5533
+ const { getGlobalStoreClient: getStore } = await import('./global-client-N5EIFW6T.js');
5533
5534
  const { InstallWorkflowNodeDocument: InstallWorkflowNodeDocument2 } = await import('./global-operations-BZDHTSYP.js');
5534
- const { getFluidGridsConfig: getFluidGridsConfig3 } = await import('./config-3DBXLCK3.js');
5535
+ const { getFluidGridsConfig: getFluidGridsConfig3 } = await import('./config-66FUPSG5.js');
5535
5536
  const storeClient = getStore();
5536
5537
  const cfg = getFluidGridsConfig3();
5537
5538
  for (let i = 0; i < nodesToInstall.length; i++) {
@@ -5591,8 +5592,8 @@ function DesktopSidebarFragment({
5591
5592
  overrides.templateInputs
5592
5593
  );
5593
5594
  }
5594
- const { getFluidGridsClient: getFluidGridsClient2 } = await import('./client-EYQDMR4O.js');
5595
- const { getFluidGridsConfig: getFluidGridsConfig2 } = await import('./config-3DBXLCK3.js');
5595
+ const { getFluidGridsClient: getFluidGridsClient2 } = await import('./client-YVZMLEQX.js');
5596
+ const { getFluidGridsConfig: getFluidGridsConfig2 } = await import('./config-66FUPSG5.js');
5596
5597
  const { gql: gql5 } = await import('@apollo/client/core');
5597
5598
  const IMPORT_MUTATION = gql5`
5598
5599
  mutation ImportWorkflowTemplate(
@@ -5649,7 +5650,7 @@ function DesktopSidebarFragment({
5649
5650
  category: content.defaultCategory || template.category
5650
5651
  });
5651
5652
  try {
5652
- const { getGlobalStoreClient: getStoreClient } = await import('./global-client-O2HCG5CJ.js');
5653
+ const { getGlobalStoreClient: getStoreClient } = await import('./global-client-N5EIFW6T.js');
5653
5654
  const { InstallWorkflowNodeDocument: InstallWorkflowNodeDocument2 } = await import('./global-operations-BZDHTSYP.js');
5654
5655
  const storeClient = getStoreClient();
5655
5656
  if (storeClient) {
@@ -5749,7 +5750,7 @@ function DesktopSidebarFragment({
5749
5750
  ),
5750
5751
  { id: "template-load" }
5751
5752
  );
5752
- const { getGlobalStoreClient: getGlobalStoreClient2 } = await import('./global-client-O2HCG5CJ.js');
5753
+ const { getGlobalStoreClient: getGlobalStoreClient2 } = await import('./global-client-N5EIFW6T.js');
5753
5754
  const { gql: gql5 } = await import('@apollo/client/core');
5754
5755
  const GET_TEMPLATE_DETAIL = gql5`
5755
5756
  query GetWorkflowTemplateDetail($id: ID!) {
@@ -6005,6 +6006,23 @@ function useDeleteKeyCode() {
6005
6006
  });
6006
6007
  return deleteKeyCode;
6007
6008
  }
6009
+ function nodeSelectionPayload(nodes) {
6010
+ if (nodes.length === 0) return { nodeId: null };
6011
+ if (nodes.length > 1) return void 0;
6012
+ const [node] = nodes;
6013
+ if (!node) return void 0;
6014
+ return { nodeId: node.id, nodeType: node.type };
6015
+ }
6016
+ function useNodeSelectedEvent() {
6017
+ const lastReported = useRef(null);
6018
+ const onChange = useCallback(({ nodes }) => {
6019
+ const payload = nodeSelectionPayload(nodes);
6020
+ if (!payload || payload.nodeId === lastReported.current) return;
6021
+ lastReported.current = payload.nodeId;
6022
+ emitFluidGridsEvent("node:selected", payload);
6023
+ }, []);
6024
+ useOnSelectionChange({ onChange });
6025
+ }
6008
6026
  function useOnNodesDelete(nodes) {
6009
6027
  const [nodePropertiesSelectedNode, nodePropertiesSetSelectedNode] = useFlowStore(
6010
6028
  useShallow((state) => [
@@ -21222,12 +21240,12 @@ function EditLeaseBanner() {
21222
21240
  );
21223
21241
  }
21224
21242
  var LazyNodeDetailView = lazy(
21225
- () => import('./node-detail-view-GAGSLHAO.js').then((m) => ({
21243
+ () => import('./node-detail-view-3VG7XFIZ.js').then((m) => ({
21226
21244
  default: m.NodeDetailView
21227
21245
  }))
21228
21246
  );
21229
21247
  var LazyQuickConfigPanel = lazy(
21230
- () => import('./quick-config-panel-44RBX6YR.js').then((m) => ({
21248
+ () => import('./quick-config-panel-GB7SDWHD.js').then((m) => ({
21231
21249
  default: m.QuickConfigPanel
21232
21250
  }))
21233
21251
  );
@@ -21289,7 +21307,7 @@ var FlowBuilder = ({ readOnly = false }) => {
21289
21307
  );
21290
21308
  useEffect(() => {
21291
21309
  let cancelled = false;
21292
- void import('./agentTools-SZZN6TP3.js').then(({ createBuilderAgentTools }) => {
21310
+ void import('./agentTools-PN4W7QZH.js').then(({ createBuilderAgentTools }) => {
21293
21311
  if (cancelled) return;
21294
21312
  setAgentTools(
21295
21313
  createBuilderAgentTools({
@@ -21352,6 +21370,7 @@ var FlowBuilder = ({ readOnly = false }) => {
21352
21370
  handleAddConnectedNode
21353
21371
  } = useAddNodeOnEdgeDrop();
21354
21372
  const deleteKeyCode = useDeleteKeyCode();
21373
+ useNodeSelectedEvent();
21355
21374
  const onNodesDelete = useOnNodesDelete(nodes);
21356
21375
  const [onDragOver, onDrop] = useDragDropFlowBuilder();
21357
21376
  const isValidConnection = useIsValidConnection(nodes, edges);
@@ -1,14 +1,15 @@
1
- import { AgentsTab } from './chunk-VDJFTZ2H.js';
2
- import { ActionPoliciesTab } from './chunk-NGXJHYV5.js';
3
- import { LogStreamingTab } from './chunk-MF7JLSJX.js';
1
+ import { AgentsTab } from './chunk-VFVN7D3A.js';
2
+ import { ActionPoliciesTab } from './chunk-AMXJLVZN.js';
3
+ import { LogStreamingTab } from './chunk-FCT6POFX.js';
4
4
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
5
- import { useFlowStore, useFluidGridsFlag, FLUIDGRIDS_FLAGS, useSaveStatusStore, findSaveConflict, useDurableParityEnabled, throwIfResultError, describeOperationError, useConnections } from './chunk-AAIZ6S6E.js';
5
+ import { useFlowStore, useFluidGridsFlag, FLUIDGRIDS_FLAGS, useSaveStatusStore, findSaveConflict, useDurableParityEnabled, useConnections } from './chunk-C26QAWCT.js';
6
6
  import { useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS } from './chunk-5375NUIO.js';
7
- import { getGlobalStoreClient } from './chunk-PXIFUMLA.js';
8
- import { getFluidGridsConfig } from './chunk-6AMNEX2Y.js';
7
+ import { getGlobalStoreClient } from './chunk-AU7LACOY.js';
9
8
  import { useWorkflowDefinitionQuery, useUpdateWorkflowDefinitionMutation, useWorkflowDefinitionsQuery, DurableHistoryCapsDocument, UpdateDurableHistoryCapsDocument } from './chunk-AVHBWJRY.js';
10
9
  import { useTr } from './chunk-UULVIT25.js';
11
- import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
10
+ import { getFluidGridsClient } from './chunk-3IXU7WUC.js';
11
+ import { throwIfResultError, describeOperationError } from './chunk-US5QSLPV.js';
12
+ import { getFluidGridsConfig } from './chunk-UEG2WC3G.js';
12
13
  import { useState, useMemo, useEffect, useCallback } from 'react';
13
14
  import { useNavigate, useParams } from 'react-router';
14
15
  import { Icon } from '@iconify/react';
@@ -1,10 +1,10 @@
1
- import { useImportWorkflowTemplate, FlowBuilderPage, useWorkflowTemplates, TEMPLATE_STORE_CATEGORIES, TemplateCard, useTemplateSubmissions, usePublishToStore } from './chunk-DFIX6YWP.js';
2
- import { QuotaExhaustedDialog } from './chunk-X6PIU7FE.js';
1
+ import { useImportWorkflowTemplate, FlowBuilderPage, useWorkflowTemplates, TEMPLATE_STORE_CATEGORIES, TemplateCard, useTemplateSubmissions, usePublishToStore } from './chunk-I3QPAEL6.js';
2
+ import { QuotaExhaustedDialog } from './chunk-O2EB7UT2.js';
3
3
  import { templatesControls } from './chunk-FNZZ5JJL.js';
4
- import { useWorkflowDefinitions, useDuplicateWorkflow, useLazyWorkflowDefinition } from './chunk-AFX3EKFN.js';
4
+ import { useWorkflowDefinitions, useDuplicateWorkflow, useLazyWorkflowDefinition } from './chunk-HOTVUVZG.js';
5
5
  import { useFluidGridsPageControls } from './chunk-PJAWNFJV.js';
6
6
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
7
- import { BILLING_PLANS_PATH, useFluidGridsAnalytics, emitTemplateUsed, isQuotaExhaustedFailure } from './chunk-AAIZ6S6E.js';
7
+ import { BILLING_PLANS_PATH, useFluidGridsAnalytics, emitTemplateUsed, isQuotaExhaustedFailure } from './chunk-C26QAWCT.js';
8
8
  import { SdkPermissionButton, FLUIDGRIDS_PERMISSIONS } from './chunk-5375NUIO.js';
9
9
  import { useTr } from './chunk-UULVIT25.js';
10
10
  import { useState, useEffect, useCallback, useMemo } from 'react';
@@ -1,6 +1,6 @@
1
- import { throwIfResultError } from './chunk-AAIZ6S6E.js';
2
1
  import { useTr } from './chunk-UULVIT25.js';
3
- import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
2
+ import { getFluidGridsClient } from './chunk-3IXU7WUC.js';
3
+ import { throwIfResultError } from './chunk-US5QSLPV.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';