@burdenoff/fluidgrids-fe-sdk 2026.1105.3 → 2026.1106.1

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 (60) hide show
  1. package/README.md +16 -3
  2. package/dist/{ExecutionDetailPage-JXGPSLS3.js → ExecutionDetailPage-OOHJQR2L.js} +14 -14
  3. package/dist/{ExecutionsListPage-U3TC5JUI.js → ExecutionsListPage-6HS5VQOV.js} +10 -10
  4. package/dist/{WorkflowBuilder-6DOD6WWH.js → WorkflowBuilder-PICIS7FI.js} +16 -16
  5. package/dist/{WorkflowsList-XOWRQNST.js → WorkflowsList-SD5XQC4Q.js} +10 -10
  6. package/dist/{agentTools-YQBN33WG.js → agentTools-UH4LU6LA.js} +7 -7
  7. package/dist/{chunk-MY7SEUXM.js → chunk-43GSC5Y6.js} +1 -1
  8. package/dist/{chunk-EKDUYCTS.js → chunk-4XAXF5VP.js} +4 -4
  9. package/dist/{chunk-G774FI2E.js → chunk-5GG2FEKW.js} +2 -2
  10. package/dist/{chunk-TJAG2DQT.js → chunk-5Z4F24QT.js} +3 -3
  11. package/dist/{chunk-JYYN3CLL.js → chunk-6VIG44VF.js} +1 -1
  12. package/dist/{chunk-2WUVF4EQ.js → chunk-ASYYYJG2.js} +4 -4
  13. package/dist/{chunk-OXXXUAWM.js → chunk-CTKWMPQQ.js} +1 -1
  14. package/dist/{chunk-YGOGJDN4.js → chunk-EIMTOK6E.js} +3 -3
  15. package/dist/{chunk-AMXJLVZN.js → chunk-EXJW7EKR.js} +2 -2
  16. package/dist/{chunk-MP44TAOO.js → chunk-GBJWPSLJ.js} +70 -5
  17. package/dist/{chunk-LDWBMCX4.js → chunk-GBQC5WDH.js} +16 -9
  18. package/dist/{chunk-3ZYRLGDF.js → chunk-GPABUQTD.js} +650 -636
  19. package/dist/{chunk-ZBPRNWKY.js → chunk-HSTP2RX3.js} +35 -6
  20. package/dist/{chunk-US5QSLPV.js → chunk-JKLZ6YZ3.js} +22 -11
  21. package/dist/{chunk-KAWRHIJZ.js → chunk-JRLBPR5U.js} +3 -3
  22. package/dist/{chunk-IL343FKX.js → chunk-KHS2DZHH.js} +1 -1
  23. package/dist/{chunk-4NNF7DIB.js → chunk-KJT5TAOE.js} +3 -3
  24. package/dist/{chunk-TLHX4DK4.js → chunk-LLCVVRCE.js} +9 -9
  25. package/dist/{chunk-IJ7UIDCW.js → chunk-M72SMQOS.js} +8 -8
  26. package/dist/{chunk-TCIBTMJI.js → chunk-NZMUKAXG.js} +3 -69
  27. package/dist/{chunk-G33OMSW6.js → chunk-OLRIWGYM.js} +6 -6
  28. package/dist/{chunk-NMQENSPW.js → chunk-OTOQFZFO.js} +38 -38
  29. package/dist/{chunk-EYQ7GJRW.js → chunk-PASKZCII.js} +3 -3
  30. package/dist/{chunk-3IXU7WUC.js → chunk-PDODDDHY.js} +1 -1
  31. package/dist/{chunk-5DVP2UYH.js → chunk-TGWDFLEX.js} +11 -3
  32. package/dist/{chunk-AU7LACOY.js → chunk-TYI2XOSI.js} +1 -1
  33. package/dist/{chunk-L2N6DDOI.js → chunk-U7UNWR3D.js} +2 -2
  34. package/dist/{chunk-NZFPCTIS.js → chunk-UIS7KGHW.js} +4 -4
  35. package/dist/{chunk-KN37RIFC.js → chunk-UWCD7JUU.js} +8 -8
  36. package/dist/{chunk-MA6I4KY5.js → chunk-UYTPURFW.js} +16 -50
  37. package/dist/{chunk-ZLBTUCC2.js → chunk-WBRW67HX.js} +3 -3
  38. package/dist/{chunk-VESQH55Q.js → chunk-WC526MLS.js} +3 -3
  39. package/dist/{chunk-22U3TUKZ.js → chunk-XNARCHMT.js} +2 -2
  40. package/dist/{chunk-3MZOYJ5I.js → chunk-XWINH6CR.js} +1 -1
  41. package/dist/{chunk-FVWRGL7S.js → chunk-Y4UCHFGK.js} +1 -1
  42. package/dist/{client-YVZMLEQX.js → client-62VHXHKN.js} +2 -2
  43. package/dist/executions.js +15 -15
  44. package/dist/{global-client-N5EIFW6T.js → global-client-PJ5LANJA.js} +2 -2
  45. package/dist/history.js +9 -9
  46. package/dist/index.d.ts +10 -4
  47. package/dist/index.js +67 -53
  48. package/dist/{node-detail-view-U5HOP2WX.js → node-detail-view-P5NV5CMO.js} +11 -11
  49. package/dist/nodes.js +3 -3
  50. package/dist/observability.js +8 -8
  51. package/dist/{quick-config-panel-XAISBW6Y.js → quick-config-panel-ZNSBVF4G.js} +8 -8
  52. package/dist/settings.js +9 -9
  53. package/dist/templates.js +15 -15
  54. package/dist/{workflow-builder-7vv9dCdp.d.ts → workflow-builder-C-ekFbwR.d.ts} +37 -4
  55. package/dist/workflow-builder.d.ts +1 -1
  56. package/dist/workflow-builder.js +17 -17
  57. package/dist/workflow-preview.d.ts +10 -3
  58. package/dist/workflow-preview.js +78 -43
  59. package/dist/workflows-list.js +10 -10
  60. package/package.json +1 -1
@@ -1,19 +1,19 @@
1
- import { useDurableRunFields, useRunHistory, useDeterminismStatus, useRunStackTrace, RunHistoryView, SignalRunDialog, terminateDurableRun } from './chunk-2WUVF4EQ.js';
2
- import { useDurableParityRunFields, hasAgentNodeState, agentNodeTraces, orderNodesByExecution, useRunMetadata, useRunPending, ExecutionStatusBadge, NodeTimeline, RunLogViewer, NodeStatusBadge, setRunVersioningOverride } from './chunk-MA6I4KY5.js';
3
- import { useExecution, useExecutionActions, useAutoRefresh, runChainLinks, shortRunId, callbackTone, parseMetadataDefinition, overrideRequestOf } from './chunk-VESQH55Q.js';
4
- import { fetchRunFailureClusters, OPEN_STATUSES, dismissRunFailureCluster, BUCKET_LABELS, formatDuration } from './chunk-TCIBTMJI.js';
1
+ import { useDurableRunFields, useRunHistory, useDeterminismStatus, useRunStackTrace, RunHistoryView, SignalRunDialog, terminateDurableRun } from './chunk-ASYYYJG2.js';
2
+ import { useDurableParityRunFields, hasAgentNodeState, agentNodeTraces, orderNodesByExecution, useRunMetadata, useRunPending, ExecutionStatusBadge, NodeTimeline, RunLogViewer, NodeStatusBadge, setRunVersioningOverride } from './chunk-UYTPURFW.js';
3
+ import { useExecution, useExecutionActions, useAutoRefresh, runChainLinks, shortRunId, callbackTone, parseMetadataDefinition, overrideRequestOf } from './chunk-WC526MLS.js';
4
+ import { fetchRunFailureClusters, OPEN_STATUSES, dismissRunFailureCluster, BUCKET_LABELS } from './chunk-NZMUKAXG.js';
5
5
  import { aiCost, formatTokens, modelLabel } from './chunk-NZAYYUQ4.js';
6
- import { useRunPolicyDecisions, RunPolicyDecisions } from './chunk-AMXJLVZN.js';
7
- import { EntityTagPicker, canSaveRunAsTestCase, useWorkflowProposal, WorkflowProposalCard, MAX_CASE_NAME, saveRunAsTestCase } from './chunk-EYQ7GJRW.js';
8
- import { buildNodeDisplayMap, formatRunVersion, nodeDisplayTitle } from './chunk-IL343FKX.js';
6
+ import { useRunPolicyDecisions, RunPolicyDecisions } from './chunk-EXJW7EKR.js';
7
+ import { EntityTagPicker, canSaveRunAsTestCase, useWorkflowProposal, WorkflowProposalCard, MAX_CASE_NAME, saveRunAsTestCase } from './chunk-PASKZCII.js';
8
+ import { buildNodeDisplayMap, formatRunVersion, nodeDisplayTitle } from './chunk-KHS2DZHH.js';
9
9
  import { AiCreditBalanceSlot } from './chunk-Y53CVZVV.js';
10
- import { useWorkflowVersions } from './chunk-YGOGJDN4.js';
11
- import { useDurableFunctionNodesEnabled, useDurableParityEnabled, runSignalTargets, canSignalRun, useWorkflowTestsEnabled } from './chunk-ZBPRNWKY.js';
10
+ import { useWorkflowVersions } from './chunk-EIMTOK6E.js';
11
+ import { useDurableFunctionNodesEnabled, useDurableParityEnabled, runSignalTargets, canSignalRun, formatElapsedMs, runDurationMs, useWorkflowTestsEnabled } from './chunk-HSTP2RX3.js';
12
12
  import { useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS, SdkPermissionButton } from './chunk-5375NUIO.js';
13
13
  import { RunLogsDocument, RunLogAppendedDocument, ExplainRunDocument, RunAiUsageDocument } from './chunk-Z3ABLERJ.js';
14
14
  import { useTr } from './chunk-UULVIT25.js';
15
- import { getFluidGridsClient, getFluidGridsClientSafe } from './chunk-3IXU7WUC.js';
16
- import { throwIfResultError, describeOperationError } from './chunk-US5QSLPV.js';
15
+ import { getFluidGridsClient, getFluidGridsClientSafe } from './chunk-PDODDDHY.js';
16
+ import { throwIfResultError, describeOperationError } from './chunk-JKLZ6YZ3.js';
17
17
  import { getFluidGridsConfig } from './chunk-UEG2WC3G.js';
18
18
  import { useState, useRef, useCallback, useEffect, useMemo } from 'react';
