@burdenoff/fluidgrids-fe-sdk 2026.1028.13 → 2026.1028.14

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.
@@ -1,11 +1,12 @@
1
- export { ExecutionDetailPage } from './chunk-REDNZ462.js';
1
+ export { ExecutionDetailPage } from './chunk-5GTYHWI5.js';
2
2
  import './chunk-BMX4T263.js';
3
3
  import './chunk-5PSRTFKK.js';
4
4
  import './chunk-37HLOFQ3.js';
5
5
  import './chunk-2PC6JUR6.js';
6
6
  import './chunk-5ERAJC2I.js';
7
- import './chunk-7SPZBRP2.js';
7
+ import './chunk-S3GSHZAT.js';
8
8
  import './chunk-6T5EBO7G.js';
9
+ import './chunk-Y53CVZVV.js';
9
10
  import './chunk-D3UWK7GY.js';
10
11
  import './chunk-PJAWNFJV.js';
11
12
  import './chunk-DOPSPCO3.js';
@@ -1,13 +1,14 @@
1
- export { WorkflowBuilder } from './chunk-CCMDFFBC.js';
1
+ export { WorkflowBuilder } from './chunk-6EOFGYLJ.js';
2
2
  import './chunk-TWRWHIMY.js';
3
- import './chunk-EA4EIU6Y.js';
3
+ import './chunk-MXIFE266.js';
4
4
  import './chunk-GEMNVFPK.js';
5
5
  import './chunk-IEVSFCFS.js';
6
6
  import './chunk-YXMFRQYV.js';
7
7
  import './chunk-BQXVT32O.js';
8
8
  import './chunk-QLBQDRQZ.js';
9
- import './chunk-7SPZBRP2.js';
9
+ import './chunk-S3GSHZAT.js';
10
10
  import './chunk-6T5EBO7G.js';
11
+ import './chunk-Y53CVZVV.js';
11
12
  import './chunk-U5BSQBUC.js';
12
13
  import './chunk-DOPSPCO3.js';
13
14
  import './chunk-HKNZ7MVM.js';
@@ -1,87 +1,50 @@
1
- import { FC, ReactNode } from 'react';
1
+ export { F as FgEnumFilterSpec, a as FgFilterOption, b as FgPageControlsSpec, c as FgRegisterPageControls, d as FgTabsSpec, e as FluidGridsAssistantBridge, f as FluidGridsAssistantBridgeProps, u as useFluidGridsPageControls } from './pageControlsBridge-D6y36qi5.js';
2
+ import { FC, ComponentType, ReactNode } from 'react';
2
3
 
3
4
  /**
4
- * Assistant page-controls bridge (BOFF-8679 / BOFF-8988, P3).
5
+ * AI-credit balance bridge (BOFF-3732).
5
6
  *
6
- * The pages in this SDK can tell a host's assistant which controls they show
7
- * right now (tabs, filters, search), so a typed or spoken "show failed runs"
8
- * does exactly what a click on the page's own Status dropdown does.
7
+ * AI Studio surfaces (the builder's "Generate with AI" panel and the run
8
+ * detail's AI assistant) show the workspace's remaining FluidGrids AI credits
9
+ * before an action, and tell the host when an action may have spent some.
9
10
  *
10
- * The SDK deliberately does NOT import `@burdenoff/fe-libs/shared/assistant/*`:
11
- * many consumers pin an older fe-libs, and a runtime import would raise their
12
- * floor. Instead the host mounts {@link FluidGridsAssistantBridge} with a
13
- * `register` function (the host maps a spec onto its own assistant), and the
14
- * pages call {@link useFluidGridsPageControls}. The types below are structural
15
- * mirrors of the fe-libs `TabsSpec` / `EnumFilterSpec`, so a host can pass a
16
- * spec straight into `tabsOf` / `enumFilter` with no conversion.
11
+ * Like the page-controls bridge, the SDK does NOT import
12
+ * `@burdenoff/fe-libs/shared/assistant`: many consumers pin an older fe-libs,
13
+ * and embedders have no shell to read a balance from. Instead:
14
+ * - the host mounts {@link FluidGridsAiCreditsBridge} with a `Balance`
15
+ * component (the fluidgrids-app passes the shared fe-libs `AiCreditBalance`
16
+ * bound to `fluidgrids`), and the SDK renders it where an AI action starts;
17
+ * - after an AI action settles the SDK dispatches the shared
18
+ * `fluidgrids:ai-credits-updated` window event (the same name fe-libs'
19
+ * `notifyAiCreditsUpdated("fluidgrids")` uses), so every balance on screen,
20
+ * the assistant panel's included, reads again.
17
21
  *
18
- * Contract:
19
- * - No provider mounted: every hook call is a no-op (the SDK works unchanged).
20
- * - A spec describes ONLY what the page shows on screen at this moment; a page
21
- * passes `null` while it shows no toolbar.
22
- * - Every `set` is the page's own state setter (the one its dropdown calls).
23
- * There is no submit, save, create, delete, run or retry in a spec.
24
- * - Pass a memoised spec; a new object every render re-registers every render.
22
+ * No provider mounted: the slot renders nothing and the SDK works unchanged.
25
23
  */
