@burdenoff/fluidgrids-fe-sdk 2026.1111.21 → 2026.1111.23

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 (64) hide show
  1. package/README.md +13 -0
  2. package/dist/{AiStudioPage-CJdzRL26.js → AiStudioPage-CLrMe8v8.js} +5 -5
  3. package/dist/{ApprovalInboxPage-dbBDSJ-f.js → ApprovalInboxPage-D8vhnloO.js} +1 -1
  4. package/dist/{DataSinkDashboardPage-hrwQSvks.js → DataSinkDashboardPage-DDvNPS8Z.js} +1 -1
  5. package/dist/{DataTablesPage-BZy2z0LB.js → DataTablesPage-BpnF13UT.js} +9 -1
  6. package/dist/{ExecutionDetailPage-DKp421Fj.js → ExecutionDetailPage-DmICvIpH.js} +12 -7
  7. package/dist/{ExecutionsListPage-DwJQfDPt.js → ExecutionsListPage-D63aCXJH.js} +4 -4
  8. package/dist/{FluidGridsProvider-CbY91ZQq.js → FluidGridsProvider-CWyQ8ziM.js} +2 -1
  9. package/dist/{HistoryPage-BLXZJDoJ.js → HistoryPage-CNXgUMb0.js} +1 -1
  10. package/dist/{HumanRequestCard-D-ooVPDn.js → HumanRequestCard-mOhr-Ic9.js} +239 -31
  11. package/dist/{InsightsPage-ChnoW5U4.js → InsightsPage-Duo83yAM.js} +1 -1
  12. package/dist/{MissingNodesInstallModal-mYFfy9Gg.js → MissingNodesInstallModal-Q3RYBvS8.js} +1 -1
  13. package/dist/{QuotaExhaustedDialog-DWm_YWL7.js → QuotaExhaustedDialog-ChBoJnRo.js} +3 -2
  14. package/dist/{SettingsPage-CXoKX0px.js → SettingsPage-DI_vIG7t.js} +2 -2
  15. package/dist/{TemplateCard-HIMsb47R.js → TemplateCard-6W2q2wiK.js} +4 -3
  16. package/dist/{TemplateConfigurationModal-BNtbJ2fv.js → TemplateConfigurationModal-qNQGP7cm.js} +1 -1
  17. package/dist/{TemplateDetailPanel-C6Zh2WRF.js → TemplateDetailPanel-CQvYqhVO.js} +1 -1
  18. package/dist/{TemplatePreview-_wUMSwh_.js → TemplatePreview-Bb2f4enx.js} +4 -4
  19. package/dist/{TemplatesPage-DBfL-ao9.js → TemplatesPage-Bvg6R2P9.js} +6 -5
  20. package/dist/{WorkflowBuilder-CMZi6wQE.js → WorkflowBuilder-CabLzwS5.js} +8 -8
  21. package/dist/{WorkflowBuilder-CYmpQtIQ.js → WorkflowBuilder-TgKSGNlu.js} +3 -3
  22. package/dist/{WorkflowSearchRedirect-iWzvY9Qo.js → WorkflowSearchRedirect-33Vs4FKc.js} +1 -1
  23. package/dist/{WorkflowsList-C8aoqtRE.js → WorkflowsList-C3bHLpSv.js} +147 -22
  24. package/dist/agent-tools.js +1 -1
  25. package/dist/{agentTools-CrEWQ5st.js → agentTools-BU5crBtm.js} +3 -3
  26. package/dist/{canvasNoteTools-6BQYNCee.js → canvasNoteTools-DeSl4BAF.js} +2 -2
  27. package/dist/{code-editor-field-CoRq10k7.js → code-editor-field-CfP0QYUD.js} +1 -1
  28. package/dist/executions.js +2 -2
  29. package/dist/{flow-builder-Dwev-C_g.js → flow-builder-xokwiaT1.js} +16 -73
  30. package/dist/fluidgridsEvents-Dm5CaHtr.js +162 -0
  31. package/dist/history.js +1 -1
  32. package/dist/{index-6JR2vD9J.d.ts → index-D507rsk2.d.ts} +19 -19
  33. package/dist/index.d.ts +3 -2
  34. package/dist/index.js +31 -29
  35. package/dist/{node-detail-view-BFBSKj5w.js → node-detail-view-DGrDIjS-.js} +5 -5
  36. package/dist/{node-editor-tab-body-Cz9kOlxu.js → node-editor-tab-body-eOsmnUvx.js} +2 -2
  37. package/dist/observability.d.ts +1 -1
  38. package/dist/observability.js +2 -2
  39. package/dist/{popover-xPh0iIzy.js → popover-B1aKz7DC.js} +1 -1
  40. package/dist/{quick-config-panel-Ym05lyGn.js → quick-config-panel-Bc7isfv0.js} +3 -3
  41. package/dist/quota-Cdt8yz7N.js +152 -0
  42. package/dist/quota.d.ts +3 -0
  43. package/dist/quota.js +4 -0
  44. package/dist/runsQuota-DsniKiSg.d.ts +20 -0
  45. package/dist/runsQuota-DvXR6mRN.js +100 -0
  46. package/dist/{schedule-panel-54D5W5Qk.js → schedule-panel-BnqaUnnz.js} +153 -7
  47. package/dist/settings.js +1 -1
  48. package/dist/{sidebar-node-editor-LL3ofDN7.js → sidebar-node-editor-CdlEDGKh.js} +3 -3
  49. package/dist/templates.js +2 -2
  50. package/dist/{uiMarkTools-nlmzsHQM.js → uiMarkTools-DZ6akjQK.js} +1 -1
  51. package/dist/useActionParam-B0ebTZmg.js +83 -0
  52. package/dist/{useDurableParity-BScby67i.js → useDurableParity-BApRraSO.js} +1 -1
  53. package/dist/{useExecutions-B0VzQcY2.js → useExecutions-C2a4EcvC.js} +2 -2
  54. package/dist/{useObservability-FfQGgW6W.js → useObservability-BmbeK5bG.js} +2 -2
  55. package/dist/{useRunHistory-BZJg72kd.js → useRunHistory-CqfDFRzr.js} +1 -1
  56. package/dist/{useWorkflowCodeExport-CUWMlJbi.js → useWorkflowCodeExport-DebpM48M.js} +1 -1
  57. package/dist/{useWorkflows-Czz5DlL0.js → useWorkflows-D1-rYzGK.js} +2 -2
  58. package/dist/workflow-builder.js +4 -4
  59. package/dist/workflow-pages.d.ts +1 -1
  60. package/dist/workflow-pages.js +15 -15
  61. package/dist/workflows-list.d.ts +6 -0
  62. package/dist/workflows-list.js +3 -2
  63. package/package.json +5 -1
  64. package/dist/fluidgridsEvents-CNdcrUNN.js +0 -310