19
19
  import { useParams, useNavigate, useSearchParams, Link } from 'react-router';
@@ -1725,7 +1725,25 @@ function AgentNodeCard({
1725
1725
  ),
1726
1726
  /* @__PURE__ */ jsx("h4", { className: "truncate font-medium text-text-primary", children: title })
1727
1727
  ] }),
1728
- /* @__PURE__ */ jsx("div", { className: "self-start sm:self-auto", children: /* @__PURE__ */ jsx(NodeStatusBadge, { status: trace.status, size: "sm" }) })
1728
+ /* @__PURE__ */ jsx("div", { className: "self-start sm:self-auto", children: trace.completedWithError ? (
1729
+ // The node finished, but the agent's own call failed (e.g. the
1730
+ // model provider refused it): a plain "Completed" would read as
1731
+ // a success.
1732
+ /* @__PURE__ */ jsxs(
1733
+ "span",
1734
+ {
1735
+ className: "inline-flex items-center gap-1 rounded-full border border-status-error-border bg-status-error-bg-subtle px-1.5 py-0.5 text-xs font-medium text-status-error-text",
1736
+ "data-testid": "agent-completed-with-error",
1737
+ children: [
1738
+ /* @__PURE__ */ jsx(Icon, { icon: "mdi:alert-circle-outline", width: 12, height: 12 }),
1739
+ tr(
1740
+ "fluidgrids.executions.executionDetail.agent.completedWithError",
1741
+ "Completed with error"
1742
+ )
1743
+ ]
1744
+ }
1745
+ )
1746
+ ) : /* @__PURE__ */ jsx(NodeStatusBadge, { status: trace.status, size: "sm" }) })
1729
1747
  ] }),
1730
1748
  /* @__PURE__ */ jsxs("dl", { className: "mt-3 grid grid-cols-2 gap-x-4 gap-y-2 text-sm sm:grid-cols-4", children: [
1731
1749
  /* @__PURE__ */ jsx(
@@ -1765,7 +1783,7 @@ function AgentNodeCard({
1765
1783
  "fluidgrids.executions.executionDetail.agent.duration",
1766
1784
  "Duration"
1767
1785
  ),
1768
- value: trace.durationMs === null ? "\u2014" : formatDuration(trace.durationMs / 1e3)
1786
+ value: formatElapsedMs(trace.durationMs, "\u2014")
1769
1787
  }
1770
1788
  )
1771
1789
  ] }),
@@ -1858,7 +1876,7 @@ function AgentStepRow({ step, tr }) {
1858
1876
  "fluidgrids.executions.executionDetail.agent.stepFailed",
1859
1877
  "Failed"
1860
1878
  ) }),
1861
- step.durationMs !== null && /* @__PURE__ */ jsx("span", { className: "ml-auto text-xs text-text-secondary", children: formatDuration(step.durationMs / 1e3) })
1879
+ step.durationMs !== null && /* @__PURE__ */ jsx("span", { className: "ml-auto text-xs text-text-secondary", children: formatElapsedMs(step.durationMs) })
1862
1880
  ] }),
1863
1881
  /* @__PURE__ */ jsxs("div", { className: "space-y-2 border-t border-border-secondary px-3 py-2", children: [
1864
1882
  marked && step.reason && /* @__PURE__ */ jsx(
@@ -3114,14 +3132,6 @@ function ExecutionDetailPage() {
3114
3132
  },
3115
3133
  [navigate]
3116
3134
  );
3117
- const formatDuration2 = (ms) => {
3118
- if (!ms) return "-";
3119
- if (ms < 1e3) return `${ms}ms`;
3120
- if (ms < 6e4) return `${(ms / 1e3).toFixed(1)}s`;
3121
- if (ms < 36e5)
3122
- return `${Math.round(ms / 6e4)}m ${Math.round(ms % 6e4 / 1e3)}s`;
3123
- return `${Math.round(ms / 36e5)}h ${Math.round(ms % 36e5 / 6e4)}m`;
3124
- };
3125
3135
  const formatDateTime2 = (dateStr) => {
3126
3136
  if (!dateStr) return "-";
3127
3137
  const date = new Date(dateStr);
@@ -3148,7 +3158,7 @@ function ExecutionDetailPage() {
3148
3158
  Link,
3149
3159
  {
3150
3160
  to: "../runs",
3151
- className: "text-action-primary-text hover:underline text-sm mb-4 inline-block",
3161
+ className: "text-text-link hover:text-text-linkHover hover:underline text-sm mb-4 inline-block",
3152
3162
  children: [
3153
3163
  "\u2190",
3154
3164
  " ",
@@ -3183,7 +3193,7 @@ function ExecutionDetailPage() {
3183
3193
  Link,
3184
3194
  {
3185
3195
  to: "../runs",
3186
- className: "text-action-primary-text hover:underline text-sm mb-4 inline-block",
3196
+ className: "text-text-link hover:text-text-linkHover hover:underline text-sm mb-4 inline-block",
3187
3197
  children: [
3188
3198
  "\u2190",
3189
3199
  " ",
@@ -3270,136 +3280,220 @@ function ExecutionDetailPage() {
3270
3280
  icon: "mdi:information-outline"
3271
3281
  }
3272
3282
  ];
3273
- return /* @__PURE__ */ jsxs("div", { className: "p-4 sm:p-6 bg-background-primary min-h-screen", children: [
3274
- /* @__PURE__ */ jsxs(
3275
- Link,
3276
- {
3277
- to: "../runs",
3278
- className: "text-action-primary-text hover:underline text-sm mb-4 inline-block",
3279
- children: [
3280
- "\u2190",
3281
- " ",
3282
- tr(
3283
- "fluidgrids.executions.executionDetail.backToExecutions",
3284
- "Back to Executions"
3285
- )
3286
- ]
3287
- }
3288
- ),
3289
- execution.parentRunId && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mb-3 text-sm", children: [
3290
- /* @__PURE__ */ jsx(Icon, { icon: "mdi:sitemap", className: "text-chart-12", width: 16 }),
3291
- /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3292
- "fluidgrids.executions.executionDetail.subWorkflowOf",
3293
- "Sub-workflow of"
3294
- ) }),
3283
+ return (
3284
+ // `pb-24`: the shell's floating assistant bubble sits bottom-right and would
3285
+ // otherwise cover the last card's actions (e.g. "View trace") at the end.
3286
+ /* @__PURE__ */ jsxs("div", { className: "p-4 pb-24 sm:p-6 sm:pb-24 bg-background-primary min-h-screen", children: [
3295
3287
  /* @__PURE__ */ jsxs(
3296
3288
  Link,
3297
3289
  {
3298
- to: `../runs/${execution.parentRunId}`,
3299
- className: "text-chart-12 hover:underline font-medium",
3290
+ to: "../runs",
3291
+ className: "text-text-link hover:text-text-linkHover hover:underline text-sm mb-4 inline-block",
3300
3292
  children: [
3301
- tr(
3302
- "fluidgrids.executions.executionDetail.parentRunLinkPrefix",
3303
- "Parent Run"
3304
- ),
3293
+ "\u2190",
3305
3294
  " ",
3306
- execution.parentRunId.slice(0, 12),
3307
- "..."
3295
+ tr(
3296
+ "fluidgrids.executions.executionDetail.backToExecutions",
3297
+ "Back to Executions"
3298
+ )
3308
3299
  ]
3309
3300
  }
3310
- )
3311
- ] }),
3312
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col lg:flex-row lg:items-start lg:justify-between gap-4 mb-6", children: [
3313
- /* @__PURE__ */ jsxs("div", { children: [
3314
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 mb-2", children: [
3315
- /* @__PURE__ */ jsx("h1", { className: "text-2xl sm:text-3xl font-bold text-text-primary", children: execution.workflow?.name || execution.workflowKey }),
3316
- /* @__PURE__ */ jsx(ExecutionStatusBadge, { status: execution.status, size: "lg" }),
3317
- execution.parentRunId && /* @__PURE__ */ jsx("span", { className: "px-2 py-0.5 text-xs bg-chart-12/10 text-chart-12 rounded", children: tr(
3318
- "fluidgrids.executions.executionDetail.subWorkflowBadge",
3319
- "Sub-Workflow"
3320
- ) })
3321
- ] }),
3322
- parityRun?.summary && /* @__PURE__ */ jsx(
3323
- "p",
3301
+ ),
3302
+ execution.parentRunId && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mb-3 text-sm", children: [
3303
+ /* @__PURE__ */ jsx(Icon, { icon: "mdi:sitemap", className: "text-chart-12", width: 16 }),
3304
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3305
+ "fluidgrids.executions.executionDetail.subWorkflowOf",
3306
+ "Sub-workflow of"
3307
+ ) }),
3308
+ /* @__PURE__ */ jsxs(
3309
+ Link,
3324
3310
  {
3325
- className: "mb-2 text-sm text-text-primary",
3326
- "data-testid": "run-summary",
3327
- children: parityRun.summary
3328
- }
3329
- ),
3330
- /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-4 text-sm text-text-secondary", children: [
3331
- /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
3332
- /* @__PURE__ */ jsx(Icon, { icon: "mdi:identifier", width: 16 }),
3333
- /* @__PURE__ */ jsxs("code", { className: "font-mono", children: [
3334
- execution.id.slice(0, 12),
3311
+ to: `../runs/${execution.parentRunId}`,
3312
+ className: "text-chart-12 hover:underline font-medium",
3313
+ children: [
3314
+ tr(
3315
+ "fluidgrids.executions.executionDetail.parentRunLinkPrefix",
3316
+ "Parent Run"
3317
+ ),
3318
+ " ",
3319
+ execution.parentRunId.slice(0, 12),
3335
3320
  "..."
3336
- ] })
3321
+ ]
3322
+ }
3323
+ )
3324
+ ] }),
3325
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col lg:flex-row lg:items-start lg:justify-between gap-4 mb-6", children: [
3326
+ /* @__PURE__ */ jsxs("div", { children: [
3327
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 mb-2", children: [
3328
+ /* @__PURE__ */ jsx("h1", { className: "text-2xl sm:text-3xl font-bold text-text-primary", children: execution.workflow?.name || execution.workflowKey }),
3329
+ /* @__PURE__ */ jsx(ExecutionStatusBadge, { status: execution.status, size: "lg" }),
3330
+ execution.parentRunId && /* @__PURE__ */ jsx("span", { className: "px-2 py-0.5 text-xs bg-chart-12/10 text-chart-12 rounded", children: tr(
3331
+ "fluidgrids.executions.executionDetail.subWorkflowBadge",
3332
+ "Sub-Workflow"
3333
+ ) })
3337
3334
  ] }),
3338
- parityRun?.businessId && /* @__PURE__ */ jsxs(
3339
- "span",
3335
+ parityRun?.summary && /* @__PURE__ */ jsx(
3336
+ "p",
3340
3337
  {
3341
- className: "flex items-center gap-1",
3342
- "data-testid": "run-workflow-id",
3343
- title: parityRun.businessId,
3344
- children: [
3345
- /* @__PURE__ */ jsx(Icon, { icon: "mdi:key-outline", width: 16 }),
3346
- /* @__PURE__ */ jsx("code", { className: "max-w-[16rem] truncate font-mono", children: parityRun.businessId })
3347
- ]
3338
+ className: "mb-2 text-sm text-text-primary",
3339
+ "data-testid": "run-summary",
3340
+ children: parityRun.summary
3348
3341
  }
3349
3342
  ),
3350
- /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
3351
- /* @__PURE__ */ jsx(Icon, { icon: "mdi:tag-outline", width: 16 }),
3352
- formatRunVersion(execution.version)
3343
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-4 text-sm text-text-secondary", children: [
3344
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
3345
+ /* @__PURE__ */ jsx(Icon, { icon: "mdi:identifier", width: 16 }),
3346
+ /* @__PURE__ */ jsxs("code", { className: "font-mono", children: [
3347
+ execution.id.slice(0, 12),
3348
+ "..."
3349
+ ] })
3350
+ ] }),
3351
+ parityRun?.businessId && /* @__PURE__ */ jsxs(
3352
+ "span",
3353
+ {
3354
+ className: "flex items-center gap-1",
3355
+ "data-testid": "run-workflow-id",
3356
+ title: parityRun.businessId,
3357
+ children: [
3358
+ /* @__PURE__ */ jsx(Icon, { icon: "mdi:key-outline", width: 16 }),
3359
+ /* @__PURE__ */ jsx("code", { className: "max-w-[16rem] truncate font-mono", children: parityRun.businessId })
3360
+ ]
3361
+ }
3362
+ ),
3363
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
3364
+ /* @__PURE__ */ jsx(Icon, { icon: "mdi:tag-outline", width: 16 }),
3365
+ formatRunVersion(execution.version)
3366
+ ] }),
3367
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
3368
+ /* @__PURE__ */ jsx(Icon, { icon: "mdi:clock-outline", width: 16 }),
3369
+ formatDateTime2(execution.startedAt || execution.createdAt)
3370
+ ] })
3353
3371
  ] }),
