@burdenoff/fluidgrids-fe-sdk 2026.1115.11 → 2026.1115.13

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 (65) hide show
  1. package/dist/{AiStudioPage-BeiquIMB.js → AiStudioPage-Cb0JCEB1.js} +4 -4
  2. package/dist/{ApprovalInboxPage-BRnmz88g.js → ApprovalInboxPage-eI3jF2FR.js} +1 -1
  3. package/dist/{DataSinkDashboardPage-D6nE6EgZ.js → DataSinkDashboardPage-CbyUgXro.js} +1 -1
  4. package/dist/{DataTablesPage-Dnmd_wKx.js → DataTablesPage-xtPEAiwW.js} +2 -2
  5. package/dist/{Disclosure-C3xMLSU-.js → Disclosure-Dps1H0ho.js} +1 -1
  6. package/dist/{ExecutionDetailPage-B_P-YvYG.js → ExecutionDetailPage-fsr3gOjG.js} +6 -6
  7. package/dist/{ExecutionsListPage-DG6_8hB3.js → ExecutionsListPage-h7IQfUeQ.js} +6 -6
  8. package/dist/{FluidGridsProvider-DX6Thg3Z.js → FluidGridsProvider-Ydj45LFA.js} +3 -3
  9. package/dist/{HistoryPage-Bovdj1vl.js → HistoryPage-Cs7_Le-7.js} +2 -2
  10. package/dist/{InsightsPage-V48lDU2T.js → InsightsPage-uR_lHf3x.js} +2 -2
  11. package/dist/{NodesPage-D8rMR0is.js → NodesPage-BHwje3l_.js} +2 -2
  12. package/dist/{OfflineIcon-DnKb-mo2.js → OfflineIcon-B53l9rQ-.js} +17 -1
  13. package/dist/{PaidTemplateConfirm-BOV478tt.js → PaidTemplateConfirm-Cmqi4wP_.js} +1 -1
  14. package/dist/{RunnersPage-XXDoZ0R1.js → RunnersPage-CXM5Uup2.js} +1 -1
  15. package/dist/{SettingsPage-Bwq_VNLe.js → SettingsPage-D-R4AJAt.js} +3 -3
  16. package/dist/{TechnicalDetails-xQtjIWWx.js → TechnicalDetails-DR1dt28G.js} +1 -1
  17. package/dist/{TemplateCard-B4SfeuOJ.js → TemplateCard-ZC1uQyNw.js} +4 -4
  18. package/dist/{TemplateDetailPanel-DFUiz6n7.js → TemplateDetailPanel-Cj1PKs3N.js} +2 -2
  19. package/dist/{TemplatePreview-CGU41Exc.js → TemplatePreview-DPcfznfO.js} +6 -6
  20. package/dist/{TemplatesPage-VKeqKdNZ.js → TemplatesPage-BXiPQxBz.js} +10 -10
  21. package/dist/{VariablesPage-CFzJFbMb.js → VariablesPage-BCgRsR0S.js} +1 -1
  22. package/dist/{WorkflowBuilder-D1rKfRjJ.js → WorkflowBuilder-BBjFx-1X.js} +4 -4
  23. package/dist/{WorkflowBuilder-CfUyB2cA.js → WorkflowBuilder-DnFYRA-p.js} +6 -6
  24. package/dist/{WorkflowSearchRedirect-Bkm8KsQy.js → WorkflowSearchRedirect-BXrqLvQf.js} +1 -1
  25. package/dist/{WorkflowsList-BgE2Bcwo.js → WorkflowsList-DsB3z9mG.js} +6 -6
  26. package/dist/{agentTools-CAC40gup.js → agentTools-DSaRE3TZ.js} +3 -3
  27. package/dist/{attach-node-helpers-vlWwLKOg.js → attach-node-helpers-DYjc758L.js} +1 -1
  28. package/dist/{canvasNoteTools-CfvyJ2Mg.js → canvasNoteTools-BTf5CT_u.js} +2 -2
  29. package/dist/executions.js +2 -2
  30. package/dist/{flow-builder-C-xoP1_y.js → flow-builder-CvIYh0bh.js} +18 -18
  31. package/dist/history.js +1 -1
  32. package/dist/{index-U_t_24Ac.d.ts → index-CfCILuL4.d.ts} +95 -2
  33. package/dist/index.d.ts +2 -2
  34. package/dist/index.js +270 -35
  35. package/dist/{logs-panel-CMwkrzx_.js → logs-panel-K2Wjz9Yd.js} +1 -1
  36. package/dist/{node-detail-view-CWPyhSWR.js → node-detail-view-D0pXe5yt.js} +6 -6
  37. package/dist/{node-editor-tab-body-CMUbqr58.js → node-editor-tab-body-CZ_Um4rr.js} +3 -3
  38. package/dist/{node-operation-selection-sT7nCmDk.js → node-operation-selection-zPxY9eF4.js} +1 -1
  39. package/dist/{node-type-icon-BiX35H0z.js → node-type-icon-IADvPV1_.js} +2 -2
  40. package/dist/nodes.js +1 -1
  41. package/dist/observability.d.ts +1 -1
  42. package/dist/observability.js +2 -2
  43. package/dist/{popover-DlMR7TwZ.js → popover-BdqaLySD.js} +644 -12
  44. package/dist/{quick-config-panel-ClRN9k1I.js → quick-config-panel-CanGdzpe.js} +5 -5
  45. package/dist/{schedule-panel-BudusAdi.js → schedule-panel-BdHFNvkT.js} +314 -16
  46. package/dist/settings.js +1 -1
  47. package/dist/{sidebar-node-editor-COmLMrwX.js → sidebar-node-editor-BpfjeN-T.js} +5 -5
  48. package/dist/{store-icon-Bgmyn3Lt.js → store-icon-6Rkkftm4.js} +47 -3
  49. package/dist/{template-preview-BwOqyuFH.js → template-preview-Ct4S67II.js} +1 -1
  50. package/dist/templates.js +2 -2
  51. package/dist/{use-workflow-code-editor-DJMH7-Xx.js → use-workflow-code-editor-DUebU6MB.js} +1 -1
  52. package/dist/{useDurableParity-Cglyf8HC.js → useDurableParity-BuRiO7wA.js} +1 -1
  53. package/dist/{useExecutions-Cdgkadhu.js → useExecutions-CdBdvAH6.js} +1 -1
  54. package/dist/{useGlobalStoreClient-BuSeLKRC.js → useGlobalStoreClient-hPq_o_TH.js} +1 -1
  55. package/dist/{useObservability-C3pjy6Ol.js → useObservability-CCEjQJzb.js} +1 -1
  56. package/dist/{useRunHistory-ORb_kIUO.js → useRunHistory-DiFkcMmE.js} +1 -1
  57. package/dist/{useWorkflowCodeExport-C7BTGUOA.js → useWorkflowCodeExport-DD_SEzK0.js} +1 -1
  58. package/dist/{useWorkflows-DtuE-oYn.js → useWorkflows-D7zjwT5t.js} +1 -1
  59. package/dist/workflow-builder.js +5 -5
  60. package/dist/{workflow-description-Dt9VrAov.js → workflow-description-CRndQlF4.js} +1 -1
  61. package/dist/workflow-pages.d.ts +1 -1
  62. package/dist/workflow-pages.js +18 -18
  63. package/dist/workflow-preview.js +1 -1
  64. package/dist/workflows-list.js +1 -1
  65. package/package.json +1 -1