@@ -1,19 +1,19 @@
1
1
  "use client";
2
- import { _ as throwIfResultError, m as describeOperationError, n as getFluidGridsClient, r as getFluidGridsClientSafe } from "./client-C9XSzSXr.js";
2
+ import { _ as throwIfResultError, m as describeOperationError, n as getFluidGridsClient, r as getFluidGridsClientSafe, x as getFluidGridsConfig } from "./client-C9XSzSXr.js";
3
3
  import { H as useFlowStore } from "./node-operation-selection--oy-yEq_.js";
4
- import { Bn as useBuilderReadOnly, G as asRecord, K as coerceNumber, U as useRunGuard, X as optionText, Y as nodeTitle, Z as paramsFromOperation, _n as openRunQuotaUpgradePrompt, at as resolveLoadOptionsSpec, ct as casesFromRules, dn as parseParameterValue, fn as structuredParameterType, ft as boundFieldsOf, gn as useFluidGridsAnalytics, hn as isParamVisible, it as optionListValues, nt as isStringOptionList, ot as ConditionTreeBuilder, pt as missingRequiredParameters, rt as optionListText, st as SwitchRulesEditor, t as FluidGridsContext, un as formatParameterValue, ut as parseMappingValue } from "./FluidGridsProvider-CbY91ZQq.js";
4
+ import { Bn as useBuilderReadOnly, G as asRecord, K as coerceNumber, U as useRunGuard, X as optionText, Y as nodeTitle, Z as paramsFromOperation, _n as openRunQuotaUpgradePrompt, at as resolveLoadOptionsSpec, ct as casesFromRules, dn as parseParameterValue, fn as structuredParameterType, ft as boundFieldsOf, gn as useFluidGridsAnalytics, hn as isParamVisible, it as optionListValues, nt as isStringOptionList, ot as ConditionTreeBuilder, pt as missingRequiredParameters, rt as optionListText, st as SwitchRulesEditor, t as FluidGridsContext, un as formatParameterValue, ut as parseMappingValue } from "./FluidGridsProvider-CWyQ8ziM.js";
5
5
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
6
- import { y as useGlobalStoreClient } from "./TemplateCard-HIMsb47R.js";
6
+ import { y as useGlobalStoreClient } from "./TemplateCard-6W2q2wiK.js";
7
7
  import { Cr as WorkflowCallInputsDocument, Ct as ListenForWebhookTestEventDocument, Rn as StopWebhookTestListenerDocument, Vt as PreviewScheduleDocument, pr as WebhookTestListenerDocument } from "./graphql-operation-types-kX-MMjgW.js";
8
8
  import { t as useAgentDefinitionList, vt as useRunFromNodeEligibilityQuery } from "./useAgentDefinitions-B0dam3_o.js";
9
- import { g as collectExtensions } from "./fluidgridsEvents-CNdcrUNN.js";
9
+ import { a as collectExtensions } from "./quota-Cdt8yz7N.js";
10
10
  import { PD as ScheduleType, VF as WorkflowScheduleOverlapPolicy } from "./graphql-types-CDKVWH2R.js";
11
11
  import { C as rowsFromRules, S as readAssertRulesSetting, _ as ASSERT_OPERATORS, b as normaliseAssertRules, v as describeAssertRuleProblem, w as ruleFromRow, x as operatorSpec, y as emptyAssertRuleRow } from "./WorkflowProposalCard-qrEeNyYG.js";
12
12
  import { r as describeRule, s as isAgentNodeType } from "./agent-form-Bfvm32j1.js";
13
13
  import { i as NativeSelect, o as StatusPill, t as FieldError, u as useResource } from "./shared-CMfn30xT.js";
14
14
  import { L as triggerSchedule, T as pauseSchedule, t as backfillSchedule, u as describeSchedule, z as unpauseSchedule } from "./api-BrCHB5oA.js";
15
- import { a as ConnectionSelector, i as RunOnSection, n as PopoverContent$1, r as PopoverTrigger$1, t as Popover$1 } from "./popover-xPh0iIzy.js";
16
- import { r as normalizeCodeLanguage, t as CodeEditorField } from "./code-editor-field-CoRq10k7.js";
15
+ import { a as ConnectionSelector, i as RunOnSection, n as PopoverContent$1, r as PopoverTrigger$1, t as Popover$1 } from "./popover-B1aKz7DC.js";
16
+ import { r as normalizeCodeLanguage, t as CodeEditorField } from "./code-editor-field-CfP0QYUD.js";
17
17
  import { useCallback, useContext, useEffect, useId, useMemo, useRef, useState } from "react";