26
24
 
27
- /** One option of an enum filter, in the page's own words. */
28
- interface FgFilterOption {
29
- value: string;
30
- label: string;
25
+ /** Props the SDK passes to the host's balance component. */
26
+ interface FgAiCreditBalanceProps {
27
+ /** Layout classes from the mount point. */
28
+ className?: string;
29
+ /** Distinguishes the mounts in tests and in Playwright checks. */
30
+ testId?: string;
31
31
  }
32
- /** A single-choice filter (a dropdown or a chip group). */
33
- interface FgEnumFilterSpec {
34
- id: string;
35
- /** The filter's own name on the page ("Status"). */
36
- label: string;
37
- /**
38
- * The options the page offers. The NEUTRAL one ("All") must be included so
39
- * the host can clear the filter; the host does not list it as a choice.
40
- */
41
- options: readonly FgFilterOption[];
42
- /** The value that means "no filter". */
43
- neutral: string;
44
- /** The value applied now. */
45
- value: string;
46
- /** The page's own setter. */
47
- set(value: string): void;
48
- }
49
- interface FgTabsSpec {
50
- items: readonly {
51
- id: string;
52
- label: string;
53
- }[];
54
- /** The tab shown now. */
55
- value: string;
56
- /** The page's own setter. */
57
- set(id: string): void;
58
- }
59
- interface FgPageControlsSpec {
60
- /** The page's title in the product's words ("Workflows"). */
61
- page: string;
62
- tabs?: FgTabsSpec;
63
- filters?: readonly FgEnumFilterSpec[];
64
- /** The page's own search setter; `""` clears the search. */
65
- search?(query: string): void;
66
- }
67
- /** Registers a page's controls; the returned function removes exactly that registration. */
68
- type FgRegisterPageControls = (spec: FgPageControlsSpec) => () => void;
69
- interface FluidGridsAssistantBridgeProps {
70
- /**
71
- * The host's registration function. Give it a STABLE identity (a module
72
- * constant or `useCallback`): a new function every render re-registers the
73
- * mounted page every render.
74
- */
75
- register: FgRegisterPageControls;
32
+ /** The product key FluidGrids AI credits are charged under. */
33
+ declare const FLUIDGRIDS_AI_PRODUCT_KEY = "fluidgrids";
34
+ /** Window event a balance listens to; mirrors fe-libs `aiCreditsUpdatedEventName`. */
35
+ declare const FLUIDGRIDS_AI_CREDITS_UPDATED_EVENT = "fluidgrids:ai-credits-updated";
36
+ interface FluidGridsAiCreditsBridgeProps {
37
+ /** Renders the remaining balance; renders nothing when it is unknown. */
38
+ Balance: ComponentType<FgAiCreditBalanceProps>;
76
39
  children: ReactNode;
77
40
  }
78
- /** Context provider a host mounts around the FluidGrids routes. */
79
- declare const FluidGridsAssistantBridge: FC<FluidGridsAssistantBridgeProps>;
41
+ declare const FluidGridsAiCreditsBridge: FC<FluidGridsAiCreditsBridgeProps>;
42
+ /** Where an AI action starts: the host's balance, or nothing without a bridge. */
43
+ declare const AiCreditBalanceSlot: FC<FgAiCreditBalanceProps>;
80
44
  /**
81
- * Register a page's controls for as long as the calling component is mounted
82
- * (and `spec` is non-null). With no {@link FluidGridsAssistantBridge} above,
83
- * this does nothing.
45
+ * Tell every balance on screen that an AI action settled and may have spent
46
+ * credits. Safe outside a browser and without a bridge (nothing listens).
84
47
  */
85
- declare function useFluidGridsPageControls(spec: FgPageControlsSpec | null): void;
48
+ declare function notifyFluidGridsAiCreditsUpdated(): void;
86
49
 
87
- export { type FgEnumFilterSpec, type FgFilterOption, type FgPageControlsSpec, type FgRegisterPageControls, type FgTabsSpec, FluidGridsAssistantBridge, type FluidGridsAssistantBridgeProps, useFluidGridsPageControls };
50
+ export { AiCreditBalanceSlot, FLUIDGRIDS_AI_CREDITS_UPDATED_EVENT, FLUIDGRIDS_AI_PRODUCT_KEY, type FgAiCreditBalanceProps, FluidGridsAiCreditsBridge, type FluidGridsAiCreditsBridgeProps, notifyFluidGridsAiCreditsUpdated };
package/dist/assistant.js CHANGED
@@ -1,2 +1,3 @@
1
+ export { AiCreditBalanceSlot, FLUIDGRIDS_AI_CREDITS_UPDATED_EVENT, FLUIDGRIDS_AI_PRODUCT_KEY, FluidGridsAiCreditsBridge, notifyFluidGridsAiCreditsUpdated } from './chunk-Y53CVZVV.js';
1
2
  export { FluidGridsAssistantBridge, useFluidGridsPageControls } from './chunk-PJAWNFJV.js';
2
3
  import './chunk-62GWEYJ5.js';
@@ -2,7 +2,8 @@ import { buildNodeDisplayMap, ExecutionStatusBadge, formatRunVersion, NodeTimeli
2
2
  import { useExecution, useExecutionActions, useAutoRefresh } from './chunk-5PSRTFKK.js';
3
3
  import { fetchRunFailureClusters, OPEN_STATUSES, dismissRunFailureCluster, BUCKET_LABELS } from './chunk-37HLOFQ3.js';
4
4
  import { useRunPolicyDecisions, RunPolicyDecisions } from './chunk-2PC6JUR6.js';
5
- import { EntityTagPicker, useWorkflowProposal, WorkflowProposalCard } from './chunk-7SPZBRP2.js';
5
+ import { EntityTagPicker, useWorkflowProposal, WorkflowProposalCard } from './chunk-S3GSHZAT.js';
6
+ import { AiCreditBalanceSlot } from './chunk-Y53CVZVV.js';
6
7
  import { throwIfResultError, useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS } from './chunk-DV7N3UXU.js';
7
8
  import { getFluidGridsConfig } from './chunk-CY6KX4RG.js';
8
9
  import { RunLogsDocument, RunLogAppendedDocument, ExplainRunDocument } from './chunk-7PBOU7JC.js';
@@ -898,6 +899,9 @@ function RunAiAssistPanel({
898
899
  )
899
900
  ] })
900
901
  ] }),
