@burdenoff/fluidgrids-fe-sdk 2026.1113.9 → 2026.1113.11

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 (68) hide show
  1. package/dist/{AiStudioPage-D9vovsZE.js → AiStudioPage-BP2cLXEK.js} +4 -4
  2. package/dist/{DataSinkDashboardPage-CXb1uNau.js → DataSinkDashboardPage-CiFi9YXQ.js} +1 -1
  3. package/dist/{ExecutionDetailPage-BuU66VvK.js → ExecutionDetailPage-BfFrWnBj.js} +104 -44
  4. package/dist/{ExecutionsListPage-DMAOPJCa.js → ExecutionsListPage-BRvj71Nd.js} +6 -6
  5. package/dist/{FailureTriagePanel-DA91XKVj.js → FailureTriagePanel-CbDIdU8s.js} +1 -1
  6. package/dist/{FluidGridsProvider-BOBuK7kj.js → FluidGridsProvider-Dxehlm-2.js} +111 -11
  7. package/dist/{HistoryPage-DUcPEycb.js → HistoryPage-CjtgUOZr.js} +1 -1
  8. package/dist/{InsightsPage-C3FjaLKN.js → InsightsPage-BsGqBpUO.js} +5 -5
  9. package/dist/{OpenTemplateAsCodeButton-BdcTxemq.js → OpenTemplateAsCodeButton-C-6JVZoS.js} +1 -1
  10. package/dist/{PaidTemplateConfirm-Dop_rxCQ.js → PaidTemplateConfirm-BUBCnbP0.js} +1 -1
  11. package/dist/{QuotaExhaustedDialog-CijT1MyD.js → QuotaExhaustedDialog-BEsj0A-I.js} +1 -1
  12. package/dist/{SettingsPage-C4G9OlJV.js → SettingsPage-DpBhx95x.js} +6 -6
  13. package/dist/{TaskQueuesPage-DsGNGmGN.js → TaskQueuesPage-DLzuumGp.js} +1 -1
  14. package/dist/{TemplateCard-7rE1VAIC.js → TemplateCard-DD3vJ3a5.js} +4 -4
  15. package/dist/{TemplateConfigurationModal-CxUEsjbr.js → TemplateConfigurationModal-BtzI-4fr.js} +1 -1
  16. package/dist/{TemplatePreview-CSA9W-e1.js → TemplatePreview-Ca7df91b.js} +5 -5
  17. package/dist/{TemplatesPage-C_trA48U.js → TemplatesPage-BSMLtMnf.js} +7 -7
  18. package/dist/{WorkflowBuilder-DZWmp9Vg.js → WorkflowBuilder-Bok_WtPQ.js} +6 -6
  19. package/dist/{WorkflowBuilder-CkoZDS1_.js → WorkflowBuilder-Dh8MYfZJ.js} +4 -4
  20. package/dist/{WorkflowSearchRedirect-DQj9_HqI.js → WorkflowSearchRedirect-bcWo68LY.js} +1 -1
  21. package/dist/{WorkflowShareDialog-BcfzZDOj.js → WorkflowShareDialog-D8psodlb.js} +1 -1
  22. package/dist/{WorkflowsList-BOTt7lX5.js → WorkflowsList-DURQu2ZD.js} +10 -10
  23. package/dist/{agentTools-CSoCNDRx.js → agentTools-B4BDCe57.js} +3 -3
  24. package/dist/{ai-usage-D7SjIkUZ.js → ai-usage-DVtvLZ2P.js} +1 -1
  25. package/dist/{askAboutBridge-kpcjcR9Y.js → askAboutBridge-ByYsQams.js} +36 -2
  26. package/dist/{assert-rules-C5739QR0.js → assert-rules-BbSyxL5d.js} +1 -1
  27. package/dist/assistant.d.ts +2 -0
  28. package/dist/assistant.js +1 -1
  29. package/dist/{attach-node-helpers-CtV1mej0.js → attach-node-helpers-CCWFS75V.js} +1 -1
  30. package/dist/{canvasNoteTools-DTc3EKvg.js → canvasNoteTools-CLMZ6u5m.js} +2 -2
  31. package/dist/executions.js +2 -2
  32. package/dist/{flow-builder-CYlYHdhf.js → flow-builder-CIvz3sOr.js} +19 -19
  33. package/dist/{graphql-types-C5Tr6508.js → graphql-types-D82O-0XY.js} +513 -47
  34. package/dist/history.js +1 -1
  35. package/dist/{index-8Ai8teoo.d.ts → index-BDN8AK1D.d.ts} +1251 -27
  36. package/dist/index.d.ts +2 -2
  37. package/dist/index.js +34 -34
  38. package/dist/{logs-panel-Cn4gGng9.js → logs-panel-_Dl5Nrdn.js} +1 -1
  39. package/dist/{node-detail-view-N6n3qegt.js → node-detail-view-Dz1ZCIzV.js} +7 -7
  40. package/dist/{node-editor-tab-body-CivWI2hg.js → node-editor-tab-body-D5ybpm-b.js} +3 -3
  41. package/dist/{node-operation-selection-BGj5YwAS.js → node-operation-selection-bFx9s45-.js} +16 -4
  42. package/dist/observability.d.ts +1 -1
  43. package/dist/observability.js +2 -2
  44. package/dist/{popover-a8WKNgPP.js → popover-ClSWhtja.js} +104 -3
  45. package/dist/{quick-config-panel-DABEVJR9.js → quick-config-panel-iDMk4TT5.js} +4 -4
  46. package/dist/{run-list-links-DZ8Q5l35.js → run-list-links-CPJimzkr.js} +1 -1
  47. package/dist/{run-mode-BMxym0mD.js → run-mode-Du-fvjtE.js} +1 -1
  48. package/dist/{schedule-panel--u7WXnaC.js → schedule-panel-DzkTZm2q.js} +309 -66
  49. package/dist/settings.js +1 -1
  50. package/dist/{sidebar-node-editor-BHqtoMC5.js → sidebar-node-editor-C16VnTzr.js} +4 -4
  51. package/dist/{template-code-CobAYaeH.js → template-code-CEjudJEY.js} +1 -1
  52. package/dist/templates.js +2 -2
  53. package/dist/{use-workflow-tests-BUzndyWO.js → use-workflow-tests-Lz8fPQZg.js} +2 -2
  54. package/dist/{useAgentDefinitions-DykIYrep.js → useAgentDefinitions-akQ6WwzD.js} +1 -1
  55. package/dist/{useDurableParity-sS0LIJ_l.js → useDurableParity-fZcATZHI.js} +1 -1
  56. package/dist/{useExecutions-GgjDOgcd.js → useExecutions-lRqeXDYS.js} +2 -2
  57. package/dist/{useGlobalStoreClient-BfmKmeIx.js → useGlobalStoreClient-BOI2kYRv.js} +1 -1
  58. package/dist/{useObservability-AMDVk_hX.js → useObservability-CBFLQBQO.js} +1 -1
  59. package/dist/{useRunHistory-gnqIoJnZ.js → useRunHistory-DSDD_ha3.js} +2 -2
  60. package/dist/{useWorkflowCodeExport-DrcfDTcD.js → useWorkflowCodeExport-qGat2KNz.js} +2 -2
  61. package/dist/{useWorkflows-DSZUrK_o.js → useWorkflows-CXwXQg74.js} +1 -1
  62. package/dist/workflow-builder.js +5 -5
  63. package/dist/{workflow-code-transfer-Dbnvw5fc.js → workflow-code-transfer-50pRK3nx.js} +1 -1
  64. package/dist/workflow-pages.d.ts +1 -1
  65. package/dist/workflow-pages.js +14 -14
  66. package/dist/workflow-preview.js +1 -1
  67. package/dist/workflows-list.js +1 -1
  68. package/package.json +1 -1
