@flanksource/clicky-ui 0.2.3 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +14 -3
- package/dist/components/icon-menu-picker.cjs.map +1 -1
- package/dist/components/icon-menu-picker.d.ts.map +1 -1
- package/dist/components/icon-menu-picker.js +15 -4
- 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/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/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 +21 -0
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +7 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +21 -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 +37 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +37 -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,21 @@ 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";
|
|
27
28
|
import { Tree } from "./data/Tree.js";
|
|
28
29
|
import { TreeNode } from "./data/TreeNode.js";
|
|
29
30
|
import { TreeGroupHeader } from "./data/TreeGroupHeader.js";
|
|
31
|
+
import { allGroupsTerminal, isTerminalStatus } from "./data/TaskSnapshot.js";
|
|
32
|
+
import { bucketTasks, logLevelColor, taskSegments, taskStatusBg, taskStatusColor, taskStatusIcon } from "./data/task-status.js";
|
|
33
|
+
import { TaskProgress } from "./data/TaskProgress.js";
|
|
34
|
+
import { TaskManager } from "./data/TaskManager.js";
|
|
30
35
|
import { DiagnosticsTree } from "./data/diagnostics/DiagnosticsTree.js";
|
|
31
36
|
import { DiagnosticsDetailPanel } from "./data/diagnostics/DiagnosticsDetailPanel.js";
|
|
32
37
|
import { countProcesses, findProcessByPID, processLabel, processStateColor, processStateIcon } from "./data/diagnostics/utils.js";
|
|
33
38
|
import { countGoroutinesByState, countStackByState, detectDumpFormat, parseGoroutineDump, parseStackDump } from "./data/diagnostics/stacktrace.js";
|
|
34
39
|
import { countThreadsByState, parseJvmThreadDump } from "./data/diagnostics/jvm-stacktrace.js";
|
|
35
40
|
import { JvmStackFrameRow, JvmStackTrace } from "./data/diagnostics/JvmStackTrace.js";
|
|
41
|
+
import { FrameSourceWindow, frameHasSource } from "./data/diagnostics/FrameSourceWindow.js";
|
|
36
42
|
import { StackTrace } from "./data/diagnostics/RenderedStackTrace.js";
|
|
37
43
|
import { parseJavaStackTrace } from "./data/diagnostics/stacktrace-parse.js";
|
|
38
44
|
import { CopyBadge, ErrorDetails, PrettyStackTrace } from "./data/diagnostics/ErrorDetails.js";
|
|
@@ -312,6 +318,7 @@ export {
|
|
|
312
318
|
FilterPill,
|
|
313
319
|
FilterPillGroup,
|
|
314
320
|
FilterSeparator,
|
|
321
|
+
FrameSourceWindow,
|
|
315
322
|
Gauge,
|
|
316
323
|
HarPanel,
|
|
317
324
|
Icon,
|
|
@@ -335,6 +342,9 @@ export {
|
|
|
335
342
|
TabButton,
|
|
336
343
|
TagActionsProvider,
|
|
337
344
|
TagList,
|
|
345
|
+
TaskManager,
|
|
346
|
+
TaskProgress,
|
|
347
|
+
TimeseriesPanel,
|
|
338
348
|
Timestamp,
|
|
339
349
|
Tree,
|
|
340
350
|
TreeGroupHeader,
|
|
@@ -828,7 +838,9 @@ export {
|
|
|
828
838
|
UiZoomInFilled,
|
|
829
839
|
UiZoomOut,
|
|
830
840
|
UiZoomOutFilled,
|
|
841
|
+
allGroupsTerminal,
|
|
831
842
|
badgeVariants,
|
|
843
|
+
bucketTasks,
|
|
832
844
|
changeIconAliases,
|
|
833
845
|
chooseTimestampFormat,
|
|
834
846
|
compactStackPath,
|
|
@@ -840,9 +852,12 @@ export {
|
|
|
840
852
|
findProcessByPID,
|
|
841
853
|
formatPropertyLabel,
|
|
842
854
|
formatTimestamp,
|
|
855
|
+
frameHasSource,
|
|
843
856
|
getChangeIcon,
|
|
844
857
|
inferColumns,
|
|
845
858
|
isApplicationStackFrame,
|
|
859
|
+
isTerminalStatus,
|
|
860
|
+
logLevelColor,
|
|
846
861
|
modeToFormat,
|
|
847
862
|
normalizeErrorDiagnostics,
|
|
848
863
|
normalizeLogsTableRows,
|
|
@@ -858,10 +873,16 @@ export {
|
|
|
858
873
|
processLabel,
|
|
859
874
|
processStateColor,
|
|
860
875
|
processStateIcon,
|
|
876
|
+
resolveBreakdown,
|
|
877
|
+
resolveSeries,
|
|
861
878
|
setFallbackIconProvider,
|
|
862
879
|
splitTagToken,
|
|
863
880
|
tagActionsFromRecord,
|
|
864
881
|
tagFilterTokens,
|
|
882
|
+
taskSegments,
|
|
883
|
+
taskStatusBg,
|
|
884
|
+
taskStatusColor,
|
|
885
|
+
taskStatusIcon,
|
|
865
886
|
useTagActions,
|
|
866
887
|
useTagActionsValue
|
|
867
888
|
};
|
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,21 @@ 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");
|
|
53
59
|
const Tree = require("./data/Tree.cjs");
|
|
54
60
|
const TreeNode = require("./data/TreeNode.cjs");
|
|
55
61
|
const TreeGroupHeader = require("./data/TreeGroupHeader.cjs");
|
|
62
|
+
const TaskSnapshot = require("./data/TaskSnapshot.cjs");
|
|
63
|
+
const taskStatus = require("./data/task-status.cjs");
|
|
64
|
+
const TaskProgress = require("./data/TaskProgress.cjs");
|
|
65
|
+
const TaskManager = require("./data/TaskManager.cjs");
|
|
56
66
|
const DiagnosticsTree = require("./data/diagnostics/DiagnosticsTree.cjs");
|
|
57
67
|
const DiagnosticsDetailPanel = require("./data/diagnostics/DiagnosticsDetailPanel.cjs");
|
|
58
68
|
const utils$1 = require("./data/diagnostics/utils.cjs");
|
|
59
69
|
const stacktrace = require("./data/diagnostics/stacktrace.cjs");
|
|
60
70
|
const jvmStacktrace = require("./data/diagnostics/jvm-stacktrace.cjs");
|
|
61
71
|
const JvmStackTrace = require("./data/diagnostics/JvmStackTrace.cjs");
|
|
72
|
+
const FrameSourceWindow = require("./data/diagnostics/FrameSourceWindow.cjs");
|
|
62
73
|
const RenderedStackTrace = require("./data/diagnostics/RenderedStackTrace.cjs");
|
|
63
74
|
const stacktraceParse = require("./data/diagnostics/stacktrace-parse.cjs");
|
|
64
75
|
const ErrorDetails = require("./data/diagnostics/ErrorDetails.cjs");
|
|
@@ -345,6 +356,11 @@ exports.fnv1a32 = palette.fnv1a32;
|
|
|
345
356
|
exports.paletteClass = palette.paletteClass;
|
|
346
357
|
exports.SIZE_TOKENS = size.SIZE_TOKENS;
|
|
347
358
|
exports.resolveSize = size.resolveSize;
|
|
359
|
+
exports.formatBytes = format.formatBytes;
|
|
360
|
+
exports.formatBytesPerSecond = format.formatBytesPerSecond;
|
|
361
|
+
exports.formatDuration = format.formatDuration;
|
|
362
|
+
exports.formatShort = format.formatShort;
|
|
363
|
+
exports.formatUnit = format.formatUnit;
|
|
348
364
|
exports.ThemeProvider = useTheme.ThemeProvider;
|
|
349
365
|
exports.useOptionalTheme = useTheme.useOptionalTheme;
|
|
350
366
|
exports.useResolvedTheme = useTheme.useResolvedTheme;
|
|
@@ -354,8 +370,13 @@ exports.useDensity = useDensity.useDensity;
|
|
|
354
370
|
exports.useDensityValue = useDensity.useDensityValue;
|
|
355
371
|
exports.useSort = useSort.useSort;
|
|
356
372
|
exports.useHistoryRoute = useHistoryRoute.useHistoryRoute;
|
|
373
|
+
exports.useTaskRun = useTaskRun.useTaskRun;
|
|
374
|
+
exports.useTaskRuns = useTaskRun.useTaskRuns;
|
|
357
375
|
exports.Button = button.Button;
|
|
358
376
|
exports.buttonVariants = button.buttonVariants;
|
|
377
|
+
exports.SplitButton = SplitButton.SplitButton;
|
|
378
|
+
exports.CLICKY_FORMAT_OPTIONS = FormatOptionsDropdown.CLICKY_FORMAT_OPTIONS;
|
|
379
|
+
exports.FormatOptionsDropdown = FormatOptionsDropdown.FormatOptionsDropdown;
|
|
359
380
|
exports.DateField = DateField.DateField;
|
|
360
381
|
exports.DatePicker = DatePicker.DatePicker;
|
|
361
382
|
exports.DateTimePicker = DateTimePicker.DateTimePicker;
|
|
@@ -364,6 +385,7 @@ exports.RangeSlider = RangeSlider.RangeSlider;
|
|
|
364
385
|
exports.FilterBar = FilterBar.FilterBar;
|
|
365
386
|
exports.MultiSelect = MultiSelect.MultiSelect;
|
|
366
387
|
exports.Select = select.Select;
|
|
388
|
+
exports.Combobox = Combobox.Combobox;
|
|
367
389
|
exports.ThemeSwitcher = themeSwitcher.ThemeSwitcher;
|
|
368
390
|
exports.DensitySwitcher = densitySwitcher.DensitySwitcher;
|
|
369
391
|
exports.IconMenuPicker = iconMenuPicker.IconMenuPicker;
|
|
@@ -417,9 +439,22 @@ exports.ProgressBar = ProgressBar.ProgressBar;
|
|
|
417
439
|
exports.SignedDeltaBar = SignedDeltaBar.SignedDeltaBar;
|
|
418
440
|
exports.SortableHeader = SortableHeader.SortableHeader;
|
|
419
441
|
exports.TabButton = TabButton.TabButton;
|
|
442
|
+
exports.TimeseriesPanel = TimeseriesPanel.TimeseriesPanel;
|
|
443
|
+
exports.resolveBreakdown = TimeseriesPanel.resolveBreakdown;
|
|
444
|
+
exports.resolveSeries = TimeseriesPanel.resolveSeries;
|
|
420
445
|
exports.Tree = Tree.Tree;
|
|
421
446
|
exports.TreeNode = TreeNode.TreeNode;
|
|
422
447
|
exports.TreeGroupHeader = TreeGroupHeader.TreeGroupHeader;
|
|
448
|
+
exports.allGroupsTerminal = TaskSnapshot.allGroupsTerminal;
|
|
449
|
+
exports.isTerminalStatus = TaskSnapshot.isTerminalStatus;
|
|
450
|
+
exports.bucketTasks = taskStatus.bucketTasks;
|
|
451
|
+
exports.logLevelColor = taskStatus.logLevelColor;
|
|
452
|
+
exports.taskSegments = taskStatus.taskSegments;
|
|
453
|
+
exports.taskStatusBg = taskStatus.taskStatusBg;
|
|
454
|
+
exports.taskStatusColor = taskStatus.taskStatusColor;
|
|
455
|
+
exports.taskStatusIcon = taskStatus.taskStatusIcon;
|
|
456
|
+
exports.TaskProgress = TaskProgress.TaskProgress;
|
|
457
|
+
exports.TaskManager = TaskManager.TaskManager;
|
|
423
458
|
exports.DiagnosticsTree = DiagnosticsTree.DiagnosticsTree;
|
|
424
459
|
exports.DiagnosticsDetailPanel = DiagnosticsDetailPanel.DiagnosticsDetailPanel;
|
|
425
460
|
exports.countProcesses = utils$1.countProcesses;
|
|
@@ -436,6 +471,8 @@ exports.countThreadsByState = jvmStacktrace.countThreadsByState;
|
|
|
436
471
|
exports.parseJvmThreadDump = jvmStacktrace.parseJvmThreadDump;
|
|
437
472
|
exports.JvmStackFrameRow = JvmStackTrace.JvmStackFrameRow;
|
|
438
473
|
exports.JvmStackTrace = JvmStackTrace.JvmStackTrace;
|
|
474
|
+
exports.FrameSourceWindow = FrameSourceWindow.FrameSourceWindow;
|
|
475
|
+
exports.frameHasSource = FrameSourceWindow.frameHasSource;
|
|
439
476
|
exports.StackTrace = RenderedStackTrace.StackTrace;
|
|
440
477
|
exports.parseJavaStackTrace = stacktraceParse.parseJavaStackTrace;
|
|
441
478
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|