3354
- /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
3355
- /* @__PURE__ */ jsx(Icon, { icon: "mdi:clock-outline", width: 16 }),
3356
- formatDateTime2(execution.startedAt || execution.createdAt)
3357
- ] })
3358
- ] }),
3359
- /* @__PURE__ */ jsx("div", { className: "mt-3", "data-testid": "run-tags", children: /* @__PURE__ */ jsx(
3360
- EntityTagPicker,
3361
- {
3362
- entityType: "FLUIDGRIDS_RUN",
3363
- entityId: execution.id,
3364
- readOnly: !canTagRun
3365
- }
3366
- ) })
3367
- ] }),
3368
- /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
3369
- isActive && /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2 text-sm text-text-secondary mr-4", children: [
3370
- /* @__PURE__ */ jsx(
3371
- "input",
3372
+ /* @__PURE__ */ jsx("div", { className: "mt-3", "data-testid": "run-tags", children: /* @__PURE__ */ jsx(
3373
+ EntityTagPicker,
3372
3374
  {
3373
- type: "checkbox",
3374
- checked: autoRefreshEnabled,
3375
- onChange: (e) => setAutoRefreshEnabled(e.target.checked),
3376
- className: "w-4 h-4 rounded"
3375
+ entityType: "FLUIDGRIDS_RUN",
3376
+ entityId: execution.id,
3377
+ readOnly: !canTagRun
3377
3378
  }
3378
- ),
3379
- tr(
3380
- "fluidgrids.executions.executionDetail.autoRefreshToggle",
3381
- "Auto-refresh"
3382
- )
3379
+ ) })
3383
3380
  ] }),
