@burdenoff/fluidgrids-fe-sdk 2026.1113.6 → 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 (69) hide show
  1. package/dist/{AiStudioPage-DzvEkuoS.js → AiStudioPage-Di3eW5Lb.js} +4 -4
  2. package/dist/{DataSinkDashboardPage-DYuBqD2Y.js → DataSinkDashboardPage-231cS9dt.js} +1 -1
  3. package/dist/{ExecutionDetailPage-D40dK9iB.js → ExecutionDetailPage-B2jVApvM.js} +9 -6
  4. package/dist/{ExecutionsListPage-C-dujSS3.js → ExecutionsListPage-ZCmFNid9.js} +7 -4
  5. package/dist/{FluidGridsProvider-gB2POEu6.js → FluidGridsProvider-DQP7gPxN.js} +2 -1
  6. package/dist/{HistoryPage-8lQ6xf5Q.js → HistoryPage-C99YGv7V.js} +1 -1
  7. package/dist/{InsightsPage-YC1Bpqiz.js → InsightsPage-ySywDcp_.js} +1 -1
  8. package/dist/{NodesPage-DeBc3zix.js → NodesPage-B8fqXtey.js} +5 -4
  9. package/dist/{PaidTemplateConfirm-BadoJJPx.js → PaidTemplateConfirm-CI6TDivO.js} +1 -1
  10. package/dist/{QuotaExhaustedDialog-BBK3aX_0.js → QuotaExhaustedDialog-nlnRlQ2i.js} +1 -1
  11. package/dist/{SettingsPage-BfBa-qSk.js → SettingsPage-tKzJkG-L.js} +8 -8
  12. package/dist/{TemplateCard-lKGodHU8.js → TemplateCard-UnjAFsS4.js} +2 -2
  13. package/dist/{TemplatePreview-CwJfGqoH.js → TemplatePreview-DYxxlBad.js} +4 -4
  14. package/dist/{TemplatesPage-mRzYPtOC.js → TemplatesPage-Z2LDGg3g.js} +6 -6
  15. package/dist/TranslationBridge-Bd4aJKMs.d.ts +11 -0
  16. package/dist/{VariablesPage-8yuyDzCH.js → VariablesPage-_RKdfiw5.js} +1 -1
  17. package/dist/{WorkflowBuilder-DKqz8W6n.js → WorkflowBuilder-Dp9chOr5.js} +4 -4
  18. package/dist/{WorkflowBuilder-DtSOvYST.js → WorkflowBuilder-LkCC0Arp.js} +6 -6
  19. package/dist/{WorkflowSearchRedirect-mX-YNhkj.js → WorkflowSearchRedirect-DoiDmeyL.js} +1 -1
  20. package/dist/{WorkflowsList-DBKQLEUU.js → WorkflowsList-C86YEuZZ.js} +6 -6
  21. package/dist/agent-tools.d.ts +1 -1
  22. package/dist/agent-tools.js +2 -2
  23. package/dist/{agentTools-Dle04WMj.js → agentTools-BQbgd_wK.js} +3 -3
  24. package/dist/{attach-node-helpers-CNsYtLOR.js → attach-node-helpers-CtV1mej0.js} +1 -1
  25. package/dist/{canvasNoteTools-Bror30X8.js → canvasNoteTools-D9RwHOz4.js} +3 -3
  26. package/dist/{constants-XdvUxeWK.d.ts → constants-svpG-QrV.d.ts} +1 -9
  27. package/dist/entities-I_0kio3q.js +38 -0
  28. package/dist/executions.js +2 -2
  29. package/dist/{flow-builder-CErj7Fgi.js → flow-builder-7gVV3Y8R.js} +125 -26
  30. package/dist/history.js +1 -1
  31. package/dist/{index-Df6NgmmH.d.ts → index-8Ai8teoo.d.ts} +1 -1
  32. package/dist/{index-CHeY7_A1.d.ts → index-BZCX9eJJ.d.ts} +13 -0
  33. package/dist/index.d.ts +4 -3
  34. package/dist/index.js +34 -33
  35. package/dist/{logs-panel-2L4TLGcG.js → logs-panel-Cn4gGng9.js} +1 -1
  36. package/dist/{marksStore-DGCXjTmZ.js → marksStore-a9oIMMot.js} +25 -1
  37. package/dist/{node-detail-view-BqGpYHEE.js → node-detail-view-DtZe2ggI.js} +6 -6
  38. package/dist/{node-editor-tab-body-f2EIl5lh.js → node-editor-tab-body-CFprr94T.js} +3 -3
  39. package/dist/{node-operation-selection-Czeeb2D4.js → node-operation-selection-BGj5YwAS.js} +2 -30
  40. package/dist/node-type-icon-D28t8I64.js +35 -0
  41. package/dist/nodes.js +1 -1
  42. package/dist/observability.d.ts +1 -1
  43. package/dist/observability.js +2 -2
  44. package/dist/{popover-3Vs4f1Uy.js → popover-DuaVzhfH.js} +2 -2
  45. package/dist/proactive.d.ts +66 -0
  46. package/dist/proactive.js +237 -0
  47. package/dist/{quick-config-panel-Aja-lh3W.js → quick-config-panel-CmL27iO-.js} +5 -4
  48. package/dist/{schedule-panel-DCzLeJvi.js → schedule-panel-DIUNqU9B.js} +5 -5
  49. package/dist/settings.js +1 -1
  50. package/dist/{sidebar-node-editor-CWdejdLi.js → sidebar-node-editor-C_mhVSxd.js} +5 -4
  51. package/dist/templates.js +2 -2
  52. package/dist/{uiMarkTools-DZ6akjQK.js → uiMarkTools-B2581Qg-.js} +1 -1
  53. package/dist/{useWorkflowProposal-UtJYycLv.js → use-workflow-tests-BUzndyWO.js} +4 -3265
  54. package/dist/{useAgentDefinitions-DoMEv0kS.js → useAgentDefinitions-CKZ7oDZD.js} +1 -1
  55. package/dist/{useDurableParity-9mQYNpiP.js → useDurableParity-BUSM-z_7.js} +1 -1
  56. package/dist/{useExecutions-BvldyVgF.js → useExecutions-DSZisQHk.js} +1 -1
  57. package/dist/{useGlobalStoreClient-CpTRykJx.js → useGlobalStoreClient-CXPqlK1M.js} +1 -1
  58. package/dist/{useObservability-Cps9Y9a3.js → useObservability-n7Qdc8Xg.js} +1 -1
  59. package/dist/{useRunHistory-DoxQsQIm.js → useRunHistory-Bxs6LrME.js} +1 -1
  60. package/dist/{useWorkflowCodeExport-BLl0hv2J.js → useWorkflowCodeExport-Bj4QY-xY.js} +1 -1
  61. package/dist/useWorkflowProposal-B9vXLKef.js +3280 -0
  62. package/dist/{useWorkflows-Z4M64JlD.js → useWorkflows-BY5b8r9n.js} +1 -1
  63. package/dist/workflow-builder.js +5 -5
  64. package/dist/workflow-host.d.ts +2 -1
  65. package/dist/workflow-pages.d.ts +1 -1
  66. package/dist/workflow-pages.js +15 -15
  67. package/dist/workflow-preview.js +1 -1
  68. package/dist/workflows-list.js +1 -1
  69. package/package.json +7 -3