18
18
  import { Icon } from "@iconify/react";
19
19
  import { cn } from "@burdenoff/fe-libs/utils";
@@ -23,6 +23,7 @@ import { gql } from "@apollo/client";
23
23
  import { Button, Card, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, Input, Label, ResponsiveDialog, ResponsiveDialogContent, ResponsiveDialogDescription, ResponsiveDialogFooter, ResponsiveDialogHeader, ResponsiveDialogTitle, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Switch, Textarea } from "@burdenoff/fe-libs/ui";
24
24
  import { Button as Button$1 } from "@burdenoff/fe-libs/button";
25
25
  import { Plus, X } from "lucide-react";
26
+ import { createSharePrincipalLister } from "@burdenoff/fe-libs/connections";
26
27
  import cronstrue from "cronstrue";
27
28
  import { digest } from "ohash";
28
29
 
@@ -4077,6 +4078,144 @@ function TimeCampusTriggerSelect({ value, onChange, className, testId, label, in
4077
4078
  });
4078
4079
  }
4079
4080
 
4081
+ // src/builder/components/ndv/approver-fields.ts
4082
+ /**
4083
+ * The approvers field of "Send and Wait for Response" (BOFF-9956): which parameter gets the people
4084
+ * picker instead of a text box, and how picked people are stored. Pure so the rules are
4085
+ * unit-tested without React.
4086
+ *
4087
+ * The node stores approvers as user ids separated by commas (`responders`), the format the worker
4088
+ * has always read, so a workflow edited in the picker still runs on every worker version, and one
4089
+ * typed by hand or imported keeps working in the picker.
4090
+ */
4091
+ /** The node whose approvers get the picker. */
4092
+ const SEND_AND_WAIT_NODE_TYPE = "internal:send-and-wait";
4093
+ /** The parameter that holds the approvers' user ids. */
4094
+ const APPROVERS_FIELD = "responders";
4095
+ /** True when this parameter of this node renders the approver picker. */
4096
+ function isApproverPickerField(nodeType, fieldName) {
4097
+ return nodeType === "internal:send-and-wait" && fieldName === "responders";
4098
+ }
4099
+ /** The user ids in a stored value, in order and without repeats. */
4100
+ function approverIds(value) {
4101
+ let parts = [];
4102
+ if (Array.isArray(value)) parts = value;
4103
+ else if (typeof value === "string") parts = value.split(/[\n,]/);
4104
+ return [...new Set(parts.map((part) => typeof part === "string" ? part.trim() : "").filter(Boolean))];
4105
+ }
4106
+ /** The stored value with `id` added at the end (unchanged when it is already there). */
4107
+ function withApprover(value, id) {
4108
+ const ids = approverIds(value);
4109
+ const next = id.trim();
4110
+ if (next && !ids.includes(next)) ids.push(next);
4111
+ return ids.join(", ");
4112
+ }
4113
+ /** The stored value without `id`. */
4114
+ function withoutApprover(value, id) {
4115
+ return approverIds(value).filter((existing) => existing !== id).join(", ");
4116
+ }
4117
+
4118
+ // src/builder/components/ndv/approver-picker-field.tsx
4119
+ /**
4120
+ * People picker for the approvers of "Send and Wait for Response" (BOFF-9956).
4121
+ *
4122
+ * The field used to be free text holding user ids, which nobody knows by heart. The picker lists
4123
+ * the workspace's members by name (the same list the Share dialogs use) and stores the chosen ids
4124
+ * the way the node always has, comma separated. When the members cannot be listed (no permission,
4125
+ * the service is down) it falls back to the text box, so the node stays editable.
4126
+ */
4127
+ function defaultLister() {
4128
+ return createSharePrincipalLister(getFluidGridsClient());
4129
+ }
4130
+ function useWorkspaceMembers(listMembers) {
4131
+ const [state, setState] = useState({ status: "loading" });
4132
+ useEffect(() => {
4133
+ let mounted = true;
4134
+ const workspaceId = getFluidGridsConfig().workspaceId;
4135
+ (listMembers ?? defaultLister())(workspaceId).then((principals) => {
4136
+ if (mounted) setState({
4137
+ status: "ready",
4138
+ members: principals.filter((p) => p.principalType === "USER")
4139
+ });
4140
+ }).catch(() => {
4141
+ if (mounted) setState({ status: "failed" });
4142
+ });
4143
+ return () => {
4144
+ mounted = false;
4145
+ };
4146
+ }, [listMembers]);
4147
+ return state;
4148
+ }
4149
+ function ApproverPickerField({ value, onChange, label, className, testId, listMembers }) {
4150
+ const tr = useTr();
4151
+ const members = useWorkspaceMembers(listMembers);
4152
+ const chosen = approverIds(value);
4153
+ const byId = useMemo(() => new Map(members.status === "ready" ? members.members.map((member) => [member.principalId, member]) : []), [members]);
4154
+ if (members.status === "failed") return /* @__PURE__ */ jsxs("div", {
4155
+ className: "flex flex-col gap-1",
4156
+ "data-testid": testId,
4157
+ children: [/* @__PURE__ */ jsx("input", {
4158
+ type: "text",
4159
+ "aria-label": label,
4160
+ className,
4161
+ value: chosen.join(", "),
4162
+ onChange: (event) => onChange(event.target.value),
4163
+ "data-testid": `${testId}-text`
4164
+ }), /* @__PURE__ */ jsx("span", {
4165
+ className: "text-[11px] leading-snug text-status-warning-text",
4166
+ children: tr("fluidgrids.builder.approvers.loadFailed", "Could not list the workspace members. Enter user ids separated by commas.")
4167
+ })]
4168
+ });
4169
+ const chosenIds = new Set(chosen);
4170
+ const available = members.status === "ready" ? members.members.filter((member) => !chosenIds.has(member.principalId)) : [];
4171
+ return /* @__PURE__ */ jsxs("div", {
4172
+ className: "flex flex-col gap-1.5",
4173
+ "data-testid": testId,
4174
+ children: [chosen.length > 0 && /* @__PURE__ */ jsx("ul", {
4175
+ className: "flex flex-wrap gap-1.5",
4176
+ "aria-label": label,
4177
+ children: chosen.map((id) => {
4178
+ const name = byId.get(id)?.label ?? id;
4179
+ return /* @__PURE__ */ jsxs("li", {
4180
+ className: "flex items-center gap-1 rounded-md border border-border bg-muted px-2 py-0.5 text-xs text-foreground",
4181
+ "data-testid": `${testId}-chip`,
4182
+ children: [/* @__PURE__ */ jsx("span", {
4183
+ className: "max-w-48 truncate",
4184
+ title: byId.get(id)?.detail ?? id,
4185
+ children: name
4186
+ }), /* @__PURE__ */ jsx("button", {
4187
+ type: "button",
4188
+ onClick: () => onChange(withoutApprover(value, id)),
4189
+ "aria-label": tr("fluidgrids.builder.approvers.remove", "Remove {{name}}", { name }),
4190
+ className: "rounded text-muted-foreground hover:text-foreground focus-visible:outline-2 focus-visible:outline-primary",
4191
+ "data-testid": `${testId}-remove`,
4192
+ children: /* @__PURE__ */ jsx(Icon, {
4193
+ icon: "mdi:close",
4194
+ className: "size-3.5"
4195
+ })
4196
+ })]
4197
+ }, id);
4198
+ })
4199
+ }), /* @__PURE__ */ jsxs("select", {
4200
+ "aria-label": tr("fluidgrids.builder.approvers.add", "Add an approver"),
4201
+ className,
4202
+ value: "",
4203
+ disabled: members.status === "loading" || available.length === 0,
4204
+ onChange: (event) => {
4205
+ if (event.target.value) onChange(withApprover(value, event.target.value));
4206
+ },
4207
+ "data-testid": `${testId}-add`,
4208
+ children: [/* @__PURE__ */ jsx("option", {
4209
+ value: "",
4210
+ children: members.status === "loading" ? tr("fluidgrids.builder.approvers.loading", "Loading members…") : tr("fluidgrids.builder.approvers.add", "Add an approver")
4211
+ }), available.map((member) => /* @__PURE__ */ jsx("option", {
4212
+ value: member.principalId,
4213
+ children: member.detail ? `${member.label} (${member.detail})` : member.label
4214
+ }, member.principalId))]
4215
+ })]
4216
+ });
4217
+ }
4218
+
4080
4219
  // src/modules/channels/hooks/useChannels.ts
