@dudousxd/nestjs-telescope-ui 1.0.0

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 (179) hide show
  1. package/CHANGELOG.md +349 -0
  2. package/LICENSE +21 -0
  3. package/README.md +51 -0
  4. package/dist/client/index.d.ts +4 -0
  5. package/dist/client/index.d.ts.map +1 -0
  6. package/dist/client/index.js +2 -0
  7. package/dist/client/index.js.map +1 -0
  8. package/dist/client/telescope-client.d.ts +63 -0
  9. package/dist/client/telescope-client.d.ts.map +1 -0
  10. package/dist/client/telescope-client.js +87 -0
  11. package/dist/client/telescope-client.js.map +1 -0
  12. package/dist/client/types.d.ts +267 -0
  13. package/dist/client/types.d.ts.map +1 -0
  14. package/dist/client/types.js +2 -0
  15. package/dist/client/types.js.map +1 -0
  16. package/dist/react/components/batch-timeline.d.ts +7 -0
  17. package/dist/react/components/batch-timeline.d.ts.map +1 -0
  18. package/dist/react/components/batch-timeline.js +10 -0
  19. package/dist/react/components/batch-timeline.js.map +1 -0
  20. package/dist/react/components/cache-badge.d.ts +20 -0
  21. package/dist/react/components/cache-badge.d.ts.map +1 -0
  22. package/dist/react/components/cache-badge.js +42 -0
  23. package/dist/react/components/cache-badge.js.map +1 -0
  24. package/dist/react/components/charts/area-chart-card.d.ts +16 -0
  25. package/dist/react/components/charts/area-chart-card.d.ts.map +1 -0
  26. package/dist/react/components/charts/area-chart-card.js +12 -0
  27. package/dist/react/components/charts/area-chart-card.js.map +1 -0
  28. package/dist/react/components/charts/bar-chart-card.d.ts +26 -0
  29. package/dist/react/components/charts/bar-chart-card.d.ts.map +1 -0
  30. package/dist/react/components/charts/bar-chart-card.js +27 -0
  31. package/dist/react/components/charts/bar-chart-card.js.map +1 -0
  32. package/dist/react/components/charts/chart-card.d.ts +11 -0
  33. package/dist/react/components/charts/chart-card.d.ts.map +1 -0
  34. package/dist/react/components/charts/chart-card.js +9 -0
  35. package/dist/react/components/charts/chart-card.js.map +1 -0
  36. package/dist/react/components/charts/chart-theme.d.ts +41 -0
  37. package/dist/react/components/charts/chart-theme.d.ts.map +1 -0
  38. package/dist/react/components/charts/chart-theme.js +53 -0
  39. package/dist/react/components/charts/chart-theme.js.map +1 -0
  40. package/dist/react/components/charts/index.d.ts +6 -0
  41. package/dist/react/components/charts/index.d.ts.map +1 -0
  42. package/dist/react/components/charts/index.js +6 -0
  43. package/dist/react/components/charts/index.js.map +1 -0
  44. package/dist/react/components/charts/stacked-area-chart-card.d.ts +14 -0
  45. package/dist/react/components/charts/stacked-area-chart-card.d.ts.map +1 -0
  46. package/dist/react/components/charts/stacked-area-chart-card.js +13 -0
  47. package/dist/react/components/charts/stacked-area-chart-card.js.map +1 -0
  48. package/dist/react/components/entries-table.d.ts +11 -0
  49. package/dist/react/components/entries-table.d.ts.map +1 -0
  50. package/dist/react/components/entries-table.js +68 -0
  51. package/dist/react/components/entries-table.js.map +1 -0
  52. package/dist/react/components/entry-detail.d.ts +6 -0
  53. package/dist/react/components/entry-detail.d.ts.map +1 -0
  54. package/dist/react/components/entry-detail.js +110 -0
  55. package/dist/react/components/entry-detail.js.map +1 -0
  56. package/dist/react/components/entry-insights.d.ts +5 -0
  57. package/dist/react/components/entry-insights.d.ts.map +1 -0
  58. package/dist/react/components/entry-insights.js +107 -0
  59. package/dist/react/components/entry-insights.js.map +1 -0
  60. package/dist/react/components/entry-types.d.ts +40 -0
  61. package/dist/react/components/entry-types.d.ts.map +1 -0
  62. package/dist/react/components/entry-types.js +44 -0
  63. package/dist/react/components/entry-types.js.map +1 -0
  64. package/dist/react/components/export-json-toolbar.d.ts +9 -0
  65. package/dist/react/components/export-json-toolbar.d.ts.map +1 -0
  66. package/dist/react/components/export-json-toolbar.js +21 -0
  67. package/dist/react/components/export-json-toolbar.js.map +1 -0
  68. package/dist/react/components/export-json.d.ts +14 -0
  69. package/dist/react/components/export-json.d.ts.map +1 -0
  70. package/dist/react/components/export-json.js +44 -0
  71. package/dist/react/components/export-json.js.map +1 -0
  72. package/dist/react/components/pulse-panel.d.ts +9 -0
  73. package/dist/react/components/pulse-panel.d.ts.map +1 -0
  74. package/dist/react/components/pulse-panel.js +20 -0
  75. package/dist/react/components/pulse-panel.js.map +1 -0
  76. package/dist/react/components/queue-sparkline.d.ts +5 -0
  77. package/dist/react/components/queue-sparkline.d.ts.map +1 -0
  78. package/dist/react/components/queue-sparkline.js +8 -0
  79. package/dist/react/components/queue-sparkline.js.map +1 -0
  80. package/dist/react/components/queues/EnqueueJobForm.d.ts +14 -0
  81. package/dist/react/components/queues/EnqueueJobForm.d.ts.map +1 -0
  82. package/dist/react/components/queues/EnqueueJobForm.js +61 -0
  83. package/dist/react/components/queues/EnqueueJobForm.js.map +1 -0
  84. package/dist/react/components/queues/JobActions.d.ts +38 -0
  85. package/dist/react/components/queues/JobActions.d.ts.map +1 -0
  86. package/dist/react/components/queues/JobActions.js +106 -0
  87. package/dist/react/components/queues/JobActions.js.map +1 -0
  88. package/dist/react/components/queues/JobDetailDrawer.d.ts +11 -0
  89. package/dist/react/components/queues/JobDetailDrawer.d.ts.map +1 -0
  90. package/dist/react/components/queues/JobDetailDrawer.js +45 -0
  91. package/dist/react/components/queues/JobDetailDrawer.js.map +1 -0
  92. package/dist/react/components/queues/JobTable.d.ts +13 -0
  93. package/dist/react/components/queues/JobTable.d.ts.map +1 -0
  94. package/dist/react/components/queues/JobTable.js +0 -0
  95. package/dist/react/components/queues/JobTable.js.map +1 -0
  96. package/dist/react/components/queues/QueueList.d.ts +8 -0
  97. package/dist/react/components/queues/QueueList.d.ts.map +1 -0
  98. package/dist/react/components/queues/QueueList.js +27 -0
  99. package/dist/react/components/queues/QueueList.js.map +1 -0
  100. package/dist/react/components/queues/QueueStateTabs.d.ts +7 -0
  101. package/dist/react/components/queues/QueueStateTabs.d.ts.map +1 -0
  102. package/dist/react/components/queues/QueueStateTabs.js +12 -0
  103. package/dist/react/components/queues/QueueStateTabs.js.map +1 -0
  104. package/dist/react/components/queues/index.d.ts +8 -0
  105. package/dist/react/components/queues/index.d.ts.map +1 -0
  106. package/dist/react/components/queues/index.js +8 -0
  107. package/dist/react/components/queues/index.js.map +1 -0
  108. package/dist/react/components/queues/queue-format.d.ts +8 -0
  109. package/dist/react/components/queues/queue-format.d.ts.map +1 -0
  110. package/dist/react/components/queues/queue-format.js +51 -0
  111. package/dist/react/components/queues/queue-format.js.map +1 -0
  112. package/dist/react/components/queues-panel.d.ts +6 -0
  113. package/dist/react/components/queues-panel.d.ts.map +1 -0
  114. package/dist/react/components/queues-panel.js +8 -0
  115. package/dist/react/components/queues-panel.js.map +1 -0
  116. package/dist/react/components/request-timeline.d.ts +14 -0
  117. package/dist/react/components/request-timeline.d.ts.map +1 -0
  118. package/dist/react/components/request-timeline.js +30 -0
  119. package/dist/react/components/request-timeline.js.map +1 -0
  120. package/dist/react/components/retention-indicator.d.ts +10 -0
  121. package/dist/react/components/retention-indicator.d.ts.map +1 -0
  122. package/dist/react/components/retention-indicator.js +38 -0
  123. package/dist/react/components/retention-indicator.js.map +1 -0
  124. package/dist/react/components/sparkline.d.ts +7 -0
  125. package/dist/react/components/sparkline.d.ts.map +1 -0
  126. package/dist/react/components/sparkline.js +20 -0
  127. package/dist/react/components/sparkline.js.map +1 -0
  128. package/dist/react/components/stacked-bars.d.ts +21 -0
  129. package/dist/react/components/stacked-bars.d.ts.map +1 -0
  130. package/dist/react/components/stacked-bars.js +51 -0
  131. package/dist/react/components/stacked-bars.js.map +1 -0
  132. package/dist/react/components/tag-autocomplete.d.ts +12 -0
  133. package/dist/react/components/tag-autocomplete.d.ts.map +1 -0
  134. package/dist/react/components/tag-autocomplete.js +90 -0
  135. package/dist/react/components/tag-autocomplete.js.map +1 -0
  136. package/dist/react/components/trace-link.d.ts +6 -0
  137. package/dist/react/components/trace-link.d.ts.map +1 -0
  138. package/dist/react/components/trace-link.js +10 -0
  139. package/dist/react/components/trace-link.js.map +1 -0
  140. package/dist/react/components/type-tabs.d.ts +5 -0
  141. package/dist/react/components/type-tabs.d.ts.map +1 -0
  142. package/dist/react/components/type-tabs.js +8 -0
  143. package/dist/react/components/type-tabs.js.map +1 -0
  144. package/dist/react/components/window-select.d.ts +5 -0
  145. package/dist/react/components/window-select.d.ts.map +1 -0
  146. package/dist/react/components/window-select.js +6 -0
  147. package/dist/react/components/window-select.js.map +1 -0
  148. package/dist/react/index.d.ts +23 -0
  149. package/dist/react/index.d.ts.map +1 -0
  150. package/dist/react/index.js +23 -0
  151. package/dist/react/index.js.map +1 -0
  152. package/dist/react/telescope-context.d.ts +14 -0
  153. package/dist/react/telescope-context.d.ts.map +1 -0
  154. package/dist/react/telescope-context.js +27 -0
  155. package/dist/react/telescope-context.js.map +1 -0
  156. package/dist/react/use-telescope-queries.d.ts +244 -0
  157. package/dist/react/use-telescope-queries.d.ts.map +1 -0
  158. package/dist/react/use-telescope-queries.js +216 -0
  159. package/dist/react/use-telescope-queries.js.map +1 -0
  160. package/dist/server/index.d.ts +3 -0
  161. package/dist/server/index.d.ts.map +1 -0
  162. package/dist/server/index.js +2 -0
  163. package/dist/server/index.js.map +1 -0
  164. package/dist/server/telescope-ui.controller.d.ts +10 -0
  165. package/dist/server/telescope-ui.controller.d.ts.map +1 -0
  166. package/dist/server/telescope-ui.controller.js +105 -0
  167. package/dist/server/telescope-ui.controller.js.map +1 -0
  168. package/dist/server/telescope-ui.module.d.ts +6 -0
  169. package/dist/server/telescope-ui.module.d.ts.map +1 -0
  170. package/dist/server/telescope-ui.module.js +26 -0
  171. package/dist/server/telescope-ui.module.js.map +1 -0
  172. package/dist/server/telescope-ui.options.d.ts +12 -0
  173. package/dist/server/telescope-ui.options.d.ts.map +1 -0
  174. package/dist/server/telescope-ui.options.js +2 -0
  175. package/dist/server/telescope-ui.options.js.map +1 -0
  176. package/dist/spa/assets/index-BHS361H_.js +135 -0
  177. package/dist/spa/assets/index-DsBEgxHC.css +1 -0
  178. package/dist/spa/index.html +13 -0
  179. package/package.json +97 -0