@@ -1,13 +1,14 @@
1
1
  "use client";
2
- import { A as NodeTypeIcon, F as isTriggerOperation, M as useFlowStore, N as useIsValidConnection, j as isImageIcon, r as CODE_WORKFLOW_NODE_TYPE } from "./node-operation-selection-Czeeb2D4.js";
3
- import { A as workflowParameterIssues, At as shouldReleaseForIdle, Bt as AUTOSAVE_RETRY_DELAYS_MS, Ct as bannerOf, D as useInsertNode, Dt as phaseAfterAcquire, Et as leaseCallSequence, Ft as sessionBeforeReload, Gt as resettledBaseline, In as getNodeDetail, It as rememberOwnStatusChange, Jt as useNodeExecution, Kt as saveFailureActionOf, Ln as buildStickyNode, Lt as rememberRevision, Mt as EDIT_SESSION_ID, Nt as forgetSessionForReload, O as MissingParametersDialog, Ot as phaseAfterTakeOver, Pt as rememberSessionForReload, Rn as loadMarkdown, Rt as revisionOf, St as useEditLeaseStore, T as buildOperationSeed, Tt as leaseCallQueue, Vt as canAutosave, Wt as inAppLeaveTarget, _t as refusalOfQuota, a as NODES_METADATA, at as editingLeaseLocked, bt as workflowSaveQueue, ct as touchesSavedFields, dt as useFlowValidator, et as useGuardedNavigate, f as isNodeConfigsInitialized, ft as useSaveWorkflow, g as registerWorkflowNodeTypes, i as AVAILABLE_NODES, it as editStateFor, jt as tickAction, k as useRunGuard, kt as releasesOnClose, l as ensureNodeConfigsLoaded, ln as loadDefinitionJson, lt as watchLeavingLosesChanges, m as refetchStoreNodes, nt as autosaveAllowedFor, o as NODE_CONFIGS, on as useCanvasEdges, ot as leavingLosesChanges, p as onNodeTypesUpdate, qt as workflowFingerprint, rt as departingSave, s as NODE_TYPES, sn as useNodeRegistryRevision, st as savedEverythingBeforeLeaving, t as FluidGridsContext, tt as useManualSave, ut as isFlowComplete, v as scheduleNodePaletteLoad, vt as saveIndicatorOf, wt as isLocked, x as getNodeMetadata, xt as useEditLeaseLocked, yt as useSaveStatusStore, zn as useMarkdownRenderer, zt as AUTOSAVE_DEBOUNCE_MS } from "./FluidGridsProvider-gB2POEu6.js";
2
+ import { A as useFlowStore, N as isTriggerOperation, j as useIsValidConnection, r as CODE_WORKFLOW_NODE_TYPE } from "./node-operation-selection-BGj5YwAS.js";
3
+ import { A as workflowParameterIssues, At as shouldReleaseForIdle, Bt as AUTOSAVE_RETRY_DELAYS_MS, Ct as bannerOf, D as useInsertNode, Dt as phaseAfterAcquire, Et as leaseCallSequence, Ft as sessionBeforeReload, Gt as resettledBaseline, In as getNodeDetail, It as rememberOwnStatusChange, Jt as useNodeExecution, Kt as saveFailureActionOf, Ln as buildStickyNode, Lt as rememberRevision, Mt as EDIT_SESSION_ID, Nt as forgetSessionForReload, O as MissingParametersDialog, Ot as phaseAfterTakeOver, Pt as rememberSessionForReload, Rn as loadMarkdown, Rt as revisionOf, St as useEditLeaseStore, T as buildOperationSeed, Tt as leaseCallQueue, Vt as canAutosave, Wt as inAppLeaveTarget, _t as refusalOfQuota, a as NODES_METADATA, at as editingLeaseLocked, bt as workflowSaveQueue, ct as touchesSavedFields, dt as useFlowValidator, et as useGuardedNavigate, f as isNodeConfigsInitialized, ft as useSaveWorkflow, g as registerWorkflowNodeTypes, i as AVAILABLE_NODES, it as editStateFor, jt as tickAction, k as useRunGuard, kt as releasesOnClose, l as ensureNodeConfigsLoaded, ln as loadDefinitionJson, lt as watchLeavingLosesChanges, m as refetchStoreNodes, nt as autosaveAllowedFor, o as NODE_CONFIGS, on as useCanvasEdges, ot as leavingLosesChanges, p as onNodeTypesUpdate, qt as workflowFingerprint, rt as departingSave, s as NODE_TYPES, sn as useNodeRegistryRevision, st as savedEverythingBeforeLeaving, t as FluidGridsContext, tt as useManualSave, ut as isFlowComplete, v as scheduleNodePaletteLoad, vt as saveIndicatorOf, wt as isLocked, x as getNodeMetadata, xt as useEditLeaseLocked, yt as useSaveStatusStore, zn as useMarkdownRenderer, zt as AUTOSAVE_DEBOUNCE_MS } from "./FluidGridsProvider-DQP7gPxN.js";
4
4
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
5
5
  import { n as preloadableLazy } from "./preloadable-lazy-Pp47mqQ9.js";
