@burdenoff/fluidgrids-fe-sdk 2026.1111.1 → 2026.1111.3

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 (42) hide show
  1. package/dist/{ExecutionDetailPage-DpAYZYx2.js → ExecutionDetailPage-Dpv1mVsb.js} +96 -34
  2. package/dist/{FailureTriagePanel-BJoO3lsL.js → FailureTriagePanel-D2RjCsYa.js} +97 -3
  3. package/dist/{FluidGridsProvider-CraUhM4E.js → FluidGridsProvider-Bg6wKnX4.js} +1 -1
  4. package/dist/{HistoryPage-CYqyngbp.js → HistoryPage-D75ICUi7.js} +3 -3
  5. package/dist/{InsightsPage-DBnOta71.js → InsightsPage-DFJ--w4r.js} +352 -72
  6. package/dist/{ManagedAiPolicyAuthority-D3AYZ5FP.js → ManagedAiPolicyAuthority-DsW8Jmm7.js} +297 -71
  7. package/dist/{MissingNodesInstallModal-LdB_-hSf.js → MissingNodesInstallModal-SlsOhIEf.js} +2 -2
  8. package/dist/{NodesPage-fEUyUKLC.js → NodesPage-CcHVwFdc.js} +2 -2
  9. package/dist/{PublishCustomNodeAction-C6qkAIjG.js → PublishCustomNodeAction-BzYU-juH.js} +1 -1
  10. package/dist/{TemplateConfigurationModal-CnqJFt2f.js → TemplateConfigurationModal-CdaNA1-J.js} +2 -2
  11. package/dist/{TemplateDetailPanel-BWnLqcA7.js → TemplateDetailPanel-B83bYkbT.js} +2 -2
  12. package/dist/{TemplatesPage-omZCh0-D.js → TemplatesPage-WTy20LXZ.js} +5 -5
  13. package/dist/{VersionDiffDialog-CLgIj_jc.js → VersionDiffDialog-BEIc5QBh.js} +1 -1
  14. package/dist/{WorkflowProposalCard-CV4kV4_Z.js → WorkflowProposalCard-KEvkgAE1.js} +1 -1
  15. package/dist/{WorkflowSearchRedirect-D34qC1Qm.js → WorkflowSearchRedirect-DB9R9UDy.js} +10 -10
  16. package/dist/{WorkflowShareDialog-DiD8Gqim.js → WorkflowShareDialog-C6icr074.js} +2 -2
  17. package/dist/{WorkflowsList-Bgsy1OPw.js → WorkflowsList-DZ_QxXEV.js} +5 -5
  18. package/dist/{agent-form-Ci_vxQF5.js → agent-form-hb7BR-JZ.js} +1 -1
  19. package/dist/{agentTools-D61qQFfw.js → agentTools-eOm3_v4A.js} +2 -2
  20. package/dist/{codec-client-Cm4GXmJ9.js → codec-client-B3ugmi-P.js} +1 -1
  21. package/dist/executions.js +1 -1
  22. package/dist/{flow-builder-sG8ZsMYV.js → flow-builder-B31fZz3L.js} +22 -22
  23. package/dist/history.js +1 -1
  24. package/dist/{index-FrgTpWov.d.ts → index-lX6U7gi1.d.ts} +67 -1
  25. package/dist/index.d.ts +2 -2
  26. package/dist/index.js +24 -24
  27. package/dist/{node-detail-view-pyTakx4l.js → node-detail-view-DIR_J4IW.js} +6 -6
  28. package/dist/{node-endpoint-configs-DXCKkK_9.js → node-endpoint-configs-DS59aLlH.js} +560 -4
  29. package/dist/nodes.js +1 -1
  30. package/dist/observability.d.ts +1 -1
  31. package/dist/observability.js +1 -1
  32. package/dist/{quick-config-panel-Zpsh2brj.js → quick-config-panel-iYkp65in.js} +2 -2
  33. package/dist/settings.js +1 -1
  34. package/dist/templates.js +1 -1
  35. package/dist/{useAgentDefinitions-Czl2aHJb.js → useAgentDefinitions-SRq-nq4y.js} +1 -1
  36. package/dist/{useExecutions-CZuOL3RI.js → useExecutions-D08C6QHV.js} +3 -2
  37. package/dist/{useObservability-D402nqXD.js → useObservability-111g9mWF.js} +2 -2
  38. package/dist/{useRunHistory-CsXQohcH.js → useRunHistory-DV-ad0I8.js} +2 -2
  39. package/dist/{useWorkflows-UyKrrkX-.js → useWorkflows-B0-aiUr8.js} +2 -2
  40. package/dist/workflow-builder.js +2 -2
  41. package/dist/workflows-list.js +1 -1
  42. package/package.json +1 -1
@@ -1,14 +1,14 @@
1
1
  "use client";
2
- import { Pi as throwIfResultError, Q as DurableHistoryCapsDocument, Qn as UpdateManagedAiWorkspacePolicyDocument, Ri as getFluidGridsConfig, Zn as UpdateDurableHistoryCapsDocument, ji as describeOperationError, xt as ManagedAiWorkspacePolicyDocument, yi as getFluidGridsClient } from "./node-endpoint-configs-DXCKkK_9.js";
3
- import { In as FLUIDGRIDS_FLAGS, Kt as findSaveConflict, Un as useDurableParityEnabled, Wn as useFluidGridsFlag, or as getGlobalStoreClient, qn as usePhaseCFlags, wt as useSaveStatusStore } from "./FluidGridsProvider-CraUhM4E.js";
2
+ import { $n as UpdateManagedAiWorkspacePolicyDocument, Li as throwIfResultError, Pi as describeOperationError, Pr as WorkflowNotificationSettingsDocument, Q as DurableHistoryCapsDocument, Qn as UpdateDurableHistoryCapsDocument, Si as getFluidGridsClient, St as ManagedAiWorkspacePolicyDocument, Vi as getFluidGridsConfig, rr as UpdateWorkflowNotificationSettingsDocument } from "./node-endpoint-configs-DS59aLlH.js";
3
+ import { In as FLUIDGRIDS_FLAGS, Kt as findSaveConflict, Un as useDurableParityEnabled, Wn as useFluidGridsFlag, or as getGlobalStoreClient, qn as usePhaseCFlags, wt as useSaveStatusStore } from "./FluidGridsProvider-Bg6wKnX4.js";
4
4
  import { H as useFlowStore } from "./node-operation-selection-61d6U9qo.js";
5
5
  import { r as useTr } from "./TranslationBridge-CX0OMnyn.js";
6
- import { Wt as useWorkflowDefinitionQuery, a as useConnections, n as useAgentDefinitions, qt as useWorkflowDefinitionsQuery, zt as useUpdateWorkflowDefinitionMutation } from "./useAgentDefinitions-Czl2aHJb.js";
6
+ import { Wt as useWorkflowDefinitionQuery, a as useConnections, n as useAgentDefinitions, qt as useWorkflowDefinitionsQuery, zt as useUpdateWorkflowDefinitionMutation } from "./useAgentDefinitions-SRq-nq4y.js";
7
7
  import { LF as WorkflowSearchAttributeType, fI as useFluidGridsPermission, oI as FLUIDGRIDS_PERMISSIONS } from "./graphql-types-CulUbQWN.js";
8
8
  import { t as FluidGridsDocsLink } from "./FluidGridsDocsLink-iRiufGc2.js";
