@burdenoff/fluidgrids-fe-sdk 2026.1113.7 → 2026.1113.8

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 (31) hide show
  1. package/dist/{AiStudioPage-DZ0YBcTL.js → AiStudioPage-Di3eW5Lb.js} +1 -1
  2. package/dist/{ExecutionDetailPage-CoRLOiiZ.js → ExecutionDetailPage-B2jVApvM.js} +4 -1
  3. package/dist/{ExecutionsListPage-Dr0Ychbr.js → ExecutionsListPage-ZCmFNid9.js} +3 -0
  4. package/dist/{TemplatePreview-WiRz3SCv.js → TemplatePreview-DYxxlBad.js} +1 -1
  5. package/dist/TranslationBridge-Bd4aJKMs.d.ts +11 -0
  6. package/dist/{WorkflowBuilder-CQWz7dXc.js → WorkflowBuilder-Dp9chOr5.js} +1 -1
  7. package/dist/{WorkflowBuilder-BdnCh2hB.js → WorkflowBuilder-LkCC0Arp.js} +1 -1
  8. package/dist/agent-tools.d.ts +1 -1
  9. package/dist/agent-tools.js +2 -2
  10. package/dist/{canvasNoteTools-Cp3UPIM8.js → canvasNoteTools-D9RwHOz4.js} +1 -1
  11. package/dist/{constants-XdvUxeWK.d.ts → constants-svpG-QrV.d.ts} +1 -9
  12. package/dist/entities-I_0kio3q.js +38 -0
  13. package/dist/executions.js +2 -2
  14. package/dist/{flow-builder-CJ00qt1Z.js → flow-builder-7gVV3Y8R.js} +111 -13
  15. package/dist/{index-Df6NgmmH.d.ts → index-8Ai8teoo.d.ts} +1 -1
  16. package/dist/{index-CHeY7_A1.d.ts → index-BZCX9eJJ.d.ts} +13 -0
  17. package/dist/index.d.ts +4 -3
  18. package/dist/index.js +14 -13
  19. package/dist/{marksStore-DGCXjTmZ.js → marksStore-a9oIMMot.js} +25 -1
  20. package/dist/observability.d.ts +1 -1
  21. package/dist/proactive.d.ts +66 -0
  22. package/dist/proactive.js +237 -0
  23. package/dist/templates.js +1 -1
  24. package/dist/{uiMarkTools-DZ6akjQK.js → uiMarkTools-B2581Qg-.js} +1 -1
  25. package/dist/{useWorkflowProposal-UtJYycLv.js → use-workflow-tests-BUzndyWO.js} +4 -3265
  26. package/dist/useWorkflowProposal-B9vXLKef.js +3280 -0
  27. package/dist/workflow-builder.js +2 -2
  28. package/dist/workflow-host.d.ts +2 -1
  29. package/dist/workflow-pages.d.ts +1 -1
  30. package/dist/workflow-pages.js +5 -5
  31. package/package.json +7 -3
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
3
  import { t as ThemeProvider } from "./theme-provider-B3mIuz2d.js";
4
- import { a as useAiWorkflowTemplates, i as enrichDraftNodes, n as AI_DRAFT_MAX_PROMPT_LENGTH, r as draftToCanvas, t as FlowBuilderPage } from "./flow-builder-CJ00qt1Z.js";
4
+ import { a as useAiWorkflowTemplates, i as enrichDraftNodes, n as AI_DRAFT_MAX_PROMPT_LENGTH, r as draftToCanvas, t as FlowBuilderPage } from "./flow-builder-7gVV3Y8R.js";
5
5
  import { T as buildOperationSeed, ht as classifyCreateRefusal, mt as builderPathOf, u as ensureNodeTypesLoaded } from "./FluidGridsProvider-DQP7gPxN.js";
6
6
  import { n as getFluidGridsClient } from "./client-Ctl4jmY3.js";
7
7
  import { o as throwIfResultError } from "./errors-xPZ-IbQd.js";
@@ -14,16 +14,18 @@ import { n as getFluidGridsClient, r as getFluidGridsClientSafe } from "./client
14
14
  import { o as throwIfResultError, t as describeOperationError } from "./errors-xPZ-IbQd.js";
15
15
  import { r as getFluidGridsConfig } from "./config-X97zrIvn.js";