6
6
  import { t as Input$1 } from "./input-ChT6Q-Pr.js";
7
- import { t as useGlobalStoreClient } from "./useGlobalStoreClient-CpTRykJx.js";
7
+ import { t as useGlobalStoreClient } from "./useGlobalStoreClient-CXPqlK1M.js";
8
8
  import { r as getFluidGridsConfig } from "./config-X97zrIvn.js";
9
- import { _ as useInstalledNodes, d as getStoreNodeAvailability, f as getStoreNodeIcon, g as storeNodeInstallVersion, h as storeNodeDisplayVersion, i as useTemplateImportFlow, l as useWorkflowTemplates, m as isStoreNodeUpdateAvailable, p as getStoreNodeType, t as TemplateCard, u as filterStoreNodesForPalette } from "./TemplateCard-lKGodHU8.js";
9
+ import { _ as useInstalledNodes, d as getStoreNodeAvailability, f as getStoreNodeIcon, g as storeNodeInstallVersion, h as storeNodeDisplayVersion, i as useTemplateImportFlow, l as useWorkflowTemplates, m as isStoreNodeUpdateAvailable, p as getStoreNodeType, t as TemplateCard, u as filterStoreNodesForPalette } from "./TemplateCard-UnjAFsS4.js";
10
10
  import { _ as useWorkflowTestsEnabled, d as useFluidGridsFlag, h as usePhaseDFlags, l as useDurableFunctionNodesEnabled, p as usePaletteGates, t as FLUIDGRIDS_FLAGS, u as useDurableParityEnabled } from "./feature-flags-B_b8PJ6Z.js";
