@xyne/workflow-ui 0.1.1 → 0.1.3

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 (58) hide show
  1. package/dist/components/analytics/AnalyticsDashboard.d.ts +5 -0
  2. package/dist/components/analytics/AnalyticsDashboard.d.ts.map +1 -0
  3. package/dist/components/analytics/AnalyticsDashboard.js +67 -0
  4. package/dist/components/analytics/AnalyticsDashboard.js.map +1 -0
  5. package/dist/components/analytics/RunsTimeSeries.d.ts +10 -0
  6. package/dist/components/analytics/RunsTimeSeries.d.ts.map +1 -0
  7. package/dist/components/analytics/RunsTimeSeries.js +30 -0
  8. package/dist/components/analytics/RunsTimeSeries.js.map +1 -0
  9. package/dist/components/analytics/StatCard.d.ts +10 -0
  10. package/dist/components/analytics/StatCard.d.ts.map +1 -0
  11. package/dist/components/analytics/StatCard.js +11 -0
  12. package/dist/components/analytics/StatCard.js.map +1 -0
  13. package/dist/components/analytics/StatusPieChart.d.ts +7 -0
  14. package/dist/components/analytics/StatusPieChart.d.ts.map +1 -0
  15. package/dist/components/analytics/StatusPieChart.js +40 -0
  16. package/dist/components/analytics/StatusPieChart.js.map +1 -0
  17. package/dist/components/analytics/TimeRangeSelector.d.ts +8 -0
  18. package/dist/components/analytics/TimeRangeSelector.d.ts.map +1 -0
  19. package/dist/components/analytics/TimeRangeSelector.js +9 -0
  20. package/dist/components/analytics/TimeRangeSelector.js.map +1 -0
  21. package/dist/components/analytics/TopErrorsPanel.d.ts +8 -0
  22. package/dist/components/analytics/TopErrorsPanel.d.ts.map +1 -0
  23. package/dist/components/analytics/TopErrorsPanel.js +70 -0
  24. package/dist/components/analytics/TopErrorsPanel.js.map +1 -0
  25. package/dist/components/analytics/WorkflowRunsPanel.d.ts +7 -0
  26. package/dist/components/analytics/WorkflowRunsPanel.d.ts.map +1 -0
  27. package/dist/components/analytics/WorkflowRunsPanel.js +85 -0
  28. package/dist/components/analytics/WorkflowRunsPanel.js.map +1 -0
  29. package/dist/components/analytics/WorkflowsTable.d.ts +11 -0
  30. package/dist/components/analytics/WorkflowsTable.d.ts.map +1 -0
  31. package/dist/components/analytics/WorkflowsTable.js +54 -0
  32. package/dist/components/analytics/WorkflowsTable.js.map +1 -0
  33. package/dist/components/analytics/index.d.ts +17 -0
  34. package/dist/components/analytics/index.d.ts.map +1 -0
  35. package/dist/components/analytics/index.js +9 -0
  36. package/dist/components/analytics/index.js.map +1 -0
  37. package/dist/components/builder/v3/WorkflowBuilderV3.d.ts +1 -1
  38. package/dist/components/builder/v3/WorkflowBuilderV3.d.ts.map +1 -1
  39. package/dist/components/builder/v3/WorkflowBuilderV3.js +35 -3
  40. package/dist/components/builder/v3/WorkflowBuilderV3.js.map +1 -1
  41. package/dist/components/index.d.ts +2 -0
  42. package/dist/components/index.d.ts.map +1 -1
  43. package/dist/components/index.js +2 -0
  44. package/dist/components/index.js.map +1 -1
  45. package/dist/components/runs/RunsTable.d.ts +3 -1
  46. package/dist/components/runs/RunsTable.d.ts.map +1 -1
  47. package/dist/components/runs/RunsTable.js +3 -3
  48. package/dist/components/runs/RunsTable.js.map +1 -1
  49. package/dist/hooks/use-analytics.d.ts +44 -0
  50. package/dist/hooks/use-analytics.d.ts.map +1 -0
  51. package/dist/hooks/use-analytics.js +149 -0
  52. package/dist/hooks/use-analytics.js.map +1 -0
  53. package/dist/index.d.ts +4 -2
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +5 -1
  56. package/dist/index.js.map +1 -1
  57. package/dist/styles.css +1 -1
  58. package/package.json +12 -8
