@burdenoff/fluidgrids-fe-sdk 2026.1112.3 → 2026.1112.5

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 (78) hide show
  1. package/dist/{AiStudioPage-C-jio5Bz.js → AiStudioPage-BNmXx6LB.js} +10 -10
  2. package/dist/{ApprovalInboxPage-D8vhnloO.js → ApprovalInboxPage-QAJim81n.js} +3 -2
  3. package/dist/{DataSinkDashboardPage-CRBsNjoS.js → DataSinkDashboardPage-kyzcjpzL.js} +4 -4
  4. package/dist/{DataTablesPage-DoVBkb_T.js → DataTablesPage-Dm-dzVPD.js} +4 -4
  5. package/dist/{EntityTagPicker-Dk3CufFt.js → EntityTagPicker-dxfzv8aO.js} +1 -1
  6. package/dist/{ExecutionDetailPage-Cw4zyaIG.js → ExecutionDetailPage-B9eEep77.js} +977 -509
  7. package/dist/{ExecutionsListPage-BgeqwVr2.js → ExecutionsListPage-DuuPSVEj.js} +831 -146
  8. package/dist/{FailureTriagePanel-BzD4UJU5.js → FailureTriagePanel-D4lJ4zqQ.js} +1 -1
  9. package/dist/{FluidGridsProvider-BFfTxl9m.js → FluidGridsProvider-B1hgCbxG.js} +7 -7
  10. package/dist/{HistoryPage-BdijEOHp.js → HistoryPage-C7NwkVNC.js} +202 -36
  11. package/dist/{HumanRequestCard-mOhr-Ic9.js → HumanRequestCard-lbWDpWd7.js} +4 -216
  12. package/dist/{InsightsPage-2jnYlozA.js → InsightsPage-D9B_qW8e.js} +10 -10
  13. package/dist/{MissingNodesInstallModal-C0wPwR0Q.js → MissingNodesInstallModal-BkkgeFeN.js} +1 -1
  14. package/dist/NavigationV2Provider-DCDt35eG.js +17 -0
  15. package/dist/{NodesPage-Dhg5Q2R5.js → NodesPage-BEeUbIts.js} +4 -4
  16. package/dist/{QuotaExhaustedDialog-BKZ9moP8.js → QuotaExhaustedDialog-Bj7AG_0y.js} +1 -1
  17. package/dist/{RunnersPage-CLCOCclc.js → RunnersPage-D9Bgod_d.js} +4 -4
  18. package/dist/{SettingsPage-BaM98QU_.js → SettingsPage-k21044-Z.js} +16 -16
  19. package/dist/{TagFilterSelect-VC6JMK3F.js → TagFilterSelect-CqhxcDjh.js} +1 -1
  20. package/dist/{TaskQueuesPage-C3R5ZoKs.js → TaskQueuesPage-B86p51gH.js} +2 -2
  21. package/dist/{TemplateCard-DYDVNYo6.js → TemplateCard-DanOe65C.js} +3 -3
  22. package/dist/{TemplateConfigurationModal-BzdkGWim.js → TemplateConfigurationModal-CeMpPEhT.js} +3 -3
  23. package/dist/{TemplateDetailPanel-s4EqQhra.js → TemplateDetailPanel-DnoA6mC3.js} +2 -2
  24. package/dist/{TemplatePreview-B_-zS_Mm.js → TemplatePreview-CBwvi0ga.js} +4 -4
  25. package/dist/{TemplatesPage-OIMd6cIl.js → TemplatesPage-C7f2xq12.js} +14 -14
  26. package/dist/{VariablesPage-67WR_lVE.js → VariablesPage-BtoLjmUA.js} +1 -1
  27. package/dist/{VersionDiffDialog-Cp2doV3f.js → VersionDiffDialog-pLpG_I1r.js} +4 -4
  28. package/dist/{WorkflowBuilder-B2tIOPi0.js → WorkflowBuilder-DDgWgnwH.js} +7 -7
  29. package/dist/{WorkflowBuilder-DD4UIAjC.js → WorkflowBuilder-DmYS5JEY.js} +12 -12
  30. package/dist/{WorkflowProposalCard-U31u1qcw.js → WorkflowProposalCard-BjYAZH3q.js} +1 -1
  31. package/dist/{WorkflowSearchRedirect-BhXzWDj7.js → WorkflowSearchRedirect-iPQBL6WO.js} +1 -1
  32. package/dist/{WorkflowShareDialog-Dv46nAyh.js → WorkflowShareDialog-DB-qJLB2.js} +1 -1
  33. package/dist/{WorkflowsList-BV-2J_gG.js → WorkflowsList-rOxlI49U.js} +13 -13
  34. package/dist/{agentTools-EVdEThES.js → agentTools-B4Gjf8R7.js} +4 -4
  35. package/dist/{api-DwaHAJtA.js → api-Dvitj1aT.js} +1 -1
  36. package/dist/{api-C8WmUejq.js → api-JpNuowX4.js} +1 -1
  37. package/dist/{canvasNoteTools-C5Vf0pxu.js → canvasNoteTools-Bve4Fo7R.js} +3 -3
  38. package/dist/{code-editor-field-o7qp9eTq.js → code-editor-field-yJZEDJBi.js} +2 -2
  39. package/dist/{constants-B2lhWNoN.js → constants-dcxg6zG6.js} +2 -2
  40. package/dist/{definition-canvas-F8DGty5m.js → definition-canvas-Bshn_dSP.js} +1 -1
  41. package/dist/executions.js +2 -2
  42. package/dist/{flow-builder-Dn4PCWuf.js → flow-builder-BPe5YNF6.js} +48 -48
  43. package/dist/{graphql-operation-types-BdU65FNm.js → graphql-operation-types-z2oXfQvM.js} +10 -1
  44. package/dist/history.js +1 -1
  45. package/dist/{index-DbTgk7dK.d.ts → index-u-kM0seP.d.ts} +3 -2
  46. package/dist/index.d.ts +1 -1
  47. package/dist/index.js +43 -41
  48. package/dist/navigation-v2.js +2 -1
  49. package/dist/{node-detail-view-kWiwJEKr.js → node-detail-view-oAotM2EI.js} +18 -18
  50. package/dist/{node-editor-tab-body-C71Y0fRJ.js → node-editor-tab-body-DIcmar84.js} +6 -6
  51. package/dist/{node-endpoint-configs-BrzQMy10.js → node-endpoint-configs-typvqw2c.js} +1 -1
  52. package/dist/{node-operation-selection-icAhaNza.js → node-operation-selection-DAbS6jSY.js} +4 -4
  53. package/dist/nodes.js +1 -1
  54. package/dist/observability.d.ts +1 -1
  55. package/dist/observability.js +2 -2
  56. package/dist/{popover-v7g8TWmm.js → popover-DOeSGQOG.js} +3 -3
  57. package/dist/{quick-config-panel-C84vsDYD.js → quick-config-panel-Pm5nkZVr.js} +6 -6
  58. package/dist/{schedule-panel-BrNKy9DY.js → schedule-panel-Dizqz9eA.js} +29 -29
  59. package/dist/settings.js +1 -1
  60. package/dist/{sidebar-node-editor-D-2lPHwq.js → sidebar-node-editor-BNub2vUq.js} +4 -4
  61. package/dist/templates.js +2 -2
  62. package/dist/{useAgentDefinitions-DSU8Eek4.js → useAgentDefinitions-Uy6nhpKN.js} +1 -1
  63. package/dist/{useDurableParity-fFmfa97r.js → useDurableParity-Cb9nOdE8.js} +191 -4
  64. package/dist/{useEntityTags-C8rPBi6W.js → useEntityTags-D5C0tdLs.js} +1 -1
  65. package/dist/{useExecutions-DNGW4yxG.js → useExecutions-DJXtbA15.js} +59 -48
  66. package/dist/useHumanRequests-ZiR0sSzS.js +218 -0
  67. package/dist/{NavigationV2Provider-D4kj0Gjt.js → useNavigationV2-C2WeqN7d.js} +1 -14
  68. package/dist/{useObservability-u-MZCWUV.js → useObservability-Dfgh4yjv.js} +1 -1
  69. package/dist/{useRunHistory-x9bVUB9T.js → useRunHistory-BZQ3t68Q.js} +2 -2
  70. package/dist/{useWorkflowCodeExport-CV3SZeKm.js → useWorkflowCodeExport-D0zapXXm.js} +2 -2
  71. package/dist/{useWorkflows-CVb5zXKt.js → useWorkflows-CP-d3ygY.js} +2 -2
  72. package/dist/workflow-builder.js +5 -5
  73. package/dist/workflow-host.js +1 -1
  74. package/dist/workflow-pages.d.ts +1 -1
  75. package/dist/workflow-pages.js +19 -19
  76. package/dist/workflow-preview.js +4 -4
  77. package/dist/workflows-list.js +1 -1
  78. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