11
+ import { n as isImageIcon, t as NodeTypeIcon } from "./node-type-icon-D28t8I64.js";
11
12
  import { i as filterPaletteNodes } from "./durable-nodes-DXCCQYWD.js";
12
13
  import { c as NODE_TYPE_DRAG_DATA_FORMAT, l as STICKY_NOTE_TYPE, s as NODE_OPERATION_DRAG_DATA_FORMAT } from "./sticky-notes-23j-wL6Q.js";
13
14
  import { t as Button$2 } from "./button-DG7y_FVJ.js";
@@ -17,28 +18,29 @@ import { o as emitUpgradeClicked, t as emitNodeInstalled } from "./fluidgridsEve
17
18
  import { n as getFluidGridsClient, s as waitForFluidGridsClient } from "./client-Ctl4jmY3.js";
18
19
  import { c as NodeSchemaIntrospectionDocument, l as RemoveNodeFromWorkflowsDocument, n as useConnections, s as NodeUsageStatusDocument } from "./useConnections-BlB0gbOB.js";
19
20
  import { o as throwIfResultError, t as describeOperationError } from "./errors-xPZ-IbQd.js";
20
- import { n as firstInputHandleId, t as computeAttachPosition } from "./attach-node-helpers-CNsYtLOR.js";
21
+ import { n as firstInputHandleId, t as computeAttachPosition } from "./attach-node-helpers-CtV1mej0.js";
21
22
  import { a as DialogFooter$1, i as DialogDescription$1, l as DialogTitle$1, o as DialogHeader$1, r as DialogContent$1, t as Dialog$1 } from "./dialog-BVd152GS.js";
22
23
  import { t as NavigationV2Provider } from "./NavigationV2Provider-DCDt35eG.js";
23
24
  import { i as emitFluidGridsEvent } from "./token-refresh-link-BjN7H4qA.js";
24
25
  import { n as useBuilderReadOnly, t as BuilderReadOnlyProvider } from "./read-only-context-Dt9N9SIG.js";
25
26
  import { r as MAPPING_TYPE_COLORS, t as MAPPING_COMPATIBILITY_COLORS } from "./mapping-colors-BIX_YeCQ.js";