@@ -0,0 +1,5 @@
1
+ export interface AnalyticsDashboardProps {
2
+ className?: string;
3
+ }
4
+ export declare function AnalyticsDashboard({ className }: AnalyticsDashboardProps): import("react").JSX.Element;
5
+ //# sourceMappingURL=AnalyticsDashboard.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,67 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { useAnalytics } from '../../hooks/use-analytics.js';
4
+ import { LoadingSpinner } from '../shared/LoadingSpinner.js';
5
+ import { cn } from '../shared/cn.js';
6
+ import { StatCard } from './StatCard.js';
7
+ import { TimeRangeSelector } from './TimeRangeSelector.js';
8
+ import { RunsTimeSeries } from './RunsTimeSeries.js';
9
+ import { StatusPieChart } from './StatusPieChart.js';
10
+ import { TopErrorsPanel } from './TopErrorsPanel.js';
11
+ import { WorkflowsTable } from './WorkflowsTable.js';
12
+ import { WorkflowRunsPanel } from './WorkflowRunsPanel.js';
13
+ import { ExecutionViewer } from '../execution/ExecutionViewer.js';
14
+ 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] }));
16
+ }
17
+ function Breadcrumb({ view, onNavigate, }) {
18
+ const crumbs = [
19
+ {
20
+ label: 'Workflows',
21
+ onClick: view.level !== 'workflows' ? () => onNavigate({ level: 'workflows' }) : undefined,
22
+ },
23
+ ];
24
+ if (view.level === 'runs' || view.level === 'steps') {
25
+ crumbs.push({
26
+ label: view.workflowName,
27
+ onClick: view.level === 'steps'
28
+ ? () => onNavigate({ level: 'runs', workflowId: view.workflowId, workflowName: view.workflowName })
29
+ : undefined,
30
+ });
31
+ }
32
+ if (view.level === 'steps') {
33
+ crumbs.push({ label: `Run ${view.executionId.slice(0, 8)}` });
34
+ }
35
+ 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
+ }
37
+ export function AnalyticsDashboard({ className }) {
38
+ const [range, setRange] = useState(7);
39
+ const [view, setView] = useState({ level: 'workflows' });
40
+ const [workflowSearch, setWorkflowSearch] = useState('');
41
+ const { data, isLoading, error } = useAnalytics(range);
42
+ if (isLoading) {
43
+ return (_jsx("div", { className: "flex h-full items-center justify-center", "aria-label": "Loading", children: _jsx(LoadingSpinner, { size: "lg" }) }));
44
+ }
45
+ if (error || !data) {
46
+ return (_jsx("div", { className: "flex h-full items-center justify-center text-sm text-[var(--wui-status-failed)]", children: "Failed to load analytics" }));
47
+ }
48
+ // Full-screen execution view — replaces dashboard when a run is selected
49
+ 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 }) })] }));
51
+ }
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) => {
58
+ const wf = data.byWorkflow.find((w) => w.workflowId === workflowId);
59
+ 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
+ }) }))] })] }));
66
+ }
67
+ //# sourceMappingURL=AnalyticsDashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalyticsDashboard.js","sourceRoot":"","sources":["../../../src/components/analytics/AnalyticsDashboard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { AnalyticsData } from '../../hooks/use-analytics.js';
2
+ type DayBucket = AnalyticsData['runsByDay'][number];
3
+ export interface RunsTimeSeriesProps {
4
+ data: DayBucket[];
5
+ height?: number;
6
+ className?: string;
7
+ }
8
+ export declare function RunsTimeSeries({ data, height, className }: RunsTimeSeriesProps): import("react").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=RunsTimeSeries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunsTimeSeries.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/RunsTimeSeries.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,KAAK,SAAS,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAkBpD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,MAAY,EAAE,SAAS,EAAE,EAAE,mBAAmB,+BAiDpF"}
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { LineChart, Line, XAxis, YAxis, Tooltip, Legend, ResponsiveContainer, CartesianGrid, } from 'recharts';
3
+ const STATUS_COLORS = {
4
+ COMPLETED: 'var(--wui-status-completed)',
5
+ FAILED: 'var(--wui-status-failed)',
6
+ RUNNING: 'var(--wui-status-running)',
7
+ CANCELLED: 'var(--wui-status-pending)',
8
+ };
9
+ const STATUS_LABELS = {
10
+ COMPLETED: 'Completed',
11
+ FAILED: 'Failed',
12
+ RUNNING: 'Running',
13
+ CANCELLED: 'Cancelled',
14
+ };
15
+ const STATUS_ORDER = ['COMPLETED', 'FAILED', 'RUNNING', 'CANCELLED'];
16
+ function formatDateLabel(date) {
17
+ const d = new Date(date);
18
+ if (Number.isNaN(d.getTime()))
19
+ return date;
20
+ return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });
21
+ }
22
+ export function RunsTimeSeries({ data, height = 200, className }) {
23
+ return (_jsx("div", { className: className, "aria-label": "Runs per day", style: { width: '100%', height }, children: _jsx(ResponsiveContainer, { width: "100%", height: "100%", children: _jsxs(LineChart, { data: data, margin: { top: 4, right: 8, left: -16, bottom: 0 }, children: [_jsx(CartesianGrid, { strokeDasharray: "3 3", stroke: "var(--wui-border)", vertical: false }), _jsx(XAxis, { dataKey: "date", tickFormatter: formatDateLabel, tick: { fontSize: 10, fill: 'var(--wui-fg-muted)' }, axisLine: { stroke: 'var(--wui-border)' }, tickLine: false }), _jsx(YAxis, { allowDecimals: false, tick: { fontSize: 10, fill: 'var(--wui-fg-muted)' }, axisLine: false, tickLine: false }), _jsx(Tooltip, { labelFormatter: (label) => formatDateLabel(String(label)), formatter: (value, name) => [value, STATUS_LABELS[String(name)] ?? String(name)], contentStyle: {
24
+ fontSize: 12,
25
+ background: 'var(--wui-bg)',
26
+ border: '1px solid var(--wui-border)',
27
+ borderRadius: 6,
28
+ } }), _jsx(Legend, { formatter: (value) => STATUS_LABELS[value] ?? value, wrapperStyle: { fontSize: 11, color: 'var(--wui-fg-muted)' } }), STATUS_ORDER.map((status) => (_jsx(Line, { type: "monotone", dataKey: status, stroke: STATUS_COLORS[status] ?? 'var(--wui-fg-muted)', name: status, strokeWidth: 2, dot: false, activeDot: { r: 3 } }, status)))] }) }) }));
29
+ }
30
+ //# sourceMappingURL=RunsTimeSeries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunsTimeSeries.js","sourceRoot":"","sources":["../../../src/components/analytics/RunsTimeSeries.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface StatCardProps {
2
+ label: string;
3
+ value: number;
4
+ percent?: boolean;
5
+ total?: number;
6
+ color?: string;
7
+ className?: string;
8
+ }
9
+ export declare function StatCard({ label, value, percent, total, color, className }: StatCardProps): import("react").JSX.Element;
10
+ //# sourceMappingURL=StatCard.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from '../shared/cn.js';
3
+ export function StatCard({ label, value, percent, total, color = 'var(--wui-primary)', className }) {
4
+ const display = total !== undefined
5
+ ? `${value}/${total}`
6
+ : percent
7
+ ? `${value}%`
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 })] }));
10
+ }
11
+ //# sourceMappingURL=StatCard.js.map
@@ -0,0 +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"}
@@ -0,0 +1,7 @@
1
+ export interface StatusPieChartProps {
2
+ byStatus: Record<string, number>;
3
+ height?: number;
4
+ className?: string;
5
+ }
6
+ export declare function StatusPieChart({ byStatus, height, className }: StatusPieChartProps): import("react").JSX.Element;
7
+ //# sourceMappingURL=StatusPieChart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusPieChart.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/StatusPieChart.tsx"],"names":[],"mappings":"AAsBA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,MAAY,EAAE,SAAS,EAAE,EAAE,mBAAmB,+BAyDxF"}
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { PieChart, Pie, Cell, Tooltip, Legend, ResponsiveContainer } from 'recharts';
3
+ const STATUS_COLORS = {
4
+ COMPLETED: 'var(--wui-status-completed)',
5
+ FAILED: 'var(--wui-status-failed)',
6
+ RUNNING: 'var(--wui-status-running)',
7
+ CANCELLED: 'var(--wui-status-pending)',
8
+ PENDING: 'var(--wui-fg-muted)',
9
+ SKIPPED: 'var(--wui-fg-muted)',
10
+ EXTERNAL_WAIT: 'var(--wui-cat-integration)',
11
+ };
12
+ const STATUS_LABELS = {
13
+ COMPLETED: 'Completed',
14
+ FAILED: 'Failed',
15
+ RUNNING: 'Running',
16
+ CANCELLED: 'Cancelled',
17
+ PENDING: 'Pending',
18
+ SKIPPED: 'Skipped',
19
+ EXTERNAL_WAIT: 'Paused',
20
+ };
21
+ export function StatusPieChart({ byStatus, height = 200, className }) {
22
+ const data = Object.entries(byStatus)
23
+ .filter(([, v]) => v > 0)
24
+ .map(([status, value]) => ({
25
+ name: STATUS_LABELS[status] ?? status,
26
+ value,
27
+ color: STATUS_COLORS[status] ?? 'var(--wui-fg-muted)',
28
+ }))
29
+ .sort((a, b) => b.value - a.value);
30
+ if (data.length === 0) {
31
+ return (_jsx("div", { className: className, style: { height }, children: _jsx("div", { className: "flex h-full items-center justify-center text-xs text-[var(--wui-fg-muted)]", children: "No runs in this period" }) }));
32
+ }
33
+ return (_jsx("div", { className: className, "aria-label": "Status distribution", style: { width: '100%', height }, children: _jsx(ResponsiveContainer, { width: "100%", height: "100%", children: _jsxs(PieChart, { children: [_jsx(Pie, { data: data, dataKey: "value", nameKey: "name", cx: "50%", cy: "45%", innerRadius: "45%", outerRadius: "70%", paddingAngle: 2, strokeWidth: 0, children: data.map((entry, i) => (_jsx(Cell, { fill: entry.color }, i))) }), _jsx(Tooltip, { formatter: (value, name) => [value, name], contentStyle: {
34
+ fontSize: 12,
35
+ background: 'var(--wui-bg)',
36
+ border: '1px solid var(--wui-border)',
37
+ borderRadius: 6,
38
+ } }), _jsx(Legend, { iconType: "circle", iconSize: 8, wrapperStyle: { fontSize: 11, color: 'var(--wui-fg-muted)' } })] }) }) }));
39
+ }
40
+ //# sourceMappingURL=StatusPieChart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusPieChart.js","sourceRoot":"","sources":["../../../src/components/analytics/StatusPieChart.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAErF,MAAM,aAAa,GAA2B;IAC5C,SAAS,EAAE,6BAA6B;IACxC,MAAM,EAAK,0BAA0B;IACrC,OAAO,EAAI,2BAA2B;IACtC,SAAS,EAAE,2BAA2B;IACtC,OAAO,EAAI,qBAAqB;IAChC,OAAO,EAAI,qBAAqB;IAChC,aAAa,EAAE,4BAA4B;CAC5C,CAAC;AAEF,MAAM,aAAa,GAA2B;IAC5C,SAAS,EAAM,WAAW;IAC1B,MAAM,EAAS,QAAQ;IACvB,OAAO,EAAQ,SAAS;IACxB,SAAS,EAAM,WAAW;IAC1B,OAAO,EAAQ,SAAS;IACxB,OAAO,EAAQ,SAAS;IACxB,aAAa,EAAE,QAAQ;CACxB,CAAC;AAQF,MAAM,UAAU,cAAc,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,EAAE,SAAS,EAAuB;IACvF,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;SAClC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;SACxB,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACzB,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM;QACrC,KAAK;QACL,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,qBAAqB;KACtD,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAErC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CACL,cAAK,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,YAC1C,cAAK,SAAS,EAAC,4EAA4E,uCAErF,GACF,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,cAAK,SAAS,EAAE,SAAS,gBAAa,qBAAqB,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAC1F,KAAC,mBAAmB,IAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,YAC7C,MAAC,QAAQ,eACP,KAAC,GAAG,IACF,IAAI,EAAE,IAAI,EACV,OAAO,EAAC,OAAO,EACf,OAAO,EAAC,MAAM,EACd,EAAE,EAAC,KAAK,EACR,EAAE,EAAC,KAAK,EACR,WAAW,EAAC,KAAK,EACjB,WAAW,EAAC,KAAK,EACjB,YAAY,EAAE,CAAC,EACf,WAAW,EAAE,CAAC,YAEb,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,KAAC,IAAI,IAAS,IAAI,EAAE,KAAK,CAAC,KAAK,IAApB,CAAC,CAAuB,CACpC,CAAC,GACE,EACN,KAAC,OAAO,IACN,SAAS,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EACzC,YAAY,EAAE;4BACZ,QAAQ,EAAE,EAAE;4BACZ,UAAU,EAAE,eAAe;4BAC3B,MAAM,EAAE,6BAA6B;4BACrC,YAAY,EAAE,CAAC;yBAChB,GACD,EACF,KAAC,MAAM,IACL,QAAQ,EAAC,QAAQ,EACjB,QAAQ,EAAE,CAAC,EACX,YAAY,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,GAC5D,IACO,GACS,GAClB,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { AnalyticsRange } from '../../hooks/use-analytics.js';
2
+ export interface TimeRangeSelectorProps {
3
+ value: AnalyticsRange;
4
+ onChange: (range: AnalyticsRange) => void;
5
+ className?: string;
6
+ }
7
+ export declare function TimeRangeSelector({ value, onChange, className }: TimeRangeSelectorProps): import("react").JSX.Element;
8
+ //# sourceMappingURL=TimeRangeSelector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimeRangeSelector.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/TimeRangeSelector.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,cAAc,CAAC;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,wBAAgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,sBAAsB,+BAmBvF"}
@@ -0,0 +1,9 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from '../shared/cn.js';
3
+ const RANGES = [7, 14, 30];
4
+ export function TimeRangeSelector({ value, onChange, className }) {
5
+ return (_jsx("div", { className: cn('flex gap-1', className), children: RANGES.map((r) => (_jsxs("button", { onClick: () => onChange(r), className: cn('rounded px-2.5 py-1 text-xs font-medium transition-colors', r === value
6
+ ? 'bg-[var(--wui-primary)] text-[var(--wui-primary-fg)]'
7
+ : 'border border-[var(--wui-border)] text-[var(--wui-fg-muted)] hover:bg-[var(--wui-bg-subtle)]'), children: [r, "d"] }, r))) }));
8
+ }
9
+ //# sourceMappingURL=TimeRangeSelector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimeRangeSelector.js","sourceRoot":"","sources":["../../../src/components/analytics/TimeRangeSelector.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AASrC,MAAM,MAAM,GAAqB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAE7C,MAAM,UAAU,iBAAiB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAA0B;IACtF,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,YACxC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACjB,kBAEE,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAC1B,SAAS,EAAE,EAAE,CACX,2DAA2D,EAC3D,CAAC,KAAK,KAAK;gBACT,CAAC,CAAC,sDAAsD;gBACxD,CAAC,CAAC,8FAA8F,CACnG,aAEA,CAAC,UATG,CAAC,CAUC,CACV,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { AnalyticsData } from '../../hooks/use-analytics.js';
2
+ type RecentFailure = AnalyticsData['recentFailures'][number];
3
+ export interface TopErrorsPanelProps {
4
+ failures: RecentFailure[];
5
+ }
6
+ export declare function TopErrorsPanel({ failures }: TopErrorsPanelProps): import("react").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=TopErrorsPanel.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,70 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { useWorkflowClient } from '../../hooks/use-workflow-client.js';
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
+ function truncate(str, max) {
16
+ return str.length > max ? str.slice(0, max) + '…' : str;
17
+ }
18
+ export function TopErrorsPanel({ failures }) {
19
+ const client = useWorkflowClient();
20
+ const [groups, setGroups] = useState([]);
21
+ const [isLoading, setIsLoading] = useState(true);
22
+ useEffect(() => {
23
+ if (failures.length === 0) {
24
+ setGroups([]);
25
+ setIsLoading(false);
26
+ return;
27
+ }
28
+ let cancelled = false;
29
+ 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
+ }
47
+ }
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
+ });
59
+ return () => { cancelled = true; };
60
+ }, [client, failures]);
61
+ if (isLoading) {
62
+ return (_jsx("div", { className: "flex h-32 items-center justify-center", children: _jsx(LoadingSpinner, { size: "sm" }) }));
63
+ }
64
+ if (groups.length === 0) {
65
+ 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
+ }
67
+ 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))) }));
69
+ }
70
+ //# sourceMappingURL=TopErrorsPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TopErrorsPanel.js","sourceRoot":"","sources":["../../../src/components/analytics/TopErrorsPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface WorkflowRunsPanelProps {
2
+ workflowId: string;
3
+ onSelectExecution: (executionId: string) => void;
4
+ className?: string;
5
+ }
6
+ export declare function WorkflowRunsPanel({ workflowId, onSelectExecution, className }: WorkflowRunsPanelProps): import("react").JSX.Element;
7
+ //# sourceMappingURL=WorkflowRunsPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkflowRunsPanel.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/WorkflowRunsPanel.tsx"],"names":[],"mappings":"AAOA,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgCD,wBAAgB,iBAAiB,CAAC,EAAE,UAAU,EAAE,iBAAiB,EAAE,SAAS,EAAE,EAAE,sBAAsB,+BA0GrG"}
@@ -0,0 +1,85 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { useRunsList } from '../../hooks/use-runs-list.js';
4
+ import { useWorkflowClient } from '../../hooks/use-workflow-client.js';
5
+ import { RunsTable } from '../runs/RunsTable.js';
6
+ import { LoadingSpinner } from '../shared/LoadingSpinner.js';
7
+ import { cn } from '../shared/cn.js';
8
+ const STATUS_OPTIONS = [
9
+ { value: '', label: 'All' },
10
+ { value: 'running', label: 'Running' },
11
+ { value: 'completed', label: 'Completed' },
12
+ { value: 'failed', label: 'Failed' },
13
+ { value: 'paused', label: 'Paused' },
14
+ { value: 'cancelled', label: 'Cancelled' },
15
+ ];
16
+ function mapStatusToApi(ui) {
17
+ if (!ui)
18
+ return undefined;
19
+ if (ui === 'paused')
20
+ return 'EXTERNAL_WAIT';
21
+ return ui.toUpperCase();
22
+ }
23
+ function parseError(data) {
24
+ if (!data)
25
+ return undefined;
26
+ try {
27
+ return JSON.parse(data).error;
28
+ }
29
+ catch {
30
+ return undefined;
31
+ }
32
+ }
33
+ export function WorkflowRunsPanel({ workflowId, onSelectExecution, className }) {
34
+ const client = useWorkflowClient();
35
+ const [uiStatus, setUiStatus] = useState('');
36
+ const [errorByExecutionId, setErrorByExecutionId] = useState({});
37
+ const apiStatus = mapStatusToApi(uiStatus);
38
+ const { executions, isLoading, error, hasMore, loadMore } = useRunsList({
39
+ workflowId,
40
+ ...(apiStatus ? { status: apiStatus } : {}),
41
+ autoRefresh: true,
42
+ autoRefreshInterval: 5000,
43
+ });
44
+ // Lazily fetch error details for FAILED executions only
45
+ useEffect(() => {
46
+ const failedIds = executions
47
+ .filter((e) => e.status === 'FAILED')
48
+ .map((e) => e.id)
49
+ .filter((id) => !(id in errorByExecutionId));
50
+ if (failedIds.length === 0)
51
+ return;
52
+ let cancelled = false;
53
+ void Promise.all(failedIds.map((id) => client.executions.get(id).then((detail) => {
54
+ if (cancelled)
55
+ return;
56
+ const failedStep = detail.steps.find((s) => s.status === 'FAILED');
57
+ const err = failedStep ? parseError(failedStep.data) : undefined;
58
+ if (err) {
59
+ setErrorByExecutionId((prev) => ({ ...prev, [id]: err }));
60
+ }
61
+ else {
62
+ // Mark as fetched even with no error so we don't re-fetch
63
+ setErrorByExecutionId((prev) => ({ ...prev, [id]: '' }));
64
+ }
65
+ }).catch(() => {
66
+ if (!cancelled) {
67
+ setErrorByExecutionId((prev) => ({ ...prev, [id]: '' }));
68
+ }
69
+ })));
70
+ return () => { cancelled = true; };
71
+ // eslint-disable-next-line react-hooks/exhaustive-deps
72
+ }, [client, executions]);
73
+ // Filter out placeholder empty-string entries for display
74
+ const displayErrors = Object.fromEntries(Object.entries(errorByExecutionId).filter(([, v]) => v !== ''));
75
+ if (isLoading) {
76
+ return (_jsx("div", { className: "flex h-32 items-center justify-center", "aria-label": "Loading", children: _jsx(LoadingSpinner, { size: "md" }) }));
77
+ }
78
+ if (error) {
79
+ return (_jsx("div", { className: "flex h-24 items-center justify-center text-xs text-[var(--wui-status-failed)]", children: "Failed to load runs" }));
80
+ }
81
+ return (_jsxs("div", { className: cn('flex flex-col gap-3', className), children: [_jsx("div", { className: "flex items-center gap-1.5", children: STATUS_OPTIONS.map((opt) => (_jsx("button", { type: "button", onClick: () => setUiStatus(opt.value), className: cn('rounded-md border px-2.5 py-1 text-[11px] font-medium transition-colors', uiStatus === opt.value
82
+ ? 'border-[var(--wui-primary)] bg-[var(--wui-primary)]/10 text-[var(--wui-primary)]'
83
+ : 'border-[var(--wui-border)] text-[var(--wui-fg-muted)] hover:border-[var(--wui-fg-muted)] hover:text-[var(--wui-fg)]'), children: opt.label }, opt.value))) }), _jsx(RunsTable, { executions: executions, onSelectExecution: onSelectExecution, ...(Object.keys(displayErrors).length > 0 ? { errorByExecutionId: displayErrors } : {}) }), hasMore && (_jsx("button", { onClick: loadMore, className: "self-center rounded-md border border-[var(--wui-border)] px-3 py-1.5 text-xs font-medium text-[var(--wui-fg-muted)] transition-colors hover:text-[var(--wui-fg)]", children: "Load more" }))] }));
84
+ }
85
+ //# sourceMappingURL=WorkflowRunsPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkflowRunsPanel.js","sourceRoot":"","sources":["../../../src/components/analytics/WorkflowRunsPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { AnalyticsData } from '../../hooks/use-analytics.js';
2
+ type WorkflowRow = AnalyticsData['byWorkflow'][number];
3
+ export interface WorkflowsTableProps {
4
+ data: WorkflowRow[];
5
+ onSelectWorkflow?: (workflowId: string) => void;
6
+ search?: string;
7
+ className?: string;
8
+ }
9
+ export declare function WorkflowsTable({ data, onSelectWorkflow, search, className }: WorkflowsTableProps): import("react").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=WorkflowsTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkflowsTable.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/WorkflowsTable.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAIlE,KAAK,WAAW,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmCD,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAW,EAAE,SAAS,EAAE,EAAE,mBAAmB,+BAoGrG"}
@@ -0,0 +1,54 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useMemo, useState } from 'react';
3
+ import { StatusBadge } from '../shared/StatusBadge.js';
4
+ import { cn } from '../shared/cn.js';
5
+ const STATUS_VARIANTS = {
6
+ ACTIVE: 'completed',
7
+ DRAFT: 'pending',
8
+ DISABLED: 'paused',
9
+ PENDING_APPROVAL: 'pending',
10
+ REJECTED: 'failed',
11
+ REVOKED: 'failed',
12
+ AUTO_REVOKED: 'failed',
13
+ ARCHIVED: 'skipped',
14
+ };
15
+ function statusVariant(status) {
16
+ return STATUS_VARIANTS[status] ?? 'skipped';
17
+ }
18
+ function statusLabel(status) {
19
+ return status
20
+ .toLowerCase()
21
+ .split('_')
22
+ .map((w) => w[0]?.toUpperCase() + w.slice(1))
23
+ .join(' ');
24
+ }
25
+ function formatLastRun(date) {
26
+ if (!date)
27
+ return '—';
28
+ return date.toLocaleString(undefined, {
29
+ month: 'short',
30
+ day: 'numeric',
31
+ hour: 'numeric',
32
+ minute: '2-digit',
33
+ });
34
+ }
35
+ export function WorkflowsTable({ data, onSelectWorkflow, search = '', className }) {
36
+ const statuses = useMemo(() => Array.from(new Set(data.map((r) => r.status))).sort(), [data]);
37
+ const [activeTab, setActiveTab] = useState('ALL');
38
+ const rows = (activeTab === 'ALL' ? data : data.filter((r) => r.status === activeTab)).filter((r) => r.name.toLowerCase().includes(search.trim().toLowerCase()));
39
+ return (_jsxs("div", { className: cn('flex flex-col gap-3', className), children: [_jsxs("div", { className: "flex items-center gap-1 border-b border-[var(--wui-border)]", children: [_jsxs("button", { onClick: () => setActiveTab('ALL'), className: cn('px-3 py-1.5 text-xs font-medium transition-colors', activeTab === 'ALL'
40
+ ? 'border-b-2 border-[var(--wui-primary)] text-[var(--wui-fg)]'
41
+ : 'text-[var(--wui-fg-muted)] hover:text-[var(--wui-fg)]'), children: ["All (", data.length, ")"] }), statuses.map((status) => {
42
+ const count = data.filter((r) => r.status === status).length;
43
+ return (_jsxs("button", { onClick: () => setActiveTab(status), className: cn('px-3 py-1.5 text-xs font-medium transition-colors', activeTab === status
44
+ ? 'border-b-2 border-[var(--wui-primary)] text-[var(--wui-fg)]'
45
+ : 'text-[var(--wui-fg-muted)] hover:text-[var(--wui-fg)]'), children: [statusLabel(status), " (", count, ")"] }, status));
46
+ })] }), rows.length === 0 ? (_jsx("div", { className: "flex h-24 items-center justify-center text-xs text-[var(--wui-fg-muted)]", children: "No workflows" })) : (_jsxs("table", { className: "w-full text-left text-xs", children: [_jsx("thead", { children: _jsxs("tr", { className: "text-[10px] uppercase tracking-wider text-[var(--wui-fg-muted)]", children: [_jsx("th", { className: "py-1.5 font-medium", children: "Workflow" }), _jsx("th", { className: "py-1.5 font-medium", children: "Status" }), _jsx("th", { className: "py-1.5 font-medium", children: "Trigger" }), _jsx("th", { className: "py-1.5 font-medium text-right", children: "Total Runs" }), _jsx("th", { className: "py-1.5 font-medium text-right", children: "Failed" }), _jsx("th", { className: "py-1.5 font-medium text-right", children: "Failure Rate" }), _jsx("th", { className: "py-1.5 font-medium text-right", children: "Last Run" })] }) }), _jsx("tbody", { children: rows.map((row) => (_jsxs("tr", { onClick: () => onSelectWorkflow?.(row.workflowId), className: cn('border-t border-[var(--wui-border)]', onSelectWorkflow && 'cursor-pointer hover:bg-[var(--wui-bg-subtle)]'), children: [_jsx("td", { className: "py-2 font-medium text-[var(--wui-fg)]", children: row.name }), _jsx("td", { className: "py-2", children: _jsx(StatusBadge, { status: statusVariant(row.status), label: statusLabel(row.status) }) }), _jsx("td", { className: "py-2 text-[var(--wui-fg-muted)]", children: row.eventType }), _jsx("td", { className: "py-2 text-right tabular-nums text-[var(--wui-fg)]", children: row.totalRuns }), _jsx("td", { className: "py-2 text-right tabular-nums text-[var(--wui-fg)]", children: row.failedRuns }), _jsx("td", { className: "py-2 text-right tabular-nums", children: _jsxs("span", { style: {
47
+ color: row.failureRate > 20
48
+ ? 'var(--wui-status-failed)'
49
+ : row.failureRate > 5
50
+ ? 'var(--wui-status-paused)'
51
+ : 'var(--wui-status-completed)',
52
+ }, children: [row.failureRate, "%"] }) }), _jsx("td", { className: "py-2 text-right text-[var(--wui-fg-muted)]", children: formatLastRun(row.lastRunAt) })] }, row.workflowId))) })] }))] }));
53
+ }
54
+ //# sourceMappingURL=WorkflowsTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkflowsTable.js","sourceRoot":"","sources":["../../../src/components/analytics/WorkflowsTable.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export { AnalyticsDashboard } from './AnalyticsDashboard.js';
2
+ export type { AnalyticsDashboardProps } from './AnalyticsDashboard.js';
3
+ export { StatCard } from './StatCard.js';
4
+ export type { StatCardProps } from './StatCard.js';
5
+ export { TimeRangeSelector } from './TimeRangeSelector.js';
6
+ export type { TimeRangeSelectorProps } from './TimeRangeSelector.js';
7
+ export { RunsTimeSeries } from './RunsTimeSeries.js';
8
+ export type { RunsTimeSeriesProps } from './RunsTimeSeries.js';
9
+ export { StatusPieChart } from './StatusPieChart.js';
10
+ export type { StatusPieChartProps } from './StatusPieChart.js';
11
+ export { TopErrorsPanel } from './TopErrorsPanel.js';
12
+ export type { TopErrorsPanelProps } from './TopErrorsPanel.js';
13
+ export { WorkflowsTable } from './WorkflowsTable.js';
14
+ export type { WorkflowsTableProps } from './WorkflowsTable.js';
15
+ export { WorkflowRunsPanel } from './WorkflowRunsPanel.js';
16
+ export type { WorkflowRunsPanelProps } from './WorkflowRunsPanel.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/analytics/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}