@dudousxd/nestjs-telescope-ui 2.0.0 → 2.0.1

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 (263) hide show
  1. package/CHANGELOG.md +748 -0
  2. package/README.md +31 -0
  3. package/dist/client/console-url.d.ts +11 -0
  4. package/dist/client/console-url.d.ts.map +1 -0
  5. package/dist/client/console-url.js +21 -0
  6. package/dist/client/console-url.js.map +1 -0
  7. package/dist/client/index.d.ts +2 -1
  8. package/dist/client/index.d.ts.map +1 -1
  9. package/dist/client/index.js +3 -0
  10. package/dist/client/index.js.map +1 -1
  11. package/dist/client/telescope-client.d.ts +64 -11
  12. package/dist/client/telescope-client.d.ts.map +1 -1
  13. package/dist/client/telescope-client.js +59 -54
  14. package/dist/client/telescope-client.js.map +1 -1
  15. package/dist/client/types.d.ts +431 -30
  16. package/dist/client/types.d.ts.map +1 -1
  17. package/dist/react/components/batch-timeline.js +2 -2
  18. package/dist/react/components/batch-timeline.js.map +1 -1
  19. package/dist/react/components/cache-badge.d.ts +14 -6
  20. package/dist/react/components/cache-badge.d.ts.map +1 -1
  21. package/dist/react/components/cache-badge.js +26 -12
  22. package/dist/react/components/cache-badge.js.map +1 -1
  23. package/dist/react/components/charts/area-chart-card.d.ts +11 -3
  24. package/dist/react/components/charts/area-chart-card.d.ts.map +1 -1
  25. package/dist/react/components/charts/area-chart-card.js +33 -6
  26. package/dist/react/components/charts/area-chart-card.js.map +1 -1
  27. package/dist/react/components/charts/bar-chart-card.d.ts +18 -7
  28. package/dist/react/components/charts/bar-chart-card.d.ts.map +1 -1
  29. package/dist/react/components/charts/bar-chart-card.js +18 -9
  30. package/dist/react/components/charts/bar-chart-card.js.map +1 -1
  31. package/dist/react/components/charts/breakdown-card.d.ts +17 -0
  32. package/dist/react/components/charts/breakdown-card.d.ts.map +1 -0
  33. package/dist/react/components/charts/breakdown-card.js +43 -0
  34. package/dist/react/components/charts/breakdown-card.js.map +1 -0
  35. package/dist/react/components/charts/chart-card.d.ts +7 -0
  36. package/dist/react/components/charts/chart-card.d.ts.map +1 -1
  37. package/dist/react/components/charts/chart-card.js +10 -3
  38. package/dist/react/components/charts/chart-card.js.map +1 -1
  39. package/dist/react/components/charts/chart-selection.d.ts +44 -0
  40. package/dist/react/components/charts/chart-selection.d.ts.map +1 -0
  41. package/dist/react/components/charts/chart-selection.js +36 -0
  42. package/dist/react/components/charts/chart-selection.js.map +1 -0
  43. package/dist/react/components/charts/chart-theme.d.ts +62 -19
  44. package/dist/react/components/charts/chart-theme.d.ts.map +1 -1
  45. package/dist/react/components/charts/chart-theme.js +72 -13
  46. package/dist/react/components/charts/chart-theme.js.map +1 -1
  47. package/dist/react/components/charts/distribution-chart-card.d.ts +17 -0
  48. package/dist/react/components/charts/distribution-chart-card.d.ts.map +1 -0
  49. package/dist/react/components/charts/distribution-chart-card.js +46 -0
  50. package/dist/react/components/charts/distribution-chart-card.js.map +1 -0
  51. package/dist/react/components/charts/gauge-card.d.ts +12 -0
  52. package/dist/react/components/charts/gauge-card.d.ts.map +1 -0
  53. package/dist/react/components/charts/gauge-card.js +17 -0
  54. package/dist/react/components/charts/gauge-card.js.map +1 -0
  55. package/dist/react/components/charts/index.d.ts +1 -0
  56. package/dist/react/components/charts/index.d.ts.map +1 -1
  57. package/dist/react/components/charts/index.js +1 -0
  58. package/dist/react/components/charts/index.js.map +1 -1
  59. package/dist/react/components/charts/stacked-area-chart-card.d.ts +17 -3
  60. package/dist/react/components/charts/stacked-area-chart-card.d.ts.map +1 -1
  61. package/dist/react/components/charts/stacked-area-chart-card.js +31 -8
  62. package/dist/react/components/charts/stacked-area-chart-card.js.map +1 -1
  63. package/dist/react/components/entries-table.d.ts.map +1 -1
  64. package/dist/react/components/entries-table.js +17 -3
  65. package/dist/react/components/entries-table.js.map +1 -1
  66. package/dist/react/components/entry-detail.d.ts +2 -0
  67. package/dist/react/components/entry-detail.d.ts.map +1 -1
  68. package/dist/react/components/entry-detail.js +186 -20
  69. package/dist/react/components/entry-detail.js.map +1 -1
  70. package/dist/react/components/entry-insights.d.ts.map +1 -1
  71. package/dist/react/components/entry-insights.js +28 -17
  72. package/dist/react/components/entry-insights.js.map +1 -1
  73. package/dist/react/components/entry-types.d.ts +29 -0
  74. package/dist/react/components/entry-types.d.ts.map +1 -1
  75. package/dist/react/components/entry-types.js +60 -0
  76. package/dist/react/components/entry-types.js.map +1 -1
  77. package/dist/react/components/export-json-toolbar.js +2 -2
  78. package/dist/react/components/export-json-toolbar.js.map +1 -1
  79. package/dist/react/components/extensions/panel-column-menu.d.ts +19 -0
  80. package/dist/react/components/extensions/panel-column-menu.d.ts.map +1 -0
  81. package/dist/react/components/extensions/panel-column-menu.js +47 -0
  82. package/dist/react/components/extensions/panel-column-menu.js.map +1 -0
  83. package/dist/react/components/extensions/panel-renderer.d.ts +46 -0
  84. package/dist/react/components/extensions/panel-renderer.d.ts.map +1 -0
  85. package/dist/react/components/extensions/panel-renderer.js +122 -0
  86. package/dist/react/components/extensions/panel-renderer.js.map +1 -0
  87. package/dist/react/components/extensions/panel-table-header.d.ts +18 -0
  88. package/dist/react/components/extensions/panel-table-header.d.ts.map +1 -0
  89. package/dist/react/components/extensions/panel-table-header.js +82 -0
  90. package/dist/react/components/extensions/panel-table-header.js.map +1 -0
  91. package/dist/react/components/extensions/panel-table.d.ts +27 -0
  92. package/dist/react/components/extensions/panel-table.d.ts.map +1 -0
  93. package/dist/react/components/extensions/panel-table.js +87 -0
  94. package/dist/react/components/extensions/panel-table.js.map +1 -0
  95. package/dist/react/components/extensions/stat-card.d.ts +18 -0
  96. package/dist/react/components/extensions/stat-card.d.ts.map +1 -0
  97. package/dist/react/components/extensions/stat-card.js +44 -0
  98. package/dist/react/components/extensions/stat-card.js.map +1 -0
  99. package/dist/react/components/extensions/table-columns.d.ts +32 -0
  100. package/dist/react/components/extensions/table-columns.d.ts.map +1 -0
  101. package/dist/react/components/extensions/table-columns.js +51 -0
  102. package/dist/react/components/extensions/table-columns.js.map +1 -0
  103. package/dist/react/components/extensions/table-features.d.ts +47 -0
  104. package/dist/react/components/extensions/table-features.d.ts.map +1 -0
  105. package/dist/react/components/extensions/table-features.js +45 -0
  106. package/dist/react/components/extensions/table-features.js.map +1 -0
  107. package/dist/react/components/extensions/table-query.d.ts +53 -0
  108. package/dist/react/components/extensions/table-query.d.ts.map +1 -0
  109. package/dist/react/components/extensions/table-query.js +51 -0
  110. package/dist/react/components/extensions/table-query.js.map +1 -0
  111. package/dist/react/components/flamegraph-view.d.ts +18 -0
  112. package/dist/react/components/flamegraph-view.d.ts.map +1 -0
  113. package/dist/react/components/flamegraph-view.js +48 -0
  114. package/dist/react/components/flamegraph-view.js.map +1 -0
  115. package/dist/react/components/flamegraph.d.ts +34 -0
  116. package/dist/react/components/flamegraph.d.ts.map +1 -0
  117. package/dist/react/components/flamegraph.js +54 -0
  118. package/dist/react/components/flamegraph.js.map +1 -0
  119. package/dist/react/components/inertia-badge.d.ts +33 -0
  120. package/dist/react/components/inertia-badge.d.ts.map +1 -0
  121. package/dist/react/components/inertia-badge.js +72 -0
  122. package/dist/react/components/inertia-badge.js.map +1 -0
  123. package/dist/react/components/inertia-body.d.ts +11 -0
  124. package/dist/react/components/inertia-body.d.ts.map +1 -0
  125. package/dist/react/components/inertia-body.js +127 -0
  126. package/dist/react/components/inertia-body.js.map +1 -0
  127. package/dist/react/components/official-event.d.ts +16 -0
  128. package/dist/react/components/official-event.d.ts.map +1 -0
  129. package/dist/react/components/official-event.js +88 -0
  130. package/dist/react/components/official-event.js.map +1 -0
  131. package/dist/react/components/pulse-panel.d.ts.map +1 -1
  132. package/dist/react/components/pulse-panel.js +6 -6
  133. package/dist/react/components/pulse-panel.js.map +1 -1
  134. package/dist/react/components/queues/EnqueueJobForm.d.ts.map +1 -1
  135. package/dist/react/components/queues/EnqueueJobForm.js +2 -1
  136. package/dist/react/components/queues/EnqueueJobForm.js.map +1 -1
  137. package/dist/react/components/queues/JobActions.d.ts.map +1 -1
  138. package/dist/react/components/queues/JobActions.js +11 -9
  139. package/dist/react/components/queues/JobActions.js.map +1 -1
  140. package/dist/react/components/queues/JobDetailDrawer.d.ts.map +1 -1
  141. package/dist/react/components/queues/JobDetailDrawer.js +8 -13
  142. package/dist/react/components/queues/JobDetailDrawer.js.map +1 -1
  143. package/dist/react/components/queues/JobTable.d.ts.map +1 -1
  144. package/dist/react/components/queues/JobTable.js +0 -0
  145. package/dist/react/components/queues/JobTable.js.map +1 -1
  146. package/dist/react/components/queues/QueueList.d.ts.map +1 -1
  147. package/dist/react/components/queues/QueueList.js +6 -6
  148. package/dist/react/components/queues/QueueList.js.map +1 -1
  149. package/dist/react/components/queues/QueueStateTabs.d.ts.map +1 -1
  150. package/dist/react/components/queues/QueueStateTabs.js +9 -7
  151. package/dist/react/components/queues/QueueStateTabs.js.map +1 -1
  152. package/dist/react/components/queues/queue-format.d.ts +5 -1
  153. package/dist/react/components/queues/queue-format.d.ts.map +1 -1
  154. package/dist/react/components/queues/queue-format.js +11 -7
  155. package/dist/react/components/queues/queue-format.js.map +1 -1
  156. package/dist/react/components/queues-panel.js +1 -1
  157. package/dist/react/components/queues-panel.js.map +1 -1
  158. package/dist/react/components/request-timeline.d.ts.map +1 -1
  159. package/dist/react/components/request-timeline.js +2 -2
  160. package/dist/react/components/request-timeline.js.map +1 -1
  161. package/dist/react/components/retention-indicator.d.ts.map +1 -1
  162. package/dist/react/components/retention-indicator.js +1 -1
  163. package/dist/react/components/retention-indicator.js.map +1 -1
  164. package/dist/react/components/sparkline.d.ts.map +1 -1
  165. package/dist/react/components/sparkline.js +1 -1
  166. package/dist/react/components/sparkline.js.map +1 -1
  167. package/dist/react/components/tag-autocomplete.d.ts +21 -4
  168. package/dist/react/components/tag-autocomplete.d.ts.map +1 -1
  169. package/dist/react/components/tag-autocomplete.js +57 -29
  170. package/dist/react/components/tag-autocomplete.js.map +1 -1
  171. package/dist/react/components/to-csv.d.ts +25 -0
  172. package/dist/react/components/to-csv.d.ts.map +1 -0
  173. package/dist/react/components/to-csv.js +78 -0
  174. package/dist/react/components/to-csv.js.map +1 -0
  175. package/dist/react/components/user-tag.d.ts +15 -0
  176. package/dist/react/components/user-tag.d.ts.map +1 -1
  177. package/dist/react/components/user-tag.js +19 -0
  178. package/dist/react/components/user-tag.js.map +1 -1
  179. package/dist/react/components/waterfall-view.d.ts +13 -0
  180. package/dist/react/components/waterfall-view.d.ts.map +1 -0
  181. package/dist/react/components/waterfall-view.js +58 -0
  182. package/dist/react/components/waterfall-view.js.map +1 -0
  183. package/dist/react/components/window-select.d.ts.map +1 -1
  184. package/dist/react/components/window-select.js +6 -2
  185. package/dist/react/components/window-select.js.map +1 -1
  186. package/dist/react/index.d.ts +7 -1
  187. package/dist/react/index.d.ts.map +1 -1
  188. package/dist/react/index.js +11 -1
  189. package/dist/react/index.js.map +1 -1
  190. package/dist/react/ui/badge.d.ts +16 -0
  191. package/dist/react/ui/badge.d.ts.map +1 -0
  192. package/dist/react/ui/badge.js +28 -0
  193. package/dist/react/ui/badge.js.map +1 -0
  194. package/dist/react/ui/button.d.ts +17 -0
  195. package/dist/react/ui/button.d.ts.map +1 -0
  196. package/dist/react/ui/button.js +35 -0
  197. package/dist/react/ui/button.js.map +1 -0
  198. package/dist/react/ui/chart.d.ts +116 -0
  199. package/dist/react/ui/chart.d.ts.map +1 -0
  200. package/dist/react/ui/chart.js +191 -0
  201. package/dist/react/ui/chart.js.map +1 -0
  202. package/dist/react/ui/cn.d.ts +8 -0
  203. package/dist/react/ui/cn.d.ts.map +1 -0
  204. package/dist/react/ui/cn.js +11 -0
  205. package/dist/react/ui/cn.js.map +1 -0
  206. package/dist/react/ui/dialog.d.ts +26 -0
  207. package/dist/react/ui/dialog.d.ts.map +1 -0
  208. package/dist/react/ui/dialog.js +40 -0
  209. package/dist/react/ui/dialog.js.map +1 -0
  210. package/dist/react/ui/index.d.ts +24 -0
  211. package/dist/react/ui/index.d.ts.map +1 -0
  212. package/dist/react/ui/index.js +24 -0
  213. package/dist/react/ui/index.js.map +1 -0
  214. package/dist/react/ui/input.d.ts +3 -0
  215. package/dist/react/ui/input.d.ts.map +1 -0
  216. package/dist/react/ui/input.js +8 -0
  217. package/dist/react/ui/input.js.map +1 -0
  218. package/dist/react/ui/select.d.ts +20 -0
  219. package/dist/react/ui/select.d.ts.map +1 -0
  220. package/dist/react/ui/select.js +27 -0
  221. package/dist/react/ui/select.js.map +1 -0
  222. package/dist/react/ui/table.d.ts +27 -0
  223. package/dist/react/ui/table.d.ts.map +1 -0
  224. package/dist/react/ui/table.js +22 -0
  225. package/dist/react/ui/table.js.map +1 -0
  226. package/dist/react/ui/tabs.d.ts +12 -0
  227. package/dist/react/ui/tabs.d.ts.map +1 -0
  228. package/dist/react/ui/tabs.js +20 -0
  229. package/dist/react/ui/tabs.js.map +1 -0
  230. package/dist/react/ui/tooltip.d.ts +10 -0
  231. package/dist/react/ui/tooltip.d.ts.map +1 -0
  232. package/dist/react/ui/tooltip.js +12 -0
  233. package/dist/react/ui/tooltip.js.map +1 -0
  234. package/dist/react/use-telescope-queries.d.ts +129 -130
  235. package/dist/react/use-telescope-queries.d.ts.map +1 -1
  236. package/dist/react/use-telescope-queries.js +146 -1
  237. package/dist/react/use-telescope-queries.js.map +1 -1
  238. package/dist/react/use-telescope-stream.d.ts +10 -0
  239. package/dist/react/use-telescope-stream.d.ts.map +1 -0
  240. package/dist/react/use-telescope-stream.js +40 -0
  241. package/dist/react/use-telescope-stream.js.map +1 -0
  242. package/dist/server/index.d.ts +2 -1
  243. package/dist/server/index.d.ts.map +1 -1
  244. package/dist/server/index.js +2 -0
  245. package/dist/server/index.js.map +1 -1
  246. package/dist/server/telescope-ui.module.d.ts +28 -1
  247. package/dist/server/telescope-ui.module.d.ts.map +1 -1
  248. package/dist/server/telescope-ui.module.js +42 -4
  249. package/dist/server/telescope-ui.module.js.map +1 -1
  250. package/dist/server/telescope-ui.options.d.ts +47 -0
  251. package/dist/server/telescope-ui.options.d.ts.map +1 -1
  252. package/dist/server/telescope-ui.options.js.map +1 -1
  253. package/dist/spa/assets/index-BPSlup7m.js +159 -0
  254. package/dist/spa/assets/index-DmsmJrlA.css +1 -0
  255. package/dist/spa/index.html +2 -2
  256. package/package.json +75 -36
  257. package/skills/telescope-ui-dashboard/SKILL.md +198 -0
  258. package/dist/react/components/type-tabs.d.ts +0 -5
  259. package/dist/react/components/type-tabs.d.ts.map +0 -1
  260. package/dist/react/components/type-tabs.js +0 -8
  261. package/dist/react/components/type-tabs.js.map +0 -1
  262. package/dist/spa/assets/index-CCzTpxj3.css +0 -1
  263. package/dist/spa/assets/index-w0XTI5OM.js +0 -135