3
3
  import { _ as throwIfResultError, n as getFluidGridsClient } from "./client-C9XSzSXr.js";
4
- import { An as SetRunFailureTriageEnabledDocument, _n as RunFailureClustersDocument, et as DismissRunFailureClusterDocument, gt as FgTriageFailedRunsDocument, vn as RunFailureTriageSettingsDocument } from "./graphql-operation-types-BdU65FNm.js";
4
+ import { An as SetRunFailureTriageEnabledDocument, _n as RunFailureClustersDocument, et as DismissRunFailureClusterDocument, gt as FgTriageFailedRunsDocument, vn as RunFailureTriageSettingsDocument } from "./graphql-operation-types-z2oXfQvM.js";
5
5
  import { qD as RunFailureClusterStatus } from "./graphql-types-v6CTGwA0.js";
6
6
  import { useCallback, useEffect, useState } from "react";
7
7
  import { Icon } from "@iconify/react";
@@ -2,14 +2,14 @@
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
3
  import { C as resetFluidGridsConfig, E as validateTrustedOrigin, T as setFluidGridsConfig, _ as throwIfResultError, a as resetFluidGridsClient, d as emitFluidGridsEvent, f as emitOperationErrorEvent, m as describeOperationError, n as getFluidGridsClient, o as setFluidGridsClient, p as emitRunCompletedOnce, r as getFluidGridsClientSafe, s as waitForFluidGridsClient, t as createFluidGridsClient, w as resetFluidGridsExecutionState, x as getFluidGridsConfig } from "./client-C9XSzSXr.js";