9
- import { C as createSearchAttribute, E as deleteSearchAttribute, J as saveArchiveSettings, N as fetchCodecServerSettings, P as fetchPauseRules, R as fetchSearchAttributes, S as createPauseRule, T as deletePauseRule, Y as saveCodecServerSettings, _ as useResource, a as formToInput$2, b as clearArchiveSettings, c as FieldError, d as NativeSelect, i as emptyAgentForm, k as fetchArchiveSettings, n as agentToForm, o as grantDays, p as StatusPill, r as describeRule, t as AgentFormError } from "./agent-form-Ci_vxQF5.js";
10
- import { c as budgetInputValue, d as withBudgetMode, f as EffectBadge, m as useActionPolicies, n as checkCodecServerUrl, p as effectLabel, s as BUDGET_DIMENSIONS, u as withBudgetLimit } from "./codec-client-Cm4GXmJ9.js";
11
- import { a as useLogStreamDestinations, i as useLogStreamDestinationActions } from "./useObservability-D402nqXD.js";
9
+ import { C as createSearchAttribute, E as deleteSearchAttribute, J as saveArchiveSettings, N as fetchCodecServerSettings, P as fetchPauseRules, R as fetchSearchAttributes, S as createPauseRule, T as deletePauseRule, Y as saveCodecServerSettings, _ as useResource, a as formToInput$2, b as clearArchiveSettings, c as FieldError, d as NativeSelect, i as emptyAgentForm, k as fetchArchiveSettings, n as agentToForm, o as grantDays, p as StatusPill, r as describeRule, t as AgentFormError } from "./agent-form-hb7BR-JZ.js";
10
+ import { c as budgetInputValue, d as withBudgetMode, f as EffectBadge, m as useActionPolicies, n as checkCodecServerUrl, p as effectLabel, s as BUDGET_DIMENSIONS, u as withBudgetLimit } from "./codec-client-B3ugmi-P.js";
11
+ import { a as useLogStreamDestinations, i as useLogStreamDestinationActions } from "./useObservability-111g9mWF.js";
12
12
  import { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
13
13
  import { useNavigate, useParams } from "react-router";
14
14
  import { Icon } from "@iconify/react";
@@ -2470,6 +2470,296 @@ function RunDataTab() {
2470
2470
  });
2471
2471
  }
2472
2472
 