@@ -0,0 +1,6 @@
1
+ export * from './chart-theme.js';
2
+ export * from './chart-card.js';
3
+ export * from './area-chart-card.js';
4
+ export * from './stacked-area-chart-card.js';
5
+ export * from './bar-chart-card.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/react/components/charts/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from './chart-theme.js';
2
+ export * from './chart-card.js';
3
+ export * from './area-chart-card.js';
4
+ export * from './stacked-area-chart-card.js';
5
+ export * from './bar-chart-card.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/react/components/charts/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /** Each row carries the x-axis `label` plus one numeric key per series. */
2
+ export type StackedAreaRow = {
3
+ label: string;
4
+ } & Record<string, string | number>;
5
+ /** Multi-series stacked area chart with a legend, colored per entry type. */
6
+ export declare function StackedAreaChartCard({ title, data, series, right, height, }: {
7
+ title: string;
8
+ data: StackedAreaRow[];
9
+ /** Ordered list of series keys (e.g. entry types) to stack. */
10
+ series: string[];
11
+ right?: React.ReactNode;
12
+ height?: number;
13
+ }): JSX.Element;
14
+ //# sourceMappingURL=stacked-area-chart-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stacked-area-chart-card.d.ts","sourceRoot":"","sources":["../../../../src/react/components/charts/stacked-area-chart-card.tsx"],"names":[],"mappings":"AAoBA,2EAA2E;AAC3E,MAAM,MAAM,cAAc,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;AAEjF,6EAA6E;AAC7E,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,IAAI,EACJ,MAAM,EACN,KAAK,EACL,MAAY,GACb,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,GAAG,CAAC,OAAO,CAyDd"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Area, AreaChart, CartesianGrid, Legend, ResponsiveContainer, Tooltip, XAxis, YAxis, } from 'recharts';
3
+ import { ChartCard, ChartEmptyState } from './chart-card.js';
4
+ import { axisTickStyle, chartTheme, hexForType, tooltipContentStyle, tooltipItemStyle, tooltipLabelStyle, } from './chart-theme.js';
5
+ /** Multi-series stacked area chart with a legend, colored per entry type. */
6
+ export function StackedAreaChartCard({ title, data, series, right, height = 240, }) {
7
+ const bodyHeight = height - 64;
8
+ return (_jsx(ChartCard, { title: title, right: right, height: bodyHeight, children: data.length === 0 || series.length === 0 ? (_jsx(ChartEmptyState, { height: bodyHeight })) : (_jsx(ResponsiveContainer, { width: "100%", height: "100%", children: _jsxs(AreaChart, { data: data, margin: { top: 4, right: 8, bottom: 0, left: -16 }, children: [_jsx(CartesianGrid, { stroke: chartTheme.gridStroke, vertical: false }), _jsx(XAxis, { dataKey: "label", tick: axisTickStyle, stroke: chartTheme.axisStroke, tickLine: false, minTickGap: 24 }), _jsx(YAxis, { tick: axisTickStyle, stroke: chartTheme.axisStroke, tickLine: false, width: 40, allowDecimals: false }), _jsx(Tooltip, { contentStyle: tooltipContentStyle, labelStyle: tooltipLabelStyle, itemStyle: tooltipItemStyle, cursor: { stroke: chartTheme.axisStroke } }), _jsx(Legend, { iconType: "circle", iconSize: 8, wrapperStyle: { fontSize: 10, color: chartTheme.legendText } }), series.map((key, index) => {
9
+ const color = hexForType(key, index);
10
+ return (_jsx(Area, { type: "monotone", dataKey: key, name: key, stackId: "1", stroke: color, strokeWidth: 1.5, fill: color, fillOpacity: 0.25, isAnimationActive: false }, key));
11
+ })] }) })) }));
12
+ }
13
+ //# sourceMappingURL=stacked-area-chart-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stacked-area-chart-card.js","sourceRoot":"","sources":["../../../../src/react/components/charts/stacked-area-chart-card.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,IAAI,EACJ,SAAS,EACT,aAAa,EACb,MAAM,EACN,mBAAmB,EACnB,OAAO,EACP,KAAK,EACL,KAAK,GACN,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EACL,aAAa,EACb,UAAU,EACV,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAK1B,6EAA6E;AAC7E,MAAM,UAAU,oBAAoB,CAAC,EACnC,KAAK,EACL,IAAI,EACJ,MAAM,EACN,KAAK,EACL,MAAM,GAAG,GAAG,GAQb;IACC,MAAM,UAAU,GAAG,MAAM,GAAG,EAAE,CAAC;IAC/B,OAAO,CACL,KAAC,SAAS,IAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,YACtD,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC1C,KAAC,eAAe,IAAC,MAAM,EAAE,UAAU,GAAI,CACxC,CAAC,CAAC,CAAC,CACF,KAAC,mBAAmB,IAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,YAC7C,MAAC,SAAS,IAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,aACvE,KAAC,aAAa,IAAC,MAAM,EAAE,UAAU,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,GAAI,EACjE,KAAC,KAAK,IACJ,OAAO,EAAC,OAAO,EACf,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,UAAU,CAAC,UAAU,EAC7B,QAAQ,EAAE,KAAK,EACf,UAAU,EAAE,EAAE,GACd,EACF,KAAC,KAAK,IACJ,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,UAAU,CAAC,UAAU,EAC7B,QAAQ,EAAE,KAAK,EACf,KAAK,EAAE,EAAE,EACT,aAAa,EAAE,KAAK,GACpB,EACF,KAAC,OAAO,IACN,YAAY,EAAE,mBAAmB,EACjC,UAAU,EAAE,iBAAiB,EAC7B,SAAS,EAAE,gBAAgB,EAC3B,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,UAAU,EAAE,GACzC,EACF,KAAC,MAAM,IACL,QAAQ,EAAC,QAAQ,EACjB,QAAQ,EAAE,CAAC,EACX,YAAY,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,UAAU,EAAE,GAC5D,EACD,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;wBACzB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;wBACrC,OAAO,CACL,KAAC,IAAI,IAEH,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,GAAG,EACZ,IAAI,EAAE,GAAG,EACT,OAAO,EAAC,GAAG,EACX,MAAM,EAAE,KAAK,EACb,WAAW,EAAE,GAAG,EAChB,IAAI,EAAE,KAAK,EACX,WAAW,EAAE,IAAI,EACjB,iBAAiB,EAAE,KAAK,IATnB,GAAG,CAUR,CACH,CAAC;oBACJ,CAAC,CAAC,IACQ,GACQ,CACvB,GACS,CACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Entry } from '../../client/index.js';
2
+ export declare function entryLabel(entry: Entry): string;
3
+ /** A short, single-line preview of redis command args for table summaries. */
4
+ export declare function redisArgsPreview(args: unknown): string;
5
+ /** A short, single-line preview of a dump value for table summaries. */
6
+ export declare function dumpValuePreview(value: unknown): string;
7
+ export declare function EntriesTable({ entries, onSelect, }: {
8
+ entries: Entry[];
9
+ onSelect?: (id: string) => void;
10
+ }): JSX.Element;
11
+ //# sourceMappingURL=entries-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entries-table.d.ts","sourceRoot":"","sources":["../../../src/react/components/entries-table.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAGnD,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAkC/C;AAED,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAItD;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CASvD;AAED,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,QAAQ,GACT,EAAE;IAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,CAuDrE"}
@@ -0,0 +1,68 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { CacheBadge } from './cache-badge.js';
3
+ export function entryLabel(entry) {
4
+ const content = entry.content;
5
+ if (typeof content === 'object' && content !== null) {
6
+ const record = content;
7
+ if (typeof record.uri === 'string') {
8
+ return typeof record.method === 'string' ? `${record.method} ${record.uri}` : record.uri;
9
+ }
10
+ if (typeof record.sql === 'string')
11
+ return record.sql;
12
+ if (typeof record.queue === 'string' && typeof record.name === 'string') {
13
+ return `${record.queue}:${record.name}`;
14
+ }
15
+ if (entry.type === 'dump') {
16
+ if (typeof record.label === 'string' && record.label.length > 0)
17
+ return record.label;
18
+ return dumpValuePreview(record.value);
19
+ }
20
+ if (entry.type === 'event' && typeof record.name === 'string')
21
+ return record.name;
22
+ if (entry.type === 'model' && typeof record.action === 'string') {
23
+ const entity = typeof record.entity === 'string' ? record.entity : '';
24
+ const id = record.id === null || record.id === undefined ? '' : `#${String(record.id)}`;
25
+ return `${record.action} ${entity}${id}`;
26
+ }
27
+ if (entry.type === 'redis' && typeof record.command === 'string') {
28
+ return `${record.command} ${redisArgsPreview(record.args)}`.trim();
29
+ }
30
+ if (entry.type === 'log' && typeof record.message === 'string') {
31
+ const level = typeof record.level === 'string' ? record.level : 'log';
32
+ return `[${level}] ${record.message}`;
33
+ }
34
+ if (typeof record.message === 'string')
35
+ return record.message;
36
+ if (typeof record.url === 'string') {
37
+ return typeof record.method === 'string' ? `${record.method} ${record.url}` : record.url;
38
+ }
39
+ }
40
+ return entry.type;
41
+ }
42
+ /** A short, single-line preview of redis command args for table summaries. */
43
+ export function redisArgsPreview(args) {
44
+ if (!Array.isArray(args) || args.length === 0)
45
+ return '';
46
+ const text = args.map((arg) => (typeof arg === 'string' ? arg : String(arg))).join(' ');
47
+ return text.length > 60 ? `${text.slice(0, 60)}…` : text;
48
+ }
49
+ /** A short, single-line preview of a dump value for table summaries. */
50
+ export function dumpValuePreview(value) {
51
+ if (typeof value === 'string')
52
+ return value;
53
+ let text;
54
+ try {
55
+ text = JSON.stringify(value) ?? String(value);
56
+ }
57
+ catch {
58
+ text = String(value);
59
+ }
60
+ return text.length > 80 ? `${text.slice(0, 80)}…` : text;
61
+ }
62
+ export function EntriesTable({ entries, onSelect, }) {
63
+ return (_jsxs("table", { className: "w-full text-left text-xs", children: [_jsx("thead", { className: "text-zinc-500", children: _jsxs("tr", { children: [_jsx("th", { className: "py-2 font-normal", children: "Time" }), _jsx("th", { className: "font-normal", children: "Type" }), _jsx("th", { className: "font-normal", children: "Summary" }), _jsx("th", { className: "font-normal", children: "Duration" }), _jsx("th", { className: "font-normal", children: "Tags" })] }) }), _jsx("tbody", { children: entries.map((entry) => (_jsxs("tr", { onClick: () => onSelect?.(entry.id), onKeyDown: (event) => {
64
+ if (event.key === 'Enter' || event.key === ' ')
65
+ onSelect?.(entry.id);
66
+ }, className: "cursor-pointer border-t border-zinc-900 hover:bg-zinc-900", children: [_jsx("td", { className: "py-1.5 text-zinc-500", children: new Date(entry.createdAt).toLocaleTimeString() }), _jsx("td", { className: "text-emerald-400", children: entry.type }), _jsx("td", { className: "max-w-md truncate text-zinc-300", children: _jsxs("span", { className: "inline-flex items-center gap-1.5", children: [entry.type === 'cache' ? _jsx(CacheBadge, { content: entry.content }) : null, _jsx("span", { className: "truncate", children: entryLabel(entry) })] }) }), _jsx("td", { className: "text-zinc-400", children: entry.durationMs != null ? `${entry.durationMs}ms` : '—' }), _jsx("td", { className: "text-zinc-600", children: _jsxs("span", { className: "inline-flex items-center gap-1.5", children: [entry.traceId !== null && (_jsxs("a", { href: `#/traces/${entry.traceId}`, title: `View trace ${entry.traceId}`, onClick: (event) => event.stopPropagation(), className: "rounded bg-zinc-900 px-1.5 py-0.5 font-mono text-[10px] text-sky-400 hover:bg-zinc-800", children: ["trace:", entry.traceId.slice(0, 6)] })), entry.tags.length > 0 && _jsx("span", { children: entry.tags.join(' ') })] }) })] }, entry.id))) })] }));
67
+ }
68
+ //# sourceMappingURL=entries-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entries-table.js","sourceRoot":"","sources":["../../../src/react/components/entries-table.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { EntryWithBatch } from '../../client/index.js';
2
+ export declare function EntryDetail({ entry, onSelect, }: {
3
+ entry: EntryWithBatch;
4
+ onSelect?: (id: string) => void;
5
+ }): JSX.Element;
6
+ //# sourceMappingURL=entry-detail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-detail.d.ts","sourceRoot":"","sources":["../../../src/react/components/entry-detail.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAQ5D,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,GACT,EAAE;IAAE,KAAK,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,CAuD1E"}
@@ -0,0 +1,110 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMeta } from '../use-telescope-queries.js';
3
+ import { BatchTimeline } from './batch-timeline.js';
4
+ import { CacheBadge } from './cache-badge.js';
5
+ import { ExportJsonToolbar } from './export-json-toolbar.js';
6
+ import { RequestTimeline } from './request-timeline.js';
7
+ import { buildTraceHref } from './trace-link.js';
8
+ export function EntryDetail({ entry, onSelect, }) {
9
+ const { data: meta } = useMeta();
10
+ const showTimeline = entry.type === 'request' && entry.batch.length > 1;
11
+ return (_jsxs("div", { className: "grid grid-cols-3 gap-6", children: [_jsxs("section", { className: "col-span-2", children: [_jsxs("div", { className: "mb-2 flex items-center justify-between gap-2", children: [_jsxs("h2", { className: "flex items-center gap-2 text-sm text-emerald-400", children: [entry.type, entry.type === 'cache' ? _jsx(CacheBadge, { content: entry.content }) : null] }), _jsx(ExportJsonToolbar, { value: entry, filename: `telescope-entry-${entry.id}.json` })] }), showTimeline ? (_jsxs("div", { className: "mb-4", children: [_jsx("h3", { className: "mb-2 text-xs uppercase tracking-wide text-zinc-500", children: "Timeline" }), _jsx(RequestTimeline, { batch: entry.batch, requestId: entry.id, onSelect: onSelect })] })) : null, entry.type === 'dump' ? (_jsx(DumpBody, { content: entry.content })) : entry.type === 'event' ? (_jsx(EventBody, { content: entry.content })) : entry.type === 'log' ? (_jsx(LogBody, { content: entry.content })) : entry.type === 'model' ? (_jsx(ModelBody, { content: entry.content })) : entry.type === 'redis' ? (_jsx(RedisBody, { content: entry.content })) : entry.type === 'request' ? (_jsx(RequestBody, { content: entry.content })) : (_jsx("pre", { className: "overflow-auto rounded bg-zinc-900 p-3 text-xs text-zinc-300", children: JSON.stringify(entry.content, null, 2) }))] }), _jsxs("aside", { children: [entry.traceId ? (_jsxs("div", { className: "mb-4", children: [_jsx("h3", { className: "mb-2 text-xs uppercase tracking-wide text-zinc-500", children: "Trace" }), _jsx(TraceRow, { traceId: entry.traceId, spanId: entry.spanId, traceLink: meta?.traceLink ?? null })] })) : null, _jsxs("h3", { className: "mb-2 text-xs uppercase tracking-wide text-zinc-500", children: ["Batch (", entry.batch.length, ")"] }), _jsx(BatchTimeline, { batch: entry.batch, currentId: entry.id, onSelect: onSelect })] })] }));
12
+ }
13
+ /** Pretty-print a dump value to JSON, falling back to String() if not serializable. */
14
+ function prettyJson(value) {
15
+ try {
16
+ return JSON.stringify(value, null, 2) ?? String(value);
17
+ }
18
+ catch {
19
+ return String(value);
20
+ }
21
+ }
22
+ function DumpBody({ content }) {
23
+ const record = typeof content === 'object' && content !== null ? content : {};
24
+ const label = typeof record.label === 'string' ? record.label : null;
25
+ return (_jsxs("div", { children: [label ? _jsx("h3", { className: "mb-2 font-mono text-sm text-fuchsia-400", children: label }) : null, _jsx("pre", { className: "overflow-auto rounded bg-zinc-900 p-3 text-xs text-zinc-300", children: prettyJson(record.value) })] }));
26
+ }
27
+ /** Tailwind text color for a log level badge. */
28
+ function logLevelColor(level) {
29
+ switch (level) {
30
+ case 'error':
31
+ return 'text-red-400';
32
+ case 'warn':
33
+ return 'text-amber-400';
34
+ case 'debug':
35
+ case 'verbose':
36
+ return 'text-zinc-500';
37
+ default:
38
+ return 'text-zinc-300';
39
+ }
40
+ }
41
+ function EventBody({ content }) {
42
+ const record = typeof content === 'object' && content !== null ? content : {};
43
+ const name = typeof record.name === 'string' ? record.name : String(record.name ?? '');
44
+ const listenerCount = typeof record.listenerCount === 'number' ? record.listenerCount : null;
45
+ return (_jsxs("div", { children: [_jsxs("h3", { className: "mb-2 flex items-center gap-2 font-mono text-sm text-indigo-400", children: [name, listenerCount !== null ? (_jsxs("span", { className: "rounded bg-zinc-900 px-1.5 py-0.5 text-[10px] text-zinc-500", children: [listenerCount, " listener", listenerCount === 1 ? '' : 's'] })) : null] }), _jsx("pre", { className: "overflow-auto rounded bg-zinc-900 p-3 text-xs text-zinc-300", children: prettyJson(record.payload) })] }));
46
+ }
47
+ /** Tailwind text color for a model action badge. */
48
+ function modelActionColor(action) {
49
+ switch (action) {
50
+ case 'create':
51
+ return 'text-emerald-400';
52
+ case 'update':
53
+ return 'text-amber-400';
54
+ case 'delete':
55
+ return 'text-red-400';
56
+ default:
57
+ return 'text-zinc-300';
58
+ }
59
+ }
60
+ function ModelBody({ content }) {
61
+ const record = typeof content === 'object' && content !== null ? content : {};
62
+ const action = typeof record.action === 'string' ? record.action : 'update';
63
+ const entity = typeof record.entity === 'string' ? record.entity : String(record.entity ?? '');
64
+ const id = record.id === null || record.id === undefined ? null : String(record.id);
65
+ return (_jsxs("div", { children: [_jsxs("h3", { className: "mb-2 flex items-center gap-2 font-mono text-sm text-lime-400", children: [_jsx("span", { className: `rounded bg-zinc-900 px-1.5 py-0.5 text-[10px] uppercase ${modelActionColor(action)}`, children: action }), _jsx("span", { children: entity }), id !== null ? _jsxs("span", { className: "text-zinc-500", children: ["#", id] }) : null] }), _jsx("pre", { className: "overflow-auto rounded bg-zinc-900 p-3 text-xs text-zinc-300", children: prettyJson(record.changes) })] }));
66
+ }
67
+ function RedisBody({ content }) {
68
+ const record = typeof content === 'object' && content !== null ? content : {};
69
+ const command = typeof record.command === 'string' ? record.command : String(record.command ?? '');
70
+ const durationMs = typeof record.durationMs === 'number' ? record.durationMs : null;
71
+ return (_jsxs("div", { children: [_jsxs("h3", { className: "mb-2 flex items-center gap-2 font-mono text-sm text-rose-400", children: [command, durationMs !== null ? (_jsxs("span", { className: "rounded bg-zinc-900 px-1.5 py-0.5 text-[10px] text-zinc-500", children: [durationMs, " ms"] })) : null] }), _jsx("pre", { className: "overflow-auto rounded bg-zinc-900 p-3 text-xs text-zinc-300", children: prettyJson(record.args) })] }));
72
+ }
73
+ /** True when a value is a non-null object or non-empty array (worth rendering). */
74
+ function hasContent(value) {
75
+ if (value === null || value === undefined)
76
+ return false;
77
+ if (Array.isArray(value))
78
+ return value.length > 0;
79
+ if (typeof value === 'object')
80
+ return Object.keys(value).length > 0;
81
+ return true;
82
+ }
83
+ function RequestHeaders({ headers }) {
84
+ const entries = Object.entries(headers);
85
+ return (_jsxs("details", { className: "mb-4", children: [_jsxs("summary", { className: "cursor-pointer text-xs uppercase tracking-wide text-zinc-500", children: ["Headers (", entries.length, ")"] }), _jsx("dl", { className: "mt-2 grid grid-cols-[max-content_1fr] gap-x-3 gap-y-1 rounded bg-zinc-900 p-3 text-xs", children: entries.map(([key, value]) => (_jsxs("div", { className: "contents", children: [_jsx("dt", { className: "font-mono text-zinc-500", children: key }), _jsx("dd", { className: "break-all font-mono text-zinc-300", children: typeof value === 'string' ? value : prettyJson(value) })] }, key))) })] }));
86
+ }
87
+ function RequestBody({ content }) {
88
+ const record = typeof content === 'object' && content !== null ? content : {};
89
+ const headers = typeof record.headers === 'object' && record.headers !== null
90
+ ? record.headers
91
+ : {};
92
+ const method = typeof record.method === 'string' ? record.method : String(record.method ?? '');
93
+ const uri = typeof record.uri === 'string' ? record.uri : String(record.uri ?? '');
94
+ const statusCode = typeof record.statusCode === 'number' ? record.statusCode : null;
95
+ const ip = typeof record.ip === 'string' ? record.ip : null;
96
+ const hasUser = 'user' in record && record.user !== null && record.user !== undefined;
97
+ return (_jsxs("div", { children: [_jsxs("h3", { className: "mb-3 flex items-center gap-2 font-mono text-sm text-emerald-400", children: [_jsx("span", { className: "rounded bg-zinc-900 px-1.5 py-0.5 text-[10px] uppercase", children: method }), _jsx("span", { className: "text-zinc-300", children: uri }), statusCode !== null ? (_jsx("span", { className: "rounded bg-zinc-900 px-1.5 py-0.5 text-[10px] text-zinc-500", children: statusCode })) : null, ip ? _jsx("span", { className: "text-[10px] text-zinc-500", children: ip }) : null] }), _jsx(RequestHeaders, { headers: headers }), _jsx("h3", { className: "mb-2 text-xs uppercase tracking-wide text-zinc-500", children: "Payload" }), hasContent(record.payload) ? (_jsx("pre", { className: "mb-4 overflow-auto rounded bg-zinc-900 p-3 text-xs text-zinc-300", children: prettyJson(record.payload) })) : (_jsx("p", { className: "mb-4 text-xs text-zinc-600", children: "No payload" })), _jsx("h3", { className: "mb-2 text-xs uppercase tracking-wide text-zinc-500", children: "User" }), hasUser ? (_jsx("pre", { className: "overflow-auto rounded bg-zinc-900 p-3 text-xs text-zinc-300", children: prettyJson(record.user) })) : (_jsx("p", { className: "text-xs text-zinc-600", children: "anonymous" }))] }));
98
+ }
99
+ function LogBody({ content }) {
100
+ const record = typeof content === 'object' && content !== null ? content : {};
101
+ const level = typeof record.level === 'string' ? record.level : 'log';
102
+ const message = typeof record.message === 'string' ? record.message : String(record.message ?? '');
103
+ const context = typeof record.context === 'string' ? record.context : null;
104
+ return (_jsxs("div", { children: [_jsxs("h3", { className: "mb-2 flex items-center gap-2 text-sm", children: [_jsx("span", { className: `rounded bg-zinc-900 px-1.5 py-0.5 font-mono text-[10px] uppercase ${logLevelColor(level)}`, children: level }), context ? _jsx("span", { className: "font-mono text-xs text-zinc-500", children: context }) : null] }), _jsx("pre", { className: "overflow-auto rounded bg-zinc-900 p-3 text-xs text-zinc-300", children: message })] }));
105
+ }
106
+ function TraceRow({ traceId, spanId, traceLink, }) {
107
+ const href = buildTraceHref(traceLink, traceId, spanId ?? '');
108
+ return (_jsxs("div", { children: [href ? (_jsx("a", { href: href, target: "_blank", rel: "noreferrer", className: "font-mono text-[11px] text-emerald-400 hover:underline", children: traceId })) : (_jsx("div", { className: "font-mono text-[11px] text-zinc-300", children: traceId })), spanId ? _jsx("div", { className: "font-mono text-[10px] text-zinc-500", children: spanId }) : null, _jsx("a", { href: `#/traces/${traceId}`, className: "mt-1 inline-block text-[11px] text-emerald-400 hover:underline", children: "View all in this trace" })] }));
109
+ }
110
+ //# sourceMappingURL=entry-detail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-detail.js","sourceRoot":"","sources":["../../../src/react/components/entry-detail.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Per-type analytics header (stat cards + charts) rendered above the entries table. */
2
+ export declare function EntryInsights({ type }: {
3
+ type: string;
4
+ }): JSX.Element | null;
5
+ //# sourceMappingURL=entry-insights.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-insights.d.ts","sourceRoot":"","sources":["../../../src/react/components/entry-insights.tsx"],"names":[],"mappings":"AA4RA,wFAAwF;AACxF,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAa5E"}
@@ -0,0 +1,107 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Link, useNavigate } from 'react-router-dom';
3
+ import { useStats } from '../use-telescope-queries.js';
4
+ import { AreaChartCard, BarChartCard } from './charts/index.js';
5
+ import { relativeTime } from './queues/queue-format.js';
6
+ const DEFAULT_WINDOW = '1h';
7
+ function formatBucketTime(iso) {
8
+ const date = new Date(iso);
9
+ if (Number.isNaN(date.getTime()))
10
+ return iso;
11
+ return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
12
+ }
13
+ function toAreaSeries(report) {
14
+ return (report?.buckets ?? []).map((bucket) => ({
15
+ label: formatBucketTime(bucket.t),
16
+ value: bucket.total,
17
+ }));
18
+ }
19
+ function StatCard({ label, value, accent = 'text-zinc-100', }) {
20
+ return (_jsxs("div", { className: "rounded-lg border border-zinc-800 bg-zinc-900/40 px-4 py-3", children: [_jsx("p", { className: "text-[10px] uppercase tracking-wide text-zinc-500", children: label }), _jsx("p", { className: `mt-1 text-2xl font-semibold tabular-nums ${accent}`, children: value })] }));
21
+ }
22
+ function StatRow({ children }) {
23
+ return _jsx("div", { className: "grid grid-cols-2 gap-3 sm:grid-cols-4", children: children });
24
+ }
25
+ function ChartRow({ children }) {
26
+ return _jsx("div", { className: "grid grid-cols-1 gap-4 lg:grid-cols-2", children: children });
27
+ }
28
+ function familyBars(families) {
29
+ return families.map((family) => ({
30
+ label: family.label !== '' ? family.label : family.familyHash.slice(0, 12),
31
+ value: family.p99,
32
+ id: family.familyHash,
33
+ }));
34
+ }
35
+ function statusBars(status) {
36
+ return [
37
+ { label: '2xx', value: status['2xx'], color: '#34d399' },
38
+ { label: '3xx', value: status['3xx'], color: '#38bdf8' },
39
+ { label: '4xx', value: status['4xx'], color: '#fbbf24' },
40
+ { label: '5xx', value: status['5xx'], color: '#f87171' },
41
+ { label: 'other', value: status.other, color: '#71717a' },
42
+ ];
43
+ }
44
+ function cacheKeyBars(cache) {
45
+ return cache.topKeys.map((entry) => ({ label: entry.key, value: entry.count }));
46
+ }
47
+ function QueryInsights({ stats }) {
48
+ const latency = stats.latency;
49
+ const navigate = useNavigate();
50
+ return (_jsxs(_Fragment, { children: [_jsxs(StatRow, { children: [_jsx(StatCard, { label: "Total", value: stats.total.toLocaleString() }), _jsx(StatCard, { label: "p50 ms", value: latency ? latency.p50.toLocaleString() : '—' }), _jsx(StatCard, { label: "p99 ms", value: latency ? latency.p99.toLocaleString() : '—', accent: "text-sky-400" }), _jsx(StatCard, { label: "Slow", value: latency ? latency.slow.toLocaleString() : '—', accent: latency && latency.slow > 0 ? 'text-amber-400' : 'text-zinc-100' })] }), _jsxs(ChartRow, { children: [stats.families ? (_jsx(BarChartCard, { title: "Slowest query shapes (p99)", valueLabel: "p99 ms", data: familyBars(stats.families), horizontal: true, truncateLabel: 40, onBarClick: (datum) => {
51
+ if (datum.id !== undefined) {
52
+ navigate(`/entries/query?familyHash=${encodeURIComponent(datum.id)}`);
53
+ }
54
+ } })) : null, _jsx(AreaChartCard, { title: "Queries over time", valueLabel: "queries", data: toAreaSeries(stats.overTime) })] })] }));
55
+ }
56
+ function CacheInsights({ stats }) {
57
+ const cache = stats.cache;
58
+ return (_jsxs(_Fragment, { children: [_jsxs(StatRow, { children: [_jsx(StatCard, { label: "Hit ratio", value: cache ? `${Math.round(cache.hitRatio * 100)}%` : '—', accent: "text-emerald-400" }), _jsx(StatCard, { label: "Hits", value: cache ? cache.hits.toLocaleString() : '—' }), _jsx(StatCard, { label: "Misses", value: cache ? cache.misses.toLocaleString() : '—' }), _jsx(StatCard, { label: "Sets", value: cache ? cache.sets.toLocaleString() : '—' })] }), _jsxs(ChartRow, { children: [cache ? (_jsx(BarChartCard, { title: "Hits vs misses", valueLabel: "count", data: [
59
+ { label: 'hits', value: cache.hits, color: '#34d399' },
60
+ { label: 'misses', value: cache.misses, color: '#f87171' },
61
+ ] })) : null, _jsx(AreaChartCard, { title: "Cache over time", valueLabel: "ops", data: toAreaSeries(stats.overTime) })] }), cache ? (_jsx(BarChartCard, { title: "Top keys", valueLabel: "count", data: cacheKeyBars(cache) })) : null] }));
62
+ }
63
+ function RequestInsights({ stats }) {
64
+ const latency = stats.latency;
65
+ const status = stats.status;
66
+ const errors = status ? status['4xx'] + status['5xx'] : 0;
67
+ const errorPct = stats.total > 0 ? Math.round((errors / stats.total) * 100) : 0;
68
+ return (_jsxs(_Fragment, { children: [_jsxs(StatRow, { children: [_jsx(StatCard, { label: "Total", value: stats.total.toLocaleString() }), _jsx(StatCard, { label: "p99 ms", value: latency ? latency.p99.toLocaleString() : '—', accent: "text-sky-400" }), _jsx(StatCard, { label: "Error %", value: `${errorPct}%`, accent: errors > 0 ? 'text-red-400' : 'text-zinc-100' })] }), _jsxs(ChartRow, { children: [status ? (_jsx(BarChartCard, { title: "Status codes", valueLabel: "count", data: statusBars(status) })) : null, _jsx(AreaChartCard, { title: "Throughput", valueLabel: "requests", data: toAreaSeries(stats.overTime) })] })] }));
69
+ }
70
+ /** A tiny inline bar chart of per-bucket counts — no axes, no recharts. */
71
+ function Sparkline({ values }) {
72
+ if (values.length === 0)
73
+ return null;
74
+ const max = Math.max(1, ...values);
75
+ return (_jsx("div", { className: "flex h-6 items-end gap-px", "aria-hidden": "true", children: values.map((value, index) => (_jsx("div", { className: "w-1 rounded-sm bg-amber-500/60", style: { height: `${Math.max(2, Math.round((value / max) * 100))}%` } }, index))) }));
76
+ }
77
+ function ExceptionGroupRow({ group }) {
78
+ const lastAtMs = new Date(group.lastAt).getTime();
79
+ return (_jsxs(Link, { to: `/entries/exception?familyHash=${encodeURIComponent(group.key)}`, className: "flex items-center gap-3 rounded-lg border border-zinc-800 bg-zinc-900/40 px-4 py-3 transition hover:border-zinc-700 hover:bg-zinc-900/70", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "truncate font-mono text-sm font-semibold text-red-300", children: group.class }), _jsx("p", { className: "truncate text-xs text-zinc-400", children: group.message })] }), _jsx(Sparkline, { values: group.overTime }), _jsxs("div", { className: "shrink-0 text-right", children: [_jsx("p", { className: "text-sm font-semibold tabular-nums text-zinc-100", children: group.count.toLocaleString() }), _jsx("p", { className: "text-[10px] text-zinc-500", children: relativeTime(Number.isNaN(lastAtMs) ? null : lastAtMs) })] })] }));
80
+ }
81
+ function ExceptionInsights({ stats }) {
82
+ const groups = stats.exceptions ?? [];
83
+ return (_jsxs(_Fragment, { children: [_jsxs(StatRow, { children: [_jsx(StatCard, { label: "Total", value: stats.total.toLocaleString() }), _jsx(StatCard, { label: "Groups", value: groups.length.toLocaleString(), accent: groups.length > 0 ? 'text-amber-400' : 'text-zinc-100' })] }), groups.length > 0 ? (_jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-[10px] uppercase tracking-wide text-zinc-500", children: "Exception groups" }), groups.map((group) => (_jsx(ExceptionGroupRow, { group: group }, group.key)))] })) : null, _jsx(AreaChartCard, { title: "Exceptions over time", valueLabel: "exceptions", data: toAreaSeries(stats.overTime) })] }));
84
+ }
85
+ function GenericInsights({ stats }) {
86
+ return (_jsxs(_Fragment, { children: [_jsx(StatRow, { children: _jsx(StatCard, { label: "Total", value: stats.total.toLocaleString() }) }), _jsx(AreaChartCard, { title: "Over time", valueLabel: "entries", data: toAreaSeries(stats.overTime) })] }));
87
+ }
88
+ function InsightsBody({ stats }) {
89
+ if (stats.type === 'query')
90
+ return _jsx(QueryInsights, { stats: stats });
91
+ if (stats.type === 'cache')
92
+ return _jsx(CacheInsights, { stats: stats });
93
+ if (stats.type === 'request')
94
+ return _jsx(RequestInsights, { stats: stats });
95
+ if (stats.type === 'exception')
96
+ return _jsx(ExceptionInsights, { stats: stats });
97
+ return _jsx(GenericInsights, { stats: stats });
98
+ }
99
+ /** Per-type analytics header (stat cards + charts) rendered above the entries table. */
100
+ export function EntryInsights({ type }) {
101
+ const { data } = useStats(type, DEFAULT_WINDOW);
102
+ if (!data) {
103
+ return (_jsx("div", { className: "mb-4 h-24 animate-pulse rounded-lg border border-zinc-800 bg-zinc-900/20" }));
104
+ }
105
+ return (_jsxs("div", { className: "mb-4 space-y-4", children: [_jsx(InsightsBody, { stats: data }), data.truncated ? _jsx("p", { className: "text-[10px] text-zinc-600", children: "sampled (window capped)" }) : null] }));
106
+ }
107
+ //# sourceMappingURL=entry-insights.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-insights.js","sourceRoot":"","sources":["../../../src/react/components/entry-insights.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Single source of truth for the known telescope entry types: their stable
3
+ * id (the backend `type` filter value), a human label, and a Tailwind `bg-*`
4
+ * dot color. The dot palette mirrors the `fill-*` tokens in `stacked-bars`.
5
+ */
6
+ export interface EntryTypeDef {
7
+ /** Backend filter value, e.g. passed as `entries({ type })`. */
8
+ id: string;
9
+ /** Human-facing nav / tab label. */
10
+ label: string;
11
+ /** Tailwind `bg-*` class for the per-type color dot. */
12
+ dot: string;
13
+ /**
14
+ * Optional override for the backend fetch filter. When set, the entries
15
+ * query uses this instead of `{ type: id }` — e.g. `schedule` is recorded
16
+ * as a tagged `job`, so it fetches `{ type: 'job', tag: 'schedule' }`.
17
+ */
18
+ query?: {
19
+ type?: string;
20
+ tag?: string;
21
+ };
22
+ }
23
+ export declare const ENTRY_TYPES: EntryTypeDef[];
24
+ /** Dot color for a type id; unknown types get a neutral fallback. */
25
+ export declare function dotForType(typeId: string): string;
26
+ /** Human label for a type id; unknown types echo the raw id. */
27
+ export declare function labelForType(typeId: string): string;
28
+ /** True when `typeId` is a known, navigable entry type. */
29
+ export declare function isKnownType(typeId: string): boolean;
30
+ /**
31
+ * The backend fetch filter for a nav/route type id. Most types fetch
32
+ * `{ type: id }`, but a few (e.g. `schedule`) override via `query` — scheduled
33
+ * runs are stored as `job` entries tagged `schedule`, so the route id and the
34
+ * backend filter diverge. Unknown ids fall back to `{ type: id }`.
35
+ */
36
+ export declare function resolveEntryQuery(typeId: string): {
37
+ type?: string;
38
+ tag?: string;
39
+ };
40
+ //# sourceMappingURL=entry-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-types.d.ts","sourceRoot":"","sources":["../../../src/react/components/entry-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,EAAE,EAAE,MAAM,CAAC;IACX,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,GAAG,EAAE,MAAM,CAAC;IACZ;;;;OAIG;IACH,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACzC;AAED,eAAO,MAAM,WAAW,EAAE,YAAY,EAmBrC,CAAC;AAQF,qEAAqE;AACrE,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,gEAAgE;AAChE,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAEjF"}
@@ -0,0 +1,44 @@
1
+ export const ENTRY_TYPES = [
2
+ { id: 'request', label: 'Requests', dot: 'bg-emerald-400' },
3
+ { id: 'query', label: 'Queries', dot: 'bg-sky-400' },
4
+ { id: 'exception', label: 'Exceptions', dot: 'bg-red-400' },
5
+ { id: 'job', label: 'Jobs', dot: 'bg-violet-400' },
6
+ { id: 'mail', label: 'Mail', dot: 'bg-pink-400' },
7
+ { id: 'cache', label: 'Cache', dot: 'bg-teal-400' },
8
+ {
9
+ id: 'schedule',
10
+ label: 'Schedule',
11
+ dot: 'bg-orange-400',
12
+ query: { type: 'job', tag: 'schedule' },
13
+ },
14
+ { id: 'http_client', label: 'HTTP Client', dot: 'bg-amber-400' },
15
+ { id: 'dump', label: 'Dumps', dot: 'bg-fuchsia-400' },
16
+ { id: 'event', label: 'Events', dot: 'bg-indigo-400' },
17
+ { id: 'log', label: 'Logs', dot: 'bg-zinc-400' },
18
+ { id: 'model', label: 'Models', dot: 'bg-lime-400' },
19
+ { id: 'redis', label: 'Redis', dot: 'bg-rose-400' },
20
+ ];
21
+ const FALLBACK_DOT = 'bg-zinc-500';
22
+ const BY_ID = Object.fromEntries(ENTRY_TYPES.map((type) => [type.id, type]));
23
+ /** Dot color for a type id; unknown types get a neutral fallback. */
24
+ export function dotForType(typeId) {
25
+ return BY_ID[typeId]?.dot ?? FALLBACK_DOT;
26
+ }
27
+ /** Human label for a type id; unknown types echo the raw id. */
28
+ export function labelForType(typeId) {
29
+ return BY_ID[typeId]?.label ?? typeId;
30
+ }
31
+ /** True when `typeId` is a known, navigable entry type. */
32
+ export function isKnownType(typeId) {
33
+ return typeId in BY_ID;
34
+ }
35
+ /**
36
+ * The backend fetch filter for a nav/route type id. Most types fetch
37
+ * `{ type: id }`, but a few (e.g. `schedule`) override via `query` — scheduled
38
+ * runs are stored as `job` entries tagged `schedule`, so the route id and the
39
+ * backend filter diverge. Unknown ids fall back to `{ type: id }`.
40
+ */
41
+ export function resolveEntryQuery(typeId) {
42
+ return BY_ID[typeId]?.query ?? { type: typeId };
43
+ }
44
+ //# sourceMappingURL=entry-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-types.js","sourceRoot":"","sources":["../../../src/react/components/entry-types.ts"],"names":[],"mappings":"AAoBA,MAAM,CAAC,MAAM,WAAW,GAAmB;IACzC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,gBAAgB,EAAE;IAC3D,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE;IACpD,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE;IAC3D,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE;IAClD,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE;IACjD,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE;IACnD;QACE,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,UAAU;QACjB,GAAG,EAAE,eAAe;QACpB,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE;KACxC;IACD,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,cAAc,EAAE;IAChE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,gBAAgB,EAAE;IACrD,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,eAAe,EAAE;IACtD,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE;IAChD,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE;IACpD,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE;CACpD,CAAC;AAEF,MAAM,YAAY,GAAG,aAAa,CAAC;AAEnC,MAAM,KAAK,GAAiC,MAAM,CAAC,WAAW,CAC5D,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAC3C,CAAC;AAEF,qEAAqE;AACrE,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,YAAY,CAAC;AAC5C,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,OAAO,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,MAAM,CAAC;AACxC,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,OAAO,MAAM,IAAI,KAAK,CAAC;AACzB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,OAAO,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAClD,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * A small toolbar exposing "Copy JSON" / "Download JSON" actions for a value.
3
+ * Used on the entry-detail page to export the full `EntryWithBatch`.
4
+ */
5
+ export declare function ExportJsonToolbar({ value, filename, }: {
6
+ value: unknown;
7
+ filename: string;
8
+ }): JSX.Element;
9
+ //# sourceMappingURL=export-json-toolbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-json-toolbar.d.ts","sourceRoot":"","sources":["../../../src/react/components/export-json-toolbar.tsx"],"names":[],"mappings":"AAOA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,QAAQ,GACT,EAAE;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,CAqBpD"}
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { copyJson, downloadJson } from './export-json.js';
4
+ const BUTTON_CLASS = 'rounded border border-zinc-700 bg-zinc-900 px-2.5 py-1 text-[11px] text-zinc-300 ' +
5
+ 'transition-colors hover:border-zinc-600 hover:bg-zinc-800 hover:text-zinc-100';
6
+ /**
7
+ * A small toolbar exposing "Copy JSON" / "Download JSON" actions for a value.
8
+ * Used on the entry-detail page to export the full `EntryWithBatch`.
9
+ */
10
+ export function ExportJsonToolbar({ value, filename, }) {
11
+ const [copied, setCopied] = useState(false);
12
+ async function handleCopy() {
13
+ const ok = await copyJson(value);
14
+ if (ok) {
15
+ setCopied(true);
16
+ setTimeout(() => setCopied(false), 1500);
17
+ }
18
+ }
19
+ return (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("button", { type: "button", onClick: handleCopy, className: BUTTON_CLASS, children: copied ? 'Copied' : 'Copy JSON' }), _jsx("button", { type: "button", onClick: () => downloadJson(filename, value), className: BUTTON_CLASS, children: "Download JSON" })] }));
20
+ }
21
+ //# sourceMappingURL=export-json-toolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-json-toolbar.js","sourceRoot":"","sources":["../../../src/react/components/export-json-toolbar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,YAAY,GAChB,mFAAmF;IACnF,+EAA+E,CAAC;AAElF;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAChC,KAAK,EACL,QAAQ,GAC6B;IACrC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5C,KAAK,UAAU,UAAU;QACvB,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,EAAE,EAAE,CAAC;YACP,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,yBAAyB,aACtC,iBAAQ,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,YAC/D,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,GACzB,EACT,iBAAQ,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,YAAY,8BAElF,IACL,CACP,CAAC;AACJ,CAAC"}