4
4
  import { i as getGlobalStoreClient, o as resetGlobalStoreClient, r as createGlobalStoreClient, s as setGlobalStoreClient, t as provideNodeRegistryRefresh } from "./node-registry-refresh-Dy0uRg9f.js";
5
- import { A as nodeAccent, C as nodeAdaptersOf, D as NodeCard, E as resolveOutputHandles, H as useFlowStore, I as partitionStickyNotes, L as resolveStickyColor, N as DEFAULT_STICKY_COLOR, O as NodeCardBody, P as STICKY_COLORS, R as stickySurfaceStyle, T as resolveInputHandles, V as STICKY_NOTE_TYPE, W as isNodeTrigger, _ as LogicNodeCard, b as alignPlainOutputEdges, i as WAIT_FOR_SIGNAL_NODE_TYPE, j as NodeTypeIcon, k as NodeCardHeader, l as interfaceFields, m as readSignalName, n as synchronizeOperationUpdate, p as readCodeWorkflowState, r as CODE_WORKFLOW_NODE_TYPE, t as resolveOperationName, u as interfaceHandlers, v as InputHandles, w as outputHandlesSpacerHeight, x as hasNodeManifest, y as OutputHandles } from "./node-operation-selection-icAhaNza.js";
5
+ import { A as nodeAccent, C as nodeAdaptersOf, D as NodeCard, E as resolveOutputHandles, H as useFlowStore, I as partitionStickyNotes, L as resolveStickyColor, N as DEFAULT_STICKY_COLOR, O as NodeCardBody, P as STICKY_COLORS, R as stickySurfaceStyle, T as resolveInputHandles, V as STICKY_NOTE_TYPE, W as isNodeTrigger, _ as LogicNodeCard, b as alignPlainOutputEdges, i as WAIT_FOR_SIGNAL_NODE_TYPE, j as NodeTypeIcon, k as NodeCardHeader, l as interfaceFields, m as readSignalName, n as synchronizeOperationUpdate, p as readCodeWorkflowState, r as CODE_WORKFLOW_NODE_TYPE, t as resolveOperationName, u as interfaceHandlers, v as InputHandles, w as outputHandlesSpacerHeight, x as hasNodeManifest, y as OutputHandles } from "./node-operation-selection-DAbS6jSY.js";
6
6
  import { n as FluidGridsTranslationProvider, r as useTr, t as ENGLISH_FALLBACK_TRANSLATOR } from "./TranslationBridge-Da-TPgQm.js";
7
7
  import { s as useDurableFunctionNodesEnabled } from "./feature-flags-DM5myWaD.js";
8
- import { Dn as SaveWorkflowDraftDocument, M as CreateWorkflowDefinitionDocument, Mt as NodePaletteEntriesDocument, Or as WorkflowDefinitionDocument, Yn as TriggerWorkflowDocument, ct as ExecutionDetailDocument, h as BuilderRunStatusDocument, jt as NodeManifestsDocument, m as BuilderRunNodeDetailsDocument, ot as EventRegistrationsDocument, st as ExecuteStepDocument, yn as RunFromNodeDocument, z as CreateWorkflowVersionDocument } from "./graphql-operation-types-BdU65FNm.js";
8
+ import { Dn as SaveWorkflowDraftDocument, M as CreateWorkflowDefinitionDocument, Mt as NodePaletteEntriesDocument, Or as WorkflowDefinitionDocument, Yn as TriggerWorkflowDocument, ct as ExecutionDetailDocument, h as BuilderRunStatusDocument, jt as NodeManifestsDocument, m as BuilderRunNodeDetailsDocument, ot as EventRegistrationsDocument, st as ExecuteStepDocument, yn as RunFromNodeDocument, z as CreateWorkflowVersionDocument } from "./graphql-operation-types-z2oXfQvM.js";
9
9
  import { a as collectExtensions, n as QUOTA_EXHAUSTED_CODE, o as errorCodesOf, r as RUNS_QUOTA_NAME, s as findQuotaRefusal } from "./quota-Cdt8yz7N.js";
10
10
  import { i as emitRunStarted, n as emitRunFailed, r as emitRunLimitHit, s as emitWorkflowCreated } from "./fluidgridsEvents-Dm5CaHtr.js";
11
11
  import { n as useFgAskable } from "./askAboutBridge-BV8m95kk.js";
