@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.
Files changed (189) hide show
  1. package/dist/components/Combobox.cjs +291 -0
  2. package/dist/components/Combobox.cjs.map +1 -0
  3. package/dist/components/Combobox.d.ts +59 -0
  4. package/dist/components/Combobox.d.ts.map +1 -0
  5. package/dist/components/Combobox.js +291 -0
  6. package/dist/components/Combobox.js.map +1 -0
  7. package/dist/components/FilterBar.cjs +153 -124
  8. package/dist/components/FilterBar.cjs.map +1 -1
  9. package/dist/components/FilterBar.d.ts +25 -1
  10. package/dist/components/FilterBar.d.ts.map +1 -1
  11. package/dist/components/FilterBar.js +153 -124
  12. package/dist/components/FilterBar.js.map +1 -1
  13. package/dist/components/FormatOptionsDropdown.cjs +62 -0
  14. package/dist/components/FormatOptionsDropdown.cjs.map +1 -0
  15. package/dist/components/FormatOptionsDropdown.d.ts +37 -0
  16. package/dist/components/FormatOptionsDropdown.d.ts.map +1 -0
  17. package/dist/components/FormatOptionsDropdown.js +62 -0
  18. package/dist/components/FormatOptionsDropdown.js.map +1 -0
  19. package/dist/components/SplitButton.cjs +87 -0
  20. package/dist/components/SplitButton.cjs.map +1 -0
  21. package/dist/components/SplitButton.d.ts +32 -0
  22. package/dist/components/SplitButton.d.ts.map +1 -0
  23. package/dist/components/SplitButton.js +87 -0
  24. package/dist/components/SplitButton.js.map +1 -0
  25. package/dist/components/icon-menu-picker.cjs +1 -1
  26. package/dist/components/icon-menu-picker.cjs.map +1 -1
  27. package/dist/components/icon-menu-picker.js +1 -1
  28. package/dist/components/icon-menu-picker.js.map +1 -1
  29. package/dist/components.cjs +7 -0
  30. package/dist/components.cjs.map +1 -1
  31. package/dist/components.d.ts +3 -0
  32. package/dist/components.d.ts.map +1 -1
  33. package/dist/components.js +7 -0
  34. package/dist/components.js.map +1 -1
  35. package/dist/data/Badge.d.ts +1 -1
  36. package/dist/data/ProgressBar.cjs +4 -2
  37. package/dist/data/ProgressBar.cjs.map +1 -1
  38. package/dist/data/ProgressBar.d.ts +1 -1
  39. package/dist/data/ProgressBar.d.ts.map +1 -1
  40. package/dist/data/ProgressBar.js +4 -2
  41. package/dist/data/ProgressBar.js.map +1 -1
  42. package/dist/data/StatusBreakdown.cjs +80 -0
  43. package/dist/data/StatusBreakdown.cjs.map +1 -0
  44. package/dist/data/StatusBreakdown.d.ts +36 -0
  45. package/dist/data/StatusBreakdown.d.ts.map +1 -0
  46. package/dist/data/StatusBreakdown.js +80 -0
  47. package/dist/data/StatusBreakdown.js.map +1 -0
  48. package/dist/data/TaskManager.cjs +162 -0
  49. package/dist/data/TaskManager.cjs.map +1 -0
  50. package/dist/data/TaskManager.d.ts +21 -0
  51. package/dist/data/TaskManager.d.ts.map +1 -0
  52. package/dist/data/TaskManager.js +162 -0
  53. package/dist/data/TaskManager.js.map +1 -0
  54. package/dist/data/TaskProgress.cjs +125 -0
  55. package/dist/data/TaskProgress.cjs.map +1 -0
  56. package/dist/data/TaskProgress.d.ts +20 -0
  57. package/dist/data/TaskProgress.d.ts.map +1 -0
  58. package/dist/data/TaskProgress.js +125 -0
  59. package/dist/data/TaskProgress.js.map +1 -0
  60. package/dist/data/TaskSnapshot.cjs +23 -0
  61. package/dist/data/TaskSnapshot.cjs.map +1 -0
  62. package/dist/data/TaskSnapshot.d.ts +49 -0
  63. package/dist/data/TaskSnapshot.d.ts.map +1 -0
  64. package/dist/data/TaskSnapshot.js +23 -0
  65. package/dist/data/TaskSnapshot.js.map +1 -0
  66. package/dist/data/TimeseriesGauge.cjs +144 -0
  67. package/dist/data/TimeseriesGauge.cjs.map +1 -0
  68. package/dist/data/TimeseriesGauge.d.ts +56 -0
  69. package/dist/data/TimeseriesGauge.d.ts.map +1 -0
  70. package/dist/data/TimeseriesGauge.js +144 -0
  71. package/dist/data/TimeseriesGauge.js.map +1 -0
  72. package/dist/data/TimeseriesPanel.axes.cjs +39 -0
  73. package/dist/data/TimeseriesPanel.axes.cjs.map +1 -0
  74. package/dist/data/TimeseriesPanel.axes.d.ts +28 -0
  75. package/dist/data/TimeseriesPanel.axes.d.ts.map +1 -0
  76. package/dist/data/TimeseriesPanel.axes.js +39 -0
  77. package/dist/data/TimeseriesPanel.axes.js.map +1 -0
  78. package/dist/data/TimeseriesPanel.cjs +324 -0
  79. package/dist/data/TimeseriesPanel.cjs.map +1 -0
  80. package/dist/data/TimeseriesPanel.d.ts +141 -0
  81. package/dist/data/TimeseriesPanel.d.ts.map +1 -0
  82. package/dist/data/TimeseriesPanel.js +324 -0
  83. package/dist/data/TimeseriesPanel.js.map +1 -0
  84. package/dist/data/Tree.cjs.map +1 -1
  85. package/dist/data/Tree.d.ts.map +1 -1
  86. package/dist/data/Tree.js.map +1 -1
  87. package/dist/data/TreeNode.cjs +44 -7
  88. package/dist/data/TreeNode.cjs.map +1 -1
  89. package/dist/data/TreeNode.d.ts +19 -1
  90. package/dist/data/TreeNode.d.ts.map +1 -1
  91. package/dist/data/TreeNode.js +44 -7
  92. package/dist/data/TreeNode.js.map +1 -1
  93. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +66 -44
  94. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
  95. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts +21 -1
  96. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
  97. package/dist/data/diagnostics/DiagnosticsDetailPanel.js +65 -43
  98. package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
  99. package/dist/data/diagnostics/DiagnosticsTree.cjs +2 -1
  100. package/dist/data/diagnostics/DiagnosticsTree.cjs.map +1 -1
  101. package/dist/data/diagnostics/DiagnosticsTree.js +2 -1
  102. package/dist/data/diagnostics/DiagnosticsTree.js.map +1 -1
  103. package/dist/data/diagnostics/FrameSourceWindow.cjs +37 -0
  104. package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -0
  105. package/dist/data/diagnostics/FrameSourceWindow.d.ts +15 -0
  106. package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -0
  107. package/dist/data/diagnostics/FrameSourceWindow.js +37 -0
  108. package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -0
  109. package/dist/data/diagnostics/JvmStackTrace.cjs +25 -12
  110. package/dist/data/diagnostics/JvmStackTrace.cjs.map +1 -1
  111. package/dist/data/diagnostics/JvmStackTrace.d.ts +8 -1
  112. package/dist/data/diagnostics/JvmStackTrace.d.ts.map +1 -1
  113. package/dist/data/diagnostics/JvmStackTrace.js +26 -13
  114. package/dist/data/diagnostics/JvmStackTrace.js.map +1 -1
  115. package/dist/data/diagnostics/ThreadCard.cjs +9 -2
  116. package/dist/data/diagnostics/ThreadCard.cjs.map +1 -1
  117. package/dist/data/diagnostics/ThreadCard.d.ts +3 -1
  118. package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -1
  119. package/dist/data/diagnostics/ThreadCard.js +9 -2
  120. package/dist/data/diagnostics/ThreadCard.js.map +1 -1
  121. package/dist/data/diagnostics/jvm-stacktrace.cjs +10 -1
  122. package/dist/data/diagnostics/jvm-stacktrace.cjs.map +1 -1
  123. package/dist/data/diagnostics/jvm-stacktrace.d.ts.map +1 -1
  124. package/dist/data/diagnostics/jvm-stacktrace.js +10 -1
  125. package/dist/data/diagnostics/jvm-stacktrace.js.map +1 -1
  126. package/dist/data/diagnostics/utils.cjs +0 -12
  127. package/dist/data/diagnostics/utils.cjs.map +1 -1
  128. package/dist/data/diagnostics/utils.d.ts +1 -1
  129. package/dist/data/diagnostics/utils.d.ts.map +1 -1
  130. package/dist/data/diagnostics/utils.js +0 -12
  131. package/dist/data/diagnostics/utils.js.map +1 -1
  132. package/dist/data/task-status.cjs +108 -0
  133. package/dist/data/task-status.cjs.map +1 -0
  134. package/dist/data/task-status.d.ts +21 -0
  135. package/dist/data/task-status.d.ts.map +1 -0
  136. package/dist/data/task-status.js +108 -0
  137. package/dist/data/task-status.js.map +1 -0
  138. package/dist/data.cjs +27 -0
  139. package/dist/data.cjs.map +1 -1
  140. package/dist/data.d.ts +9 -1
  141. package/dist/data.d.ts.map +1 -1
  142. package/dist/data.js +27 -0
  143. package/dist/data.js.map +1 -1
  144. package/dist/hooks/use-task-run.cjs +137 -0
  145. package/dist/hooks/use-task-run.cjs.map +1 -0
  146. package/dist/hooks/use-task-run.d.ts +35 -0
  147. package/dist/hooks/use-task-run.d.ts.map +1 -0
  148. package/dist/hooks/use-task-run.js +137 -0
  149. package/dist/hooks/use-task-run.js.map +1 -0
  150. package/dist/hooks.cjs +3 -0
  151. package/dist/hooks.cjs.map +1 -1
  152. package/dist/hooks.d.ts +1 -0
  153. package/dist/hooks.d.ts.map +1 -1
  154. package/dist/hooks.js +3 -0
  155. package/dist/hooks.js.map +1 -1
  156. package/dist/index.cjs +43 -0
  157. package/dist/index.cjs.map +1 -1
  158. package/dist/index.js +43 -0
  159. package/dist/index.js.map +1 -1
  160. package/dist/lib/color.cjs +33 -0
  161. package/dist/lib/color.cjs.map +1 -0
  162. package/dist/lib/color.d.ts +10 -0
  163. package/dist/lib/color.d.ts.map +1 -0
  164. package/dist/lib/color.js +33 -0
  165. package/dist/lib/color.js.map +1 -0
  166. package/dist/lib/format.cjs +77 -0
  167. package/dist/lib/format.cjs.map +1 -0
  168. package/dist/lib/format.d.ts +30 -0
  169. package/dist/lib/format.d.ts.map +1 -0
  170. package/dist/lib/format.js +77 -0
  171. package/dist/lib/format.js.map +1 -0
  172. package/dist/overlay/DropdownMenu.cjs +18 -2
  173. package/dist/overlay/DropdownMenu.cjs.map +1 -1
  174. package/dist/overlay/DropdownMenu.d.ts +3 -1
  175. package/dist/overlay/DropdownMenu.d.ts.map +1 -1
  176. package/dist/overlay/DropdownMenu.js +18 -2
  177. package/dist/overlay/DropdownMenu.js.map +1 -1
  178. package/dist/rpc/types.cjs.map +1 -1
  179. package/dist/rpc/types.d.ts +4 -0
  180. package/dist/rpc/types.d.ts.map +1 -1
  181. package/dist/rpc/types.js.map +1 -1
  182. package/dist/styles.css +1 -1
  183. package/dist/utils.cjs +6 -0
  184. package/dist/utils.cjs.map +1 -1
  185. package/dist/utils.d.ts +1 -0
  186. package/dist/utils.d.ts.map +1 -1
  187. package/dist/utils.js +6 -0
  188. package/dist/utils.js.map +1 -1
  189. 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":";;;;AAuBA,MAAM,eAAe;AACrB,MAAM,kBAAkB;AAExB,SAAS,UAAU,MAAc,OAAuB;AACtD,SAAO,GAAG,IAAI,gBAAgB,QAAQ,IAAI,KAAK,KAAK,EAAE;AACxD;AAEA,SAAS,iBAA0B;AACjC,SAAO,OAAO,eAAe,eAAe,OAAO,WAAW,gBAAgB;AAChF;AAkBO,SAAS,WAAW,UAA6B,IAAsB;AAC5E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,UAAU;AAAA,IACV,SAAS;AAAA,IACT,YAAY;AAAA,EAAA,IACV;AAEJ,QAAM,CAAC,MAAM,OAAO,IAAIA,MAAAA,SAAuC,CAAA,CAAE;AACjE,QAAM,CAAC,QAAQ,SAAS,IAAIA,MAAAA,SAAS,MAAM;AAC3C,QAAM,CAAC,YAAY,aAAa,IAAIA,MAAAA,SAAS,KAAK;AAElD,QAAM,YAAY,GAAG,MAAM,EAAE,IAAI,QAAQ,EAAE,IAAI,OAAO;AACtD,QAAM,UAAUC,MAAAA,OAAO,SAAS;AAChC,MAAI,QAAQ,YAAY,WAAW;AACjC,YAAQ,UAAU;AAAA,EACpB;AAEAC,QAAAA,UAAU,MAAM;AACd,QAAI,CAAC,WAAY,CAAC,MAAM,CAAC,MAAO;AAC9B;AAAA,IACF;AACA,YAAQ,CAAA,CAAE;AACV,kBAAc,KAAK;AAEnB,UAAM,SAAS,IAAI,gBAAA;AACnB,QAAI,GAAI,QAAO,IAAI,SAAS,EAAE;AAC9B,QAAI,KAAM,QAAO,IAAI,QAAQ,IAAI;AACjC,UAAM,QAAQ,OAAO,SAAA;AAErB,UAAM,QAAQ,CAAC,aAA6B;AAC1C,cAAQ,CAAC,SAAS;AAChB,cAAM,OAAO,EAAE,GAAG,KAAA;AAClB,mBAAW,QAAQ,SAAU,MAAK,KAAK,EAAE,IAAI;AAC7C,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAGA,QAAI,aAAa,CAAC,kBAAkB;AAClC,UAAI,UAAU;AACd,UAAI;AACJ,YAAM,OAAO,YAAY;AACvB,YAAI;AACF,gBAAM,MAAM,MAAM,MAAM,GAAG,QAAQ,UAAU,mBAAmB,MAAM,EAAE,CAAC,IAAI;AAAA,YAC3E,SAAS,EAAE,QAAQ,mBAAA;AAAA,UAAmB,CACvC;AACD,cAAI,IAAI,IAAI;AACV,kBAAM,QAAS,MAAM,IAAI,KAAA;AACzB,kBAAM,KAAK;AACX,sBAAU,SAAS;AACnB,gBAAIC,aAAAA,kBAAkB,KAAK,GAAG;AAC5B,4BAAc,IAAI;AAClB;AAAA,YACF;AAAA,UACF;AAAA,QACF,QAAQ;AACN,oBAAU,4BAA4B;AAAA,QACxC;AACA,YAAI,CAAC,QAAS,SAAQ,WAAW,MAAM,MAAM;AAAA,MAC/C;AACA,WAAK,KAAA;AACL,aAAO,MAAM;AACX,kBAAU;AACV,YAAI,oBAAoB,KAAK;AAAA,MAC/B;AAAA,IACF;AAGA,UAAM,KAAK,IAAI,YAAY,UAAU,UAAU,KAAK,CAAC;AACrD,cAAU,WAAW;AACrB,OAAG,iBAAiB,QAAQ,CAAC,MAAM;AACjC,UAAI;AACF,cAAM,CAAC,KAAK,MAAO,EAAmB,IAAI,CAAiB,CAAC;AAAA,MAC9D,QAAQ;AAAA,MAER;AAAA,IACF,CAAC;AACD,OAAG,iBAAiB,QAAQ,MAAM;AAChC,gBAAU,UAAU;AACpB,oBAAc,IAAI;AAClB,SAAG,MAAA;AAAA,IACL,CAAC;AACD,OAAG,UAAU,MAAM,UAAU,4BAA4B;AACzD,WAAO,MAAM,GAAG,MAAA;AAAA,EAClB,GAAG,CAAC,IAAI,MAAM,UAAU,SAAS,QAAQ,SAAS,CAAC;AAEnD,SAAO,EAAE,WAAW,OAAO,OAAO,IAAI,GAAG,QAAQ,WAAA;AACnD;AAiBO,SAAS,YAAY,UAA8B,IAAuB;AAC/E,QAAM;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,WAAW;AAAA,IACX,UAAU;AAAA,IACV,SAAS;AAAA,EAAA,IACP;AAEJ,QAAM,CAAC,MAAM,OAAO,IAAIH,MAAAA,SAAwB,CAAA,CAAE;AAClD,QAAM,CAAC,QAAQ,SAAS,IAAIA,MAAAA,SAAS,MAAM;AAE3CE,QAAAA,UAAU,MAAM;AACd,QAAI,CAAC,QAAS;AACd,QAAI,UAAU;AACd,QAAI;AAEJ,UAAM,SAAS,IAAI,gBAAA;AACnB,QAAI,KAAM,QAAO,IAAI,QAAQ,IAAI;AACjC,QAAI,aAAc,QAAO,IAAI,UAAU,YAAY;AACnD,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,UAAU,CAAA,CAAE,UAAU,OAAO,SAAS,GAAG,CAAC,IAAI,CAAC,EAAE;AACrF,UAAM,QAAQ,OAAO,SAAA;AAErB,UAAM,OAAO,YAAY;AACvB,UAAI;AACF,cAAM,MAAM,MAAM,MAAM,GAAG,QAAQ,SAAS,QAAQ,IAAI,KAAK,KAAK,EAAE,IAAI;AAAA,UACtE,SAAS,EAAE,QAAQ,mBAAA;AAAA,QAAmB,CACvC;AACD,YAAI,IAAI,IAAI;AACV,kBAAS,MAAM,IAAI,MAAwB;AAC3C,oBAAU,IAAI;AAAA,QAChB;AAAA,MACF,QAAQ;AACN,kBAAU,4BAA4B;AAAA,MACxC;AACA,UAAI,CAAC,QAAS,SAAQ,WAAW,MAAM,MAAM;AAAA,IAC/C;AACA,SAAK,KAAA;AACL,WAAO,MAAM;AACX,gBAAU;AACV,UAAI,oBAAoB,KAAK;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,MAAM,cAAc,KAAK,UAAU,UAAU,CAAA,CAAE,GAAG,UAAU,SAAS,MAAM,CAAC;AAEhF,SAAO,EAAE,MAAM,OAAA;AACjB;;;"}