26
- import { n as LogsPanel } from "./logs-panel-2L4TLGcG.js";
27
- 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 { r as useExecutionActions } from "./useExecutions-BvldyVgF.js";
29
- import { n as useAgentMarksStore } from "./marksStore-DGCXjTmZ.js";
27
+ import { n as LogsPanel } from "./logs-panel-Cn4gGng9.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
+ import { r as useExecutionActions } from "./useExecutions-DSZisQHk.js";
30
+ import { n as useAgentMarksStore } from "./marksStore-a9oIMMot.js";
30
31
  import { t as notesKeyOf } from "./notesKey-5EaREBGA.js";
31
- import { a as saveWorkflowDescription, c as CreateWorkflowRefusalDialog, i as normalizeWorkflowDescription, n as useWorkflowCodeExport, o as visibleWorkflowDescription, r as commitWorkflowDescription, s as workflowDescriptionCharactersLeft } from "./useWorkflowCodeExport-BLl0hv2J.js";
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";
32
33
  import { r as RUNS_QUOTA_NAME, t as BILLING_PLANS_PATH } from "./quota-Cdt8yz7N.js";
33
34
  import { t as EntityTagPicker } from "./EntityTagPicker-BppBSEJk.js";
34
35
  import { t as FluidGridsDocsLink } from "./FluidGridsDocsLink-JxkBpOeb.js";
35
36
  import { n as runsQuotaLevel, t as readRunsQuota } from "./runsQuota-DvXR6mRN.js";
36
37
  import { a as SdkPermissionGate, i as SdkPermissionButton, s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-dcxg6zG6.js";
37
- import { a as useDeactivateWorkflow, d as useRestoreWorkflowVersion, o as useDeleteWorkflow, t as useActivateWorkflow, v as useWorkflowVersions } from "./useWorkflows-Z4M64JlD.js";
38
+ import { a as useDeactivateWorkflow, d as useRestoreWorkflowVersion, o as useDeleteWorkflow, t as useActivateWorkflow, v as useWorkflowVersions } from "./useWorkflows-BY5b8r9n.js";
38
39
  import { t as WorkflowDefinitionDocument } from "./WorkflowDefinitionDocument-DZLbTPUZ.js";
39
40
  import { o as countLifecycle, t as VersionLifecycleBar } from "./VersionLifecycleBar-DuphLOT0.js";
40
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";
41
42
  import { t as buildNodeDisplayMap } from "./run-display-BycKYSU0.js";
43
+ import { t as useWorkflowProposal } from "./useWorkflowProposal-B9vXLKef.js";
42
44
  import { n as useRequestedProposal } from "./useRequestedProposal-B7uPXfZB.js";
43
45
  import { t as AiCreditBalanceSlot } from "./aiCreditsBridge-BuE92tKo.js";
44
46
  import { t as downloadBlob } from "./workflow-transfer-CQnQC-ke.js";
@@ -63,6 +65,7 @@ import { AlertCircle, AlertTriangle, ArrowRight, BadgeCheck, Check, CircleHelp,
63
65
  import { isEmpty } from "radash";
64
66
  import { animate, easeOut } from "popmotion";
65
67
  import { createPortal } from "react-dom";
68
+ import { SuggestionBadge } from "@burdenoff/fe-libs/shared/proactive";
66
69
  import { useUnsavedChanges } from "@burdenoff/fe-libs/shared/hooks";
67
70
  import { buildActorFallback, useActorProfiles } from "@burdenoff/fe-libs/shared";
68
71
 
@@ -6683,9 +6686,9 @@ function IntroductionPropertyPanel() {
6683
6686
  * waiting for its chunk and React's Suspense throttle (about 0.5 s on first
6684
6687
  * open even with the chunk cached).
6685
6688
  */
6686
- const NodeDetailViewOverlay = preloadableLazy(() => import("./node-detail-view-BqGpYHEE.js").then((m) => m.NodeDetailView), "NodeDetailView");
6687
- const QuickConfigPanelOverlay = preloadableLazy(() => import("./quick-config-panel-Aja-lh3W.js").then((m) => m.QuickConfigPanel), "QuickConfigPanel");
6688
- const SidebarNodeEditorOverlay = preloadableLazy(() => import("./sidebar-node-editor-CWdejdLi.js").then((m) => m.SidebarNodeEditor), "SidebarNodeEditor");
6689
+ const NodeDetailViewOverlay = preloadableLazy(() => import("./node-detail-view-DtZe2ggI.js").then((m) => m.NodeDetailView), "NodeDetailView");
6690
+ const QuickConfigPanelOverlay = preloadableLazy(() => import("./quick-config-panel-CmL27iO-.js").then((m) => m.QuickConfigPanel), "QuickConfigPanel");
6691
+ const SidebarNodeEditorOverlay = preloadableLazy(() => import("./sidebar-node-editor-C_mhVSxd.js").then((m) => m.SidebarNodeEditor), "SidebarNodeEditor");
6689
6692
  const WorkflowShareDialogOverlay = preloadableLazy(() => import("./WorkflowShareDialog-BcfzZDOj.js").then((n) => n.n).then((m) => m.WorkflowShareDialog), "WorkflowShareDialog");
6690
6693
  const ConnectionFormDialogOverlay = preloadableLazy(() => import("./ConnectionFormDialog-Dr1-CTan.js").then((n) => n.n).then((m) => m.ConnectionFormDialog), "ConnectionFormDialog");
6691
6694
  const EdgeMapperOverlay = preloadableLazy(() => import("./app-BIsCEL65.js").then((m) => m.default), "EdgeMapper");
@@ -12207,6 +12210,17 @@ function WebhookRunFollower() {
12207
12210
  *
12208
12211
  * Everything here is `data-agent="deny"`: an agent cannot read or press its
12209
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.
12210
12224
  */
12211
12225
  const FLASH_MS = 1800;
12212
12226
  const RING_PAD = 8;
@@ -12314,8 +12328,15 @@ const CanvasNoteCard = ({ note, nodeOnCanvas }) => {
12314
12328
  ]
12315
12329
  });
12316
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)) });
12317
12338
  /** The pins above one node, and the open card. */