@@ -1,10 +1,10 @@
1
1
  "use client";
2
- import { t as NodeTypeIcon } from "./node-type-icon-BiX35H0z.js";
3
- import { A as useFlowStore, k as nodeAccent } from "./node-operation-selection-sT7nCmDk.js";
4
- import { H as nodeSubtitle, Pn as getNodeDetail, U as nodeTitle, q as useNodeConfig, qt as useNodeExecution } from "./FluidGridsProvider-DX6Thg3Z.js";
5
- import { i as NodeInputFields, n as useNodeEditorTab, r as NodeEditorTabs, t as NodeEditorTabBody } from "./node-editor-tab-body-CMUbqr58.js";
2
+ import { t as NodeTypeIcon } from "./node-type-icon-IADvPV1_.js";
3
+ import { A as useFlowStore, k as nodeAccent } from "./node-operation-selection-zPxY9eF4.js";
4
+ import { Fn as getNodeDetail, H as nodeSubtitle, Jt as useNodeExecution, U as nodeTitle, q as useNodeConfig } from "./FluidGridsProvider-Ydj45LFA.js";
5
+ import { i as NodeInputFields, n as useNodeEditorTab, r as NodeEditorTabs, t as NodeEditorTabBody } from "./node-editor-tab-body-CZ_Um4rr.js";
6
6
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
7
- import { r as NodeExecutionActions } from "./schedule-panel-BudusAdi.js";
7
+ import { r as NodeExecutionActions } from "./schedule-panel-BdHFNvkT.js";
8
8
  import { useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
9
9
  import { useReactFlow, useStore } from "@xyflow/react";
10
10
  import { Icon } from "@iconify/react";
@@ -2,17 +2,17 @@
2
2
  import { r as getFluidGridsConfig } from "./config-X97zrIvn.js";
3
3
  import { o as throwIfResultError, t as describeOperationError } from "./errors-xPZ-IbQd.js";
4
4
  import { n as getFluidGridsClient, r as getFluidGridsClientSafe } from "./client-Ctl4jmY3.js";
5
- import { A as useFlowStore } from "./node-operation-selection-sT7nCmDk.js";
6
- import { $ as resolveLoadOptionsSpec, B as coerceNumber, Dt as useSaveStatusStore, G as paramsFromOperation, L as useRunGuard, Q as optionListValues, U as nodeTitle, W as optionText, X as isStringOptionList, Z as optionListText, an as structuredParameterType, cn as isParamVisible, et as ConditionTreeBuilder, in as parseParameterValue, it as parseMappingValue, ln as useFluidGridsAnalytics, nt as casesFromRules, ot as boundFieldsOf, rn as formatParameterValue, st as missingRequiredParameters, t as FluidGridsContext, tt as SwitchRulesEditor, un as openRunQuotaUpgradePrompt, z as asRecord } from "./FluidGridsProvider-DX6Thg3Z.js";
5
+ import { A as useFlowStore } from "./node-operation-selection-zPxY9eF4.js";
6
+ import { $ as resolveLoadOptionsSpec, B as coerceNumber, Dt as useSaveStatusStore, G as paramsFromOperation, L as useRunGuard, Q as optionListValues, U as nodeTitle, W as optionText, X as isStringOptionList, Z as optionListText, an as parseParameterValue, dn as openRunQuotaUpgradePrompt, et as ConditionTreeBuilder, in as formatParameterValue, it as parseMappingValue, ln as isParamVisible, nt as casesFromRules, on as structuredParameterType, ot as boundFieldsOf, qt as subscribeWorkflowSaved, st as missingRequiredParameters, t as FluidGridsContext, tt as SwitchRulesEditor, un as useFluidGridsAnalytics, z as asRecord } from "./FluidGridsProvider-Ydj45LFA.js";
7
7
  import { n as useBuilderReadOnly } from "./read-only-context-Dt9N9SIG.js";
8
8
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
9
9
  import { m as usePhaseCFlags } from "./feature-flags-B_b8PJ6Z.js";
10
10
  import { B as unpauseSchedule, E as pauseSchedule, R as triggerSchedule, S as fetchSearchAttributes, t as backfillSchedule, u as describeSchedule } from "./api-D1cWC1yx.js";
11
11
  import { ht as useRunFromNodeEligibilityQuery, rn as PreviewScheduleDocument } from "./operations-qq_bbgXP.js";
12
- import { C as RegenerateEventRegistrationTokenDocument, S as StopWebhookTestListenerDocument, T as ListenForFormTestSubmissionDocument, _ as webhookDeliveriesPath, b as WorkflowCallInputsDocument, n as PopoverContent$1, r as PopoverTrigger$1, t as Popover$1, v as RunOnSection, w as ListenForWebhookTestEventDocument, x as WebhookTestListenerDocument, y as ConnectionSelector } from "./popover-DlMR7TwZ.js";
12
+ import { C as InboundMailSettingsDocument, D as ListenForWebhookTestEventDocument, E as RegenerateEventRegistrationTokenDocument, O as ListenForInboundTestEmailDocument, S as InboundMailboxDocument, T as RotateInboundMailboxAddressDocument, _ as webhookDeliveriesPath, b as WorkflowCallInputsDocument, k as ListenForFormTestSubmissionDocument, n as PopoverContent$1, r as PopoverTrigger$1, t as Popover$1, v as RunOnSection, w as StopWebhookTestListenerDocument, x as WebhookTestListenerDocument, y as ConnectionSelector } from "./popover-BdqaLySD.js";
13
13
  import { a as collectExtensions } from "./quota-Cdt8yz7N.js";
14
14
  import { ek as ScheduleType, mL as WorkflowScheduleOverlapPolicy } from "./graphql-types-BdhNiBrG.js";
15
- import { t as useGlobalStoreClient } from "./useGlobalStoreClient-BuSeLKRC.js";
15
+ import { t as useGlobalStoreClient } from "./useGlobalStoreClient-hPq_o_TH.js";
16
16
  import { a as operatorSpec, c as ruleFromRow, i as normaliseAssertRules, n as describeAssertRuleProblem, o as readAssertRulesSetting, r as emptyAssertRuleRow, s as rowsFromRules, t as ASSERT_OPERATORS } from "./assert-rules-Dh_rU0vR.js";
17
17
  import { r as describeRule, s as isAgentNodeType } from "./agent-form-Bfvm32j1.js";
18
18
  import { i as NativeSelect, l as parseJsonObjectInput, o as StatusPill, t as FieldError, u as useResource } from "./shared-mbyvDPde.js";
@@ -676,9 +676,14 @@ function useRegenerateWebhookUrl() {
676
676
  /** Where a run-quota refusal while arming is reported (arming spends a run). */
677
677
  const TEST_LISTENER_QUOTA_SURFACE = {
678
678
  webhook: "webhook-test",
679
- form: "form-test"
679
+ form: "form-test",
680
+ email: "email-test"
680
681
  };
681
682
  async function armRaw(client, kind, input) {
683
+ if (kind === "email") return throwIfResultError(await client.mutate({
684
+ mutation: ListenForInboundTestEmailDocument,
685
+ variables: { input }
686
+ })).data?.listenForInboundTestEmail ?? null;
682
687
  if (kind === "form") return throwIfResultError(await client.mutate({
683
688
  mutation: ListenForFormTestSubmissionDocument,
684
689
  variables: { input }
@@ -893,7 +898,7 @@ function useWebhookTestListener(target, onReceived, kind = "webhook") {
893
898
  }
894
899
 
895
900
  // src/builder/components/ndv/webhook-url-field.tsx
896
- const SECTION_LABEL$5 = "text-[11px] font-semibold uppercase tracking-[0.12em] text-muted-foreground";
901
+ const SECTION_LABEL$6 = "text-[11px] font-semibold uppercase tracking-[0.12em] text-muted-foreground";
897
902
  /** True for an absolute http(s) URL; anything else is never rendered as a link. */
898
903
  function isSafeHttpUrl(value) {
899
904
  try {
@@ -978,7 +983,7 @@ function WebhookUrlField({ webhookUrl, loading, registrationId }) {
978
983
  children: [/* @__PURE__ */ jsxs("div", {
979
984
  className: "flex items-center gap-2",
980
985
  children: [/* @__PURE__ */ jsx("div", {
981
- className: SECTION_LABEL$5,
986
+ className: SECTION_LABEL$6,
982
987
  children: tr("fluidgrids.builder.webhookUrlField.productionLabel", "Production URL")
983
988
  }), webhookUrl && isActiveVersion && /* @__PURE__ */ jsx("span", {
984
989
  className: "rounded-full bg-primary/10 px-2 py-0.5 text-[10px] font-medium text-primary",
@@ -1024,7 +1029,7 @@ function FormUrlField({ formUrl, loading, error }) {
1024
1029
  children: [/* @__PURE__ */ jsxs("div", {
1025
1030
  className: "flex items-center gap-2",
1026
1031
  children: [/* @__PURE__ */ jsx("div", {
1027
- className: SECTION_LABEL$5,
1032
+ className: SECTION_LABEL$6,
1028
1033
  children: tr("fluidgrids.builder.webhookUrlField.productionLabel", "Production URL")
1029
1034
  }), safeUrl && !error && isActiveVersion && /* @__PURE__ */ jsx("span", {
1030
1035
  className: "rounded-full bg-primary/10 px-2 py-0.5 text-[10px] font-medium text-primary",
@@ -1093,13 +1098,14 @@ function TestListenerPanel({ nodeId, kind, testIdPrefix, copy }) {
1093
1098
  default: outcome = null;
1094
1099
  }
1095
1100
  const idleHint = hasUnsavedChanges && copy.unsavedChangesHint ? copy.unsavedChangesHint : copy.hint;
1096
- const testUrl = listening ? listener.testUrl : null;
1101
+ const rawTestUrl = listening ? listener.testUrl : null;
1102
+ const testUrl = rawTestUrl?.startsWith("mailto:") ? rawTestUrl.slice(7) : rawTestUrl;
1097
1103
  return /* @__PURE__ */ jsxs("div", {
1098
1104
  className: "space-y-2",
1099
1105
  "data-testid": testIdPrefix,
1100
1106
  children: [
1101
1107
  /* @__PURE__ */ jsx("div", {
1102
- className: SECTION_LABEL$5,
1108
+ className: SECTION_LABEL$6,
1103
1109
  children: copy.label
1104
1110
  }),
1105
1111
  !saved ? /* @__PURE__ */ jsx("div", {
@@ -1225,9 +1231,45 @@ function FormTestListenerControls({ nodeId }) {
1225
1231
  copy
1226
1232
  });
1227
1233
  }
1234
+ /**
1235
+ * "Listen for test email" on the Inbound Email trigger (BOFF-11893): the next
1236
+ * message sent to the node's address within the window starts one TEST run of
1237
+ * the saved version open in the editor instead of a production run, and the
1238
+ * canvas follows it.
1239
+ */
1240
+ function InboundTestEmailListenerField({ nodeId }) {
1241
+ return useBuilderReadOnly() ? null : /* @__PURE__ */ jsx(InboundTestEmailListenerControls, { nodeId });
1242
+ }
1243
+ function InboundTestEmailListenerControls({ nodeId }) {
1244
+ const tr = useTr();
1245
+ const version = useFlowStore((s) => s.workflow.version);
1246
+ const copy = {
1247
+ label: tr("fluidgrids.builder.inboundEmail.testLabel", "Test email"),
1248
+ unsaved: tr("fluidgrids.builder.inboundEmail.unsaved", "Save the workflow to get its email address."),
1249
+ listen: tr("fluidgrids.builder.inboundEmail.listen", "Listen for test email"),
1250
+ hint: tr("fluidgrids.builder.inboundEmail.listenHint", "The next message to the address starts a test run of the saved version {{version}} instead of a production run.", { version }),
1251
+ unsavedChangesHint: tr("fluidgrids.builder.inboundEmail.unsavedChanges", "Save the workflow first: the test uses the saved version {{version}}, without your unsaved changes.", { version }),
1252
+ listening: (seconds) => tr("fluidgrids.builder.inboundEmail.listening", "Waiting for one test email to version {{version}} — {{seconds}}s left. Send it to the address below.", {
1253
+ version,
1254
+ seconds
1255
+ }),
1256
+ received: tr("fluidgrids.builder.inboundEmail.received", "Test email received — the run is shown on the canvas."),
1257
+ expired: tr("fluidgrids.builder.inboundEmail.expired", "Stopped listening: no test email arrived in time."),
1258
+ stopped: tr("fluidgrids.builder.webhookTestListener.stopped", "Stopped listening."),
1259
+ failed: tr("fluidgrids.builder.inboundEmail.failed", "The test email arrived but the run could not be started."),
1260
+ stopLabel: tr("fluidgrids.builder.webhookTestListener.stop", "Stop"),
1261
+ copyAriaLabel: tr("fluidgrids.builder.inboundEmail.copyAriaLabel", "Copy email address")
1262
+ };
1263
+ return /* @__PURE__ */ jsx(TestListenerPanel, {
1264
+ nodeId,
1265
+ kind: "email",
1266
+ testIdPrefix: "ndv-inbound-email-test",
1267
+ copy
1268
+ });
1269
+ }
1228
1270
 
1229
1271
  // src/builder/components/ndv/manual-push-setup-field.tsx
1230
- const SECTION_LABEL$4 = "text-[11px] font-semibold uppercase tracking-[0.12em] text-muted-foreground";
1272
+ const SECTION_LABEL$5 = "text-[11px] font-semibold uppercase tracking-[0.12em] text-muted-foreground";
1231
1273
  /** The value the server sends back in place of a stored secret. */
1232
1274
  const REDACTED_SECRET = "[REDACTED]";
1233
1275
  function UrlSection({ url, loading, testIdPrefix }) {
@@ -1239,7 +1281,7 @@ function UrlSection({ url, loading, testIdPrefix }) {
1239
1281
  className: "space-y-2",
1240
1282
  children: [
1241
1283
  /* @__PURE__ */ jsx("div", {
1242
- className: SECTION_LABEL$4,
1284
+ className: SECTION_LABEL$5,
1243
1285
  children: tr("fluidgrids.builder.manualPush.urlLabel", "Trigger URL")
1244
1286
  }),
1245
1287
  safeUrl ? /* @__PURE__ */ jsx(CopyableUrl, {
@@ -1267,7 +1309,7 @@ function InstructionsSection({ setup, testIdPrefix }) {
1267
1309
  "data-testid": `${testIdPrefix}-instructions`,
1268
1310
  children: [
1269
1311
  /* @__PURE__ */ jsx("div", {
1270
- className: SECTION_LABEL$4,
1312
+ className: SECTION_LABEL$5,
1271
1313
  children: tr("fluidgrids.builder.manualPush.instructionsLabel", "Setup")
1272
1314
  }),
1273
1315
  setup.instructions && /* @__PURE__ */ jsx("p", {
@@ -1311,7 +1353,7 @@ function SharedSecretField({ header, secretToken, onSecretChange, readOnly, test
1311
1353
  className: "space-y-1.5",
1312
1354
  children: [
1313
1355
  /* @__PURE__ */ jsx("label", {
1314
- className: SECTION_LABEL$4,
1356
+ className: SECTION_LABEL$5,
1315
1357
  htmlFor: `${testIdPrefix}-secret`,
1316
1358
  children: tr("fluidgrids.builder.manualPush.secretLabel", "Shared secret (optional)")
1317
1359
  }),
@@ -1427,7 +1469,7 @@ function ManualPushSetupField({ setup, registration, loading, onRegenerated, sec
1427
1469
  }
1428
1470
 
1429
1471
  // src/builder/components/ndv/wait-resume-url-field.tsx
1430
- const SECTION_LABEL$3 = "text-[11px] font-semibold uppercase tracking-[0.12em] text-muted-foreground";
1472
+ const SECTION_LABEL$4 = "text-[11px] font-semibold uppercase tracking-[0.12em] text-muted-foreground";
1431
1473
  /** The expression any node in the run can use to reach this run's resume URL. */
1432
1474
  const RESUME_URL_EXPRESSION = "${RunContext.resumeWebhookUrl}";
1433
1475
  /**
@@ -1456,7 +1498,7 @@ function WaitResumeUrlField() {
1456
1498
  "data-testid": "ndv-wait-resume-url",
1457
1499
  children: [
1458
1500
  /* @__PURE__ */ jsx("div", {
1459
- className: SECTION_LABEL$3,
1501
+ className: SECTION_LABEL$4,
1460
1502
  children: tr("fluidgrids.builder.waitResumeUrl.label", "Resume URL")
1461
1503
  }),
1462
1504
  /* @__PURE__ */ jsxs("div", {
@@ -1639,6 +1681,261 @@ function WorkflowPickerField({ value, onChange, testId }) {
1639
1681
  });
1640
1682
  }
1641
1683
 
1684
+ // src/builder/components/ndv/use-inbound-mailbox.ts
1685
+ function toInboundMailboxView(mailbox) {
1686
+ return {
1687
+ address: mailbox.address,
1688
+ status: mailbox.status,
1689
+ totalDeliveries: mailbox.totalDeliveries,
1690
+ startedDeliveries: mailbox.startedDeliveries,
1691
+ droppedDeliveries: mailbox.droppedDeliveries,
1692
+ lastReceivedAt: mailbox.lastReceivedAt ?? null
1693
+ };
1694
+ }
1695
+ async function fetchMailboxState(workflowKey, nodeId, loadFailed) {
1696
+ const client = getFluidGridsClientSafe();
1697
+ if (!client || !workflowKey || !nodeId) return { kind: "unsaved" };
1698
+ try {
1699
+ if (!throwIfResultError(await client.query({
1700
+ query: InboundMailSettingsDocument,
1701
+ fetchPolicy: "cache-first"
1702
+ })).data?.inboundMailSettings.enabled) return { kind: "disabled" };
1703
+ const mailbox = throwIfResultError(await client.query({
1704
+ query: InboundMailboxDocument,
1705
+ variables: {
1706
+ workflowKey,
1707
+ triggerNodeId: nodeId
1708
+ },
1709
+ fetchPolicy: "network-only"
1710
+ })).data?.inboundMailbox;
1711
+ return mailbox ? {
1712
+ kind: "ready",
1713
+ mailbox: toInboundMailboxView(mailbox)
1714
+ } : { kind: "unsaved" };
1715
+ } catch (error) {
1716
+ return {
1717
+ kind: "error",
1718
+ message: describeOperationError(error, loadFailed)
1719
+ };
1720
+ }
1721
+ }
1722
+ /**
1723
+ * The Inbound Email trigger's mailbox for one node (BOFF-11893).
1724
+ *
1725
+ * The address is issued by a save, so the mailbox is reloaded after every save
1726
+ * of the workflow (drafts are saved in place without a new version) and when
1727
+ * the selected node or version changes. Only the newest request may update the
1728
+ * state, and a state loaded for another node is never shown: the node panel
1729
+ * reuses this component across node selections.
1730
+ */
1731
+ function useInboundMailbox(workflowKey, nodeId, version, loadFailed) {
1732
+ const key = `${workflowKey ?? ""}\u0000${nodeId ?? ""}`;
1733
+ const [loaded, setLoaded] = useState(null);
1734
+ const requestId = useRef(0);
1735
+ const currentKey = useRef(key);
1736
+ useEffect(() => {
1737
+ currentKey.current = key;
1738
+ }, [key]);
1739
+ const load = useCallback(async () => {
1740
+ const current = ++requestId.current;
1741
+ const state = await fetchMailboxState(workflowKey, nodeId, loadFailed);
1742
+ if (current === requestId.current) setLoaded({
1743
+ key,
1744
+ state
1745
+ });
1746
+ }, [
1747
+ key,
1748
+ workflowKey,
1749
+ nodeId,
1750
+ loadFailed
1751
+ ]);
1752
+ useEffect(() => {
1753
+ load();
1754
+ return () => {
1755
+ requestId.current += 1;
1756
+ };
1757
+ }, [load, version]);
1758
+ useEffect(() => {
1759
+ if (!workflowKey) return;
1760
+ return subscribeWorkflowSaved(workflowKey, () => {
1761
+ load();
1762
+ });
1763
+ }, [workflowKey, load]);
1764
+ const setMailbox = useCallback((mailbox) => {
1765
+ if (currentKey.current !== key) return;
1766
+ requestId.current += 1;
1767
+ setLoaded({
1768
+ key,
1769
+ state: {
1770
+ kind: "ready",
1771
+ mailbox
1772
+ }
1773
+ });
1774
+ }, [key]);
1775
+ return {
1776
+ state: loaded?.key === key ? loaded.state : { kind: "loading" },
1777
+ setMailbox
1778
+ };
1779
+ }
1780
+
1781
+ // src/builder/components/ndv/inbound-email-address-field.tsx
1782
+ /** The builder field type the Inbound Email trigger's manifest declares for its address panel. */
1783
+ const INBOUND_EMAIL_ADDRESS_FIELD = "inbound-email-address";
1784
+ const SECTION_LABEL$3 = "text-[11px] font-semibold uppercase tracking-[0.12em] text-muted-foreground";
1785
+ /** The panel's message while there is no address to show. */
1786
+ function InboundMailboxPlaceholder({ state, tr }) {
1787
+ const messages = {
1788
+ loading: tr("fluidgrids.builder.inboundEmail.loading", "Loading email address…"),
1789
+ disabled: tr("fluidgrids.builder.inboundEmail.disabled", "Inbound email addresses are not available in this environment."),
1790
+ unsaved: tr("fluidgrids.builder.inboundEmail.unsaved", "Save the workflow to get its email address.")
1791
+ };
1792
+ return /* @__PURE__ */ jsx("div", {
1793
+ className: "rounded-md border border-dashed border-border bg-muted/40 px-3 py-2 text-xs text-muted-foreground",
1794
+ "data-testid": `ndv-inbound-email-${state.kind}`,
1795
+ role: state.kind === "error" ? "alert" : void 0,
1796
+ children: state.kind === "error" ? state.message : messages[state.kind]
1797
+ });
1798
+ }
1799
+ /** Rotate, behind a confirmation: the old address stops working at once. */
1800
+ function InboundMailboxRotate({ workflowKey, nodeId, onRotated, tr }) {
1801
+ const [rotating, setRotating] = useState(false);
1802
+ const [confirming, setConfirming] = useState(false);
1803
+ const [error, setError] = useState(null);
1804
+ const rotate = useCallback(async () => {
1805
+ const client = getFluidGridsClientSafe();
1806
+ if (!client || !workflowKey || !nodeId) return;
1807
+ setRotating(true);
1808
+ setError(null);
1809
+ try {
1810
+ const rotated = throwIfResultError(await client.mutate({
1811
+ mutation: RotateInboundMailboxAddressDocument,
1812
+ variables: {
1813
+ workflowKey,
1814
+ triggerNodeId: nodeId
1815
+ }
1816
+ })).data?.rotateInboundMailboxAddress;
1817
+ if (rotated) onRotated(toInboundMailboxView(rotated));
1818
+ setConfirming(false);
1819
+ } catch (rotateError) {
1820
+ setError(describeOperationError(rotateError, tr("fluidgrids.builder.inboundEmail.rotateFailed", "Could not rotate the address.")));
1821
+ } finally {
1822
+ setRotating(false);
1823
+ }
1824
+ }, [
1825
+ workflowKey,
1826
+ nodeId,
1827
+ onRotated,
1828
+ tr
1829
+ ]);
1830
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [confirming ? /* @__PURE__ */ jsxs("div", {
1831
+ className: "flex flex-wrap items-center gap-2 rounded-md border border-border bg-muted/40 px-3 py-2",
1832
+ "data-testid": "ndv-inbound-email-rotate-confirm",
1833
+ children: [
1834
+ /* @__PURE__ */ jsx("span", {
1835
+ className: "text-[11px] text-foreground",
1836
+ children: tr("fluidgrids.builder.inboundEmail.rotateConfirm", "The current address stops working at once and is never reused.")
1837
+ }),
1838
+ /* @__PURE__ */ jsx("button", {
1839
+ type: "button",
1840
+ onClick: () => void rotate(),
1841
+ disabled: rotating,
1842
+ "data-testid": "ndv-inbound-email-rotate-yes",
1843
+ className: "rounded-md border border-destructive bg-destructive/10 px-3 py-1.5 text-xs font-medium text-destructive hover:bg-destructive/20 disabled:opacity-50",
1844
+ children: tr("fluidgrids.builder.inboundEmail.rotateYes", "Rotate address")
1845
+ }),
1846
+ /* @__PURE__ */ jsx("button", {
1847
+ type: "button",
1848
+ onClick: () => setConfirming(false),
1849
+ disabled: rotating,
1850
+ className: "rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:opacity-50",
1851
+ children: tr("fluidgrids.builder.inboundEmail.rotateCancel", "Cancel")
1852
+ })
1853
+ ]
1854
+ }) : /* @__PURE__ */ jsxs("button", {
1855
+ type: "button",
1856
+ onClick: () => setConfirming(true),
1857
+ "data-testid": "ndv-inbound-email-rotate",
1858
+ className: "inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-muted",
1859
+ children: [/* @__PURE__ */ jsx(Icon, {
1860
+ icon: "mdi:refresh",
1861
+ className: "h-4 w-4"
1862
+ }), tr("fluidgrids.builder.inboundEmail.rotate", "Rotate address")]
1863
+ }), error && /* @__PURE__ */ jsx("p", {
1864
+ className: "text-[11px] text-destructive",
1865
+ role: "alert",
1866
+ "data-testid": "ndv-inbound-email-rotate-error",
1867
+ children: error
1868
+ })] });
1869
+ }
1870
+ /** The address, its hint and delivery counts. */
1871
+ function InboundMailboxDetails({ mailbox, isActiveVersion, tr }) {
1872
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
1873
+ /* @__PURE__ */ jsx(CopyableUrl, {
1874
+ url: mailbox.address,
1875
+ testId: "ndv-inbound-email-address",
1876
+ copyAriaLabel: tr("fluidgrids.builder.inboundEmail.copyAriaLabel", "Copy email address")
1877
+ }),
1878
+ /* @__PURE__ */ jsx("p", {
1879
+ className: "text-[11px] text-muted-foreground",
1880
+ children: isActiveVersion ? tr("fluidgrids.builder.inboundEmail.activeHint", "Each message sent or forwarded here starts this version of the workflow once. Nothing is ever sent back to the sender.") : tr("fluidgrids.builder.inboundEmail.inactiveHint", "Mail to this address runs the workflow's active version only. Activate this version to make it live, or listen for a test email.")
1881
+ }),
1882
+ /* @__PURE__ */ jsx("p", {
1883
+ className: "text-[11px] text-muted-foreground",
1884
+ "data-testid": "ndv-inbound-email-stats",
1885
+ children: tr("fluidgrids.builder.inboundEmail.stats", "{{total}} received · {{started}} started a run · {{dropped}} dropped", {
1886
+ total: mailbox.totalDeliveries,
1887
+ started: mailbox.startedDeliveries,
1888
+ dropped: mailbox.droppedDeliveries
1889
+ })
1890
+ })
1891
+ ] });
1892
+ }
1893
+ /**
1894
+ * The Inbound Email trigger's address panel (BOFF-11893): the node's own email
1895
+ * address once the workflow is saved, with copy, rotate and "Listen for test
1896
+ * email". The address is issued on save and stays the same until rotated;
1897
+ * mail to it starts the workflow's active version.
1898
+ */
1899
+ function InboundEmailAddressField({ nodeId }) {
1900
+ const tr = useTr();
1901
+ const readOnly = useBuilderReadOnly();
1902
+ const workflowKey = useFlowStore((s) => s.workflow.workflowKey);
1903
+ const version = useFlowStore((s) => s.workflow.version);
1904
+ const isActiveVersion = useFlowStore((s) => s.workflow.status === "ACTIVE");
1905
+ const { state, setMailbox } = useInboundMailbox(workflowKey, nodeId, version, tr("fluidgrids.builder.inboundEmail.loadFailed", "Could not load the email address."));
1906
+ const ready = state.kind === "ready";
1907
+ return /* @__PURE__ */ jsxs("div", {
1908
+ className: "space-y-3",
1909
+ "data-testid": "ndv-inbound-email",
1910
+ children: [/* @__PURE__ */ jsxs("div", {
1911
+ className: "space-y-2",
1912
+ children: [/* @__PURE__ */ jsxs("div", {
1913
+ className: "flex items-center gap-2",
1914
+ children: [/* @__PURE__ */ jsx("div", {
1915
+ className: SECTION_LABEL$3,
1916
+ children: tr("fluidgrids.builder.inboundEmail.label", "Email address")
1917
+ }), ready && isActiveVersion && /* @__PURE__ */ jsx("span", {
1918
+ className: "rounded-full bg-primary/10 px-2 py-0.5 text-[10px] font-medium text-primary",
1919
+ "data-testid": "ndv-inbound-email-live",
1920
+ children: tr("fluidgrids.builder.webhookUrlField.live", "Live")
1921
+ })]
1922
+ }), state.kind === "ready" ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(InboundMailboxDetails, {
1923
+ mailbox: state.mailbox,
1924
+ isActiveVersion,
1925
+ tr
1926
+ }), !readOnly && /* @__PURE__ */ jsx(InboundMailboxRotate, {
1927
+ workflowKey,
1928
+ nodeId,
1929
+ onRotated: setMailbox,
1930
+ tr
1931
+ }, `${workflowKey ?? ""}:${nodeId ?? ""}`)] }) : /* @__PURE__ */ jsx(InboundMailboxPlaceholder, {
1932
+ state,
1933
+ tr
1934
+ })]
1935
+ }), state.kind === "ready" && /* @__PURE__ */ jsx(InboundTestEmailListenerField, { nodeId }, state.mailbox.address)]
1936
+ });
1937
+ }
1938
+
1642
1939
  // src/builder/lib/subworkflow-input-mapping.ts
1643
1940
  function isPlainObject(value) {
1644
1941
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -7401,6 +7698,7 @@ function NodeParamsForm({ config, nodeType, testIdPrefix = "ndv" }) {
7401
7698
  })]
7402
7699
  }, p.name);
7403
7700
  }
7701
+ if (p.type === "inbound-email-address") return /* @__PURE__ */ jsx(InboundEmailAddressField, { nodeId: config.node?.id }, p.name);
7404
7702
  if (nodeType === "internal:assert" && p.name === "rules") return /* @__PURE__ */ jsxs("div", {
7405
7703
  className: "flex flex-col gap-1.5",
7406
7704
  children: [/* @__PURE__ */ jsxs("div", {
package/dist/settings.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { n as SettingsPage, t as SETTINGS_TAB_PARAM } from "./SettingsPage-Bwq_VNLe.js";
2
+ import { n as SettingsPage, t as SETTINGS_TAB_PARAM } from "./SettingsPage-D-R4AJAt.js";
3
3
  import { t as WorkflowSettingsDrawer } from "./WorkflowSettingsDrawer-BiqTf_tV.js";
4
4
  import { t as ManagedAiPolicyAuthorityProvider } from "./ManagedAiPolicyAuthority-BxwJ3ptd.js";
5
5
 
@@ -1,9 +1,9 @@
1
1
  "use client";
2
- import { A as useFlowStore, k as nodeAccent } from "./node-operation-selection-sT7nCmDk.js";
3
- import { H as nodeSubtitle, Pn as getNodeDetail, U as nodeTitle, q as useNodeConfig, qt as useNodeExecution } from "./FluidGridsProvider-DX6Thg3Z.js";
4
- import { t as NodeTypeIcon } from "./node-type-icon-BiX35H0z.js";
5
- import { i as NodeInputFields, n as useNodeEditorTab, r as NodeEditorTabs, t as NodeEditorTabBody } from "./node-editor-tab-body-CMUbqr58.js";
6
- import { r as NodeExecutionActions } from "./schedule-panel-BudusAdi.js";
2
+ import { A as useFlowStore, k as nodeAccent } from "./node-operation-selection-zPxY9eF4.js";
3
+ import { Fn as getNodeDetail, H as nodeSubtitle, Jt as useNodeExecution, U as nodeTitle, q as useNodeConfig } from "./FluidGridsProvider-Ydj45LFA.js";
4
+ import { t as NodeTypeIcon } from "./node-type-icon-IADvPV1_.js";
5
+ import { i as NodeInputFields, n as useNodeEditorTab, r as NodeEditorTabs, t as NodeEditorTabBody } from "./node-editor-tab-body-CZ_Um4rr.js";
6
+ import { r as NodeExecutionActions } from "./schedule-panel-BdHFNvkT.js";
7
7
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
8
8
  import { useEffect, useState } from "react";
9
9
  import { Icon } from "@iconify/react";
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { n as offlineCandidates, t as OfflineIcon } from "./OfflineIcon-DnKb-mo2.js";
2
+ import { n as offlineCandidates, r as onlineCandidates, t as OfflineIcon } from "./OfflineIcon-B53l9rQ-.js";
3
3
  import { useState } from "react";
4
4
  import { Icon } from "@iconify/react";
5
5
  import { cn } from "@burdenoff/fe-libs/utils";
@@ -12,15 +12,59 @@ function isIconifyName(value) {
12
12
  return ICONIFY_NAME.test(value) && !/^(https?|data|blob):/i.test(value);
13
13
  }
14
14
  const IMAGE_URL = /^https?:\/\/[^\s/]/i;
15
+ /**
16
+ * Hosts of the public Iconify API and its mirrors. The API rate-limits per
17
+ * viewer IP, so a link to it is never used as an `<img src>`.
18
+ */
19
+ const ICONIFY_API_HOSTS = /* @__PURE__ */ new Set([
20
+ "api.iconify.design",
21
+ "api.simplesvg.com",
22
+ "api.unisvg.com"
23
+ ]);
24
+ /** Path of an Iconify API SVG link: `/<set>/<name>.svg` or `/<set>:<name>.svg`. */
25
+ const ICONIFY_API_PATH = /^\/([a-z0-9]+(?:-[a-z0-9]+)*)[/:]([a-z0-9]+(?:-[a-z0-9]+)*)\.svg$/i;
26
+ /**
27
+ * Reads a link to the public Iconify API. Returns the icon it names as an
28
+ * Iconify `set:name` (`https://api.iconify.design/logos/slack-icon.svg` is
29
+ * `logos:slack-icon`), `"unrenderable"` for any other link to the API, or
30
+ * null when the value is not an Iconify API link at all.
31
+ *
32
+ * Listings were published with these links as their icon. The store renders
33
+ * them into `iconUrl` offline; when it cannot (the icon is in no Iconify set),
34
+ * the link would only fetch a 404 from the API, so surfaces treat it as the
35
+ * icon name it is and draw it only from the bundled set.
36
+ */
37
+ function iconifyApiIcon(value) {
38
+ let url;
39
+ try {
40
+ url = new URL(value);
41
+ } catch {
42
+ return null;
43
+ }
44
+ if (!ICONIFY_API_HOSTS.has(url.hostname.toLowerCase())) return null;
45
+ const match = ICONIFY_API_PATH.exec(url.pathname);
46
+ if (!match) return "unrenderable";
47
+ return `${match[1]}:${match[2]}`.toLowerCase();
48
+ }
15
49
  const DATA_IMAGE = /^data:image\/[a-z0-9.+-]+[;,]/i;
16
50
  const BLOB_URL = /^blob:\S/i;
17
51
  /**
18
52
  * Classifies one icon value. Returns null for values that can never render:
19
- * empty strings, bare words, relative paths and non-image schemes.
53
+ * empty strings, bare words, relative paths and non-image schemes. A link to
54
+ * the public Iconify API is read as the icon name it carries (see
55
+ * `iconifyApiIcon`) and keeps the link in `apiLink`; only an online surface
56
+ * may turn it back into an image (see `onlineCandidates`).
20
57
  */
21
58
  function classifyStoreIcon(value) {
22
59
  const trimmed = value?.trim();
23
60
  if (!trimmed) return null;
61
+ const apiIcon = iconifyApiIcon(trimmed);
62
+ if (apiIcon === "unrenderable") return null;
63
+ if (apiIcon) return {
64
+ kind: "icon",
65
+ name: apiIcon,
66
+ apiLink: trimmed
67
+ };
24
68
  if (IMAGE_URL.test(trimmed) || DATA_IMAGE.test(trimmed) || BLOB_URL.test(trimmed)) return {
25
69
  kind: "image",
26
70
  src: trimmed
@@ -73,7 +117,7 @@ function pickStoreIcon(candidates, failed) {
73
117
  */
74
118
  function StoreIcon({ candidates, alt, imageClassName, iconClassName, iconSize, fallback, offline = false }) {
75
119
  const [failed, setFailed] = useState(() => /* @__PURE__ */ new Set());
76
- const source = pickStoreIcon(offline ? offlineCandidates(candidates) : candidates, failed);
120
+ const source = pickStoreIcon(offline ? offlineCandidates(candidates) : onlineCandidates(candidates), failed);
77
121
  if (!source) return /* @__PURE__ */ jsx(Fragment$1, { children: fallback });
78
122
  if (source.kind === "icon") {
79
123
  if (offline) return /* @__PURE__ */ jsx(OfflineIcon, {
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { n as storeIconCandidates } from "./store-icon-Bgmyn3Lt.js";
2
+ import { n as storeIconCandidates } from "./store-icon-6Rkkftm4.js";
3
3
 
4
4
  // src/utils/template-preview.ts
5
5
  /**
package/dist/templates.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { t as TemplatesPage } from "./TemplatesPage-VKeqKdNZ.js";
3
- import { t as TemplatePreview } from "./TemplatePreview-CGU41Exc.js";
2
+ import { t as TemplatesPage } from "./TemplatesPage-BXiPQxBz.js";
3
+ import { t as TemplatePreview } from "./TemplatePreview-DPcfznfO.js";
4
4
 
5
5
  export { TemplatePreview, TemplatesPage };
@@ -2,7 +2,7 @@
2
2
  import { n as getFluidGridsClient } from "./client-Ctl4jmY3.js";
3
3
  import { h as fetchCodeBundleSdk } from "./api-D1cWC1yx.js";
4
4
  import { o as throwIfResultError, t as describeOperationError } from "./errors-xPZ-IbQd.js";
5
- import { a as changedSourceFiles, d as isEditableSourcePath, f as projectLanguage, s as defaultSourcePath } from "./node-operation-selection-sT7nCmDk.js";
5
+ import { a as changedSourceFiles, d as isEditableSourcePath, f as projectLanguage, s as defaultSourcePath } from "./node-operation-selection-zPxY9eF4.js";
6
6
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
7
7
 
8
8
  // src/generated/documents/wspace/BuildWorkflowCodeDocument.ts
@@ -3,7 +3,7 @@ import { o as throwIfResultError, t as describeOperationError } from "./errors-x
3
3
  import { n as getFluidGridsClient } from "./client-Ctl4jmY3.js";
4
4
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
5
5
  import { n as useNavigationV2 } from "./useNavigationV2-C2WeqN7d.js";
6
- import { f as STATUS_COUNT_GROUP_BY, v as statusCountFilter, y as statusCountsOf } from "./useExecutions-Cdgkadhu.js";
6
+ import { f as STATUS_COUNT_GROUP_BY, v as statusCountFilter, y as statusCountsOf } from "./useExecutions-CdBdvAH6.js";
7
7
  import { useCallback, useEffect, useRef, useState } from "react";
8
8
  import { Icon } from "@iconify/react";
9
9
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -7,7 +7,7 @@ import { g as useExecutionsStore } from "./config-X97zrIvn.js";
7
7
  import { l as REPLAY_WORKFLOW_RUN, u as RETRY_WORKFLOW_RUNS } from "./operations-D7o-gUzy.js";
8
8
  import { o as throwIfResultError } from "./errors-xPZ-IbQd.js";
9
9
  import { a as emitOperationErrorEvent, i as emitFluidGridsEvent } from "./token-refresh-link-BjN7H4qA.js";
10
- import { ln as useFluidGridsAnalytics, un as openRunQuotaUpgradePrompt } from "./FluidGridsProvider-DX6Thg3Z.js";
10
+ import { dn as openRunQuotaUpgradePrompt, un as useFluidGridsAnalytics } from "./FluidGridsProvider-Ydj45LFA.js";
11
11
  import { i as emitRunStarted } from "./fluidgridsEvents-Dm5CaHtr.js";
12
12
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
13
13
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { t as FluidGridsContext } from "./FluidGridsProvider-DX6Thg3Z.js";
2
+ import { t as FluidGridsContext } from "./FluidGridsProvider-Ydj45LFA.js";
3
3
  import { n as getGlobalStoreClient } from "./global-client-DP_Wxe5t.js";
4
4
  import { useContext } from "react";
5
5
 
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { n as getFluidGridsClient } from "./client-Ctl4jmY3.js";
3
- import { ln as useFluidGridsAnalytics, un as openRunQuotaUpgradePrompt } from "./FluidGridsProvider-DX6Thg3Z.js";
3
+ import { dn as openRunQuotaUpgradePrompt, un as useFluidGridsAnalytics } from "./FluidGridsProvider-Ydj45LFA.js";
4
4
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
5
5
  import { i as emitRunStarted } from "./fluidgridsEvents-Dm5CaHtr.js";
6
6
  import { o as throwIfResultError, t as describeOperationError } from "./errors-xPZ-IbQd.js";
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { o as throwIfResultError, t as describeOperationError } from "./errors-xPZ-IbQd.js";
3
3
  import { n as getFluidGridsClient, r as getFluidGridsClientSafe } from "./client-Ctl4jmY3.js";
4
- import { Sn as signalPayloadCard, bn as payloadFromCardValues, yn as parseRawSignalPayload } from "./FluidGridsProvider-DX6Thg3Z.js";
4
+ import { Cn as signalPayloadCard, bn as parseRawSignalPayload, xn as payloadFromCardValues } from "./FluidGridsProvider-Ydj45LFA.js";
5
5
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
6
6
  import { xf as ExecutionKind } from "./graphql-types-BdhNiBrG.js";
7
7
  import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from "react";
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { o as throwIfResultError, t as describeOperationError } from "./errors-xPZ-IbQd.js";
3
3
  import { n as getFluidGridsClient } from "./client-Ctl4jmY3.js";
4
- import { ln as useFluidGridsAnalytics } from "./FluidGridsProvider-DX6Thg3Z.js";
4
+ import { un as useFluidGridsAnalytics } from "./FluidGridsProvider-Ydj45LFA.js";
5
5
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
6
6
  import { i as WORKFLOWS_QUOTA_NAME } from "./quota-Cdt8yz7N.js";
7
7
  import { c as emitWorkflowLimitHit, o as emitUpgradeClicked } from "./fluidgridsEvents-Dm5CaHtr.js";