902
+ canPropose && // BOFF-3732: the AI-credit balance before "Propose a fix" (the
903
+ // explanation is a read with no model call, so it spends nothing).
904
+ /* @__PURE__ */ jsx(AiCreditBalanceSlot, { className: "mt-2", testId: "run-ai-credit-balance" }),
901
905
  explainError && /* @__PURE__ */ jsx("p", { className: "mt-3 text-sm text-[var(--color-status-error-text)]", children: explainError }),
902
906
  explanation && /* @__PURE__ */ jsxs("div", { className: "mt-3 space-y-2", "data-testid": "run-ai-explanation", children: [
903
907
  /* @__PURE__ */ jsx("p", { className: "text-sm text-text-primary", children: explanation.cause }),
@@ -1,4 +1,4 @@
1
- import { Card, FluidGridsMark } from './chunk-EA4EIU6Y.js';
1
+ import { Card, FluidGridsMark } from './chunk-MXIFE266.js';
2
2
  import { Input } from './chunk-IEVSFCFS.js';
3
3
  import { Button } from './chunk-BQXVT32O.js';
4
4
  import { useWorkflowDefinition } from './chunk-U5BSQBUC.js';
@@ -1,5 +1,5 @@
1
1
  import { isGuidedTourIntent, pickGuidedTour, withoutGuidedTourIntent, isCreateIntent, CreateWorkflowRefusalDialog, decideMissingWorkflow } from './chunk-TWRWHIMY.js';
2
- import { useInstalledNodes, buildNodeCheck, FlowBuilderPage, buildRequiredNodeTypes } from './chunk-EA4EIU6Y.js';
2
+ import { useInstalledNodes, buildNodeCheck, FlowBuilderPage, buildRequiredNodeTypes } from './chunk-MXIFE266.js';
3
3
  import { useLazyWorkflowDefinition, useCreateWorkflow } from './chunk-U5BSQBUC.js';
4
4
  import { useFlowStore, refetchStoreNodes, BILLING_PLANS_PATH, mergeStickyNotes, blankWorkflowCreateInput, classifyCreateRefusal } from './chunk-DV7N3UXU.js';
5
5
  import { useTr } from './chunk-UULVIT25.js';
@@ -1,4 +1,4 @@
1
- import { useImportWorkflowTemplate, FlowBuilderPage, useWorkflowTemplates, TemplateCard } from './chunk-EA4EIU6Y.js';
1
+ import { useImportWorkflowTemplate, FlowBuilderPage, useWorkflowTemplates, TemplateCard } from './chunk-MXIFE266.js';
2
2
  import { QuotaExhaustedDialog } from './chunk-QLBQDRQZ.js';
3
3
  import { useWorkflowDefinitions, useDuplicateWorkflow } from './chunk-U5BSQBUC.js';
4
4
  import { templatesControls } from './chunk-D3UWK7GY.js';
@@ -3,7 +3,8 @@ import { Input } from './chunk-IEVSFCFS.js';
3
3
  import { Dialog as Dialog$1, DialogContent as DialogContent$1, DialogHeader as DialogHeader$1, DialogTitle as DialogTitle$1, DialogDescription as DialogDescription$1, DialogFooter } from './chunk-YXMFRQYV.js';
4
4
  import { Badge as Badge$1, Button } from './chunk-BQXVT32O.js';
5
5
  import { QuotaExhaustedDialog, useWorkflowCodeExport, orderedExportFiles, fileBaseName, downloadWorkflowCodeExport, isLosslessReport, sortFidelityItems, isLossyFidelityItem, lineOfNode } from './chunk-QLBQDRQZ.js';
6
- import { EntityTagPicker, useWorkflowProposal, WorkflowProposalCard } from './chunk-7SPZBRP2.js';
6
+ import { EntityTagPicker, useWorkflowProposal, WorkflowProposalCard } from './chunk-S3GSHZAT.js';
7
+ import { AiCreditBalanceSlot } from './chunk-Y53CVZVV.js';
7
8
  import { useRestoreWorkflowVersion, useWorkflowVersions, useActivateWorkflow, useDeleteWorkflow, useLazyWorkflowDefinition, useDeactivateWorkflow } from './chunk-U5BSQBUC.js';
8
9
  import { isAgentNodeType, AgentDefinitionSelectField } from './chunk-HKNZ7MVM.js';
9
10
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
@@ -45021,6 +45022,7 @@ function AiDraftPanel({
45021
45022
  )
45022
45023
  }
45023
45024
  ),
45025
+ /* @__PURE__ */ jsx(AiCreditBalanceSlot, { testId: "ai-draft-credit-balance" }),
45024
45026
  /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
45025
45027
  /* @__PURE__ */ jsxs(
45026
45028
  Button$1,
@@ -1,4 +1,5 @@
1
1
  import { useEntityTags, useTagEntity, useUntagEntity } from './chunk-6T5EBO7G.js';
2
+ import { notifyFluidGridsAiCreditsUpdated } from './chunk-Y53CVZVV.js';
2
3
  import { throwIfResultError } from './chunk-DV7N3UXU.js';
3
4
  import { getFluidGridsConfig } from './chunk-CY6KX4RG.js';
4
5
  import { WorkflowProposalDocument, ProposeRunFixDocument, ProposeWorkflowChangeDocument, ApplyWorkflowProposalDocument, RejectWorkflowProposalDocument, CancelWorkflowProposalDocument } from './chunk-7PBOU7JC.js';
@@ -191,6 +192,8 @@ function useWorkflowProposal() {
191
192
  return;
192
193
  }
193
194
  setTimedOut(true);
195
+ } else {
196
+ notifyFluidGridsAiCreditsUpdated();
194
197
  }
195
198
  setIsWorking(false);
196
199
  } catch (pollError) {
@@ -0,0 +1,20 @@
1
+ import { createContext, useContext } from 'react';
2
+ import { jsx } from 'react/jsx-runtime';
3
+
4
+ var FLUIDGRIDS_AI_PRODUCT_KEY = "fluidgrids";
5
+ var FLUIDGRIDS_AI_CREDITS_UPDATED_EVENT = `${FLUIDGRIDS_AI_PRODUCT_KEY}:ai-credits-updated`;
6
+ var BalanceContext = createContext(null);
7
+ var FluidGridsAiCreditsBridge = ({
8
+ Balance,
9
+ children
10
+ }) => /* @__PURE__ */ jsx(BalanceContext.Provider, { value: Balance, children });
11
+ var AiCreditBalanceSlot = (props) => {
12
+ const Balance = useContext(BalanceContext);
13
+ return Balance ? /* @__PURE__ */ jsx(Balance, { ...props }) : null;
14
+ };
15
+ function notifyFluidGridsAiCreditsUpdated() {
16
+ if (typeof window === "undefined") return;
17
+ window.dispatchEvent(new CustomEvent(FLUIDGRIDS_AI_CREDITS_UPDATED_EVENT));
18
+ }
19
+
20
+ export { AiCreditBalanceSlot, FLUIDGRIDS_AI_CREDITS_UPDATED_EVENT, FLUIDGRIDS_AI_PRODUCT_KEY, FluidGridsAiCreditsBridge, notifyFluidGridsAiCreditsUpdated };
@@ -1,13 +1,14 @@
1
1
  import './chunk-AD3BXTJS.js';
2
2
  export { ExecutionsListPage } from './chunk-H2YOX3DI.js';
3
- export { ExecutionDetailPage } from './chunk-REDNZ462.js';
3
+ export { ExecutionDetailPage } from './chunk-5GTYHWI5.js';
4
4
  import './chunk-BMX4T263.js';
5
5
  import './chunk-5PSRTFKK.js';
6
6
  import './chunk-37HLOFQ3.js';
7
7
  import './chunk-2PC6JUR6.js';
8
8
  import './chunk-5ERAJC2I.js';
9
- import './chunk-7SPZBRP2.js';
9
+ import './chunk-S3GSHZAT.js';
10
10
  import './chunk-6T5EBO7G.js';
11
+ import './chunk-Y53CVZVV.js';
11
12
  import './chunk-U5BSQBUC.js';
12
13
  import './chunk-D3UWK7GY.js';
13
14
  import './chunk-PJAWNFJV.js';
package/dist/index.d.ts CHANGED
@@ -32,7 +32,7 @@ import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
32
32
  import * as SwitchPrimitives from '@radix-ui/react-switch';
33
33
  import * as PopoverPrimitive from '@radix-ui/react-popover';
34
34
  import { ClassValue } from 'clsx';
35
- export { FgEnumFilterSpec, FgFilterOption, FgPageControlsSpec, FgRegisterPageControls, FgTabsSpec, FluidGridsAssistantBridge, FluidGridsAssistantBridgeProps, useFluidGridsPageControls } from './assistant.js';
35
+ export { F as FgEnumFilterSpec, a as FgFilterOption, b as FgPageControlsSpec, c as FgRegisterPageControls, d as FgTabsSpec, e as FluidGridsAssistantBridge, f as FluidGridsAssistantBridgeProps, u as useFluidGridsPageControls } from './pageControlsBridge-D6y36qi5.js';
36
36
  import { AnyDefinedAgentTool } from '@burdenoff/fe-libs/shared/agent-tools';
37
37
  import 'zustand';
38
38
 
package/dist/index.js CHANGED
@@ -1,12 +1,12 @@
1
1
  export { Label } from './chunk-VTQVPNUQ.js';
2
- export { WorkflowBuilder, WorkflowBuilderCore, WorkflowSearchRedirect } from './chunk-7SZLEQ5G.js';
3
- export { GuidedTourStarter, WorkflowBuilder as WorkflowBuilderPage } from './chunk-CCMDFFBC.js';
2
+ export { WorkflowBuilder, WorkflowBuilderCore, WorkflowSearchRedirect } from './chunk-5KUVIH7Y.js';
3
+ export { GuidedTourStarter, WorkflowBuilder as WorkflowBuilderPage } from './chunk-6EOFGYLJ.js';
4
4
  export { FirstWorkflowChecklist, FirstWorkflowChecklistView, WorkflowsList, useCreateWorkflowFirst } from './chunk-7UTDL7HD.js';
5
5
  export { CreateWorkflowRefusalDialog, GUIDED_FIRST_WORKFLOW_NAV, GUIDED_FIRST_WORKFLOW_STATE, GUIDED_TOUR_STATE, firstWorkflowProgress, isGuidedTourIntent, pickGuidedTour } from './chunk-TWRWHIMY.js';
6
6
  import './chunk-AD3BXTJS.js';
7
7
  export { ExecutionsListPage } from './chunk-H2YOX3DI.js';
8
- import { usePendingHumanRequests, HumanRequestCard } from './chunk-REDNZ462.js';
9
- export { ExecutionDetailPage, HumanRequestCard, RunHumanRequests, usePendingHumanRequests, useRespondToHumanRequest, useRunHumanRequests } from './chunk-REDNZ462.js';
8
+ import { usePendingHumanRequests, HumanRequestCard } from './chunk-5GTYHWI5.js';
9
+ export { ExecutionDetailPage, HumanRequestCard, RunHumanRequests, usePendingHumanRequests, useRespondToHumanRequest, useRunHumanRequests } from './chunk-5GTYHWI5.js';
10
10
  import { TagFilterSelect } from './chunk-BMX4T263.js';
11
11
  import './chunk-5PSRTFKK.js';
12
12
  export { HistoryPage } from './chunk-5BY2LZH3.js';
@@ -17,19 +17,20 @@ export { SettingsPage } from './chunk-KWWVBB43.js';
17
17
  import './chunk-2PC6JUR6.js';
18
18
  export { useDataSinkData, useDataSinks, useInsightsData, useLogStreamDestinationActions, useLogStreamDestinations, useRunReplayActions } from './chunk-TEMQVTTJ.js';
19
19
  import './chunk-5ERAJC2I.js';
20
- import { ThemeProvider, extractTemplateGraph } from './chunk-KLAS43OH.js';
21
- export { TemplatePreview, TemplatesPage } from './chunk-KLAS43OH.js';
22
- import { external_exports, FlowBuilderPage, FluidGridsMark, useRunners, useRunnerActions, RunnerStatusPill, runnerInstallCommand } from './chunk-EA4EIU6Y.js';
23
- export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Popover, PopoverContent, PopoverTrigger, RUNNER_INSTALL_SCRIPT_URL, RunOnSection, RunnerStatusPill, RunsUsageMeter, RunsUsageMeterView, readRunsQuota, runnerInstallCommand, runsQuotaLevel, summarizeRunsQuota, useRunnerActions, useRunners, useRunsQuota } from './chunk-EA4EIU6Y.js';
20
+ import { ThemeProvider, extractTemplateGraph } from './chunk-7UHXZOZ3.js';
21
+ export { TemplatePreview, TemplatesPage } from './chunk-7UHXZOZ3.js';
22
+ import { external_exports, FlowBuilderPage, FluidGridsMark, useRunners, useRunnerActions, RunnerStatusPill, runnerInstallCommand } from './chunk-MXIFE266.js';
23
+ export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Popover, PopoverContent, PopoverTrigger, RUNNER_INSTALL_SCRIPT_URL, RunOnSection, RunnerStatusPill, RunsUsageMeter, RunsUsageMeterView, readRunsQuota, runnerInstallCommand, runsQuotaLevel, summarizeRunsQuota, useRunnerActions, useRunners, useRunsQuota } from './chunk-MXIFE266.js';
24
24
  import './chunk-GEMNVFPK.js';