3384
- canControlRuns && execution.status === "RUNNING" && /* @__PURE__ */ jsxs(Fragment, { children: [
3385
- !isDurableRun && /* @__PURE__ */ jsxs(
3386
- Button,
3387
- {
3388
- "data-agent": "confirm",
3389
- variant: "outline",
3390
- size: "sm",
3391
- onClick: handlePause,
3392
- disabled: actionLoading,
3393
- children: [
3394
- /* @__PURE__ */ jsx(Icon, { icon: "mdi:pause", className: "mr-1", width: 16 }),
3395
- tr(
3396
- "fluidgrids.executions.executionDetail.pauseButton",
3397
- "Pause"
3398
- )
3399
- ]
3400
- }
3401
- ),
3402
- /* @__PURE__ */ jsxs(
3381
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
3382
+ isActive && /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2 text-sm text-text-secondary mr-4", children: [
3383
+ /* @__PURE__ */ jsx(
3384
+ "input",
3385
+ {
3386
+ type: "checkbox",
3387
+ checked: autoRefreshEnabled,
3388
+ onChange: (e) => setAutoRefreshEnabled(e.target.checked),
3389
+ className: "w-4 h-4 rounded"
3390
+ }
3391
+ ),
3392
+ tr(
3393
+ "fluidgrids.executions.executionDetail.autoRefreshToggle",
3394
+ "Auto-refresh"
3395
+ )
3396
+ ] }),
3397
+ canControlRuns && execution.status === "RUNNING" && /* @__PURE__ */ jsxs(Fragment, { children: [
3398
+ !isDurableRun && /* @__PURE__ */ jsxs(
3399
+ Button,
3400
+ {
3401
+ "data-agent": "confirm",
3402
+ variant: "outline",
3403
+ size: "sm",
3404
+ onClick: handlePause,
3405
+ disabled: actionLoading,
3406
+ children: [
3407
+ /* @__PURE__ */ jsx(Icon, { icon: "mdi:pause", className: "mr-1", width: 16 }),
3408
+ tr(
3409
+ "fluidgrids.executions.executionDetail.pauseButton",
3410
+ "Pause"
3411
+ )
3412
+ ]
3413
+ }
3414
+ ),
3415
+ /* @__PURE__ */ jsxs(
3416
+ Button,
3417
+ {
3418
+ "data-agent": "confirm",
3419
+ variant: "outline",
3420
+ size: "sm",
3421
+ onClick: handleCancel,
3422
+ disabled: actionLoading,
3423
+ className: "border-[var(--color-status-warning-border)] text-[var(--color-status-warning-text)] hover:bg-[var(--color-status-warning-bg-subtle)]",
3424
+ children: [
3425
+ /* @__PURE__ */ jsx(Icon, { icon: "mdi:stop", className: "mr-1", width: 16 }),
3426
+ tr(
3427
+ "fluidgrids.executions.executionDetail.cancelButton",
3428
+ "Cancel"
3429
+ )
3430
+ ]
3431
+ }
3432
+ )
3433
+ ] }),
3434
+ canControlRuns && execution.status === "WAITING" && /* @__PURE__ */ jsxs(Fragment, { children: [
3435
+ humanRequestsCurrent && !awaitingPerson && !isDurableRun && !waitingOnSignal && /* @__PURE__ */ jsxs(
3436
+ Button,
3437
+ {
3438
+ "data-agent": "confirm",
3439
+ variant: "outline",
3440
+ size: "sm",
3441
+ onClick: handleResume,
3442
+ disabled: actionLoading,
3443
+ children: [
3444
+ /* @__PURE__ */ jsx(Icon, { icon: "mdi:play", className: "mr-1", width: 16 }),
3445
+ tr(
3446
+ "fluidgrids.executions.executionDetail.resumeButton",
3447
+ "Resume"
3448
+ )
3449
+ ]
3450
+ }
3451
+ ),
3452
+ !humanRequestsCurrent && humanRequestsError && /* @__PURE__ */ jsxs(
3453
+ "span",
3454
+ {
3455
+ className: "flex items-center gap-2 text-sm text-[var(--color-status-error-text)]",
3456
+ "data-testid": "human-requests-error",
3457
+ children: [
3458
+ tr(
3459
+ "fluidgrids.humanResponse.checkFailed",
3460
+ "Could not check whether this run is waiting on a person."
3461
+ ),
3462
+ /* @__PURE__ */ jsxs(
3463
+ Button,
3464
+ {
3465
+ variant: "outline",
3466
+ size: "sm",
3467
+ onClick: () => void refetchHumanRequests(),
3468
+ children: [
3469
+ /* @__PURE__ */ jsx(Icon, { icon: "mdi:refresh", className: "mr-1", width: 16 }),
3470
+ tr("fluidgrids.humanResponse.retry", "Retry")
3471
+ ]
3472
+ }
3473
+ )
3474
+ ]
3475
+ }
3476
+ ),
3477
+ /* @__PURE__ */ jsxs(
3478
+ Button,
3479
+ {
3480
+ "data-agent": "confirm",
3481
+ variant: "outline",
3482
+ size: "sm",
3483
+ onClick: handleCancel,
3484
+ disabled: actionLoading,
3485
+ className: "border-[var(--color-status-warning-border)] text-[var(--color-status-warning-text)] hover:bg-[var(--color-status-warning-bg-subtle)]",
3486
+ children: [
3487
+ /* @__PURE__ */ jsx(Icon, { icon: "mdi:stop", className: "mr-1", width: 16 }),
3488
+ tr(
3489
+ "fluidgrids.executions.executionDetail.cancelButton",
3490
+ "Cancel"
3491
+ )
3492
+ ]
3493
+ }
3494
+ )
3495
+ ] }),
3496
+ canControlRuns && execution.status === "PENDING" && /* @__PURE__ */ jsxs(
3403
3497
  Button,
3404
3498
  {
3405
3499
  "data-agent": "confirm",
@@ -3407,7 +3501,6 @@ function ExecutionDetailPage() {
3407
3501
  size: "sm",
3408
3502
  onClick: handleCancel,
3409
3503
  disabled: actionLoading,
3410
- className: "border-[var(--color-status-warning-border)] text-[var(--color-status-warning-text)] hover:bg-[var(--color-status-warning-bg-subtle)]",
3411
3504
  children: [
3412
3505
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:stop", className: "mr-1", width: 16 }),
3413
3506
  tr(
@@ -3416,583 +3509,504 @@ function ExecutionDetailPage() {
3416
3509
  )
3417
3510
  ]
3418
3511
  }
3419
- )
3420
- ] }),
3421
- canControlRuns && execution.status === "WAITING" && /* @__PURE__ */ jsxs(Fragment, { children: [
3422
- humanRequestsCurrent && !awaitingPerson && !isDurableRun && !waitingOnSignal && /* @__PURE__ */ jsxs(
3512
+ ),
3513
+ canSendSignal && /* @__PURE__ */ jsxs(
3423
3514
  Button,
3424
3515
  {
3425
- "data-agent": "confirm",
3426
3516
  variant: "outline",
3427
3517
  size: "sm",
3428
- onClick: handleResume,
3429
- disabled: actionLoading,
3518
+ onClick: () => setShowSignalDialog(true),
3519
+ "data-testid": "run-signal-button",
3430
3520
  children: [
3431
- /* @__PURE__ */ jsx(Icon, { icon: "mdi:play", className: "mr-1", width: 16 }),
3521
+ /* @__PURE__ */ jsx(Icon, { icon: "mdi:bell-ring-outline", className: "mr-1", width: 16 }),
3432
3522
  tr(
3433
- "fluidgrids.executions.executionDetail.resumeButton",
3434
- "Resume"
3523
+ "fluidgrids.executions.executionDetail.signalButton",
3524
+ "Signal"
3435
3525
  )
3436
3526
  ]
3437
3527
  }
3438
3528
  ),
3439
- !humanRequestsCurrent && humanRequestsError && /* @__PURE__ */ jsxs(
3440
- "span",
3529
+ (isDurableRun ? canTerminateDurable : canControlRuns) && (execution.status === "RUNNING" || execution.status === "WAITING") && /* @__PURE__ */ jsxs(
3530
+ Button,
3441
3531
  {
3442
- className: "flex items-center gap-2 text-sm text-[var(--color-status-error-text)]",
3443
- "data-testid": "human-requests-error",
3532
+ variant: "outline",
3533
+ size: "sm",
3534
+ onClick: () => setShowTerminateDialog(true),
3535
+ disabled: actionLoading,
3536
+ className: "border-[var(--color-status-error-border)] text-[var(--color-status-error-text)] hover:bg-[var(--color-status-error-bg-subtle)]",
3444
3537
  children: [
3538
+ /* @__PURE__ */ jsx(Icon, { icon: "mdi:close-octagon", className: "mr-1", width: 16 }),
3445
3539
  tr(
3446
- "fluidgrids.humanResponse.checkFailed",
3447
- "Could not check whether this run is waiting on a person."
3448
- ),
3449
- /* @__PURE__ */ jsxs(
3450
- Button,
3451
- {
3452
- variant: "outline",
3453
- size: "sm",
3454
- onClick: () => void refetchHumanRequests(),
3455
- children: [
3456
- /* @__PURE__ */ jsx(Icon, { icon: "mdi:refresh", className: "mr-1", width: 16 }),
3457
- tr("fluidgrids.humanResponse.retry", "Retry")
3458
- ]
3459
- }
3540
+ "fluidgrids.executions.executionDetail.terminateButton",
3541
+ "Terminate"
3460
3542
  )
3461
3543
  ]
3462
3544
  }
3463
3545
  ),
3464
- /* @__PURE__ */ jsxs(
3546
+ isHistoricalTestRun && execution.workflowKey && execution.version && /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: handleLoadInBuilder, children: [
3547
+ /* @__PURE__ */ jsx(Icon, { icon: "mdi:open-in-new", className: "mr-1", width: 16 }),
3548
+ tr(
3549
+ "fluidgrids.executions.executionDetail.loadTestRunButton",
3550
+ "Load TEST run in builder"
3551
+ )
3552
+ ] }),
3553
+ canControlRuns && !isDurableRun && execution.status !== "RUNNING" && execution.status !== "PENDING" && execution.status !== "WAITING" && /* @__PURE__ */ jsxs(
3465
3554
  Button,
3466
3555
  {
3467
3556
  "data-agent": "confirm",
3468
3557
  variant: "outline",
3469
3558
  size: "sm",
3470
- onClick: handleCancel,
3559
+ onClick: () => void handleReplay(),
3471
3560
  disabled: actionLoading,
3472
- className: "border-[var(--color-status-warning-border)] text-[var(--color-status-warning-text)] hover:bg-[var(--color-status-warning-bg-subtle)]",
3473
3561
  children: [
3474
- /* @__PURE__ */ jsx(Icon, { icon: "mdi:stop", className: "mr-1", width: 16 }),
3562
+ /* @__PURE__ */ jsx(Icon, { icon: "mdi:replay", className: "mr-1", width: 16 }),
3475
3563
  tr(
3476
- "fluidgrids.executions.executionDetail.cancelButton",
3477
- "Cancel"
3564
+ "fluidgrids.executions.executionDetail.replayButton",
3565
+ "Replay in test mode"
3478
3566
  )
3479
3567
  ]
3480
3568
  }
3481
- )
3482
- ] }),
3483
- canControlRuns && execution.status === "PENDING" && /* @__PURE__ */ jsxs(
3484
- Button,
3485
- {
3486
- "data-agent": "confirm",
3487
- variant: "outline",
3488
- size: "sm",
3489
- onClick: handleCancel,
3490
- disabled: actionLoading,
3491
- children: [
3492
- /* @__PURE__ */ jsx(Icon, { icon: "mdi:stop", className: "mr-1", width: 16 }),
3493
- tr(
3494
- "fluidgrids.executions.executionDetail.cancelButton",
3495
- "Cancel"
3496
- )
3497
- ]
3498
- }
3499
- ),
3500
- canSendSignal && /* @__PURE__ */ jsxs(
3501
- Button,
3502
- {
3503
- variant: "outline",
3504
- size: "sm",
3505
- onClick: () => setShowSignalDialog(true),
3506
- "data-testid": "run-signal-button",
3507
- children: [
3508
- /* @__PURE__ */ jsx(Icon, { icon: "mdi:bell-ring-outline", className: "mr-1", width: 16 }),
3509
- tr(
3510
- "fluidgrids.executions.executionDetail.signalButton",
3511
- "Signal"
3512
- )
3513
- ]
3514
- }
3515
- ),
3516
- (isDurableRun ? canTerminateDurable : canControlRuns) && (execution.status === "RUNNING" || execution.status === "WAITING") && /* @__PURE__ */ jsxs(
3517
- Button,
3518
- {
3519
- variant: "outline",
3520
- size: "sm",
3521
- onClick: () => setShowTerminateDialog(true),
3522
- disabled: actionLoading,
3523
- className: "border-[var(--color-status-error-border)] text-[var(--color-status-error-text)] hover:bg-[var(--color-status-error-bg-subtle)]",
3524
- children: [
3525
- /* @__PURE__ */ jsx(Icon, { icon: "mdi:close-octagon", className: "mr-1", width: 16 }),
3526
- tr(
3527
- "fluidgrids.executions.executionDetail.terminateButton",
3528
- "Terminate"
3529
- )
3530
- ]
3531
- }
3532
- ),
3533
- isHistoricalTestRun && execution.workflowKey && execution.version && /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: handleLoadInBuilder, children: [
3534
- /* @__PURE__ */ jsx(Icon, { icon: "mdi:open-in-new", className: "mr-1", width: 16 }),
3535
- tr(
3536
- "fluidgrids.executions.executionDetail.loadTestRunButton",
3537
- "Load TEST run in builder"
3538
- )
3539
- ] }),
3540
- canControlRuns && !isDurableRun && execution.status !== "RUNNING" && execution.status !== "PENDING" && execution.status !== "WAITING" && /* @__PURE__ */ jsxs(
3541
- Button,
3542
- {
3543
- "data-agent": "confirm",
3544
- variant: "outline",
3545
- size: "sm",
3546
- onClick: () => void handleReplay(),
3547
- disabled: actionLoading,
3548
- children: [
3549
- /* @__PURE__ */ jsx(Icon, { icon: "mdi:replay", className: "mr-1", width: 16 }),
3550
- tr(
3551
- "fluidgrids.executions.executionDetail.replayButton",
3552
- "Replay in test mode"
3553
- )
3554
- ]
3555
- }
3556
- ),
3557
- /* @__PURE__ */ jsx(
3558
- SaveRunAsTestCaseButton,
3559
- {
3560
- runId: execution.id,
3561
- status: execution.status,
3562
- workflowKey: execution.workflowKey,
3563
- isDurable: isDurableRun || durableEnabled && durableFields.fields?.id !== execution.id
3564
- }
3565
- ),
3566
- /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: refetch, children: [
3567
- /* @__PURE__ */ jsx(Icon, { icon: "mdi:refresh", className: "mr-1", width: 16 }),
3568
- tr(
3569
- "fluidgrids.executions.executionDetail.refreshButton",
3570
- "Refresh"
3571
- )
3572
- ] })
3573
- ] })
3574
- ] }),
3575
- /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 sm:grid-cols-4 gap-4 mb-6", children: [
3576
- /* @__PURE__ */ jsxs("div", { className: "bg-background-secondary rounded-lg border border-border-secondary p-4", children: [
3577
- /* @__PURE__ */ jsx("div", { className: "text-sm text-text-secondary", children: tr(
3578
- "fluidgrids.executions.executionDetail.durationStat",
3579
- "Duration"
3580
- ) }),
3581
- /* @__PURE__ */ jsx("div", { className: "text-xl font-bold text-text-primary mt-1", children: formatDuration2(execution.duration) })
3582
- ] }),
3583
- /* @__PURE__ */ jsxs("div", { className: "bg-background-secondary rounded-lg border border-border-secondary p-4", children: [
3584
- /* @__PURE__ */ jsx("div", { className: "text-sm text-text-secondary", children: tr(
3585
- "fluidgrids.executions.executionDetail.progressStat",
3586
- "Progress"
3587
- ) }),
3588
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mt-1", children: [
3589
- /* @__PURE__ */ jsx("div", { className: "flex-1 h-2 bg-background-tertiary rounded-full overflow-hidden", children: /* @__PURE__ */ jsx(
3590
- "div",
3569
+ ),
3570
+ /* @__PURE__ */ jsx(
3571
+ SaveRunAsTestCaseButton,
3591
3572
  {
3592
- className: `h-full ${execution.status === "FAILED" ? "bg-[var(--color-status-error-bg)]" : execution.status === "COMPLETED" ? "bg-[var(--color-status-success-bg)]" : "bg-[var(--color-status-info-bg)]"}`,
3593
- style: { width: `${execution.progress}%` }
3573
+ runId: execution.id,
3574
+ status: execution.status,
3575
+ workflowKey: execution.workflowKey,
3576
+ isDurable: isDurableRun || durableEnabled && durableFields.fields?.id !== execution.id
3594
3577
  }
3595
- ) }),
3596
- /* @__PURE__ */ jsxs("span", { className: "text-xl font-bold text-text-primary", children: [
3597
- Math.round(execution.progress),
3598
- "%"
3578
+ ),
3579
+ /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: refetch, children: [
3580
+ /* @__PURE__ */ jsx(Icon, { icon: "mdi:refresh", className: "mr-1", width: 16 }),
3581
+ tr(
3582
+ "fluidgrids.executions.executionDetail.refreshButton",
3583
+ "Refresh"
3584
+ )
3599
3585
  ] })
3600
3586
  ] })