12318
- const NodePins = ({ nodeId, notes }) => {
12339
+ const NodePins = ({ nodeId, notes, suggestions }) => {
12319
12340
  const tr = useTr();
12320
12341
  const openNoteId = useAgentMarksStore((state) => state.openNoteId);
12321
12342
  const openNote = useAgentMarksStore((state) => state.actions.openNote);
@@ -12334,9 +12355,12 @@ const NodePins = ({ nodeId, notes }) => {
12334
12355
  children: [open && /* @__PURE__ */ jsx(CanvasNoteCard, {
12335
12356
  note: open,
12336
12357
  nodeOnCanvas: true
12337
- }), /* @__PURE__ */ jsx("div", {
12358
+ }), /* @__PURE__ */ jsxs("div", {
12338
12359
  className: "flex gap-1",
12339
- 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", {
12340
12364
  type: "button",
12341
12365
  "data-testid": "fg-canvas-note-pin",
12342
12366
  "aria-expanded": note.id === openNoteId,
@@ -12347,7 +12371,7 @@ const NodePins = ({ nodeId, notes }) => {
12347
12371
  "aria-hidden": "true",
12348
12372
  className: "size-3.5"
12349
12373
  }) : note.number
12350
- }, note.id))
12374
+ }, note.id))]
12351
12375
  })]
12352
12376
  })
12353
12377
  });
@@ -12439,10 +12463,48 @@ const NotesList = ({ notes, live }) => {
12439
12463
  })
12440
12464
  });