16
16
  import { i as SdkPermissionButton, s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-dcxg6zG6.js";
17
+ import { r as runSuggestAnchorProps } from "./entities-I_0kio3q.js";
17
18
  import { t as EntityTagPicker } from "./EntityTagPicker-BppBSEJk.js";
18
19
  import { a as useRecipientLabel, n as ApprovalApprovers, t as channelLabel } from "./channel-DtF1n_ab.js";
19
20
  import { r as useRunHumanRequests } from "./useHumanRequests-DwG2tQ3f.js";
20
21
  import { a as encodedPayloadBytes, f as EffectBadge, h as useRunPolicyDecisions, i as decodePayloads, l as formatBudgetUsd, n as checkCodecServerUrl, o as isEncodedPayload, r as containsEncodedPayload, t as CodecServerError } from "./codec-client-CAYl6j46.js";
21
- import { _ as agentLiveReplyState, a as canSaveRunAsTestCase, g as useAgentTokenStream, n as saveRunAsTestCase, t as useWorkflowProposal, v as agentTokenStreamsFor } from "./useWorkflowProposal-UtJYycLv.js";
22
+ import { t as useWorkflowProposal } from "./useWorkflowProposal-B9vXLKef.js";
22
23
  import { t as WorkflowProposalCard } from "./WorkflowProposalCard-SmRv_Egf.js";
23
24
  import { t as AiCreditBalanceSlot } from "./aiCreditsBridge-BuE92tKo.js";
24
25
  import { a as fetchRunFailureClusters, i as dismissRunFailureCluster, r as OPEN_STATUSES, t as BUCKET_LABELS } from "./FailureTriagePanel-DA91XKVj.js";
25
26
  import { a as useDurableRunFields, i as useDeterminismStatus, n as SignalRunDialog, o as useRunStackTrace, r as terminateDurableRun, s as RunHistoryView, t as useRunHistory } from "./useRunHistory-Bxs6LrME.js";
26
27
  import { $P as VersioningBehavior, L as AgentStepKind, LI as WorkflowUpdateWaitFor, jd as ErrorType, yI as WorkflowQueryRejectCondition } from "./graphql-types-C5Tr6508.js";
28
+ import { _ as agentTokenStreamsFor, g as agentLiveReplyState, h as useAgentTokenStream, i as canSaveRunAsTestCase, t as saveRunAsTestCase } from "./use-workflow-tests-BUzndyWO.js";
27
29
  import { a as formatTokens, d as formatMicroUsd, o as modelLabel, r as aiCost } from "./ai-usage-D7SjIkUZ.js";
28
30
  import { _ as useWorkflowTestsEnabled, l as useDurableFunctionNodesEnabled, m as usePhaseCFlags, u as useDurableParityEnabled } from "./feature-flags-B_b8PJ6Z.js";
29
31
  import { A as revokeSignalToken, B as updateActivityOptions, D as resetActivities, E as queryRun, N as sendRunUpdate, O as resetRun, R as unpauseActivities, S as fetchSignalTokens, V as upsertRunSearchAttributes, _ as fetchPauseRules, b as fetchRunUpdate, d as failActivityById, g as fetchCodecServerSettings, i as completeActivityById, k as resetRunToLastCleanTask, s as createSignalToken, v as fetchRunControlFields, w as pauseActivities, y as fetchRunHistoryArchive } from "./api-CEnNq15C.js";
@@ -8382,6 +8384,7 @@ function ExecutionDetailPage() {
8382
8384
  children: [/* @__PURE__ */ jsxs("div", { children: [
8383
8385
  /* @__PURE__ */ jsxs("div", {
8384
8386
  className: "flex items-center gap-3 mb-2",
8387
+ ...runSuggestAnchorProps(execution.id),
8385
8388
  children: [
8386
8389
  /* @__PURE__ */ jsx("h1", {
8387
8390
  className: "text-2xl sm:text-3xl font-bold text-text-primary",
@@ -11,6 +11,7 @@ import { n as useNavigationV2 } from "./useNavigationV2-C2WeqN7d.js";
11
11
  import { a as useRunStatusCounts, c as errorAdvice, f as runStatusLabels, o as ConfirmStopRunDialog, p as RUN_STATUS_CONFIG, s as ADVICE_ERROR_TYPES, u as ExecutionStatusBadge } from "./useDurableParity-BUSM-z_7.js";
12
12
  import { t as Disclosure } from "./Disclosure-CsxDspR7.js";
13
13
  import { n as formatRunVersion } from "./run-display-BycKYSU0.js";
14
+ import { r as runSuggestAnchorProps } from "./entities-I_0kio3q.js";
14
15
  import { Yt as formatElapsedMs, Zt as runDurationMs } from "./FluidGridsProvider-DQP7gPxN.js";
15
16
  import { r as useRunHumanRequests } from "./useHumanRequests-DwG2tQ3f.js";
16
17
  import { n as runListLinkKey, t as runListFilterFromSearch } from "./run-list-links-DZ8Q5l35.js";
@@ -1318,6 +1319,7 @@ function ExecutionTable({ executions, workflowNames, loading, canExecute = true,
1318
1319
  const isSelected = selection.runIds.includes(execution.id);
1319
1320
  const isExpanded = expandedRows.has(execution.id);
1320
1321
  return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("tr", {
1322
+ ...runSuggestAnchorProps(execution.id),
1321
1323
  className: `
1322
1324
  hover:bg-surface-sunken/50 cursor-pointer transition-colors
1323
1325
  ${isSelected ? "bg-action-primary-bg/10" : ""}
@@ -2238,6 +2240,7 @@ function RunsPlainTable({ executions, workflowNames, loading, canExecute = true,
2238
2240
  priority: "primary",
2239
2241
  cell: (run) => /* @__PURE__ */ jsxs("div", {
2240
2242
  className: "flex flex-col",
2243
+ ...runSuggestAnchorProps(run.id),
2241
2244
  children: [/* @__PURE__ */ jsx("span", {
2242
2245
  className: "text-sm font-medium text-text-primary",
2243
2246
  children: run.workflow?.name || workflowNames?.[run.workflowKey] || run.workflowKey
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
3
  import { t as ThemeProvider } from "./theme-provider-B3mIuz2d.js";
4
- import { t as FlowBuilderPage } from "./flow-builder-CJ00qt1Z.js";
4
+ import { t as FlowBuilderPage } from "./flow-builder-7gVV3Y8R.js";
5
5
  import { _ as useInstalledNodes, a as buildNodeCheck, c as useImportWorkflowTemplate, i as useTemplateImportFlow, n as formatTemplatePrice, o as buildRequiredNodeTypes, r as isPaidTemplate } from "./TemplateCard-UnjAFsS4.js";
6
6
  import { t as QuotaExhaustedDialog } from "./QuotaExhaustedDialog-nlnRlQ2i.js";
7
7
  import { n as WithOpenTemplateAsCode } from "./OpenTemplateAsCodeButton-BdcTxemq.js";
@@ -0,0 +1,11 @@
1
+
2
+ import { ReactNode } from "react";
3
+ type Translator = (key: string, fallback: string, params?: Record<string, string | number>) => string;
4
+ declare const ENGLISH_FALLBACK_TRANSLATOR: Translator;
5
+ interface FluidGridsTranslationProviderProps {
6
+ t: Translator;
7
+ children: ReactNode;
8
+ }
9
+ declare function FluidGridsTranslationProvider({ t, children }: FluidGridsTranslationProviderProps): import("react").JSX.Element;
10
+ declare function useTr(): Translator;
11
+ export { useTr as a, Translator as i, FluidGridsTranslationProvider as n, FluidGridsTranslationProviderProps as r, ENGLISH_FALLBACK_TRANSLATOR as t };
@@ -6,7 +6,7 @@ import { t as Input } from "./input-ChT6Q-Pr.js";
6
6
  import { v as Card } from "./TemplateCard-UnjAFsS4.js";
7
7
  import { t as cn } from "./cn-QqidFIgr.js";
8
8
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
9
- import { m as FluidGridsMark, p as useNodeSelectedEvent } from "./flow-builder-CJ00qt1Z.js";
9
+ import { m as FluidGridsMark, p as useNodeSelectedEvent } from "./flow-builder-7gVV3Y8R.js";
10
10
  import { useCallback, useEffect, useRef, useState } from "react";
11
11
  import { Background, Controls, Handle, MarkerType, MiniMap, Position, ReactFlow, ReactFlowProvider, useReactFlow } from "@xyflow/react";
12
12
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
- import { d as releaseLeaseKeptForReload, f as useWorkflowReloadStore, t as FlowBuilderPage } from "./flow-builder-CJ00qt1Z.js";
3
+ import { d as releaseLeaseKeptForReload, f as useWorkflowReloadStore, t as FlowBuilderPage } from "./flow-builder-7gVV3Y8R.js";
4
4
  import { n as registerLiveCanvasHandler } from "./liveCanvas-D5ytXDp8.js";
5
5
  import { r as getFluidGridsConfig } from "./config-X97zrIvn.js";
6
6
  import { n as getFluidGridsClient } from "./client-Ctl4jmY3.js";
@@ -1,3 +1,3 @@
1
1
 
2
- import { a as createUiMarkTools, c as FluidGridsAgentToolDeps, d as triggerNodesOf, i as UiMarkToolOptions, l as createFluidGridsAgentTools, n as resetAgentMarks, o as AgentCalloutOverlay, r as useAgentMarksStore, s as AgentCalloutOverlayProps, t as CanvasNote, u as pickTriggerNode } from "./index-CHeY7_A1.js";
2
+ import { a as createUiMarkTools, c as FluidGridsAgentToolDeps, d as triggerNodesOf, i as UiMarkToolOptions, l as createFluidGridsAgentTools, n as resetAgentMarks, o as AgentCalloutOverlay, r as useAgentMarksStore, s as AgentCalloutOverlayProps, t as CanvasNote, u as pickTriggerNode } from "./index-BZCX9eJJ.js";
3
3
  export { AgentCalloutOverlay, type AgentCalloutOverlayProps, type CanvasNote, type FluidGridsAgentToolDeps, type UiMarkToolOptions, createFluidGridsAgentTools, createUiMarkTools, pickTriggerNode, resetAgentMarks, triggerNodesOf, useAgentMarksStore };
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { a as triggerNodesOf, i as pickTriggerNode, n as AgentCalloutOverlay, r as createFluidGridsAgentTools, t as createUiMarkTools } from "./uiMarkTools-DZ6akjQK.js";
3
- import { n as useAgentMarksStore, t as resetAgentMarks } from "./marksStore-DGCXjTmZ.js";
2
+ import { a as triggerNodesOf, i as pickTriggerNode, n as AgentCalloutOverlay, r as createFluidGridsAgentTools, t as createUiMarkTools } from "./uiMarkTools-B2581Qg-.js";
3
+ import { n as useAgentMarksStore, t as resetAgentMarks } from "./marksStore-a9oIMMot.js";
4
4
 
5
5
  export { AgentCalloutOverlay, createFluidGridsAgentTools, createUiMarkTools, pickTriggerNode, resetAgentMarks, triggerNodesOf, useAgentMarksStore };
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { n as useAgentMarksStore, r as toPlainText } from "./marksStore-DGCXjTmZ.js";
2
+ import { n as useAgentMarksStore, r as toPlainText } from "./marksStore-a9oIMMot.js";
3
3
  import { F as nodeTitle, L as paramsFromOperation, R as selectedOperationOf } from "./FluidGridsProvider-DQP7gPxN.js";
4
4
  import { A as useFlowStore } from "./node-operation-selection-BGj5YwAS.js";
5
5
  import { t as notesKeyOf } from "./notesKey-5EaREBGA.js";
@@ -1,14 +1,6 @@
1
1
 
2
2
  import { ReactElement, ReactNode } from "react";
3
3
  import { ApolloClient } from "@apollo/client/core";
4
- type Translator = (key: string, fallback: string, params?: Record<string, string | number>) => string;
5
- declare const ENGLISH_FALLBACK_TRANSLATOR: Translator;
6
- interface FluidGridsTranslationProviderProps {
7
- t: Translator;
8
- children: ReactNode;
9
- }
10
- declare function FluidGridsTranslationProvider({ t, children }: FluidGridsTranslationProviderProps): import("react").JSX.Element;
11
- declare function useTr(): Translator;
12
4
  declare function refreshNodeRegistry(): Promise<void>;
13
5
  interface FluidGridsClientConfig {
14
6
  apiGatewayUrl: string;
@@ -159,4 +151,4 @@ declare const FLUIDGRIDS_PERMISSIONS: {
159
151
  readonly TOOL_APPROVAL_REQUEST_EXECUTE: "tool-approval-request:execute";
160
152
  };
161
153
  type FluidGridsPermission = (typeof FLUIDGRIDS_PERMISSIONS)[keyof typeof FLUIDGRIDS_PERMISSIONS];
162
- export { FluidGridsTranslationProviderProps as A, isFluidGridsClientReady as C, refreshNodeRegistry as D, waitForFluidGridsClient as E, useTr as M, ENGLISH_FALLBACK_TRANSLATOR as O, getFluidGridsClientSafe as S, setFluidGridsClient as T, resetGlobalStoreClient as _, FluidGridsPermissionsProviderProps as a, createFluidGridsClient as b, SdkPermissionButton as c, SdkPermissionGateProps as d, evaluatePermissionCheck as f, getGlobalStoreClient as g, createGlobalStoreClient as h, FluidGridsPermissionsProvider as i, Translator as j, FluidGridsTranslationProvider as k, SdkPermissionButtonProps as l, GlobalClientConfig as m, FluidGridsPermission as n, FluidGridsPermissionsValue as o, useFluidGridsPermission as p, ALLOW_ALL_PERMISSIONS as r, PermissionCheck as s, FLUIDGRIDS_PERMISSIONS as t, SdkPermissionGate as u, setGlobalStoreClient as v, resetFluidGridsClient as w, getFluidGridsClient as x, FluidGridsClientConfig as y };
154
+ export { isFluidGridsClientReady as C, refreshNodeRegistry as D, waitForFluidGridsClient as E, getFluidGridsClientSafe as S, setFluidGridsClient as T, resetGlobalStoreClient as _, FluidGridsPermissionsProviderProps as a, createFluidGridsClient as b, SdkPermissionButton as c, SdkPermissionGateProps as d, evaluatePermissionCheck as f, getGlobalStoreClient as g, createGlobalStoreClient as h, FluidGridsPermissionsProvider as i, SdkPermissionButtonProps as l, GlobalClientConfig as m, FluidGridsPermission as n, FluidGridsPermissionsValue as o, useFluidGridsPermission as p, ALLOW_ALL_PERMISSIONS as r, PermissionCheck as s, FLUIDGRIDS_PERMISSIONS as t, SdkPermissionGate as u, setGlobalStoreClient as v, resetFluidGridsClient as w, getFluidGridsClient as x, FluidGridsClientConfig as y };
@@ -0,0 +1,38 @@
1
+ "use client";
2
+ import { suggestAnchorProps } from "@burdenoff/fe-libs/shared/proactive";
3
+
4
+ // src/proactive/entities.ts
5
+ /**
6
+ * ★ BOFF-13166: the FluidGrids reference pack of the proactive agent (epic
7
+ * BOFF-13159). These names are a contract with the backend pack in
8
+ * wspace-sandbox-svc (`proactive/packs/fluidgrids.ts`): a suggestion's anchor
9
+ * and actions carry exactly these strings, so they never change here alone.
10
+ *
11
+ * Anchors (contract C7):
12
+ * - `workflow_run`: entityId = the run id (the id in `/workflows/runs/<id>`);
13
+ * - `workflow`: entityId = the workflowKey (the key in
14
+ * `/workflows/workflow/<key>/<version>`, the same id the assistant's page
15
+ * context reports), part = a canvas node id;
16
+ * - `connection`: entityId = the integration connection id
17
+ * (`/integrations/connections/<id>`).
18
+ */
19
+ const FLUIDGRIDS_PROACTIVE_ENTITY = {
20
+ run: "workflow_run",
21
+ workflow: "workflow",
22
+ connection: "connection"
23
+ };
24
+ /** The product-registered action types of the pack (the built-ins are fe-libs'). */
25
+ const FLUIDGRIDS_PROACTIVE_ACTION = {
26
+ reviewProposal: "review-proposal",
27
+ proposeFix: "propose-fix",
28
+ openConnection: "open-connection"
29
+ };
30
+ /** The attribute that lets a suggestion about this run pin to an element. */
31
+ function runSuggestAnchorProps(runId) {
32
+ return suggestAnchorProps({
33
+ entityType: FLUIDGRIDS_PROACTIVE_ENTITY.run,
34
+ entityId: runId
35
+ });
36
+ }
37
+
38
+ export { FLUIDGRIDS_PROACTIVE_ENTITY as n, runSuggestAnchorProps as r, FLUIDGRIDS_PROACTIVE_ACTION as t };
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { t as ExecutionsListPage } from "./ExecutionsListPage-Dr0Ychbr.js";
3
- import { t as ExecutionDetailPage } from "./ExecutionDetailPage-CoRLOiiZ.js";
2
+ import { t as ExecutionsListPage } from "./ExecutionsListPage-ZCmFNid9.js";
3
+ import { t as ExecutionDetailPage } from "./ExecutionDetailPage-B2jVApvM.js";
4
4
 
5
5
  export { ExecutionDetailPage, ExecutionsListPage };
@@ -25,9 +25,9 @@ import { i as emitFluidGridsEvent } from "./token-refresh-link-BjN7H4qA.js";
25
25
  import { n as useBuilderReadOnly, t as BuilderReadOnlyProvider } from "./read-only-context-Dt9N9SIG.js";
26
26
  import { r as MAPPING_TYPE_COLORS, t as MAPPING_COMPATIBILITY_COLORS } from "./mapping-colors-BIX_YeCQ.js";
27
27
  import { n as LogsPanel } from "./logs-panel-Cn4gGng9.js";
28
- import { c as emptyTestCaseDraft, d as nextSortOrder, f as pinnedOutputsFromCanvas, g as useAgentTokenStream, h as testStatusTone, i as TEST_STATUS_TONE_CLASS, l as enabledCaseIds, m as testStatusLabel, o as draftFromTestCase, p as testRunSummaryText, r as useWorkflowTests, s as draftToInput, t as useWorkflowProposal, u as isTestRunOpen, y as latestAgentTokenStream } from "./useWorkflowProposal-UtJYycLv.js";
28
+ import { a as draftFromTestCase, c as enabledCaseIds, d as pinnedOutputsFromCanvas, f as testRunSummaryText, h as useAgentTokenStream, l as isTestRunOpen, m as testStatusTone, n as useWorkflowTests, o as draftToInput, p as testStatusLabel, r as TEST_STATUS_TONE_CLASS, s as emptyTestCaseDraft, u as nextSortOrder, v as latestAgentTokenStream } from "./use-workflow-tests-BUzndyWO.js";
29
29
  import { r as useExecutionActions } from "./useExecutions-DSZisQHk.js";
30
- import { n as useAgentMarksStore } from "./marksStore-DGCXjTmZ.js";
30
+ import { n as useAgentMarksStore } from "./marksStore-a9oIMMot.js";
31
31
  import { t as notesKeyOf } from "./notesKey-5EaREBGA.js";
32
32
  import { a as saveWorkflowDescription, c as CreateWorkflowRefusalDialog, i as normalizeWorkflowDescription, n as useWorkflowCodeExport, o as visibleWorkflowDescription, r as commitWorkflowDescription, s as workflowDescriptionCharactersLeft } from "./useWorkflowCodeExport-Bj4QY-xY.js";
33
33
  import { r as RUNS_QUOTA_NAME, t as BILLING_PLANS_PATH } from "./quota-Cdt8yz7N.js";
@@ -40,6 +40,7 @@ import { t as WorkflowDefinitionDocument } from "./WorkflowDefinitionDocument-DZ
40
40
  import { o as countLifecycle, t as VersionLifecycleBar } from "./VersionLifecycleBar-DuphLOT0.js";
41
41
  import { $P as VersioningBehavior, Eu as DrainageStatus, PI as WorkflowTestExpectedStatus, aI as WorkflowExportFormat, jo as CodeReplaceStatus, rI as WorkflowEnvironment } from "./graphql-types-C5Tr6508.js";
42
42
  import { t as buildNodeDisplayMap } from "./run-display-BycKYSU0.js";
43
+ import { t as useWorkflowProposal } from "./useWorkflowProposal-B9vXLKef.js";
43
44
  import { n as useRequestedProposal } from "./useRequestedProposal-B7uPXfZB.js";
44
45
  import { t as AiCreditBalanceSlot } from "./aiCreditsBridge-BuE92tKo.js";
45
46
  import { t as downloadBlob } from "./workflow-transfer-CQnQC-ke.js";
@@ -64,6 +65,7 @@ import { AlertCircle, AlertTriangle, ArrowRight, BadgeCheck, Check, CircleHelp,
64
65
  import { isEmpty } from "radash";
65
66
  import { animate, easeOut } from "popmotion";
66
67
  import { createPortal } from "react-dom";
68
+ import { SuggestionBadge } from "@burdenoff/fe-libs/shared/proactive";
67
69
  import { useUnsavedChanges } from "@burdenoff/fe-libs/shared/hooks";
68
70
  import { buildActorFallback, useActorProfiles } from "@burdenoff/fe-libs/shared";
69
71
 
@@ -12208,6 +12210,17 @@ function WebhookRunFollower() {
12208
12210
  *
12209
12211
  * Everything here is `data-agent="deny"`: an agent cannot read or press its
12210
12212
  * own notes. Messages render as React text, never as markup.
12213
+ *
12214
+ * ★ BOFF-13166: proactive AI suggestions about the open workflow (entity type
12215
+ * `workflow`, entityId = its workflowKey) are drawn here too. The shell's
12216
+ * `ProactiveProvider` hands them to the canvas adapter
12217
+ * (`proactive/workflowAnchorAdapter.ts`), which keeps them in the marks store.
12218
+ * One about a node (`part` = the node id) is a badge beside that node's note
12219
+ * pins; one about the workflow as a whole, or a node no longer on the canvas,
12220
+ * sits in a small panel at the top of the canvas. Each badge opens the shared
12221
+ * suggestion card. The layer reports the saved workflow it shows (key and node
12222
+ * ids) so the adapter knows which suggestions it can pin; an unsaved workflow
12223
+ * has no key and gets none.
12211
12224
  */
12212
12225
  const FLASH_MS = 1800;
12213
12226
  const RING_PAD = 8;
@@ -12315,8 +12328,15 @@ const CanvasNoteCard = ({ note, nodeOnCanvas }) => {
12315
12328
  ]
12316
12329
  });
12317
12330
  };
12331
+ /** One badge per suggestion; each opens the shared suggestion card. */
12332
+ const SuggestionBadges = ({ suggestions, controls }) => /* @__PURE__ */ jsx(Fragment$1, { children: suggestions.map((suggestion) => /* @__PURE__ */ jsx(SuggestionBadge, {
12333
+ suggestion,
12334
+ controls,
12335
+ side: "top",
12336
+ align: "end"
12337
+ }, suggestion.notificationId)) });
12318
12338
  /** The pins above one node, and the open card. */
12319
- const NodePins = ({ nodeId, notes }) => {
12339
+ const NodePins = ({ nodeId, notes, suggestions }) => {
12320
12340
  const tr = useTr();
12321
12341
  const openNoteId = useAgentMarksStore((state) => state.openNoteId);
12322
12342
  const openNote = useAgentMarksStore((state) => state.actions.openNote);
@@ -12335,9 +12355,12 @@ const NodePins = ({ nodeId, notes }) => {
12335
12355
  children: [open && /* @__PURE__ */ jsx(CanvasNoteCard, {
12336
12356
  note: open,
12337
12357
  nodeOnCanvas: true
12338
- }), /* @__PURE__ */ jsx("div", {
12358
+ }), /* @__PURE__ */ jsxs("div", {
12339
12359
  className: "flex gap-1",
12340
- children: notes.map((note) => /* @__PURE__ */ jsx("button", {
12360
+ children: [suggestions && /* @__PURE__ */ jsx(SuggestionBadges, {
12361
+ suggestions: suggestions.items,
12362
+ controls: suggestions.controls
12363
+ }), notes.map((note) => /* @__PURE__ */ jsx("button", {
12341
12364
  type: "button",
12342
12365
  "data-testid": "fg-canvas-note-pin",
12343
12366
  "aria-expanded": note.id === openNoteId,
@@ -12348,7 +12371,7 @@ const NodePins = ({ nodeId, notes }) => {
12348
12371
  "aria-hidden": "true",
12349
12372
  className: "size-3.5"
12350
12373
  }) : note.number
12351
- }, note.id))
12374
+ }, note.id))]
12352
12375
  })]
12353
12376
  })
12354
12377
  });
@@ -12440,10 +12463,48 @@ const NotesList = ({ notes, live }) => {
12440
12463
  })
12441
12464
  });
12442
12465
  };
12466
+ /** Suggestions about the workflow as a whole, at the top of the canvas. */
12467
+ const WorkflowSuggestionsPanel = ({ items, controls }) => {
12468
+ const tr = useTr();
12469
+ return /* @__PURE__ */ jsx(Panel, {
12470
+ position: "top-center",
12471
+ "data-agent": "deny",
12472
+ "data-testid": "fg-canvas-suggestions",
12473
+ className: "nodrag nopan nowheel",
12474
+ children: /* @__PURE__ */ jsxs("div", {
12475
+ className: "flex items-center gap-2 rounded-lg border border-border bg-popover px-3 py-1.5 text-xs text-foreground shadow-md",
12476
+ children: [/* @__PURE__ */ jsx("span", {
12477
+ className: "font-medium",
12478
+ children: tr("fluidgrids.proactive.canvas.heading", "AI suggestions")
12479
+ }), /* @__PURE__ */ jsx(SuggestionBadges, {
12480
+ suggestions: items,
12481
+ controls
12482
+ })]
12483
+ })
12484
+ });
12485
+ };
12486
+ /** The saved workflow on this canvas, reported for the proactive adapter. */
12487
+ function useReportProactiveCanvas(workflowKey, nodeIds) {
12488
+ const setCanvas = useAgentMarksStore((state) => state.actions.setCanvas);
12489
+ useEffect(() => {
12490
+ setCanvas(workflowKey ? {
12491
+ workflowKey,
12492
+ nodeIds
12493
+ } : null);
12494
+ }, [
12495
+ setCanvas,
12496
+ workflowKey,
12497
+ nodeIds
12498
+ ]);
12499
+ useEffect(() => () => setCanvas(null), [setCanvas]);
12500
+ }
12443
12501
  const CanvasNotesLayer = () => {
12444
12502
  const workflowKey = useFlowStore((state) => notesKeyOf(state.workflow));
12503
+ const savedKey = useFlowStore((state) => state.workflow.workflowKey);
12445
12504
  const nodeIds = useFlowStore(useShallow((state) => state.workflow.nodes.map((node) => node.id)));
12446
12505
  const allNotes = useAgentMarksStore((state) => state.notes);
12506
+ const canvasSuggestions = useAgentMarksStore((state) => state.canvasSuggestions);
12507
+ useReportProactiveCanvas(savedKey || void 0, nodeIds);
12447
12508
  const notes = useMemo(() => allNotes.filter((note) => note.workflowKey === workflowKey), [allNotes, workflowKey]);
12448
12509
  const live = useMemo(() => new Set(nodeIds), [nodeIds]);
12449
12510
  const byNode = useMemo(() => {
@@ -12452,10 +12513,36 @@ const CanvasNotesLayer = () => {
12452
12513
  if (!live.has(note.nodeId)) continue;
12453
12514
  groups.set(note.nodeId, [...groups.get(note.nodeId) ?? [], note]);
12454
12515
  }
12455
- return [...groups.entries()];
12516
+ return groups;
12456
12517
  }, [notes, live]);
12518
+ const suggestions = useMemo(() => {
12519
+ const onNode = /* @__PURE__ */ new Map();
12520
+ const onWorkflow = [];
12521
+ const { controls, items } = canvasSuggestions;
12522
+ if (!controls || !savedKey) return {
12523
+ onNode,
12524
+ onWorkflow,
12525
+ controls: null
12526
+ };
12527
+ for (const suggestion of items) {
12528
+ if (suggestion.anchor.entityId !== savedKey) continue;
12529
+ const part = suggestion.anchor.part;
12530
+ if (part && live.has(part)) onNode.set(part, [...onNode.get(part) ?? [], suggestion]);
12531
+ else onWorkflow.push(suggestion);
12532
+ }
12533
+ return {
12534
+ onNode,
12535
+ onWorkflow,
12536
+ controls
12537
+ };
12538
+ }, [
12539
+ canvasSuggestions,
12540
+ savedKey,
12541
+ live
12542
+ ]);
12543
+ const pinnedNodeIds = useMemo(() => [.../* @__PURE__ */ new Set([...byNode.keys(), ...suggestions.onNode.keys()])], [byNode, suggestions]);
12457
12544
  return /* @__PURE__ */ jsxs(Fragment$1, { children: [
12458
- /* @__PURE__ */ jsxs(ViewportPortal, { children: [byNode.map(([nodeId, nodeNotes]) => {
12545
+ /* @__PURE__ */ jsxs(ViewportPortal, { children: [[...byNode.entries()].map(([nodeId, nodeNotes]) => {
12459
12546
  const openNotes = nodeNotes.filter((note) => !note.resolved);
12460
12547
  if (openNotes.length === 0) return null;
12461
12548
  const tone = openNotes.some((note) => note.kind === "fix") ? "fix" : "info";
@@ -12464,10 +12551,21 @@ const CanvasNotesLayer = () => {
12464
12551
  tone
12465
12552
  }, nodeId);
12466
12553
  }), /* @__PURE__ */ jsx(FlashRing, {})] }),
12467
- byNode.map(([nodeId, nodeNotes]) => /* @__PURE__ */ jsx(NodePins, {
12468
- nodeId,
12469
- notes: nodeNotes
12470
- }, nodeId)),
12554
+ pinnedNodeIds.map((nodeId) => {
12555
+ const nodeSuggestions = suggestions.onNode.get(nodeId);
12556
+ return /* @__PURE__ */ jsx(NodePins, {
12557
+ nodeId,
12558
+ notes: byNode.get(nodeId) ?? [],
12559
+ ...nodeSuggestions && suggestions.controls ? { suggestions: {
12560
+ items: nodeSuggestions,
12561
+ controls: suggestions.controls
12562
+ } } : {}
12563
+ }, nodeId);
12564
+ }),
12565
+ suggestions.controls && suggestions.onWorkflow.length > 0 && /* @__PURE__ */ jsx(WorkflowSuggestionsPanel, {
12566
+ items: suggestions.onWorkflow,
12567
+ controls: suggestions.controls
12568
+ }),
12471
12569
  notes.length > 0 && /* @__PURE__ */ jsx(NotesList, {
12472
12570
  notes,
12473
12571
  live
@@ -19385,7 +19483,7 @@ const FlowBuilder = ({ readOnly = false, fitToScreen = false }) => {
19385
19483
  useEffect(() => {
19386
19484
  fitViewRef.current = fitView;
19387
19485
  }, [fitView]);
19388
- useLazyAgentTools(() => import("./canvasNoteTools-Cp3UPIM8.js").then(({ createCanvasNoteTools }) => createCanvasNoteTools({ focusNode: (nodeId) => fitViewRef.current({
19486
+ useLazyAgentTools(() => import("./canvasNoteTools-D9RwHOz4.js").then(({ createCanvasNoteTools }) => createCanvasNoteTools({ focusNode: (nodeId) => fitViewRef.current({
19389
19487
  nodes: [{ id: nodeId }],
19390
19488
  duration: 400,
19391
19489
  padding: .6,
@@ -1,7 +1,7 @@
1
1
 
2
2
  import { f as FluidGridsTheme, r as FluidGridsRefreshedTokens } from "./index-72XFgvbn.js";
3
3
  import { R as FluidGridsProviderProps, w as WorkflowData } from "./index-RWAuYE2j.js";
4
- import { j as Translator } from "./constants-XdvUxeWK.js";
4
+ import { i as Translator } from "./TranslationBridge-Bd4aJKMs.js";
5
5
  import { t as RunsQuota } from "./runsQuota-DsniKiSg.js";
6
6
  import * as React$2 from "react";
7
7
  import { HTMLAttributes, InputHTMLAttributes } from "react";
@@ -1,5 +1,6 @@
1
1
 
2
2
  import { FC } from "react";
3
+ import { ProactiveSuggestion, SuggestionControls } from "@burdenoff/fe-libs/shared/proactive";
3
4
  import { AnyDefinedAgentTool } from "@burdenoff/fe-libs/shared/agent-tools";
4
5
  declare const AGENT_OPERATIONS: {
5
6
  readonly AgentFindWorkflows: "\n query AgentFindWorkflows($input: ListWorkflowDefinitionsInput!) {\n workflowDefinitions(input: $input) {\n total\n hasMore\n items { id name workflowKey version status updatedAt workspaceId deletedAt description }\n }\n }\n";
@@ -72,6 +73,14 @@ interface NewCanvasNote {
72
73
  kind: CanvasNoteKind;
73
74
  message: string;
74
75
  }
76
+ interface ProactiveCanvas {
77
+ workflowKey: string;
78
+ nodeIds: readonly string[];
79
+ }
80
+ interface CanvasSuggestions {
81
+ items: readonly ProactiveSuggestion[];
82
+ controls: SuggestionControls | null;
83
+ }
75
84
  interface AgentMarksState {
76
85
  callouts: AgentCallout[];
77
86
  notes: CanvasNote[];
@@ -81,6 +90,8 @@ interface AgentMarksState {
81
90
  nodeId: string;
82
91
  token: number;
83
92
  } | null;
93
+ canvas: ProactiveCanvas | null;
94
+ canvasSuggestions: CanvasSuggestions;
84
95
  actions: {
85
96
  addCallout: (callout: {
86
97
  label: string;
@@ -98,6 +109,8 @@ interface AgentMarksState {
98
109
  clearNotes: (workflowKey?: string) => number;
99
110
  openNote: (id: string | null) => void;
100
111
  flashNode: (nodeId: string) => void;
112
+ setCanvas: (canvas: ProactiveCanvas | null) => void;
113
+ setCanvasSuggestions: (items: readonly ProactiveSuggestion[], controls: SuggestionControls | null) => void;
101
114
  };
102
115
  }
103
116
  declare const useAgentMarksStore: import("zustand").UseBoundStore<import("zustand").StoreApi<AgentMarksState>>;