@xyne/workflow-ui 0.4.0 → 0.4.2

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 (225) hide show
  1. package/dist/components/analytics/AnalyticsDashboard.d.ts.map +1 -1
  2. package/dist/components/analytics/AnalyticsDashboard.js +48 -18
  3. package/dist/components/analytics/AnalyticsDashboard.js.map +1 -1
  4. package/dist/components/analytics/FilteredRunsPanel.d.ts +9 -0
  5. package/dist/components/analytics/FilteredRunsPanel.d.ts.map +1 -0
  6. package/dist/components/analytics/FilteredRunsPanel.js +67 -0
  7. package/dist/components/analytics/FilteredRunsPanel.js.map +1 -0
  8. package/dist/components/analytics/FolderCard.d.ts +10 -0
  9. package/dist/components/analytics/FolderCard.d.ts.map +1 -0
  10. package/dist/components/analytics/FolderCard.js +12 -0
  11. package/dist/components/analytics/FolderCard.js.map +1 -0
  12. package/dist/components/analytics/FolderGrid.d.ts +7 -0
  13. package/dist/components/analytics/FolderGrid.d.ts.map +1 -0
  14. package/dist/components/analytics/FolderGrid.js +29 -0
  15. package/dist/components/analytics/FolderGrid.js.map +1 -0
  16. package/dist/components/analytics/RecentFailuresPanel.d.ts +9 -0
  17. package/dist/components/analytics/RecentFailuresPanel.d.ts.map +1 -0
  18. package/dist/components/analytics/RecentFailuresPanel.js +27 -0
  19. package/dist/components/analytics/RecentFailuresPanel.js.map +1 -0
  20. package/dist/components/analytics/StatCard.d.ts +3 -1
  21. package/dist/components/analytics/StatCard.d.ts.map +1 -1
  22. package/dist/components/analytics/StatCard.js +6 -2
  23. package/dist/components/analytics/StatCard.js.map +1 -1
  24. package/dist/components/analytics/TopErrorsPanel.d.ts +5 -5
  25. package/dist/components/analytics/TopErrorsPanel.d.ts.map +1 -1
  26. package/dist/components/analytics/TopErrorsPanel.js +18 -45
  27. package/dist/components/analytics/TopErrorsPanel.js.map +1 -1
  28. package/dist/components/analytics/WorkflowsTable.d.ts.map +1 -1
  29. package/dist/components/analytics/WorkflowsTable.js +25 -8
  30. package/dist/components/analytics/WorkflowsTable.js.map +1 -1
  31. package/dist/components/analytics/index.d.ts +2 -0
  32. package/dist/components/analytics/index.d.ts.map +1 -1
  33. package/dist/components/analytics/index.js +2 -0
  34. package/dist/components/analytics/index.js.map +1 -1
  35. package/dist/components/automations/AutomationListView.js +2 -2
  36. package/dist/components/automations/AutomationListView.js.map +1 -1
  37. package/dist/components/builder/v3/AiBuilderPanel.d.ts +12 -0
  38. package/dist/components/builder/v3/AiBuilderPanel.d.ts.map +1 -0
  39. package/dist/components/builder/v3/AiBuilderPanel.js +119 -0
  40. package/dist/components/builder/v3/AiBuilderPanel.js.map +1 -0
  41. package/dist/components/builder/v3/BuilderToolbar.d.ts +3 -1
  42. package/dist/components/builder/v3/BuilderToolbar.d.ts.map +1 -1
  43. package/dist/components/builder/v3/BuilderToolbar.js +5 -3
  44. package/dist/components/builder/v3/BuilderToolbar.js.map +1 -1
  45. package/dist/components/builder/v3/WorkflowBuilderV3.d.ts +4 -1
  46. package/dist/components/builder/v3/WorkflowBuilderV3.d.ts.map +1 -1
  47. package/dist/components/builder/v3/WorkflowBuilderV3.js +7 -2
  48. package/dist/components/builder/v3/WorkflowBuilderV3.js.map +1 -1
  49. package/dist/components/builder/v3/WorkflowTree.d.ts.map +1 -1
  50. package/dist/components/builder/v3/WorkflowTree.js +1 -1
  51. package/dist/components/builder/v3/WorkflowTree.js.map +1 -1
  52. package/dist/components/dashboard/WorkflowDashboard.d.ts +4 -1
  53. package/dist/components/dashboard/WorkflowDashboard.d.ts.map +1 -1
  54. package/dist/components/dashboard/WorkflowDashboard.js +2 -2
  55. package/dist/components/dashboard/WorkflowDashboard.js.map +1 -1
  56. package/dist/components/execution/ExecutionTree.d.ts.map +1 -1
  57. package/dist/components/execution/ExecutionTree.js +1 -1
  58. package/dist/components/execution/ExecutionTree.js.map +1 -1
  59. package/dist/components/execution/StepDetailPanel.d.ts.map +1 -1
  60. package/dist/components/execution/StepDetailPanel.js +3 -3
  61. package/dist/components/execution/StepDetailPanel.js.map +1 -1
  62. package/dist/components/index.d.ts +2 -0
  63. package/dist/components/index.d.ts.map +1 -1
  64. package/dist/components/index.js +1 -0
  65. package/dist/components/index.js.map +1 -1
  66. package/dist/components/runs/RunsTable.d.ts.map +1 -1
  67. package/dist/components/runs/RunsTable.js +23 -7
  68. package/dist/components/runs/RunsTable.js.map +1 -1
  69. package/dist/hooks/use-ai-builder.d.ts +13 -0
  70. package/dist/hooks/use-ai-builder.d.ts.map +1 -0
  71. package/dist/hooks/use-ai-builder.js +35 -0
  72. package/dist/hooks/use-ai-builder.js.map +1 -0
  73. package/dist/hooks/use-analytics.d.ts +1 -3
  74. package/dist/hooks/use-analytics.d.ts.map +1 -1
  75. package/dist/hooks/use-analytics.js +23 -120
  76. package/dist/hooks/use-analytics.js.map +1 -1
  77. package/dist/hooks/use-runs-list.d.ts +1 -0
  78. package/dist/hooks/use-runs-list.d.ts.map +1 -1
  79. package/dist/hooks/use-runs-list.js +7 -3
  80. package/dist/hooks/use-runs-list.js.map +1 -1
  81. package/dist/hooks/use-workflow-builder.d.ts +2 -0
  82. package/dist/hooks/use-workflow-builder.d.ts.map +1 -1
  83. package/dist/hooks/use-workflow-builder.js +8 -0
  84. package/dist/hooks/use-workflow-builder.js.map +1 -1
  85. package/dist/hooks/use-workflow-counts.d.ts +4 -1
  86. package/dist/hooks/use-workflow-counts.d.ts.map +1 -1
  87. package/dist/hooks/use-workflow-counts.js.map +1 -1
  88. package/dist/index.d.ts +2 -0
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +1 -0
  91. package/dist/index.js.map +1 -1
  92. package/dist/styles.css +1 -1
  93. package/package.json +2 -1
  94. package/dist/components/builder/AddStepButton.d.ts +0 -6
  95. package/dist/components/builder/AddStepButton.d.ts.map +0 -1
  96. package/dist/components/builder/AddStepButton.js +0 -7
  97. package/dist/components/builder/AddStepButton.js.map +0 -1
  98. package/dist/components/builder/BranchEdge.d.ts +0 -3
  99. package/dist/components/builder/BranchEdge.d.ts.map +0 -1
  100. package/dist/components/builder/BranchEdge.js +0 -19
  101. package/dist/components/builder/BranchEdge.js.map +0 -1
  102. package/dist/components/builder/BuilderToolbar.d.ts +0 -10
  103. package/dist/components/builder/BuilderToolbar.d.ts.map +0 -1
  104. package/dist/components/builder/BuilderToolbar.js +0 -16
  105. package/dist/components/builder/BuilderToolbar.js.map +0 -1
  106. package/dist/components/builder/StepConfigDrawer.d.ts +0 -11
  107. package/dist/components/builder/StepConfigDrawer.d.ts.map +0 -1
  108. package/dist/components/builder/StepConfigDrawer.js +0 -21
  109. package/dist/components/builder/StepConfigDrawer.js.map +0 -1
  110. package/dist/components/builder/StepNode.d.ts +0 -15
  111. package/dist/components/builder/StepNode.d.ts.map +0 -1
  112. package/dist/components/builder/StepNode.js +0 -56
  113. package/dist/components/builder/StepNode.js.map +0 -1
  114. package/dist/components/builder/StepPalette.d.ts +0 -7
  115. package/dist/components/builder/StepPalette.d.ts.map +0 -1
  116. package/dist/components/builder/StepPalette.js +0 -83
  117. package/dist/components/builder/StepPalette.js.map +0 -1
  118. package/dist/components/builder/StepPicker.d.ts +0 -9
  119. package/dist/components/builder/StepPicker.d.ts.map +0 -1
  120. package/dist/components/builder/StepPicker.js +0 -95
  121. package/dist/components/builder/StepPicker.js.map +0 -1
  122. package/dist/components/builder/TriggerConfigPanel.d.ts +0 -10
  123. package/dist/components/builder/TriggerConfigPanel.d.ts.map +0 -1
  124. package/dist/components/builder/TriggerConfigPanel.js +0 -49
  125. package/dist/components/builder/TriggerConfigPanel.js.map +0 -1
  126. package/dist/components/builder/TriggerNode.d.ts +0 -9
  127. package/dist/components/builder/TriggerNode.d.ts.map +0 -1
  128. package/dist/components/builder/TriggerNode.js +0 -30
  129. package/dist/components/builder/TriggerNode.js.map +0 -1
  130. package/dist/components/builder/TriggerPicker.d.ts +0 -8
  131. package/dist/components/builder/TriggerPicker.d.ts.map +0 -1
  132. package/dist/components/builder/TriggerPicker.js +0 -61
  133. package/dist/components/builder/TriggerPicker.js.map +0 -1
  134. package/dist/components/builder/WorkflowBuilder.d.ts +0 -20
  135. package/dist/components/builder/WorkflowBuilder.d.ts.map +0 -1
  136. package/dist/components/builder/WorkflowBuilder.js +0 -157
  137. package/dist/components/builder/WorkflowBuilder.js.map +0 -1
  138. package/dist/components/builder/edge-types.d.ts +0 -3
  139. package/dist/components/builder/edge-types.d.ts.map +0 -1
  140. package/dist/components/builder/edge-types.js +0 -5
  141. package/dist/components/builder/edge-types.js.map +0 -1
  142. package/dist/components/builder/node-types.d.ts +0 -3
  143. package/dist/components/builder/node-types.d.ts.map +0 -1
  144. package/dist/components/builder/node-types.js +0 -11
  145. package/dist/components/builder/node-types.js.map +0 -1
  146. package/dist/components/builder/v2/AddStepButton.d.ts +0 -6
  147. package/dist/components/builder/v2/AddStepButton.d.ts.map +0 -1
  148. package/dist/components/builder/v2/AddStepButton.js +0 -6
  149. package/dist/components/builder/v2/AddStepButton.js.map +0 -1
  150. package/dist/components/builder/v2/BranchEdge.d.ts +0 -3
  151. package/dist/components/builder/v2/BranchEdge.d.ts.map +0 -1
  152. package/dist/components/builder/v2/BranchEdge.js +0 -46
  153. package/dist/components/builder/v2/BranchEdge.js.map +0 -1
  154. package/dist/components/builder/v2/LoopBodyEdge.d.ts +0 -7
  155. package/dist/components/builder/v2/LoopBodyEdge.d.ts.map +0 -1
  156. package/dist/components/builder/v2/LoopBodyEdge.js +0 -19
  157. package/dist/components/builder/v2/LoopBodyEdge.js.map +0 -1
  158. package/dist/components/builder/v2/LoopbackEdge.d.ts +0 -10
  159. package/dist/components/builder/v2/LoopbackEdge.d.ts.map +0 -1
  160. package/dist/components/builder/v2/LoopbackEdge.js +0 -26
  161. package/dist/components/builder/v2/LoopbackEdge.js.map +0 -1
  162. package/dist/components/builder/v2/StepNode.d.ts +0 -21
  163. package/dist/components/builder/v2/StepNode.d.ts.map +0 -1
  164. package/dist/components/builder/v2/StepNode.js +0 -36
  165. package/dist/components/builder/v2/StepNode.js.map +0 -1
  166. package/dist/components/builder/v2/StepPicker.d.ts +0 -8
  167. package/dist/components/builder/v2/StepPicker.d.ts.map +0 -1
  168. package/dist/components/builder/v2/StepPicker.js +0 -73
  169. package/dist/components/builder/v2/StepPicker.js.map +0 -1
  170. package/dist/components/builder/v2/TerminalNode.d.ts +0 -6
  171. package/dist/components/builder/v2/TerminalNode.d.ts.map +0 -1
  172. package/dist/components/builder/v2/TerminalNode.js +0 -7
  173. package/dist/components/builder/v2/TerminalNode.js.map +0 -1
  174. package/dist/components/builder/v2/TriggerNode.d.ts +0 -10
  175. package/dist/components/builder/v2/TriggerNode.d.ts.map +0 -1
  176. package/dist/components/builder/v2/TriggerNode.js +0 -20
  177. package/dist/components/builder/v2/TriggerNode.js.map +0 -1
  178. package/dist/components/builder/v2/TriggerPicker.d.ts +0 -7
  179. package/dist/components/builder/v2/TriggerPicker.d.ts.map +0 -1
  180. package/dist/components/builder/v2/TriggerPicker.js +0 -45
  181. package/dist/components/builder/v2/TriggerPicker.js.map +0 -1
  182. package/dist/components/builder/v2/WorkflowBuilder.d.ts +0 -14
  183. package/dist/components/builder/v2/WorkflowBuilder.d.ts.map +0 -1
  184. package/dist/components/builder/v2/WorkflowBuilder.js +0 -189
  185. package/dist/components/builder/v2/WorkflowBuilder.js.map +0 -1
  186. package/dist/components/builder/v2/edge-types.d.ts +0 -3
  187. package/dist/components/builder/v2/edge-types.d.ts.map +0 -1
  188. package/dist/components/builder/v2/edge-types.js +0 -9
  189. package/dist/components/builder/v2/edge-types.js.map +0 -1
  190. package/dist/components/builder/v2/icons.d.ts +0 -25
  191. package/dist/components/builder/v2/icons.d.ts.map +0 -1
  192. package/dist/components/builder/v2/icons.js +0 -43
  193. package/dist/components/builder/v2/icons.js.map +0 -1
  194. package/dist/components/builder/v2/layout-engine.d.ts +0 -76
  195. package/dist/components/builder/v2/layout-engine.d.ts.map +0 -1
  196. package/dist/components/builder/v2/layout-engine.js +0 -465
  197. package/dist/components/builder/v2/layout-engine.js.map +0 -1
  198. package/dist/components/builder/v2/node-types.d.ts +0 -3
  199. package/dist/components/builder/v2/node-types.d.ts.map +0 -1
  200. package/dist/components/builder/v2/node-types.js +0 -11
  201. package/dist/components/builder/v2/node-types.js.map +0 -1
  202. package/dist/components/builder/v2/theme.d.ts +0 -28
  203. package/dist/components/builder/v2/theme.d.ts.map +0 -1
  204. package/dist/components/builder/v2/theme.js +0 -63
  205. package/dist/components/builder/v2/theme.js.map +0 -1
  206. package/dist/components/dashboard/WorkflowSummaryEditor.d.ts +0 -11
  207. package/dist/components/dashboard/WorkflowSummaryEditor.d.ts.map +0 -1
  208. package/dist/components/dashboard/WorkflowSummaryEditor.js +0 -46
  209. package/dist/components/dashboard/WorkflowSummaryEditor.js.map +0 -1
  210. package/dist/components/execution/ExecutionEdge.d.ts +0 -4
  211. package/dist/components/execution/ExecutionEdge.d.ts.map +0 -1
  212. package/dist/components/execution/ExecutionEdge.js +0 -27
  213. package/dist/components/execution/ExecutionEdge.js.map +0 -1
  214. package/dist/components/execution/ExecutionStepNode.d.ts +0 -14
  215. package/dist/components/execution/ExecutionStepNode.d.ts.map +0 -1
  216. package/dist/components/execution/ExecutionStepNode.js +0 -47
  217. package/dist/components/execution/ExecutionStepNode.js.map +0 -1
  218. package/dist/components/execution/ExecutionTriggerNode.d.ts +0 -9
  219. package/dist/components/execution/ExecutionTriggerNode.d.ts.map +0 -1
  220. package/dist/components/execution/ExecutionTriggerNode.js +0 -15
  221. package/dist/components/execution/ExecutionTriggerNode.js.map +0 -1
  222. package/dist/components/execution/execution-layout.d.ts +0 -31
  223. package/dist/components/execution/execution-layout.d.ts.map +0 -1
  224. package/dist/components/execution/execution-layout.js +0 -90
  225. package/dist/components/execution/execution-layout.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsDashboard.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/AnalyticsDashboard.tsx"],"names":[],"mappings":"AAcA,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgFD,wBAAgB,kBAAkB,CAAC,EAAE,SAAS,EAAE,EAAE,uBAAuB,+BAsLxE"}