2473
+ // src/modules/settings/hooks/useWorkflowNotificationSettings.ts
2474
+ /**
2475
+ * A workflow's notification preferences (G08) for Settings → Notifications
2476
+ * (BOFF-9974): which events notify the workflow's person in the app's bell
2477
+ * and, unless switched off, by push to their devices, and how often.
2478
+ *
2479
+ * Read with `workflowNotificationSettings` (the defaults when nobody saved
2480
+ * any) and saved with `updateWorkflowNotificationSettings`, a partial update.
2481
+ */
2482
+ /** The throttle window the service accepts, in minutes (0 sends every one). */
2483
+ const NOTIFICATION_THROTTLE_RANGE = {
2484
+ min: 0,
2485
+ max: 1440
2486
+ };
2487
+ async function fetchWorkflowNotificationSettings(workflowKey) {
2488
+ const result = await getFluidGridsClient().query({
2489
+ query: WorkflowNotificationSettingsDocument,
2490
+ variables: { workflowKey },
2491
+ fetchPolicy: "network-only"
2492
+ });
2493
+ throwIfResultError(result);
2494
+ return result.data?.workflowNotificationSettings ?? null;
2495
+ }
2496
+ async function saveWorkflowNotificationSettings(workflowKey, changes) {
2497
+ const result = await getFluidGridsClient().mutate({
2498
+ mutation: UpdateWorkflowNotificationSettingsDocument,
2499
+ variables: { input: {
2500
+ workflowKey,
2501
+ ...changes
2502
+ } }
2503
+ });
2504
+ throwIfResultError(result);
2505
+ const saved = result.data?.updateWorkflowNotificationSettings;
2506
+ if (!saved) throw new Error("The notification settings were not saved.");
2507
+ return saved;
2508
+ }
2509
+ function useWorkflowNotificationSettings(workflowKey) {
2510
+ const [loaded, setLoaded] = useState(null);
2511
+ useEffect(() => {
2512
+ if (!workflowKey) return;
2513
+ let cancelled = false;
2514
+ fetchWorkflowNotificationSettings(workflowKey).then((settings) => {
2515
+ if (!cancelled) setLoaded({
2516
+ workflowKey,
2517
+ settings,
2518
+ error: null
2519
+ });
2520
+ }, (err) => {
2521
+ if (!cancelled) setLoaded({
2522
+ workflowKey,
2523
+ settings: null,
2524
+ error: err instanceof Error ? err : new Error(String(err))
2525
+ });
2526
+ });
2527
+ return () => {
2528
+ cancelled = true;
2529
+ };
2530
+ }, [workflowKey]);
2531
+ const save = useCallback(async (changes) => {
2532
+ if (!workflowKey) throw new Error("No workflow selected.");
2533
+ const saved = await saveWorkflowNotificationSettings(workflowKey, changes);
2534
+ setLoaded({
2535
+ workflowKey,
2536
+ settings: saved,
2537
+ error: null
2538
+ });
2539
+ return saved;
2540
+ }, [workflowKey]);
2541
+ const current = loaded?.workflowKey === workflowKey ? loaded : null;
2542
+ return {
2543
+ settings: current?.settings ?? null,
2544
+ loading: !!workflowKey && current === null,
2545
+ error: current?.error ?? null,
2546
+ save
2547
+ };
2548
+ }
2549
+
2550
+ // src/modules/settings/components/WorkflowNotificationsTab.tsx
2551
+ /**
2552
+ * Settings → Notifications (BOFF-9974): what this workflow's person hears
2553
+ * about, through the platform's notifications: the bell in the app, and a
2554
+ * push to their registered devices unless they switch that off.
2555
+ *
2556
+ * The events are a PRODUCTION run failing or succeeding, an AI Agent waiting
2557
+ * for a tool-call approval, and a trigger switched off after repeated errors.
2558
+ * Run outcomes are throttled per workflow: at most one notification of each
2559
+ * kind per window, the next one says how many were held back. The person is
2560
+ * whoever the run ran as (who started it, or the owner of its trigger), else
2561
+ * the workflow's creator.
2562
+ */
2563
+ function formOf(settings) {
2564
+ return {
2565
+ notifyOnFailure: settings.notifyOnFailure,
2566
+ notifyOnSuccess: settings.notifyOnSuccess,
2567
+ notifyOnApprovalRequest: settings.notifyOnApprovalRequest,
2568
+ notifyOnTriggerDisabled: settings.notifyOnTriggerDisabled,
2569
+ pushEnabled: settings.pushEnabled,
2570
+ throttleMinutes: String(settings.throttleMinutes)
2571
+ };
2572
+ }
2573
+ function WorkflowNotificationsTab({ workflowKey }) {
2574
+ const tr = useTr();
2575
+ const { settings, loading, error, save } = useWorkflowNotificationSettings(workflowKey);
2576
+ const [form, setForm] = useState(null);
2577
+ const [saving, setSaving] = useState(false);
2578
+ const { allowed: canEdit } = useFluidGridsPermission(FLUIDGRIDS_PERMISSIONS.WORKFLOW_UPDATE);
2579
+ const locked = loading || !form || saving || !canEdit;
2580
+ useEffect(() => {
2581
+ if (!settings) return;
2582
+ setForm(formOf(settings));
2583
+ }, [settings]);
2584
+ if (!workflowKey) return /* @__PURE__ */ jsxs("div", {
2585
+ className: "flex items-center gap-2 rounded-lg border border-status-warning-border bg-status-warning-bg-subtle p-3",
2586
+ "data-testid": "workflow-notifications-no-workflow",
2587
+ children: [/* @__PURE__ */ jsx(Icon, {
2588
+ icon: "mdi:information",
2589
+ width: 18,
2590
+ className: "shrink-0 text-status-warning-text"
2591
+ }), /* @__PURE__ */ jsx("p", {
2592
+ className: "text-sm text-status-warning-text",
2593
+ children: tr("fluidgrids.settings.workflowNotifications.noWorkflow", "No workflow selected. Open Settings from a workflow to choose what it notifies you about.")
2594
+ })]
2595
+ });
2596
+ if (error) return /* @__PURE__ */ jsx("p", {
2597
+ className: "text-sm text-status-error-text",
2598
+ role: "alert",
2599
+ children: tr("fluidgrids.settings.workflowNotifications.loadFailed", "Could not load this workflow's notification settings.")
2600
+ });
2601
+ const handleSave = async () => {
2602
+ if (!form) return;
2603
+ const throttleMinutes = parseBoundedInt(form.throttleMinutes, NOTIFICATION_THROTTLE_RANGE);
2604
+ if (throttleMinutes === void 0) {
2605
+ toast.error(tr("fluidgrids.settings.workflowNotifications.throttleRequired", "Enter a number of minutes from 0 to 1440."));
2606
+ return;
2607
+ }
2608
+ setSaving(true);
2609
+ try {
2610
+ await save({
2611
+ notifyOnFailure: form.notifyOnFailure,
2612
+ notifyOnSuccess: form.notifyOnSuccess,
2613
+ notifyOnApprovalRequest: form.notifyOnApprovalRequest,
2614
+ notifyOnTriggerDisabled: form.notifyOnTriggerDisabled,
2615
+ pushEnabled: form.pushEnabled,
2616
+ throttleMinutes
2617
+ });
2618
+ toast.success(tr("fluidgrids.settings.workflowNotifications.savedToast", "Notification settings saved"));
2619
+ } catch (err) {
2620
+ toast.error(tr("fluidgrids.settings.runData.saveFailedToast", "Failed to save settings"), { description: err instanceof Error ? err.message : void 0 });
2621
+ } finally {
2622
+ setSaving(false);
2623
+ }
2624
+ };
2625
+ const flagSwitch = (key, label) => /* @__PURE__ */ jsx(Switch, {
2626
+ "aria-label": label,
2627
+ checked: form?.[key] ?? false,
2628
+ onCheckedChange: (checked) => setForm((f) => f ? {
2629
+ ...f,
2630
+ [key]: checked
2631
+ } : f),
2632
+ disabled: locked,
2633
+ "data-testid": `workflow-notifications-${key}`
2634
+ });
2635
+ const failureLabel = tr("fluidgrids.settings.workflowNotifications.onFailureLabel", "A run fails");
2636
+ const successLabel = tr("fluidgrids.settings.workflowNotifications.onSuccessLabel", "A run succeeds");
2637
+ const approvalLabel = tr("fluidgrids.settings.workflowNotifications.onApprovalLabel", "An AI Agent waits for approval");
2638
+ const triggerLabel = tr("fluidgrids.settings.workflowNotifications.onTriggerDisabledLabel", "A trigger is switched off");
2639
+ const inAppLabel = tr("fluidgrids.settings.workflowNotifications.inAppLabel", "In the app");
2640
+ const pushLabel = tr("fluidgrids.settings.workflowNotifications.pushLabel", "Push to your devices");
2641
+ const throttleLabel = tr("fluidgrids.settings.workflowNotifications.throttleLabel", "At most one notification per");
2642
+ return /* @__PURE__ */ jsxs("div", {
2643
+ "data-testid": "workflow-notifications-settings",
2644
+ children: [
2645
+ /* @__PURE__ */ jsxs("div", {
2646
+ className: "mb-6 flex items-start gap-2 rounded-lg border border-border-secondary bg-background-secondary p-3",
2647
+ children: [/* @__PURE__ */ jsx(Icon, {
2648
+ icon: "mdi:bell-outline",
2649
+ width: 18,
2650
+ className: "mt-0.5 shrink-0 text-text-secondary"
2651
+ }), /* @__PURE__ */ jsx("p", {
2652
+ className: "text-sm text-text-secondary",
2653
+ children: tr("fluidgrids.settings.workflowNotifications.intro", "Notifications go to the person a run ran as (whoever started it, or the owner of its trigger), else to the workflow's creator. Run outcomes notify only for production runs; runs you test from the editor never do.")
2654
+ })]
2655
+ }),
2656
+ !canEdit && /* @__PURE__ */ jsx("p", {
2657
+ className: "mb-4 text-xs text-text-secondary",
2658
+ role: "note",
2659
+ children: tr("fluidgrids.settings.execution.readOnly", "You can see these settings but not change them: changing them needs permission to edit workflows.")
2660
+ }),
2661
+ /* @__PURE__ */ jsxs("h3", {
2662
+ className: "mb-1 flex items-center gap-2 text-sm font-semibold text-text-primary",
2663
+ children: [/* @__PURE__ */ jsx(Icon, {
2664
+ icon: "mdi:bell-ring-outline",
2665
+ width: 18
2666
+ }), tr("fluidgrids.settings.workflowNotifications.eventsTitle", "Notify when")]
2667
+ }),
2668
+ /* @__PURE__ */ jsxs("div", {
2669
+ className: "mb-6 divide-y divide-border-secondary",
2670
+ children: [
2671
+ /* @__PURE__ */ jsx(SettingRow, {
2672
+ label: failureLabel,
2673
+ description: tr("fluidgrids.settings.workflowNotifications.onFailureDescription", "A production run of this workflow ends with an error."),
2674
+ children: flagSwitch("notifyOnFailure", failureLabel)
2675
+ }),
2676
+ /* @__PURE__ */ jsx(SettingRow, {
2677
+ label: successLabel,
2678
+ description: tr("fluidgrids.settings.workflowNotifications.onSuccessDescription", "A production run of this workflow completes."),
2679
+ children: flagSwitch("notifyOnSuccess", successLabel)
2680
+ }),
2681
+ /* @__PURE__ */ jsx(SettingRow, {
2682
+ label: approvalLabel,
2683
+ description: tr("fluidgrids.settings.workflowNotifications.onApprovalDescription", "An AI Agent node needs someone to approve a tool call before the run can go on."),
2684
+ children: flagSwitch("notifyOnApprovalRequest", approvalLabel)
2685
+ }),
2686
+ /* @__PURE__ */ jsx(SettingRow, {
2687
+ label: triggerLabel,
2688
+ description: tr("fluidgrids.settings.workflowNotifications.onTriggerDisabledDescription", "A polling trigger stopped itself after failing several times in a row."),
2689
+ children: flagSwitch("notifyOnTriggerDisabled", triggerLabel)
2690
+ })
2691
+ ]
2692
+ }),
2693
+ /* @__PURE__ */ jsxs("h3", {
2694
+ className: "mb-1 flex items-center gap-2 text-sm font-semibold text-text-primary",
2695
+ children: [/* @__PURE__ */ jsx(Icon, {
2696
+ icon: "mdi:send-outline",
2697
+ width: 18
2698
+ }), tr("fluidgrids.settings.workflowNotifications.channelsTitle", "Channels")]
2699
+ }),
2700
+ /* @__PURE__ */ jsxs("div", {
2701
+ className: "mb-6 divide-y divide-border-secondary",
2702
+ children: [
2703
+ /* @__PURE__ */ jsx(SettingRow, {
2704
+ label: inAppLabel,
2705
+ description: tr("fluidgrids.settings.workflowNotifications.inAppDescription", "Every notification appears in the bell. This is always on."),
2706
+ children: /* @__PURE__ */ jsx(Switch, {
2707
+ "aria-label": inAppLabel,
2708
+ checked: true,
2709
+ disabled: true
2710
+ })
2711
+ }),
2712
+ /* @__PURE__ */ jsx(SettingRow, {
2713
+ label: pushLabel,
2714
+ description: tr("fluidgrids.settings.workflowNotifications.pushDescription", "Also send each notification to the phones and browsers where you allowed notifications."),
2715
+ children: flagSwitch("pushEnabled", pushLabel)
2716
+ }),
2717
+ /* @__PURE__ */ jsx(SettingRow, {
2718
+ label: throttleLabel,
2719
+ description: tr("fluidgrids.settings.workflowNotifications.throttleDescription", "Failures or successes inside this window are counted and summed up in the next notification. 0 sends every one."),
2720
+ children: /* @__PURE__ */ jsxs("div", {
2721
+ className: "flex items-center gap-2",
2722
+ children: [/* @__PURE__ */ jsx(Input, {
2723
+ type: "number",
2724
+ min: NOTIFICATION_THROTTLE_RANGE.min,
2725
+ max: NOTIFICATION_THROTTLE_RANGE.max,
2726
+ "aria-label": throttleLabel,
2727
+ value: form?.throttleMinutes ?? "",
2728
+ onChange: (e) => {
2729
+ const throttleMinutes = e.target.value;
2730
+ setForm((f) => f ? {
2731
+ ...f,
2732
+ throttleMinutes
2733
+ } : f);
2734
+ },
2735
+ disabled: locked,
2736
+ className: "w-[100px] text-right",
2737
+ "data-testid": "workflow-notifications-throttleMinutes"
2738
+ }), /* @__PURE__ */ jsx("span", {
2739
+ className: "text-xs text-text-secondary",
2740
+ children: tr("fluidgrids.settings.workflowNotifications.minutesUnit", "minutes")
2741
+ })]
2742
+ })
2743
+ })
2744
+ ]
2745
+ }),
2746
+ /* @__PURE__ */ jsxs("div", {
2747
+ className: "flex flex-wrap items-center justify-between gap-3",
2748
+ children: [/* @__PURE__ */ jsx("p", {
2749
+ className: "text-xs text-text-secondary",
2750
+ children: settings && !settings.customized ? tr("fluidgrids.settings.workflowNotifications.defaultsNote", "These are the defaults; nobody has changed them for this workflow yet.") : null
2751
+ }), /* @__PURE__ */ jsx(Button$1, {
2752
+ "data-agent": "confirm",
2753
+ onClick: () => void handleSave(),
2754
+ disabled: locked,
2755
+ "data-testid": "workflow-notifications-save",
2756
+ children: saving ? tr("fluidgrids.settings.execution.saving", "Saving…") : tr("fluidgrids.settings.execution.save", "Save")
2757
+ })]
2758
+ })
2759
+ ]
2760
+ });
2761
+ }
2762
+
2473
2763
  // src/modules/settings/components/RunControlTab.tsx