4081
4220
  /**
4082
4221
  * Custom hooks for fetching channels from global-channel-svc.
@@ -6331,9 +6470,10 @@ function NodeParamsForm({ config, nodeType, testIdPrefix = "ndv" }) {
6331
6470
  const booleanChecked = p.type === "boolean" && booleanParameterValue(fixedValue) === true;
6332
6471
  const isCodeParam = p.type === "code" || nodeType === "internal:code" && p.name === "code";
6333
6472
  const isChannelPicker = isChannelPickerField(nodeType, p.name);
6473
+ const isApproverPicker = isApproverPickerField(nodeType, p.name);
6334
6474
  const highlight = dragField === p.name;
6335
6475
  const controlId = `${formId}-param-${p.name}`;
6336
- const nativeControl = mode !== "expression" && !isCodeParam && !(structuredType && !optionList) && !p.loadOptions && !isChannelPicker && p.type !== "platform-event-module" && p.type !== "platform-event-record-type" && p.type !== "timecampus-time-trigger";
6476
+ const nativeControl = mode !== "expression" && !isCodeParam && !(structuredType && !optionList) && !p.loadOptions && !isChannelPicker && !isApproverPicker && p.type !== "platform-event-module" && p.type !== "platform-event-record-type" && p.type !== "timecampus-time-trigger";
6337
6477
  const inputCx = cn("w-full rounded-md border bg-background px-2.5 py-1.5 text-sm outline-none transition-colors disabled:opacity-50", highlight ? "border-primary ring-1 ring-primary" : "border-input focus:border-primary");
6338
6478
  return /* @__PURE__ */ jsxs("div", {
6339
6479
  className: "flex flex-col gap-1.5",
@@ -6419,6 +6559,12 @@ function NodeParamsForm({ config, nodeType, testIdPrefix = "ndv" }) {
6419
6559
  onChange: (v) => writeFixed(p.name, v),
6420
6560
  className: inputCx,
6421
6561
  testId: `${testIdPrefix}-param-${p.name}`
6562
+ }) : isApproverPicker ? /* @__PURE__ */ jsx(ApproverPickerField, {
6563
+ value: fixedValue,
6564
+ onChange: (next) => writeFixed(p.name, next),
6565
+ label: p.label ?? p.name,
6566
+ className: inputCx,
6567
+ testId: `${testIdPrefix}-param-${p.name}`
6422
6568
  }) : isChannelPicker ? /* @__PURE__ */ jsx(ChannelPickerField, {
6423
6569
  value: typeof fixedValue === "string" && fixedValue ? fixedValue : void 0,
6424
6570
  onSelect: channelSelectionHandler(params.map((f) => f.name), writeFixed),
package/dist/settings.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { t as SettingsPage } from "./SettingsPage-CXoKX0px.js";
2
+ import { t as SettingsPage } from "./SettingsPage-DI_vIG7t.js";
3
3
  import { t as ManagedAiPolicyAuthorityProvider } from "./ManagedAiPolicyAuthority-BxwJ3ptd.js";
4
4
 
5
5
  export { ManagedAiPolicyAuthorityProvider, SettingsPage };
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { A as nodeAccent, H as useFlowStore, j as NodeTypeIcon } from "./node-operation-selection--oy-yEq_.js";
3
- import { $ as useNodeConfig, Fn as getNodeDetail, J as nodeSubtitle, Y as nodeTitle, on as useNodeExecution } from "./FluidGridsProvider-CbY91ZQq.js";
4
- import { i as NodeInputFields, n as useNodeEditorTab, r as NodeEditorTabs, t as NodeEditorTabBody } from "./node-editor-tab-body-Cz9kOlxu.js";
5
- import { r as NodeExecutionActions } from "./schedule-panel-54D5W5Qk.js";
3
+ import { $ as useNodeConfig, Fn as getNodeDetail, J as nodeSubtitle, Y as nodeTitle, on as useNodeExecution } from "./FluidGridsProvider-CWyQ8ziM.js";
4
+ import { i as NodeInputFields, n as useNodeEditorTab, r as NodeEditorTabs, t as NodeEditorTabBody } from "./node-editor-tab-body-eOsmnUvx.js";
5
+ import { r as NodeExecutionActions } from "./schedule-panel-BnqaUnnz.js";
6
6
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
7
7
  import { useEffect, useState } from "react";
8
8
  import { Icon } from "@iconify/react";
package/dist/templates.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { t as TemplatesPage } from "./TemplatesPage-DBfL-ao9.js";
3
- import { t as TemplatePreview } from "./TemplatePreview-_wUMSwh_.js";
2
+ import { t as TemplatesPage } from "./TemplatesPage-Bvg6R2P9.js";
3
+ import { t as TemplatePreview } from "./TemplatePreview-Bb2f4enx.js";
4
4
 
5
5
  export { TemplatePreview, TemplatesPage };
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
3
- import { u as nodesOf } from "./fluidgridsEvents-CNdcrUNN.js";
3
+ import { u as nodesOf } from "./fluidgridsEvents-Dm5CaHtr.js";
4
4
  import { n as useAgentMarksStore } from "./marksStore-DGCXjTmZ.js";
5
5
  import { useEffect, useState } from "react";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -0,0 +1,83 @@
1
+ "use client";
2
+ import { useCallback, useEffect, useRef } from "react";
3
+ import { useSearchParams } from "react-router";
4
+
5
+ // src/hooks/useActionParam.ts
6
+ /**
7
+ * One-shot `?action=` links (BOFF-10854).
8
+ *
9
+ * The shell's "+ New" menu links to pages with an action in the query string,
10
+ * e.g. `/workflows/list?action=import`. The page opens the matching dialog
11
+ * once and then removes the parameter (history replace), so reload, back and
12
+ * a later re-render do not open it again.
13
+ *
14
+ * const request = useActionParam("import", importPermission);
15
+ * <WorkflowImportDialog
16
+ * openRequested={request.requested}
17
+ * onOpenRequestHandled={request.handled}
18
+ * />
19
+ */
20
+ const ACTION_PARAM = "action";
21
+ /** Values the fe-sdk pages act on. */
22
+ const ACTION_PARAM_VALUES = {
23
+ /** Workflows list: the workflow import dialog. */
24
+ import: "import",
25
+ /** Workflows list: the create-folder dialog. */
26
+ newFolder: "new-folder",
27
+ /** Data tables: the create-table dialog. */
28
+ new: "new"
29
+ };
30
+ const OPEN_GATE = {
31
+ allowed: true,
32
+ isLoading: false
33
+ };
34
+ /** Returns a copy of `params` without the action parameter. */
35
+ function withoutActionParam(params) {
36
+ const next = new URLSearchParams(params);
37
+ next.delete(ACTION_PARAM);
38
+ return next;
39
+ }
40
+ /**
41
+ * Watches `?action=<action>`. While `gate` is loading the request waits; when
42
+ * the gate denies it the parameter is dropped without opening anything (the
43
+ * page's own button already explains the missing permission).
44
+ */
45
+ function useActionParam(action, gate = OPEN_GATE) {
46
+ const [searchParams, setSearchParams] = useSearchParams();
47
+ const present = searchParams.get(ACTION_PARAM) === action;
48
+ const handled = useCallback(() => {
49
+ setSearchParams((prev) => withoutActionParam(prev), { replace: true });
50
+ }, [setSearchParams]);
51
+ const denied = present && !gate.isLoading && !gate.allowed;
52
+ useEffect(() => {
53
+ if (denied) handled();
54
+ }, [denied, handled]);
55
+ return {
56
+ requested: present && !gate.isLoading && gate.allowed,
57
+ handled
58
+ };
59
+ }
60
+ /**
61
+ * Fires `open` then `onHandled` once each time `requested` turns true. A
62
+ * change of callback identity while the request is still pending (the URL
63
+ * update has not landed yet) does not fire it again.
64
+ */
65
+ function useOpenRequest(requested, open, onHandled) {
66
+ const fired = useRef(false);
67
+ useEffect(() => {
68
+ if (!requested) {
69
+ fired.current = false;
70
+ return;
71
+ }
72
+ if (fired.current) return;
73
+ fired.current = true;
74
+ open();
75
+ onHandled?.();
76
+ }, [
77
+ requested,
78
+ open,
79
+ onHandled
80
+ ]);
81
+ }
82
+
83
+ export { useOpenRequest as i, ACTION_PARAM_VALUES as n, useActionParam as r, ACTION_PARAM as t };
@@ -2,7 +2,7 @@
2
2
  import { _ as throwIfResultError, m as describeOperationError, n as getFluidGridsClient } from "./client-C9XSzSXr.js";
3
3
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
4
4
  import { $r as WorkflowRunPendingDocument, Qr as WorkflowRunMetadataDocument, jn as SetWorkflowRunVersioningOverrideDocument, ni as WorkflowRunsCountDocument, tt as DurableParityRunFieldsDocument } from "./graphql-operation-types-kX-MMjgW.js";
5
- import { _ as statusCountFilter, d as STATUS_COUNT_GROUP_BY, v as statusCountsOf } from "./useExecutions-B0VzQcY2.js";
5
+ import { _ as statusCountFilter, d as STATUS_COUNT_GROUP_BY, v as statusCountsOf } from "./useExecutions-C2a4EcvC.js";
6
6
  import { useCallback, useEffect, useRef, useState } from "react";
7
7
  import { Icon } from "@iconify/react";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -3,8 +3,8 @@ import { N as useExecutionsStore, _ as throwIfResultError, d as emitFluidGridsEv
3
3
  import { Gn as TerminateExecutionDocument, Lt as PauseExecutionDocument, cn as RetryNodeDocument, ct as ExecutionStatsDocument, lt as ExecutionsListDocument, ot as ExecutionDetailDocument, qn as TriggerWorkflowDocument, sn as ResumeExecutionDocument, v as CancelExecutionDocument } from "./graphql-operation-types-kX-MMjgW.js";
4
4
  import { hD as RunGroupBy, yP as VersioningBehavior } from "./graphql-types-CDKVWH2R.js";
5
5
  import { c as REPLAY_WORKFLOW_RUN, l as RETRY_WORKFLOW_RUNS } from "./operations-HU-xb78H.js";
6
- import { _n as openRunQuotaUpgradePrompt, gn as useFluidGridsAnalytics } from "./FluidGridsProvider-CbY91ZQq.js";
7
- import { i as emitRunStarted } from "./fluidgridsEvents-CNdcrUNN.js";
6
+ import { _n as openRunQuotaUpgradePrompt, gn as useFluidGridsAnalytics } from "./FluidGridsProvider-CWyQ8ziM.js";
7
+ import { i as emitRunStarted } from "./fluidgridsEvents-Dm5CaHtr.js";
8
8
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
9
9
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
10
10
 
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { _ as throwIfResultError, d as emitFluidGridsEvent, m as describeOperationError, n as getFluidGridsClient } from "./client-C9XSzSXr.js";
3
- import { _n as openRunQuotaUpgradePrompt, gn as useFluidGridsAnalytics } from "./FluidGridsProvider-CbY91ZQq.js";
3
+ import { _n as openRunQuotaUpgradePrompt, gn as useFluidGridsAnalytics } from "./FluidGridsProvider-CWyQ8ziM.js";
4
4
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
5
- import { i as emitRunStarted } from "./fluidgridsEvents-CNdcrUNN.js";
5
+ import { i as emitRunStarted } from "./fluidgridsEvents-Dm5CaHtr.js";
6
6
  import { a as OBSERVABILITY_DATA_SINKS, c as REPLAY_WORKFLOW_RUN, d as UPDATE_LOG_STREAM_DESTINATION, i as OBSERVABILITY_DASHBOARD_SUMMARY, l as RETRY_WORKFLOW_RUNS, n as DELETE_LOG_STREAM_DESTINATION, o as OBSERVABILITY_DATA_SINK_DATA, r as LOG_STREAM_DESTINATIONS, s as OBSERVABILITY_FAILED_RUNS, t as CREATE_LOG_STREAM_DESTINATION, u as TEST_LOG_STREAM_DESTINATION } from "./operations-HU-xb78H.js";
7
7
  import { useCallback, useEffect, useState } from "react";
8
8
 
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { _ as throwIfResultError, m as describeOperationError, n as getFluidGridsClient, r as getFluidGridsClientSafe } from "./client-C9XSzSXr.js";
3
- import { Dn as payloadFromCardValues, En as parseRawSignalPayload, kn as signalPayloadCard } from "./FluidGridsProvider-CbY91ZQq.js";
3
+ import { Dn as payloadFromCardValues, En as parseRawSignalPayload, kn as signalPayloadCard } from "./FluidGridsProvider-CWyQ8ziM.js";
4
4
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
5
5
  import { Kn as TerminateWorkflowRunDocument, Kr as WorkflowRunDeterminismStatusDocument, Nn as SignalWorkflowRunDocument, Zr as WorkflowRunHistoryDocument, ei as WorkflowRunStackTraceDocument, mn as RunEventAppendedDocument, nt as DurableRunFieldsDocument } from "./graphql-operation-types-kX-MMjgW.js";
6
6
  import { yd as ExecutionKind } from "./graphql-types-CDKVWH2R.js";
@@ -2,7 +2,7 @@
2
2
  import { _ as throwIfResultError, m as describeOperationError, n as getFluidGridsClient } from "./client-C9XSzSXr.js";
3
3
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
4
4
  import { dt as ExportWorkflowCodeDocument } from "./graphql-operation-types-kX-MMjgW.js";
5
- import { t as QuotaExhaustedDialog } from "./QuotaExhaustedDialog-DWm_YWL7.js";
5
+ import { t as QuotaExhaustedDialog } from "./QuotaExhaustedDialog-ChBoJnRo.js";
6
6
  import { CF as WorkflowExportFormat, Fd as FidelityLevel } from "./graphql-types-CDKVWH2R.js";
7
7
  import { useCallback, useEffect, useRef, useState } from "react";
8
8
  import { jsx } from "react/jsx-runtime";
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import { _ as throwIfResultError, d as emitFluidGridsEvent, f as emitOperationErrorEvent, n as getFluidGridsClient, x as getFluidGridsConfig } from "./client-C9XSzSXr.js";
3
3
  import { $ as DuplicateWorkflowDocument, A as CreateWorkflowDefinitionDocument, B as DeactivateWorkflowDefinitionDocument, Bt as PreviewN8nImportDocument, Dr as WorkflowDefinitionForBuilderDocument, Er as WorkflowDefinitionDocument, L as CreateWorkflowVersionDocument, Or as WorkflowDefinitionsDocument, R as DashboardSummaryDocument, Si as WorkflowVersionsDocument, W as DeleteWorkflowDefinitionDocument, bt as ImportWorkflowDocument, n as ActivateWorkflowDefinitionDocument, on as RestoreWorkflowVersionDocument, or as UpdateWorkflowDefinitionDocument, qn as TriggerWorkflowDocument, qr as WorkflowRunDocument, ri as WorkflowRunsDocument } from "./graphql-operation-types-kX-MMjgW.js";
4
- import { _n as openRunQuotaUpgradePrompt, gn as useFluidGridsAnalytics } from "./FluidGridsProvider-CbY91ZQq.js";
4
+ import { _n as openRunQuotaUpgradePrompt, gn as useFluidGridsAnalytics } from "./FluidGridsProvider-CWyQ8ziM.js";
5
5
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
6
- import { d as runTriggerFromMode, i as emitRunStarted, l as emitWorkflowPublished, s as emitWorkflowCreated } from "./fluidgridsEvents-CNdcrUNN.js";
6
+ import { d as runTriggerFromMode, i as emitRunStarted, l as emitWorkflowPublished, s as emitWorkflowCreated } from "./fluidgridsEvents-Dm5CaHtr.js";
7
7
  import { s as takePrefetchedWorkflowForBuilder } from "./workflowRouteData-BkfVOc-O.js";
8
8
  import { useCallback, useEffect, useMemo, useState } from "react";
9
9
 
@@ -1,8 +1,8 @@
1
1
  "use client";
2
- import { n as WorkflowBuilderCore, t as WorkflowBuilder } from "./WorkflowBuilder-CYmpQtIQ.js";
3
- import { t as WorkflowBuilder$1 } from "./WorkflowBuilder-CMZi6wQE.js";
2
+ import { n as WorkflowBuilderCore, t as WorkflowBuilder } from "./WorkflowBuilder-TgKSGNlu.js";
3
+ import { t as WorkflowBuilder$1 } from "./WorkflowBuilder-CabLzwS5.js";
4
4
  import { H as useFlowStore } from "./node-operation-selection--oy-yEq_.js";
5
- import { m as refetchStoreNodes } from "./FluidGridsProvider-CbY91ZQq.js";
6
- import { t as WorkflowSearchRedirect } from "./WorkflowSearchRedirect-iWzvY9Qo.js";
5
+ import { m as refetchStoreNodes } from "./FluidGridsProvider-CWyQ8ziM.js";
6
+ import { t as WorkflowSearchRedirect } from "./WorkflowSearchRedirect-33Vs4FKc.js";
7
7
 
8
8
  export { WorkflowBuilder, WorkflowBuilderCore, WorkflowBuilder$1 as WorkflowBuilderPage, WorkflowSearchRedirect, refetchStoreNodes, useFlowStore };
@@ -2,7 +2,7 @@
2
2
  import { n as WorkflowsList_d_exports } from "./WorkflowsList-CcNDQge5.js";
3
3
  import { a as WorkflowSearchRedirect_d_exports, o as WorkflowBuilder } from "./index-DjiFgEQl.js";
4
4
  import { i as TemplatePreview_d_exports, n as TemplatesPage_d_exports } from "./TemplatesPage-BG3H-6v6.js";
5
- import { Li as ApprovalInboxPage_d_exports, Qi as RunnersPage_d_exports, Sa as VariablesPage_d_exports, cAa as InsightsPageProps, dAa as DataSinkDashboardPage_d_exports, gi as DataTablesPage_d_exports, jAa as AiStudioPage_d_exports, lAa as InsightsPage_d_exports, qi as TaskQueuesPage_d_exports } from "./index-6JR2vD9J.js";
5
+ import { OAa as AiStudioPage_d_exports, Pi as ApprovalInboxPage_d_exports, Wi as TaskQueuesPage_d_exports, Yi as RunnersPage_d_exports, aAa as InsightsPageProps, cAa as DataSinkDashboardPage_d_exports, di as DataTablesPage_d_exports, oAa as InsightsPage_d_exports, ya as VariablesPage_d_exports } from "./index-D507rsk2.js";
6
6
  import { i as ExecutionsListPage_d_exports, n as ExecutionDetailPage_d_exports } from "./ExecutionDetailPage-DvQ667OE.js";
7
7
  import { n as HistoryPage_d_exports } from "./HistoryPage-BLoRpJ1R.js";
8
8
  import { n as NodesPage_d_exports } from "./NodesPage-DEbnz9iU.js";
@@ -54,25 +54,25 @@ function createWorkflowPages(importers) {
54
54
  * loader, so it costs a host's first load about a kilobyte.
55
55
  */
56
56
  const pages = createWorkflowPages({
57
- WorkflowsList: () => import("./WorkflowsList-C8aoqtRE.js").then((n) => n.n),
58
- WorkflowBuilderPage: () => import("./WorkflowBuilder-CMZi6wQE.js").then((n) => n.n).then((m) => ({ WorkflowBuilderPage: m.WorkflowBuilder })),
59
- WorkflowSearchRedirect: () => import("./WorkflowSearchRedirect-iWzvY9Qo.js").then((n) => n.n),
60
- TemplatePreview: () => import("./TemplatePreview-_wUMSwh_.js").then((n) => n.n),
61
- AiStudioPage: () => import("./AiStudioPage-CJdzRL26.js").then((n) => n.n),
62
- ExecutionsListPage: () => import("./ExecutionsListPage-DwJQfDPt.js").then((n) => n.n),
63
- ExecutionDetailPage: () => import("./ExecutionDetailPage-DKp421Fj.js").then((n) => n.n),
64
- HistoryPage: () => import("./HistoryPage-BLXZJDoJ.js").then((n) => n.n),
65
- TemplatesPage: () => import("./TemplatesPage-DBfL-ao9.js").then((n) => n.n),
57
+ WorkflowsList: () => import("./WorkflowsList-C3bHLpSv.js").then((n) => n.n),
58
+ WorkflowBuilderPage: () => import("./WorkflowBuilder-CabLzwS5.js").then((n) => n.n).then((m) => ({ WorkflowBuilderPage: m.WorkflowBuilder })),
59
+ WorkflowSearchRedirect: () => import("./WorkflowSearchRedirect-33Vs4FKc.js").then((n) => n.n),
60
+ TemplatePreview: () => import("./TemplatePreview-Bb2f4enx.js").then((n) => n.n),
61
+ AiStudioPage: () => import("./AiStudioPage-CLrMe8v8.js").then((n) => n.n),
62
+ ExecutionsListPage: () => import("./ExecutionsListPage-D63aCXJH.js").then((n) => n.n),
63
+ ExecutionDetailPage: () => import("./ExecutionDetailPage-DmICvIpH.js").then((n) => n.n),
64
+ HistoryPage: () => import("./HistoryPage-CNXgUMb0.js").then((n) => n.n),
65
+ TemplatesPage: () => import("./TemplatesPage-Bvg6R2P9.js").then((n) => n.n),
66
66
  NodesPage: () => import("./NodesPage-Bf5PhfBK.js").then((n) => n.n),
67
- SettingsPage: () => import("./SettingsPage-CXoKX0px.js").then((n) => n.n),
68
- InsightsPage: () => import("./InsightsPage-ChnoW5U4.js").then((n) => n.r),
69
- ErrorAnalyticsPage: () => import("./InsightsPage-ChnoW5U4.js").then((n) => n.r),
70
- DataSinkDashboardPage: () => import("./DataSinkDashboardPage-hrwQSvks.js").then((n) => n.n),
67
+ SettingsPage: () => import("./SettingsPage-DI_vIG7t.js").then((n) => n.n),
68
+ InsightsPage: () => import("./InsightsPage-Duo83yAM.js").then((n) => n.r),
69
+ ErrorAnalyticsPage: () => import("./InsightsPage-Duo83yAM.js").then((n) => n.r),
70
+ DataSinkDashboardPage: () => import("./DataSinkDashboardPage-DDvNPS8Z.js").then((n) => n.n),
71
71
  VariablesPage: () => import("./VariablesPage-67WR_lVE.js").then((n) => n.n),
72
72
  RunnersPage: () => import("./RunnersPage-CLCOCclc.js").then((n) => n.n),
73
73
  TaskQueuesPage: () => import("./TaskQueuesPage-9VgSnLdL.js").then((n) => n.r),
74
- ApprovalInboxPage: () => import("./ApprovalInboxPage-dbBDSJ-f.js").then((n) => n.n),
75
- DataTablesPage: () => import("./DataTablesPage-BZy2z0LB.js").then((n) => n.n)
74
+ ApprovalInboxPage: () => import("./ApprovalInboxPage-D8vhnloO.js").then((n) => n.n),
75
+ DataTablesPage: () => import("./DataTablesPage-BpnF13UT.js").then((n) => n.n)
76
76
  });
77
77
  /** Every workflow page this entry exports. */
78
78
  const WORKFLOW_PAGE_NAMES = pages.names;
@@ -1,3 +1,9 @@
1
1
 
2
2
  import { t as WorkflowsList } from "./WorkflowsList-CcNDQge5.js";
3
+ export declare const ACTION_PARAM = "action";
4
+ export declare const ACTION_PARAM_VALUES: {
5
+ readonly import: "import";
6
+ readonly newFolder: "new-folder";
7
+ readonly new: "new";
8
+ };
3
9
  export { WorkflowsList };
@@ -1,4 +1,5 @@
1
1
  "use client";
2
- import { t as WorkflowsList } from "./WorkflowsList-C8aoqtRE.js";
2
+ import { t as WorkflowsList } from "./WorkflowsList-C3bHLpSv.js";
3
+ import { n as ACTION_PARAM_VALUES, t as ACTION_PARAM } from "./useActionParam-B0ebTZmg.js";
3
4
 
4
- export { WorkflowsList };
5
+ export { ACTION_PARAM, ACTION_PARAM_VALUES, WorkflowsList };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/fluidgrids-fe-sdk",
3
- "version": "2026.1111.21",
3
+ "version": "2026.1111.23",
4
4
  "description": "FluidGrids Workflow Builder SDK - Embeddable visual workflow automation",
5
5
  "type": "module",
6
6
  "imports": {
@@ -74,6 +74,10 @@
74
74
  "types": "./dist/flags.d.ts",
75
75
  "import": "./dist/flags.js"
76
76
  },
77
+ "./quota": {
78
+ "types": "./dist/quota.d.ts",
79
+ "import": "./dist/quota.js"
80
+ },
77
81
  "./styles.css": "./dist/styles.css"
78
82
  },
79
83
  "files": [