1
+ {"version":3,"file":"AnalyticsDashboard.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/AnalyticsDashboard.tsx"],"names":[],"mappings":"AAkBA,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA4SD,wBAAgB,kBAAkB,CAAC,EAAE,SAAS,EAAE,EAAE,uBAAuB,+BAmDxE"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState } from 'react';
2
+ import { useState, useMemo } from 'react';
3
3
  import { useAnalytics } from '../../hooks/use-analytics.js';
4
4
  import { LoadingSpinner } from '../shared/LoadingSpinner.js';
5
5
  import { cn } from '../shared/cn.js';
@@ -8,11 +8,14 @@ import { TimeRangeSelector } from './TimeRangeSelector.js';
8
8
  import { RunsTimeSeries } from './RunsTimeSeries.js';
9
9
  import { StatusPieChart } from './StatusPieChart.js';
10
10
  import { TopErrorsPanel } from './TopErrorsPanel.js';
11
+ import { RecentFailuresPanel } from './RecentFailuresPanel.js';
11
12
  import { WorkflowsTable } from './WorkflowsTable.js';
12
13
  import { WorkflowRunsPanel } from './WorkflowRunsPanel.js';
14
+ import { FilteredRunsPanel } from './FilteredRunsPanel.js';
13
15
  import { ExecutionViewer } from '../execution/ExecutionViewer.js';