25
25
  export { Input } from './chunk-IEVSFCFS.js';
26
26
  export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger } from './chunk-YXMFRQYV.js';
27
27
  export { Badge, Button, badgeVariants, buttonVariants } from './chunk-BQXVT32O.js';
28
28
  import './chunk-QLBQDRQZ.js';
29
- import { EntityTagPicker } from './chunk-7SPZBRP2.js';
30
- export { EntityTagPicker } from './chunk-7SPZBRP2.js';
29
+ import { EntityTagPicker } from './chunk-S3GSHZAT.js';
30
+ export { EntityTagPicker } from './chunk-S3GSHZAT.js';
31
31
  import { useDataTableTagOverlay, tagLabel } from './chunk-6T5EBO7G.js';
32
32
  export { FLUIDGRIDS_ENTITY_TYPES, tagLabel, useAvailableTags, useCreateTag, useDraftEntityTags, useEntityTags, useReplaceEntityTags, useSearchTags, useTagEntity, useUntagEntity } from './chunk-6T5EBO7G.js';
33
+ import './chunk-Y53CVZVV.js';
33
34
  export { useActivateWorkflow, useCreateWorkflow, useCreateWorkflowVersion, useDashboardSummary, useDeactivateWorkflow, useDeleteWorkflow, useDuplicateWorkflow, useImportWorkflow, useLazyWorkflowDefinition, useRestoreWorkflowVersion, useTriggerWorkflow, useUpdateWorkflow, useWorkflowDefinition, useWorkflowDefinitions, useWorkflowRun, useWorkflowRuns, useWorkflowVersions } from './chunk-U5BSQBUC.js';