2474
2764
  /**
2475
2765
  * Settings → Run control (BOFF-9906, Phase C): the workspace's activity pause
@@ -4928,12 +5218,6 @@ const DEFAULT_SETTINGS = {
4928
5218
  retryDelaySeconds: 10,
4929
5219
  concurrentExecutionLimit: 5
4930
5220
  },
4931
- notifications: {
4932
- emailOnSuccess: false,
4933
- emailOnFailure: true,
4934
- webhookOnSuccess: false,
4935
- webhookOnFailure: true
4936
- },
4937
5221
  api: {
4938
5222
  gatewayUrl: "/api/v1/workflows",
4939
5223
  webhookUrlFormat: "/api/v1/webhooks/workflow/{workflowKey}/trigger"
@@ -5402,64 +5686,6 @@ function ExecutionTab({ workflowKey }) {
5402
5686
  })
5403
5687
  ] });
5404
5688
  }
5405
- function NotificationsTab() {
5406
- const tr = useTr();
5407
- const settings = DEFAULT_SETTINGS.notifications;
5408
- return /* @__PURE__ */ jsxs("div", { children: [
5409
- /* @__PURE__ */ jsx(ReadOnlyBanner, {}),
5410
- /* @__PURE__ */ jsxs("div", {
5411
- className: "mb-6",
5412
- children: [/* @__PURE__ */ jsxs("h3", {
5413
- className: "text-sm font-semibold text-text-primary flex items-center gap-2 mb-3",
5414
- children: [/* @__PURE__ */ jsx(Icon, {
5415
- icon: "mdi:email-outline",
5416
- width: 18
5417
- }), tr("fluidgrids.settings.notifications.emailSectionTitle", "Email Notifications")]
5418
- }), /* @__PURE__ */ jsxs("div", {
5419
- className: "divide-y divide-border-secondary rounded-lg border border-border-secondary bg-background-secondary p-1",
5420
- children: [/* @__PURE__ */ jsx(SettingRow, {
5421
- label: tr("fluidgrids.settings.notifications.emailOnSuccessLabel", "On Success"),
5422
- description: tr("fluidgrids.settings.notifications.emailOnSuccessDescription", "Send email when a workflow execution completes successfully"),
5423
- children: /* @__PURE__ */ jsx(Switch, {
5424
- checked: settings.emailOnSuccess,
5425
- disabled: true
5426
- })
5427
- }), /* @__PURE__ */ jsx(SettingRow, {
5428
- label: tr("fluidgrids.settings.notifications.emailOnFailureLabel", "On Failure"),
5429
- description: tr("fluidgrids.settings.notifications.emailOnFailureDescription", "Send email when a workflow execution fails"),
5430
- children: /* @__PURE__ */ jsx(Switch, {
5431
- checked: settings.emailOnFailure,
5432
- disabled: true
5433
- })
5434
- })]
5435
- })]
5436
- }),
5437
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsxs("h3", {
5438
- className: "text-sm font-semibold text-text-primary flex items-center gap-2 mb-3",
5439
- children: [/* @__PURE__ */ jsx(Icon, {
5440
- icon: "mdi:webhook",
5441
- width: 18
5442
- }), tr("fluidgrids.settings.notifications.webhookSectionTitle", "Webhook Notifications")]
5443
- }), /* @__PURE__ */ jsxs("div", {
5444
- className: "divide-y divide-border-secondary rounded-lg border border-border-secondary bg-background-secondary p-1",
5445
- children: [/* @__PURE__ */ jsx(SettingRow, {
5446
- label: tr("fluidgrids.settings.notifications.webhookOnSuccessLabel", "On Success"),
5447
- description: tr("fluidgrids.settings.notifications.webhookOnSuccessDescription", "Send webhook when a workflow execution completes successfully"),
5448
- children: /* @__PURE__ */ jsx(Switch, {
5449
- checked: settings.webhookOnSuccess,
5450
- disabled: true
5451
- })
5452
- }), /* @__PURE__ */ jsx(SettingRow, {
5453
- label: tr("fluidgrids.settings.notifications.webhookOnFailureLabel", "On Failure"),
5454
- description: tr("fluidgrids.settings.notifications.webhookOnFailureDescription", "Send webhook when a workflow execution fails"),
5455
- children: /* @__PURE__ */ jsx(Switch, {
5456
- checked: settings.webhookOnFailure,
5457
- disabled: true
5458
- })
5459
- })]
5460
- })] })
5461
- ] });
5462
- }
5463
5689
  function ApiTab() {
5464
5690
  const tr = useTr();
5465
5691
  const settings = DEFAULT_SETTINGS.api;
@@ -5743,7 +5969,7 @@ function SettingsPage({ workflowKey: workflowKeyProp } = {}) {
5743
5969
  }),