3601
3587
  ] }),
3602
- /* @__PURE__ */ jsxs("div", { className: "bg-background-secondary rounded-lg border border-border-secondary p-4", children: [
3603
- /* @__PURE__ */ jsx("div", { className: "text-sm text-text-secondary", children: tr("fluidgrids.executions.executionDetail.nodesStat", "Nodes") }),
3604
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mt-1", children: [
3605
- /* @__PURE__ */ jsx("span", { className: "text-xl font-bold text-[var(--color-status-success-text)]", children: execution.completedNodes ?? 0 }),
3606
- /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: "/" }),
3607
- /* @__PURE__ */ jsx("span", { className: "text-xl font-bold text-text-primary", children: execution.totalNodes ?? 0 }),
3608
- (execution.failedNodes ?? 0) > 0 && /* @__PURE__ */ jsxs("span", { className: "text-sm text-[var(--color-status-error-text)] ml-2", children: [
3609
- "(",
3610
- execution.failedNodes,
3611
- " ",
3612
- tr(
3613
- "fluidgrids.executions.executionDetail.failedNodesSuffix",
3614
- "failed"
3615
- ),
3616
- ")"
3588
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 sm:grid-cols-4 gap-4 mb-6", children: [
3589
+ /* @__PURE__ */ jsxs("div", { className: "bg-background-secondary rounded-lg border border-border-secondary p-4", children: [
3590
+ /* @__PURE__ */ jsx("div", { className: "text-sm text-text-secondary", children: tr(
3591
+ "fluidgrids.executions.executionDetail.durationStat",
3592
+ "Duration"
3593
+ ) }),
3594
+ /* @__PURE__ */ jsx("div", { className: "text-xl font-bold text-text-primary mt-1", children: formatElapsedMs(runDurationMs(execution)) })
3595
+ ] }),
3596
+ /* @__PURE__ */ jsxs("div", { className: "bg-background-secondary rounded-lg border border-border-secondary p-4", children: [
3597
+ /* @__PURE__ */ jsx("div", { className: "text-sm text-text-secondary", children: tr(
3598
+ "fluidgrids.executions.executionDetail.progressStat",
3599
+ "Progress"
3600
+ ) }),
3601
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mt-1", children: [
3602
+ /* @__PURE__ */ jsx("div", { className: "flex-1 h-2 bg-background-tertiary rounded-full overflow-hidden", children: /* @__PURE__ */ jsx(
3603
+ "div",
3604
+ {
3605
+ className: `h-full ${execution.status === "FAILED" ? "bg-[var(--color-status-error-bg)]" : execution.status === "COMPLETED" ? "bg-[var(--color-status-success-bg)]" : "bg-[var(--color-status-info-bg)]"}`,
3606
+ style: { width: `${execution.progress}%` }
3607
+ }
3608
+ ) }),
3609
+ /* @__PURE__ */ jsxs("span", { className: "text-xl font-bold text-text-primary", children: [
3610
+ Math.round(execution.progress),
3611
+ "%"
3612
+ ] })
3613
+ ] })
3614
+ ] }),
3615
+ /* @__PURE__ */ jsxs("div", { className: "bg-background-secondary rounded-lg border border-border-secondary p-4", children: [
3616
+ /* @__PURE__ */ jsx("div", { className: "text-sm text-text-secondary", children: tr("fluidgrids.executions.executionDetail.nodesStat", "Nodes") }),
3617
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mt-1", children: [
3618
+ /* @__PURE__ */ jsx("span", { className: "text-xl font-bold text-[var(--color-status-success-text)]", children: execution.completedNodes ?? 0 }),
3619
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: "/" }),
3620
+ /* @__PURE__ */ jsx("span", { className: "text-xl font-bold text-text-primary", children: execution.totalNodes ?? 0 }),
3621
+ (execution.failedNodes ?? 0) > 0 && /* @__PURE__ */ jsxs("span", { className: "text-sm text-[var(--color-status-error-text)] ml-2", children: [
3622
+ "(",
3623
+ execution.failedNodes,
3624
+ " ",
3625
+ tr(
3626
+ "fluidgrids.executions.executionDetail.failedNodesSuffix",
3627
+ "failed"
3628
+ ),
3629
+ ")"
3630
+ ] })
3617
3631
  ] })
3632
+ ] }),
3633
+ /* @__PURE__ */ jsxs("div", { className: "bg-background-secondary rounded-lg border border-border-secondary p-4", children: [
3634
+ /* @__PURE__ */ jsx("div", { className: "text-sm text-text-secondary", children: tr("fluidgrids.executions.executionDetail.triggerStat", "Trigger") }),
3635
+ /* @__PURE__ */ jsx("div", { className: "text-lg font-medium text-text-primary mt-1 truncate", children: isDurableRun && execution.workflowFn ? execution.workflowFn : execution.triggerNodeId ? nodeDisplay[execution.triggerNodeId]?.label ?? execution.triggerNodeId : "\u2014" })
3618
3636
  ] })
3619
3637
  ] }),
3620
- /* @__PURE__ */ jsxs("div", { className: "bg-background-secondary rounded-lg border border-border-secondary p-4", children: [
3621
- /* @__PURE__ */ jsx("div", { className: "text-sm text-text-secondary", children: tr("fluidgrids.executions.executionDetail.triggerStat", "Trigger") }),
3622
- /* @__PURE__ */ jsx("div", { className: "text-lg font-medium text-text-primary mt-1 truncate", children: isDurableRun && execution.workflowFn ? execution.workflowFn : execution.triggerNodeId ? nodeDisplay[execution.triggerNodeId]?.label ?? execution.triggerNodeId : "\u2014" })
3623
- ] })
3624
- ] }),
3625
- execution.errorMessage && /* @__PURE__ */ jsxs("div", { className: "mb-6 p-4 bg-[var(--color-status-error-bg-subtle)] border border-[var(--color-status-error-border)] rounded-lg", children: [
3626
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-[var(--color-status-error-text)] mb-2", children: [
3627
- /* @__PURE__ */ jsx(Icon, { icon: "mdi:alert-circle", width: 20 }),
3628
- /* @__PURE__ */ jsxs("span", { className: "font-medium", children: [
3629
- tr("fluidgrids.executions.executionDetail.errorLabel", "Error"),
3630
- execution.errorType ? ` (${execution.errorType})` : ""
3631
- ] })
3638
+ execution.errorMessage && /* @__PURE__ */ jsxs("div", { className: "mb-6 p-4 bg-[var(--color-status-error-bg-subtle)] border border-[var(--color-status-error-border)] rounded-lg", children: [
3639
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-[var(--color-status-error-text)] mb-2", children: [
3640
+ /* @__PURE__ */ jsx(Icon, { icon: "mdi:alert-circle", width: 20 }),
3641
+ /* @__PURE__ */ jsxs("span", { className: "font-medium", children: [
3642
+ tr("fluidgrids.executions.executionDetail.errorLabel", "Error"),
3643
+ execution.errorType ? ` (${execution.errorType})` : ""
3644
+ ] })
3645
+ ] }),
3646
+ /* @__PURE__ */ jsx("p", { className: "text-[var(--color-status-error-text)]", children: execution.errorMessage })
3632
3647
  ] }),