@@ -1,32 +1,58 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useId, useRef, useState } from 'react';
3
- import { useTags } from '../use-telescope-queries.js';
4
- /** Top-N suggestions shown in the dropdown, sorted by count desc. */
5
- const MAX_SUGGESTIONS = 10;
6
- /** Sorts by count desc, caps to the top N, and (defensively) filters by the typed prefix
7
- * in case a stale/over-broad cache entry is served while a narrower query loads. */
8
- function rankSuggestions(tags, prefix) {
9
- const needle = prefix.trim().toLowerCase();
10
- return tags
11
- .filter((entry) => needle === '' || entry.tag.toLowerCase().includes(needle))
12
- .sort((left, right) => right.count - left.count)
13
- .slice(0, MAX_SUGGESTIONS);
3
+ import { Input } from '../ui/index.js';
4
+ import { useTagsInfinite } from '../use-telescope-queries.js';
5
+ /** How long typing settles before it becomes a request. Long enough that a word costs one query,
6
+ * short enough that the list feels attached to the keyboard. */
7
+ const SEARCH_DEBOUNCE_MS = 200;
8
+ /** How close to the bottom of the list a scroll gets before the next page is asked for. */
9
+ const LOAD_MORE_MARGIN_PX = 48;
10
+ /** Settles a value that changes on every keystroke into one that changes once typing stops. */
11
+ function useDebounced(value, ms) {
12
+ const [settled, setSettled] = useState(value);
13
+ useEffect(() => {
14
+ const timer = setTimeout(() => setSettled(value), ms);
15
+ return () => clearTimeout(timer);
16
+ }, [value, ms]);
17
+ return settled;
14
18
  }
15
19
  /**
16
- * Tag filter rendered as an accessible combobox: typing queries `GET /tags?prefix=`
17
- * and surfaces matching tags with their entry counts. Selecting one applies it as the
18
- * active `tag` filter and closes the list. Empty input shows no dropdown.
20
+ * Tag filter rendered as an accessible combobox: it lists the tags that exist, most-used first, with
21
+ * their entry counts. Selecting one applies it as the active `tag` filter; typing something the list
22
+ * does not offer still applies as typed, which a bounded list has to allow.
23
+ *
24
+ * Focus alone opens it — an operator should not have to guess a first character to discover what is
25
+ * there. Both the search and the paging happen on the SERVER: the list is bounded because tag
26
+ * cardinality grows with the data, so the values worth searching for are routinely the ones the
27
+ * bound cut, and a search over the fetched page could never find them.
19
28
  */
20
- export function TagAutocomplete({ onSelect }) {
29
+ export function TagAutocomplete({ onSelect, prefix = '', placeholder = 'Filter by tag…', ariaLabel = 'Filter by tag', }) {
21
30
  const [input, setInput] = useState('');
22
31
  const [open, setOpen] = useState(false);
23
32
  const [highlight, setHighlight] = useState(0);
24
33
  const containerRef = useRef(null);
25
34
  const listboxId = useId();
26
35
  const trimmed = input.trim();
27
- const { data } = useTags(trimmed);
28
- const suggestions = trimmed === '' ? [] : rankSuggestions(data ?? [], trimmed);
36
+ // The full tag the user is narrowing to — `user:` + `42` etc. The input shows only the stripped
37
+ // portion (the id), while the query works against the real, prefixed namespace so counts match.
38
+ const fullQuery = `${prefix}${trimmed}`;
39
+ const debouncedSearch = useDebounced(trimmed, SEARCH_DEBOUNCE_MS);
40
+ const tags = useTagsInfinite(prefix, debouncedSearch);
41
+ const suggestions = tags.data?.pages.flat() ?? [];
29
42
  const showList = open && suggestions.length > 0;
43
+ const listRef = useRef(null);
44
+ function onListScroll() {
45
+ const el = listRef.current;
46
+ if (!el || !tags.hasNextPage || tags.isFetchingNextPage)
47
+ return;
48
+ if (el.scrollTop + el.clientHeight >= el.scrollHeight - LOAD_MORE_MARGIN_PX) {
49
+ void tags.fetchNextPage();
50
+ }
51
+ }
52
+ /** What we show in the row / input for a tag — the prefix stripped off. */
53
+ function displayOf(tag) {
54
+ return prefix !== '' && tag.startsWith(prefix) ? tag.slice(prefix.length) : tag;
55
+ }
30
56
  // Clamp the highlight whenever the suggestion set shrinks.
31
57
  useEffect(() => {
32
58
  setHighlight((current) => (current >= suggestions.length ? 0 : current));
@@ -41,9 +67,11 @@ export function TagAutocomplete({ onSelect }) {
41
67
  document.addEventListener('mousedown', onPointerDown);
42
68
  return () => document.removeEventListener('mousedown', onPointerDown);
43
69
  }, []);
70
+ // `tag` is always the full, prefixed tag the filter applies; the input mirrors
71
+ // the stripped display so a User filter never shows the `user:` plumbing.
44
72
  function choose(tag) {
45
73
  onSelect(tag);
46
- setInput(tag);
74
+ setInput(displayOf(tag));
47
75
  setOpen(false);
48
76
  }
49
77
  function onKeyDown(event) {
@@ -53,7 +81,7 @@ export function TagAutocomplete({ onSelect }) {
53
81
  }
54
82
  if (!showList) {
55
83
  if (event.key === 'Enter' && trimmed !== '')
56
- choose(trimmed);
84
+ choose(fullQuery);
57
85
  return;
58
86
  }
59
87
  if (event.key === 'ArrowDown') {
@@ -70,21 +98,21 @@ export function TagAutocomplete({ onSelect }) {
70
98
  if (picked)
71
99
  choose(picked.tag);
72
100
  else if (trimmed !== '')
73
- choose(trimmed);
101
+ choose(fullQuery);
74
102
  }
75
103
  }
76
104
  const activeId = showList ? `${listboxId}-option-${highlight}` : undefined;
77
- return (_jsxs("div", { ref: containerRef, className: "relative", children: [_jsx("input", { type: "text", value: input, onChange: (event) => {
105
+ return (_jsxs("div", { ref: containerRef, className: "relative", children: [_jsx(Input, { type: "text", value: input, onChange: (event) => {
78
106
  setInput(event.target.value);
79
107
  setOpen(true);
80
- }, onFocus: () => setOpen(true), onKeyDown: onKeyDown, placeholder: "Filter by tag\u2026", "aria-label": "Filter by tag", role: "combobox", "aria-expanded": showList, "aria-controls": listboxId, "aria-autocomplete": "list", ...(activeId ? { 'aria-activedescendant': activeId } : {}), className: "rounded border border-zinc-800 bg-zinc-950 px-2 py-1 text-xs text-zinc-200 placeholder:text-zinc-600 focus:border-emerald-500 focus:outline-none" }), showList ? (_jsx("div", { id: listboxId,
108
+ }, onFocus: () => setOpen(true), onKeyDown: onKeyDown, placeholder: placeholder, "aria-label": ariaLabel, role: "combobox", "aria-expanded": showList, "aria-controls": listboxId, "aria-autocomplete": "list", ...(activeId ? { 'aria-activedescendant': activeId } : {}) }), showList ? (_jsxs("div", { id: listboxId,
81
109
  // biome-ignore lint/a11y/useSemanticElements: a <select> can't render styled tag+count option rows; ARIA combobox listbox pattern
82
- role: "listbox", "aria-label": "Tag suggestions", tabIndex: -1, className: "absolute left-0 top-full z-10 mt-1 max-h-64 w-48 overflow-auto rounded border border-zinc-800 bg-zinc-950 py-1 shadow-lg", children: suggestions.map((suggestion, index) => (_jsxs("div", { id: `${listboxId}-option-${index}`,
83
- // biome-ignore lint/a11y/useSemanticElements: <option> can't host the styled tag+count layout; ARIA combobox option pattern
84
- role: "option", tabIndex: -1, "aria-selected": index === highlight, onMouseDown: (event) => {
85
- // mousedown (not click) so the input's blur doesn't close the list first
86
- event.preventDefault();
87
- choose(suggestion.tag);
88
- }, onMouseEnter: () => setHighlight(index), className: `flex cursor-pointer items-center justify-between gap-3 px-2 py-1 text-xs ${index === highlight ? 'bg-zinc-800 text-zinc-100' : 'text-zinc-300'}`, children: [_jsx("span", { className: "truncate", children: suggestion.tag }), _jsx("span", { className: "shrink-0 text-zinc-500", children: suggestion.count })] }, suggestion.tag))) })) : null] }));
110
+ role: "listbox", "aria-label": "Tag suggestions", tabIndex: -1, ref: listRef, onScroll: onListScroll, className: "absolute left-0 top-full z-10 mt-1 max-h-64 w-48 overflow-auto rounded border border-line bg-popover py-1 shadow-lg", children: [suggestions.map((suggestion, index) => (_jsxs("div", { id: `${listboxId}-option-${index}`,
111
+ // biome-ignore lint/a11y/useSemanticElements: <option> can't host the styled tag+count layout; ARIA combobox option pattern
112
+ role: "option", tabIndex: -1, "aria-selected": index === highlight, onMouseDown: (event) => {
113
+ // mousedown (not click) so the input's blur doesn't close the list first
114
+ event.preventDefault();
115
+ choose(suggestion.tag);
116
+ }, onMouseEnter: () => setHighlight(index), className: `flex cursor-pointer items-center justify-between gap-3 px-2 py-1 text-xs ${index === highlight ? 'bg-panel-2 text-foreground' : 'text-foreground'}`, children: [_jsx("span", { className: "truncate", children: displayOf(suggestion.tag) }), _jsx("span", { className: "shrink-0 text-muted-foreground", children: suggestion.count })] }, suggestion.tag))), tags.isFetchingNextPage ? (_jsx("p", { className: "px-2 py-1 text-[10px] text-muted-foreground", children: "loading more\u2026" })) : null] })) : null] }));
89
117
  }
90
118
  //# sourceMappingURL=tag-autocomplete.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tag-autocomplete.js","sourceRoot":"","sources":["../../../src/react/components/tag-autocomplete.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tag-autocomplete.js","sourceRoot":"","sources":["../../../src/react/components/tag-autocomplete.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Pure, dependency-free CSV serialization for telescope entries, used by the
3
+ * Exports screen. Flattens the top-level entry fields (the columns a triage
4
+ * spreadsheet actually wants) plus a stringified `content` blob — nested content
5
+ * shapes vary by type, so we serialize the whole thing into one escaped cell
6
+ * rather than exploding into a ragged column set. Kept framework-free so it can
7
+ * be unit-tested in isolation, mirroring `export-json.ts`.
8
+ */
9
+ import type { Entry } from '../../client/index.js';
10
+ /** The fixed CSV column order. `content` is the JSON-stringified entry content. */
11
+ export declare const CSV_COLUMNS: readonly ["id", "type", "createdAt", "durationMs", "tags", "familyHash", "traceId", "content"];
12
+ /**
13
+ * Escape a single CSV field per RFC 4180: if it contains a quote, comma, or
14
+ * newline (CR or LF), wrap it in double quotes and double any embedded quotes.
15
+ * Plain fields pass through untouched so the common case stays readable.
16
+ */
17
+ export declare function escapeCsvField(value: string): string;
18
+ /**
19
+ * Render entries as a CSV document (header row + one row per entry), CRLF-
20
+ * terminated per RFC 4180. Every cell is escaped via {@link escapeCsvField}.
21
+ */
22
+ export declare function entriesToCsv(entries: Entry[]): string;
23
+ /** Trigger a browser download of `csv` text under `filename`, mirroring `downloadJson`. */
24
+ export declare function downloadCsv(filename: string, csv: string): void;
25
+ //# sourceMappingURL=to-csv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-csv.d.ts","sourceRoot":"","sources":["../../../src/react/components/to-csv.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,mFAAmF;AACnF,eAAO,MAAM,WAAW,gGASd,CAAC;AAEX;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKpD;AA0BD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,CAMrD;AAED,2FAA2F;AAC3F,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAU/D"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Pure, dependency-free CSV serialization for telescope entries, used by the
3
+ * Exports screen. Flattens the top-level entry fields (the columns a triage
4
+ * spreadsheet actually wants) plus a stringified `content` blob — nested content
5
+ * shapes vary by type, so we serialize the whole thing into one escaped cell
6
+ * rather than exploding into a ragged column set. Kept framework-free so it can
7
+ * be unit-tested in isolation, mirroring `export-json.ts`.
8
+ */
9
+ /** The fixed CSV column order. `content` is the JSON-stringified entry content. */
10
+ export const CSV_COLUMNS = [
11
+ 'id',
12
+ 'type',
13
+ 'createdAt',
14
+ 'durationMs',
15
+ 'tags',
16
+ 'familyHash',
17
+ 'traceId',
18
+ 'content',
19
+ ];
20
+ /**
21
+ * Escape a single CSV field per RFC 4180: if it contains a quote, comma, or
22
+ * newline (CR or LF), wrap it in double quotes and double any embedded quotes.
23
+ * Plain fields pass through untouched so the common case stays readable.
24
+ */
25
+ export function escapeCsvField(value) {
26
+ if (/[",\r\n]/.test(value)) {
27
+ return `"${value.replace(/"/g, '""')}"`;
28
+ }
29
+ return value;
30
+ }
31
+ /** Serialize an arbitrary value for the `content` cell, never throwing. */
32
+ function stringifyContent(content) {
33
+ if (content === null || content === undefined)
34
+ return '';
35
+ try {
36
+ return JSON.stringify(content) ?? String(content);
37
+ }
38
+ catch {
39
+ return String(content);
40
+ }
41
+ }
42
+ /** One CSV row of cells (pre-escape) for an entry, in {@link CSV_COLUMNS} order. */
43
+ function rowFor(entry) {
44
+ return [
45
+ entry.id,
46
+ entry.type,
47
+ entry.createdAt,
48
+ entry.durationMs === null ? '' : String(entry.durationMs),
49
+ entry.tags.join('; '),
50
+ entry.familyHash ?? '',
51
+ entry.traceId ?? '',
52
+ stringifyContent(entry.content),
53
+ ];
54
+ }
55
+ /**
56
+ * Render entries as a CSV document (header row + one row per entry), CRLF-
57
+ * terminated per RFC 4180. Every cell is escaped via {@link escapeCsvField}.
58
+ */
59
+ export function entriesToCsv(entries) {
60
+ const lines = [CSV_COLUMNS.map(escapeCsvField).join(',')];
61
+ for (const entry of entries) {
62
+ lines.push(rowFor(entry).map(escapeCsvField).join(','));
63
+ }
64
+ return lines.join('\r\n');
65
+ }
66
+ /** Trigger a browser download of `csv` text under `filename`, mirroring `downloadJson`. */
67
+ export function downloadCsv(filename, csv) {
68
+ const blob = new Blob([csv], { type: 'text/csv' });
69
+ const url = URL.createObjectURL(blob);
70
+ const anchor = document.createElement('a');
71
+ anchor.href = url;
72
+ anchor.download = filename;
73
+ document.body.appendChild(anchor);
74
+ anchor.click();
75
+ anchor.remove();
76
+ URL.revokeObjectURL(url);
77
+ }
78
+ //# sourceMappingURL=to-csv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-csv.js","sourceRoot":"","sources":["../../../src/react/components/to-csv.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,mFAAmF;AACnF,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI;IACJ,MAAM;IACN,WAAW;IACX,YAAY;IACZ,MAAM;IACN,YAAY;IACZ,SAAS;IACT,SAAS;CACD,CAAC;AAEX;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;IAC1C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,2EAA2E;AAC3E,SAAS,gBAAgB,CAAC,OAAgB;IACxC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACzD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED,oFAAoF;AACpF,SAAS,MAAM,CAAC,KAAY;IAC1B,OAAO;QACL,KAAK,CAAC,EAAE;QACR,KAAK,CAAC,IAAI;QACV,KAAK,CAAC,SAAS;QACf,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACrB,KAAK,CAAC,UAAU,IAAI,EAAE;QACtB,KAAK,CAAC,OAAO,IAAI,EAAE;QACnB,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC;KAChC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,MAAM,KAAK,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,GAAW;IACvD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC;IAClB,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,MAAM,CAAC,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC"}
@@ -11,4 +11,19 @@ export declare function findUserTag(tags: readonly string[]): string | null;
11
11
  export declare function userTagId(userTag: string): string;
12
12
  /** Hash-router href to the all-types entries list filtered by a `user:<id>` tag. */
13
13
  export declare function buildUserActivityHref(userTag: string): string;
14
+ /** The fixed prefix the dedicated User filter narrows the tag search to. */
15
+ export declare const USER_TAG_FILTER_PREFIX = "user:";
16
+ /**
17
+ * True when `tag` is a populated `user:<id>` tag — i.e. the active tag filter is
18
+ * really a user pivot and should render in the User control, not the generic
19
+ * tag chip. A bare `user:` (no id) is NOT a user filter.
20
+ */
21
+ export declare function isUserTag(tag: string): boolean;
22
+ /**
23
+ * Prepends the `user:` prefix to a raw user id to form the underlying tag the
24
+ * entries query filters by. Idempotent: an already-prefixed value passes
25
+ * through unchanged, so the autocomplete (which surfaces full `user:<id>` tags)
26
+ * and a hand-typed bare id both resolve to the same tag.
27
+ */
28
+ export declare function toUserTag(idOrTag: string): string;
14
29
  //# sourceMappingURL=user-tag.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"user-tag.d.ts","sourceRoot":"","sources":["../../../src/react/components/user-tag.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,kFAAkF;AAClF,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAKlE;AAED,kFAAkF;AAClF,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,oFAAoF;AACpF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE7D"}
1
+ {"version":3,"file":"user-tag.d.ts","sourceRoot":"","sources":["../../../src/react/components/user-tag.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,kFAAkF;AAClF,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAKlE;AAED,kFAAkF;AAClF,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,oFAAoF;AACpF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,4EAA4E;AAC5E,eAAO,MAAM,sBAAsB,UAAkB,CAAC;AAEtD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjD"}
@@ -22,4 +22,23 @@ export function userTagId(userTag) {
22
22
  export function buildUserActivityHref(userTag) {
23
23
  return `#/entries?tag=${encodeURIComponent(userTag)}`;
24
24
  }
25
+ /** The fixed prefix the dedicated User filter narrows the tag search to. */
26
+ export const USER_TAG_FILTER_PREFIX = USER_TAG_PREFIX;
27
+ /**
28
+ * True when `tag` is a populated `user:<id>` tag — i.e. the active tag filter is
29
+ * really a user pivot and should render in the User control, not the generic
30
+ * tag chip. A bare `user:` (no id) is NOT a user filter.
31
+ */
32
+ export function isUserTag(tag) {
33
+ return tag.startsWith(USER_TAG_PREFIX) && tag.length > USER_TAG_PREFIX.length;
34
+ }
35
+ /**
36
+ * Prepends the `user:` prefix to a raw user id to form the underlying tag the
37
+ * entries query filters by. Idempotent: an already-prefixed value passes
38
+ * through unchanged, so the autocomplete (which surfaces full `user:<id>` tags)
39
+ * and a hand-typed bare id both resolve to the same tag.
40
+ */
41
+ export function toUserTag(idOrTag) {
42
+ return idOrTag.startsWith(USER_TAG_PREFIX) ? idOrTag : `${USER_TAG_PREFIX}${idOrTag}`;
43
+ }
25
44
  //# sourceMappingURL=user-tag.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"user-tag.js","sourceRoot":"","sources":["../../../src/react/components/user-tag.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,eAAe,GAAG,OAAO,CAAC;AAEhC,kFAAkF;AAClF,MAAM,UAAU,WAAW,CAAC,IAAuB;IACjD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM;YAAE,OAAO,GAAG,CAAC;IACzF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,OAAO,iBAAiB,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;AACxD,CAAC"}
1
+ {"version":3,"file":"user-tag.js","sourceRoot":"","sources":["../../../src/react/components/user-tag.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,eAAe,GAAG,OAAO,CAAC;AAEhC,kFAAkF;AAClF,MAAM,UAAU,WAAW,CAAC,IAAuB;IACjD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM;YAAE,OAAO,GAAG,CAAC;IACzF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,OAAO,iBAAiB,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;AACxD,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,MAAM,sBAAsB,GAAG,eAAe,CAAC;AAEtD;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC;AAChF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,eAAe,GAAG,OAAO,EAAE,CAAC;AACxF,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { Waterfall } from '../../client/index.js';
2
+ export interface WaterfallViewProps {
3
+ waterfall: Waterfall;
4
+ onSelect?: ((id: string) => void) | undefined;
5
+ }
6
+ /**
7
+ * Renders a nested span waterfall as a flat, indented timeline — each row a bar
8
+ * positioned by its start offset and sized by its duration, indented by nesting
9
+ * depth (Sentry/Tempo style). The bars are derived entirely from the headless
10
+ * `/traces/:id/waterfall` payload.
11
+ */
12
+ export declare function WaterfallView({ waterfall, onSelect }: WaterfallViewProps): JSX.Element;
13
+ //# sourceMappingURL=waterfall-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waterfall-view.d.ts","sourceRoot":"","sources":["../../../src/react/components/waterfall-view.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,uBAAuB,CAAC;AA+EtE,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC/C;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,kBAAkB,GAAG,GAAG,CAAC,OAAO,CAqBtF"}
@@ -0,0 +1,58 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /** Per-entry-type bar colour, mirroring the dashboard's entry-type palette. */
3
+ const TYPE_COLOR = {
4
+ request: 'bg-sky-500',
5
+ query: 'bg-amber-500',
6
+ http_client: 'bg-violet-500',
7
+ job: 'bg-emerald-500',
8
+ cache: 'bg-teal-500',
9
+ exception: 'bg-rose-500',
10
+ event: 'bg-indigo-500',
11
+ log: 'bg-zinc-500',
12
+ mail: 'bg-pink-500',
13
+ redis: 'bg-red-500',
14
+ };
15
+ function colorFor(type) {
16
+ return TYPE_COLOR[type] ?? 'bg-zinc-600';
17
+ }
18
+ function formatMs(ms) {
19
+ if (ms < 1)
20
+ return '<1ms';
21
+ if (ms < 1000)
22
+ return `${Math.round(ms)}ms`;
23
+ return `${(ms / 1000).toFixed(2)}s`;
24
+ }
25
+ /** A flattened list of spans in depth-first order, preserving nesting via depth. */
26
+ function flatten(spans) {
27
+ const out = [];
28
+ const walk = (list) => {
29
+ for (const span of list) {
30
+ out.push(span);
31
+ if (span.children.length > 0)
32
+ walk(span.children);
33
+ }
34
+ };
35
+ walk(spans);
36
+ return out;
37
+ }
38
+ function WaterfallRow({ span, totalDurationMs, onSelect }) {
39
+ // Guard against a zero-width trace (all instant spans) so bars stay visible.
40
+ const span100 = totalDurationMs > 0 ? totalDurationMs : 1;
41
+ const leftPct = Math.min(100, (span.offsetMs / span100) * 100);
42
+ const widthPct = Math.max(0.5, Math.min(100 - leftPct, (span.durationMs / span100) * 100));
43
+ return (_jsxs("button", { type: "button", onClick: () => onSelect?.(span.id), "data-testid": "waterfall-row", className: "flex w-full items-center gap-2 rounded px-1 py-0.5 text-left text-[11px] hover:bg-panel-2", children: [_jsxs("span", { className: "min-w-0 flex-shrink-0 truncate font-mono text-foreground", style: { width: '40%', paddingLeft: `${span.depth * 12}px` }, title: span.label, children: [_jsx("span", { className: "mr-1 text-muted-foreground", children: span.type }), span.label] }), _jsx("span", { className: "relative h-3 flex-1 rounded bg-panel", children: _jsx("span", { className: `absolute top-0 h-3 rounded ${colorFor(span.type)}`, style: { left: `${leftPct}%`, width: `${widthPct}%` }, title: `${formatMs(span.offsetMs)} +${formatMs(span.durationMs)}` }) }), _jsx("span", { className: "w-16 flex-shrink-0 text-right tabular-nums text-muted-foreground", children: formatMs(span.durationMs) })] }));
44
+ }
45
+ /**
46
+ * Renders a nested span waterfall as a flat, indented timeline — each row a bar
47
+ * positioned by its start offset and sized by its duration, indented by nesting
48
+ * depth (Sentry/Tempo style). The bars are derived entirely from the headless
49
+ * `/traces/:id/waterfall` payload.
50
+ */
51
+ export function WaterfallView({ waterfall, onSelect }) {
52
+ const rows = flatten(waterfall.spans);
53
+ if (rows.length === 0) {
54
+ return _jsx("p", { className: "text-muted-foreground", children: "No spans in this trace" });
55
+ }
56
+ return (_jsxs("div", { className: "space-y-0.5", children: [_jsxs("div", { className: "mb-1 flex items-center justify-between text-[10px] uppercase tracking-wide text-muted-foreground", children: [_jsx("span", { children: "Span" }), _jsxs("span", { children: ["Total ", formatMs(waterfall.totalDurationMs)] })] }), rows.map((span) => (_jsx(WaterfallRow, { span: span, totalDurationMs: waterfall.totalDurationMs, onSelect: onSelect }, span.id)))] }));
57
+ }
58
+ //# sourceMappingURL=waterfall-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waterfall-view.js","sourceRoot":"","sources":["../../../src/react/components/waterfall-view.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"window-select.d.ts","sourceRoot":"","sources":["../../../src/react/components/window-select.tsx"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,GACT,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,CAchE"}
1
+ {"version":3,"file":"window-select.d.ts","sourceRoot":"","sources":["../../../src/react/components/window-select.tsx"],"names":[],"mappings":"AAIA,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,GACT,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,CAoBhE"}
@@ -1,6 +1,10 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/index.js';
2
3
  const WINDOWS = ['15m', '1h', '6h', '24h'];
3
4
  export function WindowSelect({ value, onChange, }) {
4
- return (_jsx("select", { value: value, onChange: (event) => onChange(event.target.value), className: "rounded border border-zinc-800 bg-zinc-900 px-2 py-1 text-xs text-zinc-300", children: WINDOWS.map((w) => (_jsx("option", { value: w, children: w }, w))) }));
5
+ return (_jsxs(Select, { value: value, onValueChange: (next) => {
6
+ if (typeof next === 'string')
7
+ onChange(next);
8
+ }, children: [_jsx(SelectTrigger, { "aria-label": "Time window", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { align: "end", children: WINDOWS.map((w) => (_jsx(SelectItem, { value: w, children: w }, w))) })] }));
5
9
  }
6
10
  //# sourceMappingURL=window-select.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"window-select.js","sourceRoot":"","sources":["../../../src/react/components/window-select.tsx"],"names":[],"mappings":";AAAA,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAU,CAAC;AAEpD,MAAM,UAAU,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,GACyC;IACjD,OAAO,CACL,iBACE,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EACjD,SAAS,EAAC,4EAA4E,YAErF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAClB,iBAAgB,KAAK,EAAE,CAAC,YACrB,CAAC,IADS,CAAC,CAEL,CACV,CAAC,GACK,CACV,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"window-select.js","sourceRoot":"","sources":["../../../src/react/components/window-select.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE/F,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAU,CAAC;AAEpD,MAAM,UAAU,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,GACyC;IACjD,OAAO,CACL,MAAC,MAAM,IACL,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;YACtB,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC,aAED,KAAC,aAAa,kBAAY,aAAa,YACrC,KAAC,WAAW,KAAG,GACD,EAChB,KAAC,aAAa,IAAC,KAAK,EAAC,KAAK,YACvB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAClB,KAAC,UAAU,IAAS,KAAK,EAAE,CAAC,YACzB,CAAC,IADa,CAAC,CAEL,CACd,CAAC,GACY,IACT,CACV,CAAC;AACJ,CAAC"}
@@ -1,15 +1,21 @@
1
1
  export * from './telescope-context.js';
2
2
  export * from './use-telescope-queries.js';
3
+ export * from './use-telescope-stream.js';
3
4
  export * from './components/entry-types.js';
4
- export * from './components/type-tabs.js';
5
5
  export * from './components/entries-table.js';
6
6
  export * from './components/user-tag.js';
7
7
  export * from './components/batch-timeline.js';
8
+ export * from './components/waterfall-view.js';
9
+ export * from './components/flamegraph.js';
10
+ export * from './components/flamegraph-view.js';
8
11
  export * from './components/entry-detail.js';
9
12
  export * from './components/export-json.js';
10
13
  export * from './components/export-json-toolbar.js';
14
+ export * from './components/to-csv.js';
11
15
  export * from './components/retention-indicator.js';
12
16
  export * from './components/cache-badge.js';
17
+ export * from './components/inertia-badge.js';
18
+ export * from './components/inertia-body.js';
13
19
  export * from './components/entry-insights.js';
14
20
  export * from './components/window-select.js';
15
21
  export * from './components/tag-autocomplete.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAK1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AACpD,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC"}
@@ -1,15 +1,25 @@
1
1
  export * from './telescope-context.js';
2
2
  export * from './use-telescope-queries.js';
3
+ export * from './use-telescope-stream.js';
4
+ // Console launcher, three tiers: `openTelescopeConsole` (no React, from `./client`),
5
+ // `useOpenTelescopeConsole` (state only, your markup), `<OpenTelescopeConsoleButton>` (drop-in).
6
+ // `openTelescopeConsoleMutationOptions` wires the same call into TanStack Query without this
7
+ // package depending on TanStack.
3
8
  export * from './components/entry-types.js';
4
- export * from './components/type-tabs.js';
5
9
  export * from './components/entries-table.js';
6
10
  export * from './components/user-tag.js';
7
11
  export * from './components/batch-timeline.js';
12
+ export * from './components/waterfall-view.js';
13
+ export * from './components/flamegraph.js';
14
+ export * from './components/flamegraph-view.js';
8
15
  export * from './components/entry-detail.js';
9
16
  export * from './components/export-json.js';
10
17
  export * from './components/export-json-toolbar.js';
18
+ export * from './components/to-csv.js';
11
19
  export * from './components/retention-indicator.js';
12
20
  export * from './components/cache-badge.js';
21
+ export * from './components/inertia-badge.js';
22
+ export * from './components/inertia-body.js';
13
23
  export * from './components/entry-insights.js';
14
24
  export * from './components/window-select.js';
15
25
  export * from './components/tag-autocomplete.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,qFAAqF;AACrF,iGAAiG;AACjG,6FAA6F;AAC7F,iCAAiC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AACpD,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type VariantProps } from 'class-variance-authority';
2
+ /**
3
+ * Vendored shadcn `Badge`, retuned to the Aviary tokens.
4
+ *
5
+ * Variants are semantic, not decorative: `good`/`warn`/`bad` are the status
6
+ * hues, `brand` is "interactive / branded", `muted` is a neutral label. Entry
7
+ * TYPE colours are a separate categorical palette (see `entry-types.ts`) and
8
+ * deliberately do not go through here.
9
+ */
10
+ export declare const badgeVariants: (props?: ({
11
+ variant?: "muted" | "brand" | "good" | "warn" | "bad" | "outline" | null | undefined;
12
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
13
+ export interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement>, VariantProps<typeof badgeVariants> {
14
+ }
15
+ export declare function Badge({ className, variant, ...props }: BadgeProps): JSX.Element;
16
+ //# sourceMappingURL=badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../../src/react/ui/badge.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAO,MAAM,0BAA0B,CAAC;AAGlE;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa;;8EAezB,CAAC;AAEF,MAAM,WAAW,UACf,SAAQ,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,EAC3C,YAAY,CAAC,OAAO,aAAa,CAAC;CAAG;AAEzC,wBAAgB,KAAK,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,UAAU,GAAG,GAAG,CAAC,OAAO,CAE/E"}
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cva } from 'class-variance-authority';
3
+ import { cn } from './cn.js';
4
+ /**
5
+ * Vendored shadcn `Badge`, retuned to the Aviary tokens.
6
+ *
7
+ * Variants are semantic, not decorative: `good`/`warn`/`bad` are the status
8
+ * hues, `brand` is "interactive / branded", `muted` is a neutral label. Entry
9
+ * TYPE colours are a separate categorical palette (see `entry-types.ts`) and
10
+ * deliberately do not go through here.
11
+ */
12
+ export const badgeVariants = cva('inline-flex items-center gap-1 rounded border px-1.5 py-0.5 text-[10px] font-medium', {
13
+ variants: {
14
+ variant: {
15
+ muted: 'tint-muted',
16
+ brand: 'tint-brand',
17
+ good: 'tint-good',
18
+ warn: 'tint-warn',
19
+ bad: 'tint-bad',
20
+ outline: 'border-line bg-transparent text-muted-foreground',
21
+ },
22
+ },
23
+ defaultVariants: { variant: 'muted' },
24
+ });
25
+ export function Badge({ className, variant, ...props }) {
26
+ return _jsx("span", { className: cn(badgeVariants({ variant }), className), ...props });
27
+ }
28
+ //# sourceMappingURL=badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.js","sourceRoot":"","sources":["../../../src/react/ui/badge.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAqB,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE7B;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAC9B,qFAAqF,EACrF;IACE,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,KAAK,EAAE,YAAY;YACnB,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,WAAW;YACjB,GAAG,EAAE,UAAU;YACf,OAAO,EAAE,kDAAkD;SAC5D;KACF;IACD,eAAe,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE;CACtC,CACF,CAAC;AAMF,MAAM,UAAU,KAAK,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,EAAc;IAChE,OAAO,eAAM,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,CAAC,KAAM,KAAK,GAAI,CAAC;AACnF,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type VariantProps } from 'class-variance-authority';
2
+ /**
3
+ * Vendored shadcn `Button`, retuned to the Aviary tokens.
4
+ *
5
+ * The console's real button vocabulary is small and uniform: bordered, low-key,
6
+ * xs/uppercase. `outline` is the default because that is what every toolbar,
7
+ * header control and row action already looked like; `accent`/`good`/`warn`/
8
+ * `bad` are the tinted states those controls toggle into.
9
+ */
10
+ export declare const buttonVariants: (props?: ({
11
+ variant?: "brand" | "good" | "warn" | "bad" | "outline" | "ghost" | "solid" | null | undefined;
12
+ size?: "xs" | "sm" | "md" | null | undefined;
13
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
14
+ export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
15
+ }
16
+ export declare const Button: import("react").ForwardRefExoticComponent<ButtonProps & import("react").RefAttributes<HTMLButtonElement>>;
17
+ //# sourceMappingURL=button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../src/react/ui/button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAO,MAAM,0BAA0B,CAAC;AAIlE;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc;;;8EAsB1B,CAAC;AAEF,MAAM,WAAW,WACf,SAAQ,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EACnD,YAAY,CAAC,OAAO,cAAc,CAAC;CAAG;AAE1C,eAAO,MAAM,MAAM,2GAYjB,CAAC"}