34
35
  import './chunk-D3UWK7GY.js';
35
36
  export { FluidGridsAssistantBridge, useFluidGridsPageControls } from './chunk-PJAWNFJV.js';
@@ -77,7 +78,7 @@ var WorkflowsList2 = lazy(
77
78
  () => import('./WorkflowsList-GJF2HTSA.js').then((m) => ({ default: m.WorkflowsList }))
78
79
  );
79
80
  var WorkflowBuilder3 = lazy(
80
- () => import('./WorkflowBuilder-TZ2Y3SYJ.js').then((m) => ({
81
+ () => import('./WorkflowBuilder-SY4UJ6C2.js').then((m) => ({
81
82
  default: m.WorkflowBuilder
82
83
  }))
83
84
  );
@@ -87,7 +88,7 @@ var ExecutionsListPage2 = lazy(
87
88
  }))
88
89
  );
89
90
  var ExecutionDetailPage2 = lazy(
90
- () => import('./ExecutionDetailPage-7MGOMYP6.js').then((m) => ({
91
+ () => import('./ExecutionDetailPage-DBUUJRDA.js').then((m) => ({
91
92
  default: m.ExecutionDetailPage
92
93
  }))
93
94
  );
@@ -0,0 +1,87 @@
1
+ import { FC, ReactNode } from 'react';
2
+
3
+ /**
4
+ * Assistant page-controls bridge (BOFF-8679 / BOFF-8988, P3).
5
+ *
6
+ * The pages in this SDK can tell a host's assistant which controls they show
7
+ * right now (tabs, filters, search), so a typed or spoken "show failed runs"
8
+ * does exactly what a click on the page's own Status dropdown does.
9
+ *
10
+ * The SDK deliberately does NOT import `@burdenoff/fe-libs/shared/assistant/*`:
11
+ * many consumers pin an older fe-libs, and a runtime import would raise their
12
+ * floor. Instead the host mounts {@link FluidGridsAssistantBridge} with a
13
+ * `register` function (the host maps a spec onto its own assistant), and the
14
+ * pages call {@link useFluidGridsPageControls}. The types below are structural
15
+ * mirrors of the fe-libs `TabsSpec` / `EnumFilterSpec`, so a host can pass a
16
+ * spec straight into `tabsOf` / `enumFilter` with no conversion.
17
+ *
18
+ * Contract:
19
+ * - No provider mounted: every hook call is a no-op (the SDK works unchanged).
20
+ * - A spec describes ONLY what the page shows on screen at this moment; a page
21
+ * passes `null` while it shows no toolbar.
22
+ * - Every `set` is the page's own state setter (the one its dropdown calls).
23
+ * There is no submit, save, create, delete, run or retry in a spec.
24
+ * - Pass a memoised spec; a new object every render re-registers every render.
25
+ */
26
+
27
+ /** One option of an enum filter, in the page's own words. */
28
+ interface FgFilterOption {
29
+ value: string;
30
+ label: string;
31
+ }
32
+ /** A single-choice filter (a dropdown or a chip group). */
33
+ interface FgEnumFilterSpec {
34
+ id: string;
35
+ /** The filter's own name on the page ("Status"). */
36
+ label: string;
37
+ /**
38
+ * The options the page offers. The NEUTRAL one ("All") must be included so
39
+ * the host can clear the filter; the host does not list it as a choice.
40
+ */
41
+ options: readonly FgFilterOption[];
42
+ /** The value that means "no filter". */
43
+ neutral: string;
44
+ /** The value applied now. */
45
+ value: string;
46
+ /** The page's own setter. */
47
+ set(value: string): void;
48
+ }
49
+ interface FgTabsSpec {
50
+ items: readonly {
51
+ id: string;
52
+ label: string;
53
+ }[];
54
+ /** The tab shown now. */
55
+ value: string;
56
+ /** The page's own setter. */
57
+ set(id: string): void;
58
+ }
59
+ interface FgPageControlsSpec {
60
+ /** The page's title in the product's words ("Workflows"). */
61
+ page: string;
62
+ tabs?: FgTabsSpec;
63
+ filters?: readonly FgEnumFilterSpec[];
64
+ /** The page's own search setter; `""` clears the search. */
65
+ search?(query: string): void;
66
+ }
67
+ /** Registers a page's controls; the returned function removes exactly that registration. */
68
+ type FgRegisterPageControls = (spec: FgPageControlsSpec) => () => void;
69
+ interface FluidGridsAssistantBridgeProps {
70
+ /**
71
+ * The host's registration function. Give it a STABLE identity (a module
72
+ * constant or `useCallback`): a new function every render re-registers the
73
+ * mounted page every render.
74
+ */
75
+ register: FgRegisterPageControls;
76
+ children: ReactNode;
77
+ }
78
+ /** Context provider a host mounts around the FluidGrids routes. */
79
+ declare const FluidGridsAssistantBridge: FC<FluidGridsAssistantBridgeProps>;
80
+ /**
81
+ * Register a page's controls for as long as the calling component is mounted
82
+ * (and `spec` is non-null). With no {@link FluidGridsAssistantBridge} above,
83
+ * this does nothing.
84
+ */
85
+ declare function useFluidGridsPageControls(spec: FgPageControlsSpec | null): void;
86
+
87
+ export { type FgEnumFilterSpec as F, type FgFilterOption as a, type FgPageControlsSpec as b, type FgRegisterPageControls as c, type FgTabsSpec as d, FluidGridsAssistantBridge as e, type FluidGridsAssistantBridgeProps as f, useFluidGridsPageControls as u };
package/dist/templates.js CHANGED
@@ -1,12 +1,13 @@
1
- export { TemplatePreview, TemplatesPage } from './chunk-KLAS43OH.js';
2
- import './chunk-EA4EIU6Y.js';
1
+ export { TemplatePreview, TemplatesPage } from './chunk-7UHXZOZ3.js';
2
+ import './chunk-MXIFE266.js';
3
3
  import './chunk-GEMNVFPK.js';
4
4
  import './chunk-IEVSFCFS.js';
5
5
  import './chunk-YXMFRQYV.js';
6
6
  import './chunk-BQXVT32O.js';
7
7
  import './chunk-QLBQDRQZ.js';
8
- import './chunk-7SPZBRP2.js';
8
+ import './chunk-S3GSHZAT.js';
9
9
  import './chunk-6T5EBO7G.js';
10
+ import './chunk-Y53CVZVV.js';
10
11
  import './chunk-U5BSQBUC.js';
11
12
  import './chunk-D3UWK7GY.js';
12
13
  import './chunk-PJAWNFJV.js';
@@ -1,14 +1,15 @@
1
- export { WorkflowBuilder, WorkflowBuilderCore, WorkflowSearchRedirect } from './chunk-7SZLEQ5G.js';
2
- export { WorkflowBuilder as WorkflowBuilderPage } from './chunk-CCMDFFBC.js';
1
+ export { WorkflowBuilder, WorkflowBuilderCore, WorkflowSearchRedirect } from './chunk-5KUVIH7Y.js';
2
+ export { WorkflowBuilder as WorkflowBuilderPage } from './chunk-6EOFGYLJ.js';
3
3
  import './chunk-TWRWHIMY.js';
4
- import './chunk-EA4EIU6Y.js';
4
+ import './chunk-MXIFE266.js';
5
5
  import './chunk-GEMNVFPK.js';
6
6
  import './chunk-IEVSFCFS.js';
7
7
  import './chunk-YXMFRQYV.js';
8
8
  import './chunk-BQXVT32O.js';
9
9
  import './chunk-QLBQDRQZ.js';
10
- import './chunk-7SPZBRP2.js';
10
+ import './chunk-S3GSHZAT.js';
11
11
  import './chunk-6T5EBO7G.js';
12
+ import './chunk-Y53CVZVV.js';
12
13
  import './chunk-U5BSQBUC.js';
13
14
  import './chunk-DOPSPCO3.js';
14
15
  import './chunk-HKNZ7MVM.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/fluidgrids-fe-sdk",
3
- "version": "2026.1028.13",
3
+ "version": "2026.1028.14",
4
4
  "description": "FluidGrids Workflow Builder SDK - Embeddable visual workflow automation",
5
5
  "type": "module",
6
6
  "imports": {