3633
- /* @__PURE__ */ jsx("p", { className: "text-[var(--color-status-error-text)]", children: execution.errorMessage })
3634
- ] }),
3635
- isDurableRun && /* @__PURE__ */ jsx(
3636
- DurableDeterminismBanner,
3637
- {
3638
- status: determinism.status,
3639
- workflowKey: execution.workflowKey,
3640
- version: execution.version,
3641
- canReplaceCode,
3642
- canTerminate: canTerminateDurable,
3643
- onOpenSource: () => navigate(
3644
- `../workflow/${encodeURIComponent(execution.workflowKey)}/${encodeURIComponent(execution.version)}`
3645
- ),
3646
- onTerminate: handleTerminateDurable
3647
- }
3648
- ),
3649
- /* @__PURE__ */ jsx(
3650
- RunAiAssistPanel,
3651
- {
3652
- runId: execution.id,
3653
- status: execution.status,
3654
- canPropose: canProposeFix,
3655
- canApply: canApplyFix,
3656
- onOpenWorkflow: (workflowKey, version) => navigate(
3657
- `../workflow/${encodeURIComponent(workflowKey)}/${encodeURIComponent(version)}`
3658
- )
3659
- }
3660
- ),
3661
- /* @__PURE__ */ jsx(
3662
- RunFailureClusterCard,
3663
- {
3664
- runId: execution.id,
3665
- status: execution.status,
3666
- canApply: canApplyFix,
3667
- onOpenWorkflow: (workflowKey, version) => navigate(
3668
- `../workflow/${encodeURIComponent(workflowKey)}/${encodeURIComponent(version)}`
3669
- )
3670
- }
3671
- ),
3672
- /* @__PURE__ */ jsx(RunQueuedBanner, { status: execution.status, context: execution.context }),
3673
- /* @__PURE__ */ jsx(RunDataPrunedNotice, { dataPrunedAt: execution.dataPrunedAt }),
3674
- /* @__PURE__ */ jsx(RunHumanRequests, { requests: humanRequests }),
3675
- /* @__PURE__ */ jsx(
3676
- RunPolicyDecisions,
3677
- {
3678
- decisions: policyDecisions,
3679
- waiting: execution.status === "WAITING",
3680
- onDecide: async (id, approve) => {
3681
- await decidePolicyApproval(id, approve);
3682
- await Promise.all([refetch(), refetchHumanRequests()]);
3648
+ isDurableRun && /* @__PURE__ */ jsx(
3649
+ DurableDeterminismBanner,
3650
+ {
3651
+ status: determinism.status,
3652
+ workflowKey: execution.workflowKey,
3653
+ version: execution.version,
3654
+ canReplaceCode,
3655
+ canTerminate: canTerminateDurable,
3656
+ onOpenSource: () => navigate(
3657
+ `../workflow/${encodeURIComponent(execution.workflowKey)}/${encodeURIComponent(execution.version)}`
3658
+ ),
3659
+ onTerminate: handleTerminateDurable
3683
3660
  }
3684
- }
3685
- ),
3686
- parityRun && hasParityDetails(parityRun, isDurableRun) && /* @__PURE__ */ jsx(
3687
- RunParityPanel,
3688
- {
3689
- run: { ...parityRun, parentRunId: execution.parentRunId },
3690
- open: runCanChange,
3691
- durable: isDurableRun,
3692
- canOverride: canControlRuns,
3693
- onOverride: () => setShowOverrideDialog(true)
3694
- }
3695
- ),
3696
- parityEnabled && runCanChange && /* @__PURE__ */ jsx(
3697
- RunPendingCard,
3698
- {
3699
- pending: runPending.pending,
3700
- loading: runPending.loading,
3701
- error: runPending.error,
3702
- onRefresh: () => void runPending.refetch(),
3703
- onViewChildRun: handleViewChildRun
3704
- }
3705
- ),
3706
- /* @__PURE__ */ jsx("div", { className: "border-b border-border-secondary mb-6", children: /* @__PURE__ */ jsx("nav", { className: "flex gap-4 -mb-px overflow-x-auto", children: tabs.map((tab) => /* @__PURE__ */ jsxs(
3707
- "button",
3708
- {
3709
- onClick: () => setActiveTab(tab.id),
3710
- className: `
3711
- flex shrink-0 items-center gap-2 whitespace-nowrap px-4 py-3 border-b-2 text-sm font-medium transition-colors
3712
- ${activeTab === tab.id ? "border-action-primary-bg text-action-primary-text" : "border-transparent text-text-secondary hover:text-text-primary hover:border-border-primary"}
3713
- `,
3714
- children: [
3715
- /* @__PURE__ */ jsx(Icon, { icon: tab.icon, width: 18 }),
3716
- tab.label
3717
- ]
3718
- },
3719
- tab.id
3720
- )) }) }),
3721
- /* @__PURE__ */ jsxs("div", { className: "bg-background-secondary rounded-lg border border-border-secondary", children: [
3722
- activeTab === "timeline" && /* @__PURE__ */ jsx("div", { className: "p-4 sm:p-6", children: /* @__PURE__ */ jsx(
3723
- NodeTimeline,
3661
+ ),
3662
+ /* @__PURE__ */ jsx(
3663
+ RunAiAssistPanel,
3724
3664
  {
3725
- nodeStates: execution.nodeStates ?? [],
3726
- nodeDisplay,
3727
- triggerNodeId: execution.triggerNodeId ?? void 0,
3728
- onRetryNode: canControlRuns ? handleRetryNode : void 0,
3729
- onViewChildRun: handleViewChildRun,
3730
- onViewAgentTrace: (nodeId) => setActiveTab("agent", nodeId)
3665
+ runId: execution.id,
3666
+ status: execution.status,
3667
+ canPropose: canProposeFix,
3668
+ canApply: canApplyFix,
3669
+ onOpenWorkflow: (workflowKey, version) => navigate(
3670
+ `../workflow/${encodeURIComponent(workflowKey)}/${encodeURIComponent(version)}`
3671
+ )
3731
3672
  }
3732
- ) }),
3733
- activeTab === "agent" && hasAgent && /* @__PURE__ */ jsx("div", { className: "p-4 sm:p-6", children: /* @__PURE__ */ jsx(
3734
- AgentTracePanel,
3673
+ ),
3674
+ /* @__PURE__ */ jsx(
3675
+ RunFailureClusterCard,
3735
3676
  {
3736
- traces: agentTraces,
3737
- nodeDisplay,
3738
- usage: runAiUsage.usage,
3739
- usageLoading: runAiUsage.loading,
3740
- usageError: runAiUsage.error,
3741
- onRefreshUsage: () => void runAiUsage.refetch(),
3742
- focusNodeId: agentFocusNodeId
3677
+ runId: execution.id,
3678
+ status: execution.status,
3679
+ canApply: canApplyFix,
3680
+ onOpenWorkflow: (workflowKey, version) => navigate(
3681
+ `../workflow/${encodeURIComponent(workflowKey)}/${encodeURIComponent(version)}`
3682
+ )
3743
3683
  }
3744
- ) }),
3745
- activeTab === "history" && isDurableRun && /* @__PURE__ */ jsxs("div", { className: "space-y-4 p-4 sm:p-6", children: [
3746
- runCanChange && /* @__PURE__ */ jsx(
3747
- WaitingAtPanel,
3684
+ ),
3685
+ /* @__PURE__ */ jsx(RunQueuedBanner, { status: execution.status, context: execution.context }),
3686
+ /* @__PURE__ */ jsx(RunDataPrunedNotice, { dataPrunedAt: execution.dataPrunedAt }),
3687
+ /* @__PURE__ */ jsx(RunHumanRequests, { requests: humanRequests }),
3688
+ /* @__PURE__ */ jsx(
3689
+ RunPolicyDecisions,
3690
+ {
3691
+ decisions: policyDecisions,
3692
+ waiting: execution.status === "WAITING",
3693
+ onDecide: async (id, approve) => {
3694
+ await decidePolicyApproval(id, approve);
3695
+ await Promise.all([refetch(), refetchHumanRequests()]);
3696
+ }
3697
+ }
3698
+ ),
3699
+ parityRun && hasParityDetails(parityRun, isDurableRun) && /* @__PURE__ */ jsx(
3700
+ RunParityPanel,
3701
+ {
3702
+ run: { ...parityRun, parentRunId: execution.parentRunId },
3703
+ open: runCanChange,
3704
+ durable: isDurableRun,
3705
+ canOverride: canControlRuns,
3706
+ onOverride: () => setShowOverrideDialog(true)
3707
+ }
3708
+ ),
3709
+ parityEnabled && runCanChange && /* @__PURE__ */ jsx(
3710
+ RunPendingCard,
3711
+ {
3712
+ pending: runPending.pending,
3713
+ loading: runPending.loading,
3714
+ error: runPending.error,
3715
+ onRefresh: () => void runPending.refetch(),
3716
+ onViewChildRun: handleViewChildRun
3717
+ }
3718
+ ),
3719
+ /* @__PURE__ */ jsx("div", { className: "border-b border-border-secondary mb-6", children: /* @__PURE__ */ jsx("nav", { className: "flex gap-4 -mb-px overflow-x-auto", children: tabs.map((tab) => /* @__PURE__ */ jsxs(
3720
+ "button",
3721
+ {
3722
+ onClick: () => setActiveTab(tab.id),
3723
+ className: `
3724
+ flex shrink-0 items-center gap-2 whitespace-nowrap px-4 py-3 border-b-2 text-sm font-medium transition-colors
3725
+ ${activeTab === tab.id ? "border-action-primary-bg text-text-primary" : "border-transparent text-text-secondary hover:text-text-primary hover:border-border-primary"}
3726
+ `,
3727
+ children: [
3728
+ /* @__PURE__ */ jsx(Icon, { icon: tab.icon, width: 18 }),
3729
+ tab.label
3730
+ ]
3731
+ },
3732
+ tab.id
3733
+ )) }) }),
3734
+ /* @__PURE__ */ jsxs("div", { className: "bg-background-secondary rounded-lg border border-border-secondary", children: [
3735
+ activeTab === "timeline" && /* @__PURE__ */ jsx("div", { className: "p-4 sm:p-6", children: /* @__PURE__ */ jsx(
3736
+ NodeTimeline,
3748
3737
  {
3749
- trace: waitingAt.trace,
3750
- loading: waitingAt.loading,
3751
- error: waitingAt.error,
3752
- onRefresh: () => void waitingAt.refetch(),
3753
- metadata: parityEnabled ? runMetadata.answer?.metadata : null
3738
+ nodeStates: execution.nodeStates ?? [],
3739
+ nodeDisplay,
3740
+ triggerNodeId: execution.triggerNodeId ?? void 0,
3741
+ onRetryNode: canControlRuns ? handleRetryNode : void 0,
3742
+ onViewChildRun: handleViewChildRun,
3743
+ onViewAgentTrace: (nodeId) => setActiveTab("agent", nodeId)
3754
3744
  }
3755
- ),
3756
- /* @__PURE__ */ jsx(
3757
- RunHistoryView,
3745
+ ) }),
3746
+ activeTab === "agent" && hasAgent && /* @__PURE__ */ jsx("div", { className: "p-4 sm:p-6", children: /* @__PURE__ */ jsx(
3747
+ AgentTracePanel,
3758
3748
  {
3759
- events: runHistory.events,
3760
- loading: runHistory.loading,
3761
- error: runHistory.error,
3749
+ traces: agentTraces,
3750
+ nodeDisplay,
3751
+ usage: runAiUsage.usage,
3752
+ usageLoading: runAiUsage.loading,
3753
+ usageError: runAiUsage.error,
3754
+ onRefreshUsage: () => void runAiUsage.refetch(),
3755
+ focusNodeId: agentFocusNodeId
3756
+ }
3757
+ ) }),
3758
+ activeTab === "history" && isDurableRun && /* @__PURE__ */ jsxs("div", { className: "space-y-4 p-4 sm:p-6", children: [
3759
+ runCanChange && /* @__PURE__ */ jsx(
3760
+ WaitingAtPanel,
3761
+ {
3762
+ trace: waitingAt.trace,
3763
+ loading: waitingAt.loading,
3764
+ error: waitingAt.error,
3765
+ onRefresh: () => void waitingAt.refetch(),
3766
+ metadata: parityEnabled ? runMetadata.answer?.metadata : null
3767
+ }
3768
+ ),
3769
+ /* @__PURE__ */ jsx(
3770
+ RunHistoryView,
3771
+ {
3772
+ events: runHistory.events,
3773
+ loading: runHistory.loading,
3774
+ error: runHistory.error,
3775
+ active: isActive,
3776
+ streaming: runHistory.streaming,
3777
+ truncated: runHistory.truncated,
3778
+ historyLength: runHistory.historyLength,
3779
+ onRefresh: () => void runHistory.refetch(),
3780
+ onViewChildRun: handleViewChildRun,
3781
+ showBenign: parityEnabled
3782
+ }
3783
+ )
3784
+ ] }),
3785
+ activeTab === "logs" && /* @__PURE__ */ jsx("div", { className: "p-4 sm:p-6", children: /* @__PURE__ */ jsx(
3786
+ RunLogViewer,
3787
+ {
3788
+ runId,
3789
+ lines: runLogs.lines,
3790
+ nodeStates: execution.nodeStates ?? [],
3791
+ nodeDisplay,
3792
+ loading: runLogs.loading,
3793
+ error: runLogs.error,
3794
+ hasMore: runLogs.hasMore,
3795
+ limitReached: runLogs.limitReached,
3796
+ streaming: runLogs.streaming,
3762
3797
  active: isActive,
3763
- streaming: runHistory.streaming,
3764
- truncated: runHistory.truncated,
3765
- historyLength: runHistory.historyLength,
3766
- onRefresh: () => void runHistory.refetch(),
3767
- onViewChildRun: handleViewChildRun,
3768
- showBenign: parityEnabled
3798
+ minLevel: minLogLevel,
3799
+ onMinLevelChange: setMinLogLevel,
3800
+ onLoadMore: () => void runLogs.loadMore()
3769
3801
  }
3770
- )
3771
- ] }),
3772
- activeTab === "logs" && /* @__PURE__ */ jsx("div", { className: "p-4 sm:p-6", children: /* @__PURE__ */ jsx(
3773
- RunLogViewer,
3774
- {
3775
- runId,
3776
- lines: runLogs.lines,
3777
- nodeStates: execution.nodeStates ?? [],
3778
- nodeDisplay,
3779
- loading: runLogs.loading,
3780
- error: runLogs.error,
3781
- hasMore: runLogs.hasMore,
3782
- limitReached: runLogs.limitReached,
3783
- streaming: runLogs.streaming,
3784
- active: isActive,
3785
- minLevel: minLogLevel,
3786
- onMinLevelChange: setMinLogLevel,
3787
- onLoadMore: () => void runLogs.loadMore()
3788
- }
3789
- ) }),
3790
- activeTab === "input" && /* @__PURE__ */ jsxs("div", { className: "p-4 sm:p-6", children: [
3791
- /* @__PURE__ */ jsx("h3", { className: "text-lg font-medium text-text-primary mb-4", children: tr(
3792
- "fluidgrids.executions.executionDetail.triggerDataHeading",
3793
- "Trigger Data"
3794
3802
  ) }),
3795
- /* @__PURE__ */ jsx("div", { className: "bg-background-primary rounded p-4 max-h-[400px] overflow-auto", children: /* @__PURE__ */ jsx("pre", { className: "text-sm text-text-primary font-mono whitespace-pre-wrap break-words", children: JSON.stringify(execution.triggerData ?? null, null, 2) }) })
3796
- ] }),
3797
- activeTab === "context" && /* @__PURE__ */ jsx("div", { className: "p-4 sm:p-6", children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-6", children: [
3798
- /* @__PURE__ */ jsxs("div", { children: [
3803
+ activeTab === "input" && /* @__PURE__ */ jsxs("div", { className: "p-4 sm:p-6", children: [
3799
3804
  /* @__PURE__ */ jsx("h3", { className: "text-lg font-medium text-text-primary mb-4", children: tr(
3800
- "fluidgrids.executions.executionDetail.executionContextHeading",
3801
- "Execution Context"
3805
+ "fluidgrids.executions.executionDetail.triggerDataHeading",
3806
+ "Trigger Data"
3802
3807
  ) }),
3803
- /* @__PURE__ */ jsx("div", { className: "bg-background-primary rounded p-4 max-h-[300px] overflow-auto", children: /* @__PURE__ */ jsx("pre", { className: "text-sm text-text-primary font-mono whitespace-pre-wrap break-words", children: JSON.stringify(execution.context ?? null, null, 2) }) })
3808
+ /* @__PURE__ */ jsx("div", { className: "bg-background-primary rounded p-4 max-h-[400px] overflow-auto", children: /* @__PURE__ */ jsx("pre", { className: "text-sm text-text-primary font-mono whitespace-pre-wrap break-words", children: JSON.stringify(execution.triggerData ?? null, null, 2) }) })
3804
3809
  ] }),
3805
- /* @__PURE__ */ jsxs("div", { children: [
3806
- /* @__PURE__ */ jsx("h3", { className: "text-lg font-medium text-text-primary mb-4", children: tr(
3807
- "fluidgrids.executions.executionDetail.executionDetailsHeading",
3808
- "Execution Details"
3809
- ) }),
3810
- /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
3811
- /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
3812
- /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3813
- "fluidgrids.executions.executionDetail.runIdRow",
3814
- "Run ID"
3815
- ) }),
3816
- /* @__PURE__ */ jsx("code", { className: "font-mono text-text-primary", children: execution.id })
3817
- ] }),
3818
- /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
3819
- /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3820
- "fluidgrids.executions.executionDetail.workflowRow",
3821
- "Workflow"
3822
- ) }),
3823
- /* @__PURE__ */ jsx("span", { className: "text-text-primary", children: execution.workflow?.name || execution.workflowKey })
3824
- ] }),
3825
- /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
3826
- /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3827
- "fluidgrids.executions.executionDetail.workflowKeyRow",
3828
- "Workflow Key"
3829
- ) }),
3830
- /* @__PURE__ */ jsx("code", { className: "font-mono text-text-primary", children: execution.workflowKey })
3831
- ] }),
3832
- /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
3833
- /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3834
- "fluidgrids.executions.executionDetail.versionRow",
3835
- "Version"
3836
- ) }),
3837
- /* @__PURE__ */ jsx("span", { className: "text-text-primary", children: formatRunVersion(execution.version) })
3838
- ] }),
3839
- isDurableRun && /* @__PURE__ */ jsxs(Fragment, { children: [
3810
+ activeTab === "context" && /* @__PURE__ */ jsx("div", { className: "p-4 sm:p-6", children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-6", children: [
3811
+ /* @__PURE__ */ jsxs("div", { children: [
3812
+ /* @__PURE__ */ jsx("h3", { className: "text-lg font-medium text-text-primary mb-4", children: tr(
3813
+ "fluidgrids.executions.executionDetail.executionContextHeading",
3814
+ "Execution Context"
3815
+ ) }),
3816
+ /* @__PURE__ */ jsx("div", { className: "bg-background-primary rounded p-4 max-h-[300px] overflow-auto", children: /* @__PURE__ */ jsx("pre", { className: "text-sm text-text-primary font-mono whitespace-pre-wrap break-words", children: JSON.stringify(execution.context ?? null, null, 2) }) })
3817
+ ] }),
3818
+ /* @__PURE__ */ jsxs("div", { children: [
3819
+ /* @__PURE__ */ jsx("h3", { className: "text-lg font-medium text-text-primary mb-4", children: tr(
3820
+ "fluidgrids.executions.executionDetail.executionDetailsHeading",
3821
+ "Execution Details"
3822
+ ) }),
3823
+ /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
3824
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
3825
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3826
+ "fluidgrids.executions.executionDetail.runIdRow",
3827
+ "Run ID"
3828
+ ) }),
3829
+ /* @__PURE__ */ jsx("code", { className: "font-mono text-text-primary", children: execution.id })
3830
+ ] }),
3840
3831
  /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
3841
3832
  /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3842
- "fluidgrids.executions.executionDetail.workflowFnRow",
3843
- "Function"
3833
+ "fluidgrids.executions.executionDetail.workflowRow",
3834
+ "Workflow"
3844
3835
  ) }),