@@ -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":";;AAuBA,MAAM,eAAe;AACrB,MAAM,kBAAkB;AAExB,SAAS,UAAU,MAAc,OAAuB;AACtD,SAAO,GAAG,IAAI,gBAAgB,QAAQ,IAAI,KAAK,KAAK,EAAE;AACxD;AAEA,SAAS,iBAA0B;AACjC,SAAO,OAAO,eAAe,eAAe,OAAO,WAAW,gBAAgB;AAChF;AAkBO,SAAS,WAAW,UAA6B,IAAsB;AAC5E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,UAAU;AAAA,IACV,SAAS;AAAA,IACT,YAAY;AAAA,EAAA,IACV;AAEJ,QAAM,CAAC,MAAM,OAAO,IAAI,SAAuC,CAAA,CAAE;AACjE,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,MAAM;AAC3C,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAElD,QAAM,YAAY,GAAG,MAAM,EAAE,IAAI,QAAQ,EAAE,IAAI,OAAO;AACtD,QAAM,UAAU,OAAO,SAAS;AAChC,MAAI,QAAQ,YAAY,WAAW;AACjC,YAAQ,UAAU;AAAA,EACpB;AAEA,YAAU,MAAM;AACd,QAAI,CAAC,WAAY,CAAC,MAAM,CAAC,MAAO;AAC9B;AAAA,IACF;AACA,YAAQ,CAAA,CAAE;AACV,kBAAc,KAAK;AAEnB,UAAM,SAAS,IAAI,gBAAA;AACnB,QAAI,GAAI,QAAO,IAAI,SAAS,EAAE;AAC9B,QAAI,KAAM,QAAO,IAAI,QAAQ,IAAI;AACjC,UAAM,QAAQ,OAAO,SAAA;AAErB,UAAM,QAAQ,CAAC,aAA6B;AAC1C,cAAQ,CAAC,SAAS;AAChB,cAAM,OAAO,EAAE,GAAG,KAAA;AAClB,mBAAW,QAAQ,SAAU,MAAK,KAAK,EAAE,IAAI;AAC7C,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAGA,QAAI,aAAa,CAAC,kBAAkB;AAClC,UAAI,UAAU;AACd,UAAI;AACJ,YAAM,OAAO,YAAY;AACvB,YAAI;AACF,gBAAM,MAAM,MAAM,MAAM,GAAG,QAAQ,UAAU,mBAAmB,MAAM,EAAE,CAAC,IAAI;AAAA,YAC3E,SAAS,EAAE,QAAQ,mBAAA;AAAA,UAAmB,CACvC;AACD,cAAI,IAAI,IAAI;AACV,kBAAM,QAAS,MAAM,IAAI,KAAA;AACzB,kBAAM,KAAK;AACX,sBAAU,SAAS;AACnB,gBAAI,kBAAkB,KAAK,GAAG;AAC5B,4BAAc,IAAI;AAClB;AAAA,YACF;AAAA,UACF;AAAA,QACF,QAAQ;AACN,oBAAU,4BAA4B;AAAA,QACxC;AACA,YAAI,CAAC,QAAS,SAAQ,WAAW,MAAM,MAAM;AAAA,MAC/C;AACA,WAAK,KAAA;AACL,aAAO,MAAM;AACX,kBAAU;AACV,YAAI,oBAAoB,KAAK;AAAA,MAC/B;AAAA,IACF;AAGA,UAAM,KAAK,IAAI,YAAY,UAAU,UAAU,KAAK,CAAC;AACrD,cAAU,WAAW;AACrB,OAAG,iBAAiB,QAAQ,CAAC,MAAM;AACjC,UAAI;AACF,cAAM,CAAC,KAAK,MAAO,EAAmB,IAAI,CAAiB,CAAC;AAAA,MAC9D,QAAQ;AAAA,MAER;AAAA,IACF,CAAC;AACD,OAAG,iBAAiB,QAAQ,MAAM;AAChC,gBAAU,UAAU;AACpB,oBAAc,IAAI;AAClB,SAAG,MAAA;AAAA,IACL,CAAC;AACD,OAAG,UAAU,MAAM,UAAU,4BAA4B;AACzD,WAAO,MAAM,GAAG,MAAA;AAAA,EAClB,GAAG,CAAC,IAAI,MAAM,UAAU,SAAS,QAAQ,SAAS,CAAC;AAEnD,SAAO,EAAE,WAAW,OAAO,OAAO,IAAI,GAAG,QAAQ,WAAA;AACnD;AAiBO,SAAS,YAAY,UAA8B,IAAuB;AAC/E,QAAM;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,WAAW;AAAA,IACX,UAAU;AAAA,IACV,SAAS;AAAA,EAAA,IACP;AAEJ,QAAM,CAAC,MAAM,OAAO,IAAI,SAAwB,CAAA,CAAE;AAClD,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,MAAM;AAE3C,YAAU,MAAM;AACd,QAAI,CAAC,QAAS;AACd,QAAI,UAAU;AACd,QAAI;AAEJ,UAAM,SAAS,IAAI,gBAAA;AACnB,QAAI,KAAM,QAAO,IAAI,QAAQ,IAAI;AACjC,QAAI,aAAc,QAAO,IAAI,UAAU,YAAY;AACnD,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,UAAU,CAAA,CAAE,UAAU,OAAO,SAAS,GAAG,CAAC,IAAI,CAAC,EAAE;AACrF,UAAM,QAAQ,OAAO,SAAA;AAErB,UAAM,OAAO,YAAY;AACvB,UAAI;AACF,cAAM,MAAM,MAAM,MAAM,GAAG,QAAQ,SAAS,QAAQ,IAAI,KAAK,KAAK,EAAE,IAAI;AAAA,UACtE,SAAS,EAAE,QAAQ,mBAAA;AAAA,QAAmB,CACvC;AACD,YAAI,IAAI,IAAI;AACV,kBAAS,MAAM,IAAI,MAAwB;AAC3C,oBAAU,IAAI;AAAA,QAChB;AAAA,MACF,QAAQ;AACN,kBAAU,4BAA4B;AAAA,MACxC;AACA,UAAI,CAAC,QAAS,SAAQ,WAAW,MAAM,MAAM;AAAA,IAC/C;AACA,SAAK,KAAA;AACL,WAAO,MAAM;AACX,gBAAU;AACV,UAAI,oBAAoB,KAAK;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,MAAM,cAAc,KAAK,UAAU,UAAU,CAAA,CAAE,GAAG,UAAU,SAAS,MAAM,CAAC;AAEhF,SAAO,EAAE,MAAM,OAAA;AACjB;"}
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
@@ -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
@@ -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;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}