@burdenoff/fluidgrids-fe-sdk 2026.1111.19 → 2026.1111.21

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 (51) hide show
  1. package/dist/{AiStudioPage-htYcXz43.js → AiStudioPage-CJdzRL26.js} +4 -4
  2. package/dist/ConnectionFormDialog-Bg9_OdHX.js +119 -0
  3. package/dist/{DataSinkDashboardPage-1h2QsMzH.js → DataSinkDashboardPage-hrwQSvks.js} +1 -1
  4. package/dist/{ExecutionDetailPage-BdcZmLT4.js → ExecutionDetailPage-DKp421Fj.js} +61 -14
  5. package/dist/{ExecutionsListPage-BCUJoAIE.js → ExecutionsListPage-DwJQfDPt.js} +4 -4
  6. package/dist/{FluidGridsProvider-dvZSNtSW.js → FluidGridsProvider-CbY91ZQq.js} +416 -99
  7. package/dist/{HistoryPage-U0tqupBN.js → HistoryPage-BLXZJDoJ.js} +1 -1
  8. package/dist/{InsightsPage-CALo16eB.js → InsightsPage-ChnoW5U4.js} +1 -1
  9. package/dist/{MissingNodesInstallModal-Dly7T2_7.js → MissingNodesInstallModal-mYFfy9Gg.js} +1 -1
  10. package/dist/{QuotaExhaustedDialog-7IFSaLyi.js → QuotaExhaustedDialog-DWm_YWL7.js} +1 -1
  11. package/dist/{SettingsPage-CJLZvv4J.js → SettingsPage-CXoKX0px.js} +2 -2
  12. package/dist/{TemplateCard-BdB087SP.js → TemplateCard-HIMsb47R.js} +2 -2
  13. package/dist/{TemplateConfigurationModal-CPVcTDSi.js → TemplateConfigurationModal-BNtbJ2fv.js} +1 -1
  14. package/dist/{TemplateDetailPanel-DruadMkg.js → TemplateDetailPanel-C6Zh2WRF.js} +1 -1
  15. package/dist/{TemplatePreview-CNrYJXw2.js → TemplatePreview-_wUMSwh_.js} +3 -3
  16. package/dist/{TemplatesPage-BU4tSqOo.js → TemplatesPage-DBfL-ao9.js} +4 -4
  17. package/dist/{WorkflowBuilder-DMonxuoY.js → WorkflowBuilder-CMZi6wQE.js} +7 -7
  18. package/dist/{WorkflowBuilder-BSPGcOfA.js → WorkflowBuilder-CYmpQtIQ.js} +3 -3
  19. package/dist/{WorkflowSearchRedirect-DwDNZ_q5.js → WorkflowSearchRedirect-iWzvY9Qo.js} +1 -1
  20. package/dist/{WorkflowsList-DiiGyZkT.js → WorkflowsList-C8aoqtRE.js} +5 -5
  21. package/dist/{agentTools-C7pdNJqE.js → agentTools-CrEWQ5st.js} +3 -4
  22. package/dist/askAboutBridge-BV8m95kk.js +65 -0
  23. package/dist/assistant.d.ts +30 -1
  24. package/dist/assistant.js +2 -1
  25. package/dist/{canvasNoteTools-CqiPTBa1.js → canvasNoteTools-6BQYNCee.js} +2 -2
  26. package/dist/{code-editor-field-9-GdVE_8.js → code-editor-field-CoRq10k7.js} +1 -1
  27. package/dist/executions.js +2 -2
  28. package/dist/{flow-builder-CV5Zu_Hq.js → flow-builder-Dwev-C_g.js} +191 -173
  29. package/dist/history.js +1 -1
  30. package/dist/index.js +25 -24
  31. package/dist/{node-detail-view-ttMp6H6K.js → node-detail-view-BFBSKj5w.js} +5 -5
  32. package/dist/{node-editor-tab-body-Bqb--pZy.js → node-editor-tab-body-Cz9kOlxu.js} +2 -2
  33. package/dist/observability.js +2 -2
  34. package/dist/{popover-BbVOHsfO.js → popover-xPh0iIzy.js} +2 -2
  35. package/dist/preloadable-lazy-Pp47mqQ9.js +65 -0
  36. package/dist/{quick-config-panel-Da4uOVSs.js → quick-config-panel-Ym05lyGn.js} +3 -3
  37. package/dist/{schedule-panel-DnFN933b.js → schedule-panel-54D5W5Qk.js} +4 -4
  38. package/dist/settings.js +1 -1
  39. package/dist/{sidebar-node-editor-lcnIZxdR.js → sidebar-node-editor-LL3ofDN7.js} +3 -3
  40. package/dist/templates.js +2 -2
  41. package/dist/{useDurableParity-CzUQMFJ3.js → useDurableParity-BScby67i.js} +1 -1
  42. package/dist/{useExecutions-9aLuOt1c.js → useExecutions-B0VzQcY2.js} +1 -1
  43. package/dist/{useObservability-CfEw3ZFD.js → useObservability-FfQGgW6W.js} +1 -1
  44. package/dist/{useRunHistory-B1xJDwl1.js → useRunHistory-BZJg72kd.js} +1 -1
  45. package/dist/{useWorkflowCodeExport-Bu2QYJzA.js → useWorkflowCodeExport-CUWMlJbi.js} +1 -1
  46. package/dist/{useWorkflows-BlVVu8NM.js → useWorkflows-Czz5DlL0.js} +1 -1
  47. package/dist/workflow-builder.js +4 -4
  48. package/dist/workflow-pages.d.ts +19 -19
  49. package/dist/workflow-pages.js +16 -24
  50. package/dist/workflows-list.js +1 -1
  51. 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-CV5Zu_Hq.js";