12
- import { t as fetchAllNodeEndpointConfigs } from "./node-endpoint-configs-BrzQMy10.js";
12
+ import { t as fetchAllNodeEndpointConfigs } from "./node-endpoint-configs-typvqw2c.js";
13
13
  import { createContext, memo, useCallback, useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
14
14
  import { useNavigate, useParams } from "react-router";
15
15
  import { ApolloProvider } from "@apollo/client/react";
@@ -19,7 +19,7 @@ import { Icon } from "@iconify/react";
19
19
  import { nanoid } from "nanoid";
20
20
  import { cn } from "@burdenoff/fe-libs/utils";
21
21
  import { nanoid as nanoid$1 } from "nanoid/non-secure";
22
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
22
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
23
23
  import { toast } from "sonner";
24
24
  import { nodeCategoryColor } from "@burdenoff/fe-libs/shared/utils";
25
25
  import { gql } from "@apollo/client";
@@ -261,7 +261,7 @@ function StickyNoteNodeComponent({ id, selected, data }) {
261
261
  className: cn("nodrag size-4 rounded-full border transition-transform hover:scale-125", name === colorKey ? "border-foreground" : "border-transparent"),
262
262
  style: { backgroundColor: color }
263
263
  }, name))
264
- }) : /* @__PURE__ */ jsxs(Fragment, { children: [
264
+ }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
265
265
  /* @__PURE__ */ jsx(ToolbarButton, {
266
266
  title: tr("fluidgrids.builder.stickyNote.editNoteTooltip", "Edit note"),
267
267
  onClick: startEditing,
@@ -5806,7 +5806,7 @@ function useRunGuard(startRun, options = {}) {
5806
5806
  stepNodeId
5807
5807
  ]),
5808
5808
  preparing,
5809
- dialog: /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(UnsavedRunDialog, {
5809
+ dialog: /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(UnsavedRunDialog, {
5810
5810
  open: confirmOpen,
5811
5811
  onOpenChange: setConfirmOpen,
5812
5812
  onRunSaved: () => {
@@ -6409,7 +6409,7 @@ function AdapterPort({ nodeId, adapter, index, total }) {
6409
6409
  })
6410
6410
  ]
6411
6411
  }),
6412
- pickerOpen && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
6412
+ pickerOpen && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("div", {
6413
6413
  className: "fixed inset-0 z-40",
6414
6414
  onClick: () => setPickerOpen(false)
6415
6415
  }), /* @__PURE__ */ jsxs("div", {
@@ -1,13 +1,14 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
- import { d as useRestoreWorkflowVersion, h as useWorkflowDefinitions } from "./useWorkflows-CVb5zXKt.js";
4
- import { i as versionsOfWorkflow, t as VersionDiffDialog } from "./VersionDiffDialog-Cp2doV3f.js";
3
+ import { d as useRestoreWorkflowVersion, h as useWorkflowDefinitions } from "./useWorkflows-CP-d3ygY.js";
4
+ import { i as versionsOfWorkflow, t as VersionDiffDialog } from "./VersionDiffDialog-pLpG_I1r.js";
5
5
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
6
6
  import { x as getFluidGridsConfig } from "./client-C9XSzSXr.js";
7
7
  import { n as useFluidGridsPageControls } from "./pageControlsBridge-0pX9s-3k.js";
8
8
  import { n as historyControls } from "./pageControlSpecs-DZJ9K37m.js";
9
9
  import { t as FluidGridsDocsLink } from "./FluidGridsDocsLink-JxkBpOeb.js";
10
- import { useCallback, useMemo, useState } from "react";
10
+ import { n as useNavigationV2 } from "./useNavigationV2-C2WeqN7d.js";
11
+ import { useCallback, useEffect, useId, useMemo, useState } from "react";
11
12
  import { useNavigate } from "react-router";
12
13
  import { Icon } from "@iconify/react";
13
14
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -16,6 +17,41 @@ import { Badge, Input, Select, SelectContent, SelectItem, SelectTrigger, SelectV
16
17
  import { Button as Button$1 } from "@burdenoff/fe-libs/button";
17
18
  import { buildActorFallback, useActorProfiles } from "@burdenoff/fe-libs/shared";
18
19
 
20
+ // src/modules/history/components/TechnicalDetails.tsx
21
+ /**
22
+ * TechnicalDetails: a small "Show technical details" disclosure for the raw
23
+ * text a person does not need first (an error message, an id).
24
+ *
25
+ * LOCAL PLACEHOLDER for the shared "Show technical details" piece that
26
+ * BOFF-11841 builds in fe-libs. The props are deliberately the ones that piece
27
+ * is expected to take (`label`, `hideLabel`, `children`), so it can be swapped
28
+ * for it without touching the call sites.
29
+ */
30
+ function TechnicalDetails({ label, hideLabel, children, className }) {
31
+ const [open, setOpen] = useState(false);
32
+ const panelId = useId();
33
+ return /* @__PURE__ */ jsxs("div", {
34
+ className,
35
+ "data-testid": "fluidgrids-technical-details",
36
+ children: [/* @__PURE__ */ jsxs("button", {
37
+ type: "button",
38
+ "aria-expanded": open,
39
+ "aria-controls": panelId,
40
+ onClick: () => setOpen((value) => !value),
41
+ className: "inline-flex items-center gap-1 text-xs text-text-secondary hover:text-text-primary underline-offset-2 hover:underline",
42
+ children: [/* @__PURE__ */ jsx(Icon, {
43
+ icon: open ? "mdi:chevron-down" : "mdi:chevron-right",
44
+ width: 14
45
+ }), open ? hideLabel : label]
46
+ }), /* @__PURE__ */ jsx("div", {
47
+ id: panelId,
48
+ hidden: !open,
49
+ className: "mt-1 text-xs break-words",
50
+ children
51
+ })]
52
+ });
53
+ }
54
+
19
55
  // src/modules/history/pages/HistoryPage.tsx
20
56
  /**
21
57
  * HistoryPage — cross-workflow version history.
@@ -29,9 +65,26 @@ var HistoryPage_exports = /* @__PURE__ */ __exportAll({ HistoryPage: () => Histo
29
65
  const PAGE_SIZE = 20;
30
66
  /** Upper bound on version rows fetched for the screen (newest first). */
31
67
  const FETCH_LIMIT = 500;
32
- function useStatusStyles() {
68
+ function useStatusStyles(v2) {
33
69
  const tr = useTr();
34
- return useMemo(() => ({
70
+ return useMemo(() => v2 ? {
71
+ ACTIVE: {
72
+ label: tr("fluidgrids.history.historyPage.statusOn", "On"),
73
+ variant: "default"
74
+ },
75
+ DRAFT: {
76
+ label: tr("fluidgrids.history.historyPage.statusOffDraft", "Off (draft)"),
77
+ variant: "secondary"
78
+ },
79
+ ARCHIVED: {
80
+ label: tr("fluidgrids.history.historyPage.statusArchived", "Archived"),
81
+ variant: "outline"
82
+ },
83
+ DEPRECATED: {
84
+ label: tr("fluidgrids.history.historyPage.statusRetired", "Retired"),
85
+ variant: "destructive"
86
+ }
87
+ } : {
35
88
  ACTIVE: {
36
89
  label: tr("fluidgrids.history.historyPage.statusActive", "Active"),
37
90
  variant: "default"
@@ -48,7 +101,12 @@ function useStatusStyles() {
48
101
  label: tr("fluidgrids.history.historyPage.statusDeprecated", "Deprecated"),
49
102
  variant: "destructive"
50
103
  }
51
- }), [tr]);
104
+ }, [tr, v2]);
105
+ }
106
+ /** The page's language (the app's, when it sets one), else the browser's. */
107
+ function pageLocale() {
108
+ if (typeof document === "undefined") return void 0;
109
+ return document.documentElement.lang || void 0;
52
110
  }
53
111
  function HistoryTableSkeleton() {
54
112
  return /* @__PURE__ */ jsx("div", {
@@ -56,7 +114,7 @@ function HistoryTableSkeleton() {
56
114
  children: Array.from({ length: 6 }).map((_, i) => /* @__PURE__ */ jsx(Skeleton, { className: "h-14 w-full rounded-lg bg-card-foreground/10" }, i))
57
115
  });
58
116
  }
59
- function EmptyState() {
117
+ function EmptyState$1() {
60
118
  const tr = useTr();
61
119
  return /* @__PURE__ */ jsxs("div", {
62
120
  className: "flex flex-col items-center justify-center py-20 text-center",
@@ -80,8 +138,41 @@ function EmptyState() {
80
138
  ]
81
139
  });
82
140
  }
83
- function ErrorState({ message, onRetry }) {
141
+ function ErrorState({ message, onRetry, v2 }) {
84
142
  const tr = useTr();
143
+ if (v2) return /* @__PURE__ */ jsxs("div", {
144
+ role: "alert",
145
+ className: "p-4 bg-[var(--color-status-error-bg-subtle)] border border-[var(--color-status-error-border)] rounded-lg",
146
+ children: [
147
+ /* @__PURE__ */ jsxs("div", {
148
+ className: "flex items-center gap-2 text-[var(--color-status-error-text)]",
149
+ children: [/* @__PURE__ */ jsx(Icon, {
150
+ icon: "mdi:alert-circle",
151
+ width: 20
152
+ }), /* @__PURE__ */ jsx("span", {
153
+ className: "font-medium",
154
+ children: tr("fluidgrids.history.historyPage.errorHeadingPlain", "We couldn't load your versions")
155
+ })]
156
+ }),
157
+ /* @__PURE__ */ jsx("p", {
158
+ className: "mt-1 text-sm text-[var(--color-status-error-text)]",
159
+ children: tr("fluidgrids.history.historyPage.errorPlain", "Something went wrong while loading. Try again in a moment.")
160
+ }),
161
+ /* @__PURE__ */ jsx(TechnicalDetails, {
162
+ className: "mt-2 text-[var(--color-status-error-text)]",
163
+ label: tr("fluidgrids.history.historyPage.showTechnicalDetails", "Show technical details"),
164
+ hideLabel: tr("fluidgrids.history.historyPage.hideTechnicalDetails", "Hide technical details"),
165
+ children: message
166
+ }),
167
+ /* @__PURE__ */ jsx(Button$1, {
168
+ variant: "outline",
169
+ size: "sm",
170
+ onClick: onRetry,
171
+ className: "mt-3 border-[var(--color-status-error-border)] text-[var(--color-status-error-text)] hover:bg-[var(--color-status-error-bg-subtle)]",
172
+ children: tr("fluidgrids.history.historyPage.errorRetry", "Retry")
173
+ })
174
+ ]
175
+ });
85
176
  return /* @__PURE__ */ jsxs("div", {
86
177
  className: "p-4 bg-[var(--color-status-error-bg-subtle)] border border-[var(--color-status-error-border)] rounded-lg",
87
178
  children: [
@@ -124,12 +215,59 @@ function StatCard({ label, value, valueClassName }) {
124
215
  function HistoryPage() {
125
216
  const tr = useTr();
126
217
  const navigate = useNavigate();
127
- const STATUS_STYLES = useStatusStyles();
218
+ const v2 = useNavigationV2();
219
+ const STATUS_STYLES = useStatusStyles(v2);
128
220
  const [search, setSearch] = useState("");
129
221
  const [workflowFilter, setWorkflowFilter] = useState("all");
130
222
  const [page, setPage] = useState(0);
131
- const { workflows: versionRows, total, hasMore, loading, error, refetch } = useWorkflowDefinitions({ limit: FETCH_LIMIT });
132
- const allRows = useMemo(() => [...versionRows].sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()), [versionRows]);
223
+ const [windowOffset, setWindowOffset] = useState(0);
224
+ const [windows, setWindows] = useState({});
225
+ const { workflows: versionRows, total, hasMore, loading, error, refetch } = useWorkflowDefinitions(v2 && windowOffset > 0 ? {
226
+ limit: FETCH_LIMIT,
227
+ offset: windowOffset
228
+ } : { limit: FETCH_LIMIT });
229
+ useEffect(() => {
230
+ if (!v2 || loading || error) return;
231
+ setWindows((prev) => ({
232
+ ...prev,
233
+ [windowOffset]: versionRows
234
+ }));
235
+ }, [
236
+ v2,
237
+ loading,
238
+ error,
239
+ versionRows,
240
+ windowOffset
241
+ ]);
242
+ const loadedRows = useMemo(() => {
243
+ if (!v2) return versionRows;
244
+ const seen = /* @__PURE__ */ new Set();
245
+ const merged = [];
246
+ for (const offset of Object.keys(windows).map(Number).sort((a, b) => a - b)) for (const row of windows[offset]) {
247
+ if (seen.has(row.id)) continue;
248
+ seen.add(row.id);
249
+ merged.push(row);
250
+ }
251
+ return merged;
252
+ }, [
253
+ v2,
254
+ versionRows,
255
+ windows
256
+ ]);
257
+ const handleRefresh = useCallback(() => {
258
+ if (v2 && windowOffset > 0) {
259
+ setWindows({});
260
+ setWindowOffset(0);
261
+ return;
262
+ }
263
+ if (v2) setWindows({});
264
+ refetch();
265
+ }, [
266
+ v2,
267
+ windowOffset,
268
+ refetch
269
+ ]);
270
+ const allRows = useMemo(() => [...loadedRows].sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()), [loadedRows]);
133
271
  const distinctWorkflows = useMemo(() => {
134
272
  const byKey = /* @__PURE__ */ new Map();
135
273
  for (const row of allRows) if (!byKey.has(row.workflowKey)) byKey.set(row.workflowKey, {
@@ -168,7 +306,7 @@ function HistoryPage() {
168
306
  setPage(0);
169
307
  }, []);
170
308
  const assistantControls = useMemo(() => historyControls({
171
- page: tr("fluidgrids.history.historyPage.title", "Version History"),
309
+ page: tr("fluidgrids.history.historyPage.title", v2 ? "Version history" : "Version History"),
172
310
  search: handleSearchChange,
173
311
  workflow: {
174
312
  label: tr("fluidgrids.executions.executionTable.colWorkflow", "Workflow"),
@@ -183,6 +321,7 @@ function HistoryPage() {
183
321
  }
184
322
  }), [
185
323
  tr,
324
+ v2,
186
325
  distinctWorkflows,
187
326
  workflowFilter,
188
327
  handleSearchChange,
@@ -240,7 +379,7 @@ function HistoryPage() {
240
379
  };
241
380
  const formatDate = (dateStr) => {
242
381
  try {
243
- return new Intl.DateTimeFormat("en-US", {
382
+ return new Intl.DateTimeFormat(pageLocale(), {
244
383
  month: "short",
245
384
  day: "numeric",
246
385
  year: "numeric",
@@ -252,6 +391,7 @@ function HistoryPage() {
252
391
  }
253
392
  };
254
393
  const countByStatus = (status) => allRows.filter((r) => r.status === status).length;
394
+ const showOlder = () => setWindowOffset(windowOffset + FETCH_LIMIT);
255
395
  return /* @__PURE__ */ jsxs("div", {
256
396
  className: "p-4 sm:p-6 bg-background-primary min-h-screen",
257
397
  children: [
@@ -261,7 +401,7 @@ function HistoryPage() {
261
401
  children: [/* @__PURE__ */ jsxs("div", { children: [
262
402
  /* @__PURE__ */ jsx("h1", {
263
403
  className: "text-2xl sm:text-3xl font-bold text-text-primary",
264
- children: tr("fluidgrids.history.historyPage.title", "Version History")
404
+ children: tr("fluidgrids.history.historyPage.title", v2 ? "Version history" : "Version History")
265
405
  }),
266
406
  /* @__PURE__ */ jsx("p", {
267
407
  className: "text-text-secondary mt-1",
@@ -275,13 +415,13 @@ function HistoryPage() {
275
415
  className: "flex flex-wrap items-center gap-3",
276
416
  children: [/* @__PURE__ */ jsxs(Button$1, {
277
417
  variant: "outline",
278
- onClick: () => refetch(),
418
+ onClick: handleRefresh,
279
419
  children: [/* @__PURE__ */ jsx(Icon, {
280
420
  icon: "mdi:refresh",
281
421
  className: "mr-2",
282
422
  width: 16
283
423
  }), tr("fluidgrids.history.historyPage.refreshButton", "Refresh")]
284
- }), /* @__PURE__ */ jsxs(Button$1, {
424
+ }), !v2 && /* @__PURE__ */ jsxs(Button$1, {
285
425
  variant: "outline",
286
426
  onClick: () => navigate("../list"),
287
427
  children: [/* @__PURE__ */ jsx(Icon, {
@@ -302,7 +442,8 @@ function HistoryPage() {
302
442
  width: 18,
303
443
  className: "absolute left-3 top-1/2 -translate-y-1/2 text-text-secondary"
304
444
  }), /* @__PURE__ */ jsx(Input, {
305
- placeholder: tr("fluidgrids.history.historyPage.searchPlaceholder", "Search by name, version, key, or author..."),
445
+ placeholder: tr("fluidgrids.history.historyPage.searchPlaceholder", v2 ? "Search by workflow or person" : "Search by name, version, key, or author..."),
446
+ "aria-label": tr("fluidgrids.history.historyPage.searchLabel", "Search versions"),
306
447
  value: search,
307
448
  onChange: (e) => handleSearchChange(e.target.value),
308
449
  className: "pl-10 bg-background-secondary border-border-secondary"
@@ -324,29 +465,33 @@ function HistoryPage() {
324
465
  })]
325
466
  }),
326
467
  /* @__PURE__ */ jsxs("div", {
327
- className: "grid grid-cols-2 sm:grid-cols-5 gap-3 mb-6",
468
+ className: `grid grid-cols-2 ${v2 ? "sm:grid-cols-3 lg:grid-cols-6" : "sm:grid-cols-5"} gap-3 mb-6`,
328
469
  children: [
329
470
  /* @__PURE__ */ jsx(StatCard, {
330
471
  label: tr("fluidgrids.history.historyPage.statTotalVersions", "Total Versions"),
331
- value: total || allRows.length
472
+ value: v2 ? allRows.length : total || allRows.length
332
473
  }),
333
474
  /* @__PURE__ */ jsx(StatCard, {
334
475
  label: tr("fluidgrids.history.historyPage.statWorkflows", "Workflows"),
335
476
  value: distinctWorkflows.length
336
477
  }),
337
478
  /* @__PURE__ */ jsx(StatCard, {
338
- label: tr("fluidgrids.history.historyPage.statActive", "Active"),
479
+ label: v2 ? tr("fluidgrids.history.historyPage.statOn", "On") : tr("fluidgrids.history.historyPage.statActive", "Active"),
339
480
  value: countByStatus("ACTIVE"),
340
481
  valueClassName: "text-[var(--color-status-success-text)]"
341
482
  }),
342
483
  /* @__PURE__ */ jsx(StatCard, {
343
- label: tr("fluidgrids.history.historyPage.statDraft", "Draft"),
484
+ label: v2 ? tr("fluidgrids.history.historyPage.statOffDraft", "Off (draft)") : tr("fluidgrids.history.historyPage.statDraft", "Draft"),
344
485
  value: countByStatus("DRAFT"),
345
486
  valueClassName: "text-[var(--color-status-warning-text)]"
346
487
  }),
347
488
  /* @__PURE__ */ jsx(StatCard, {
348
489
  label: tr("fluidgrids.history.historyPage.statArchived", "Archived"),
349
490
  value: countByStatus("ARCHIVED")
491
+ }),
492
+ v2 && /* @__PURE__ */ jsx(StatCard, {
493
+ label: tr("fluidgrids.history.historyPage.statRetired", "Retired"),
494
+ value: countByStatus("DEPRECATED")
350
495
  })
351
496
  ]
352
497
  }),
@@ -361,10 +506,11 @@ function HistoryPage() {
361
506
  className: "mb-6",
362
507
  children: /* @__PURE__ */ jsx(ErrorState, {
363
508
  message: error.message,
364
- onRetry: refetch
509
+ onRetry: handleRefresh,
510
+ v2
365
511
  })
366
512
  }),
367
- loading ? /* @__PURE__ */ jsx(HistoryTableSkeleton, {}) : filteredRows.length === 0 ? /* @__PURE__ */ jsx(EmptyState, {}) : /* @__PURE__ */ jsx("div", {
513
+ loading && !(v2 && allRows.length > 0) ? /* @__PURE__ */ jsx(HistoryTableSkeleton, {}) : filteredRows.length === 0 ? /* @__PURE__ */ jsx(EmptyState$1, {}) : /* @__PURE__ */ jsx("div", {
368
514
  className: "overflow-x-auto rounded-lg border border-border-secondary",
369
515
  children: /* @__PURE__ */ jsxs("table", {
370
516
  className: "w-full text-sm",
@@ -385,11 +531,11 @@ function HistoryPage() {
385
531
  }),
386
532
  /* @__PURE__ */ jsx("th", {
387
533
  className: "text-left px-4 py-3 font-medium text-text-secondary",
388
- children: tr("fluidgrids.history.historyPage.columnChangedBy", "Changed By")
534
+ children: v2 ? tr("fluidgrids.history.historyPage.columnCreatedBy", "Created by") : tr("fluidgrids.history.historyPage.columnChangedBy", "Changed By")
389
535
  }),
390
536
  /* @__PURE__ */ jsx("th", {
391
537
  className: "text-left px-4 py-3 font-medium text-text-secondary",
392
- children: tr("fluidgrids.history.historyPage.columnChangedAt", "Changed At")
538
+ children: v2 ? tr("fluidgrids.history.historyPage.columnLastChanged", "Last changed") : tr("fluidgrids.history.historyPage.columnChangedAt", "Changed At")
393
539
  }),
394
540
  /* @__PURE__ */ jsx("th", {
395
541
  className: "text-right px-4 py-3 font-medium text-text-secondary",
@@ -399,8 +545,20 @@ function HistoryPage() {
399
545
  }) }), /* @__PURE__ */ jsx("tbody", { children: paginatedRows.map((row) => {
400
546
  const statusStyle = STATUS_STYLES[row.status] ?? STATUS_STYLES.DRAFT;
401
547
  return /* @__PURE__ */ jsxs("tr", {
402
- className: "border-b border-border-secondary last:border-0 hover:bg-background-secondary/50 cursor-pointer transition-colors",
548
+ className: "border-b border-border-secondary last:border-0 hover:bg-background-secondary/50 cursor-pointer transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring",
549
+ tabIndex: 0,
550
+ "aria-label": tr("fluidgrids.history.historyPage.openVersionLabel", "Open {{name}} {{version}} in the builder", {
551
+ name: row.name,
552
+ version: row.version
553
+ }),
403
554
  onClick: () => handleNavigateToVersion(row.workflowKey, row.version),
555
+ onKeyDown: (e) => {
556
+ if (e.target !== e.currentTarget) return;
557
+ if (e.key === "Enter" || e.key === " ") {
558
+ e.preventDefault();
559
+ handleNavigateToVersion(row.workflowKey, row.version);
560
+ }
561
+ },
404
562
  children: [
405
563
  /* @__PURE__ */ jsx("td", {
406
564
  className: "px-4 py-3",
@@ -479,6 +637,8 @@ function HistoryPage() {
479
637
  }), /* @__PURE__ */ jsx(TooltipContent, { children: tr("fluidgrids.history.historyPage.compareTooltip", "Compare with the previous version") })] }), /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
480
638
  asChild: true,
481
639
  children: /* @__PURE__ */ jsx("button", {
640
+ type: "button",
641
+ "aria-label": tr("fluidgrids.history.historyPage.openInBuilderTooltip", "Open in builder"),
482
642
  onClick: (e) => {
483
643
  e.stopPropagation();
484
644
  handleNavigateToVersion(row.workflowKey, row.version);
@@ -508,19 +668,25 @@ function HistoryPage() {
508
668
  onRestore: (version) => handleRestoreFromDiff(diffTarget.workflowKey, version),
509
669
  onOpenVersion: (version) => handleNavigateToVersion(diffTarget.workflowKey, version)
510
670
  }),
671
+ v2 && hasMore && !error && /* @__PURE__ */ jsx("div", {
672
+ className: "mt-4 flex justify-center",
673
+ children: /* @__PURE__ */ jsx(Button$1, {
674
+ variant: "outline",
675
+ onClick: showOlder,
676
+ disabled: loading,
677
+ "data-testid": "fluidgrids-history-show-older",
678
+ children: tr("fluidgrids.history.historyPage.showOlderVersions", "Show older versions")
679
+ })
680
+ }),
511
681
  filteredRows.length > PAGE_SIZE && /* @__PURE__ */ jsxs("div", {
512
682
  className: "flex items-center justify-between mt-4 px-1",
513
- children: [/* @__PURE__ */ jsxs("p", {
683
+ children: [/* @__PURE__ */ jsx("p", {
514
684
  className: "text-sm text-text-secondary",
515
- children: [
516
- "Showing ",
517
- page * PAGE_SIZE + 1,
518
- "–",
519
- Math.min((page + 1) * PAGE_SIZE, filteredRows.length),
520
- " of",
521
- " ",
522
- filteredRows.length
523
- ]
685
+ children: tr("fluidgrids.history.historyPage.rangeSummary", "Showing {{from}}–{{to}} of {{total}}", {
686
+ from: page * PAGE_SIZE + 1,
687
+ to: Math.min((page + 1) * PAGE_SIZE, filteredRows.length),
688
+ total: filteredRows.length
689
+ })
524
690
  }), /* @__PURE__ */ jsxs("div", {
525
691
  className: "flex gap-2",
526
692
  children: [/* @__PURE__ */ jsxs(Button$1, {