3845
- /* @__PURE__ */ jsx("code", { className: "font-mono text-text-primary", children: execution.workflowFn ?? "\u2014" })
3836
+ /* @__PURE__ */ jsx("span", { className: "text-text-primary", children: execution.workflow?.name || execution.workflowKey })
3846
3837
  ] }),
3847
3838
  /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
3848
3839
  /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3849
- "fluidgrids.executions.executionDetail.taskQueueRow",
3850
- "Task queue"
3840
+ "fluidgrids.executions.executionDetail.workflowKeyRow",
3841
+ "Workflow Key"
3851
3842
  ) }),
3852
- /* @__PURE__ */ jsx("span", { className: "text-text-primary", children: execution.taskQueue ?? "\u2014" })
3843
+ /* @__PURE__ */ jsx("code", { className: "font-mono text-text-primary", children: execution.workflowKey })
3853
3844
  ] }),
3854
- /* @__PURE__ */ jsxs("div", { className: "flex justify-between gap-4 py-2 border-b border-border-secondary", children: [
3845
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
3855
3846
  /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3856
- "fluidgrids.executions.executionDetail.buildIdRow",
3857
- "Build"
3847
+ "fluidgrids.executions.executionDetail.versionRow",
3848
+ "Version"
3849
+ ) }),
3850
+ /* @__PURE__ */ jsx("span", { className: "text-text-primary", children: formatRunVersion(execution.version) })
3851
+ ] }),
3852
+ isDurableRun && /* @__PURE__ */ jsxs(Fragment, { children: [
3853
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
3854
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3855
+ "fluidgrids.executions.executionDetail.workflowFnRow",
3856
+ "Function"
3857
+ ) }),
3858
+ /* @__PURE__ */ jsx("code", { className: "font-mono text-text-primary", children: execution.workflowFn ?? "\u2014" })
3859
+ ] }),
3860
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
3861
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3862
+ "fluidgrids.executions.executionDetail.taskQueueRow",
3863
+ "Task queue"
3864
+ ) }),
3865
+ /* @__PURE__ */ jsx("span", { className: "text-text-primary", children: execution.taskQueue ?? "\u2014" })
3866
+ ] }),
3867
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between gap-4 py-2 border-b border-border-secondary", children: [
3868
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3869
+ "fluidgrids.executions.executionDetail.buildIdRow",
3870
+ "Build"
3871
+ ) }),
3872
+ /* @__PURE__ */ jsx(
3873
+ "code",
3874
+ {
3875
+ className: "truncate font-mono text-text-primary",
3876
+ title: execution.buildId ?? void 0,
3877
+ children: execution.buildId ?? "\u2014"
3878
+ }
3879
+ )
3880
+ ] }),
3881
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
3882
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3883
+ "fluidgrids.executions.executionDetail.historyLengthRow",
3884
+ "History events"
3885
+ ) }),
3886
+ /* @__PURE__ */ jsx("span", { className: "text-text-primary", children: execution.historyLength ?? 0 })
3887
+ ] })
3888
+ ] }),
3889
+ execution.triggeredById && /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
3890
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3891
+ "fluidgrids.executions.executionDetail.triggeredByRow",
3892
+ "Triggered By"
3858
3893
  ) }),
