@flanksource/clicky-ui 0.2.4 → 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.
Files changed (177) 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/TaskManager.cjs +162 -0
  43. package/dist/data/TaskManager.cjs.map +1 -0
  44. package/dist/data/TaskManager.d.ts +21 -0
  45. package/dist/data/TaskManager.d.ts.map +1 -0
  46. package/dist/data/TaskManager.js +162 -0
  47. package/dist/data/TaskManager.js.map +1 -0
  48. package/dist/data/TaskProgress.cjs +125 -0
  49. package/dist/data/TaskProgress.cjs.map +1 -0
  50. package/dist/data/TaskProgress.d.ts +20 -0
  51. package/dist/data/TaskProgress.d.ts.map +1 -0
  52. package/dist/data/TaskProgress.js +125 -0
  53. package/dist/data/TaskProgress.js.map +1 -0
  54. package/dist/data/TaskSnapshot.cjs +23 -0
  55. package/dist/data/TaskSnapshot.cjs.map +1 -0
  56. package/dist/data/TaskSnapshot.d.ts +49 -0
  57. package/dist/data/TaskSnapshot.d.ts.map +1 -0
  58. package/dist/data/TaskSnapshot.js +23 -0
  59. package/dist/data/TaskSnapshot.js.map +1 -0
  60. package/dist/data/TimeseriesPanel.axes.cjs +39 -0
  61. package/dist/data/TimeseriesPanel.axes.cjs.map +1 -0
  62. package/dist/data/TimeseriesPanel.axes.d.ts +28 -0
  63. package/dist/data/TimeseriesPanel.axes.d.ts.map +1 -0
  64. package/dist/data/TimeseriesPanel.axes.js +39 -0
  65. package/dist/data/TimeseriesPanel.axes.js.map +1 -0
  66. package/dist/data/TimeseriesPanel.cjs +324 -0
  67. package/dist/data/TimeseriesPanel.cjs.map +1 -0
  68. package/dist/data/TimeseriesPanel.d.ts +141 -0
  69. package/dist/data/TimeseriesPanel.d.ts.map +1 -0
  70. package/dist/data/TimeseriesPanel.js +324 -0
  71. package/dist/data/TimeseriesPanel.js.map +1 -0
  72. package/dist/data/Tree.cjs.map +1 -1
  73. package/dist/data/Tree.d.ts.map +1 -1
  74. package/dist/data/Tree.js.map +1 -1
  75. package/dist/data/TreeNode.cjs +44 -7
  76. package/dist/data/TreeNode.cjs.map +1 -1
  77. package/dist/data/TreeNode.d.ts +19 -1
  78. package/dist/data/TreeNode.d.ts.map +1 -1
  79. package/dist/data/TreeNode.js +44 -7
  80. package/dist/data/TreeNode.js.map +1 -1
  81. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +66 -44
  82. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
  83. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts +21 -1
  84. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
  85. package/dist/data/diagnostics/DiagnosticsDetailPanel.js +65 -43
  86. package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
  87. package/dist/data/diagnostics/DiagnosticsTree.cjs +2 -1
  88. package/dist/data/diagnostics/DiagnosticsTree.cjs.map +1 -1
  89. package/dist/data/diagnostics/DiagnosticsTree.js +2 -1
  90. package/dist/data/diagnostics/DiagnosticsTree.js.map +1 -1
  91. package/dist/data/diagnostics/FrameSourceWindow.cjs +37 -0
  92. package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -0
  93. package/dist/data/diagnostics/FrameSourceWindow.d.ts +15 -0
  94. package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -0
  95. package/dist/data/diagnostics/FrameSourceWindow.js +37 -0
  96. package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -0
  97. package/dist/data/diagnostics/JvmStackTrace.cjs +25 -12
  98. package/dist/data/diagnostics/JvmStackTrace.cjs.map +1 -1
  99. package/dist/data/diagnostics/JvmStackTrace.d.ts +8 -1
  100. package/dist/data/diagnostics/JvmStackTrace.d.ts.map +1 -1
  101. package/dist/data/diagnostics/JvmStackTrace.js +26 -13
  102. package/dist/data/diagnostics/JvmStackTrace.js.map +1 -1
  103. package/dist/data/diagnostics/ThreadCard.cjs +9 -2
  104. package/dist/data/diagnostics/ThreadCard.cjs.map +1 -1
  105. package/dist/data/diagnostics/ThreadCard.d.ts +3 -1
  106. package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -1
  107. package/dist/data/diagnostics/ThreadCard.js +9 -2
  108. package/dist/data/diagnostics/ThreadCard.js.map +1 -1
  109. package/dist/data/diagnostics/jvm-stacktrace.cjs +10 -1
  110. package/dist/data/diagnostics/jvm-stacktrace.cjs.map +1 -1
  111. package/dist/data/diagnostics/jvm-stacktrace.d.ts.map +1 -1
  112. package/dist/data/diagnostics/jvm-stacktrace.js +10 -1
  113. package/dist/data/diagnostics/jvm-stacktrace.js.map +1 -1
  114. package/dist/data/diagnostics/utils.cjs +0 -12
  115. package/dist/data/diagnostics/utils.cjs.map +1 -1
  116. package/dist/data/diagnostics/utils.d.ts +1 -1
  117. package/dist/data/diagnostics/utils.d.ts.map +1 -1
  118. package/dist/data/diagnostics/utils.js +0 -12
  119. package/dist/data/diagnostics/utils.js.map +1 -1
  120. package/dist/data/task-status.cjs +108 -0
  121. package/dist/data/task-status.cjs.map +1 -0
  122. package/dist/data/task-status.d.ts +21 -0
  123. package/dist/data/task-status.d.ts.map +1 -0
  124. package/dist/data/task-status.js +108 -0
  125. package/dist/data/task-status.js.map +1 -0
  126. package/dist/data.cjs +21 -0
  127. package/dist/data.cjs.map +1 -1
  128. package/dist/data.d.ts +7 -1
  129. package/dist/data.d.ts.map +1 -1
  130. package/dist/data.js +21 -0
  131. package/dist/data.js.map +1 -1
  132. package/dist/hooks/use-task-run.cjs +137 -0
  133. package/dist/hooks/use-task-run.cjs.map +1 -0
  134. package/dist/hooks/use-task-run.d.ts +35 -0
  135. package/dist/hooks/use-task-run.d.ts.map +1 -0
  136. package/dist/hooks/use-task-run.js +137 -0
  137. package/dist/hooks/use-task-run.js.map +1 -0
  138. package/dist/hooks.cjs +3 -0
  139. package/dist/hooks.cjs.map +1 -1
  140. package/dist/hooks.d.ts +1 -0
  141. package/dist/hooks.d.ts.map +1 -1
  142. package/dist/hooks.js +3 -0
  143. package/dist/hooks.js.map +1 -1
  144. package/dist/index.cjs +37 -0
  145. package/dist/index.cjs.map +1 -1
  146. package/dist/index.js +37 -0
  147. package/dist/index.js.map +1 -1
  148. package/dist/lib/color.cjs +33 -0
  149. package/dist/lib/color.cjs.map +1 -0
  150. package/dist/lib/color.d.ts +10 -0
  151. package/dist/lib/color.d.ts.map +1 -0
  152. package/dist/lib/color.js +33 -0
  153. package/dist/lib/color.js.map +1 -0
  154. package/dist/lib/format.cjs +77 -0
  155. package/dist/lib/format.cjs.map +1 -0
  156. package/dist/lib/format.d.ts +30 -0
  157. package/dist/lib/format.d.ts.map +1 -0
  158. package/dist/lib/format.js +77 -0
  159. package/dist/lib/format.js.map +1 -0
  160. package/dist/overlay/DropdownMenu.cjs +18 -2
  161. package/dist/overlay/DropdownMenu.cjs.map +1 -1
  162. package/dist/overlay/DropdownMenu.d.ts +3 -1
  163. package/dist/overlay/DropdownMenu.d.ts.map +1 -1
  164. package/dist/overlay/DropdownMenu.js +18 -2
  165. package/dist/overlay/DropdownMenu.js.map +1 -1
  166. package/dist/rpc/types.cjs.map +1 -1
  167. package/dist/rpc/types.d.ts +4 -0
  168. package/dist/rpc/types.d.ts.map +1 -1
  169. package/dist/rpc/types.js.map +1 -1
  170. package/dist/styles.css +1 -1
  171. package/dist/utils.cjs +6 -0
  172. package/dist/utils.cjs.map +1 -1
  173. package/dist/utils.d.ts +1 -0
  174. package/dist/utils.d.ts.map +1 -1
  175. package/dist/utils.js +6 -0
  176. package/dist/utils.js.map +1 -1
  177. 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
@@ -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,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;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}