5744
5970
  /* @__PURE__ */ jsx(TabsContent, {
5745
5971
  value: "notifications",
5746
- children: /* @__PURE__ */ jsx(NotificationsTab, {})
5972
+ children: /* @__PURE__ */ jsx(WorkflowNotificationsTab, { workflowKey })
5747
5973
  }),
5748
5974
  logStreamsEnabled ? /* @__PURE__ */ jsx(TabsContent, {
5749
5975
  value: "log-streaming",
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { A as DialogTitle, D as DialogHeader, E as DialogFooter, S as Dialog, T as DialogDescription, b as Badge, w as DialogContent } from "./flow-builder-sG8ZsMYV.js";
3
- import { i as Button } from "./PublishCustomNodeAction-C6qkAIjG.js";
2
+ import { A as DialogTitle, D as DialogHeader, E as DialogFooter, S as Dialog, T as DialogDescription, b as Badge, w as DialogContent } from "./flow-builder-B31fZz3L.js";
3
+ import { i as Button } from "./PublishCustomNodeAction-BzYU-juH.js";
4
4
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
5
  import { AlertTriangle, CheckCircle2, Download, ExternalLink, Loader2, Puzzle, ShoppingCart } from "lucide-react";
6
6
 
@@ -1,7 +1,7 @@
1
1
  "use client";
2
- import { Ct as NodeEndpointConfigDocument, Tt as NodeManifestDocument, t as fetchAllNodeEndpointConfigs, wt as NodeEndpointConfigsDocument, yi as getFluidGridsClient } from "./node-endpoint-configs-DXCKkK_9.js";
2
+ import { Et as NodeManifestDocument, Si as getFluidGridsClient, Tt as NodeEndpointConfigsDocument, t as fetchAllNodeEndpointConfigs, wt as NodeEndpointConfigDocument } from "./node-endpoint-configs-DS59aLlH.js";
3
3
  import { r as useTr } from "./TranslationBridge-CX0OMnyn.js";
4
- import { t as PublishCustomNodeAction } from "./PublishCustomNodeAction-C6qkAIjG.js";
4
+ import { t as PublishCustomNodeAction } from "./PublishCustomNodeAction-BzYU-juH.js";
5
5
  import { useCallback, useEffect, useMemo, useState } from "react";
6
6
  import { useNavigate } from "react-router";
7
7
  import { Icon } from "@iconify/react";
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { Ri as getFluidGridsConfig } from "./node-endpoint-configs-DXCKkK_9.js";
2
+ import { Vi as getFluidGridsConfig } from "./node-endpoint-configs-DS59aLlH.js";
3
3
  import { r as useTr } from "./TranslationBridge-CX0OMnyn.js";
4
4
  import { t as cn } from "./cn-QqidFIgr.js";
5
5
  import "react";
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { A as DialogTitle, D as DialogHeader, E as DialogFooter, S as Dialog, T as DialogDescription, b as Badge, ht as Input, w as DialogContent } from "./flow-builder-sG8ZsMYV.js";
3
- import { i as Button } from "./PublishCustomNodeAction-C6qkAIjG.js";
2
+ import { A as DialogTitle, D as DialogHeader, E as DialogFooter, S as Dialog, T as DialogDescription, b as Badge, ht as Input, w as DialogContent } from "./flow-builder-B31fZz3L.js";
3
+ import { i as Button } from "./PublishCustomNodeAction-BzYU-juH.js";
4
4
  import { t as Label } from "./label-CDy86rIZ.js";
5
5
  import { r as useTr } from "./TranslationBridge-CX0OMnyn.js";
6
6
  import { useEffect, useMemo, useState } from "react";
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { i as Button } from "./PublishCustomNodeAction-C6qkAIjG.js";
3
- import { b as Badge, y as templatePreview } from "./flow-builder-sG8ZsMYV.js";
2
+ import { i as Button } from "./PublishCustomNodeAction-BzYU-juH.js";
3
+ import { b as Badge, y as templatePreview } from "./flow-builder-B31fZz3L.js";
4
4
  import { r as useTr } from "./TranslationBridge-CX0OMnyn.js";
5
5
  import { lI as SdkPermissionButton, oI as FLUIDGRIDS_PERMISSIONS } from "./graphql-types-CulUbQWN.js";
6
6
  import { Icon } from "@iconify/react";
@@ -1,10 +1,10 @@
1
1
  "use client";
2
- import { Pi as throwIfResultError, Ri as getFluidGridsConfig, ji as describeOperationError, yi as getFluidGridsClient } from "./node-endpoint-configs-DXCKkK_9.js";
3
- import { C as MyWorkflowTemplateSubmissionsDocument, O as WithdrawWorkflowTemplateSubmissionDocument, S as InstallWorkflowNodeDocument, T as SubmitWorkflowTemplateDocument, fn as emitTemplateUsed, mn as emitWorkflowCreated, on as useFluidGridsAnalytics, t as FluidGridsContext, wn as isQuotaExhaustedFailure, yn as BILLING_PLANS_PATH } from "./FluidGridsProvider-CraUhM4E.js";
2
+ import { Li as throwIfResultError, Pi as describeOperationError, Si as getFluidGridsClient, Vi as getFluidGridsConfig } from "./node-endpoint-configs-DS59aLlH.js";
3
+ import { C as MyWorkflowTemplateSubmissionsDocument, O as WithdrawWorkflowTemplateSubmissionDocument, S as InstallWorkflowNodeDocument, T as SubmitWorkflowTemplateDocument, fn as emitTemplateUsed, mn as emitWorkflowCreated, on as useFluidGridsAnalytics, t as FluidGridsContext, wn as isQuotaExhaustedFailure, yn as BILLING_PLANS_PATH } from "./FluidGridsProvider-Bg6wKnX4.js";
4
4
  import { r as useTr } from "./TranslationBridge-CX0OMnyn.js";
5
- import { K as useGlobalStoreClient, N as useWorkflowTemplates, P as useInstallNode, t as FlowBuilderPage, v as TemplateCard } from "./flow-builder-sG8ZsMYV.js";
6
- import { h as useWorkflowDefinitions, l as useLazyWorkflowDefinition, s as useDuplicateWorkflow } from "./useWorkflows-UyKrrkX-.js";
7
- import { k as QuotaExhaustedDialog } from "./WorkflowShareDialog-DiD8Gqim.js";
5
+ import { K as useGlobalStoreClient, N as useWorkflowTemplates, P as useInstallNode, t as FlowBuilderPage, v as TemplateCard } from "./flow-builder-B31fZz3L.js";
6
+ import { h as useWorkflowDefinitions, l as useLazyWorkflowDefinition, s as useDuplicateWorkflow } from "./useWorkflows-B0-aiUr8.js";
7
+ import { k as QuotaExhaustedDialog } from "./WorkflowShareDialog-C6icr074.js";
8
8
  import { BF as WorkflowStatus, lI as SdkPermissionButton, oI as FLUIDGRIDS_PERMISSIONS } from "./graphql-types-CulUbQWN.js";
9
9
  import { n as useFluidGridsPageControls } from "./pageControlsBridge-0pX9s-3k.js";
10
10
  import { r as templatesControls } from "./pageControlSpecs-DZJ9K37m.js";
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { r as useTr } from "./TranslationBridge-CX0OMnyn.js";
3
- import { Pi as throwIfResultError, ji as describeOperationError, ui as WorkflowVersionDiffDocument, yi as getFluidGridsClient, yr as WorkflowDefinitionDocument } from "./node-endpoint-configs-DXCKkK_9.js";
3
+ import { Li as throwIfResultError, Pi as describeOperationError, Si as getFluidGridsClient, pi as WorkflowVersionDiffDocument, xr as WorkflowDefinitionDocument } from "./node-endpoint-configs-DS59aLlH.js";
4
4
  import { t as canvasFromDefinition } from "./definition-canvas-D9cWIGEM.js";
5
5
  import { memo, useCallback, useEffect, useMemo, useRef, useState } from "react";
6
6
  import { Background, Controls, Handle, MiniMap, Position, ReactFlow, ReactFlowProvider } from "@xyflow/react";
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { Fr as WorkflowProposalDocument, L as DataTablesTagsDocument, Mi as isForbiddenError, N as CreateWorkflowTestCaseDocument, Nn as TagFluidgridsEntityDocument, P as CreateWorkflowTestCaseFromRunDocument, Pi as throwIfResultError, Ri as getFluidGridsConfig, Rt as ProposeRunFixDocument, T as CreateFluidgridsTagDocument, Wt as RejectWorkflowProposalDocument, Yt as ReplaceFluidgridsEntityTagsDocument, _n as RunWorkflowTestsDocument, ai as WorkflowTestCasesDocument, bn as SearchFluidgridsTagsDocument, ci as WorkflowTestRunsDocument, l as AvailableFluidgridsTagsDocument, mt as FluidgridsEntityTagsDocument, o as ApplyWorkflowProposalDocument, oi as WorkflowTestRunDocument, q as DeleteWorkflowTestCaseDocument, qn as UntagFluidgridsEntityDocument, rr as UpdateWorkflowTestCaseDocument, y as CancelWorkflowProposalDocument, yi as getFluidGridsClient, zt as ProposeWorkflowChangeDocument } from "./node-endpoint-configs-DXCKkK_9.js";
2
+ import { Bt as ProposeWorkflowChangeDocument, Fi as isForbiddenError, Gt as RejectWorkflowProposalDocument, Jn as UntagFluidgridsEntityDocument, L as DataTablesTagsDocument, Li as throwIfResultError, N as CreateWorkflowTestCaseDocument, P as CreateWorkflowTestCaseFromRunDocument, Pn as TagFluidgridsEntityDocument, Rr as WorkflowProposalDocument, Si as getFluidGridsClient, T as CreateFluidgridsTagDocument, Vi as getFluidGridsConfig, Xt as ReplaceFluidgridsEntityTagsDocument, ar as UpdateWorkflowTestCaseDocument, ci as WorkflowTestCasesDocument, di as WorkflowTestRunsDocument, ht as FluidgridsEntityTagsDocument, l as AvailableFluidgridsTagsDocument, li as WorkflowTestRunDocument, o as ApplyWorkflowProposalDocument, q as DeleteWorkflowTestCaseDocument, vn as RunWorkflowTestsDocument, xn as SearchFluidgridsTagsDocument, y as CancelWorkflowProposalDocument, zt as ProposeRunFixDocument } from "./node-endpoint-configs-DS59aLlH.js";
3
3
  import { r as useTr } from "./TranslationBridge-CX0OMnyn.js";
4
4
  import { GF as WorkflowTestRunStatus, HF as WorkflowTestAssertionOperator, Qu as ErrorType, UF as WorkflowTestExpectedStatus, WF as WorkflowTestRunSource } from "./graphql-types-CulUbQWN.js";
5
5
  import { a as notifyFluidGridsAiCreditsUpdated } from "./aiCreditsBridge-BuE92tKo.js";
@@ -1,14 +1,14 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
- import { Pi as throwIfResultError, Ri as getFluidGridsConfig, yi as getFluidGridsClient, yr as WorkflowDefinitionDocument } from "./node-endpoint-configs-DXCKkK_9.js";
4
- import { Gt as codeBuildIdOf, H as paramsFromOperation, Tn as useCanvasEdges, Vt as rememberRevision, Yt as workflowFingerprint, bt as classifyCreateRefusal, c as ensureNodeConfigsLoaded, d as refetchStoreNodes, f as registerWorkflowNodeTypes, in as resolveNodeOperation, j as createConfiguredNode, n as FluidGridsProvider, o as NODE_CONFIGS, vt as blankWorkflowCreateInput, wt as useSaveStatusStore, yn as BILLING_PLANS_PATH } from "./FluidGridsProvider-CraUhM4E.js";
3
+ import { Li as throwIfResultError, Si as getFluidGridsClient, Vi as getFluidGridsConfig, xr as WorkflowDefinitionDocument } from "./node-endpoint-configs-DS59aLlH.js";
4
+ import { Gt as codeBuildIdOf, H as paramsFromOperation, Tn as useCanvasEdges, Vt as rememberRevision, Yt as workflowFingerprint, bt as classifyCreateRefusal, c as ensureNodeConfigsLoaded, d as refetchStoreNodes, f as registerWorkflowNodeTypes, in as resolveNodeOperation, j as createConfiguredNode, n as FluidGridsProvider, o as NODE_CONFIGS, vt as blankWorkflowCreateInput, wt as useSaveStatusStore, yn as BILLING_PLANS_PATH } from "./FluidGridsProvider-Bg6wKnX4.js";
5
5
  import { F as mergeStickyNotes, H as useFlowStore } from "./node-operation-selection-61d6U9qo.js";
6
6
  import { r as useTr } from "./TranslationBridge-CX0OMnyn.js";
7
- import { F as useInstalledNodes, _ as buildRequiredNodeTypes, ct as FluidGridsMark, f as releaseLeaseKeptForReload, g as buildNodeCheck, ht as Input, lt as Card, p as useWorkflowReloadStore, st as useNodeSelectedEvent, t as FlowBuilderPage } from "./flow-builder-sG8ZsMYV.js";
7
+ import { F as useInstalledNodes, _ as buildRequiredNodeTypes, ct as FluidGridsMark, f as releaseLeaseKeptForReload, g as buildNodeCheck, ht as Input, lt as Card, p as useWorkflowReloadStore, st as useNodeSelectedEvent, t as FlowBuilderPage } from "./flow-builder-B31fZz3L.js";
8
8
  import { t as cn } from "./cn-QqidFIgr.js";
9
- import { i as Button } from "./PublishCustomNodeAction-C6qkAIjG.js";
10
- import { l as useLazyWorkflowDefinition, m as useWorkflowDefinition, n as useCreateWorkflow } from "./useWorkflows-UyKrrkX-.js";
11
- import { O as CreateWorkflowRefusalDialog } from "./WorkflowShareDialog-DiD8Gqim.js";
9
+ import { i as Button } from "./PublishCustomNodeAction-BzYU-juH.js";
10
+ import { l as useLazyWorkflowDefinition, m as useWorkflowDefinition, n as useCreateWorkflow } from "./useWorkflows-B0-aiUr8.js";
11
+ import { O as CreateWorkflowRefusalDialog } from "./WorkflowShareDialog-C6icr074.js";
12
12
  import { c as withoutGuidedTourIntent, l as decideMissingWorkflow, o as isGuidedTourIntent, s as pickGuidedTour, u as isCreateIntent } from "./firstWorkflow-C_h0KMB2.js";
13
13
  import { t as canvasFromDefinition } from "./definition-canvas-D9cWIGEM.js";
14
14
  import { n as registerLiveCanvasHandler } from "./liveCanvas-D5ytXDp8.js";
@@ -1627,7 +1627,7 @@ function GuidedTourStarter({ ready }) {
1627
1627
  }
1628
1628
 
1629
1629
  // src/builder/app/workflow/work/page.tsx
1630
- const LazyMissingNodesInstallModal = lazy(() => import("./MissingNodesInstallModal-LdB_-hSf.js").then((m) => ({ default: m.MissingNodesInstallModal })));
1630
+ const LazyMissingNodesInstallModal = lazy(() => import("./MissingNodesInstallModal-SlsOhIEf.js").then((m) => ({ default: m.MissingNodesInstallModal })));
1631
1631
  function WorkflowItem({ readonly = false }) {
1632
1632
  if (readonly) {
1633
1633
  const queryParams = new URLSearchParams(window.location.search);
@@ -1697,9 +1697,9 @@ function WorkflowItem({ readonly = false }) {
1697
1697
  setInstalling(true);
1698
1698
  setInstallErrors([]);
1699
1699
  try {
1700
- const { getGlobalStoreClient } = await import("./FluidGridsProvider-CraUhM4E.js").then((n) => n.sr);
1701
- const { InstallWorkflowNodeDocument } = await import("./FluidGridsProvider-CraUhM4E.js").then((n) => n.m);
1702
- const { getFluidGridsConfig } = await import("./node-endpoint-configs-DXCKkK_9.js").then((n) => n.Li);
1700
+ const { getGlobalStoreClient } = await import("./FluidGridsProvider-Bg6wKnX4.js").then((n) => n.sr);
1701
+ const { InstallWorkflowNodeDocument } = await import("./FluidGridsProvider-Bg6wKnX4.js").then((n) => n.m);
1702
+ const { getFluidGridsConfig } = await import("./node-endpoint-configs-DS59aLlH.js").then((n) => n.Bi);
1703
1703
  const storeClient = getGlobalStoreClient();
1704
1704
  const cfg = getFluidGridsConfig();
1705
1705
  for (let i = 0; i < nodesToInstall.length; i++) {
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { En as ShareWorkflowDocument, Pi as throwIfResultError, ct as ExportWorkflowCodeDocument, ei as WorkflowSharingDocument, ji as describeOperationError, yi as getFluidGridsClient } from "./node-endpoint-configs-DXCKkK_9.js";
3
- import { hn as emitWorkflowLimitHit, on as useFluidGridsAnalytics, pn as emitUpgradeClicked, xn as WORKFLOWS_QUOTA_NAME } from "./FluidGridsProvider-CraUhM4E.js";
2
+ import { Dn as ShareWorkflowDocument, Li as throwIfResultError, Pi as describeOperationError, Si as getFluidGridsClient, lt as ExportWorkflowCodeDocument, ri as WorkflowSharingDocument } from "./node-endpoint-configs-DS59aLlH.js";
3
+ import { hn as emitWorkflowLimitHit, on as useFluidGridsAnalytics, pn as emitUpgradeClicked, xn as WORKFLOWS_QUOTA_NAME } from "./FluidGridsProvider-Bg6wKnX4.js";
4
4
  import { r as useTr } from "./TranslationBridge-CX0OMnyn.js";
5
5
  import { Pd as FidelityLevel, RF as WorkflowSharePrincipalType, mF as WorkflowExportFormat, qF as WorkflowVisibility, sF as WorkflowAccess, zF as WorkflowShareRole } from "./graphql-types-CulUbQWN.js";
6
6
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
@@ -1,13 +1,13 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
- import { c as useImportWorkflow, h as useWorkflowDefinitions, l as useLazyWorkflowDefinition, n as useCreateWorkflow, o as useDeleteWorkflow, s as useDuplicateWorkflow, u as usePreviewN8nImport } from "./useWorkflows-UyKrrkX-.js";
4
- import { In as FLUIDGRIDS_FLAGS, Wn as useFluidGridsFlag, t as FluidGridsContext, wn as isQuotaExhaustedFailure, xt as createThenOpen, yn as BILLING_PLANS_PATH } from "./FluidGridsProvider-CraUhM4E.js";
5
- import { C as readProjectArchive, D as workflowNameFromFile, E as typeScriptModuleFile, O as CreateWorkflowRefusalDialog, S as primaryImportModule, T as typeScriptImportSource, _ as importFileKind, a as downloadWorkflowExport, c as canShareWorkflow, d as MAX_IMPORT_ARCHIVE_BYTES, f as MAX_IMPORT_SOURCE_BYTES, g as importAcceptAttribute, k as QuotaExhaustedDialog, l as CODE_EXPORT_FORMATS, m as checkTypeScriptImport, o as parseWorkflowImport, p as assertImportByteSize, r as useExportWorkflowAs, s as canEditWorkflow, t as WorkflowShareDialog, u as ImportSourceError } from "./WorkflowShareDialog-DiD8Gqim.js";
3
+ import { c as useImportWorkflow, h as useWorkflowDefinitions, l as useLazyWorkflowDefinition, n as useCreateWorkflow, o as useDeleteWorkflow, s as useDuplicateWorkflow, u as usePreviewN8nImport } from "./useWorkflows-B0-aiUr8.js";
4
+ import { In as FLUIDGRIDS_FLAGS, Wn as useFluidGridsFlag, t as FluidGridsContext, wn as isQuotaExhaustedFailure, xt as createThenOpen, yn as BILLING_PLANS_PATH } from "./FluidGridsProvider-Bg6wKnX4.js";
5
+ import { C as readProjectArchive, D as workflowNameFromFile, E as typeScriptModuleFile, O as CreateWorkflowRefusalDialog, S as primaryImportModule, T as typeScriptImportSource, _ as importFileKind, a as downloadWorkflowExport, c as canShareWorkflow, d as MAX_IMPORT_ARCHIVE_BYTES, f as MAX_IMPORT_SOURCE_BYTES, g as importAcceptAttribute, k as QuotaExhaustedDialog, l as CODE_EXPORT_FORMATS, m as checkTypeScriptImport, o as parseWorkflowImport, p as assertImportByteSize, r as useExportWorkflowAs, s as canEditWorkflow, t as WorkflowShareDialog, u as ImportSourceError } from "./WorkflowShareDialog-C6icr074.js";
6
6
  import { H as useFlowStore } from "./node-operation-selection-61d6U9qo.js";
7
7
  import { cF as WorkflowAccessFilter, fI as useFluidGridsPermission, lI as SdkPermissionButton, mF as WorkflowExportFormat, oI as FLUIDGRIDS_PERMISSIONS, uI as SdkPermissionGate } from "./graphql-types-CulUbQWN.js";
8
8
  import { r as useTr } from "./TranslationBridge-CX0OMnyn.js";
9
- import { A as CreateWorkflowProjectDocument, Jt as RenameWorkflowProjectDocument, Nr as WorkflowProjectsDocument, Pi as throwIfResultError, St as MoveWorkflowFolderDocument, Tr as WorkflowFoldersDocument, U as DeleteWorkflowFolderDocument, W as DeleteWorkflowProjectDocument, f as BulkAssignWorkflowsToProjectDocument, ji as describeOperationError, k as CreateWorkflowFolderDocument, m as BulkMoveWorkflowsToFolderDocument, p as BulkDeleteWorkflowsDocument, qt as RenameWorkflowFolderDocument, yi as getFluidGridsClient } from "./node-endpoint-configs-DXCKkK_9.js";
10
- import { a as useExecutions } from "./useExecutions-CZuOL3RI.js";
9
+ import { A as CreateWorkflowProjectDocument, Ct as MoveWorkflowFolderDocument, Dr as WorkflowFoldersDocument, Ir as WorkflowProjectsDocument, Jt as RenameWorkflowFolderDocument, Li as throwIfResultError, Pi as describeOperationError, Si as getFluidGridsClient, U as DeleteWorkflowFolderDocument, W as DeleteWorkflowProjectDocument, Yt as RenameWorkflowProjectDocument, f as BulkAssignWorkflowsToProjectDocument, k as CreateWorkflowFolderDocument, m as BulkMoveWorkflowsToFolderDocument, p as BulkDeleteWorkflowsDocument } from "./node-endpoint-configs-DS59aLlH.js";
10
+ import { a as useExecutions } from "./useExecutions-D08C6QHV.js";
11
11
  import { a as firstWorkflowProgress, i as builderPathFor, r as GUIDED_TOUR_STATE } from "./firstWorkflow-C_h0KMB2.js";
12
12
  import { n as useFluidGridsPageControls } from "./pageControlsBridge-0pX9s-3k.js";
13
13
  import { i as workflowsListControls } from "./pageControlSpecs-DZJ9K37m.js";
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { $r as WorkflowSearchAttributesDocument, $t as ResetWorkflowRunToLastCleanTaskDocument, An as StartBatchOperationDocument, Gn as UnpauseWorkflowScheduleDocument, Hn as TriggerWorkflowScheduleDocument, Jn as UpdateActivityOptionsDocument, K as DeleteWorkflowSearchAttributeDocument, Kr as WorkflowRunUpdateDocument, M as CreateWorkflowSignalTokenDocument, Nt as PauseWorkflowScheduleDocument, Pi as throwIfResultError, Qt as ResetWorkflowRunDocument, Vr as WorkflowRunHistoryArchiveDocument, Vt as QueryWorkflowRunDocument, Wn as UnpauseActivityDocument, Xn as UpdateCodecServerSettingsDocument, Yn as UpdateArchiveSettingsDocument, Yr as WorkflowScheduleDescribeDocument, Zt as ResetActivityDocument, _r as WorkflowCodeBundleSdkDocument, b as CodecServerSettingsDocument, c as ArchiveSettingsDocument, cn as RunControlFieldsDocument, h as CancelBatchOperationDocument, hr as WorkflowBatchOperationsDocument, in as RevokeWorkflowSignalTokenDocument, ir as UpsertWorkflowRunSearchAttributesDocument, j as CreateWorkflowSearchAttributeDocument, ji as describeOperationError, jn as StartBatchTerminateDocument, jt as PauseActivityDocument, kn as StartBatchExportDocument, lr as WorkflowActivityPauseRulesDocument, lt as FailActivityByIdDocument, ni as WorkflowSignalTokensDocument, nr as UpdateWorkflowRunDocument, pr as WorkflowBatchOperationDocument, u as BackfillWorkflowScheduleDocument, w as CreateActivityPauseRuleDocument, x as CompleteActivityByIdDocument, yi as getFluidGridsClient, z as DeleteActivityPauseRuleDocument } from "./node-endpoint-configs-DXCKkK_9.js";
2
+ import { $t as ResetWorkflowRunDocument, An as StartBatchExportDocument, Gn as UnpauseActivityDocument, Ht as QueryWorkflowRunDocument, K as DeleteWorkflowSearchAttributeDocument, Kn as UnpauseWorkflowScheduleDocument, Li as throwIfResultError, M as CreateWorkflowSignalTokenDocument, Mn as StartBatchTerminateDocument, Mt as PauseActivityDocument, Pi as describeOperationError, Pt as PauseWorkflowScheduleDocument, Qr as WorkflowScheduleDescribeDocument, Qt as ResetActivityDocument, Si as getFluidGridsClient, Un as TriggerWorkflowScheduleDocument, Wr as WorkflowRunHistoryArchiveDocument, Xn as UpdateArchiveSettingsDocument, Yn as UpdateActivityOptionsDocument, Yr as WorkflowRunUpdateDocument, Zn as UpdateCodecServerSettingsDocument, _r as WorkflowBatchOperationsDocument, ai as WorkflowSignalTokensDocument, an as RevokeWorkflowSignalTokenDocument, b as CodecServerSettingsDocument, c as ArchiveSettingsDocument, dr as WorkflowActivityPauseRulesDocument, en as ResetWorkflowRunToLastCleanTaskDocument, h as CancelBatchOperationDocument, hr as WorkflowBatchOperationDocument, ir as UpdateWorkflowRunDocument, j as CreateWorkflowSearchAttributeDocument, jn as StartBatchOperationDocument, ln as RunControlFieldsDocument, ni as WorkflowSearchAttributesDocument, or as UpsertWorkflowRunSearchAttributesDocument, u as BackfillWorkflowScheduleDocument, ut as FailActivityByIdDocument, w as CreateActivityPauseRuleDocument, x as CompleteActivityByIdDocument, yr as WorkflowCodeBundleSdkDocument, z as DeleteActivityPauseRuleDocument } from "./node-endpoint-configs-DS59aLlH.js";
3
3
  import { useCallback, useEffect, useRef, useState } from "react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  import { Label, Textarea } from "@burdenoff/fe-libs/ui";
@@ -1,7 +1,7 @@
1
1
  "use client";
2
- import { B as nodeTitle, H as paramsFromOperation, R as fixedParameterState, U as selectedOperationOf, ht as isFlowComplete, j as createConfiguredNode, l as isNodeConfigsInitialized, o as NODE_CONFIGS, p as registryNodeData, st as autosaveAllowedFor, wt as useSaveStatusStore } from "./FluidGridsProvider-CraUhM4E.js";
2
+ import { B as nodeTitle, H as paramsFromOperation, R as fixedParameterState, U as selectedOperationOf, ht as isFlowComplete, j as createConfiguredNode, l as isNodeConfigsInitialized, o as NODE_CONFIGS, p as registryNodeData, st as autosaveAllowedFor, wt as useSaveStatusStore } from "./FluidGridsProvider-Bg6wKnX4.js";
3
3
  import { E as resolveOutputHandles, H as useFlowStore, T as resolveInputHandles } from "./node-operation-selection-61d6U9qo.js";
4
- import { M as computeAttachPosition, xt as isNodeTypeHiddenFromPalette } from "./flow-builder-sG8ZsMYV.js";
4
+ import { M as computeAttachPosition, xt as isNodeTypeHiddenFromPalette } from "./flow-builder-B31fZz3L.js";
5
5
  import { AgentToolError, defineAgentTool } from "@burdenoff/fe-libs/shared/agent-tools";
6
6
  import { z } from "zod";
7
7
 
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { Pi as throwIfResultError, yi as getFluidGridsClient } from "./node-endpoint-configs-DXCKkK_9.js";
2
+ import { Li as throwIfResultError, Si as getFluidGridsClient } from "./node-endpoint-configs-DS59aLlH.js";
3
3
  import { r as useTr } from "./TranslationBridge-CX0OMnyn.js";
4
4
  import { useCallback, useEffect, useState } from "react";
5
5
  import { cn } from "@burdenoff/fe-libs/utils";
@@ -1,4 +1,4 @@
1
1
  "use client";
2
- import { t as ExecutionDetailPage, y as ExecutionsListPage } from "./ExecutionDetailPage-DpAYZYx2.js";
2
+ import { t as ExecutionDetailPage, y as ExecutionsListPage } from "./ExecutionDetailPage-Dpv1mVsb.js";
3
3
 
4
4
  export { ExecutionDetailPage, ExecutionsListPage };