@mastra/playground-ui 39.0.0-alpha.5 → 39.0.1-alpha.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 (84) hide show
  1. package/CHANGELOG.md +84 -0
  2. package/dist/components/PropertyFilter.cjs.js +1 -1
  3. package/dist/components/PropertyFilter.es.js +2 -2
  4. package/dist/domains/logs/components/log-details-view.cjs.js +18 -24
  5. package/dist/domains/logs/components/log-details-view.cjs.js.map +1 -1
  6. package/dist/domains/logs/components/log-details-view.es.js +18 -24
  7. package/dist/domains/logs/components/log-details-view.es.js.map +1 -1
  8. package/dist/domains/logs/components/logs-toolbar.cjs.js +1 -1
  9. package/dist/domains/logs/components/logs-toolbar.es.js +1 -1
  10. package/dist/domains/logs/hooks/use-logs-list-navigation.cjs.js +2 -0
  11. package/dist/domains/logs/hooks/use-logs-list-navigation.cjs.js.map +1 -1
  12. package/dist/domains/logs/hooks/use-logs-list-navigation.es.js +2 -0
  13. package/dist/domains/logs/hooks/use-logs-list-navigation.es.js.map +1 -1
  14. package/dist/domains/memory/components/flame-graph.cjs.js +23 -14
  15. package/dist/domains/memory/components/flame-graph.cjs.js.map +1 -1
  16. package/dist/domains/memory/components/flame-graph.es.js +23 -14
  17. package/dist/domains/memory/components/flame-graph.es.js.map +1 -1
  18. package/dist/domains/memory/hooks/use-memory-status.cjs.js +3 -4
  19. package/dist/domains/memory/hooks/use-memory-status.cjs.js.map +1 -1
  20. package/dist/domains/memory/hooks/use-memory-status.es.js +4 -5
  21. package/dist/domains/memory/hooks/use-memory-status.es.js.map +1 -1
  22. package/dist/domains/memory/hooks/use-memory-thread-messages.cjs.js +1 -2
  23. package/dist/domains/memory/hooks/use-memory-thread-messages.cjs.js.map +1 -1
  24. package/dist/domains/memory/hooks/use-memory-thread-messages.es.js +2 -3
  25. package/dist/domains/memory/hooks/use-memory-thread-messages.es.js.map +1 -1
  26. package/dist/domains/memory/hooks/use-observational-memory.cjs.js +2 -3
  27. package/dist/domains/memory/hooks/use-observational-memory.cjs.js.map +1 -1
  28. package/dist/domains/memory/hooks/use-observational-memory.es.js +3 -4
  29. package/dist/domains/memory/hooks/use-observational-memory.es.js.map +1 -1
  30. package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js.map +1 -1
  31. package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js.map +1 -1
  32. package/dist/domains/metrics/hooks/use-metrics.cjs.js +1 -1
  33. package/dist/domains/metrics/hooks/use-metrics.cjs.js.map +1 -1
  34. package/dist/domains/metrics/hooks/use-metrics.es.js +1 -1
  35. package/dist/domains/metrics/hooks/use-metrics.es.js.map +1 -1
  36. package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.cjs.js +9 -6
  37. package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.cjs.js.map +1 -1
  38. package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.es.js +9 -6
  39. package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.es.js.map +1 -1
  40. package/dist/domains/metrics/hooks/use-scores-metrics.cjs.js +3 -8
  41. package/dist/domains/metrics/hooks/use-scores-metrics.cjs.js.map +1 -1
  42. package/dist/domains/metrics/hooks/use-scores-metrics.es.js +3 -8
  43. package/dist/domains/metrics/hooks/use-scores-metrics.es.js.map +1 -1
  44. package/dist/domains/metrics/hooks/use-token-usage-by-agent-metrics.cjs.js +2 -6
  45. package/dist/domains/metrics/hooks/use-token-usage-by-agent-metrics.cjs.js.map +1 -1
  46. package/dist/domains/metrics/hooks/use-token-usage-by-agent-metrics.es.js +2 -6
  47. package/dist/domains/metrics/hooks/use-token-usage-by-agent-metrics.es.js.map +1 -1
  48. package/dist/domains/metrics/hooks/use-top-active-threads-metrics.cjs.js +2 -4
  49. package/dist/domains/metrics/hooks/use-top-active-threads-metrics.cjs.js.map +1 -1
  50. package/dist/domains/metrics/hooks/use-top-active-threads-metrics.es.js +2 -4
  51. package/dist/domains/metrics/hooks/use-top-active-threads-metrics.es.js.map +1 -1
  52. package/dist/domains/metrics/hooks/use-top-resources-by-threads-metrics.cjs.js +2 -4
  53. package/dist/domains/metrics/hooks/use-top-resources-by-threads-metrics.cjs.js.map +1 -1
  54. package/dist/domains/metrics/hooks/use-top-resources-by-threads-metrics.es.js +2 -4
  55. package/dist/domains/metrics/hooks/use-top-resources-by-threads-metrics.es.js.map +1 -1
  56. package/dist/domains/metrics/hooks/use-trace-volume-metrics.cjs.js +4 -6
  57. package/dist/domains/metrics/hooks/use-trace-volume-metrics.cjs.js.map +1 -1
  58. package/dist/domains/metrics/hooks/use-trace-volume-metrics.es.js +2 -4
  59. package/dist/domains/metrics/hooks/use-trace-volume-metrics.es.js.map +1 -1
  60. package/dist/domains/traces/components/format-hierarchical-spans.cjs.js +2 -0
  61. package/dist/domains/traces/components/format-hierarchical-spans.cjs.js.map +1 -1
  62. package/dist/domains/traces/components/format-hierarchical-spans.es.js +2 -0
  63. package/dist/domains/traces/components/format-hierarchical-spans.es.js.map +1 -1
  64. package/dist/domains/traces/components/traces-toolbar.cjs.js +1 -1
  65. package/dist/domains/traces/components/traces-toolbar.es.js +1 -1
  66. package/dist/domains/traces/hooks/use-traces.cjs.js +3 -11
  67. package/dist/domains/traces/hooks/use-traces.cjs.js.map +1 -1
  68. package/dist/domains/traces/hooks/use-traces.es.js +3 -11
  69. package/dist/domains/traces/hooks/use-traces.es.js.map +1 -1
  70. package/dist/map-CGEv7zQW.cjs +12 -0
  71. package/dist/map-CGEv7zQW.cjs.map +1 -0
  72. package/dist/map-DBJibfZS.js +10 -0
  73. package/dist/map-DBJibfZS.js.map +1 -0
  74. package/dist/{property-filter-applied-Ec6BkYiN.cjs → property-filter-applied-DnpJ1vFe.cjs} +6 -6
  75. package/dist/property-filter-applied-DnpJ1vFe.cjs.map +1 -0
  76. package/dist/{property-filter-applied-B3T9NrP5.js → property-filter-applied-EnHVqWEV.js} +6 -6
  77. package/dist/property-filter-applied-EnHVqWEV.js.map +1 -0
  78. package/dist/src/domains/memory/hooks/use-memory-status.d.ts +1 -1
  79. package/dist/src/domains/memory/hooks/use-memory-thread-messages.d.ts +1 -1
  80. package/dist/src/domains/memory/hooks/use-observational-memory.d.ts +1 -1
  81. package/dist/src/lib/map.d.ts +1 -0
  82. package/package.json +8 -8
  83. package/dist/property-filter-applied-B3T9NrP5.js.map +0 -1
  84. package/dist/property-filter-applied-Ec6BkYiN.cjs.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,89 @@
1
1
  # @mastra/playground-ui
2
2
 