5
- import { Et as classifyCreateRefusal, I as buildOperationSeed, Tt as builderPathOf, u as ensureNodeTypesLoaded } from "./FluidGridsProvider-dvZSNtSW.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-Dwev-C_g.js";
5
+ import { Ot as builderPathOf, kt as classifyCreateRefusal, u as ensureNodeTypesLoaded, z as buildOperationSeed } from "./FluidGridsProvider-CbY91ZQq.js";
6
6
  import { _ as throwIfResultError, n as getFluidGridsClient } from "./client-C9XSzSXr.js";
7
7
  import { a as notifyFluidGridsAiCreditsUpdated, t as AiCreditBalanceSlot } from "./aiCreditsBridge-BuE92tKo.js";
8
8
  import { Pr as WorkflowGenerationDocument, y as CancelWorkflowGenerationDocument, yt as GenerateWorkflowFromPromptDocument } from "./graphql-operation-types-kX-MMjgW.js";
9
- import { n as useCreateWorkflow } from "./useWorkflows-BlVVu8NM.js";
9
+ import { n as useCreateWorkflow } from "./useWorkflows-Czz5DlL0.js";
10
10
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
11
11
  import { f as BILLING_PLANS_PATH } from "./fluidgridsEvents-CNdcrUNN.js";
12
- import { T as CreateWorkflowRefusalDialog } from "./useWorkflowCodeExport-Bu2QYJzA.js";
12
+ import { T as CreateWorkflowRefusalDialog } from "./useWorkflowCodeExport-CUWMlJbi.js";
13
13
  import { s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-B2lhWNoN.js";
14
14
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
15
15
  import { useNavigate } from "react-router";
@@ -0,0 +1,119 @@
1
+ "use client";
2
+ import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
+ import { n as getFluidGridsClient, x as getFluidGridsConfig } from "./client-C9XSzSXr.js";
4
+ import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
5
+ import { useCallback } from "react";
6
+ import { jsx } from "react/jsx-runtime";
7
+ import { ConnectionDialog } from "@burdenoff/fe-libs/connections";
8
+
9
+ // src/modules/connections/utils/provider-helpers.ts
10
+ /**
11
+ * The OAuth callback URL the builder's connections use.
12
+ *
13
+ * Provider identity (icons, name tiles) and labels moved to
14
+ * `@burdenoff/fe-libs/connections` with the shared connection dialog
15
+ * (BOFF-8174); only what depends on the SDK's own configuration stays here.
16
+ */
17
+ /**
18
+ * Get the OAuth callback URL for the integrations service.
19
+ *
20
+ * Returns an ABSOLUTE URL, since OAuth providers require an absolute
21
+ * redirect_uri. The host is derived from the configured wspace gateway base
22
+ * (`apiGatewayUrl`) — which serves the `/integrations/oauth/callback` path —
23
+ * not the app origin. Falls back to the current window origin only when no
24
+ * gateway base is configured.
25
+ */
26
+ function getOAuthCallbackUrl() {
27
+ const path = "/integrations/oauth/callback";
28
+ const gatewayBase = getFluidGridsConfig().apiGatewayUrl;
29
+ if (gatewayBase) try {
30
+ return new URL(path, gatewayBase).toString();
31
+ } catch {}
32
+ if (typeof window !== "undefined" && window.location.hostname === "localhost") return `http://localhost:3713${path}`;
33
+ if (typeof window !== "undefined") return `${window.location.origin}${path}`;
34
+ return path;
35
+ }
36
+
37
+ // src/modules/connections/components/ConnectionFormDialog.tsx
38
+ /**
39
+ * ConnectionFormDialog — a workflow node's "New connection" popup.
40
+ *
41
+ * The dialog itself is `@burdenoff/fe-libs/connections`' ConnectionDialog, the
42
+ * same one the integrations screens use; this component only supplies what the
43
+ * builder has that the shared dialog cannot know: the SDK's GraphQL client, the
44
+ * gateway callback URL and the host's translator. It used to be a separate
45
+ * implementation, and the two drifted (BOFF-8135, BOFF-8170) — see BOFF-8174.
46
+ *
47
+ * Builder-specific choices:
48
+ * - opens on the node's provider by key, or on the whole catalog;
49
+ * - a vault is optional: a node connection should not need a trip to the
50
+ * security module, so the integrations service holds the secret unless the
51
+ * user picks a vault;
52
+ * - shows the Sharing tab.
53
+ */
54
+ var ConnectionFormDialog_exports = /* @__PURE__ */ __exportAll({ ConnectionFormDialog: () => ConnectionFormDialog });
55
+ /** The shared dialog's categories, back in the service's enum. */
56
+ const SDK_CATEGORIES = {
57
+ cloud_storage: "CLOUD_STORAGE",
58
+ communication: "COMMUNICATION",
59
+ productivity: "PRODUCTIVITY",
60
+ crm: "CRM",
61
+ email: "EMAIL",
62
+ calendar: "CALENDAR",
63
+ developer_tools: "DEVELOPMENT",
64
+ social: "SOCIAL",
65
+ finance: "PAYMENT",
66
+ analytics: "ANALYTICS"
67
+ };
68
+ /** Auth types the SDK's enum can express; anything else is CUSTOM. */
69
+ const SDK_AUTH_TYPES = {
70
+ oauth2: "OAUTH2",
71
+ api_key: "API_KEY",
72
+ basic_auth: "BASIC_AUTH",
73
+ bearer_token: "BEARER_TOKEN"
74
+ };
75
+ /** The shared dialog's provider, in the SDK's GraphQL-enum shape. */
76
+ function toSdkProvider(provider) {
77
+ return {
78
+ id: provider.id,
79
+ key: provider.key,
80
+ name: provider.name,
81
+ description: provider.description,
82
+ category: SDK_CATEGORIES[provider.category] ?? "CUSTOM",
83
+ authType: SDK_AUTH_TYPES[provider.authType] ?? "CUSTOM",
84
+ icon: provider.icon,
85
+ website: provider.website,
86
+ docsUrl: provider.docsUrl,
87
+ isBuiltIn: true,
88
+ isEnabled: provider.isEnabled
89
+ };
90
+ }
91
+ function ConnectionFormDialog({ open, onClose, providerKey, providerId, defaultName, onConnectionCreated, onError }) {
92
+ const tr = useTr();
93
+ const handleCreated = useCallback((connection) => {
94
+ onConnectionCreated?.({
95
+ id: connection.id,
96
+ name: connection.name,
97
+ status: connection.status,
98
+ provider: toSdkProvider(connection.provider)
99
+ });
100
+ }, [onConnectionCreated]);
101
+ return /* @__PURE__ */ jsx(ConnectionDialog, {
102
+ open,
103
+ onClose,
104
+ client: getFluidGridsClient(),
105
+ callbackUrl: getOAuthCallbackUrl(),
106
+ translate: tr,
107
+ providerKey: providerKey ?? null,
108
+ providerId: providerId ?? null,
109
+ providerSource: "catalog",
110
+ requireVault: false,
111
+ defaultName,
112
+ showSharingTab: true,
113
+ defaultVisibility: "RESTRICTED",
114
+ onConnectionCreated: handleCreated,
115
+ onError
116
+ });
117
+ }
118
+
119
+ export { ConnectionFormDialog_exports as n, ConnectionFormDialog as t };
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
3
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
4
- import { n as useDataSinks, t as useDataSinkData } from "./useObservability-CfEw3ZFD.js";
4
+ import { n as useDataSinks, t as useDataSinkData } from "./useObservability-FfQGgW6W.js";
5
5
  import { s as prettyJson, t as formatBytes } from "./utils-uaL5UVxb.js";
6
6
  import { useEffect, useMemo, useState } from "react";
7
7
  import { Icon } from "@iconify/react";
@@ -1,11 +1,12 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
- import { i as useRunPending, n as useDurableParityRunFields, o as ExecutionStatusBadge, r as useRunMetadata, s as NodeStatusBadge, t as setRunVersioningOverride } from "./useDurableParity-CzUQMFJ3.js";
3
+ import { i as useRunPending, n as useDurableParityRunFields, o as ExecutionStatusBadge, r as useRunMetadata, s as NodeStatusBadge, t as setRunVersioningOverride } from "./useDurableParity-BScby67i.js";
4
4
  import { n as formatRunVersion, r as nodeDisplayTitle, t as buildNodeDisplayMap } from "./run-display-BycKYSU0.js";
5
5
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
6
6
  import { s as isAgentNodeType } from "./agent-form-Bfvm32j1.js";
7
- import { Sn as durableInterfaceOf, Tn as runSignalTargets, an as nodeStateDurationMs, bn as canSignalRun, in as formatElapsedMs, on as runDurationMs } from "./FluidGridsProvider-dvZSNtSW.js";
8
- import { f as callbackTone, g as shortRunId, h as runChainLinks, m as parseMetadataDefinition, n as useExecution, p as overrideRequestOf, r as useExecutionActions, t as useAutoRefresh } from "./useExecutions-9aLuOt1c.js";
7
+ import { Cn as canSignalRun, I as describeRunError, L as describeRunStep, On as runSignalTargets, Tn as durableInterfaceOf, cn as nodeStateDurationMs, ln as runDurationMs, sn as formatElapsedMs } from "./FluidGridsProvider-CbY91ZQq.js";
8
+ import { n as useFgAskable, r as useFgAskableSelection } from "./askAboutBridge-BV8m95kk.js";
9
+ import { f as callbackTone, g as shortRunId, h as runChainLinks, m as parseMetadataDefinition, n as useExecution, p as overrideRequestOf, r as useExecutionActions, t as useAutoRefresh } from "./useExecutions-B0VzQcY2.js";
9
10
  import { _ as throwIfResultError, m as describeOperationError, n as getFluidGridsClient, r as getFluidGridsClientSafe, x as getFluidGridsConfig } from "./client-C9XSzSXr.js";
10
11
  import { Yr as WorkflowRunHierarchyDocument, dn as RunAiUsageDocument, o as AgentStepUpdatedDocument, s as AgentTraceDocument, ut as ExplainRunDocument, xn as RunLogsDocument, yn as RunLogAppendedDocument } from "./graphql-operation-types-kX-MMjgW.js";
11
12
  import { i as SdkPermissionButton, s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-B2lhWNoN.js";
@@ -15,18 +16,17 @@ import { a as encodedPayloadBytes, f as EffectBadge, h as useRunPolicyDecisions,
15
16
  import { n as useWorkflowProposal, o as canSaveRunAsTestCase, r as saveRunAsTestCase, t as WorkflowProposalCard } from "./WorkflowProposalCard-qrEeNyYG.js";
16
17
  import { t as AiCreditBalanceSlot } from "./aiCreditsBridge-BuE92tKo.js";
17
18
  import { a as fetchRunFailureClusters, i as dismissRunFailureCluster, r as OPEN_STATUSES, t as BUCKET_LABELS } from "./FailureTriagePanel-B9hDQymi.js";
18
- import { a as useDurableRunFields, i as useDeterminismStatus, n as SignalRunDialog, o as useRunStackTrace, r as terminateDurableRun, s as RunHistoryView, t as useRunHistory } from "./useRunHistory-B1xJDwl1.js";
19
+ import { a as useDurableRunFields, i as useDeterminismStatus, n as SignalRunDialog, o as useRunStackTrace, r as terminateDurableRun, s as RunHistoryView, t as useRunHistory } from "./useRunHistory-BZJg72kd.js";
19
20
  import { $u as ErrorType, L as AgentStepKind, LF as WorkflowQueryRejectCondition, tI as WorkflowUpdateWaitFor, yP as VersioningBehavior } from "./graphql-types-CDKVWH2R.js";
20
21
  import { a as formatTokens, d as formatMicroUsd, o as modelLabel, r as aiCost } from "./ai-usage-glCwHyQz.js";
21
22
  import { c as useDurableParityEnabled, f as usePhaseCFlags, m as useWorkflowTestsEnabled, s as useDurableFunctionNodesEnabled } from "./feature-flags-DM5myWaD.js";
22
23
  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-BrCHB5oA.js";
23
24
  import { a as fetchTaskQueueStats } from "./api-C8e0iV-Q.js";
24
25
  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-CMfn30xT.js";
25
- import { v as useWorkflowVersions } from "./useWorkflows-BlVVu8NM.js";
26
+ import { v as useWorkflowVersions } from "./useWorkflows-Czz5DlL0.js";
26
27
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
27
28
  import { Link, useNavigate, useParams, useSearchParams } from "react-router";
28
29
  import { Icon } from "@iconify/react";
29
- import ReactMarkdown from "react-markdown";
30
30
  import { cn } from "@burdenoff/fe-libs/utils";
31
31
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
32
32
  import { toast } from "sonner";
@@ -34,6 +34,7 @@ import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent,
34
34
  import { Button as Button$1 } from "@burdenoff/fe-libs/button";
35
35
  import { FlaskConical } from "lucide-react";
36
36
  import { buildActorFallback, useActorProfiles } from "@burdenoff/fe-libs/shared";
37
+ import ReactMarkdown from "react-markdown";
37
38
 
38
39
  // src/modules/executions/utils/agent-trace.ts
39
40
  /**
@@ -243,6 +244,22 @@ function agentNodeTraces(nodeStates) {
243
244
  return (nodeStates ?? []).filter((node) => isAgentNodeType(node.nodeType)).map(parseAgentNodeState);
244
245
  }
245
246
 
247
+ // src/askAbout/Askable.tsx
248
+ const AskableDiv = ({ describe, askDisabled, ...rest }) => {
249
+ const ref = useFgAskable(describe, { disabled: askDisabled });
250
+ return /* @__PURE__ */ jsx("div", {
251
+ ref,
252
+ ...rest
253
+ });
254
+ };
255
+ const AskableSelectionDiv = ({ describe, ...rest }) => {
256
+ const ref = useFgAskableSelection(describe);
257
+ return /* @__PURE__ */ jsx("div", {
258
+ ref,
259
+ ...rest
260
+ });
261
+ };
262
+
246
263
  // src/modules/executions/components/NodeTimeline.tsx
247
264
  /**
248
265
  * Order nodes the way they actually executed.
@@ -271,7 +288,7 @@ function orderNodesByExecution(nodeStates, triggerNodeId) {
271
288
  return rankA === rankB ? 0 : rankA - rankB;
272
289
  });
273
290
  }
274
- function NodeTimeline({ nodeStates, nodeDisplay, loading, triggerNodeId, onRetryNode, onViewChildRun, onViewAgentTrace }) {
291
+ function NodeTimeline({ nodeStates, nodeDisplay, loading, triggerNodeId, onRetryNode, onViewChildRun, onViewAgentTrace, askRun }) {
275
292
  const tr = useTr();
276
293
  const [expandedNodes, setExpandedNodes] = useState(/* @__PURE__ */ new Set());
277
294
  const [selectedTab, setSelectedTab] = useState("output");
@@ -331,6 +348,17 @@ function NodeTimeline({ nodeStates, nodeDisplay, loading, triggerNodeId, onRetry
331
348
  const isRunning = node.status === "RUNNING";
332
349
  const isWaitingSubworkflow = node.status === "WAITING_SUBWORKFLOW";
333
350
  const hasChildRun = Boolean(node.childRunId);
351
+ const stepName = nodeDisplayTitle(nodeDisplay?.[node.nodeId], node.nodeId);
352
+ const describeStep = () => askRun ? describeRunStep({
353
+ run: askRun,
354
+ stepId: node.nodeId,
355
+ stepName,
356
+ stepType: node.nodeType,
357
+ stepVersion: node.nodeVersion,
358
+ status: node.status,
359
+ errorType: node.errorType,
360
+ error: nodeError
361
+ }) : null;
334
362
  return /* @__PURE__ */ jsxs("div", {
335
363
  className: "relative flex gap-4",
336
364
  children: [/* @__PURE__ */ jsxs("div", {
@@ -342,7 +370,10 @@ function NodeTimeline({ nodeStates, nodeDisplay, loading, triggerNodeId, onRetry
342
370
  className: "text-xs font-bold",
343
371
  children: index + 1
344
372
  }), isRunning && /* @__PURE__ */ jsx("span", { className: "absolute inset-0 rounded-full border-2 border-[var(--color-status-info-text)] animate-ping" })]
345
- }), /* @__PURE__ */ jsxs("div", {
373
+ }), /* @__PURE__ */ jsxs(AskableDiv, {
374
+ describe: describeStep,
375
+ askDisabled: !askRun,
376
+ "data-testid": "run-step-card",
346
377
  className: `
347
378
  flex-1 rounded-lg border transition-all
348
379
  ${hasError ? "bg-[var(--color-status-error-bg-subtle)] border-[var(--color-status-error-border)]" : isRunning ? "bg-[var(--color-status-info-bg-subtle)] border-[var(--color-status-info-border)]" : "bg-background-secondary border-border-secondary"}
@@ -429,7 +460,8 @@ function NodeTimeline({ nodeStates, nodeDisplay, loading, triggerNodeId, onRetry
429
460
  children: selectedTab === "output" ? formatJsonData(node.output) : formatJsonData(node.inputArgs)
430
461
  })
431
462
  }),
432
- node.error && /* @__PURE__ */ jsxs("div", {
463
+ node.error && /* @__PURE__ */ jsxs(AskableSelectionDiv, {
464
+ describe: describeStep,
433
465
  className: "mt-3 p-3 bg-[var(--color-status-error-bg-subtle)] border border-[var(--color-status-error-border)] rounded",
434
466
  children: [/* @__PURE__ */ jsxs("div", {
435
467
  className: "flex items-center gap-2 text-[var(--color-status-error-text)] mb-1",
@@ -6270,6 +6302,15 @@ function ExecutionDetailPage() {
6270
6302
  icon: "mdi:information-outline"
6271
6303
  }
6272
6304
  ];
6305
+ const askRun = {
6306
+ runId: execution.id,
6307
+ status: execution.status,
6308
+ workflowKey: execution.workflowKey,
6309
+ version: execution.version,
6310
+ errorType: execution.errorType ?? null,
6311
+ errorMessage: execution.errorMessage ?? null,
6312
+ failedSteps: execution.failedNodes
6313
+ };
6273
6314
  return /* @__PURE__ */ jsxs("div", {
6274
6315
  className: "p-4 pb-24 sm:p-6 sm:pb-24 bg-background-primary min-h-screen",
6275
6316
  children: [
@@ -6591,7 +6632,9 @@ function ExecutionDetailPage() {
6591
6632
  })
6592
6633
  ]
6593
6634
  }),
6594
- execution.errorMessage && /* @__PURE__ */ jsxs("div", {
6635
+ execution.errorMessage && /* @__PURE__ */ jsxs(AskableDiv, {
6636
+ describe: () => describeRunError(askRun),
6637
+ "data-testid": "run-error-banner",
6595
6638
  className: "mb-6 p-4 bg-[var(--color-status-error-bg-subtle)] border border-[var(--color-status-error-border)] rounded-lg",
6596
6639
  children: [/* @__PURE__ */ jsxs("div", {
6597
6640
  className: "flex items-center gap-2 text-[var(--color-status-error-text)] mb-2",
@@ -6602,9 +6645,12 @@ function ExecutionDetailPage() {
6602
6645
  className: "font-medium",
6603
6646
  children: [tr("fluidgrids.executions.executionDetail.errorLabel", "Error"), execution.errorType ? ` (${execution.errorType})` : ""]
6604
6647
  })]
6605
- }), /* @__PURE__ */ jsx("p", {
6606
- className: "text-[var(--color-status-error-text)]",
6607
- children: execution.errorMessage
6648
+ }), /* @__PURE__ */ jsx(AskableSelectionDiv, {
6649
+ describe: () => describeRunError(askRun),
6650
+ children: /* @__PURE__ */ jsx("p", {
6651
+ className: "text-[var(--color-status-error-text)]",
6652
+ children: execution.errorMessage
6653
+ })
6608
6654
  })]
6609
6655
  }),
6610
6656
  isDurableRun && /* @__PURE__ */ jsx(DurableDeterminismBanner, {
@@ -6717,7 +6763,8 @@ function ExecutionDetailPage() {
6717
6763
  triggerNodeId: execution.triggerNodeId ?? void 0,
6718
6764
  onRetryNode: canControlRuns ? handleRetryNode : void 0,
6719
6765
  onViewChildRun: handleViewChildRun,
6720
- onViewAgentTrace: (nodeId) => setActiveTab("agent", nodeId)
6766
+ onViewAgentTrace: (nodeId) => setActiveTab("agent", nodeId),
6767
+ askRun
6721
6768
  })
6722
6769
  }),
6723
6770
  activeTab === "agent" && hasAgent && /* @__PURE__ */ jsxs("div", {
@@ -1,17 +1,17 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
3
  import { M as DEFAULT_EXECUTIONS_FILTER, N as useExecutionsStore, m as describeOperationError, n as getFluidGridsClient } from "./client-C9XSzSXr.js";
4
- import { c as OPERATORS_BY_TYPE, i as useExecutionStats, l as buildSearchAttributeFilter, o as useExecutionsWithStore, r as useExecutionActions, s as EMPTY_SEARCH_FILTER, t as useAutoRefresh, u as searchFilterConflicts, y as validateDateRange } from "./useExecutions-9aLuOt1c.js";
4
+ import { c as OPERATORS_BY_TYPE, i as useExecutionStats, l as buildSearchAttributeFilter, o as useExecutionsWithStore, r as useExecutionActions, s as EMPTY_SEARCH_FILTER, t as useAutoRefresh, u as searchFilterConflicts, y as validateDateRange } from "./useExecutions-B0VzQcY2.js";
5
5
  import { c as useDurableParityEnabled, f as usePhaseCFlags } from "./feature-flags-DM5myWaD.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-DCBOH6Ou.js";
10
- import { a as useRunStatusCounts, c as runStatusLabels, l as RUN_STATUS_CONFIG, o as ExecutionStatusBadge } from "./useDurableParity-CzUQMFJ3.js";
10
+ import { a as useRunStatusCounts, c as runStatusLabels, l as RUN_STATUS_CONFIG, o as ExecutionStatusBadge } from "./useDurableParity-BScby67i.js";
11
11
  import { n as formatRunVersion } from "./run-display-BycKYSU0.js";
12
- import { in as formatElapsedMs, on as runDurationMs } from "./FluidGridsProvider-dvZSNtSW.js";
12
+ import { ln as runDurationMs, sn as formatElapsedMs } from "./FluidGridsProvider-CbY91ZQq.js";
13
13
  import { n as runListLinkKey, t as runListFilterFromSearch } from "./run-list-links-ByYC0OlV.js";
14
- import { h as useWorkflowDefinitions } from "./useWorkflows-BlVVu8NM.js";
14
+ import { h as useWorkflowDefinitions } from "./useWorkflows-Czz5DlL0.js";
15
15
  import { t as FluidGridsDocsLink } from "./FluidGridsDocsLink-JxkBpOeb.js";
16
16
  import { s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-B2lhWNoN.js";
17
17
  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-BrCHB5oA.js";