12441
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
+ }
12442
12501
  const CanvasNotesLayer = () => {
12443
12502
  const workflowKey = useFlowStore((state) => notesKeyOf(state.workflow));
12503
+ const savedKey = useFlowStore((state) => state.workflow.workflowKey);
12444
12504
  const nodeIds = useFlowStore(useShallow((state) => state.workflow.nodes.map((node) => node.id)));
12445
12505
  const allNotes = useAgentMarksStore((state) => state.notes);
12506
+ const canvasSuggestions = useAgentMarksStore((state) => state.canvasSuggestions);
12507
+ useReportProactiveCanvas(savedKey || void 0, nodeIds);
12446
12508
  const notes = useMemo(() => allNotes.filter((note) => note.workflowKey === workflowKey), [allNotes, workflowKey]);
12447
12509
  const live = useMemo(() => new Set(nodeIds), [nodeIds]);
12448
12510
  const byNode = useMemo(() => {
@@ -12451,10 +12513,36 @@ const CanvasNotesLayer = () => {
12451
12513
  if (!live.has(note.nodeId)) continue;
12452
12514
  groups.set(note.nodeId, [...groups.get(note.nodeId) ?? [], note]);
12453
12515
  }
12454
- return [...groups.entries()];
12516
+ return groups;
12455
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]);
12456
12544
  return /* @__PURE__ */ jsxs(Fragment$1, { children: [
12457
- /* @__PURE__ */ jsxs(ViewportPortal, { children: [byNode.map(([nodeId, nodeNotes]) => {
12545
+ /* @__PURE__ */ jsxs(ViewportPortal, { children: [[...byNode.entries()].map(([nodeId, nodeNotes]) => {
12458
12546
  const openNotes = nodeNotes.filter((note) => !note.resolved);
12459
12547
  if (openNotes.length === 0) return null;
12460
12548
  const tone = openNotes.some((note) => note.kind === "fix") ? "fix" : "info";
@@ -12463,10 +12551,21 @@ const CanvasNotesLayer = () => {
12463
12551
  tone
12464
12552
  }, nodeId);
12465
12553
  }), /* @__PURE__ */ jsx(FlashRing, {})] }),
12466
- byNode.map(([nodeId, nodeNotes]) => /* @__PURE__ */ jsx(NodePins, {
12467
- nodeId,
12468
- notes: nodeNotes
12469
- }, 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
+ }),
12470
12569
  notes.length > 0 && /* @__PURE__ */ jsx(NotesList, {
12471
12570
  notes,
12472
12571
  live
@@ -19342,7 +19441,7 @@ const FlowBuilder = ({ readOnly = false, fitToScreen = false }) => {
19342
19441
  paletteGatesRef.current = paletteGates;
19343
19442
  }, [paletteGates]);
19344
19443
  useWarmBuilderOverlays();
19345
- useLazyAgentTools(() => import("./agentTools-Dle04WMj.js").then(({ createBuilderAgentTools }) => createBuilderAgentTools({ durableFunctionsEnabled: () => paletteGatesRef.current })), !editingBlocked, "Agent tools");
19444
+ useLazyAgentTools(() => import("./agentTools-BQbgd_wK.js").then(({ createBuilderAgentTools }) => createBuilderAgentTools({ durableFunctionsEnabled: () => paletteGatesRef.current })), !editingBlocked, "Agent tools");
19346
19445
  const [nodes, edges, onNodesChange, onEdgesChange, onConnect] = useFlowStore(useShallow((s) => {
19347
19446
  return [
19348
19447
  s.workflow.nodes,
@@ -19384,7 +19483,7 @@ const FlowBuilder = ({ readOnly = false, fitToScreen = false }) => {
19384
19483
  useEffect(() => {
19385
19484
  fitViewRef.current = fitView;
19386
19485
  }, [fitView]);
19387
- useLazyAgentTools(() => import("./canvasNoteTools-Bror30X8.js").then(({ createCanvasNoteTools }) => createCanvasNoteTools({ focusNode: (nodeId) => fitViewRef.current({
19486
+ useLazyAgentTools(() => import("./canvasNoteTools-D9RwHOz4.js").then(({ createCanvasNoteTools }) => createCanvasNoteTools({ focusNode: (nodeId) => fitViewRef.current({
19388
19487
  nodes: [{ id: nodeId }],
19389
19488
  duration: 400,
19390
19489
  padding: .6,
package/dist/history.js CHANGED
@@ -1,4 +1,4 @@
1
1
  "use client";
2
- import { t as HistoryPage } from "./HistoryPage-8lQ6xf5Q.js";
2
+ import { t as HistoryPage } from "./HistoryPage-C99YGv7V.js";
3
3
 
4
4
  export { HistoryPage };
@@ -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>>;