@flanksource/clicky-ui 0.2.4 → 0.2.6
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.
- package/dist/components/Combobox.cjs +291 -0
- package/dist/components/Combobox.cjs.map +1 -0
- package/dist/components/Combobox.d.ts +59 -0
- package/dist/components/Combobox.d.ts.map +1 -0
- package/dist/components/Combobox.js +291 -0
- package/dist/components/Combobox.js.map +1 -0
- package/dist/components/FilterBar.cjs +153 -124
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +25 -1
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +153 -124
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/FormatOptionsDropdown.cjs +62 -0
- package/dist/components/FormatOptionsDropdown.cjs.map +1 -0
- package/dist/components/FormatOptionsDropdown.d.ts +37 -0
- package/dist/components/FormatOptionsDropdown.d.ts.map +1 -0
- package/dist/components/FormatOptionsDropdown.js +62 -0
- package/dist/components/FormatOptionsDropdown.js.map +1 -0
- package/dist/components/SplitButton.cjs +87 -0
- package/dist/components/SplitButton.cjs.map +1 -0
- package/dist/components/SplitButton.d.ts +32 -0
- package/dist/components/SplitButton.d.ts.map +1 -0
- package/dist/components/SplitButton.js +87 -0
- package/dist/components/SplitButton.js.map +1 -0
- package/dist/components/icon-menu-picker.cjs +1 -1
- package/dist/components/icon-menu-picker.cjs.map +1 -1
- package/dist/components/icon-menu-picker.js +1 -1
- package/dist/components/icon-menu-picker.js.map +1 -1
- package/dist/components.cjs +7 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +3 -0
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +7 -0
- package/dist/components.js.map +1 -1
- package/dist/data/Badge.d.ts +1 -1
- package/dist/data/ProgressBar.cjs +4 -2
- package/dist/data/ProgressBar.cjs.map +1 -1
- package/dist/data/ProgressBar.d.ts +1 -1
- package/dist/data/ProgressBar.d.ts.map +1 -1
- package/dist/data/ProgressBar.js +4 -2
- package/dist/data/ProgressBar.js.map +1 -1
- package/dist/data/StatusBreakdown.cjs +80 -0
- package/dist/data/StatusBreakdown.cjs.map +1 -0
- package/dist/data/StatusBreakdown.d.ts +36 -0
- package/dist/data/StatusBreakdown.d.ts.map +1 -0
- package/dist/data/StatusBreakdown.js +80 -0
- package/dist/data/StatusBreakdown.js.map +1 -0
- package/dist/data/TaskManager.cjs +162 -0
- package/dist/data/TaskManager.cjs.map +1 -0
- package/dist/data/TaskManager.d.ts +21 -0
- package/dist/data/TaskManager.d.ts.map +1 -0
- package/dist/data/TaskManager.js +162 -0
- package/dist/data/TaskManager.js.map +1 -0
- package/dist/data/TaskProgress.cjs +125 -0
- package/dist/data/TaskProgress.cjs.map +1 -0
- package/dist/data/TaskProgress.d.ts +20 -0
- package/dist/data/TaskProgress.d.ts.map +1 -0
- package/dist/data/TaskProgress.js +125 -0
- package/dist/data/TaskProgress.js.map +1 -0
- package/dist/data/TaskSnapshot.cjs +23 -0
- package/dist/data/TaskSnapshot.cjs.map +1 -0
- package/dist/data/TaskSnapshot.d.ts +49 -0
- package/dist/data/TaskSnapshot.d.ts.map +1 -0
- package/dist/data/TaskSnapshot.js +23 -0
- package/dist/data/TaskSnapshot.js.map +1 -0
- package/dist/data/TimeseriesGauge.cjs +144 -0
- package/dist/data/TimeseriesGauge.cjs.map +1 -0
- package/dist/data/TimeseriesGauge.d.ts +56 -0
- package/dist/data/TimeseriesGauge.d.ts.map +1 -0
- package/dist/data/TimeseriesGauge.js +144 -0
- package/dist/data/TimeseriesGauge.js.map +1 -0
- package/dist/data/TimeseriesPanel.axes.cjs +39 -0
- package/dist/data/TimeseriesPanel.axes.cjs.map +1 -0
- package/dist/data/TimeseriesPanel.axes.d.ts +28 -0
- package/dist/data/TimeseriesPanel.axes.d.ts.map +1 -0
- package/dist/data/TimeseriesPanel.axes.js +39 -0
- package/dist/data/TimeseriesPanel.axes.js.map +1 -0
- package/dist/data/TimeseriesPanel.cjs +324 -0
- package/dist/data/TimeseriesPanel.cjs.map +1 -0
- package/dist/data/TimeseriesPanel.d.ts +141 -0
- package/dist/data/TimeseriesPanel.d.ts.map +1 -0
- package/dist/data/TimeseriesPanel.js +324 -0
- package/dist/data/TimeseriesPanel.js.map +1 -0
- package/dist/data/Tree.cjs.map +1 -1
- package/dist/data/Tree.d.ts.map +1 -1
- package/dist/data/Tree.js.map +1 -1
- package/dist/data/TreeNode.cjs +44 -7
- package/dist/data/TreeNode.cjs.map +1 -1
- package/dist/data/TreeNode.d.ts +19 -1
- package/dist/data/TreeNode.d.ts.map +1 -1
- package/dist/data/TreeNode.js +44 -7
- package/dist/data/TreeNode.js.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +66 -44
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts +21 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js +65 -43
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
- package/dist/data/diagnostics/DiagnosticsTree.cjs +2 -1
- package/dist/data/diagnostics/DiagnosticsTree.cjs.map +1 -1
- package/dist/data/diagnostics/DiagnosticsTree.js +2 -1
- package/dist/data/diagnostics/DiagnosticsTree.js.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.cjs +37 -0
- package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -0
- package/dist/data/diagnostics/FrameSourceWindow.d.ts +15 -0
- package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -0
- package/dist/data/diagnostics/FrameSourceWindow.js +37 -0
- package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -0
- package/dist/data/diagnostics/JvmStackTrace.cjs +25 -12
- package/dist/data/diagnostics/JvmStackTrace.cjs.map +1 -1
- package/dist/data/diagnostics/JvmStackTrace.d.ts +8 -1
- package/dist/data/diagnostics/JvmStackTrace.d.ts.map +1 -1
- package/dist/data/diagnostics/JvmStackTrace.js +26 -13
- package/dist/data/diagnostics/JvmStackTrace.js.map +1 -1
- package/dist/data/diagnostics/ThreadCard.cjs +9 -2
- package/dist/data/diagnostics/ThreadCard.cjs.map +1 -1
- package/dist/data/diagnostics/ThreadCard.d.ts +3 -1
- package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -1
- package/dist/data/diagnostics/ThreadCard.js +9 -2
- package/dist/data/diagnostics/ThreadCard.js.map +1 -1
- package/dist/data/diagnostics/jvm-stacktrace.cjs +10 -1
- package/dist/data/diagnostics/jvm-stacktrace.cjs.map +1 -1
- package/dist/data/diagnostics/jvm-stacktrace.d.ts.map +1 -1
- package/dist/data/diagnostics/jvm-stacktrace.js +10 -1
- package/dist/data/diagnostics/jvm-stacktrace.js.map +1 -1
- package/dist/data/diagnostics/utils.cjs +0 -12
- package/dist/data/diagnostics/utils.cjs.map +1 -1
- package/dist/data/diagnostics/utils.d.ts +1 -1
- package/dist/data/diagnostics/utils.d.ts.map +1 -1
- package/dist/data/diagnostics/utils.js +0 -12
- package/dist/data/diagnostics/utils.js.map +1 -1
- package/dist/data/task-status.cjs +108 -0
- package/dist/data/task-status.cjs.map +1 -0
- package/dist/data/task-status.d.ts +21 -0
- package/dist/data/task-status.d.ts.map +1 -0
- package/dist/data/task-status.js +108 -0
- package/dist/data/task-status.js.map +1 -0
- package/dist/data.cjs +27 -0
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +9 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +27 -0
- package/dist/data.js.map +1 -1
- package/dist/hooks/use-task-run.cjs +137 -0
- package/dist/hooks/use-task-run.cjs.map +1 -0
- package/dist/hooks/use-task-run.d.ts +35 -0
- package/dist/hooks/use-task-run.d.ts.map +1 -0
- package/dist/hooks/use-task-run.js +137 -0
- package/dist/hooks/use-task-run.js.map +1 -0
- package/dist/hooks.cjs +3 -0
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.ts +1 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +3 -0
- package/dist/hooks.js.map +1 -1
- package/dist/index.cjs +43 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/color.cjs +33 -0
- package/dist/lib/color.cjs.map +1 -0
- package/dist/lib/color.d.ts +10 -0
- package/dist/lib/color.d.ts.map +1 -0
- package/dist/lib/color.js +33 -0
- package/dist/lib/color.js.map +1 -0
- package/dist/lib/format.cjs +77 -0
- package/dist/lib/format.cjs.map +1 -0
- package/dist/lib/format.d.ts +30 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +77 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/overlay/DropdownMenu.cjs +18 -2
- package/dist/overlay/DropdownMenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenu.d.ts +3 -1
- package/dist/overlay/DropdownMenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenu.js +18 -2
- package/dist/overlay/DropdownMenu.js.map +1 -1
- package/dist/rpc/types.cjs.map +1 -1
- package/dist/rpc/types.d.ts +4 -0
- package/dist/rpc/types.d.ts.map +1 -1
- package/dist/rpc/types.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/utils.cjs +6 -0
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.ts +1 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +6 -0
- package/dist/utils.js.map +1 -1
- package/package.json +4 -1
package/dist/data.js
CHANGED
|
@@ -24,15 +24,23 @@ import { ProgressBar } from "./data/ProgressBar.js";
|
|
|
24
24
|
import { SignedDeltaBar } from "./data/SignedDeltaBar.js";
|
|
25
25
|
import { SortableHeader } from "./data/SortableHeader.js";
|
|
26
26
|
import { TabButton } from "./data/TabButton.js";
|
|
27
|
+
import { TimeseriesPanel, resolveBreakdown, resolveSeries } from "./data/TimeseriesPanel.js";
|
|
28
|
+
import { TimeseriesGauge } from "./data/TimeseriesGauge.js";
|
|
29
|
+
import { StackedStatusBar, StatusRows, segment } from "./data/StatusBreakdown.js";
|
|
27
30
|
import { Tree } from "./data/Tree.js";
|
|
28
31
|
import { TreeNode } from "./data/TreeNode.js";
|
|
29
32
|
import { TreeGroupHeader } from "./data/TreeGroupHeader.js";
|
|
33
|
+
import { allGroupsTerminal, isTerminalStatus } from "./data/TaskSnapshot.js";
|
|
34
|
+
import { bucketTasks, logLevelColor, taskSegments, taskStatusBg, taskStatusColor, taskStatusIcon } from "./data/task-status.js";
|
|
35
|
+
import { TaskProgress } from "./data/TaskProgress.js";
|
|
36
|
+
import { TaskManager } from "./data/TaskManager.js";
|
|
30
37
|
import { DiagnosticsTree } from "./data/diagnostics/DiagnosticsTree.js";
|
|
31
38
|
import { DiagnosticsDetailPanel } from "./data/diagnostics/DiagnosticsDetailPanel.js";
|
|
32
39
|
import { countProcesses, findProcessByPID, processLabel, processStateColor, processStateIcon } from "./data/diagnostics/utils.js";
|
|
33
40
|
import { countGoroutinesByState, countStackByState, detectDumpFormat, parseGoroutineDump, parseStackDump } from "./data/diagnostics/stacktrace.js";
|
|
34
41
|
import { countThreadsByState, parseJvmThreadDump } from "./data/diagnostics/jvm-stacktrace.js";
|
|
35
42
|
import { JvmStackFrameRow, JvmStackTrace } from "./data/diagnostics/JvmStackTrace.js";
|
|
43
|
+
import { FrameSourceWindow, frameHasSource } from "./data/diagnostics/FrameSourceWindow.js";
|
|
36
44
|
import { StackTrace } from "./data/diagnostics/RenderedStackTrace.js";
|
|
37
45
|
import { parseJavaStackTrace } from "./data/diagnostics/stacktrace-parse.js";
|
|
38
46
|
import { CopyBadge, ErrorDetails, PrettyStackTrace } from "./data/diagnostics/ErrorDetails.js";
|
|
@@ -312,6 +320,7 @@ export {
|
|
|
312
320
|
FilterPill,
|
|
313
321
|
FilterPillGroup,
|
|
314
322
|
FilterSeparator,
|
|
323
|
+
FrameSourceWindow,
|
|
315
324
|
Gauge,
|
|
316
325
|
HarPanel,
|
|
317
326
|
Icon,
|
|
@@ -331,10 +340,16 @@ export {
|
|
|
331
340
|
SignedDeltaBar,
|
|
332
341
|
SortableHeader,
|
|
333
342
|
StackTrace,
|
|
343
|
+
StackedStatusBar,
|
|
334
344
|
StatusDot,
|
|
345
|
+
StatusRows,
|
|
335
346
|
TabButton,
|
|
336
347
|
TagActionsProvider,
|
|
337
348
|
TagList,
|
|
349
|
+
TaskManager,
|
|
350
|
+
TaskProgress,
|
|
351
|
+
TimeseriesGauge,
|
|
352
|
+
TimeseriesPanel,
|
|
338
353
|
Timestamp,
|
|
339
354
|
Tree,
|
|
340
355
|
TreeGroupHeader,
|
|
@@ -828,7 +843,9 @@ export {
|
|
|
828
843
|
UiZoomInFilled,
|
|
829
844
|
UiZoomOut,
|
|
830
845
|
UiZoomOutFilled,
|
|
846
|
+
allGroupsTerminal,
|
|
831
847
|
badgeVariants,
|
|
848
|
+
bucketTasks,
|
|
832
849
|
changeIconAliases,
|
|
833
850
|
chooseTimestampFormat,
|
|
834
851
|
compactStackPath,
|
|
@@ -840,9 +857,12 @@ export {
|
|
|
840
857
|
findProcessByPID,
|
|
841
858
|
formatPropertyLabel,
|
|
842
859
|
formatTimestamp,
|
|
860
|
+
frameHasSource,
|
|
843
861
|
getChangeIcon,
|
|
844
862
|
inferColumns,
|
|
845
863
|
isApplicationStackFrame,
|
|
864
|
+
isTerminalStatus,
|
|
865
|
+
logLevelColor,
|
|
846
866
|
modeToFormat,
|
|
847
867
|
normalizeErrorDiagnostics,
|
|
848
868
|
normalizeLogsTableRows,
|
|
@@ -858,10 +878,17 @@ export {
|
|
|
858
878
|
processLabel,
|
|
859
879
|
processStateColor,
|
|
860
880
|
processStateIcon,
|
|
881
|
+
resolveBreakdown,
|
|
882
|
+
resolveSeries,
|
|
883
|
+
segment,
|
|
861
884
|
setFallbackIconProvider,
|
|
862
885
|
splitTagToken,
|
|
863
886
|
tagActionsFromRecord,
|
|
864
887
|
tagFilterTokens,
|
|
888
|
+
taskSegments,
|
|
889
|
+
taskStatusBg,
|
|
890
|
+
taskStatusColor,
|
|
891
|
+
taskStatusIcon,
|
|
865
892
|
useTagActions,
|
|
866
893
|
useTagActionsValue
|
|
867
894
|
};
|
package/dist/data.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"data.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const react = require("react");
|
|
4
|
+
const TaskSnapshot = require("../data/TaskSnapshot.cjs");
|
|
5
|
+
const DEFAULT_BASE = "/api/v1";
|
|
6
|
+
const DEFAULT_POLL_MS = 2e3;
|
|
7
|
+
function streamUrl(base, query) {
|
|
8
|
+
return `${base}/tasks/stream${query ? `?${query}` : ""}`;
|
|
9
|
+
}
|
|
10
|
+
function hasEventSource() {
|
|
11
|
+
return typeof globalThis !== "undefined" && typeof globalThis.EventSource !== "undefined";
|
|
12
|
+
}
|
|
13
|
+
function useTaskRun(options = {}) {
|
|
14
|
+
const {
|
|
15
|
+
id,
|
|
16
|
+
kind,
|
|
17
|
+
basePath = DEFAULT_BASE,
|
|
18
|
+
enabled = true,
|
|
19
|
+
pollMs = DEFAULT_POLL_MS,
|
|
20
|
+
forcePoll = false
|
|
21
|
+
} = options;
|
|
22
|
+
const [byId, setById] = react.useState({});
|
|
23
|
+
const [status, setStatus] = react.useState("idle");
|
|
24
|
+
const [isComplete, setIsComplete] = react.useState(false);
|
|
25
|
+
const targetKey = `${id ?? ""}|${kind ?? ""}|${enabled}`;
|
|
26
|
+
const prevKey = react.useRef(targetKey);
|
|
27
|
+
if (prevKey.current !== targetKey) {
|
|
28
|
+
prevKey.current = targetKey;
|
|
29
|
+
}
|
|
30
|
+
react.useEffect(() => {
|
|
31
|
+
if (!enabled || !id && !kind) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
setById({});
|
|
35
|
+
setIsComplete(false);
|
|
36
|
+
const params = new URLSearchParams();
|
|
37
|
+
if (id) params.set("tasks", id);
|
|
38
|
+
if (kind) params.set("kind", kind);
|
|
39
|
+
const query = params.toString();
|
|
40
|
+
const merge = (incoming) => {
|
|
41
|
+
setById((prev) => {
|
|
42
|
+
const next = { ...prev };
|
|
43
|
+
for (const snap of incoming) next[snap.id] = snap;
|
|
44
|
+
return next;
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
if (forcePoll || !hasEventSource()) {
|
|
48
|
+
let stopped = false;
|
|
49
|
+
let timer;
|
|
50
|
+
const tick = async () => {
|
|
51
|
+
try {
|
|
52
|
+
const res = await fetch(`${basePath}/tasks/${encodeURIComponent(id ?? "")}`, {
|
|
53
|
+
headers: { Accept: "application/json" }
|
|
54
|
+
});
|
|
55
|
+
if (res.ok) {
|
|
56
|
+
const snaps = await res.json();
|
|
57
|
+
merge(snaps);
|
|
58
|
+
setStatus("polling");
|
|
59
|
+
if (TaskSnapshot.allGroupsTerminal(snaps)) {
|
|
60
|
+
setIsComplete(true);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
} catch {
|
|
65
|
+
setStatus("connection lost — retrying");
|
|
66
|
+
}
|
|
67
|
+
if (!stopped) timer = setTimeout(tick, pollMs);
|
|
68
|
+
};
|
|
69
|
+
void tick();
|
|
70
|
+
return () => {
|
|
71
|
+
stopped = true;
|
|
72
|
+
if (timer) clearTimeout(timer);
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const es = new EventSource(streamUrl(basePath, query));
|
|
76
|
+
setStatus("connected");
|
|
77
|
+
es.addEventListener("task", (e) => {
|
|
78
|
+
try {
|
|
79
|
+
merge([JSON.parse(e.data)]);
|
|
80
|
+
} catch {
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
es.addEventListener("done", () => {
|
|
84
|
+
setStatus("complete");
|
|
85
|
+
setIsComplete(true);
|
|
86
|
+
es.close();
|
|
87
|
+
});
|
|
88
|
+
es.onerror = () => setStatus("connection lost — retrying");
|
|
89
|
+
return () => es.close();
|
|
90
|
+
}, [id, kind, basePath, enabled, pollMs, forcePoll]);
|
|
91
|
+
return { snapshots: Object.values(byId), status, isComplete };
|
|
92
|
+
}
|
|
93
|
+
function useTaskRuns(options = {}) {
|
|
94
|
+
const {
|
|
95
|
+
kind,
|
|
96
|
+
status: statusFilter,
|
|
97
|
+
labels,
|
|
98
|
+
basePath = DEFAULT_BASE,
|
|
99
|
+
enabled = true,
|
|
100
|
+
pollMs = DEFAULT_POLL_MS
|
|
101
|
+
} = options;
|
|
102
|
+
const [runs, setRuns] = react.useState([]);
|
|
103
|
+
const [status, setStatus] = react.useState("idle");
|
|
104
|
+
react.useEffect(() => {
|
|
105
|
+
if (!enabled) return;
|
|
106
|
+
let stopped = false;
|
|
107
|
+
let timer;
|
|
108
|
+
const params = new URLSearchParams();
|
|
109
|
+
if (kind) params.set("kind", kind);
|
|
110
|
+
if (statusFilter) params.set("status", statusFilter);
|
|
111
|
+
for (const [k, v] of Object.entries(labels ?? {})) params.append("label", `${k}=${v}`);
|
|
112
|
+
const query = params.toString();
|
|
113
|
+
const tick = async () => {
|
|
114
|
+
try {
|
|
115
|
+
const res = await fetch(`${basePath}/tasks${query ? `?${query}` : ""}`, {
|
|
116
|
+
headers: { Accept: "application/json" }
|
|
117
|
+
});
|
|
118
|
+
if (res.ok) {
|
|
119
|
+
setRuns(await res.json());
|
|
120
|
+
setStatus("ok");
|
|
121
|
+
}
|
|
122
|
+
} catch {
|
|
123
|
+
setStatus("connection lost — retrying");
|
|
124
|
+
}
|
|
125
|
+
if (!stopped) timer = setTimeout(tick, pollMs);
|
|
126
|
+
};
|
|
127
|
+
void tick();
|
|
128
|
+
return () => {
|
|
129
|
+
stopped = true;
|
|
130
|
+
if (timer) clearTimeout(timer);
|
|
131
|
+
};
|
|
132
|
+
}, [kind, statusFilter, JSON.stringify(labels ?? {}), basePath, enabled, pollMs]);
|
|
133
|
+
return { runs, status };
|
|
134
|
+
}
|
|
135
|
+
exports.useTaskRun = useTaskRun;
|
|
136
|
+
exports.useTaskRuns = useTaskRuns;
|
|
137
|
+
//# sourceMappingURL=use-task-run.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-task-run.cjs","sources":["../../src/hooks/use-task-run.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport {\n allGroupsTerminal,\n type TaskRunMeta,\n type TaskSnapshot,\n} from \"../data/TaskSnapshot\";\n\n// use-task-run / use-task-runs are the generic clicky-ui task clients. They are\n// SSE-first: they subscribe to clicky's SSEHandler (event: task / event: done)\n// and fall back to polling the JSON endpoints only when EventSource is\n// unavailable. They speak only TaskSnapshot / TaskRunMeta — no app concepts.\n\nexport interface TaskTransportOptions {\n /** Base path of the clicky task API, e.g. \"/api/v1\". */\n basePath?: string | undefined;\n /** Disable the subscription entirely (e.g. before an id is known). */\n enabled?: boolean | undefined;\n /** Poll interval (ms) for the fallback / runs listing. */\n pollMs?: number | undefined;\n /** Force the polling transport even when EventSource exists (mainly tests). */\n forcePoll?: boolean | undefined;\n}\n\nconst DEFAULT_BASE = \"/api/v1\";\nconst DEFAULT_POLL_MS = 2_000;\n\nfunction streamUrl(base: string, query: string): string {\n return `${base}/tasks/stream${query ? `?${query}` : \"\"}`;\n}\n\nfunction hasEventSource(): boolean {\n return typeof globalThis !== \"undefined\" && typeof globalThis.EventSource !== \"undefined\";\n}\n\nexport interface UseTaskRunResult {\n snapshots: TaskSnapshot[];\n status: string;\n isComplete: boolean;\n}\n\nexport interface UseTaskRunOptions extends TaskTransportOptions {\n /** Stable run id to follow (drill-down). Mutually exclusive with kind. */\n id?: string | undefined;\n /** Follow every run of a kind. */\n kind?: string | undefined;\n}\n\n// useTaskRun follows one run (by id) or a kind, SSE-first. It accumulates the\n// latest snapshot per task/group id and reports completion once every group is\n// terminal.\nexport function useTaskRun(options: UseTaskRunOptions = {}): UseTaskRunResult {\n const {\n id,\n kind,\n basePath = DEFAULT_BASE,\n enabled = true,\n pollMs = DEFAULT_POLL_MS,\n forcePoll = false,\n } = options;\n\n const [byId, setById] = useState<Record<string, TaskSnapshot>>({});\n const [status, setStatus] = useState(\"idle\");\n const [isComplete, setIsComplete] = useState(false);\n // Reset accumulator whenever the subscription target changes.\n const targetKey = `${id ?? \"\"}|${kind ?? \"\"}|${enabled}`;\n const prevKey = useRef(targetKey);\n if (prevKey.current !== targetKey) {\n prevKey.current = targetKey;\n }\n\n useEffect(() => {\n if (!enabled || (!id && !kind)) {\n return;\n }\n setById({});\n setIsComplete(false);\n\n const params = new URLSearchParams();\n if (id) params.set(\"tasks\", id);\n if (kind) params.set(\"kind\", kind);\n const query = params.toString();\n\n const merge = (incoming: TaskSnapshot[]) => {\n setById((prev) => {\n const next = { ...prev };\n for (const snap of incoming) next[snap.id] = snap;\n return next;\n });\n };\n\n // Polling fallback transport.\n if (forcePoll || !hasEventSource()) {\n let stopped = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const tick = async () => {\n try {\n const res = await fetch(`${basePath}/tasks/${encodeURIComponent(id ?? \"\")}`, {\n headers: { Accept: \"application/json\" },\n });\n if (res.ok) {\n const snaps = (await res.json()) as TaskSnapshot[];\n merge(snaps);\n setStatus(\"polling\");\n if (allGroupsTerminal(snaps)) {\n setIsComplete(true);\n return; // stop polling\n }\n }\n } catch {\n setStatus(\"connection lost — retrying\");\n }\n if (!stopped) timer = setTimeout(tick, pollMs);\n };\n void tick();\n return () => {\n stopped = true;\n if (timer) clearTimeout(timer);\n };\n }\n\n // SSE transport (default).\n const es = new EventSource(streamUrl(basePath, query));\n setStatus(\"connected\");\n es.addEventListener(\"task\", (e) => {\n try {\n merge([JSON.parse((e as MessageEvent).data) as TaskSnapshot]);\n } catch {\n /* ignore malformed frame */\n }\n });\n es.addEventListener(\"done\", () => {\n setStatus(\"complete\");\n setIsComplete(true);\n es.close();\n });\n es.onerror = () => setStatus(\"connection lost — retrying\");\n return () => es.close();\n }, [id, kind, basePath, enabled, pollMs, forcePoll]);\n\n return { snapshots: Object.values(byId), status, isComplete };\n}\n\nexport interface UseTaskRunsOptions extends TaskTransportOptions {\n kind?: string | undefined;\n status?: string | undefined;\n /** Label equality filters (k=v). */\n labels?: Record<string, string> | undefined;\n}\n\nexport interface UseTaskRunsResult {\n runs: TaskRunMeta[];\n status: string;\n}\n\n// useTaskRuns lists all runs (TaskRunMeta) for the manager view by polling the\n// runs endpoint. The listing has no completion terminal of its own, so it polls\n// on an interval (cheap GET) regardless of transport.\nexport function useTaskRuns(options: UseTaskRunsOptions = {}): UseTaskRunsResult {\n const {\n kind,\n status: statusFilter,\n labels,\n basePath = DEFAULT_BASE,\n enabled = true,\n pollMs = DEFAULT_POLL_MS,\n } = options;\n\n const [runs, setRuns] = useState<TaskRunMeta[]>([]);\n const [status, setStatus] = useState(\"idle\");\n\n useEffect(() => {\n if (!enabled) return;\n let stopped = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const params = new URLSearchParams();\n if (kind) params.set(\"kind\", kind);\n if (statusFilter) params.set(\"status\", statusFilter);\n for (const [k, v] of Object.entries(labels ?? {})) params.append(\"label\", `${k}=${v}`);\n const query = params.toString();\n\n const tick = async () => {\n try {\n const res = await fetch(`${basePath}/tasks${query ? `?${query}` : \"\"}`, {\n headers: { Accept: \"application/json\" },\n });\n if (res.ok) {\n setRuns((await res.json()) as TaskRunMeta[]);\n setStatus(\"ok\");\n }\n } catch {\n setStatus(\"connection lost — retrying\");\n }\n if (!stopped) timer = setTimeout(tick, pollMs);\n };\n void tick();\n return () => {\n stopped = true;\n if (timer) clearTimeout(timer);\n };\n }, [kind, statusFilter, JSON.stringify(labels ?? {}), basePath, enabled, pollMs]);\n\n return { runs, status };\n}\n"],"names":["useState","useRef","useEffect","allGroupsTerminal"],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { TaskRunMeta, TaskSnapshot } from '../data/TaskSnapshot';
|
|
2
|
+
export interface TaskTransportOptions {
|
|
3
|
+
/** Base path of the clicky task API, e.g. "/api/v1". */
|
|
4
|
+
basePath?: string | undefined;
|
|
5
|
+
/** Disable the subscription entirely (e.g. before an id is known). */
|
|
6
|
+
enabled?: boolean | undefined;
|
|
7
|
+
/** Poll interval (ms) for the fallback / runs listing. */
|
|
8
|
+
pollMs?: number | undefined;
|
|
9
|
+
/** Force the polling transport even when EventSource exists (mainly tests). */
|
|
10
|
+
forcePoll?: boolean | undefined;
|
|
11
|
+
}
|
|
12
|
+
export interface UseTaskRunResult {
|
|
13
|
+
snapshots: TaskSnapshot[];
|
|
14
|
+
status: string;
|
|
15
|
+
isComplete: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface UseTaskRunOptions extends TaskTransportOptions {
|
|
18
|
+
/** Stable run id to follow (drill-down). Mutually exclusive with kind. */
|
|
19
|
+
id?: string | undefined;
|
|
20
|
+
/** Follow every run of a kind. */
|
|
21
|
+
kind?: string | undefined;
|
|
22
|
+
}
|
|
23
|
+
export declare function useTaskRun(options?: UseTaskRunOptions): UseTaskRunResult;
|
|
24
|
+
export interface UseTaskRunsOptions extends TaskTransportOptions {
|
|
25
|
+
kind?: string | undefined;
|
|
26
|
+
status?: string | undefined;
|
|
27
|
+
/** Label equality filters (k=v). */
|
|
28
|
+
labels?: Record<string, string> | undefined;
|
|
29
|
+
}
|
|
30
|
+
export interface UseTaskRunsResult {
|
|
31
|
+
runs: TaskRunMeta[];
|
|
32
|
+
status: string;
|
|
33
|
+
}
|
|
34
|
+
export declare function useTaskRuns(options?: UseTaskRunsOptions): UseTaskRunsResult;
|
|
35
|
+
//# sourceMappingURL=use-task-run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-task-run.d.ts","sourceRoot":"","sources":["../../src/hooks/use-task-run.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAO9B,MAAM,WAAW,oBAAoB;IACnC,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,sEAAsE;IACtE,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,+EAA+E;IAC/E,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACjC;AAaD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,iBAAkB,SAAQ,oBAAoB;IAC7D,0EAA0E;IAC1E,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAKD,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,gBAAgB,CA0F5E;AAED,MAAM,WAAW,kBAAmB,SAAQ,oBAAoB;IAC9D,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CAC7C;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAKD,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,iBAAiB,CA8C/E"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { useState, useRef, useEffect } from "react";
|
|
2
|
+
import { allGroupsTerminal } from "../data/TaskSnapshot.js";
|
|
3
|
+
const DEFAULT_BASE = "/api/v1";
|
|
4
|
+
const DEFAULT_POLL_MS = 2e3;
|
|
5
|
+
function streamUrl(base, query) {
|
|
6
|
+
return `${base}/tasks/stream${query ? `?${query}` : ""}`;
|
|
7
|
+
}
|
|
8
|
+
function hasEventSource() {
|
|
9
|
+
return typeof globalThis !== "undefined" && typeof globalThis.EventSource !== "undefined";
|
|
10
|
+
}
|
|
11
|
+
function useTaskRun(options = {}) {
|
|
12
|
+
const {
|
|
13
|
+
id,
|
|
14
|
+
kind,
|
|
15
|
+
basePath = DEFAULT_BASE,
|
|
16
|
+
enabled = true,
|
|
17
|
+
pollMs = DEFAULT_POLL_MS,
|
|
18
|
+
forcePoll = false
|
|
19
|
+
} = options;
|
|
20
|
+
const [byId, setById] = useState({});
|
|
21
|
+
const [status, setStatus] = useState("idle");
|
|
22
|
+
const [isComplete, setIsComplete] = useState(false);
|
|
23
|
+
const targetKey = `${id ?? ""}|${kind ?? ""}|${enabled}`;
|
|
24
|
+
const prevKey = useRef(targetKey);
|
|
25
|
+
if (prevKey.current !== targetKey) {
|
|
26
|
+
prevKey.current = targetKey;
|
|
27
|
+
}
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
if (!enabled || !id && !kind) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
setById({});
|
|
33
|
+
setIsComplete(false);
|
|
34
|
+
const params = new URLSearchParams();
|
|
35
|
+
if (id) params.set("tasks", id);
|
|
36
|
+
if (kind) params.set("kind", kind);
|
|
37
|
+
const query = params.toString();
|
|
38
|
+
const merge = (incoming) => {
|
|
39
|
+
setById((prev) => {
|
|
40
|
+
const next = { ...prev };
|
|
41
|
+
for (const snap of incoming) next[snap.id] = snap;
|
|
42
|
+
return next;
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
if (forcePoll || !hasEventSource()) {
|
|
46
|
+
let stopped = false;
|
|
47
|
+
let timer;
|
|
48
|
+
const tick = async () => {
|
|
49
|
+
try {
|
|
50
|
+
const res = await fetch(`${basePath}/tasks/${encodeURIComponent(id ?? "")}`, {
|
|
51
|
+
headers: { Accept: "application/json" }
|
|
52
|
+
});
|
|
53
|
+
if (res.ok) {
|
|
54
|
+
const snaps = await res.json();
|
|
55
|
+
merge(snaps);
|
|
56
|
+
setStatus("polling");
|
|
57
|
+
if (allGroupsTerminal(snaps)) {
|
|
58
|
+
setIsComplete(true);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
} catch {
|
|
63
|
+
setStatus("connection lost — retrying");
|
|
64
|
+
}
|
|
65
|
+
if (!stopped) timer = setTimeout(tick, pollMs);
|
|
66
|
+
};
|
|
67
|
+
void tick();
|
|
68
|
+
return () => {
|
|
69
|
+
stopped = true;
|
|
70
|
+
if (timer) clearTimeout(timer);
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const es = new EventSource(streamUrl(basePath, query));
|
|
74
|
+
setStatus("connected");
|
|
75
|
+
es.addEventListener("task", (e) => {
|
|
76
|
+
try {
|
|
77
|
+
merge([JSON.parse(e.data)]);
|
|
78
|
+
} catch {
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
es.addEventListener("done", () => {
|
|
82
|
+
setStatus("complete");
|
|
83
|
+
setIsComplete(true);
|
|
84
|
+
es.close();
|
|
85
|
+
});
|
|
86
|
+
es.onerror = () => setStatus("connection lost — retrying");
|
|
87
|
+
return () => es.close();
|
|
88
|
+
}, [id, kind, basePath, enabled, pollMs, forcePoll]);
|
|
89
|
+
return { snapshots: Object.values(byId), status, isComplete };
|
|
90
|
+
}
|
|
91
|
+
function useTaskRuns(options = {}) {
|
|
92
|
+
const {
|
|
93
|
+
kind,
|
|
94
|
+
status: statusFilter,
|
|
95
|
+
labels,
|
|
96
|
+
basePath = DEFAULT_BASE,
|
|
97
|
+
enabled = true,
|
|
98
|
+
pollMs = DEFAULT_POLL_MS
|
|
99
|
+
} = options;
|
|
100
|
+
const [runs, setRuns] = useState([]);
|
|
101
|
+
const [status, setStatus] = useState("idle");
|
|
102
|
+
useEffect(() => {
|
|
103
|
+
if (!enabled) return;
|
|
104
|
+
let stopped = false;
|
|
105
|
+
let timer;
|
|
106
|
+
const params = new URLSearchParams();
|
|
107
|
+
if (kind) params.set("kind", kind);
|
|
108
|
+
if (statusFilter) params.set("status", statusFilter);
|
|
109
|
+
for (const [k, v] of Object.entries(labels ?? {})) params.append("label", `${k}=${v}`);
|
|
110
|
+
const query = params.toString();
|
|
111
|
+
const tick = async () => {
|
|
112
|
+
try {
|
|
113
|
+
const res = await fetch(`${basePath}/tasks${query ? `?${query}` : ""}`, {
|
|
114
|
+
headers: { Accept: "application/json" }
|
|
115
|
+
});
|
|
116
|
+
if (res.ok) {
|
|
117
|
+
setRuns(await res.json());
|
|
118
|
+
setStatus("ok");
|
|
119
|
+
}
|
|
120
|
+
} catch {
|
|
121
|
+
setStatus("connection lost — retrying");
|
|
122
|
+
}
|
|
123
|
+
if (!stopped) timer = setTimeout(tick, pollMs);
|
|
124
|
+
};
|
|
125
|
+
void tick();
|
|
126
|
+
return () => {
|
|
127
|
+
stopped = true;
|
|
128
|
+
if (timer) clearTimeout(timer);
|
|
129
|
+
};
|
|
130
|
+
}, [kind, statusFilter, JSON.stringify(labels ?? {}), basePath, enabled, pollMs]);
|
|
131
|
+
return { runs, status };
|
|
132
|
+
}
|
|
133
|
+
export {
|
|
134
|
+
useTaskRun,
|
|
135
|
+
useTaskRuns
|
|
136
|
+
};
|
|
137
|
+
//# sourceMappingURL=use-task-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-task-run.js","sources":["../../src/hooks/use-task-run.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport {\n allGroupsTerminal,\n type TaskRunMeta,\n type TaskSnapshot,\n} from \"../data/TaskSnapshot\";\n\n// use-task-run / use-task-runs are the generic clicky-ui task clients. They are\n// SSE-first: they subscribe to clicky's SSEHandler (event: task / event: done)\n// and fall back to polling the JSON endpoints only when EventSource is\n// unavailable. They speak only TaskSnapshot / TaskRunMeta — no app concepts.\n\nexport interface TaskTransportOptions {\n /** Base path of the clicky task API, e.g. \"/api/v1\". */\n basePath?: string | undefined;\n /** Disable the subscription entirely (e.g. before an id is known). */\n enabled?: boolean | undefined;\n /** Poll interval (ms) for the fallback / runs listing. */\n pollMs?: number | undefined;\n /** Force the polling transport even when EventSource exists (mainly tests). */\n forcePoll?: boolean | undefined;\n}\n\nconst DEFAULT_BASE = \"/api/v1\";\nconst DEFAULT_POLL_MS = 2_000;\n\nfunction streamUrl(base: string, query: string): string {\n return `${base}/tasks/stream${query ? `?${query}` : \"\"}`;\n}\n\nfunction hasEventSource(): boolean {\n return typeof globalThis !== \"undefined\" && typeof globalThis.EventSource !== \"undefined\";\n}\n\nexport interface UseTaskRunResult {\n snapshots: TaskSnapshot[];\n status: string;\n isComplete: boolean;\n}\n\nexport interface UseTaskRunOptions extends TaskTransportOptions {\n /** Stable run id to follow (drill-down). Mutually exclusive with kind. */\n id?: string | undefined;\n /** Follow every run of a kind. */\n kind?: string | undefined;\n}\n\n// useTaskRun follows one run (by id) or a kind, SSE-first. It accumulates the\n// latest snapshot per task/group id and reports completion once every group is\n// terminal.\nexport function useTaskRun(options: UseTaskRunOptions = {}): UseTaskRunResult {\n const {\n id,\n kind,\n basePath = DEFAULT_BASE,\n enabled = true,\n pollMs = DEFAULT_POLL_MS,\n forcePoll = false,\n } = options;\n\n const [byId, setById] = useState<Record<string, TaskSnapshot>>({});\n const [status, setStatus] = useState(\"idle\");\n const [isComplete, setIsComplete] = useState(false);\n // Reset accumulator whenever the subscription target changes.\n const targetKey = `${id ?? \"\"}|${kind ?? \"\"}|${enabled}`;\n const prevKey = useRef(targetKey);\n if (prevKey.current !== targetKey) {\n prevKey.current = targetKey;\n }\n\n useEffect(() => {\n if (!enabled || (!id && !kind)) {\n return;\n }\n setById({});\n setIsComplete(false);\n\n const params = new URLSearchParams();\n if (id) params.set(\"tasks\", id);\n if (kind) params.set(\"kind\", kind);\n const query = params.toString();\n\n const merge = (incoming: TaskSnapshot[]) => {\n setById((prev) => {\n const next = { ...prev };\n for (const snap of incoming) next[snap.id] = snap;\n return next;\n });\n };\n\n // Polling fallback transport.\n if (forcePoll || !hasEventSource()) {\n let stopped = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const tick = async () => {\n try {\n const res = await fetch(`${basePath}/tasks/${encodeURIComponent(id ?? \"\")}`, {\n headers: { Accept: \"application/json\" },\n });\n if (res.ok) {\n const snaps = (await res.json()) as TaskSnapshot[];\n merge(snaps);\n setStatus(\"polling\");\n if (allGroupsTerminal(snaps)) {\n setIsComplete(true);\n return; // stop polling\n }\n }\n } catch {\n setStatus(\"connection lost — retrying\");\n }\n if (!stopped) timer = setTimeout(tick, pollMs);\n };\n void tick();\n return () => {\n stopped = true;\n if (timer) clearTimeout(timer);\n };\n }\n\n // SSE transport (default).\n const es = new EventSource(streamUrl(basePath, query));\n setStatus(\"connected\");\n es.addEventListener(\"task\", (e) => {\n try {\n merge([JSON.parse((e as MessageEvent).data) as TaskSnapshot]);\n } catch {\n /* ignore malformed frame */\n }\n });\n es.addEventListener(\"done\", () => {\n setStatus(\"complete\");\n setIsComplete(true);\n es.close();\n });\n es.onerror = () => setStatus(\"connection lost — retrying\");\n return () => es.close();\n }, [id, kind, basePath, enabled, pollMs, forcePoll]);\n\n return { snapshots: Object.values(byId), status, isComplete };\n}\n\nexport interface UseTaskRunsOptions extends TaskTransportOptions {\n kind?: string | undefined;\n status?: string | undefined;\n /** Label equality filters (k=v). */\n labels?: Record<string, string> | undefined;\n}\n\nexport interface UseTaskRunsResult {\n runs: TaskRunMeta[];\n status: string;\n}\n\n// useTaskRuns lists all runs (TaskRunMeta) for the manager view by polling the\n// runs endpoint. The listing has no completion terminal of its own, so it polls\n// on an interval (cheap GET) regardless of transport.\nexport function useTaskRuns(options: UseTaskRunsOptions = {}): UseTaskRunsResult {\n const {\n kind,\n status: statusFilter,\n labels,\n basePath = DEFAULT_BASE,\n enabled = true,\n pollMs = DEFAULT_POLL_MS,\n } = options;\n\n const [runs, setRuns] = useState<TaskRunMeta[]>([]);\n const [status, setStatus] = useState(\"idle\");\n\n useEffect(() => {\n if (!enabled) return;\n let stopped = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const params = new URLSearchParams();\n if (kind) params.set(\"kind\", kind);\n if (statusFilter) params.set(\"status\", statusFilter);\n for (const [k, v] of Object.entries(labels ?? {})) params.append(\"label\", `${k}=${v}`);\n const query = params.toString();\n\n const tick = async () => {\n try {\n const res = await fetch(`${basePath}/tasks${query ? `?${query}` : \"\"}`, {\n headers: { Accept: \"application/json\" },\n });\n if (res.ok) {\n setRuns((await res.json()) as TaskRunMeta[]);\n setStatus(\"ok\");\n }\n } catch {\n setStatus(\"connection lost — retrying\");\n }\n if (!stopped) timer = setTimeout(tick, pollMs);\n };\n void tick();\n return () => {\n stopped = true;\n if (timer) clearTimeout(timer);\n };\n }, [kind, statusFilter, JSON.stringify(labels ?? {}), basePath, enabled, pollMs]);\n\n return { runs, status };\n}\n"],"names":[],"mappings":"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"}
|
package/dist/hooks.cjs
CHANGED
|
@@ -4,6 +4,7 @@ const useTheme = require("./hooks/use-theme.cjs");
|
|
|
4
4
|
const useDensity = require("./hooks/use-density.cjs");
|
|
5
5
|
const useSort = require("./hooks/use-sort.cjs");
|
|
6
6
|
const useHistoryRoute = require("./hooks/use-history-route.cjs");
|
|
7
|
+
const useTaskRun = require("./hooks/use-task-run.cjs");
|
|
7
8
|
exports.ThemeProvider = useTheme.ThemeProvider;
|
|
8
9
|
exports.useOptionalTheme = useTheme.useOptionalTheme;
|
|
9
10
|
exports.useResolvedTheme = useTheme.useResolvedTheme;
|
|
@@ -13,4 +14,6 @@ exports.useDensity = useDensity.useDensity;
|
|
|
13
14
|
exports.useDensityValue = useDensity.useDensityValue;
|
|
14
15
|
exports.useSort = useSort.useSort;
|
|
15
16
|
exports.useHistoryRoute = useHistoryRoute.useHistoryRoute;
|
|
17
|
+
exports.useTaskRun = useTaskRun.useTaskRun;
|
|
18
|
+
exports.useTaskRuns = useTaskRun.useTaskRuns;
|
|
16
19
|
//# sourceMappingURL=hooks.cjs.map
|
package/dist/hooks.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hooks.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;"}
|
package/dist/hooks.d.ts
CHANGED
|
@@ -2,4 +2,5 @@ export { ThemeProvider, useTheme, useOptionalTheme, useResolvedTheme, type Theme
|
|
|
2
2
|
export { DensityProvider, useDensity, useDensityValue, type Density } from './hooks/use-density';
|
|
3
3
|
export { useSort, type SortDir, type SortState, type UseSortOptions, type UseSortReturn, } from './hooks/use-sort';
|
|
4
4
|
export { useHistoryRoute, type UseHistoryRouteOptions } from './hooks/use-history-route';
|
|
5
|
+
export { useTaskRun, useTaskRuns, type UseTaskRunOptions, type UseTaskRunResult, type UseTaskRunsOptions, type UseTaskRunsResult, type TaskTransportOptions, } from './hooks/use-task-run';
|
|
5
6
|
//# sourceMappingURL=hooks.d.ts.map
|
package/dist/hooks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,KAAK,EACV,KAAK,aAAa,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACjG,OAAO,EACL,OAAO,EACP,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,aAAa,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,KAAK,EACV,KAAK,aAAa,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACjG,OAAO,EACL,OAAO,EACP,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,aAAa,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACzF,OAAO,EACL,UAAU,EACV,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,GAC1B,MAAM,sBAAsB,CAAC"}
|
package/dist/hooks.js
CHANGED
|
@@ -2,6 +2,7 @@ import { ThemeProvider, useOptionalTheme, useResolvedTheme, useTheme } from "./h
|
|
|
2
2
|
import { DensityProvider, useDensity, useDensityValue } from "./hooks/use-density.js";
|
|
3
3
|
import { useSort } from "./hooks/use-sort.js";
|
|
4
4
|
import { useHistoryRoute } from "./hooks/use-history-route.js";
|
|
5
|
+
import { useTaskRun, useTaskRuns } from "./hooks/use-task-run.js";
|
|
5
6
|
export {
|
|
6
7
|
DensityProvider,
|
|
7
8
|
ThemeProvider,
|
|
@@ -11,6 +12,8 @@ export {
|
|
|
11
12
|
useOptionalTheme,
|
|
12
13
|
useResolvedTheme,
|
|
13
14
|
useSort,
|
|
15
|
+
useTaskRun,
|
|
16
|
+
useTaskRuns,
|
|
14
17
|
useTheme
|
|
15
18
|
};
|
|
16
19
|
//# sourceMappingURL=hooks.js.map
|
package/dist/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hooks.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
|
package/dist/index.cjs
CHANGED
|
@@ -3,11 +3,15 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const utils = require("./lib/utils.cjs");
|
|
4
4
|
const palette = require("./lib/palette.cjs");
|
|
5
5
|
const size = require("./lib/size.cjs");
|
|
6
|
+
const format = require("./lib/format.cjs");
|
|
6
7
|
const useTheme = require("./hooks/use-theme.cjs");
|
|
7
8
|
const useDensity = require("./hooks/use-density.cjs");
|
|
8
9
|
const useSort = require("./hooks/use-sort.cjs");
|
|
9
10
|
const useHistoryRoute = require("./hooks/use-history-route.cjs");
|
|
11
|
+
const useTaskRun = require("./hooks/use-task-run.cjs");
|
|
10
12
|
const button = require("./components/button.cjs");
|
|
13
|
+
const SplitButton = require("./components/SplitButton.cjs");
|
|
14
|
+
const FormatOptionsDropdown = require("./components/FormatOptionsDropdown.cjs");
|
|
11
15
|
const DateField = require("./components/DateField.cjs");
|
|
12
16
|
const DatePicker = require("./components/DatePicker.cjs");
|
|
13
17
|
const DateTimePicker = require("./components/DateTimePicker.cjs");
|
|
@@ -16,6 +20,7 @@ const RangeSlider = require("./components/RangeSlider.cjs");
|
|
|
16
20
|
const FilterBar = require("./components/FilterBar.cjs");
|
|
17
21
|
const MultiSelect = require("./components/MultiSelect.cjs");
|
|
18
22
|
const select = require("./components/select.cjs");
|
|
23
|
+
const Combobox = require("./components/Combobox.cjs");
|
|
19
24
|
const themeSwitcher = require("./components/theme-switcher.cjs");
|
|
20
25
|
const densitySwitcher = require("./components/density-switcher.cjs");
|
|
21
26
|
const iconMenuPicker = require("./components/icon-menu-picker.cjs");
|
|
@@ -50,15 +55,23 @@ const ProgressBar = require("./data/ProgressBar.cjs");
|
|
|
50
55
|
const SignedDeltaBar = require("./data/SignedDeltaBar.cjs");
|
|
51
56
|
const SortableHeader = require("./data/SortableHeader.cjs");
|
|
52
57
|
const TabButton = require("./data/TabButton.cjs");
|
|
58
|
+
const TimeseriesPanel = require("./data/TimeseriesPanel.cjs");
|
|
59
|
+
const TimeseriesGauge = require("./data/TimeseriesGauge.cjs");
|
|
60
|
+
const StatusBreakdown = require("./data/StatusBreakdown.cjs");
|
|
53
61
|
const Tree = require("./data/Tree.cjs");
|
|
54
62
|
const TreeNode = require("./data/TreeNode.cjs");
|
|
55
63
|
const TreeGroupHeader = require("./data/TreeGroupHeader.cjs");
|
|
64
|
+
const TaskSnapshot = require("./data/TaskSnapshot.cjs");
|
|
65
|
+
const taskStatus = require("./data/task-status.cjs");
|
|
66
|
+
const TaskProgress = require("./data/TaskProgress.cjs");
|
|
67
|
+
const TaskManager = require("./data/TaskManager.cjs");
|
|
56
68
|
const DiagnosticsTree = require("./data/diagnostics/DiagnosticsTree.cjs");
|
|
57
69
|
const DiagnosticsDetailPanel = require("./data/diagnostics/DiagnosticsDetailPanel.cjs");
|
|
58
70
|
const utils$1 = require("./data/diagnostics/utils.cjs");
|
|
59
71
|
const stacktrace = require("./data/diagnostics/stacktrace.cjs");
|
|
60
72
|
const jvmStacktrace = require("./data/diagnostics/jvm-stacktrace.cjs");
|
|
61
73
|
const JvmStackTrace = require("./data/diagnostics/JvmStackTrace.cjs");
|
|
74
|
+
const FrameSourceWindow = require("./data/diagnostics/FrameSourceWindow.cjs");
|
|
62
75
|
const RenderedStackTrace = require("./data/diagnostics/RenderedStackTrace.cjs");
|
|
63
76
|
const stacktraceParse = require("./data/diagnostics/stacktrace-parse.cjs");
|
|
64
77
|
const ErrorDetails = require("./data/diagnostics/ErrorDetails.cjs");
|
|
@@ -345,6 +358,11 @@ exports.fnv1a32 = palette.fnv1a32;
|
|
|
345
358
|
exports.paletteClass = palette.paletteClass;
|
|
346
359
|
exports.SIZE_TOKENS = size.SIZE_TOKENS;
|
|
347
360
|
exports.resolveSize = size.resolveSize;
|
|
361
|
+
exports.formatBytes = format.formatBytes;
|
|
362
|
+
exports.formatBytesPerSecond = format.formatBytesPerSecond;
|
|
363
|
+
exports.formatDuration = format.formatDuration;
|
|
364
|
+
exports.formatShort = format.formatShort;
|
|
365
|
+
exports.formatUnit = format.formatUnit;
|
|
348
366
|
exports.ThemeProvider = useTheme.ThemeProvider;
|
|
349
367
|
exports.useOptionalTheme = useTheme.useOptionalTheme;
|
|
350
368
|
exports.useResolvedTheme = useTheme.useResolvedTheme;
|
|
@@ -354,8 +372,13 @@ exports.useDensity = useDensity.useDensity;
|
|
|
354
372
|
exports.useDensityValue = useDensity.useDensityValue;
|
|
355
373
|
exports.useSort = useSort.useSort;
|
|
356
374
|
exports.useHistoryRoute = useHistoryRoute.useHistoryRoute;
|
|
375
|
+
exports.useTaskRun = useTaskRun.useTaskRun;
|
|
376
|
+
exports.useTaskRuns = useTaskRun.useTaskRuns;
|
|
357
377
|
exports.Button = button.Button;
|
|
358
378
|
exports.buttonVariants = button.buttonVariants;
|
|
379
|
+
exports.SplitButton = SplitButton.SplitButton;
|
|
380
|
+
exports.CLICKY_FORMAT_OPTIONS = FormatOptionsDropdown.CLICKY_FORMAT_OPTIONS;
|
|
381
|
+
exports.FormatOptionsDropdown = FormatOptionsDropdown.FormatOptionsDropdown;
|
|
359
382
|
exports.DateField = DateField.DateField;
|
|
360
383
|
exports.DatePicker = DatePicker.DatePicker;
|
|
361
384
|
exports.DateTimePicker = DateTimePicker.DateTimePicker;
|
|
@@ -364,6 +387,7 @@ exports.RangeSlider = RangeSlider.RangeSlider;
|
|
|
364
387
|
exports.FilterBar = FilterBar.FilterBar;
|
|
365
388
|
exports.MultiSelect = MultiSelect.MultiSelect;
|
|
366
389
|
exports.Select = select.Select;
|
|
390
|
+
exports.Combobox = Combobox.Combobox;
|
|
367
391
|
exports.ThemeSwitcher = themeSwitcher.ThemeSwitcher;
|
|
368
392
|
exports.DensitySwitcher = densitySwitcher.DensitySwitcher;
|
|
369
393
|
exports.IconMenuPicker = iconMenuPicker.IconMenuPicker;
|
|
@@ -417,9 +441,26 @@ exports.ProgressBar = ProgressBar.ProgressBar;
|
|
|
417
441
|
exports.SignedDeltaBar = SignedDeltaBar.SignedDeltaBar;
|
|
418
442
|
exports.SortableHeader = SortableHeader.SortableHeader;
|
|
419
443
|
exports.TabButton = TabButton.TabButton;
|
|
444
|
+
exports.TimeseriesPanel = TimeseriesPanel.TimeseriesPanel;
|
|
445
|
+
exports.resolveBreakdown = TimeseriesPanel.resolveBreakdown;
|
|
446
|
+
exports.resolveSeries = TimeseriesPanel.resolveSeries;
|
|
447
|
+
exports.TimeseriesGauge = TimeseriesGauge.TimeseriesGauge;
|
|
448
|
+
exports.StackedStatusBar = StatusBreakdown.StackedStatusBar;
|
|
449
|
+
exports.StatusRows = StatusBreakdown.StatusRows;
|
|
450
|
+
exports.segment = StatusBreakdown.segment;
|
|
420
451
|
exports.Tree = Tree.Tree;
|
|
421
452
|
exports.TreeNode = TreeNode.TreeNode;
|
|
422
453
|
exports.TreeGroupHeader = TreeGroupHeader.TreeGroupHeader;
|
|
454
|
+
exports.allGroupsTerminal = TaskSnapshot.allGroupsTerminal;
|
|
455
|
+
exports.isTerminalStatus = TaskSnapshot.isTerminalStatus;
|
|
456
|
+
exports.bucketTasks = taskStatus.bucketTasks;
|
|
457
|
+
exports.logLevelColor = taskStatus.logLevelColor;
|
|
458
|
+
exports.taskSegments = taskStatus.taskSegments;
|
|
459
|
+
exports.taskStatusBg = taskStatus.taskStatusBg;
|
|
460
|
+
exports.taskStatusColor = taskStatus.taskStatusColor;
|
|
461
|
+
exports.taskStatusIcon = taskStatus.taskStatusIcon;
|
|
462
|
+
exports.TaskProgress = TaskProgress.TaskProgress;
|
|
463
|
+
exports.TaskManager = TaskManager.TaskManager;
|
|
423
464
|
exports.DiagnosticsTree = DiagnosticsTree.DiagnosticsTree;
|
|
424
465
|
exports.DiagnosticsDetailPanel = DiagnosticsDetailPanel.DiagnosticsDetailPanel;
|
|
425
466
|
exports.countProcesses = utils$1.countProcesses;
|
|
@@ -436,6 +477,8 @@ exports.countThreadsByState = jvmStacktrace.countThreadsByState;
|
|
|
436
477
|
exports.parseJvmThreadDump = jvmStacktrace.parseJvmThreadDump;
|
|
437
478
|
exports.JvmStackFrameRow = JvmStackTrace.JvmStackFrameRow;
|
|
438
479
|
exports.JvmStackTrace = JvmStackTrace.JvmStackTrace;
|
|
480
|
+
exports.FrameSourceWindow = FrameSourceWindow.FrameSourceWindow;
|
|
481
|
+
exports.frameHasSource = FrameSourceWindow.frameHasSource;
|
|
439
482
|
exports.StackTrace = RenderedStackTrace.StackTrace;
|
|
440
483
|
exports.parseJavaStackTrace = stacktraceParse.parseJavaStackTrace;
|
|
441
484
|
exports.CopyBadge = ErrorDetails.CopyBadge;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|