3
+ ## 39.0.1-alpha.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [[`6ef59fe`](https://github.com/mastra-ai/mastra/commit/6ef59fef1da52ed8da5fbb2a892c71cf4fb6c739), [`e2b9f33`](https://github.com/mastra-ai/mastra/commit/e2b9f33456fd638eca555f9466c6519d8d049666)]:
8
+ - @mastra/core@1.50.0-alpha.0
9
+ - @mastra/client-js@1.30.1-alpha.0
10
+ - @mastra/react@1.2.3-alpha.0
11
+
12
+ ## 39.0.0
13
+
14
+ ### Minor Changes
15
+
16
+ - Removed named exports from the `@mastra/playground-ui` root entry. Import public APIs from exact package subpaths instead. ([#18791](https://github.com/mastra-ai/mastra/pull/18791))
17
+
18
+ **Before**
19
+
20
+ ```ts
21
+ import { Button } from '@mastra/playground-ui';
22
+ ```
23
+
24
+ **After**
25
+
26
+ ```ts
27
+ import { Button } from '@mastra/playground-ui/components/Button';
28
+ ```
29
+
30
+ `mastracode` now uses the exact subpath imports, and lint rules prevent new broad `@mastra/playground-ui` imports.
31
+
32
+ - Removed the `Searchbar` component from `@mastra/playground-ui`. Compose search inputs with `InputGroup` instead so search remains a documented use case of the existing input composition primitive. ([#18727](https://github.com/mastra-ai/mastra/pull/18727))
33
+
34
+ **Before**
35
+
36
+ ```tsx
37
+ import { Searchbar } from '@mastra/playground-ui/components/Searchbar';
38
+
39
+ <Searchbar label="Search tools" placeholder="Search tools..." onSearch={setSearch} />;
40
+ ```
41
+
42
+ **After**
43
+
44
+ ```tsx
45
+ import { InputGroup, InputGroupAddon, InputGroupInput } from '@mastra/playground-ui/components/InputGroup';
46
+ import { SearchIcon } from 'lucide-react';
47
+
48
+ <InputGroup variant="outline">
49
+ <InputGroupAddon align="inline-start">
50
+ <SearchIcon />
51
+ </InputGroupAddon>
52
+ <InputGroupInput
53
+ type="search"
54
+ aria-label="Search tools"
55
+ placeholder="Search tools..."
56
+ onChange={event => setSearch(event.target.value)}
57
+ />
58
+ </InputGroup>;
59
+ ```
60
+
61
+ - **Signals now show live Entity-Learning data** ([#18699](https://github.com/mastra-ai/mastra/pull/18699))
62
+
63
+ The Signals page is no longer static. Select an agent reported by the platform and Signals fetches that agent's signals and their clusters live from the Entity-Learning API, replacing the previous hardcoded mock data. Each available signal loads its real clusters (topics) and traces, with a scatter-plot chart for the selected topics.
64
+
65
+ **What changed**
66
+ - Added an agent filter at the top of the Signals page, mirroring the traces filter, so you can inspect signals for any agent on the server.
67
+ - The Signals overview and details pages now render live Entity-Learning topics, examples, and points directly, with shape-matching skeletons while data loads, centered empty states, and explicit error states.
68
+ - Clicking a cluster card opens its topic by default, and the Signals breadcrumbs preserve the selected entity and topic query params on back-navigation.
69
+ - Signals detail navigation keeps selected clusters, trace examples, and chart filters in sync when moving between signals or entities.
70
+
71
+ **Gating**
72
+
73
+ Studio's served HTML exposes `MASTRA_ORGANIZATION_ID`, `MASTRA_PLATFORM_PROJECT_ID`, and `MASTRA_PLATFORM_OBSERVABILITY_ENDPOINT` to the browser so the Signals page can call the Entity-Learning API. The route is gated on the platform observability config, and the `MASTRA_SIGNALS_UI` flag guards the sidebar Signals nav link.
74
+
75
+ ### Patch Changes
76
+
77
+ - Fixed the Signals page showing empty clusters for every signal except the most recently clustered one. Cluster queries no longer pin the entity-wide latest run id: the API resolves the latest run per signal, and the details page reuses the run resolved by the topics response for its examples and points queries. ([#18786](https://github.com/mastra-ai/mastra/pull/18786))
78
+
79
+ - Fix the Signals (Agent Learning) client to call the platform query service's session-authenticated `/api/learning/*` routes instead of the internal `/entity-learning/*` output-service contract. The client now derives the query-service origin from the injected observability endpoint, sends the WorkOS session cookie via `credentials: 'include'`, and scopes reads with the `X-Mastra-Project-Id` header — matching the existing `/api/observability/*` auth pattern. Previously the Signals UI called an internal-only endpoint with no credentials, which 404'd on every hosted and local deployment. ([#18852](https://github.com/mastra-ai/mastra/pull/18852))
80
+
81
+ - Updated dependencies [[`700619b`](https://github.com/mastra-ai/mastra/commit/700619b61d572e592cbaaf758121d168844ca4d2), [`0f69865`](https://github.com/mastra-ai/mastra/commit/0f69865aced225d98eac812e22699dc445ee18cb), [`9250acd`](https://github.com/mastra-ai/mastra/commit/9250acd1357f0f1f33d0dcca16f9655084c58eca), [`0c3d4bc`](https://github.com/mastra-ai/mastra/commit/0c3d4bcae13ea3699d379403e6f350d5cf4efe9f), [`cc440a3`](https://github.com/mastra-ai/mastra/commit/cc440a39400d8ce06655462b26c1666a1b3d4320), [`6a61846`](https://github.com/mastra-ai/mastra/commit/6a61846eeda29fb714549b70f1bee2bf6b141c44), [`215f9b0`](https://github.com/mastra-ai/mastra/commit/215f9b0f3f3f6fc165edad360582dd4d3d7ea748), [`17369b2`](https://github.com/mastra-ai/mastra/commit/17369b25250561e9ed994ae509be1d15bfb33bcb), [`c64c2a8`](https://github.com/mastra-ai/mastra/commit/c64c2a8503a50252f9ca6b8e8c54cadee31b92a2), [`bcae929`](https://github.com/mastra-ai/mastra/commit/bcae929945cbf265bd9f327cc715ecafa072b5b9), [`ea6327b`](https://github.com/mastra-ai/mastra/commit/ea6327ba2d63ca647804bc97b347e03a58617162), [`3439fa8`](https://github.com/mastra-ai/mastra/commit/3439fa836ecfcaa257b40c20b30ac2a8be22e9ea), [`85107f2`](https://github.com/mastra-ai/mastra/commit/85107f2758b527147fccbedff962961927c2d3b8), [`b33822e`](https://github.com/mastra-ai/mastra/commit/b33822e8d470884954b02f7b0745407ee4ef74b1), [`06e2680`](https://github.com/mastra-ai/mastra/commit/06e26806b51d2cbd858afdc66daa2b86ff3ba64a), [`06ff9e0`](https://github.com/mastra-ai/mastra/commit/06ff9e0befd1d642ab87ff749285ee4091205c7e), [`d5c11e3`](https://github.com/mastra-ai/mastra/commit/d5c11e3ba5045969caa7272a7bd1fd141c93ab6c), [`7f5e1ff`](https://github.com/mastra-ai/mastra/commit/7f5e1ff695a92f672bb3976363925d1e9136b54a), [`ff80671`](https://github.com/mastra-ai/mastra/commit/ff8067185e208b27198b4e5b71803013175c3643), [`b8375c1`](https://github.com/mastra-ai/mastra/commit/b8375c1f8fe905df8ae2ae9a893bb365f17aec4e), [`dab1257`](https://github.com/mastra-ai/mastra/commit/dab1257b64e4ed576dc5038bb7a3f7072338bc9f), [`1240f05`](https://github.com/mastra-ai/mastra/commit/1240f051c8e5371f1c014448bf37b1a1b9a05e47), [`705ff39`](https://github.com/mastra-ai/mastra/commit/705ff3969e57214ff2fdaf3815d751dd558886ed), [`e6fbd5b`](https://github.com/mastra-ai/mastra/commit/e6fbd5bfdc28e92c0c0433f29aa1bc152d3430f6), [`215f9b0`](https://github.com/mastra-ai/mastra/commit/215f9b0f3f3f6fc165edad360582dd4d3d7ea748), [`24c10d3`](https://github.com/mastra-ai/mastra/commit/24c10d333e6649ac06075903aeeee13a933db3b3), [`24c10d3`](https://github.com/mastra-ai/mastra/commit/24c10d333e6649ac06075903aeeee13a933db3b3), [`24c10d3`](https://github.com/mastra-ai/mastra/commit/24c10d333e6649ac06075903aeeee13a933db3b3), [`6f2026c`](https://github.com/mastra-ai/mastra/commit/6f2026cdf114ff1e21e49133ca774ec7d5085059), [`24c10d3`](https://github.com/mastra-ai/mastra/commit/24c10d333e6649ac06075903aeeee13a933db3b3), [`215f9b0`](https://github.com/mastra-ai/mastra/commit/215f9b0f3f3f6fc165edad360582dd4d3d7ea748), [`215f9b0`](https://github.com/mastra-ai/mastra/commit/215f9b0f3f3f6fc165edad360582dd4d3d7ea748), [`ff80671`](https://github.com/mastra-ai/mastra/commit/ff8067185e208b27198b4e5b71803013175c3643), [`003f35d`](https://github.com/mastra-ai/mastra/commit/003f35d19e07b23b4bacc591c8bc0c59b42124ae), [`f890eda`](https://github.com/mastra-ai/mastra/commit/f890eda2c8a2ae83d9b30bc6d85842f93b6c266b), [`1340fb7`](https://github.com/mastra-ai/mastra/commit/1340fb76262a3ca062130aa71859f07257a0a5a4)]:
82
+ - @mastra/core@1.49.0
83
+ - @mastra/client-js@1.30.0
84
+ - @mastra/memory@1.22.1
85
+ - @mastra/react@1.2.2
86
+
3
87
  ## 39.0.0-alpha.5
4
88
 
5
89
  ### Patch Changes
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
- const propertyFilterApplied = require('../property-filter-applied-Ec6BkYiN.cjs');
5
+ const propertyFilterApplied = require('../property-filter-applied-DnpJ1vFe.cjs');
6
6
  const jsxRuntime = require('react/jsx-runtime');
7
7
  const lucideReact = require('lucide-react');
8
8
  const React = require('react');
@@ -1,5 +1,5 @@
1
- import { b as PickMultiPanel } from '../property-filter-applied-B3T9NrP5.js';
2
- export { a as PropertyFilterActions, P as PropertyFilterApplied } from '../property-filter-applied-B3T9NrP5.js';
1
+ import { b as PickMultiPanel } from '../property-filter-applied-EnHVqWEV.js';
2
+ export { a as PropertyFilterActions, P as PropertyFilterApplied } from '../property-filter-applied-EnHVqWEV.js';
3
3
  import { jsxs, jsx } from 'react/jsx-runtime';
4
4
  import { ListFilterPlusIcon, ArrowLeftIcon, FilterIcon, PlusIcon, ChevronRightIcon } from 'lucide-react';
5
5
  import { useMemo, useState, useRef, useCallback, useEffect } from 'react';
@@ -30,6 +30,8 @@ function LogDetailsView({
30
30
  const collapsed = controlledCollapsed ?? internalCollapsed;
31
31
  const setCollapsed = onCollapsedChange ?? setInternalCollapsed;
32
32
  const date = toDate(log.timestamp);
33
+ const traceId = log.traceId;
34
+ const spanId = log.spanId;
33
35
  return /* @__PURE__ */ jsxRuntime.jsxs(components_DataDetailsPanel.DataDetailsPanel, { collapsed, children: [
34
36
  /* @__PURE__ */ jsxRuntime.jsxs(components_DataDetailsPanel.DataDetailsPanel.Header, { children: [
35
37
  /* @__PURE__ */ jsxRuntime.jsxs(components_DataDetailsPanel.DataDetailsPanel.Heading, { children: [
@@ -55,45 +57,37 @@ function LogDetailsView({
55
57
  ] }),
56
58
  !collapsed && /* @__PURE__ */ jsxRuntime.jsxs(components_DataDetailsPanel.DataDetailsPanel.Content, { children: [
57
59
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-ui-md text-neutral4 font-mono wrap-break-word whitespace-pre-wrap", children: log.message }),
58
- (log.traceId || log.spanId) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: utils_cn.cn("grid gap-2 my-8", "[&>button]:justify-between [&>button]:overflow-hidden"), children: [
59
- log.traceId && /* @__PURE__ */ jsxRuntime.jsxs(buttonsGroup.ButtonsGroup, { spacing: "close", className: "min-w-0 w-full", children: [
60
- /* @__PURE__ */ jsxRuntime.jsxs(
61
- Button.Button,
62
- {
63
- size: "md",
64
- className: "min-w-0 flex-1 overflow-hidden",
65
- onClick: () => onTraceClick?.(log.traceId),
66
- children: [
67
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, {}),
68
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: "Trace" }),
69
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: " ml-auto text-ui-sm text-neutral2 min-w-0 truncate", children: [
70
- "# ",
71
- log.traceId
72
- ] })
73
- ]
74
- }
75
- ),
76
- /* @__PURE__ */ jsxRuntime.jsx(copyButton.CopyButton, { content: log.traceId, size: "md", tooltip: "Copy Trace ID to clipboard" })
60
+ (traceId || spanId) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: utils_cn.cn("grid gap-2 my-8", "[&>button]:justify-between [&>button]:overflow-hidden"), children: [
61
+ traceId && /* @__PURE__ */ jsxRuntime.jsxs(buttonsGroup.ButtonsGroup, { spacing: "close", className: "min-w-0 w-full", children: [
62
+ /* @__PURE__ */ jsxRuntime.jsxs(Button.Button, { size: "md", className: "min-w-0 flex-1 overflow-hidden", onClick: () => onTraceClick?.(traceId), children: [
63
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, {}),
64
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "Trace" }),
65
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: " ml-auto text-ui-sm text-neutral2 min-w-0 truncate", children: [
66
+ "# ",
67
+ traceId
68
+ ] })
69
+ ] }),
70
+ /* @__PURE__ */ jsxRuntime.jsx(copyButton.CopyButton, { content: traceId, size: "md", tooltip: "Copy Trace ID to clipboard" })
77
71
  ] }),
78
- log.spanId && /* @__PURE__ */ jsxRuntime.jsxs(buttonsGroup.ButtonsGroup, { spacing: "close", className: "min-w-0 w-full", children: [
72
+ spanId && /* @__PURE__ */ jsxRuntime.jsxs(buttonsGroup.ButtonsGroup, { spacing: "close", className: "min-w-0 w-full", children: [
79
73
  /* @__PURE__ */ jsxRuntime.jsxs(
80
74
  Button.Button,
81
75
  {
82
76
  size: "md",
83
77
  className: "min-w-0 flex-1 overflow-hidden",
84
- disabled: !log.traceId || !onSpanClick,
85
- onClick: () => log.traceId && onSpanClick?.(log.traceId, log.spanId),
78
+ disabled: !traceId || !onSpanClick,
79
+ onClick: () => traceId && onSpanClick?.(traceId, spanId),
86
80
  children: [
87
81
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, {}),
88
82
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: "Span" }),
89
83
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: " ml-auto text-ui-sm text-neutral2 min-w-0 truncate", children: [
90
84
  "# ",
91
- log.spanId
85
+ spanId
92
86
  ] })
93
87
  ]
94
88
  }
95
89
  ),
96
- /* @__PURE__ */ jsxRuntime.jsx(copyButton.CopyButton, { content: log.spanId, size: "md", tooltip: "Copy Span ID to clipboard" })
90
+ /* @__PURE__ */ jsxRuntime.jsx(copyButton.CopyButton, { content: spanId, size: "md", tooltip: "Copy Span ID to clipboard" })
97
91
  ] })
98
92
  ] }),
99
93
  /* @__PURE__ */ jsxRuntime.jsxs(KV, { className: "mb-6", children: [
@@ -1 +1 @@
1
- {"version":3,"file":"log-details-view.cjs.js","sources":["../../../../src/domains/logs/components/log-details-view.tsx"],"sourcesContent":["import { format } from 'date-fns';\nimport { ArrowDownIcon, ArrowRightIcon, ArrowUpIcon, ChevronsDownUpIcon, ChevronsUpDownIcon } from 'lucide-react';\nimport { Fragment, useState } from 'react';\nimport type { LogRecord } from '../types';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { DataDetailsPanel } from '@/ds/components/DataDetailsPanel';\nimport { cn } from '@/lib/utils';\n\nconst KV = DataDetailsPanel.KeyValueList;\n\nfunction toDate(value: Date | string): Date {\n return value instanceof Date ? value : new Date(value);\n}\n\nexport interface LogDetailsViewProps {\n log: LogRecord;\n onClose: () => void;\n onTraceClick?: (traceId: string) => void;\n onSpanClick?: (traceId: string, spanId: string) => void;\n onPrevious?: () => void;\n onNext?: () => void;\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n}\n\nexport function LogDetailsView({\n log,\n onClose,\n onTraceClick,\n onSpanClick,\n onPrevious,\n onNext,\n collapsed: controlledCollapsed,\n onCollapsedChange,\n}: LogDetailsViewProps) {\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n const collapsed = controlledCollapsed ?? internalCollapsed;\n const setCollapsed = onCollapsedChange ?? setInternalCollapsed;\n const date = toDate(log.timestamp);\n\n return (\n <DataDetailsPanel collapsed={collapsed}>\n <DataDetailsPanel.Header>\n <DataDetailsPanel.Heading>\n Log <b>{format(date, 'MMM dd, HH:mm:ss.SSS')}</b>\n </DataDetailsPanel.Heading>\n <ButtonsGroup className=\"ml-auto shrink-0\">\n {onCollapsedChange && (\n <Button\n size=\"md\"\n tooltip={collapsed ? 'Expand panel' : 'Collapse panel'}\n onClick={() => setCollapsed(!collapsed)}\n >\n {collapsed ? <ChevronsUpDownIcon /> : <ChevronsDownUpIcon />}\n </Button>\n )}\n\n <ButtonsGroup spacing=\"close\">\n <Button size=\"md\" tooltip=\"Previous log\" onClick={onPrevious} disabled={!onPrevious}>\n <ArrowUpIcon />\n </Button>\n <Button size=\"md\" tooltip=\"Next log\" onClick={onNext} disabled={!onNext}>\n <ArrowDownIcon />\n </Button>\n </ButtonsGroup>\n\n <DataDetailsPanel.CloseButton onClick={onClose} />\n </ButtonsGroup>\n </DataDetailsPanel.Header>\n\n {!collapsed && (\n <DataDetailsPanel.Content>\n <p className=\"text-ui-md text-neutral4 font-mono wrap-break-word whitespace-pre-wrap\">{log.message}</p>\n\n {(log.traceId || log.spanId) && (\n <div className={cn('grid gap-2 my-8', '[&>button]:justify-between [&>button]:overflow-hidden')}>\n {log.traceId && (\n <ButtonsGroup spacing=\"close\" className=\"min-w-0 w-full\">\n <Button\n size=\"md\"\n className=\"min-w-0 flex-1 overflow-hidden\"\n onClick={() => onTraceClick?.(log.traceId!)}\n >\n <ArrowRightIcon />\n <span>Trace</span>\n <span className=\" ml-auto text-ui-sm text-neutral2 min-w-0 truncate\"># {log.traceId}</span>\n </Button>\n <CopyButton content={log.traceId!} size=\"md\" tooltip=\"Copy Trace ID to clipboard\" />\n </ButtonsGroup>\n )}\n {log.spanId && (\n <ButtonsGroup spacing=\"close\" className=\"min-w-0 w-full\">\n <Button\n size=\"md\"\n className=\"min-w-0 flex-1 overflow-hidden\"\n disabled={!log.traceId || !onSpanClick}\n onClick={() => log.traceId && onSpanClick?.(log.traceId, log.spanId!)}\n >\n <ArrowRightIcon />\n <span>Span</span>\n <span className=\" ml-auto text-ui-sm text-neutral2 min-w-0 truncate\"># {log.spanId}</span>\n </Button>\n <CopyButton content={log.spanId!} size=\"md\" tooltip=\"Copy Span ID to clipboard\" />\n </ButtonsGroup>\n )}\n </div>\n )}\n\n <KV className=\"mb-6\">\n {log.entityType && (\n <>\n <KV.Key>Entity Type</KV.Key>\n <KV.Value>{log.entityType}</KV.Value>\n </>\n )}\n {log.entityName && (\n <>\n <KV.Key>Entity Name</KV.Key>\n <KV.Value>{log.entityName}</KV.Value>\n </>\n )}\n {log.serviceName && (\n <>\n <KV.Key>Service</KV.Key>\n <KV.Value>{log.serviceName}</KV.Value>\n </>\n )}\n {log.environment && (\n <>\n <KV.Key>Environment</KV.Key>\n <KV.Value>{log.environment}</KV.Value>\n </>\n )}\n {log.source && (\n <>\n <KV.Key>Source</KV.Key>\n <KV.Value>{log.source}</KV.Value>\n </>\n )}\n {log.metadata && Object.keys(log.metadata).length > 0 && (\n <>\n {Object.entries(log.metadata).map(([key, value]) => (\n <Fragment key={key}>\n <KV.Key>{key}</KV.Key>\n <KV.Value>{String(value)}</KV.Value>\n </Fragment>\n ))}\n </>\n )}\n </KV>\n\n {log.data && Object.keys(log.data).length > 0 && (\n <DataDetailsPanel.CodeSection title=\"Data\" codeStr={JSON.stringify(log.data, null, 2)} className=\"mt-6\" />\n )}\n </DataDetailsPanel.Content>\n )}\n </DataDetailsPanel>\n );\n}\n"],"names":["DataDetailsPanel","useState","jsxs","jsx","format","ButtonsGroup","Button","ChevronsUpDownIcon","ChevronsDownUpIcon","ArrowUpIcon","ArrowDownIcon","cn","ArrowRightIcon","CopyButton","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"log-details-view.cjs.js","sources":["../../../../src/domains/logs/components/log-details-view.tsx"],"sourcesContent":["import { format } from 'date-fns';\nimport { ArrowDownIcon, ArrowRightIcon, ArrowUpIcon, ChevronsDownUpIcon, ChevronsUpDownIcon } from 'lucide-react';\nimport { Fragment, useState } from 'react';\nimport type { LogRecord } from '../types';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { DataDetailsPanel } from '@/ds/components/DataDetailsPanel';\nimport { cn } from '@/lib/utils';\n\nconst KV = DataDetailsPanel.KeyValueList;\n\nfunction toDate(value: Date | string): Date {\n return value instanceof Date ? value : new Date(value);\n}\n\nexport interface LogDetailsViewProps {\n log: LogRecord;\n onClose: () => void;\n onTraceClick?: (traceId: string) => void;\n onSpanClick?: (traceId: string, spanId: string) => void;\n onPrevious?: () => void;\n onNext?: () => void;\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n}\n\nexport function LogDetailsView({\n log,\n onClose,\n onTraceClick,\n onSpanClick,\n onPrevious,\n onNext,\n collapsed: controlledCollapsed,\n onCollapsedChange,\n}: LogDetailsViewProps) {\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n const collapsed = controlledCollapsed ?? internalCollapsed;\n const setCollapsed = onCollapsedChange ?? setInternalCollapsed;\n const date = toDate(log.timestamp);\n const traceId = log.traceId;\n const spanId = log.spanId;\n\n return (\n <DataDetailsPanel collapsed={collapsed}>\n <DataDetailsPanel.Header>\n <DataDetailsPanel.Heading>\n Log <b>{format(date, 'MMM dd, HH:mm:ss.SSS')}</b>\n </DataDetailsPanel.Heading>\n <ButtonsGroup className=\"ml-auto shrink-0\">\n {onCollapsedChange && (\n <Button\n size=\"md\"\n tooltip={collapsed ? 'Expand panel' : 'Collapse panel'}\n onClick={() => setCollapsed(!collapsed)}\n >\n {collapsed ? <ChevronsUpDownIcon /> : <ChevronsDownUpIcon />}\n </Button>\n )}\n\n <ButtonsGroup spacing=\"close\">\n <Button size=\"md\" tooltip=\"Previous log\" onClick={onPrevious} disabled={!onPrevious}>\n <ArrowUpIcon />\n </Button>\n <Button size=\"md\" tooltip=\"Next log\" onClick={onNext} disabled={!onNext}>\n <ArrowDownIcon />\n </Button>\n </ButtonsGroup>\n\n <DataDetailsPanel.CloseButton onClick={onClose} />\n </ButtonsGroup>\n </DataDetailsPanel.Header>\n\n {!collapsed && (\n <DataDetailsPanel.Content>\n <p className=\"text-ui-md text-neutral4 font-mono wrap-break-word whitespace-pre-wrap\">{log.message}</p>\n\n {(traceId || spanId) && (\n <div className={cn('grid gap-2 my-8', '[&>button]:justify-between [&>button]:overflow-hidden')}>\n {traceId && (\n <ButtonsGroup spacing=\"close\" className=\"min-w-0 w-full\">\n <Button size=\"md\" className=\"min-w-0 flex-1 overflow-hidden\" onClick={() => onTraceClick?.(traceId)}>\n <ArrowRightIcon />\n <span>Trace</span>\n <span className=\" ml-auto text-ui-sm text-neutral2 min-w-0 truncate\"># {traceId}</span>\n </Button>\n <CopyButton content={traceId} size=\"md\" tooltip=\"Copy Trace ID to clipboard\" />\n </ButtonsGroup>\n )}\n {spanId && (\n <ButtonsGroup spacing=\"close\" className=\"min-w-0 w-full\">\n <Button\n size=\"md\"\n className=\"min-w-0 flex-1 overflow-hidden\"\n disabled={!traceId || !onSpanClick}\n onClick={() => traceId && onSpanClick?.(traceId, spanId)}\n >\n <ArrowRightIcon />\n <span>Span</span>\n <span className=\" ml-auto text-ui-sm text-neutral2 min-w-0 truncate\"># {spanId}</span>\n </Button>\n <CopyButton content={spanId} size=\"md\" tooltip=\"Copy Span ID to clipboard\" />\n </ButtonsGroup>\n )}\n </div>\n )}\n\n <KV className=\"mb-6\">\n {log.entityType && (\n <>\n <KV.Key>Entity Type</KV.Key>\n <KV.Value>{log.entityType}</KV.Value>\n </>\n )}\n {log.entityName && (\n <>\n <KV.Key>Entity Name</KV.Key>\n <KV.Value>{log.entityName}</KV.Value>\n </>\n )}\n {log.serviceName && (\n <>\n <KV.Key>Service</KV.Key>\n <KV.Value>{log.serviceName}</KV.Value>\n </>\n )}\n {log.environment && (\n <>\n <KV.Key>Environment</KV.Key>\n <KV.Value>{log.environment}</KV.Value>\n </>\n )}\n {log.source && (\n <>\n <KV.Key>Source</KV.Key>\n <KV.Value>{log.source}</KV.Value>\n </>\n )}\n {log.metadata && Object.keys(log.metadata).length > 0 && (\n <>\n {Object.entries(log.metadata).map(([key, value]) => (\n <Fragment key={key}>\n <KV.Key>{key}</KV.Key>\n <KV.Value>{String(value)}</KV.Value>\n </Fragment>\n ))}\n </>\n )}\n </KV>\n\n {log.data && Object.keys(log.data).length > 0 && (\n <DataDetailsPanel.CodeSection title=\"Data\" codeStr={JSON.stringify(log.data, null, 2)} className=\"mt-6\" />\n )}\n </DataDetailsPanel.Content>\n )}\n </DataDetailsPanel>\n );\n}\n"],"names":["DataDetailsPanel","useState","jsxs","jsx","format","ButtonsGroup","Button","ChevronsUpDownIcon","ChevronsDownUpIcon","ArrowUpIcon","ArrowDownIcon","cn","ArrowRightIcon","CopyButton","Fragment"],"mappings":"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"}
@@ -26,6 +26,8 @@ function LogDetailsView({
26
26
  const collapsed = controlledCollapsed ?? internalCollapsed;
27
27
  const setCollapsed = onCollapsedChange ?? setInternalCollapsed;
28
28
  const date = toDate(log.timestamp);
29
+ const traceId = log.traceId;
30
+ const spanId = log.spanId;
29
31
  return /* @__PURE__ */ jsxs(DataDetailsPanel, { collapsed, children: [
30
32
  /* @__PURE__ */ jsxs(DataDetailsPanel.Header, { children: [
31
33
  /* @__PURE__ */ jsxs(DataDetailsPanel.Heading, { children: [
@@ -51,45 +53,37 @@ function LogDetailsView({
51
53
  ] }),
52
54
  !collapsed && /* @__PURE__ */ jsxs(DataDetailsPanel.Content, { children: [
53
55
  /* @__PURE__ */ jsx("p", { className: "text-ui-md text-neutral4 font-mono wrap-break-word whitespace-pre-wrap", children: log.message }),
54
- (log.traceId || log.spanId) && /* @__PURE__ */ jsxs("div", { className: cn("grid gap-2 my-8", "[&>button]:justify-between [&>button]:overflow-hidden"), children: [
55
- log.traceId && /* @__PURE__ */ jsxs(ButtonsGroup, { spacing: "close", className: "min-w-0 w-full", children: [
56
- /* @__PURE__ */ jsxs(
57
- Button,
58
- {
59
- size: "md",
60
- className: "min-w-0 flex-1 overflow-hidden",
61
- onClick: () => onTraceClick?.(log.traceId),
62
- children: [
63
- /* @__PURE__ */ jsx(ArrowRightIcon, {}),
64
- /* @__PURE__ */ jsx("span", { children: "Trace" }),
65
- /* @__PURE__ */ jsxs("span", { className: " ml-auto text-ui-sm text-neutral2 min-w-0 truncate", children: [
66
- "# ",
67
- log.traceId
68
- ] })
69
- ]
70
- }
71
- ),
72
- /* @__PURE__ */ jsx(CopyButton, { content: log.traceId, size: "md", tooltip: "Copy Trace ID to clipboard" })
56
+ (traceId || spanId) && /* @__PURE__ */ jsxs("div", { className: cn("grid gap-2 my-8", "[&>button]:justify-between [&>button]:overflow-hidden"), children: [
57
+ traceId && /* @__PURE__ */ jsxs(ButtonsGroup, { spacing: "close", className: "min-w-0 w-full", children: [
58
+ /* @__PURE__ */ jsxs(Button, { size: "md", className: "min-w-0 flex-1 overflow-hidden", onClick: () => onTraceClick?.(traceId), children: [
59
+ /* @__PURE__ */ jsx(ArrowRightIcon, {}),
60
+ /* @__PURE__ */ jsx("span", { children: "Trace" }),
61
+ /* @__PURE__ */ jsxs("span", { className: " ml-auto text-ui-sm text-neutral2 min-w-0 truncate", children: [
62
+ "# ",
63
+ traceId
64
+ ] })
65
+ ] }),
66
+ /* @__PURE__ */ jsx(CopyButton, { content: traceId, size: "md", tooltip: "Copy Trace ID to clipboard" })
73
67
  ] }),
74
- log.spanId && /* @__PURE__ */ jsxs(ButtonsGroup, { spacing: "close", className: "min-w-0 w-full", children: [
68
+ spanId && /* @__PURE__ */ jsxs(ButtonsGroup, { spacing: "close", className: "min-w-0 w-full", children: [
75
69
  /* @__PURE__ */ jsxs(
76
70
  Button,
77
71
  {
78
72
  size: "md",
79
73
  className: "min-w-0 flex-1 overflow-hidden",
80
- disabled: !log.traceId || !onSpanClick,
81
- onClick: () => log.traceId && onSpanClick?.(log.traceId, log.spanId),
74
+ disabled: !traceId || !onSpanClick,
75
+ onClick: () => traceId && onSpanClick?.(traceId, spanId),
82
76
  children: [
83
77
  /* @__PURE__ */ jsx(ArrowRightIcon, {}),
84
78
  /* @__PURE__ */ jsx("span", { children: "Span" }),
85
79
  /* @__PURE__ */ jsxs("span", { className: " ml-auto text-ui-sm text-neutral2 min-w-0 truncate", children: [
86
80
  "# ",
87
- log.spanId
81
+ spanId
88
82
  ] })
89
83
  ]
90
84
  }
91
85
  ),
92
- /* @__PURE__ */ jsx(CopyButton, { content: log.spanId, size: "md", tooltip: "Copy Span ID to clipboard" })
86
+ /* @__PURE__ */ jsx(CopyButton, { content: spanId, size: "md", tooltip: "Copy Span ID to clipboard" })
93
87
  ] })
94
88
  ] }),
95
89
  /* @__PURE__ */ jsxs(KV, { className: "mb-6", children: [
@@ -1 +1 @@
1
- {"version":3,"file":"log-details-view.es.js","sources":["../../../../src/domains/logs/components/log-details-view.tsx"],"sourcesContent":["import { format } from 'date-fns';\nimport { ArrowDownIcon, ArrowRightIcon, ArrowUpIcon, ChevronsDownUpIcon, ChevronsUpDownIcon } from 'lucide-react';\nimport { Fragment, useState } from 'react';\nimport type { LogRecord } from '../types';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { DataDetailsPanel } from '@/ds/components/DataDetailsPanel';\nimport { cn } from '@/lib/utils';\n\nconst KV = DataDetailsPanel.KeyValueList;\n\nfunction toDate(value: Date | string): Date {\n return value instanceof Date ? value : new Date(value);\n}\n\nexport interface LogDetailsViewProps {\n log: LogRecord;\n onClose: () => void;\n onTraceClick?: (traceId: string) => void;\n onSpanClick?: (traceId: string, spanId: string) => void;\n onPrevious?: () => void;\n onNext?: () => void;\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n}\n\nexport function LogDetailsView({\n log,\n onClose,\n onTraceClick,\n onSpanClick,\n onPrevious,\n onNext,\n collapsed: controlledCollapsed,\n onCollapsedChange,\n}: LogDetailsViewProps) {\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n const collapsed = controlledCollapsed ?? internalCollapsed;\n const setCollapsed = onCollapsedChange ?? setInternalCollapsed;\n const date = toDate(log.timestamp);\n\n return (\n <DataDetailsPanel collapsed={collapsed}>\n <DataDetailsPanel.Header>\n <DataDetailsPanel.Heading>\n Log <b>{format(date, 'MMM dd, HH:mm:ss.SSS')}</b>\n </DataDetailsPanel.Heading>\n <ButtonsGroup className=\"ml-auto shrink-0\">\n {onCollapsedChange && (\n <Button\n size=\"md\"\n tooltip={collapsed ? 'Expand panel' : 'Collapse panel'}\n onClick={() => setCollapsed(!collapsed)}\n >\n {collapsed ? <ChevronsUpDownIcon /> : <ChevronsDownUpIcon />}\n </Button>\n )}\n\n <ButtonsGroup spacing=\"close\">\n <Button size=\"md\" tooltip=\"Previous log\" onClick={onPrevious} disabled={!onPrevious}>\n <ArrowUpIcon />\n </Button>\n <Button size=\"md\" tooltip=\"Next log\" onClick={onNext} disabled={!onNext}>\n <ArrowDownIcon />\n </Button>\n </ButtonsGroup>\n\n <DataDetailsPanel.CloseButton onClick={onClose} />\n </ButtonsGroup>\n </DataDetailsPanel.Header>\n\n {!collapsed && (\n <DataDetailsPanel.Content>\n <p className=\"text-ui-md text-neutral4 font-mono wrap-break-word whitespace-pre-wrap\">{log.message}</p>\n\n {(log.traceId || log.spanId) && (\n <div className={cn('grid gap-2 my-8', '[&>button]:justify-between [&>button]:overflow-hidden')}>\n {log.traceId && (\n <ButtonsGroup spacing=\"close\" className=\"min-w-0 w-full\">\n <Button\n size=\"md\"\n className=\"min-w-0 flex-1 overflow-hidden\"\n onClick={() => onTraceClick?.(log.traceId!)}\n >\n <ArrowRightIcon />\n <span>Trace</span>\n <span className=\" ml-auto text-ui-sm text-neutral2 min-w-0 truncate\"># {log.traceId}</span>\n </Button>\n <CopyButton content={log.traceId!} size=\"md\" tooltip=\"Copy Trace ID to clipboard\" />\n </ButtonsGroup>\n )}\n {log.spanId && (\n <ButtonsGroup spacing=\"close\" className=\"min-w-0 w-full\">\n <Button\n size=\"md\"\n className=\"min-w-0 flex-1 overflow-hidden\"\n disabled={!log.traceId || !onSpanClick}\n onClick={() => log.traceId && onSpanClick?.(log.traceId, log.spanId!)}\n >\n <ArrowRightIcon />\n <span>Span</span>\n <span className=\" ml-auto text-ui-sm text-neutral2 min-w-0 truncate\"># {log.spanId}</span>\n </Button>\n <CopyButton content={log.spanId!} size=\"md\" tooltip=\"Copy Span ID to clipboard\" />\n </ButtonsGroup>\n )}\n </div>\n )}\n\n <KV className=\"mb-6\">\n {log.entityType && (\n <>\n <KV.Key>Entity Type</KV.Key>\n <KV.Value>{log.entityType}</KV.Value>\n </>\n )}\n {log.entityName && (\n <>\n <KV.Key>Entity Name</KV.Key>\n <KV.Value>{log.entityName}</KV.Value>\n </>\n )}\n {log.serviceName && (\n <>\n <KV.Key>Service</KV.Key>\n <KV.Value>{log.serviceName}</KV.Value>\n </>\n )}\n {log.environment && (\n <>\n <KV.Key>Environment</KV.Key>\n <KV.Value>{log.environment}</KV.Value>\n </>\n )}\n {log.source && (\n <>\n <KV.Key>Source</KV.Key>\n <KV.Value>{log.source}</KV.Value>\n </>\n )}\n {log.metadata && Object.keys(log.metadata).length > 0 && (\n <>\n {Object.entries(log.metadata).map(([key, value]) => (\n <Fragment key={key}>\n <KV.Key>{key}</KV.Key>\n <KV.Value>{String(value)}</KV.Value>\n </Fragment>\n ))}\n </>\n )}\n </KV>\n\n {log.data && Object.keys(log.data).length > 0 && (\n <DataDetailsPanel.CodeSection title=\"Data\" codeStr={JSON.stringify(log.data, null, 2)} className=\"mt-6\" />\n )}\n </DataDetailsPanel.Content>\n )}\n </DataDetailsPanel>\n );\n}\n"],"names":["Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"log-details-view.es.js","sources":["../../../../src/domains/logs/components/log-details-view.tsx"],"sourcesContent":["import { format } from 'date-fns';\nimport { ArrowDownIcon, ArrowRightIcon, ArrowUpIcon, ChevronsDownUpIcon, ChevronsUpDownIcon } from 'lucide-react';\nimport { Fragment, useState } from 'react';\nimport type { LogRecord } from '../types';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { DataDetailsPanel } from '@/ds/components/DataDetailsPanel';\nimport { cn } from '@/lib/utils';\n\nconst KV = DataDetailsPanel.KeyValueList;\n\nfunction toDate(value: Date | string): Date {\n return value instanceof Date ? value : new Date(value);\n}\n\nexport interface LogDetailsViewProps {\n log: LogRecord;\n onClose: () => void;\n onTraceClick?: (traceId: string) => void;\n onSpanClick?: (traceId: string, spanId: string) => void;\n onPrevious?: () => void;\n onNext?: () => void;\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n}\n\nexport function LogDetailsView({\n log,\n onClose,\n onTraceClick,\n onSpanClick,\n onPrevious,\n onNext,\n collapsed: controlledCollapsed,\n onCollapsedChange,\n}: LogDetailsViewProps) {\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n const collapsed = controlledCollapsed ?? internalCollapsed;\n const setCollapsed = onCollapsedChange ?? setInternalCollapsed;\n const date = toDate(log.timestamp);\n const traceId = log.traceId;\n const spanId = log.spanId;\n\n return (\n <DataDetailsPanel collapsed={collapsed}>\n <DataDetailsPanel.Header>\n <DataDetailsPanel.Heading>\n Log <b>{format(date, 'MMM dd, HH:mm:ss.SSS')}</b>\n </DataDetailsPanel.Heading>\n <ButtonsGroup className=\"ml-auto shrink-0\">\n {onCollapsedChange && (\n <Button\n size=\"md\"\n tooltip={collapsed ? 'Expand panel' : 'Collapse panel'}\n onClick={() => setCollapsed(!collapsed)}\n >\n {collapsed ? <ChevronsUpDownIcon /> : <ChevronsDownUpIcon />}\n </Button>\n )}\n\n <ButtonsGroup spacing=\"close\">\n <Button size=\"md\" tooltip=\"Previous log\" onClick={onPrevious} disabled={!onPrevious}>\n <ArrowUpIcon />\n </Button>\n <Button size=\"md\" tooltip=\"Next log\" onClick={onNext} disabled={!onNext}>\n <ArrowDownIcon />\n </Button>\n </ButtonsGroup>\n\n <DataDetailsPanel.CloseButton onClick={onClose} />\n </ButtonsGroup>\n </DataDetailsPanel.Header>\n\n {!collapsed && (\n <DataDetailsPanel.Content>\n <p className=\"text-ui-md text-neutral4 font-mono wrap-break-word whitespace-pre-wrap\">{log.message}</p>\n\n {(traceId || spanId) && (\n <div className={cn('grid gap-2 my-8', '[&>button]:justify-between [&>button]:overflow-hidden')}>\n {traceId && (\n <ButtonsGroup spacing=\"close\" className=\"min-w-0 w-full\">\n <Button size=\"md\" className=\"min-w-0 flex-1 overflow-hidden\" onClick={() => onTraceClick?.(traceId)}>\n <ArrowRightIcon />\n <span>Trace</span>\n <span className=\" ml-auto text-ui-sm text-neutral2 min-w-0 truncate\"># {traceId}</span>\n </Button>\n <CopyButton content={traceId} size=\"md\" tooltip=\"Copy Trace ID to clipboard\" />\n </ButtonsGroup>\n )}\n {spanId && (\n <ButtonsGroup spacing=\"close\" className=\"min-w-0 w-full\">\n <Button\n size=\"md\"\n className=\"min-w-0 flex-1 overflow-hidden\"\n disabled={!traceId || !onSpanClick}\n onClick={() => traceId && onSpanClick?.(traceId, spanId)}\n >\n <ArrowRightIcon />\n <span>Span</span>\n <span className=\" ml-auto text-ui-sm text-neutral2 min-w-0 truncate\"># {spanId}</span>\n </Button>\n <CopyButton content={spanId} size=\"md\" tooltip=\"Copy Span ID to clipboard\" />\n </ButtonsGroup>\n )}\n </div>\n )}\n\n <KV className=\"mb-6\">\n {log.entityType && (\n <>\n <KV.Key>Entity Type</KV.Key>\n <KV.Value>{log.entityType}</KV.Value>\n </>\n )}\n {log.entityName && (\n <>\n <KV.Key>Entity Name</KV.Key>\n <KV.Value>{log.entityName}</KV.Value>\n </>\n )}\n {log.serviceName && (\n <>\n <KV.Key>Service</KV.Key>\n <KV.Value>{log.serviceName}</KV.Value>\n </>\n )}\n {log.environment && (\n <>\n <KV.Key>Environment</KV.Key>\n <KV.Value>{log.environment}</KV.Value>\n </>\n )}\n {log.source && (\n <>\n <KV.Key>Source</KV.Key>\n <KV.Value>{log.source}</KV.Value>\n </>\n )}\n {log.metadata && Object.keys(log.metadata).length > 0 && (\n <>\n {Object.entries(log.metadata).map(([key, value]) => (\n <Fragment key={key}>\n <KV.Key>{key}</KV.Key>\n <KV.Value>{String(value)}</KV.Value>\n </Fragment>\n ))}\n </>\n )}\n </KV>\n\n {log.data && Object.keys(log.data).length > 0 && (\n <DataDetailsPanel.CodeSection title=\"Data\" codeStr={JSON.stringify(log.data, null, 2)} className=\"mt-6\" />\n )}\n </DataDetailsPanel.Content>\n )}\n </DataDetailsPanel>\n );\n}\n"],"names":["Fragment"],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
5
  const jsxRuntime = require('react/jsx-runtime');
6
- const propertyFilterApplied = require('../../../property-filter-applied-Ec6BkYiN.cjs');
6
+ const propertyFilterApplied = require('../../../property-filter-applied-DnpJ1vFe.cjs');
7
7
  const utils_cn = require('../../../cn-vA5sWo9W.cjs');
8
8
 
9
9
  function LogsToolbar({
@@ -1,5 +1,5 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { P as PropertyFilterApplied, a as PropertyFilterActions } from '../../../property-filter-applied-B3T9NrP5.js';
2
+ import { P as PropertyFilterApplied, a as PropertyFilterActions } from '../../../property-filter-applied-EnHVqWEV.js';
3
3
  import { c as cn } from '../../../cn-BakJzhuv.js';
4
4
 
5
5
  function LogsToolbar({
@@ -56,6 +56,7 @@ function useLogsListNavigation(logs, featuredLogId, onFeaturedChange, featuredTr
56
56
  const handlePreviousLog = featuredLogIdx > 0 ? () => {
57
57
  const prevLog = logs[featuredLogIdx - 1];
58
58
  const id = logIdMap.get(prevLog);
59
+ if (!id) return;
59
60
  if (featuredTraceId) {
60
61
  onFeaturedChange({ logId: id, traceId: prevLog.traceId ?? null, spanId: null });
61
62
  } else {
@@ -65,6 +66,7 @@ function useLogsListNavigation(logs, featuredLogId, onFeaturedChange, featuredTr
65
66
  const handleNextLog = featuredLogIdx >= 0 && featuredLogIdx < logs.length - 1 ? () => {
66
67
  const nextLog = logs[featuredLogIdx + 1];
67
68
  const id = logIdMap.get(nextLog);
69
+ if (!id) return;
68
70
  if (featuredTraceId) {
69
71
  onFeaturedChange({ logId: id, traceId: nextLog.traceId ?? null, spanId: null });
70
72
  } else {
@@ -1 +1 @@
1
- {"version":3,"file":"use-logs-list-navigation.cjs.js","sources":["../../../../src/domains/logs/hooks/use-logs-list-navigation.tsx"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport type { LogRecord } from '../types';\nimport type { LogsFeaturedIds } from './use-logs-url-state';\n\nfunction hashCode(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash + str.charCodeAt(i)) | 0;\n }\n return (hash >>> 0).toString(36);\n}\n\n/** Prefer the storage-assigned `logId`. When absent, derive an id from immutable content fields\n * (`timestamp + message + data`) so the same log lands on the same id across polls regardless\n * of list order or insertions. Two logs without `logId` that hash identically share an id —\n * acceptable because the URL-driven selection still resolves deterministically. */\nfunction buildLogIds(logs: LogRecord[]): Map<LogRecord, string> {\n const ids = new Map<LogRecord, string>();\n for (const log of logs) {\n if (log.logId) {\n ids.set(log, log.logId);\n continue;\n }\n const ts = log.timestamp instanceof Date ? log.timestamp.toISOString() : log.timestamp;\n ids.set(log, hashCode(`${ts}${log.message ?? ''}${log.data ? JSON.stringify(log.data) : ''}`));\n }\n return ids;\n}\n\nexport interface UseLogsListNavigationResult {\n /** Map each log in the list to its derived id. Pass to `<LogsListView logIdMap={...}>`. */\n logIdMap: Map<LogRecord, string>;\n /** Look up a log's id (undefined if not in the list). */\n getLogId: (log: LogRecord) => string | undefined;\n /** The currently featured log resolved from `featuredLogId`, or null. */\n featuredLog: LogRecord | null;\n /** Click handler that flips featured selection with toggle behavior, and — when a trace panel is\n * open — syncs the trace panel to the new log's trace. Pass to `<LogsListView onLogClick={...}>`. */\n handleLogClick: (log: LogRecord) => void;\n /** Undefined when at the start of the list (disable the prev button). */\n handlePreviousLog: (() => void) | undefined;\n /** Undefined when at the end of the list (disable the next button). */\n handleNextLog: (() => void) | undefined;\n}\n\n/**\n * Derives id mapping + featured log + prev/next/click handlers for a logs list. Stateless — only\n * reads from the inputs and calls `onFeaturedChange` on selection changes.\n */\nexport function useLogsListNavigation(\n logs: LogRecord[],\n featuredLogId: string | null,\n onFeaturedChange: (ids: LogsFeaturedIds) => void,\n featuredTraceId?: string | null,\n): UseLogsListNavigationResult {\n const logIdMap = useMemo(() => buildLogIds(logs), [logs]);\n\n const idToLog = useMemo(() => {\n const m = new Map<string, { log: LogRecord; idx: number }>();\n for (let i = 0; i < logs.length; i++) {\n const id = logIdMap.get(logs[i]);\n if (id) m.set(id, { log: logs[i], idx: i });\n }\n return m;\n }, [logs, logIdMap]);\n\n const entry = featuredLogId ? idToLog.get(featuredLogId) : undefined;\n const featuredLogIdx = entry?.idx ?? -1;\n const featuredLog = featuredLogIdx >= 0 ? logs[featuredLogIdx] : null;\n\n const getLogId = useCallback((log: LogRecord) => logIdMap.get(log), [logIdMap]);\n\n const handleLogClick = useCallback(\n (log: LogRecord) => {\n const id = logIdMap.get(log);\n if (!id) return;\n if (featuredLogId === id) {\n onFeaturedChange({ logId: null });\n return;\n }\n if (featuredTraceId) {\n onFeaturedChange({ logId: id, traceId: log.traceId ?? null, spanId: null });\n } else {\n onFeaturedChange({ logId: id });\n }\n },\n [logIdMap, featuredLogId, featuredTraceId, onFeaturedChange],\n );\n\n const handlePreviousLog =\n featuredLogIdx > 0\n ? () => {\n const prevLog = logs[featuredLogIdx - 1];\n const id = logIdMap.get(prevLog)!;\n if (featuredTraceId) {\n onFeaturedChange({ logId: id, traceId: prevLog.traceId ?? null, spanId: null });\n } else {\n onFeaturedChange({ logId: id });\n }\n }\n : undefined;\n\n const handleNextLog =\n featuredLogIdx >= 0 && featuredLogIdx < logs.length - 1\n ? () => {\n const nextLog = logs[featuredLogIdx + 1];\n const id = logIdMap.get(nextLog)!;\n if (featuredTraceId) {\n onFeaturedChange({ logId: id, traceId: nextLog.traceId ?? null, spanId: null });\n } else {\n onFeaturedChange({ logId: id });\n }\n }\n : undefined;\n\n return {\n logIdMap,\n getLogId,\n featuredLog,\n handleLogClick,\n handlePreviousLog,\n handleNextLog,\n };\n}\n"],"names":["useMemo","useCallback"],"mappings":"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"}
1
+ {"version":3,"file":"use-logs-list-navigation.cjs.js","sources":["../../../../src/domains/logs/hooks/use-logs-list-navigation.tsx"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport type { LogRecord } from '../types';\nimport type { LogsFeaturedIds } from './use-logs-url-state';\n\nfunction hashCode(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash + str.charCodeAt(i)) | 0;\n }\n return (hash >>> 0).toString(36);\n}\n\n/** Prefer the storage-assigned `logId`. When absent, derive an id from immutable content fields\n * (`timestamp + message + data`) so the same log lands on the same id across polls regardless\n * of list order or insertions. Two logs without `logId` that hash identically share an id —\n * acceptable because the URL-driven selection still resolves deterministically. */\nfunction buildLogIds(logs: LogRecord[]): Map<LogRecord, string> {\n const ids = new Map<LogRecord, string>();\n for (const log of logs) {\n if (log.logId) {\n ids.set(log, log.logId);\n continue;\n }\n const ts = log.timestamp instanceof Date ? log.timestamp.toISOString() : log.timestamp;\n ids.set(log, hashCode(`${ts}${log.message ?? ''}${log.data ? JSON.stringify(log.data) : ''}`));\n }\n return ids;\n}\n\nexport interface UseLogsListNavigationResult {\n /** Map each log in the list to its derived id. Pass to `<LogsListView logIdMap={...}>`. */\n logIdMap: Map<LogRecord, string>;\n /** Look up a log's id (undefined if not in the list). */\n getLogId: (log: LogRecord) => string | undefined;\n /** The currently featured log resolved from `featuredLogId`, or null. */\n featuredLog: LogRecord | null;\n /** Click handler that flips featured selection with toggle behavior, and — when a trace panel is\n * open — syncs the trace panel to the new log's trace. Pass to `<LogsListView onLogClick={...}>`. */\n handleLogClick: (log: LogRecord) => void;\n /** Undefined when at the start of the list (disable the prev button). */\n handlePreviousLog: (() => void) | undefined;\n /** Undefined when at the end of the list (disable the next button). */\n handleNextLog: (() => void) | undefined;\n}\n\n/**\n * Derives id mapping + featured log + prev/next/click handlers for a logs list. Stateless — only\n * reads from the inputs and calls `onFeaturedChange` on selection changes.\n */\nexport function useLogsListNavigation(\n logs: LogRecord[],\n featuredLogId: string | null,\n onFeaturedChange: (ids: LogsFeaturedIds) => void,\n featuredTraceId?: string | null,\n): UseLogsListNavigationResult {\n const logIdMap = useMemo(() => buildLogIds(logs), [logs]);\n\n const idToLog = useMemo(() => {\n const m = new Map<string, { log: LogRecord; idx: number }>();\n for (let i = 0; i < logs.length; i++) {\n const id = logIdMap.get(logs[i]);\n if (id) m.set(id, { log: logs[i], idx: i });\n }\n return m;\n }, [logs, logIdMap]);\n\n const entry = featuredLogId ? idToLog.get(featuredLogId) : undefined;\n const featuredLogIdx = entry?.idx ?? -1;\n const featuredLog = featuredLogIdx >= 0 ? logs[featuredLogIdx] : null;\n\n const getLogId = useCallback((log: LogRecord) => logIdMap.get(log), [logIdMap]);\n\n const handleLogClick = useCallback(\n (log: LogRecord) => {\n const id = logIdMap.get(log);\n if (!id) return;\n if (featuredLogId === id) {\n onFeaturedChange({ logId: null });\n return;\n }\n if (featuredTraceId) {\n onFeaturedChange({ logId: id, traceId: log.traceId ?? null, spanId: null });\n } else {\n onFeaturedChange({ logId: id });\n }\n },\n [logIdMap, featuredLogId, featuredTraceId, onFeaturedChange],\n );\n\n const handlePreviousLog =\n featuredLogIdx > 0\n ? () => {\n const prevLog = logs[featuredLogIdx - 1];\n const id = logIdMap.get(prevLog);\n if (!id) return;\n if (featuredTraceId) {\n onFeaturedChange({ logId: id, traceId: prevLog.traceId ?? null, spanId: null });\n } else {\n onFeaturedChange({ logId: id });\n }\n }\n : undefined;\n\n const handleNextLog =\n featuredLogIdx >= 0 && featuredLogIdx < logs.length - 1\n ? () => {\n const nextLog = logs[featuredLogIdx + 1];\n const id = logIdMap.get(nextLog);\n if (!id) return;\n if (featuredTraceId) {\n onFeaturedChange({ logId: id, traceId: nextLog.traceId ?? null, spanId: null });\n } else {\n onFeaturedChange({ logId: id });\n }\n }\n : undefined;\n\n return {\n logIdMap,\n getLogId,\n featuredLog,\n handleLogClick,\n handlePreviousLog,\n handleNextLog,\n };\n}\n"],"names":["useMemo","useCallback"],"mappings":"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"}
@@ -52,6 +52,7 @@ function useLogsListNavigation(logs, featuredLogId, onFeaturedChange, featuredTr
52
52
  const handlePreviousLog = featuredLogIdx > 0 ? () => {
53
53
  const prevLog = logs[featuredLogIdx - 1];
54
54
  const id = logIdMap.get(prevLog);
55
+ if (!id) return;
55
56
  if (featuredTraceId) {
56
57
  onFeaturedChange({ logId: id, traceId: prevLog.traceId ?? null, spanId: null });
57
58
  } else {
@@ -61,6 +62,7 @@ function useLogsListNavigation(logs, featuredLogId, onFeaturedChange, featuredTr
61
62
  const handleNextLog = featuredLogIdx >= 0 && featuredLogIdx < logs.length - 1 ? () => {
62
63
  const nextLog = logs[featuredLogIdx + 1];
63
64
  const id = logIdMap.get(nextLog);
65
+ if (!id) return;
64
66
  if (featuredTraceId) {
65
67
  onFeaturedChange({ logId: id, traceId: nextLog.traceId ?? null, spanId: null });
66
68
  } else {
@@ -1 +1 @@
1
- {"version":3,"file":"use-logs-list-navigation.es.js","sources":["../../../../src/domains/logs/hooks/use-logs-list-navigation.tsx"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport type { LogRecord } from '../types';\nimport type { LogsFeaturedIds } from './use-logs-url-state';\n\nfunction hashCode(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash + str.charCodeAt(i)) | 0;\n }\n return (hash >>> 0).toString(36);\n}\n\n/** Prefer the storage-assigned `logId`. When absent, derive an id from immutable content fields\n * (`timestamp + message + data`) so the same log lands on the same id across polls regardless\n * of list order or insertions. Two logs without `logId` that hash identically share an id —\n * acceptable because the URL-driven selection still resolves deterministically. */\nfunction buildLogIds(logs: LogRecord[]): Map<LogRecord, string> {\n const ids = new Map<LogRecord, string>();\n for (const log of logs) {\n if (log.logId) {\n ids.set(log, log.logId);\n continue;\n }\n const ts = log.timestamp instanceof Date ? log.timestamp.toISOString() : log.timestamp;\n ids.set(log, hashCode(`${ts}${log.message ?? ''}${log.data ? JSON.stringify(log.data) : ''}`));\n }\n return ids;\n}\n\nexport interface UseLogsListNavigationResult {\n /** Map each log in the list to its derived id. Pass to `<LogsListView logIdMap={...}>`. */\n logIdMap: Map<LogRecord, string>;\n /** Look up a log's id (undefined if not in the list). */\n getLogId: (log: LogRecord) => string | undefined;\n /** The currently featured log resolved from `featuredLogId`, or null. */\n featuredLog: LogRecord | null;\n /** Click handler that flips featured selection with toggle behavior, and — when a trace panel is\n * open — syncs the trace panel to the new log's trace. Pass to `<LogsListView onLogClick={...}>`. */\n handleLogClick: (log: LogRecord) => void;\n /** Undefined when at the start of the list (disable the prev button). */\n handlePreviousLog: (() => void) | undefined;\n /** Undefined when at the end of the list (disable the next button). */\n handleNextLog: (() => void) | undefined;\n}\n\n/**\n * Derives id mapping + featured log + prev/next/click handlers for a logs list. Stateless — only\n * reads from the inputs and calls `onFeaturedChange` on selection changes.\n */\nexport function useLogsListNavigation(\n logs: LogRecord[],\n featuredLogId: string | null,\n onFeaturedChange: (ids: LogsFeaturedIds) => void,\n featuredTraceId?: string | null,\n): UseLogsListNavigationResult {\n const logIdMap = useMemo(() => buildLogIds(logs), [logs]);\n\n const idToLog = useMemo(() => {\n const m = new Map<string, { log: LogRecord; idx: number }>();\n for (let i = 0; i < logs.length; i++) {\n const id = logIdMap.get(logs[i]);\n if (id) m.set(id, { log: logs[i], idx: i });\n }\n return m;\n }, [logs, logIdMap]);\n\n const entry = featuredLogId ? idToLog.get(featuredLogId) : undefined;\n const featuredLogIdx = entry?.idx ?? -1;\n const featuredLog = featuredLogIdx >= 0 ? logs[featuredLogIdx] : null;\n\n const getLogId = useCallback((log: LogRecord) => logIdMap.get(log), [logIdMap]);\n\n const handleLogClick = useCallback(\n (log: LogRecord) => {\n const id = logIdMap.get(log);\n if (!id) return;\n if (featuredLogId === id) {\n onFeaturedChange({ logId: null });\n return;\n }\n if (featuredTraceId) {\n onFeaturedChange({ logId: id, traceId: log.traceId ?? null, spanId: null });\n } else {\n onFeaturedChange({ logId: id });\n }\n },\n [logIdMap, featuredLogId, featuredTraceId, onFeaturedChange],\n );\n\n const handlePreviousLog =\n featuredLogIdx > 0\n ? () => {\n const prevLog = logs[featuredLogIdx - 1];\n const id = logIdMap.get(prevLog)!;\n if (featuredTraceId) {\n onFeaturedChange({ logId: id, traceId: prevLog.traceId ?? null, spanId: null });\n } else {\n onFeaturedChange({ logId: id });\n }\n }\n : undefined;\n\n const handleNextLog =\n featuredLogIdx >= 0 && featuredLogIdx < logs.length - 1\n ? () => {\n const nextLog = logs[featuredLogIdx + 1];\n const id = logIdMap.get(nextLog)!;\n if (featuredTraceId) {\n onFeaturedChange({ logId: id, traceId: nextLog.traceId ?? null, spanId: null });\n } else {\n onFeaturedChange({ logId: id });\n }\n }\n : undefined;\n\n return {\n logIdMap,\n getLogId,\n featuredLog,\n handleLogClick,\n handlePreviousLog,\n handleNextLog,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-logs-list-navigation.es.js","sources":["../../../../src/domains/logs/hooks/use-logs-list-navigation.tsx"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport type { LogRecord } from '../types';\nimport type { LogsFeaturedIds } from './use-logs-url-state';\n\nfunction hashCode(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash + str.charCodeAt(i)) | 0;\n }\n return (hash >>> 0).toString(36);\n}\n\n/** Prefer the storage-assigned `logId`. When absent, derive an id from immutable content fields\n * (`timestamp + message + data`) so the same log lands on the same id across polls regardless\n * of list order or insertions. Two logs without `logId` that hash identically share an id —\n * acceptable because the URL-driven selection still resolves deterministically. */\nfunction buildLogIds(logs: LogRecord[]): Map<LogRecord, string> {\n const ids = new Map<LogRecord, string>();\n for (const log of logs) {\n if (log.logId) {\n ids.set(log, log.logId);\n continue;\n }\n const ts = log.timestamp instanceof Date ? log.timestamp.toISOString() : log.timestamp;\n ids.set(log, hashCode(`${ts}${log.message ?? ''}${log.data ? JSON.stringify(log.data) : ''}`));\n }\n return ids;\n}\n\nexport interface UseLogsListNavigationResult {\n /** Map each log in the list to its derived id. Pass to `<LogsListView logIdMap={...}>`. */\n logIdMap: Map<LogRecord, string>;\n /** Look up a log's id (undefined if not in the list). */\n getLogId: (log: LogRecord) => string | undefined;\n /** The currently featured log resolved from `featuredLogId`, or null. */\n featuredLog: LogRecord | null;\n /** Click handler that flips featured selection with toggle behavior, and — when a trace panel is\n * open — syncs the trace panel to the new log's trace. Pass to `<LogsListView onLogClick={...}>`. */\n handleLogClick: (log: LogRecord) => void;\n /** Undefined when at the start of the list (disable the prev button). */\n handlePreviousLog: (() => void) | undefined;\n /** Undefined when at the end of the list (disable the next button). */\n handleNextLog: (() => void) | undefined;\n}\n\n/**\n * Derives id mapping + featured log + prev/next/click handlers for a logs list. Stateless — only\n * reads from the inputs and calls `onFeaturedChange` on selection changes.\n */\nexport function useLogsListNavigation(\n logs: LogRecord[],\n featuredLogId: string | null,\n onFeaturedChange: (ids: LogsFeaturedIds) => void,\n featuredTraceId?: string | null,\n): UseLogsListNavigationResult {\n const logIdMap = useMemo(() => buildLogIds(logs), [logs]);\n\n const idToLog = useMemo(() => {\n const m = new Map<string, { log: LogRecord; idx: number }>();\n for (let i = 0; i < logs.length; i++) {\n const id = logIdMap.get(logs[i]);\n if (id) m.set(id, { log: logs[i], idx: i });\n }\n return m;\n }, [logs, logIdMap]);\n\n const entry = featuredLogId ? idToLog.get(featuredLogId) : undefined;\n const featuredLogIdx = entry?.idx ?? -1;\n const featuredLog = featuredLogIdx >= 0 ? logs[featuredLogIdx] : null;\n\n const getLogId = useCallback((log: LogRecord) => logIdMap.get(log), [logIdMap]);\n\n const handleLogClick = useCallback(\n (log: LogRecord) => {\n const id = logIdMap.get(log);\n if (!id) return;\n if (featuredLogId === id) {\n onFeaturedChange({ logId: null });\n return;\n }\n if (featuredTraceId) {\n onFeaturedChange({ logId: id, traceId: log.traceId ?? null, spanId: null });\n } else {\n onFeaturedChange({ logId: id });\n }\n },\n [logIdMap, featuredLogId, featuredTraceId, onFeaturedChange],\n );\n\n const handlePreviousLog =\n featuredLogIdx > 0\n ? () => {\n const prevLog = logs[featuredLogIdx - 1];\n const id = logIdMap.get(prevLog);\n if (!id) return;\n if (featuredTraceId) {\n onFeaturedChange({ logId: id, traceId: prevLog.traceId ?? null, spanId: null });\n } else {\n onFeaturedChange({ logId: id });\n }\n }\n : undefined;\n\n const handleNextLog =\n featuredLogIdx >= 0 && featuredLogIdx < logs.length - 1\n ? () => {\n const nextLog = logs[featuredLogIdx + 1];\n const id = logIdMap.get(nextLog);\n if (!id) return;\n if (featuredTraceId) {\n onFeaturedChange({ logId: id, traceId: nextLog.traceId ?? null, spanId: null });\n } else {\n onFeaturedChange({ logId: id });\n }\n }\n : undefined;\n\n return {\n logIdMap,\n getLogId,\n featuredLog,\n handleLogClick,\n handlePreviousLog,\n handleNextLog,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -22,10 +22,13 @@ function toContextData(records, markers, domain) {
22
22
  ts: String(getObservationTimestamp(r)),
23
23
  pendingMessageTokens: r.pendingMessageTokens
24
24
  }));
25
- const fromMarkers = markers.filter((m) => m.pendingTokens != null).map((m) => ({
26
- ts: m.timestamp,
27
- pendingMessageTokens: m.pendingTokens
28
- }));
25
+ const fromMarkers = markers.flatMap((m) => {
26
+ if (m.pendingTokens == null) return [];
27
+ return {
28
+ ts: m.timestamp,
29
+ pendingMessageTokens: m.pendingTokens
30
+ };
31
+ });
29
32
  return [...fromRecords, ...fromMarkers].sort((a, b) => a.ts.localeCompare(b.ts)).map((d) => ({ t: domains_memory_lib_timeline.toT(d.ts, domain), pendingMessageTokens: d.pendingMessageTokens }));
30
33
  }
31
34
  function toActiveObservationData(records, markers, domain) {
@@ -34,10 +37,13 @@ function toActiveObservationData(records, markers, domain) {
34
37
  ts: String(getObservationTimestamp(record)),
35
38
  observationTokenCount: record.observationTokenCount
36
39
  })),
37
- ...markers.filter((marker) => marker.type === "status" && marker.observationTokens != null).map((marker) => ({
38
- ts: marker.timestamp,
39
- observationTokenCount: marker.observationTokens
40
- }))
40
+ ...markers.flatMap((marker) => {
41
+ if (marker.type !== "status" || marker.observationTokens == null) return [];
42
+ return {
43
+ ts: marker.timestamp,
44
+ observationTokenCount: marker.observationTokens
45
+ };
46
+ })
41
47
  ].sort((a, b) => a.ts.localeCompare(b.ts));
42
48
  let runningTotal = 0;
43
49
  return points.map((point) => {
@@ -46,12 +52,15 @@ function toActiveObservationData(records, markers, domain) {
46
52
  });
47
53
  }
48
54
  function toBufferedObservationData(markers, domain) {
49
- const points = markers.filter(
50
- (marker) => marker.observationTokens != null && (marker.type === "buffering-end" || marker.type === "activation")
51
- ).map((marker) => ({
52
- ts: marker.timestamp,
53
- bufferedObservationTokenCount: marker.type === "activation" ? -marker.observationTokens : marker.observationTokens
54
- })).sort((a, b) => a.ts.localeCompare(b.ts));
55
+ const points = markers.flatMap((marker) => {
56
+ if (marker.observationTokens == null || marker.type !== "buffering-end" && marker.type !== "activation") {
57
+ return [];
58
+ }
59
+ return {
60
+ ts: marker.timestamp,
61
+ bufferedObservationTokenCount: marker.type === "activation" ? -marker.observationTokens : marker.observationTokens
62
+ };
63
+ }).sort((a, b) => a.ts.localeCompare(b.ts));
55
64
  let runningTotal = 0;
56
65
  return points.map((point) => {
57
66
  runningTotal = Math.max(0, runningTotal + point.bufferedObservationTokenCount);