@@ -1,15 +1,15 @@
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-CYlYHdhf.js";
5
- import { D as buildOperationSeed, _t as classifyCreateRefusal, gt as builderPathOf, u as ensureNodeTypesLoaded } from "./FluidGridsProvider-BOBuK7kj.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-CIvz3sOr.js";
5
+ import { bt as builderPathOf, j as buildOperationSeed, u as ensureNodeTypesLoaded, xt as classifyCreateRefusal } from "./FluidGridsProvider-Dxehlm-2.js";
6
6
  import { n as getFluidGridsClient } from "./client-Ctl4jmY3.js";
7
7
  import { o as throwIfResultError } from "./errors-xPZ-IbQd.js";
8
8
  import { a as notifyFluidGridsAiCreditsUpdated, t as AiCreditBalanceSlot } from "./aiCreditsBridge-BuE92tKo.js";
9
- import { n as useCreateWorkflow } from "./useWorkflows-DSZUrK_o.js";
9
+ import { n as useCreateWorkflow } from "./useWorkflows-CXwXQg74.js";
10
10
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
11
11
  import { t as BILLING_PLANS_PATH } from "./quota-Cdt8yz7N.js";
12
- import { c as CreateWorkflowRefusalDialog } from "./useWorkflowCodeExport-DrcfDTcD.js";
12
+ import { c as CreateWorkflowRefusalDialog } from "./useWorkflowCodeExport-qGat2KNz.js";
13
13
  import { s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-dcxg6zG6.js";
14
14
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
15
15
  import { useNavigate } from "react-router";
@@ -2,7 +2,7 @@
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
3
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
4
4
  import { n as useNavigationV2 } from "./useNavigationV2-C2WeqN7d.js";
5
- import { n as useDataSinks, t as useDataSinkData } from "./useObservability-AMDVk_hX.js";
5
+ import { n as useDataSinks, t as useDataSinkData } from "./useObservability-CBFLQBQO.js";
6
6
  import { c as prettyJson, r as formatTimestamp, t as formatBytes } from "./utils-C0dtnN4R.js";
7
7
  import { useEffect, useMemo, useState } from "react";
8
8
  import { Icon } from "@iconify/react";
@@ -1,14 +1,14 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
- import { c as errorAdvice, d as NodeStatusBadge, i as useRunPending, l as needsReconnect, n as useDurableParityRunFields, o as ConfirmStopRunDialog, r as useRunMetadata, t as setRunVersioningOverride, u as ExecutionStatusBadge } from "./useDurableParity-sS0LIJ_l.js";
3
+ import { c as errorAdvice, d as NodeStatusBadge, i as useRunPending, l as needsReconnect, n as useDurableParityRunFields, o as ConfirmStopRunDialog, r as useRunMetadata, t as setRunVersioningOverride, u as ExecutionStatusBadge } from "./useDurableParity-fZcATZHI.js";
4
4
  import { n as formatRunVersion, r as nodeDisplayTitle, t as buildNodeDisplayMap } from "./run-display-UjLAoYqQ.js";
5
5
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
6
6
  import { c as RunLogAppendedDocument, l as RunLogsDocument, s as isAgentNodeType } from "./agent-form-D0uLvzx4.js";
7
- import { $t as runDurationMs, C as describeRun, Qt as nodeStateDurationMs, T as describeRunStep, Zt as formatElapsedMs, hn as durableInterfaceOf, pn as canSignalRun, vn as runSignalTargets, w as describeRunError } from "./FluidGridsProvider-BOBuK7kj.js";
8
- import { i as useFgAskableSelection, r as useFgAskable } from "./askAboutBridge-kpcjcR9Y.js";
7
+ import { C as failureQuestions, D as describeRun, E as runStepQuestions, O as describeRunError, Sn as runSignalTargets, T as runQuestions, _n as canSignalRun, k as describeRunStep, nn as nodeStateDurationMs, rn as runDurationMs, tn as formatElapsedMs, w as isFailedStatus, yn as durableInterfaceOf } from "./FluidGridsProvider-Dxehlm-2.js";
8
+ import { i as useFgAskable, o as useFgAskableSelection, r as useFgAskAssistant } from "./askAboutBridge-ByYsQams.js";
9
9
  import { n as useNavigationV2 } from "./useNavigationV2-C2WeqN7d.js";
10
10
  import { t as TechnicalDetails } from "./TechnicalDetails-r5JXr1jZ.js";
11
- import { _ as shortRunId, g as runChainLinks, h as parseMetadataDefinition, m as overrideRequestOf, n as useExecution, p as callbackTone, r as useExecutionActions, s as buildRetryTriggerInput, t as useAutoRefresh } from "./useExecutions-GgjDOgcd.js";
11
+ import { _ as shortRunId, g as runChainLinks, h as parseMetadataDefinition, m as overrideRequestOf, n as useExecution, p as callbackTone, r as useExecutionActions, s as buildRetryTriggerInput, t as useAutoRefresh } from "./useExecutions-lRqeXDYS.js";
12
12
  import { t as RunActionsMenu } from "./RunActionsMenu-BZY4NreS.js";
13
13
  import { n as getFluidGridsClient, r as getFluidGridsClientSafe } from "./client-Ctl4jmY3.js";
14
14
  import { o as throwIfResultError, t as describeOperationError } from "./errors-xPZ-IbQd.js";
@@ -22,16 +22,16 @@ import { a as encodedPayloadBytes, f as EffectBadge, h as useRunPolicyDecisions,
22
22
  import { t as useWorkflowProposal } from "./useWorkflowProposal-B9vXLKef.js";
23
23
  import { t as WorkflowProposalCard } from "./WorkflowProposalCard-SmRv_Egf.js";
24
24
  import { t as AiCreditBalanceSlot } from "./aiCreditsBridge-BuE92tKo.js";
25
- import { a as fetchRunFailureClusters, i as dismissRunFailureCluster, r as OPEN_STATUSES, t as BUCKET_LABELS } from "./FailureTriagePanel-DA91XKVj.js";
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-gnqIoJnZ.js";
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";
29
- import { a as formatTokens, d as formatMicroUsd, o as modelLabel, r as aiCost } from "./ai-usage-D7SjIkUZ.js";
25
+ import { a as fetchRunFailureClusters, i as dismissRunFailureCluster, r as OPEN_STATUSES, t as BUCKET_LABELS } from "./FailureTriagePanel-CbDIdU8s.js";
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-DSDD_ha3.js";
27
+ import { L as AgentStepKind, VI as WorkflowQueryRejectCondition, Wd as ErrorType, sL as WorkflowUpdateWaitFor, xF as VersioningBehavior } from "./graphql-types-D82O-0XY.js";
28
+ import { _ as agentTokenStreamsFor, g as agentLiveReplyState, h as useAgentTokenStream, i as canSaveRunAsTestCase, t as saveRunAsTestCase } from "./use-workflow-tests-Lz8fPQZg.js";
29
+ import { a as formatTokens, d as formatMicroUsd, o as modelLabel, r as aiCost } from "./ai-usage-DVtvLZ2P.js";
30
30
  import { _ as useWorkflowTestsEnabled, l as useDurableFunctionNodesEnabled, m as usePhaseCFlags, u as useDurableParityEnabled } from "./feature-flags-B_b8PJ6Z.js";
31
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";
32
32
  import { a as fetchTaskQueueStats } from "./api-DKfMt0IX.js";
33
33
  import { a as RUN_CONTROL_DIALOG_STYLE, c as parseJsonInput, i as NativeSelect, l as parseJsonObjectInput, n as JsonBlock, o as StatusPill, r as JsonField, s as newRunControlId, t as FieldError, u as useResource } from "./shared-C0LCTtyh.js";
34
- import { v as useWorkflowVersions } from "./useWorkflows-DSZUrK_o.js";
34
+ import { v as useWorkflowVersions } from "./useWorkflows-CXwXQg74.js";
35
35
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
36
36
  import { Link, useNavigate, useParams, useSearchParams } from "react-router";
37
37
  import { Icon } from "@iconify/react";
@@ -1960,16 +1960,19 @@ function NodeTimeline({ nodeStates, nodeDisplay, loading, triggerNodeId, onRetry
1960
1960
  const isWaitingSubworkflow = node.status === "WAITING_SUBWORKFLOW";
1961
1961
  const hasChildRun = Boolean(node.childRunId);
1962
1962
  const stepName = nodeDisplayTitle(nodeDisplay?.[node.nodeId], node.nodeId);
1963
- const describeStep = () => askRun ? describeRunStep({
1964
- run: askRun,
1965
- stepId: node.nodeId,
1966
- stepName,
1967
- stepType: node.nodeType,
1968
- stepVersion: node.nodeVersion,
1969
- status: node.status,
1970
- errorType: node.errorType,
1971
- error: nodeError
1972
- }) : null;
1963
+ const describeStep = () => askRun ? {
1964
+ ...describeRunStep({
1965
+ run: askRun,
1966
+ stepId: node.nodeId,
1967
+ stepName,
1968
+ stepType: node.nodeType,
1969
+ stepVersion: node.nodeVersion,
1970
+ status: node.status,
1971
+ errorType: node.errorType,
1972
+ error: nodeError
1973
+ }),
1974
+ suggestions: isFailedStatus(node.status) || nodeError?.trim() ? failureQuestions(tr) : runStepQuestions(tr)
1975
+ } : null;
1973
1976
  return /* @__PURE__ */ jsxs("div", {
1974
1977
  className: "relative flex gap-4",
1975
1978
  children: [/* @__PURE__ */ jsxs("div", {
@@ -3392,7 +3395,7 @@ function RunBudgetPanel({ budget }) {
3392
3395
  *
3393
3396
  * Renders nothing for a run that has not failed.
3394
3397
  */
3395
- function RunAiAssistPanel({ runId, status, canPropose, canApply, onOpenWorkflow }) {
3398
+ function RunAiAssistPanel({ runId, status, canPropose, canApply, onOpenWorkflow, askAbout }) {
3396
3399
  const tr = useTr();
3397
3400
  const [explanation, setExplanation] = useState(null);
3398
3401
  const [explaining, setExplaining] = useState(false);
@@ -3470,23 +3473,9 @@ function RunAiAssistPanel({ runId, status, canPropose, canApply, onOpenWorkflow
3470
3473
  className: "mt-3 text-sm text-[var(--color-status-error-text)]",
3471
3474
  children: explainError
3472
3475
  }),
3473
- explanation && /* @__PURE__ */ jsxs("div", {
3474
- className: "mt-3 space-y-2",
3475
- "data-testid": "run-ai-explanation",
3476
- children: [
3477
- /* @__PURE__ */ jsx("p", {
3478
- className: "text-sm text-text-primary",
3479
- children: explanation.cause
3480
- }),
3481
- explanation.evidence.length > 0 && /* @__PURE__ */ jsx("pre", {
3482
- className: "max-h-40 overflow-auto whitespace-pre-wrap rounded bg-surface p-2 text-xs text-text-secondary",
3483
- children: explanation.evidence.join("\n")
3484
- }),
3485
- explanation.suggestions.length > 0 && /* @__PURE__ */ jsx("ul", {
3486
- className: "list-disc space-y-0.5 pl-5 text-sm text-text-primary",
3487
- children: explanation.suggestions.map((suggestion) => /* @__PURE__ */ jsx("li", { children: suggestion }, suggestion))
3488
- })
3489
- ]
3476
+ explanation && /* @__PURE__ */ jsx(RunExplanationView, {
3477
+ explanation,
3478
+ askAbout
3490
3479
  }),
3491
3480
  proposal.error && /* @__PURE__ */ jsx("p", {
3492
3481
  className: "mt-3 text-sm text-[var(--color-status-error-text)]",
@@ -3510,6 +3499,65 @@ function RunAiAssistPanel({ runId, status, canPropose, canApply, onOpenWorkflow
3510
3499
  ]
3511
3500
  });
3512
3501
  }
3502
+ /**
3503
+ * The diagnosis "Explain failure" returned, and (BOFF-13381) "Ask AI about
3504
+ * this" to follow it up in the assistant: the run's error picked, with the
3505
+ * diagnosis and its suggested fixes first in what the assistant is told, so it
3506
+ * starts from them rather than diagnosing again.
3507
+ */
3508
+ function RunExplanationView({ explanation, askAbout }) {
3509
+ const tr = useTr();
3510
+ const askAssistant = useFgAskAssistant();
3511
+ const ref = useRef(null);
3512
+ const followUp = askAssistant && askAbout ? () => {
3513
+ const base = askAbout();
3514
+ askAssistant({
3515
+ ...base,
3516
+ facts: [
3517
+ {
3518
+ label: "Diagnosis",
3519
+ value: explanation.cause
3520
+ },
3521
+ ...explanation.suggestions.slice(0, 3).map((suggestion, index) => ({
3522
+ label: `Suggested fix ${index + 1}`,
3523
+ value: suggestion
3524
+ })),
3525
+ ...base.facts ?? []
3526
+ ]
3527
+ }, ref.current);
3528
+ } : null;
3529
+ return /* @__PURE__ */ jsxs("div", {
3530
+ ref,
3531
+ className: "mt-3 space-y-2",
3532
+ "data-testid": "run-ai-explanation",
3533
+ children: [
3534
+ /* @__PURE__ */ jsx("p", {
3535
+ className: "text-sm text-text-primary",
3536
+ children: explanation.cause
3537
+ }),
3538
+ explanation.evidence.length > 0 && /* @__PURE__ */ jsx("pre", {
3539
+ className: "max-h-40 overflow-auto whitespace-pre-wrap rounded bg-surface p-2 text-xs text-text-secondary",
3540
+ children: explanation.evidence.join("\n")
3541
+ }),
3542
+ explanation.suggestions.length > 0 && /* @__PURE__ */ jsx("ul", {
3543
+ className: "list-disc space-y-0.5 pl-5 text-sm text-text-primary",
3544
+ children: explanation.suggestions.map((suggestion) => /* @__PURE__ */ jsx("li", { children: suggestion }, suggestion))
3545
+ }),
3546
+ followUp && /* @__PURE__ */ jsxs(Button, {
3547
+ size: "sm",
3548
+ variant: "outline",
3549
+ onClick: followUp,
3550
+ "data-agent": "deny",
3551
+ "data-testid": "run-ai-explanation-ask",
3552
+ children: [/* @__PURE__ */ jsx(Icon, {
3553
+ icon: "lucide:sparkles",
3554
+ width: 14,
3555
+ className: "mr-1"
3556
+ }), tr("fluidgrids.ai.runAssist.askFollowUp", "Ask AI about this")]
3557
+ })
3558
+ ]
3559
+ });
3560
+ }
3513
3561
 
3514
3562
  // src/modules/executions/components/RunFailureClusterCard.tsx
3515
3563
  /**
@@ -8354,6 +8402,17 @@ function ExecutionDetailPage() {
8354
8402
  workflowName: execution.workflow?.name ?? null,
8355
8403
  stoppedAt: stoppedAtNode ? nodeDisplayTitle(nodeDisplay[stoppedAtNode.nodeId], stoppedAtNode.nodeId) : null
8356
8404
  };
8405
+ const askAboutRunError = () => ({
8406
+ ...describeRunError(askRun),
8407
+ suggestions: failureQuestions(tr)
8408
+ });
8409
+ const askAboutRun = () => {
8410
+ const focus = describeRun(askRun);
8411
+ return {
8412
+ ...focus,
8413
+ suggestions: focus.kind === "run error" ? failureQuestions(tr) : runQuestions(tr)
8414
+ };
8415
+ };
8357
8416
  return /* @__PURE__ */ jsxs("div", {
8358
8417
  className: "p-4 pb-24 sm:p-6 sm:pb-24 bg-surface-canvas min-h-screen",
8359
8418
  children: [
@@ -8386,7 +8445,7 @@ function ExecutionDetailPage() {
8386
8445
  className: "flex flex-col lg:flex-row lg:items-start lg:justify-between gap-4 mb-6",
8387
8446
  children: [/* @__PURE__ */ jsxs("div", { children: [
8388
8447
  /* @__PURE__ */ jsxs(AskableDiv, {
8389
- describe: () => describeRun(askRun),
8448
+ describe: askAboutRun,
8390
8449
  "data-testid": "run-title-askable",
8391
8450
  className: "flex items-center gap-3 mb-2",
8392
8451
  ...runSuggestAnchorProps(execution.id),
@@ -8711,7 +8770,7 @@ function ExecutionDetailPage() {
8711
8770
  })]
8712
8771
  }),
8713
8772
  summary && /* @__PURE__ */ jsx(AskableDiv, {
8714
- describe: () => describeRun(askRun),
8773
+ describe: askAboutRun,
8715
8774
  "data-testid": "run-summary-askable",
8716
8775
  children: /* @__PURE__ */ jsx(RunSummaryCard, {
8717
8776
  status: execution.status,
@@ -8800,11 +8859,11 @@ function ExecutionDetailPage() {
8800
8859
  ]
8801
8860
  }),
8802
8861
  v2 && execution.errorMessage && /* @__PURE__ */ jsx(AskableDiv, {
8803
- describe: () => describeRunError(askRun),
8862
+ describe: askAboutRunError,
8804
8863
  "data-testid": "run-error-banner",
8805
8864
  className: "mb-6",
8806
8865
  children: /* @__PURE__ */ jsx(TechnicalDetails, { children: /* @__PURE__ */ jsx(AskableSelectionDiv, {
8807
- describe: () => describeRunError(askRun),
8866
+ describe: askAboutRunError,
8808
8867
  children: /* @__PURE__ */ jsxs("p", {
8809
8868
  className: "text-sm text-[var(--color-status-error-text)] break-words",
8810
8869
  children: [
@@ -8817,7 +8876,7 @@ function ExecutionDetailPage() {
8817
8876
  }) })
8818
8877
  }),
8819
8878
  !v2 && execution.errorMessage && /* @__PURE__ */ jsxs(AskableDiv, {
8820
- describe: () => describeRunError(askRun),
8879
+ describe: askAboutRunError,
8821
8880
  "data-testid": "run-error-banner",
8822
8881
  className: "mb-6 p-4 bg-[var(--color-status-error-bg-subtle)] border border-[var(--color-status-error-border)] rounded-lg",
8823
8882
  children: [/* @__PURE__ */ jsxs("div", {
@@ -8830,7 +8889,7 @@ function ExecutionDetailPage() {
8830
8889
  children: [tr("fluidgrids.executions.executionDetail.errorLabel", "Error"), execution.errorType ? ` (${execution.errorType})` : ""]
8831
8890
  })]
8832
8891
  }), /* @__PURE__ */ jsx(AskableSelectionDiv, {
8833
- describe: () => describeRunError(askRun),
8892
+ describe: askAboutRunError,
8834
8893
  children: /* @__PURE__ */ jsx("p", {
8835
8894
  className: "text-[var(--color-status-error-text)]",
8836
8895
  children: execution.errorMessage
@@ -8851,6 +8910,7 @@ function ExecutionDetailPage() {
8851
8910
  status: execution.status,
8852
8911
  canPropose: canProposeFix,
8853
8912
  canApply: canApplyFix,
8913
+ askAbout: askAboutRunError,
8854
8914
  onOpenWorkflow: (workflowKey, version) => navigate(`../workflow/${encodeURIComponent(workflowKey)}/${encodeURIComponent(version)}`)
8855
8915
  }),
8856
8916
  /* @__PURE__ */ jsx(RunFailureClusterCard, {
@@ -1,30 +1,30 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
3
  import { g as useExecutionsStore, h as DEFAULT_EXECUTIONS_FILTER } from "./config-X97zrIvn.js";
4
- import { b as validateDateRange, c as EMPTY_SEARCH_FILTER, d as searchFilterConflicts, i as useExecutionStats, l as OPERATORS_BY_TYPE, o as useExecutionsWithStore, r as useExecutionActions, t as useAutoRefresh, u as buildSearchAttributeFilter } from "./useExecutions-GgjDOgcd.js";
4
+ import { b as validateDateRange, c as EMPTY_SEARCH_FILTER, d as searchFilterConflicts, i as useExecutionStats, l as OPERATORS_BY_TYPE, o as useExecutionsWithStore, r as useExecutionActions, t as useAutoRefresh, u as buildSearchAttributeFilter } from "./useExecutions-lRqeXDYS.js";
5
5
  import { m as usePhaseCFlags, u as useDurableParityEnabled } from "./feature-flags-B_b8PJ6Z.js";
6
6
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
7
7
  import { n as useFluidGridsPageControls } from "./pageControlsBridge-0pX9s-3k.js";
8
8
  import { t as executionsControls } from "./pageControlSpecs-DZJ9K37m.js";
9
9
  import { t as TagFilterSelect } from "./TagFilterSelect-CAShgvbS.js";
10
10
  import { n as useNavigationV2 } from "./useNavigationV2-C2WeqN7d.js";
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-sS0LIJ_l.js";
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-fZcATZHI.js";
12
12
  import { t as Disclosure } from "./Disclosure-CsxDspR7.js";
13
13
  import { n as formatRunVersion } from "./run-display-UjLAoYqQ.js";
14
14
  import { r as runSuggestAnchorProps } from "./entities-I_0kio3q.js";
15
- import { $t as runDurationMs, Zt as formatElapsedMs } from "./FluidGridsProvider-BOBuK7kj.js";
15
+ import { rn as runDurationMs, tn as formatElapsedMs } from "./FluidGridsProvider-Dxehlm-2.js";
16
16
  import { r as useRunHumanRequests } from "./useHumanRequests-DwG2tQ3f.js";
17
- import { n as runListLinkKey, t as runListFilterFromSearch } from "./run-list-links-DZ8Q5l35.js";
17
+ import { n as runListLinkKey, t as runListFilterFromSearch } from "./run-list-links-CPJimzkr.js";
18
18
  import { t as TechnicalDetails } from "./TechnicalDetails-r5JXr1jZ.js";
19
19
  import { t as RunActionsMenu } from "./RunActionsMenu-BZY4NreS.js";
20
- import { h as useWorkflowDefinitions } from "./useWorkflows-DSZUrK_o.js";
20
+ import { h as useWorkflowDefinitions } from "./useWorkflows-CXwXQg74.js";
21
21
  import { t as FluidGridsDocsLink } from "./FluidGridsDocsLink-JxkBpOeb.js";
22
22
  import { s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-dcxg6zG6.js";
23
23
  import { C as jsonArg, F as startBatchOperation, I as startBatchTerminate, P as startBatchExport, m as fetchBatchOperations, n as cancelBatchOperation, p as fetchBatchOperation, x as fetchSearchAttributes } from "./api-CEnNq15C.js";
24
24
  import { a as RUN_CONTROL_DIALOG_STYLE, c as parseJsonInput, i as NativeSelect, o as StatusPill, r as JsonField, t as FieldError, u as useResource } from "./shared-C0LCTtyh.js";
25
25
  import { t as describeOperationError } from "./errors-xPZ-IbQd.js";
26
26
  import { n as getFluidGridsClient } from "./client-Ctl4jmY3.js";
27
- import { bI as WorkflowResetType, eI as WorkflowBatchOperationType } from "./graphql-types-C5Tr6508.js";
27
+ import { HI as WorkflowResetType, SI as WorkflowBatchOperationType } from "./graphql-types-D82O-0XY.js";
28
28
  import { Fragment, useCallback, useEffect, useMemo, useRef, useState } from "react";
29
29
  import { useNavigate, useSearchParams } from "react-router";
30
30
  import { Icon } from "@iconify/react";
@@ -2,7 +2,7 @@
2
2
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
3
3
  import { n as getFluidGridsClient } from "./client-Ctl4jmY3.js";
4
4
  import { o as throwIfResultError } from "./errors-xPZ-IbQd.js";
5
- import { qD as RunFailureClusterStatus } from "./graphql-types-C5Tr6508.js";
5
+ import { mO as RunFailureClusterStatus } from "./graphql-types-D82O-0XY.js";
6
6
  import { useCallback, useEffect, useState } from "react";
7
7
  import { Icon } from "@iconify/react";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { a as resetFluidGridsClient, n as getFluidGridsClient, o as setFluidGridsClient, r as getFluidGridsClientSafe, s as waitForFluidGridsClient, t as createFluidGridsClient } from "./client-Ctl4jmY3.js";
3
3
  import { a as setGlobalStoreClient, i as resetGlobalStoreClient, n as getGlobalStoreClient, t as createGlobalStoreClient } from "./global-client-DP_Wxe5t.js";
4
- import { A as useFlowStore, C as outputHandlesSpacerHeight, D as NodeCardBody, E as NodeCard, M as isNodeTrigger, O as NodeCardHeader, S as nodeAdaptersOf, T as resolveOutputHandles, _ as InputHandles, b as hasNodeManifest, g as LogicNodeCard, i as WAIT_FOR_SIGNAL_NODE_TYPE, k as nodeAccent, l as interfaceFields, m as readSignalName, n as synchronizeOperationUpdate, p as readCodeWorkflowState, r as CODE_WORKFLOW_NODE_TYPE, t as resolveOperationName, u as interfaceHandlers, v as OutputHandles, w as resolveInputHandles, y as alignPlainOutputEdges } from "./node-operation-selection-BGj5YwAS.js";
4
+ import { A as useFlowStore, C as outputHandlesSpacerHeight, D as NodeCardBody, E as NodeCard, M as isNodeTrigger, O as NodeCardHeader, S as nodeAdaptersOf, T as resolveOutputHandles, _ as InputHandles, b as hasNodeManifest, g as LogicNodeCard, i as WAIT_FOR_SIGNAL_NODE_TYPE, k as nodeAccent, l as interfaceFields, m as readSignalName, n as synchronizeOperationUpdate, p as readCodeWorkflowState, r as CODE_WORKFLOW_NODE_TYPE, t as resolveOperationName, u as interfaceHandlers, v as OutputHandles, w as resolveInputHandles, y as alignPlainOutputEdges } from "./node-operation-selection-bFx9s45-.js";
5
5
  import { n as useBuilderReadOnly } from "./read-only-context-Dt9N9SIG.js";
6
6
  import { a as resolveStickyColor, i as partitionStickyNotes, l as STICKY_NOTE_TYPE, n as STICKY_COLORS, o as stickySurfaceStyle, t as DEFAULT_STICKY_COLOR } from "./sticky-notes-23j-wL6Q.js";
7
7
  import { n as FluidGridsTranslationProvider, r as useTr, t as ENGLISH_FALLBACK_TRANSLATOR } from "./TranslationBridge-Da-TPgQm.js";
@@ -13,7 +13,7 @@ import { a as emitOperationErrorEvent, i as emitFluidGridsEvent, o as emitRunCom
13
13
  import { i as emitRunStarted, n as emitRunFailed, r as emitRunLimitHit, s as emitWorkflowCreated } from "./fluidgridsEvents-Dm5CaHtr.js";
14
14
  import { a as collectExtensions, n as QUOTA_EXHAUSTED_CODE, o as errorCodesOf, r as RUNS_QUOTA_NAME, s as findQuotaRefusal } from "./quota-Cdt8yz7N.js";
15
15
  import { c as setFluidGridsConfig, l as validateTrustedOrigin, o as resetFluidGridsConfig, r as getFluidGridsConfig, s as resetFluidGridsExecutionState } from "./config-X97zrIvn.js";
16
- import { r as useFgAskable } from "./askAboutBridge-kpcjcR9Y.js";
16
+ import { a as useFgAskableAction } from "./askAboutBridge-ByYsQams.js";
17
17
  import { i as readableNodeType } from "./run-display-UjLAoYqQ.js";
18
18
  import { t as provideNodeRegistryRefresh } from "./node-registry-refresh-s3okf83X.js";
19
19
  import { createContext, memo, useCallback, useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
@@ -3117,6 +3117,24 @@ const EventRegistrationsDocument = {
3117
3117
  },
3118
3118
  "arguments": [],
3119
3119
  "directives": []
3120
+ },
3121
+ {
3122
+ "kind": "Field",
3123
+ "name": {
3124
+ "kind": "Name",
3125
+ "value": "totalTriggers"
3126
+ },
3127
+ "arguments": [],
3128
+ "directives": []
3129
+ },
3130
+ {
3131
+ "kind": "Field",
3132
+ "name": {
3133
+ "kind": "Name",
3134
+ "value": "lastTriggeredAt"
3135
+ },
3136
+ "arguments": [],
3137
+ "directives": []
3120
3138
  }
3121
3139
  ]
3122
3140
  }
@@ -7264,23 +7282,23 @@ function missingRequiredParameters(params, state, boundFields = /* @__PURE__ */
7264
7282
  }
7265
7283
  return missing;
7266
7284
  }
7267
- function asRecord$1(value) {
7285
+ function asRecord$2(value) {
7268
7286
  return typeof value === "object" && value !== null && !Array.isArray(value) ? value : void 0;
7269
7287
  }
7270
7288
  /** The node's fixed values: `data.args.state`, else an empty object. */
7271
7289
  function nodeStateOf(node) {
7272
- return asRecord$1(asRecord$1(asRecord$1(node.data)?.args)?.state) ?? {};
7290
+ return asRecord$2(asRecord$2(asRecord$2(node.data)?.args)?.state) ?? {};
7273
7291
  }
7274
7292
  /** Whether the node is disabled (it is skipped at run time, so nothing is required). */
7275
7293
  function isDisabledNode(node) {
7276
- return asRecord$1(node.data)?.disabled === true;
7294
+ return asRecord$2(node.data)?.disabled === true;
7277
7295
  }
7278
7296
  /** Parameters some incoming edge of the node maps a value into. */
7279
7297
  function boundFieldsOf(nodeId, edges) {
7280
7298
  const bound = /* @__PURE__ */ new Set();
7281
7299
  for (const edge of edges) {
7282
7300
  if (edge.target !== nodeId) continue;
7283
- const definition = asRecord$1(edge.mapping?.definition) ?? asRecord$1(asRecord$1(asRecord$1(edge.data)?.mapping)?.definition);
7301
+ const definition = asRecord$2(edge.mapping?.definition) ?? asRecord$2(asRecord$2(asRecord$2(edge.data)?.mapping)?.definition);
7284
7302
  for (const field of Object.keys(definition ?? {})) bound.add(field);
7285
7303
  }
7286
7304
  return bound;
@@ -8221,6 +8239,35 @@ function useWebhookRegistration(workflowKey, triggerNodeId, enabled = true) {
8221
8239
  };
8222
8240
  }
8223
8241
 
8242
+ // src/builder/components/ndv/manual-push-setup.ts
8243
+ function asRecord$1(value) {
8244
+ return typeof value === "object" && value !== null && !Array.isArray(value) ? value : null;
8245
+ }
8246
+ function httpsUrl(value) {
8247
+ if (typeof value !== "string" || !value.trim()) return null;
8248
+ try {
8249
+ const url = new URL(value.trim());
8250
+ return url.protocol === "https:" ? url.toString() : null;
8251
+ } catch {
8252
+ return null;
8253
+ }
8254
+ }
8255
+ const HEADER_NAME = /^[!#$%&'*+.^_`|~0-9A-Za-z-]{1,64}$/;
8256
+ /** The manual setup of the selected trigger operation, or null when it is not a manual push trigger. */
8257
+ function readManualPushSetup(operation) {
8258
+ const op = asRecord$1(operation);
8259
+ if (!op || op.role !== "trigger") return null;
8260
+ if (typeof op.pushSetup !== "string" || op.pushSetup.trim().toLowerCase() !== "manual") return null;
8261
+ const setup = asRecord$1(op.manualSetup) ?? {};
8262
+ const instructions = typeof setup.instructions === "string" && setup.instructions.trim() ? setup.instructions.trim() : null;
8263
+ const header = typeof setup.secretHeader === "string" ? setup.secretHeader.trim() : "";
8264
+ return {
8265
+ instructions,
8266
+ docsUrl: httpsUrl(setup.docsUrl),
8267
+ secretHeader: HEADER_NAME.test(header) ? header : null
8268
+ };
8269
+ }
8270
+
8224
8271
  // src/builder/components/ndv/node-option-values.ts
8225
8272
  function isRecord$2(value) {
8226
8273
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -8788,7 +8835,8 @@ function useNodeConfig(target, options) {
8788
8835
  const params = useMemo(() => paramsFromOperation(currentOp), [currentOp]);
8789
8836
  const isWebhookTrigger = useMemo(() => !!asRecord(currentOp?.output_fields)?.webhookUrl, [currentOp]);
8790
8837
  const isFormTrigger = useMemo(() => !!asRecord(currentOp?.output_fields)?.formUrl, [currentOp]);
8791
- const { webhookUrl, formUrl, error: triggerUrlError, loading: webhookUrlLoading } = useWebhookRegistration(workflowKey || void 0, node?.id, (isWebhookTrigger || isFormTrigger) && (options?.webhookEnabled ?? true));
8838
+ const manualPushSetup = useMemo(() => readManualPushSetup(currentOp), [currentOp]);
8839
+ const { registration: webhookRegistration, webhookUrl, formUrl, error: triggerUrlError, loading: webhookUrlLoading, refetch: refetchWebhookRegistration } = useWebhookRegistration(workflowKey || void 0, node?.id, (isWebhookTrigger || isFormTrigger || !!manualPushSetup) && (options?.webhookEnabled ?? true));
8792
8840
  const pickerFields = useMemo(() => flattenFields(inputFields), [inputFields]);
8793
8841
  const mapping = currentEdge?.mapping?.definition ?? {};
8794
8842
  const argsState = useMemo(() => {
@@ -9012,6 +9060,9 @@ function useNodeConfig(target, options) {
9012
9060
  isWebhookWait,
9013
9061
  webhookUrl,
9014
9062
  webhookUrlLoading,
9063
+ manualPushSetup,
9064
+ webhookRegistration,
9065
+ refetchWebhookRegistration,
9015
9066
  modeByField,
9016
9067
  dragField,
9017
9068
  setDragField,
@@ -9593,6 +9644,52 @@ function describeRun(run) {
9593
9644
  };
9594
9645
  }
9595
9646
 
9647
+ // src/askAbout/askQuestions.ts
9648
+ /**
9649
+ * ★ BOFF-13381: the questions offered under the chip when a person picks
9650
+ * something to ask the assistant about. They start a question in the person's
9651
+ * own words: choosing one only fills the message box. A few, short, and about
9652
+ * what the thing is showing (a failed step is asked why it failed).
9653
+ */
9654
+ /** A step on the canvas: what it does, why it is not ready, why it failed. */
9655
+ function canvasStepQuestions(tr, step) {
9656
+ const failed = step.runStatus === "error" || Boolean(step.latestFailedRun?.errorMessage?.trim());
9657
+ const notReady = (step.missingSettings?.length ?? 0) > 0 || step.missingConnection === true;
9658
+ return [
9659
+ ...failed ? [tr("fluidgrids.askAbout.questions.stepFailed", "Why did this step fail?")] : [],
9660
+ ...notReady ? [tr("fluidgrids.askAbout.questions.stepNotReady", "What is this step still missing?")] : [],
9661
+ tr("fluidgrids.askAbout.questions.stepWhat", "What does this step do?"),
9662
+ tr("fluidgrids.askAbout.questions.stepImprove", "How can I make this step better?")
9663
+ ].slice(0, 3);
9664
+ }
9665
+ /** A run's error, or a step of a run that failed: why, and how to fix it. */
9666
+ function failureQuestions(tr) {
9667
+ return [
9668
+ tr("fluidgrids.askAbout.questions.whyFailed", "Why did this fail?"),
9669
+ tr("fluidgrids.askAbout.questions.howFix", "How do I fix this?"),
9670
+ tr("fluidgrids.askAbout.questions.preventAgain", "How do I stop this from happening again?")
9671
+ ];
9672
+ }
9673
+ /** A step of a run that did not fail. */
9674
+ function runStepQuestions(tr) {
9675
+ return [tr("fluidgrids.askAbout.questions.runStepWhat", "What did this step do in this run?"), tr("fluidgrids.askAbout.questions.runStepOutput", "What did this step pass on to the next one?")];
9676
+ }
9677
+ /** A whole run that did not fail. */
9678
+ function runQuestions(tr) {
9679
+ return [tr("fluidgrids.askAbout.questions.runWhat", "What happened in this run?"), tr("fluidgrids.askAbout.questions.runFaster", "How can I make this workflow faster?")];
9680
+ }
9681
+ /** The status words a run or run step fails with. */
9682
+ function isFailedStatus(status) {
9683
+ return /^(FAILED|ERROR|TIMED_OUT|TERMINATED)$/i.test(status?.trim() ?? "");
9684
+ }
9685
+ /** A canvas step as the assistant is told about it, with its questions. */
9686
+ function askAboutCanvasStep(tr, step) {
9687
+ return {
9688
+ ...describeCanvasStep(step),
9689
+ suggestions: canvasStepQuestions(tr, step)
9690
+ };
9691
+ }
9692
+
9596
9693
  // src/askAbout/latestFailedRun.ts
9597
9694
  /**
9598
9695
  * ★ BOFF-13267: the saved workflow's latest failed run, for "Ask AI about this"
@@ -10127,7 +10224,7 @@ const getNodeMetadata = (value) => {
10127
10224
  ]);
10128
10225
  const describeStep = useCallback(() => {
10129
10226
  const { execution, workflow } = useFlowStore.getState();
10130
- return describeCanvasStep(canvasStepFactsOf({
10227
+ return askAboutCanvasStep(tr, canvasStepFactsOf({
10131
10228
  id,
10132
10229
  type: value?.type,
10133
10230
  data,
@@ -10155,10 +10252,11 @@ const getNodeMetadata = (value) => {
10155
10252
  id,
10156
10253
  missingCredentials,
10157
10254
  missingParameters,
10255
+ tr,
10158
10256
  value?.type
10159
10257
  ]);
10160
- const askable = useFgAskable(describeStep);
10161
- const askableRef = useCallback((element) => askable(element?.closest(".react-flow__node") ?? element), [askable]);
10258
+ const askable = useFgAskableAction(describeStep);
10259
+ const askableRef = useCallback((element) => askable.ref(element?.closest(".react-flow__node") ?? element), [askable.ref]);
10162
10260
  if (isAdapterSubNode) return /* @__PURE__ */ jsx(SubNodeComponent, {
10163
10261
  ...props,
10164
10262
  nodeType: value?.type
@@ -10229,6 +10327,7 @@ const getNodeMetadata = (value) => {
10229
10327
  infoButton: /* @__PURE__ */ jsx(NodeInfoButtonWithModal, { metadata: nodeInfoMetadata }),
10230
10328
  disabled: isDisabled,
10231
10329
  onToggleDisabled: readOnly ? void 0 : handleToggleDisabled,
10330
+ onAskAi: askable.ask,
10232
10331
  isRenaming: isRenamingThisNode && !readOnly,
10233
10332
  onStartRename: readOnly ? void 0 : handleStartRename,
10234
10333
  onCommitRename: handleCommitRename,
@@ -10261,6 +10360,7 @@ const getNodeMetadata = (value) => {
10261
10360
  infoButton: /* @__PURE__ */ jsx(NodeInfoButtonWithModal, { metadata: nodeInfoMetadata }),
10262
10361
  disabled: isDisabled,
10263
10362
  onToggleDisabled: readOnly ? void 0 : handleToggleDisabled,
10363
+ onAskAi: askable.ask,
10264
10364
  children: [
10265
10365
  /* @__PURE__ */ jsx(NodeCardHeader, {
10266
10366
  icon: cardIcon,
@@ -11381,4 +11481,4 @@ function useFluidGridsContext() {
11381
11481
  return context;
11382
11482
  }
11383
11483
 
11384
- export { latestNodeLog as $, runDurationMs as $t, MissingParametersDialog as A, ExecutionsListDocument as An, phaseAfterTakeOver as At, selectedOperationOf as B, buildStickyNode as Bn, revisionOf as Bt, describeRun as C, EventRegistrationsDocument as Cn, useEditLeaseLocked as Ct, buildOperationSeed as D, SaveWorkflowDraftDocument as Dn, leaseCallQueue as Dt, SENSITIVE_PARAM as E, TriggerWorkflowDocument as En, isLocked as Et, fixedParameterState as F, isOptionalAdapter as Fn, forgetSessionForReload as Ft, optionListText as G, findSaveConflict as Gt, resolveUiSpec as H, useMarkdownRenderer as Hn, AUTOSAVE_RETRY_DELAYS_MS as Ht, nodeSubtitle as I, matchesAdapterProvider as In, rememberSessionForReload as It, ConditionTreeBuilder as J, saveFailureActionOf as Jt, optionListValues as K, inAppLeaveTarget as Kt, nodeTitle as L, newConnectionProviderKey as Ln, sessionBeforeReload as Lt, workflowParameterIssues as M, RunFromNodeDocument as Mn, shouldReleaseForIdle as Mt, asRecord as N, ExecuteStepDocument as Nn, tickAction as Nt, createConfiguredNode as O, CreateWorkflowVersionDocument as On, leaseCallSequence as Ot, coerceNumber as P, connectionsForAdapter as Pn, EDIT_SESSION_ID as Pt, parseMappingValue as Q, nodeStateDurationMs as Qt, optionText as R, replaceAdapterConnections as Rn, rememberOwnStatusChange as Rt, useLatestFailedRun as S, NodeEndpointConfigsDocument as Sn, workflowSaveQueue as St, describeRunStep as T, BuilderRunNodeDetailsDocument as Tn, bannerOf as Tt, stripSubmitActions as U, canAutosave as Ut, useNodeConfig as V, loadMarkdown as Vn, AUTOSAVE_DEBOUNCE_MS as Vt, isStringOptionList as W, codeBuildIdOf as Wt, casesFromRules as X, useNodeExecution as Xt, SwitchRulesEditor as Y, workflowFingerprint as Yt, FieldTree as Z, formatElapsedMs as Zt, registryNodeData as _, payloadFromCardValues as _n, classifyCreateRefusal as _t, NODES_METADATA as a, isParamVisible as an, departingSave as at, fetchAllNodeEndpointConfigs as b, NodePaletteEntriesDocument as bn, saveIndicatorOf as bt, ensureInstalledNodeTypesLoaded as c, useCanvasEdges as cn, leavingLosesChanges as ct, ensureRegistryNodeTypesLoaded as d, loadDefinitionJson as dn, watchLeavingLosesChanges as dt, formatParameterValue as en, boundFieldsOf as et, isNodeConfigsInitialized as f, useCodeWorkflowInterface as fn, isFlowComplete as ft, registerWorkflowNodeTypes as g, parseRawSignalPayload as gn, builderPathOf as gt, registerNodeManifests as h, durableInterfaceOf as hn, blankWorkflowCreateInput as ht, AVAILABLE_NODES as i, resolveNodeOperation as in, autosaveAllowedFor as it, useRunGuard as j, ExecutionDetailDocument as jn, releasesOnClose as jt, useInsertNode as k, CreateWorkflowDefinitionDocument as kn, phaseAfterAcquire as kt, ensureNodeConfigsLoaded as l, useNodeRegistryRevision as ln, savedEverythingBeforeLeaving as lt, refetchStoreNodes as m, declaredSignals as mn, useSaveWorkflow as mt, FluidGridsProvider as n, structuredParameterType as nn, useGuardedNavigate as nt, NODE_CONFIGS as o, useFluidGridsAnalytics as on, editStateFor as ot, onNodeTypesUpdate as p, canSignalRun as pn, useFlowValidator as pt, resolveLoadOptionsSpec as q, resettledBaseline as qt, useFluidGridsContext as r, fieldsFromValue as rn, useManualSave as rt, NODE_TYPES as s, openRunQuotaUpgradePrompt as sn, editingLeaseLocked as st, FluidGridsContext as t, parseParameterValue as tn, missingRequiredParameters as tt, ensureNodeTypesLoaded as u, clearCodeWorkflowDefinitionCache as un, touchesSavedFields as ut, scheduleNodePaletteLoad as v, runSignalTargets as vn, createThenOpen as vt, describeRunError as w, BuilderRunStatusDocument as wn, useEditLeaseStore as wt, getNodeMetadata as x, NodeManifestsDocument as xn, useSaveStatusStore as xt, GetMyNodeInstallationsDocument as y, signalPayloadCard as yn, refusalOfQuota as yt, paramsFromOperation as z, getNodeDetail as zn, rememberRevision as zt };
11484
+ export { SwitchRulesEditor as $, workflowFingerprint as $t, SENSITIVE_PARAM as A, TriggerWorkflowDocument as An, isLocked as At, nodeSubtitle as B, matchesAdapterProvider as Bn, rememberSessionForReload as Bt, failureQuestions as C, signalPayloadCard as Cn, refusalOfQuota as Ct, describeRun as D, EventRegistrationsDocument as Dn, useEditLeaseLocked as Dt, runStepQuestions as E, NodeEndpointConfigsDocument as En, workflowSaveQueue as Et, useRunGuard as F, ExecutionDetailDocument as Fn, releasesOnClose as Ft, useNodeConfig as G, loadMarkdown as Gn, AUTOSAVE_DEBOUNCE_MS as Gt, optionText as H, replaceAdapterConnections as Hn, rememberOwnStatusChange as Ht, workflowParameterIssues as I, RunFromNodeDocument as In, shouldReleaseForIdle as It, isStringOptionList as J, codeBuildIdOf as Jt, resolveUiSpec as K, useMarkdownRenderer as Kn, AUTOSAVE_RETRY_DELAYS_MS as Kt, asRecord as L, ExecuteStepDocument as Ln, tickAction as Lt, createConfiguredNode as M, CreateWorkflowVersionDocument as Mn, leaseCallSequence as Mt, useInsertNode as N, CreateWorkflowDefinitionDocument as Nn, phaseAfterAcquire as Nt, describeRunError as O, BuilderRunStatusDocument as On, useEditLeaseStore as Ot, MissingParametersDialog as P, ExecutionsListDocument as Pn, phaseAfterTakeOver as Pt, ConditionTreeBuilder as Q, saveFailureActionOf as Qt, coerceNumber as R, connectionsForAdapter as Rn, EDIT_SESSION_ID as Rt, useLatestFailedRun as S, runSignalTargets as Sn, createThenOpen as St, runQuestions as T, NodeManifestsDocument as Tn, useSaveStatusStore as Tt, paramsFromOperation as U, getNodeDetail as Un, rememberRevision as Ut, nodeTitle as V, newConnectionProviderKey as Vn, sessionBeforeReload as Vt, selectedOperationOf as W, buildStickyNode as Wn, revisionOf as Wt, optionListValues as X, inAppLeaveTarget as Xt, optionListText as Y, findSaveConflict as Yt, resolveLoadOptionsSpec as Z, resettledBaseline as Zt, registryNodeData as _, canSignalRun as _n, useFlowValidator as _t, NODES_METADATA as a, parseParameterValue as an, missingRequiredParameters as at, fetchAllNodeEndpointConfigs as b, parseRawSignalPayload as bn, builderPathOf as bt, ensureInstalledNodeTypesLoaded as c, resolveNodeOperation as cn, autosaveAllowedFor as ct, ensureRegistryNodeTypesLoaded as d, openRunQuotaUpgradePrompt as dn, editingLeaseLocked as dt, useNodeExecution as en, casesFromRules as et, isNodeConfigsInitialized as f, useCanvasEdges as fn, leavingLosesChanges as ft, registerWorkflowNodeTypes as g, useCodeWorkflowInterface as gn, isFlowComplete as gt, registerNodeManifests as h, loadDefinitionJson as hn, watchLeavingLosesChanges as ht, AVAILABLE_NODES as i, formatParameterValue as in, boundFieldsOf as it, buildOperationSeed as j, SaveWorkflowDraftDocument as jn, leaseCallQueue as jt, describeRunStep as k, BuilderRunNodeDetailsDocument as kn, bannerOf as kt, ensureNodeConfigsLoaded as l, isParamVisible as ln, departingSave as lt, refetchStoreNodes as m, clearCodeWorkflowDefinitionCache as mn, touchesSavedFields as mt, FluidGridsProvider as n, nodeStateDurationMs as nn, parseMappingValue as nt, NODE_CONFIGS as o, structuredParameterType as on, useGuardedNavigate as ot, onNodeTypesUpdate as p, useNodeRegistryRevision as pn, savedEverythingBeforeLeaving as pt, stripSubmitActions as q, canAutosave as qt, useFluidGridsContext as r, runDurationMs as rn, latestNodeLog as rt, NODE_TYPES as s, fieldsFromValue as sn, useManualSave as st, FluidGridsContext as t, formatElapsedMs as tn, FieldTree as tt, ensureNodeTypesLoaded as u, useFluidGridsAnalytics as un, editStateFor as ut, scheduleNodePaletteLoad as v, declaredSignals as vn, useSaveWorkflow as vt, isFailedStatus as w, NodePaletteEntriesDocument as wn, saveIndicatorOf as wt, getNodeMetadata as x, payloadFromCardValues as xn, classifyCreateRefusal as xt, GetMyNodeInstallationsDocument as y, durableInterfaceOf as yn, blankWorkflowCreateInput as yt, fixedParameterState as z, isOptionalAdapter as zn, forgetSessionForReload as zt };
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
- import { d as useRestoreWorkflowVersion, h as useWorkflowDefinitions } from "./useWorkflows-DSZUrK_o.js";
3
+ import { d as useRestoreWorkflowVersion, h as useWorkflowDefinitions } from "./useWorkflows-CXwXQg74.js";
4
4
  import { t as VersionDiffDialog } from "./VersionDiffDialog-D9W5Fm56.js";
5
5
  import { c as versionsOfWorkflow } from "./VersionLifecycleBar-DuphLOT0.js";
6
6
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
@@ -3,17 +3,17 @@ import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
3
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
4
4
  import { n as useNavigationV2 } from "./useNavigationV2-C2WeqN7d.js";
5
5
  import { t as TechnicalDetails } from "./TechnicalDetails-r5JXr1jZ.js";
6
- import { o as useRunReplayActions, r as useInsightsData } from "./useObservability-AMDVk_hX.js";
6
+ import { o as useRunReplayActions, r as useInsightsData } from "./useObservability-CBFLQBQO.js";
7
7
  import { a as getTopFailingNodes, i as getFailureBreakdown, l as rankedFailingWorkflows, n as formatDuration, o as getTopFailingWorkflows, s as percentage, u as summarySuccessRate } from "./utils-C0dtnN4R.js";
8
- import { n as FailureTriagePanel } from "./FailureTriagePanel-DA91XKVj.js";
8
+ import { n as FailureTriagePanel } from "./FailureTriagePanel-CbDIdU8s.js";
9
9
  import { c as useContinuousOptimisationEnabled } from "./feature-flags-B_b8PJ6Z.js";
10
10
  import { i as SdkPermissionButton, s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-dcxg6zG6.js";
11
- import { Cw as OptimisationSuggestionStatus, Sw as OptimisationKind, xw as OptimisationDismissReason } from "./graphql-types-C5Tr6508.js";
11
+ import { Bw as OptimisationDismissReason, Hw as OptimisationSuggestionStatus, Vw as OptimisationKind } from "./graphql-types-D82O-0XY.js";
12
12
  import { n as getFluidGridsClient } from "./client-Ctl4jmY3.js";
13
13
  import { o as throwIfResultError } from "./errors-xPZ-IbQd.js";
14
14
  import { t as WorkflowProposalDocument } from "./WorkflowProposalDocument-BdUbsrd0.js";
15
- import { a as formatTokens, c as DISMISS_REASONS, f as monthlySavingLabel, i as aiSpendPeriod, l as evidenceFacts, p as shortRunId, r as aiCost, s as runsOfWorkflowPath, t as AI_SPEND_RANGE_DAYS, u as evidenceWindowDays } from "./ai-usage-D7SjIkUZ.js";
16
- import { i as utcDay, r as runListPath } from "./run-list-links-DZ8Q5l35.js";
15
+ import { a as formatTokens, c as DISMISS_REASONS, f as monthlySavingLabel, i as aiSpendPeriod, l as evidenceFacts, p as shortRunId, r as aiCost, s as runsOfWorkflowPath, t as AI_SPEND_RANGE_DAYS, u as evidenceWindowDays } from "./ai-usage-DVtvLZ2P.js";
16
+ import { i as utcDay, r as runListPath } from "./run-list-links-CPJimzkr.js";
17
17
  import { t as proposalCanvasPath } from "./useRequestedProposal-B7uPXfZB.js";
18
18
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
19
19
  import { Link, useNavigate } from "react-router";
@@ -3,7 +3,7 @@ import { h as usePhaseDFlags } from "./feature-flags-B_b8PJ6Z.js";
3
3
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
4
4
  import { t as describeOperationError } from "./errors-xPZ-IbQd.js";
5
5
  import { t as downloadBlob } from "./workflow-transfer-CQnQC-ke.js";
6
- import { n as readTemplateCode, t as buildTemplateCodeDownload } from "./template-code-CobAYaeH.js";
6
+ import { n as readTemplateCode, t as buildTemplateCodeDownload } from "./template-code-CEjudJEY.js";
7
7
  import { useState } from "react";
8
8
  import { Icon } from "@iconify/react";
9
9
  import { cn } from "@burdenoff/fe-libs/utils";
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
3
- import { n as formatTemplatePrice } from "./TemplateCard-7rE1VAIC.js";
3
+ import { n as formatTemplatePrice } from "./TemplateCard-DD3vJ3a5.js";
4
4
  import { t as ConfirmActionDialog } from "./ConfirmActionDialog-D9Pir3bc.js";
5
5
  import { jsx } from "react/jsx-runtime";
6
6