16
+ import { FolderGrid } from './FolderGrid.js';
14
17
  function SectionCard({ title, children, className, }) {
15
- return (_jsxs("div", { className: cn('flex flex-col gap-3 rounded-lg border border-[var(--wui-border)] bg-[var(--wui-bg)] p-4', className), children: [_jsx("h3", { className: "text-xs font-semibold uppercase tracking-wider text-[var(--wui-fg-muted)]", children: title }), children] }));
18
+ return (_jsxs("div", { className: cn('flex flex-col gap-3 rounded-lg border border-[var(--wui-border)] p-4', className), style: { background: 'var(--wui-bg, #ffffff)' }, children: [_jsx("h3", { className: "text-xs font-semibold uppercase tracking-wider text-[var(--wui-fg-muted)]", children: title }), children] }));
16
19
  }
17
20
  function Breadcrumb({ view, onNavigate, }) {
18
21
  const crumbs = [
@@ -34,34 +37,61 @@ function Breadcrumb({ view, onNavigate, }) {
34
37
  }
35
38
  return (_jsx("div", { className: "flex items-center gap-1.5 text-xs", children: crumbs.map((crumb, i) => (_jsxs("span", { className: "flex items-center gap-1.5", children: [i > 0 && _jsx("span", { className: "text-[var(--wui-fg-muted)]", children: "/" }), crumb.onClick ? (_jsx("button", { onClick: crumb.onClick, className: "font-medium text-[var(--wui-fg-muted)] transition-colors hover:text-[var(--wui-fg)]", children: crumb.label })) : (_jsx("span", { className: "font-semibold text-[var(--wui-fg)]", children: crumb.label }))] }, i))) }));
36
39
  }
37
- export function AnalyticsDashboard({ className }) {
40
+ function AnalyticsOverview({ folderId, folderName, className, onBack }) {
38
41
  const [range, setRange] = useState(7);
39
42
  const [view, setView] = useState({ level: 'workflows' });
40
43
  const [workflowSearch, setWorkflowSearch] = useState('');
41
- const { data, isLoading, error } = useAnalytics(range);
44
+ const [activeFilter, setActiveFilter] = useState(null);
45
+ const [hasTopErrors, setHasTopErrors] = useState(true);
46
+ const topErrorsSince = useMemo(() => new Date(Date.now() - range * 24 * 60 * 60 * 1000).toISOString(), [range]);
47
+ function handleRangeChange(r) {
48
+ setRange(r);
49
+ setHasTopErrors(true);
50
+ }
51
+ function handleStatClick(label, status) {
52
+ setActiveFilter((prev) => {
53
+ if (prev?.label === label)
54
+ return null;
55
+ return status ? { label, status } : { label };
56
+ });
57
+ }
58
+ const { data, isLoading, error } = useAnalytics(range, folderId);
42
59
  if (isLoading) {
43
60
  return (_jsx("div", { className: "flex h-full items-center justify-center", "aria-label": "Loading", children: _jsx(LoadingSpinner, { size: "lg" }) }));
44
61
  }
45
62
  if (error || !data) {
46
63
  return (_jsx("div", { className: "flex h-full items-center justify-center text-sm text-[var(--wui-status-failed)]", children: "Failed to load analytics" }));
47
64
  }
48
- // Full-screen execution view — replaces dashboard when a run is selected
65
+ // Full-screen execution view
49
66
  if (view.level === 'steps') {
50
- return (_jsxs("div", { className: cn('flex h-full flex-col', className), children: [_jsxs("div", { className: "flex shrink-0 items-center gap-3 border-b border-[var(--wui-border)] bg-[var(--wui-bg)] px-4 py-2.5", children: [_jsxs("button", { type: "button", onClick: () => setView({ level: 'runs', workflowId: view.workflowId, workflowName: view.workflowName }), className: "flex items-center gap-1.5 rounded-md border border-[var(--wui-border)] px-2.5 py-1.5 text-xs font-medium text-[var(--wui-fg-muted)] transition-colors hover:border-[var(--wui-fg-muted)] hover:text-[var(--wui-fg)]", children: [_jsx("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("polyline", { points: "15 18 9 12 15 6" }) }), "Back to Analytics"] }), _jsxs("div", { className: "flex items-center gap-1.5 text-xs text-[var(--wui-fg-muted)]", children: [_jsx("span", { children: view.workflowName }), _jsx("span", { children: "/" }), _jsx("span", { className: "font-mono font-medium text-[var(--wui-fg)]", children: view.executionId.slice(0, 8) })] })] }), _jsx("div", { className: "flex-1 overflow-hidden", children: _jsx(ExecutionViewer, { executionId: view.executionId }) })] }));
67
+ return (_jsxs("div", { className: cn('flex h-full flex-col', className), children: [_jsxs("div", { className: "flex shrink-0 items-center gap-3 border-b border-[var(--wui-border)] px-4 py-2.5", style: { background: 'var(--wui-bg, #ffffff)' }, children: [_jsxs("button", { type: "button", onClick: () => setView({ level: 'runs', workflowId: view.workflowId, workflowName: view.workflowName }), className: "flex items-center gap-1.5 rounded-md border border-[var(--wui-border)] px-2.5 py-1.5 text-xs font-medium text-[var(--wui-fg-muted)] transition-colors hover:border-[var(--wui-fg-muted)] hover:text-[var(--wui-fg)]", children: [_jsx("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("polyline", { points: "15 18 9 12 15 6" }) }), "Back to Analytics"] }), _jsxs("div", { className: "flex items-center gap-1.5 text-xs text-[var(--wui-fg-muted)]", children: [_jsx("span", { children: view.workflowName }), _jsx("span", { children: "/" }), _jsx("span", { className: "font-mono font-medium text-[var(--wui-fg)]", children: view.executionId.slice(0, 8) })] })] }), _jsx("div", { className: "flex-1 overflow-hidden", children: _jsx(ExecutionViewer, { executionId: view.executionId }) })] }));
51
68
  }
52
- return (_jsxs("div", { className: cn('flex flex-col gap-4 p-6', className), children: [_jsx("div", { className: "flex justify-end", children: _jsx(TimeRangeSelector, { value: range, onChange: setRange }) }), _jsxs("div", { className: "grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-6", children: [_jsx(StatCard, { label: "Total Runs", value: data.totalRuns, color: "var(--wui-primary)" }), _jsx(StatCard, { label: "Success Rate", value: data.successRate, percent: true, color: "var(--wui-status-completed)" }), _jsx(StatCard, { label: "Failed", value: data.byStatus['FAILED'] ?? 0, color: "var(--wui-status-failed)" }), _jsx(StatCard, { label: "Running", value: data.byStatus['RUNNING'] ?? 0, color: "var(--wui-status-running)" }), _jsx(StatCard, { label: "Cancelled", value: data.byStatus['CANCELLED'] ?? 0, color: "var(--wui-fg-muted)" }), _jsx(StatCard, { label: "Active Workflows", value: data.activeWorkflows, total: data.totalWorkflows, color: "var(--wui-cat-integration)" })] }), _jsxs("div", { className: "grid grid-cols-1 gap-4 lg:grid-cols-[1fr_280px]", children: [_jsx(SectionCard, { title: "Runs per day", children: _jsx(RunsTimeSeries, { data: data.runsByDay, height: 200 }) }), _jsx(SectionCard, { title: "Status breakdown", children: _jsx(StatusPieChart, { byStatus: data.byStatus, height: 200 }) })] }), _jsxs("div", { className: "grid grid-cols-1 gap-4 lg:grid-cols-2", children: [data.recentFailures.length > 0 && (_jsx(SectionCard, { title: "Recent Failures", children: _jsx("div", { className: "flex flex-col divide-y divide-[var(--wui-border)]", children: data.recentFailures.map((f) => (_jsxs("button", { type: "button", onClick: () => setView({
53
- level: 'steps',
54
- workflowId: f.workflowId,
55
- workflowName: f.workflowName,
56
- executionId: f.executionId,
57
- }), className: "flex items-center gap-3 py-2.5 text-left transition-colors hover:bg-[var(--wui-bg-subtle)] px-1 rounded", children: [_jsx("span", { className: "h-1.5 w-1.5 shrink-0 rounded-full bg-[var(--wui-status-failed)]" }), _jsxs("span", { className: "flex-1 min-w-0", children: [_jsx("span", { className: "block text-xs font-medium text-[var(--wui-fg)] truncate", children: f.workflowName }), _jsx("span", { className: "block text-[11px] text-[var(--wui-fg-muted)] font-mono", children: f.executionId.slice(0, 8) })] }), _jsx("span", { className: "text-[11px] text-[var(--wui-fg-muted)] shrink-0", children: f.createdAt.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }) }), _jsx("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "text-[var(--wui-fg-muted)] shrink-0", children: _jsx("polyline", { points: "9 18 15 12 9 6" }) })] }, f.executionId))) }) })), data.recentFailures.length > 0 && (_jsx(SectionCard, { title: "Top Errors", children: _jsx(TopErrorsPanel, { failures: data.recentFailures }) }))] }), _jsxs(SectionCard, { title: "Explore", children: [_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsx(Breadcrumb, { view: view, onNavigate: setView }), view.level === 'workflows' && (_jsxs("div", { className: "relative w-full max-w-xs", children: [_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "pointer-events-none absolute left-2.5 top-1/2 -translate-y-1/2 text-[var(--wui-fg-muted)]", children: [_jsx("circle", { cx: "11", cy: "11", r: "8" }), _jsx("path", { d: "m21 21-4.3-4.3" })] }), _jsx("input", { type: "text", value: workflowSearch, onChange: (e) => setWorkflowSearch(e.target.value), placeholder: "Search workflows...", className: "w-full rounded-md border border-[var(--wui-border)] bg-[var(--wui-bg)] py-1.5 pl-8 pr-3 text-xs text-[var(--wui-fg)] outline-none transition-colors placeholder:text-[var(--wui-fg-muted)] focus:border-[var(--wui-primary)]" })] }))] }), view.level === 'workflows' && (_jsx(WorkflowsTable, { data: data.byWorkflow, search: workflowSearch, onSelectWorkflow: (workflowId) => {
69
+ return (_jsxs("div", { className: cn('flex flex-col gap-4 p-6', className), children: [onBack && (_jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("button", { type: "button", onClick: onBack, className: "flex items-center gap-1.5 rounded-md border border-[var(--wui-border)] px-2.5 py-1.5 text-xs font-medium text-[var(--wui-fg-muted)] transition-colors hover:border-[var(--wui-fg-muted)] hover:text-[var(--wui-fg)]", children: [_jsx("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("polyline", { points: "15 18 9 12 15 6" }) }), "Back to Folders"] }), folderName && (_jsx("span", { className: "text-xs font-semibold text-[var(--wui-fg)]", children: folderName }))] })), _jsx("div", { className: "flex justify-end", children: _jsx(TimeRangeSelector, { value: range, onChange: handleRangeChange }) }), _jsxs("div", { className: "flex gap-3 overflow-x-auto", children: [_jsx(StatCard, { label: "Total Runs", value: data.totalRuns, color: "var(--wui-primary)", active: activeFilter?.label === 'Total Runs', onClick: () => handleStatClick('Total Runs', undefined) }), _jsx(StatCard, { label: "Success Rate", value: data.successRate, percent: true, color: "var(--wui-status-completed)", active: activeFilter?.label === 'Success Rate', onClick: () => handleStatClick('Success Rate', 'COMPLETED') }), _jsx(StatCard, { label: "Failed", value: data.byStatus['FAILED'] ?? 0, color: "var(--wui-status-failed)", active: activeFilter?.label === 'Failed', onClick: () => handleStatClick('Failed', 'FAILED') }), _jsx(StatCard, { label: "Running", value: data.byStatus['RUNNING'] ?? 0, color: "var(--wui-status-running)", active: activeFilter?.label === 'Running', onClick: () => handleStatClick('Running', 'RUNNING') }), _jsx(StatCard, { label: "Waiting", value: data.byStatus['EXTERNAL_WAIT'] ?? 0, color: "var(--wui-status-paused)", active: activeFilter?.label === 'Waiting', onClick: () => handleStatClick('Waiting', 'EXTERNAL_WAIT') }), _jsx(StatCard, { label: "Cancelled", value: data.byStatus['CANCELLED'] ?? 0, color: "var(--wui-fg-muted)", active: activeFilter?.label === 'Cancelled', onClick: () => handleStatClick('Cancelled', 'CANCELLED') }), _jsx(StatCard, { label: "Active Workflows", value: data.activeWorkflows, total: data.totalWorkflows, color: "var(--wui-cat-integration)" })] }), activeFilter && (_jsx(FilteredRunsPanel, { label: activeFilter.label, ...('status' in activeFilter ? { status: activeFilter.status } : {}), ...(folderId !== undefined ? { folderId } : {}), onClose: () => setActiveFilter(null), onSelectExecution: (executionId, workflowId) => {
70
+ const wf = data.byWorkflow.find((w) => w.workflowId === workflowId);
71
+ setActiveFilter(null);
72
+ setView({ level: 'steps', workflowId, workflowName: wf?.name ?? workflowId, executionId });
73
+ } })), _jsxs("div", { className: "flex gap-4", children: [_jsx(SectionCard, { title: "Runs per day", className: "min-w-0 flex-1 overflow-hidden", children: _jsx(RunsTimeSeries, { data: data.runsByDay, height: 200 }) }), _jsx(SectionCard, { title: "Status breakdown", className: "w-[280px] shrink-0", children: _jsx(StatusPieChart, { byStatus: data.byStatus, height: 200 }) })] }), _jsxs("div", { className: "grid grid-cols-1 gap-4 lg:grid-cols-2", children: [data.recentFailures.length > 0 && (_jsx(SectionCard, { title: "Recent Failures", children: _jsx(RecentFailuresPanel, { failures: data.recentFailures, onSelect: (f) => setView({ level: 'steps', workflowId: f.workflowId, workflowName: f.workflowName, executionId: f.executionId }) }) })), _jsx(SectionCard, { title: "Top Errors", className: hasTopErrors ? '' : 'hidden', children: _jsx(TopErrorsPanel, { since: topErrorsSince, ...(folderId !== undefined ? { folderId } : {}), onLoad: setHasTopErrors, onSelectRun: (executionId, workflowId) => {
74
+ const wf = data.byWorkflow.find((w) => w.workflowId === workflowId);
75
+ setView({ level: 'steps', workflowId, workflowName: wf?.name ?? workflowId, executionId });
76
+ } }) })] }), _jsxs(SectionCard, { title: "Explore", children: [_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsx(Breadcrumb, { view: view, onNavigate: setView }), view.level === 'workflows' && (_jsxs("div", { className: "relative w-full max-w-xs", children: [_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "pointer-events-none absolute left-2.5 top-1/2 -translate-y-1/2 text-[var(--wui-fg-muted)]", children: [_jsx("circle", { cx: "11", cy: "11", r: "8" }), _jsx("path", { d: "m21 21-4.3-4.3" })] }), _jsx("input", { type: "text", value: workflowSearch, onChange: (e) => setWorkflowSearch(e.target.value), placeholder: "Search workflows...", className: "w-full rounded-md border border-[var(--wui-border)] py-1.5 pl-8 pr-3 text-xs text-[var(--wui-fg)] outline-none transition-colors placeholder:text-[var(--wui-fg-muted)] focus:border-[var(--wui-primary)]", style: { background: 'var(--wui-bg, #ffffff)' } })] }))] }), view.level === 'workflows' && (_jsx(WorkflowsTable, { data: data.byWorkflow, search: workflowSearch, onSelectWorkflow: (workflowId) => {
58
77
  const wf = data.byWorkflow.find((w) => w.workflowId === workflowId);
59
78
  setView({ level: 'runs', workflowId, workflowName: wf?.name ?? workflowId });
60
- } })), view.level === 'runs' && (_jsx(WorkflowRunsPanel, { workflowId: view.workflowId, onSelectExecution: (executionId) => setView({
61
- level: 'steps',
62
- workflowId: view.workflowId,
63
- workflowName: view.workflowName,
64
- executionId,
65
- }) }))] })] }));
79
+ } })), view.level === 'runs' && (_jsx(WorkflowRunsPanel, { workflowId: view.workflowId, onSelectExecution: (executionId) => setView({ level: 'steps', workflowId: view.workflowId, workflowName: view.workflowName, executionId }) }))] })] }));
80
+ }
81
+ // ─── Tab shell (public export) ───
82
+ const TABS = [
83
+ { id: 'overview', label: 'Overview' },
84
+ { id: 'folders', label: 'Folders' },
85
+ ];
86
+ export function AnalyticsDashboard({ className }) {
87
+ const [activeTab, setActiveTab] = useState('overview');
88
+ const [selectedFolder, setSelectedFolder] = useState(null);
89
+ function handleTabChange(tab) {
90
+ setActiveTab(tab);
91
+ setSelectedFolder(null);
92
+ }
93
+ return (_jsxs("div", { className: cn('flex h-full flex-col', className), children: [!selectedFolder && (_jsx("div", { className: "flex shrink-0 border-b border-[var(--wui-border)] px-6", children: TABS.map((tab) => (_jsx("button", { type: "button", onClick: () => handleTabChange(tab.id), className: cn('px-4 py-3 text-sm font-medium transition-colors', activeTab === tab.id
94
+ ? 'border-b-2 border-[var(--wui-primary)] text-[var(--wui-fg)]'
95
+ : 'text-[var(--wui-fg-muted)] hover:text-[var(--wui-fg)]'), children: tab.label }, tab.id))) })), _jsxs("div", { className: "flex-1 overflow-auto", children: [activeTab === 'overview' && _jsx(AnalyticsOverview, {}), activeTab === 'folders' && !selectedFolder && (_jsx("div", { className: "p-6", children: _jsx(FolderGrid, { onSelect: setSelectedFolder }) })), activeTab === 'folders' && selectedFolder && (_jsx(AnalyticsOverview, { folderId: selectedFolder.id, folderName: selectedFolder.name, onBack: () => setSelectedFolder(null) }))] })] }));
66
96
  }
67
97
  //# sourceMappingURL=AnalyticsDashboard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsDashboard.js","sourceRoot":"","sources":["../../../src/components/analytics/AnalyticsDashboard.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AnalyticsDashboard.js","sourceRoot":"","sources":["../../../src/components/analytics/AnalyticsDashboard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface FilteredRunsPanelProps {
2
+ label: string;
3
+ status?: string | undefined;
4
+ folderId?: string | undefined;
5
+ onSelectExecution: (executionId: string, workflowId: string) => void;
6
+ onClose: () => void;
7
+ }
8
+ export declare function FilteredRunsPanel({ label, status, folderId, onSelectExecution, onClose }: FilteredRunsPanelProps): import("react").JSX.Element;
9
+ //# sourceMappingURL=FilteredRunsPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilteredRunsPanel.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/FilteredRunsPanel.tsx"],"names":[],"mappings":"AA+BA,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,iBAAiB,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,EAAE,sBAAsB,+BA0GhH"}
@@ -0,0 +1,67 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useRef } from 'react';
3
+ import { useVirtualizer } from '@tanstack/react-virtual';
4
+ import { useRunsList } from '../../hooks/use-runs-list.js';
5
+ import { StatusBadge } from '../shared/StatusBadge.js';
6
+ import { LoadingSpinner } from '../shared/LoadingSpinner.js';
7
+ const ROW_HEIGHT = 48;
8
+ const PANEL_HEIGHT = 380;
9
+ function mapStatus(status) {
10
+ switch (status) {
11
+ case 'COMPLETED': return 'completed';
12
+ case 'FAILED': return 'failed';
13
+ case 'RUNNING': return 'running';
14
+ case 'EXTERNAL_WAIT': return 'paused';
15
+ case 'CANCELLED': return 'cancelled';
16
+ default: return 'pending';
17
+ }
18
+ }
19
+ function timeAgo(date) {
20
+ const d = date instanceof Date ? date : new Date(date);
21
+ const sec = Math.floor((Date.now() - d.getTime()) / 1000);
22
+ if (sec < 60)
23
+ return `${sec}s ago`;
24
+ const min = Math.floor(sec / 60);
25
+ if (min < 60)
26
+ return `${min}m ago`;
27
+ const hr = Math.floor(min / 60);
28
+ if (hr < 24)
29
+ return `${hr}h ago`;
30
+ return `${Math.floor(hr / 24)}d ago`;
31
+ }
32
+ export function FilteredRunsPanel({ label, status, folderId, onSelectExecution, onClose }) {
33
+ const { executions, isLoading, error, hasMore, loadMore } = useRunsList({
34
+ ...(status !== undefined ? { status } : {}),
35
+ ...(folderId !== undefined ? { folderId } : {}),
36
+ });
37
+ const scrollRef = useRef(null);
38
+ const rowVirtualizer = useVirtualizer({
39
+ count: executions.length,
40
+ getScrollElement: () => scrollRef.current,
41
+ estimateSize: () => ROW_HEIGHT,
42
+ overscan: 5,
43
+ });
44
+ // Load more when scrolled near the bottom
45
+ useEffect(() => {
46
+ const el = scrollRef.current;
47
+ if (!el)
48
+ return;
49
+ const onScroll = () => {
50
+ if (hasMore && el.scrollTop + el.clientHeight >= el.scrollHeight - ROW_HEIGHT * 2) {
51
+ loadMore();
52
+ }
53
+ };
54
+ el.addEventListener('scroll', onScroll, { passive: true });
55
+ return () => el.removeEventListener('scroll', onScroll);
56
+ }, [hasMore, loadMore]);
57
+ const virtualRows = rowVirtualizer.getVirtualItems();
58
+ const totalSize = rowVirtualizer.getTotalSize();
59
+ const paddingTop = virtualRows[0]?.start ?? 0;
60
+ const paddingBottom = virtualRows.length > 0 ? totalSize - (virtualRows[virtualRows.length - 1]?.end ?? 0) : 0;
61
+ return (_jsxs("div", { className: "flex flex-col gap-3 rounded-lg border border-[var(--wui-border)] bg-[var(--wui-bg)] p-4", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("h3", { className: "text-xs font-semibold uppercase tracking-wider text-[var(--wui-fg-muted)]", children: [label, " \u2014 Latest Runs"] }), _jsx("button", { type: "button", onClick: onClose, className: "rounded p-1 text-[var(--wui-fg-muted)] transition-colors hover:bg-[var(--wui-bg-subtle)] hover:text-[var(--wui-fg)]", "aria-label": "Close", children: _jsxs("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }), _jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })] }) })] }), isLoading ? (_jsx("div", { className: "flex items-center justify-center", style: { height: PANEL_HEIGHT }, children: _jsx(LoadingSpinner, { size: "sm" }) })) : error ? (_jsx("div", { className: "flex items-center justify-center text-xs text-[var(--wui-status-failed)]", style: { height: PANEL_HEIGHT }, children: "Failed to load runs" })) : executions.length === 0 ? (_jsx("div", { className: "flex items-center justify-center text-xs text-[var(--wui-fg-muted)]", style: { height: PANEL_HEIGHT }, children: "No runs found" })) : (_jsxs("div", { ref: scrollRef, style: { height: PANEL_HEIGHT, overflowY: 'auto' }, className: "rounded-md border border-[var(--wui-border)]", children: [_jsx("div", { className: "sticky top-0 z-10 grid grid-cols-[2fr_1fr_1fr_1fr] border-b border-[var(--wui-border)] bg-[var(--wui-bg)] px-3 py-2", children: ['Status', 'Execution ID', 'Workflow', 'Started'].map((col) => (_jsx("span", { className: "text-[10px] font-semibold uppercase tracking-widest text-[var(--wui-fg-muted)]", children: col }, col))) }), _jsxs("div", { style: { height: totalSize, position: 'relative' }, children: [paddingTop > 0 && _jsx("div", { style: { height: paddingTop } }), virtualRows.map((vRow) => {
62
+ const exec = executions[vRow.index];
63
+ const variant = mapStatus(exec.status);
64
+ return (_jsxs("div", { onClick: () => onSelectExecution(exec.id, exec.workflowId), style: { position: 'absolute', top: 0, left: 0, width: '100%', height: ROW_HEIGHT, transform: `translateY(${vRow.start}px)` }, className: "grid cursor-pointer grid-cols-[2fr_1fr_1fr_1fr] items-center border-b border-[var(--wui-border)] px-3 transition-colors hover:bg-[var(--wui-bg-subtle)]", children: [_jsx(StatusBadge, { status: variant }), _jsx("code", { className: "font-mono text-[11px] text-[var(--wui-fg-muted)]", children: exec.id.slice(0, 8) }), _jsx("span", { className: "truncate text-[12px] text-[var(--wui-fg)]", children: exec.workflowId }), _jsx("span", { className: "text-[11px] text-[var(--wui-fg-muted)]", children: timeAgo(exec.createdAt) })] }, exec.id));
65
+ }), paddingBottom > 0 && _jsx("div", { style: { height: paddingBottom } })] }), hasMore && (_jsx("div", { className: "flex items-center justify-center py-2 text-[11px] text-[var(--wui-fg-muted)]", children: "Loading more\u2026" }))] }))] }));
66
+ }
67
+ //# sourceMappingURL=FilteredRunsPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilteredRunsPanel.js","sourceRoot":"","sources":["../../../src/components/analytics/FilteredRunsPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { FolderRecord } from '@xyne/workflow-sdk/client';
2
+ interface FolderCardProps {
3
+ folder: FolderRecord;
4
+ total: number;
5
+ active: number;
6
+ onClick: () => void;
7
+ }
8
+ export declare function FolderCard({ folder, total, active, onClick }: FolderCardProps): import("react").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=FolderCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FolderCard.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/FolderCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,UAAU,eAAe;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,eAAe,+BAqE7E"}
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function FolderCard({ folder, total, active, onClick }) {
3
+ const fillPct = total > 0 ? Math.min(100, Math.round((active / total) * 100)) : 0;
4
+ const stopped = total - active;
5
+ const barColor = fillPct >= 80
6
+ ? 'var(--wui-status-completed)'
7
+ : fillPct >= 50
8
+ ? 'var(--wui-status-paused)'
9
+ : 'var(--wui-status-failed)';
10
+ return (_jsxs("button", { type: "button", onClick: onClick, className: "group flex w-full overflow-hidden rounded-xl border border-[var(--wui-border)] text-left transition-all hover:border-[var(--wui-primary)] hover:shadow-md", style: { background: 'var(--wui-bg, #ffffff)' }, children: [_jsx("div", { className: "w-[3px] shrink-0 bg-[var(--wui-primary)] opacity-80" }), _jsxs("div", { className: "flex flex-1 flex-col", children: [_jsxs("div", { className: "flex flex-col gap-4 p-4", children: [_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-base font-bold text-[var(--wui-fg)]", children: folder.name }), _jsxs("span", { className: "text-xs text-[var(--wui-fg-muted)]", children: [total, " workflows"] })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsxs("div", { className: "flex items-center justify-between text-xs", children: [_jsx("span", { className: "text-[var(--wui-fg-muted)]", children: "Active rate" }), _jsxs("span", { className: "font-semibold text-[var(--wui-primary)]", children: [fillPct, "%"] })] }), _jsx("div", { className: "h-1.5 w-full overflow-hidden rounded-full bg-[var(--wui-border)]", children: _jsx("div", { className: "h-full rounded-full transition-all", style: { width: `${fillPct}%`, backgroundColor: barColor } }) })] }), _jsxs("div", { className: "flex items-center gap-4 text-xs text-[var(--wui-fg-muted)]", children: [_jsxs("span", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "h-2 w-2 shrink-0 rounded-full bg-[var(--wui-status-completed)]" }), _jsx("span", { className: "font-medium text-[var(--wui-fg)]", children: active })] }), _jsxs("span", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "h-2 w-2 shrink-0 rounded-full bg-[var(--wui-status-failed)]" }), _jsx("span", { className: "font-medium text-[var(--wui-fg)]", children: stopped })] }), _jsxs("span", { className: "text-[var(--wui-fg-muted)]", children: [active, " active \u00B7 ", stopped, " stopped"] })] })] }), _jsx("div", { className: "mt-auto flex justify-end border-t border-[var(--wui-border)] px-4 py-2.5", children: _jsx("span", { className: "text-xs font-medium text-[var(--wui-primary)] transition-opacity group-hover:opacity-80", children: "View workflows \u2192" }) })] })] }));
11
+ }
12
+ //# sourceMappingURL=FolderCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FolderCard.js","sourceRoot":"","sources":["../../../src/components/analytics/FolderCard.tsx"],"names":[],"mappings":";AASA,MAAM,UAAU,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAmB;IAC5E,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,MAAM,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;IAE/B,MAAM,QAAQ,GACZ,OAAO,IAAI,EAAE;QACX,CAAC,CAAC,6BAA6B;QAC/B,CAAC,CAAC,OAAO,IAAI,EAAE;YACb,CAAC,CAAC,0BAA0B;YAC5B,CAAC,CAAC,0BAA0B,CAAC;IAEnC,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,2JAA2J,EACrK,KAAK,EAAE,EAAE,UAAU,EAAE,wBAAwB,EAAE,aAG/C,cAAK,SAAS,EAAC,qDAAqD,GAAG,EAGvE,eAAK,SAAS,EAAC,sBAAsB,aACnC,eAAK,SAAS,EAAC,yBAAyB,aAEtC,eAAK,SAAS,EAAC,uBAAuB,aACpC,eAAM,SAAS,EAAC,0CAA0C,YAAE,MAAM,CAAC,IAAI,GAAQ,EAC/E,gBAAM,SAAS,EAAC,oCAAoC,aAAE,KAAK,kBAAkB,IACzE,EAGN,eAAK,SAAS,EAAC,uBAAuB,aACpC,eAAK,SAAS,EAAC,2CAA2C,aACxD,eAAM,SAAS,EAAC,4BAA4B,4BAAmB,EAC/D,gBAAM,SAAS,EAAC,yCAAyC,aAAE,OAAO,SAAS,IACvE,EACN,cAAK,SAAS,EAAC,kEAAkE,YAC/E,cACE,SAAS,EAAC,oCAAoC,EAC9C,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,OAAO,GAAG,EAAE,eAAe,EAAE,QAAQ,EAAE,GAC1D,GACE,IACF,EAGN,eAAK,SAAS,EAAC,4DAA4D,aACzE,gBAAM,SAAS,EAAC,2BAA2B,aACzC,eAAM,SAAS,EAAC,gEAAgE,GAAG,EACnF,eAAM,SAAS,EAAC,kCAAkC,YAAE,MAAM,GAAQ,IAC7D,EACP,gBAAM,SAAS,EAAC,2BAA2B,aACzC,eAAM,SAAS,EAAC,6DAA6D,GAAG,EAChF,eAAM,SAAS,EAAC,kCAAkC,YAAE,OAAO,GAAQ,IAC9D,EACP,gBAAM,SAAS,EAAC,4BAA4B,aACzC,MAAM,qBAAY,OAAO,gBACrB,IACH,IACF,EAGN,cAAK,SAAS,EAAC,0EAA0E,YACvF,eAAM,SAAS,EAAC,yFAAyF,sCAElG,GACH,IACF,IACC,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { FolderRecord } from '@xyne/workflow-sdk/client';
2
+ interface FolderGridProps {
3
+ onSelect: (folder: FolderRecord) => void;
4
+ }
5
+ export declare function FolderGrid({ onSelect }: FolderGridProps): import("react").JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=FolderGrid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FolderGrid.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/FolderGrid.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAM9D,UAAU,eAAe;IACvB,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;CAC1C;AAED,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,EAAE,eAAe,+BAmFvD"}
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { useFolderList } from '../../hooks/use-folder-list.js';
4
+ import { useWorkflowCounts } from '../../hooks/use-workflow-counts.js';
5
+ import { LoadingSpinner } from '../shared/LoadingSpinner.js';
6
+ import { FolderCard } from './FolderCard.js';
7
+ export function FolderGrid({ onSelect }) {
8
+ const { folders, isLoading: foldersLoading, error } = useFolderList();
9
+ const { byFolder, isLoading: countsLoading } = useWorkflowCounts();
10
+ const [search, setSearch] = useState('');
11
+ const isLoading = foldersLoading || countsLoading;
12
+ if (isLoading) {
13
+ return (_jsx("div", { className: "flex h-48 items-center justify-center", "aria-label": "Loading folders", children: _jsx(LoadingSpinner, { size: "lg" }) }));
14
+ }
15
+ if (error) {
16
+ return (_jsx("div", { className: "flex h-48 items-center justify-center text-sm text-[var(--wui-status-failed)]", children: "Failed to load folders" }));
17
+ }
18
+ if (folders.length === 0) {
19
+ return (_jsx("div", { className: "flex h-48 items-center justify-center text-sm text-[var(--wui-fg-muted)]", children: "No folders found" }));
20
+ }
21
+ const filtered = search.trim()
22
+ ? folders.filter((f) => f.name.toLowerCase().includes(search.toLowerCase()))
23
+ : folders;
24
+ return (_jsxs("div", { className: "flex flex-col gap-4", children: [_jsxs("div", { className: "relative w-full max-w-xs", children: [_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "pointer-events-none absolute left-2.5 top-1/2 -translate-y-1/2 text-[var(--wui-fg-muted)]", children: [_jsx("circle", { cx: "11", cy: "11", r: "8" }), _jsx("path", { d: "m21 21-4.3-4.3" })] }), _jsx("input", { type: "text", value: search, onChange: (e) => setSearch(e.target.value), placeholder: "Search folders...", className: "w-full rounded-md border border-[var(--wui-border)] py-1.5 pl-8 pr-3 text-xs text-[var(--wui-fg)] outline-none transition-colors placeholder:text-[var(--wui-fg-muted)] focus:border-[var(--wui-primary)]", style: { background: 'var(--wui-bg, #ffffff)' } })] }), filtered.length === 0 ? (_jsxs("div", { className: "flex h-32 items-center justify-center text-sm text-[var(--wui-fg-muted)]", children: ["No folders match \"", search, "\""] })) : (_jsx("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3", children: filtered.map((folder) => {
25
+ const counts = byFolder[folder.id] ?? { total: 0, active: 0 };
26
+ return (_jsx(FolderCard, { folder: folder, total: counts.total, active: counts.active, onClick: () => onSelect(folder) }, folder.id));
27
+ }) }))] }));
28
+ }
29
+ //# sourceMappingURL=FolderGrid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FolderGrid.js","sourceRoot":"","sources":["../../../src/components/analytics/FolderGrid.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { AnalyticsData } from '../../hooks/use-analytics.js';
2
+ type RecentFailure = AnalyticsData['recentFailures'][number];
3
+ export interface RecentFailuresPanelProps {
4
+ failures: RecentFailure[];
5
+ onSelect: (failure: RecentFailure) => void;
6
+ }
7
+ export declare function RecentFailuresPanel({ failures, onSelect }: RecentFailuresPanelProps): import("react").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=RecentFailuresPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecentFailuresPanel.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/RecentFailuresPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,KAAK,aAAa,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;CAC5C;AAKD,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,wBAAwB,+BAiDnF"}
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useRef } from 'react';
3
+ import { useVirtualizer } from '@tanstack/react-virtual';
4
+ const ROW_HEIGHT = 46;
5
+ const MAX_VISIBLE_ROWS = 6;
6
+ export function RecentFailuresPanel({ failures, onSelect }) {
7
+ const parentRef = useRef(null);
8
+ const virtualizer = useVirtualizer({
9
+ count: failures.length,
10
+ getScrollElement: () => parentRef.current,
11
+ estimateSize: () => ROW_HEIGHT,
12
+ overscan: 3,
13
+ });
14
+ const containerHeight = Math.min(failures.length, MAX_VISIBLE_ROWS) * ROW_HEIGHT;
15
+ return (_jsx("div", { ref: parentRef, style: { height: containerHeight, overflowY: 'auto' }, children: _jsx("div", { style: { height: virtualizer.getTotalSize(), position: 'relative' }, children: virtualizer.getVirtualItems().map((vItem) => {
16
+ const f = failures[vItem.index];
17
+ return (_jsxs("button", { type: "button", onClick: () => onSelect(f), style: {
18
+ position: 'absolute',
19
+ top: 0,
20
+ left: 0,
21
+ width: '100%',
22
+ height: ROW_HEIGHT,
23
+ transform: `translateY(${vItem.start}px)`,
24
+ }, className: "flex items-center gap-3 border-b border-[var(--wui-border)] px-1 text-left transition-colors hover:bg-[var(--wui-bg-subtle)]", children: [_jsx("span", { className: "h-1.5 w-1.5 shrink-0 rounded-full bg-[var(--wui-status-failed)]" }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "block truncate text-xs font-medium text-[var(--wui-fg)]", children: f.workflowName }), _jsx("span", { className: "block font-mono text-[11px] text-[var(--wui-fg-muted)]", children: f.executionId.slice(0, 8) })] }), _jsx("span", { className: "shrink-0 text-[11px] text-[var(--wui-fg-muted)]", children: f.createdAt.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }) }), _jsx("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "shrink-0 text-[var(--wui-fg-muted)]", children: _jsx("polyline", { points: "9 18 15 12 9 6" }) })] }, f.executionId));
25
+ }) }) }));
26
+ }
27
+ //# sourceMappingURL=RecentFailuresPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecentFailuresPanel.js","sourceRoot":"","sources":["../../../src/components/analytics/RecentFailuresPanel.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAUzD,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B,MAAM,UAAU,mBAAmB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAA4B;IAClF,MAAM,SAAS,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAE/C,MAAM,WAAW,GAAG,cAAc,CAAC;QACjC,KAAK,EAAE,QAAQ,CAAC,MAAM;QACtB,gBAAgB,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO;QACzC,YAAY,EAAE,GAAG,EAAE,CAAC,UAAU;QAC9B,QAAQ,EAAE,CAAC;KACZ,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,UAAU,CAAC;IAEjF,OAAO,CACL,cAAK,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,EAAE,YACxE,cAAK,KAAK,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,YACrE,WAAW,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC3C,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC;gBACjC,OAAO,CACL,kBAEE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAC1B,KAAK,EAAE;wBACL,QAAQ,EAAE,UAAU;wBACpB,GAAG,EAAE,CAAC;wBACN,IAAI,EAAE,CAAC;wBACP,KAAK,EAAE,MAAM;wBACb,MAAM,EAAE,UAAU;wBAClB,SAAS,EAAE,cAAc,KAAK,CAAC,KAAK,KAAK;qBAC1C,EACD,SAAS,EAAC,8HAA8H,aAExI,eAAM,SAAS,EAAC,iEAAiE,GAAG,EACpF,gBAAM,SAAS,EAAC,gBAAgB,aAC9B,eAAM,SAAS,EAAC,yDAAyD,YAAE,CAAC,CAAC,YAAY,GAAQ,EACjG,eAAM,SAAS,EAAC,wDAAwD,YAAE,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAQ,IACtG,EACP,eAAM,SAAS,EAAC,iDAAiD,YAC9D,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,GACzG,EACP,cAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,GAAG,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,SAAS,EAAC,qCAAqC,YAC5L,mBAAU,MAAM,EAAC,gBAAgB,GAAG,GAChC,KAvBD,CAAC,CAAC,WAAW,CAwBX,CACV,CAAC;YACJ,CAAC,CAAC,GACE,GACF,CACP,CAAC;AACJ,CAAC"}
@@ -5,6 +5,8 @@ export interface StatCardProps {
5
5
  total?: number;
6
6
  color?: string;
7
7
  className?: string;
8
+ active?: boolean;
9
+ onClick?: () => void;
8
10
  }
9
- export declare function StatCard({ label, value, percent, total, color, className }: StatCardProps): import("react").JSX.Element;
11
+ export declare function StatCard({ label, value, percent, total, color, className, active, onClick }: StatCardProps): import("react").JSX.Element;
10
12
  //# sourceMappingURL=StatCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"StatCard.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/StatCard.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAA4B,EAAE,SAAS,EAAE,EAAE,aAAa,+BAuBhH"}
1
+ {"version":3,"file":"StatCard.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/StatCard.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,aAAa,+BAiC1G"}
@@ -1,11 +1,15 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { cn } from '../shared/cn.js';
3
- export function StatCard({ label, value, percent, total, color = 'var(--wui-primary)', className }) {
3
+ export function StatCard({ label, value, percent, total, color, className, active, onClick }) {
4
4
  const display = total !== undefined
5
5
  ? `${value}/${total}`
6
6
  : percent
7
7
  ? `${value}%`
8
8
  : String(value);
9
- return (_jsxs("div", { className: cn('flex flex-col justify-center gap-1.5 rounded-lg border border-[var(--wui-border)] bg-[var(--wui-bg)] px-4 py-5', className), children: [_jsx("span", { className: "text-3xl font-bold tabular-nums leading-none", style: { color }, children: display }), _jsx("span", { className: "text-xs text-[var(--wui-fg-muted)]", children: label })] }));
9
+ return (_jsxs("div", { onClick: onClick, className: cn('flex min-w-[110px] flex-1 flex-col gap-1.5 rounded-lg border px-4 py-3.5 transition-all duration-150', onClick ? 'cursor-pointer' : '', active ? 'border-[var(--wui-primary)]' : 'border-[var(--wui-border)]', className), style: {
10
+ background: active
11
+ ? 'var(--wui-primary-light, #eef2ff)'
12
+ : 'var(--wui-bg, #ffffff)',
13
+ }, children: [_jsx("span", { className: "text-[10px] font-semibold uppercase tracking-wider text-[var(--wui-fg-muted)]", children: label }), _jsx("span", { className: "text-2xl font-bold tabular-nums leading-none", style: { color: color ?? 'var(--wui-fg)' }, children: display })] }));
10
14
  }
11
15
  //# sourceMappingURL=StatCard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StatCard.js","sourceRoot":"","sources":["../../../src/components/analytics/StatCard.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAWrC,MAAM,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,oBAAoB,EAAE,SAAS,EAAiB;IAC/G,MAAM,OAAO,GAAG,KAAK,KAAK,SAAS;QACjC,CAAC,CAAC,GAAG,KAAK,IAAI,KAAK,EAAE;QACrB,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,GAAG,KAAK,GAAG;YACb,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAElB,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,gHAAgH,EAChH,SAAS,CACV,aAED,eACE,SAAS,EAAC,8CAA8C,EACxD,KAAK,EAAE,EAAE,KAAK,EAAE,YAEf,OAAO,GACH,EACP,eAAM,SAAS,EAAC,oCAAoC,YAAE,KAAK,GAAQ,IAC/D,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"StatCard.js","sourceRoot":"","sources":["../../../src/components/analytics/StatCard.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAarC,MAAM,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAiB;IACzG,MAAM,OAAO,GAAG,KAAK,KAAK,SAAS;QACjC,CAAC,CAAC,GAAG,KAAK,IAAI,KAAK,EAAE;QACrB,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,GAAG,KAAK,GAAG;YACb,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAElB,OAAO,CACL,eACE,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,EAAE,CACX,sGAAsG,EACtG,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,EAC/B,MAAM,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,4BAA4B,EACrE,SAAS,CACV,EACD,KAAK,EAAE;YACL,UAAU,EAAE,MAAM;gBAChB,CAAC,CAAC,mCAAmC;gBACrC,CAAC,CAAC,wBAAwB;SAC7B,aAED,eAAM,SAAS,EAAC,+EAA+E,YAC5F,KAAK,GACD,EACP,eACE,SAAS,EAAC,8CAA8C,EACxD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,IAAI,eAAe,EAAE,YAEzC,OAAO,GACH,IACH,CACP,CAAC;AACJ,CAAC"}
@@ -1,8 +1,8 @@
1
- import type { AnalyticsData } from '../../hooks/use-analytics.js';
2
- type RecentFailure = AnalyticsData['recentFailures'][number];
3
1
  export interface TopErrorsPanelProps {
4
- failures: RecentFailure[];
2
+ since: string;
3
+ folderId?: string;
4
+ onSelectRun?: (executionId: string, workflowId: string) => void;
5
+ onLoad?: (hasErrors: boolean) => void;
5
6
  }
6
- export declare function TopErrorsPanel({ failures }: TopErrorsPanelProps): import("react").JSX.Element;
7
- export {};
7
+ export declare function TopErrorsPanel({ since, folderId, onSelectRun, onLoad }: TopErrorsPanelProps): import("react").JSX.Element;
8
8
  //# sourceMappingURL=TopErrorsPanel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TopErrorsPanel.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/TopErrorsPanel.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAIlE,KAAK,aAAa,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAqB7D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE,mBAAmB,+BAoG/D"}
1
+ {"version":3,"file":"TopErrorsPanel.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/TopErrorsPanel.tsx"],"names":[],"mappings":"AASA,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC;AAED,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,mBAAmB,+BA+F3F"}
@@ -2,62 +2,32 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useState } from 'react';
3
3
  import { useWorkflowClient } from '../../hooks/use-workflow-client.js';
4
4
  import { LoadingSpinner } from '../shared/LoadingSpinner.js';
5
- function parseFailedStepError(data) {
6
- if (!data)
7
- return undefined;
8
- try {
9
- return JSON.parse(data).error;
10
- }
11
- catch {
12
- return undefined;
13
- }
14
- }
15
5
  function truncate(str, max) {
16
6
  return str.length > max ? str.slice(0, max) + '…' : str;
17
7
  }
18
- export function TopErrorsPanel({ failures }) {
8
+ export function TopErrorsPanel({ since, folderId, onSelectRun, onLoad }) {
19
9
  const client = useWorkflowClient();
20
10
  const [groups, setGroups] = useState([]);
21
11
  const [isLoading, setIsLoading] = useState(true);
12
+ const [expandedIndex, setExpandedIndex] = useState(null);
22
13
  useEffect(() => {
23
- if (failures.length === 0) {
24
- setGroups([]);
25
- setIsLoading(false);
26
- return;
27
- }
28
14
  let cancelled = false;
29
15
  setIsLoading(true);
30
- void Promise.all(failures.map((f) => client.executions.get(f.executionId).then((detail) => {
31
- const failedStep = detail.steps.find((s) => s.status === 'FAILED');
32
- const error = failedStep ? parseFailedStepError(failedStep.data) : undefined;
33
- return { workflowName: f.workflowName, error: error ?? 'Unknown error' };
34
- }).catch(() => ({ workflowName: f.workflowName, error: 'Unknown error' })))).then((results) => {
35
- if (cancelled)
36
- return;
37
- const map = new Map();
38
- for (const { workflowName, error } of results) {
39
- const existing = map.get(error);
40
- if (existing) {
41
- existing.count++;
42
- existing.workflows.add(workflowName);
43
- }
44
- else {
45
- map.set(error, { count: 1, workflows: new Set([workflowName]) });
46
- }
16
+ setExpandedIndex(null);
17
+ void client.analytics.topErrors({ since, limit: 5, ...(folderId !== undefined ? { folderId } : {}) }).then((res) => {
18
+ if (!cancelled) {
19
+ setGroups(res.topErrors);
20
+ setIsLoading(false);
21
+ onLoad?.(res.topErrors.length > 0);
22
+ }
23
+ }).catch(() => {
24
+ if (!cancelled) {
25
+ setIsLoading(false);
26
+ onLoad?.(false);
47
27
  }
48
- const sorted = Array.from(map.entries())
49
- .map(([message, { count, workflows }]) => ({
50
- message,
51
- count,
52
- workflows: Array.from(workflows),
53
- }))
54
- .sort((a, b) => b.count - a.count)
55
- .slice(0, 5);
56
- setGroups(sorted);
57
- setIsLoading(false);
58
28
  });
59
29
  return () => { cancelled = true; };
60
- }, [client, failures]);
30
+ }, [client, since, folderId]);
61
31
  if (isLoading) {
62
32
  return (_jsx("div", { className: "flex h-32 items-center justify-center", children: _jsx(LoadingSpinner, { size: "sm" }) }));
63
33
  }
@@ -65,6 +35,9 @@ export function TopErrorsPanel({ failures }) {
65
35
  return (_jsx("div", { className: "flex h-16 items-center justify-center text-xs text-[var(--wui-fg-muted)]", children: "No errors in this period" }));
66
36
  }
67
37
  const maxCount = groups[0]?.count ?? 1;
68
- return (_jsx("div", { className: "flex flex-col gap-2.5", children: groups.map((g, i) => (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx("span", { className: "min-w-0 flex-1 truncate text-[12px] font-medium text-[var(--wui-fg)]", title: g.message, children: truncate(g.message, 60) }), _jsxs("span", { className: "shrink-0 rounded-full bg-[var(--wui-status-failed)]/15 px-2 py-0.5 text-[11px] font-semibold text-[var(--wui-status-failed)]", children: ["\u00D7", g.count] })] }), _jsx("div", { className: "h-1.5 w-full overflow-hidden rounded-full bg-[var(--wui-bg-subtle)]", children: _jsx("div", { className: "h-full rounded-full bg-[var(--wui-status-failed)]/60", style: { width: `${Math.round((g.count / maxCount) * 100)}%` } }) }), _jsx("span", { className: "text-[10px] text-[var(--wui-fg-muted)]", children: g.workflows.join(', ') })] }, i))) }));
38
+ return (_jsx("div", { className: "flex flex-col gap-2", children: groups.map((g, i) => {
39
+ const isExpanded = expandedIndex === i;
40
+ return (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsxs("button", { type: "button", onClick: () => setExpandedIndex(isExpanded ? null : i), className: "flex w-full items-center gap-2 text-left", children: [_jsx("span", { className: "min-w-0 flex-1 truncate text-[12px] font-medium text-[var(--wui-fg)]", title: g.message, children: truncate(g.message, 60) }), _jsxs("span", { className: "shrink-0 rounded-full bg-[var(--wui-status-failed)]/15 px-2 py-0.5 text-[11px] font-semibold text-[var(--wui-status-failed)]", children: ["\u00D7", g.count] }), _jsx("svg", { width: "10", height: "10", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", className: `shrink-0 text-[var(--wui-fg-muted)] transition-transform ${isExpanded ? 'rotate-180' : ''}`, children: _jsx("polyline", { points: "6 9 12 15 18 9" }) })] }), _jsx("div", { className: "h-1.5 w-full overflow-hidden rounded-full bg-[var(--wui-bg-subtle)]", children: _jsx("div", { className: "h-full rounded-full bg-[var(--wui-status-failed)]/60", style: { width: `${Math.round((g.count / maxCount) * 100)}%` } }) }), isExpanded && (_jsx("div", { className: "mt-1 flex max-h-[120px] flex-wrap gap-1 overflow-y-auto", children: g.runs.map((run) => (_jsx("button", { type: "button", onClick: () => onSelectRun?.(run.id, run.workflowId), className: "rounded-md border border-[var(--wui-border)] bg-[var(--wui-bg-subtle)] px-1.5 py-0.5 font-mono text-[10px] text-[var(--wui-fg-muted)] transition-colors hover:border-[var(--wui-primary)] hover:text-[var(--wui-primary)]", children: run.id.slice(0, 8) }, run.id))) }))] }, i));
41
+ }) }));
69
42
  }
70
43
  //# sourceMappingURL=TopErrorsPanel.js.map