3859
3894
  /* @__PURE__ */ jsx(
3860
- "code",
3895
+ "span",
3861
3896
  {
3862
- className: "truncate font-mono text-text-primary",
3863
- title: execution.buildId ?? void 0,
3864
- children: execution.buildId ?? "\u2014"
3897
+ className: "text-text-primary",
3898
+ title: execution.triggeredById,
3899
+ children: triggeredByLabel
3900
+ }
3901
+ )
3902
+ ] }),
3903
+ execution.parentRunId && /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
3904
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3905
+ "fluidgrids.executions.executionDetail.parentRunRow",
3906
+ "Parent Run"
3907
+ ) }),
3908
+ /* @__PURE__ */ jsxs(
3909
+ Link,
3910
+ {
3911
+ to: `/runs/${execution.parentRunId}`,
3912
+ className: "text-text-link hover:text-text-linkHover hover:underline font-mono",
3913
+ children: [
3914
+ execution.parentRunId.slice(0, 12),
3915
+ "..."
3916
+ ]
3865
3917
  }
3866
3918
  )
3867
3919
  ] }),
3868
3920
  /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
3869
3921
  /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3870
- "fluidgrids.executions.executionDetail.historyLengthRow",
3871
- "History events"
3922
+ "fluidgrids.executions.executionDetail.createdRow",
3923
+ "Created"
3872
3924
  ) }),
3873
- /* @__PURE__ */ jsx("span", { className: "text-text-primary", children: execution.historyLength ?? 0 })
3925
+ /* @__PURE__ */ jsx("span", { className: "text-text-primary", children: formatDateTime2(execution.createdAt) })
3926
+ ] }),
3927
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
3928
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3929
+ "fluidgrids.executions.executionDetail.startedRow",
3930
+ "Started"
3931
+ ) }),
3932
+ /* @__PURE__ */ jsx("span", { className: "text-text-primary", children: formatDateTime2(execution.startedAt) })
3933
+ ] }),
3934
+ execution.completedAt && /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
3935
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3936
+ "fluidgrids.executions.executionDetail.completedRow",
3937
+ "Completed"
3938
+ ) }),
3939
+ /* @__PURE__ */ jsx("span", { className: "text-text-primary", children: formatDateTime2(execution.completedAt) })
3874
3940
  ] })
3875
- ] }),
3876
- execution.triggeredById && /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
3877
- /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3878
- "fluidgrids.executions.executionDetail.triggeredByRow",
3879
- "Triggered By"
3941
+ ] })
3942
+ ] })
3943
+ ] }) })
3944
+ ] }),
3945
+ (canSendSignal || showSignalDialog) && /* @__PURE__ */ jsx(
3946
+ SignalRunDialog,
3947
+ {
3948
+ runId: execution.id,
3949
+ targets: signalTargets,
3950
+ open: showSignalDialog,
3951
+ onOpenChange: setShowSignalDialog,
3952
+ onSent: () => {
3953
+ void refetch();
3954
+ if (isDurableRun) void runHistory.refetch();
3955
+ }
3956
+ }
3957
+ ),
3958
+ showOverrideDialog && parityRun && /* @__PURE__ */ jsx(
3959
+ RunVersioningOverrideDialogHost,
3960
+ {
3961
+ workflowKey: execution.workflowKey,
3962
+ runId: execution.id,
3963
+ current: parityRun.versioning ?? null,
3964
+ onOpenChange: setShowOverrideDialog,
3965
+ onChanged: () => void refetch()
3966
+ }
3967
+ ),
3968
+ /* @__PURE__ */ jsx(
3969
+ AlertDialog,
3970
+ {
3971
+ open: showTerminateDialog,
3972
+ onOpenChange: setShowTerminateDialog,
3973
+ children: /* @__PURE__ */ jsxs(AlertDialogContent, { children: [
3974
+ /* @__PURE__ */ jsxs(AlertDialogHeader, { children: [
3975
+ /* @__PURE__ */ jsx(AlertDialogTitle, { children: tr(
3976
+ "fluidgrids.executions.executionDetail.terminateDialogTitle",
3977
+ "Terminate Execution"
3880
3978
  ) }),
3881
- /* @__PURE__ */ jsx(
3882
- "span",
3883
- {
3884
- className: "text-text-primary",
3885
- title: execution.triggeredById,
3886
- children: triggeredByLabel
3887
- }
3888
- )
3979
+ /* @__PURE__ */ jsx(AlertDialogDescription, { children: tr(
3980
+ "fluidgrids.executions.executionDetail.terminateDialogDescription",
3981
+ "Are you sure you want to force terminate this execution? This will immediately stop the running workflow and cannot be resumed."
3982
+ ) })
3889
3983
  ] }),
3890
- execution.parentRunId && /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
3891
- /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3892
- "fluidgrids.executions.executionDetail.parentRunRow",
3893
- "Parent Run"
3984
+ /* @__PURE__ */ jsxs(AlertDialogFooter, { children: [
3985
+ /* @__PURE__ */ jsx(AlertDialogCancel, { disabled: actionLoading, children: tr(
3986
+ "fluidgrids.executions.executionDetail.cancelButton",
3987
+ "Cancel"
3894
3988
  ) }),
3895
- /* @__PURE__ */ jsxs(
3896
- Link,
3989
+ /* @__PURE__ */ jsx(
3990
+ AlertDialogAction,
3897
3991
  {
3898
- to: `/runs/${execution.parentRunId}`,
3899
- className: "text-action-primary-text hover:underline font-mono",
3900
- children: [
3901
- execution.parentRunId.slice(0, 12),
3902
- "..."
3903
- ]
3992
+ onClick: handleTerminate,
3993
+ disabled: actionLoading,
3994
+ className: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
3995
+ children: actionLoading ? tr(
3996
+ "fluidgrids.executions.executionDetail.terminatingButton",
3997
+ "Terminating..."
3998
+ ) : tr(
3999
+ "fluidgrids.executions.executionDetail.terminateButton",
4000
+ "Terminate"
4001
+ )
3904
4002
  }
3905
4003
  )
3906
- ] }),
3907
- /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
3908
- /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3909
- "fluidgrids.executions.executionDetail.createdRow",
3910
- "Created"
3911
- ) }),
3912
- /* @__PURE__ */ jsx("span", { className: "text-text-primary", children: formatDateTime2(execution.createdAt) })
3913
- ] }),
3914
- /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
3915
- /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3916
- "fluidgrids.executions.executionDetail.startedRow",
3917
- "Started"
3918
- ) }),
3919
- /* @__PURE__ */ jsx("span", { className: "text-text-primary", children: formatDateTime2(execution.startedAt) })
3920
- ] }),
3921
- execution.completedAt && /* @__PURE__ */ jsxs("div", { className: "flex justify-between py-2 border-b border-border-secondary", children: [
3922
- /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr(
3923
- "fluidgrids.executions.executionDetail.completedRow",
3924
- "Completed"
3925
- ) }),
3926
- /* @__PURE__ */ jsx("span", { className: "text-text-primary", children: formatDateTime2(execution.completedAt) })
3927
4004
  ] })
3928
4005
  ] })
3929
- ] })
3930
- ] }) })
3931
- ] }),
3932
- (canSendSignal || showSignalDialog) && /* @__PURE__ */ jsx(
3933
- SignalRunDialog,
3934
- {
3935
- runId: execution.id,
3936
- targets: signalTargets,
3937
- open: showSignalDialog,
3938
- onOpenChange: setShowSignalDialog,
3939
- onSent: () => {
3940
- void refetch();
3941
- if (isDurableRun) void runHistory.refetch();
3942
4006
  }
3943
- }
3944
- ),
3945
- showOverrideDialog && parityRun && /* @__PURE__ */ jsx(
3946
- RunVersioningOverrideDialogHost,
3947
- {
3948
- workflowKey: execution.workflowKey,
3949
- runId: execution.id,
3950
- current: parityRun.versioning ?? null,
3951
- onOpenChange: setShowOverrideDialog,
3952
- onChanged: () => void refetch()
3953
- }
3954
- ),
3955
- /* @__PURE__ */ jsx(
3956
- AlertDialog,
3957
- {
3958
- open: showTerminateDialog,
3959
- onOpenChange: setShowTerminateDialog,
3960
- children: /* @__PURE__ */ jsxs(AlertDialogContent, { children: [
3961
- /* @__PURE__ */ jsxs(AlertDialogHeader, { children: [
3962
- /* @__PURE__ */ jsx(AlertDialogTitle, { children: tr(
3963
- "fluidgrids.executions.executionDetail.terminateDialogTitle",
3964
- "Terminate Execution"
3965
- ) }),
3966
- /* @__PURE__ */ jsx(AlertDialogDescription, { children: tr(
3967
- "fluidgrids.executions.executionDetail.terminateDialogDescription",
3968
- "Are you sure you want to force terminate this execution? This will immediately stop the running workflow and cannot be resumed."
3969
- ) })
3970
- ] }),
3971
- /* @__PURE__ */ jsxs(AlertDialogFooter, { children: [
3972
- /* @__PURE__ */ jsx(AlertDialogCancel, { disabled: actionLoading, children: tr(
3973
- "fluidgrids.executions.executionDetail.cancelButton",
3974
- "Cancel"
3975
- ) }),
3976
- /* @__PURE__ */ jsx(
3977
- AlertDialogAction,
3978
- {
3979
- onClick: handleTerminate,
3980
- disabled: actionLoading,
3981
- className: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
3982
- children: actionLoading ? tr(
3983
- "fluidgrids.executions.executionDetail.terminatingButton",
3984
- "Terminating..."
3985
- ) : tr(
3986
- "fluidgrids.executions.executionDetail.terminateButton",
3987
- "Terminate"
3988
- )
3989
- }
3990
- )
3991
- ] })
3992
- ] })
3993
- }
3994
- )
3995
- ] });
4007
+ )
4008
+ ] })
4009
+ );
3996
4010
  }
3997
4011
 
3998
4012
  export { ExecutionDetailPage, HumanRequestCard, RunHumanRequests, usePendingHumanRequests, useRespondToHumanRequest, useRunHumanRequests };