@mastra/playground-ui 40.0.0 → 40.0.1-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/components/ScatterPlotChart.cjs.js +163 -6
  3. package/dist/components/ScatterPlotChart.cjs.js.map +1 -1
  4. package/dist/components/ScatterPlotChart.es.js +162 -1
  5. package/dist/components/ScatterPlotChart.es.js.map +1 -1
  6. package/dist/ee/signals/components/signal-details-page.cjs.js +66 -157
  7. package/dist/ee/signals/components/signal-details-page.cjs.js.map +1 -1
  8. package/dist/ee/signals/components/signal-details-page.es.js +68 -158
  9. package/dist/ee/signals/components/signal-details-page.es.js.map +1 -1
  10. package/dist/ee/signals/components.cjs.js +1 -2
  11. package/dist/ee/signals/components.cjs.js.map +1 -1
  12. package/dist/ee/signals/components.es.js +1 -1
  13. package/dist/ee/signals/hooks/use-entity-learning.cjs.js +0 -17
  14. package/dist/ee/signals/hooks/use-entity-learning.cjs.js.map +1 -1
  15. package/dist/ee/signals/hooks/use-entity-learning.es.js +1 -17
  16. package/dist/ee/signals/hooks/use-entity-learning.es.js.map +1 -1
  17. package/dist/ee/signals/hooks.cjs.js +0 -1
  18. package/dist/ee/signals/hooks.cjs.js.map +1 -1
  19. package/dist/ee/signals/hooks.es.js +1 -1
  20. package/dist/ee/signals/services/entity-learning-service.cjs.js +0 -10
  21. package/dist/ee/signals/services/entity-learning-service.cjs.js.map +1 -1
  22. package/dist/ee/signals/services/entity-learning-service.es.js +0 -10
  23. package/dist/ee/signals/services/entity-learning-service.es.js.map +1 -1
  24. package/dist/ee/signals.cjs.js +1 -3
  25. package/dist/ee/signals.cjs.js.map +1 -1
  26. package/dist/ee/signals.es.js +2 -2
  27. package/dist/src/ee/signals/components/signal-details-page.d.ts +3 -16
  28. package/dist/src/ee/signals/hooks/use-entity-learning.d.ts +1 -3
  29. package/dist/src/ee/signals/services/entity-learning-service.d.ts +1 -8
  30. package/dist/src/ee/signals/services/entity-learning-types.d.ts +0 -13
  31. package/package.json +6 -6
  32. package/dist/scatter-plot-chart-B3hfFMKS.js +0 -163
  33. package/dist/scatter-plot-chart-B3hfFMKS.js.map +0 -1
  34. package/dist/scatter-plot-chart-CFZO31md.cjs +0 -169
  35. package/dist/scatter-plot-chart-CFZO31md.cjs.map +0 -1
@@ -8,10 +8,7 @@ const React = require('react');
8
8
  const Button = require('../../../Button-66ghjQV8.cjs');
9
9
  const dataList = require('../../../data-list-DDQRmA6L.cjs');
10
10
  const inputGroup = require('../../../input-group-CF6DB97L.cjs');
11
- const scatterPlotChart = require('../../../scatter-plot-chart-CFZO31md.cjs');
12
11
  const skeleton = require('../../../skeleton-D5zq7rhk.cjs');
13
- const tabsTab = require('../../../tabs-tab-DkeS2Iv0.cjs');
14
- const tabsContent = require('../../../tabs-content-ohtjaVdC.cjs');
15
12
  const utils_cn = require('../../../cn-vA5sWo9W.cjs');
16
13
  const ee_topics_components_topicsLayout = require('../../topics/components/topics-layout.cjs.js');
17
14
  const ee_topics_components_topicTraceDetailsPanel = require('../../topics/components/topic-trace-details-panel.cjs.js');
@@ -107,10 +104,6 @@ function SignalDetailsSkeleton() {
107
104
  /* @__PURE__ */ jsxRuntime.jsx(skeleton.Skeleton, { className: "h-7 w-48" }),
108
105
  /* @__PURE__ */ jsxRuntime.jsx(skeleton.Skeleton, { className: "h-4 w-64" })
109
106
  ] }),
110
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-6 border-b border-border1/60", children: [
111
- /* @__PURE__ */ jsxRuntime.jsx(skeleton.Skeleton, { className: "mb-2 h-5 w-20" }),
112
- /* @__PURE__ */ jsxRuntime.jsx(skeleton.Skeleton, { className: "mb-2 h-5 w-16" })
113
- ] }),
114
107
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-h-0 flex-1 gap-6 overflow-hidden", children: [
115
108
  /* @__PURE__ */ jsxRuntime.jsx(SignalClusterSidebarSkeleton, {}),
116
109
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1 space-y-4 py-4", children: [
@@ -136,135 +129,79 @@ function SignalTraceListTab({
136
129
  }, [examples, search]);
137
130
  const visible = React.useMemo(() => filtered.slice(0, page * pageSize), [filtered, page, pageSize]);
138
131
  const hasMore = visible.length < filtered.length;
139
- return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "flex min-h-0 flex-1 flex-col gap-4", "aria-label": "Topic trace summaries", children: [
140
- /* @__PURE__ */ jsxRuntime.jsxs(inputGroup.InputGroup, { variant: "outline", children: [
141
- /* @__PURE__ */ jsxRuntime.jsx(inputGroup.InputGroupAddon, { align: "inline-start", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SearchIcon, {}) }),
142
- /* @__PURE__ */ jsxRuntime.jsx(
143
- inputGroup.InputGroupInput,
144
- {
145
- type: "search",
146
- "aria-label": "Search traces",
147
- placeholder: "Search traces",
148
- onChange: (event) => {
149
- setSearch(event.target.value);
150
- setPage(1);
151
- }
152
- }
153
- )
154
- ] }),
155
- /* @__PURE__ */ jsxRuntime.jsxs(
156
- dataList.DataList,
157
- {
158
- columns: "minmax(12rem,1fr)",
159
- className: "min-h-0 flex-1 overflow-hidden rounded-lg border border-border1/60",
160
- children: [
161
- /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.Top, { children: /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.TopCells, { children: /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.TopCell, { children: "Trace summary" }) }) }),
162
- loading ? /* @__PURE__ */ jsxRuntime.jsx(SignalTraceListSkeleton, {}) : visible.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NoMatch, { message: "No traces match this subtopic." }) : visible.map((example) => /* @__PURE__ */ jsxRuntime.jsx(
163
- dataList.DataList.RowButton,
132
+ return /* @__PURE__ */ jsxRuntime.jsxs(
133
+ "section",
134
+ {
135
+ className: "grid grid-rows-[auto_1fr] min-h-0 gap-4 h-full overflow-y-auto",
136
+ "aria-label": "Topic trace summaries",
137
+ children: [
138
+ /* @__PURE__ */ jsxRuntime.jsxs(inputGroup.InputGroup, { variant: "outline", children: [
139
+ /* @__PURE__ */ jsxRuntime.jsx(inputGroup.InputGroupAddon, { align: "inline-start", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SearchIcon, {}) }),
140
+ /* @__PURE__ */ jsxRuntime.jsx(
141
+ inputGroup.InputGroupInput,
164
142
  {
165
- featured: selectedTraceId === example.traceId,
166
- onClick: () => onTraceSelect(example.traceId),
167
- "aria-pressed": selectedTraceId === example.traceId,
168
- children: /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.TextCell, { children: example.signalText })
169
- },
170
- example.exampleId
171
- ))
172
- ]
173
- }
174
- ),
175
- hasMore && !loading ? /* @__PURE__ */ jsxRuntime.jsxs(Button.Button, { variant: "outline", size: "sm", onClick: () => setPage((currentPage) => currentPage + 1), children: [
176
- "Load more traces (",
177
- visible.length,
178
- " of ",
179
- filtered.length,
180
- ")"
181
- ] }) : null
182
- ] });
183
- }
184
- function SignalChartTab({ topics, points, selectedTopicIds, onTopicToggle }) {
185
- const chartData = React.useMemo(
186
- () => points.filter(
187
- (point) => point.topicId !== void 0 && selectedTopicIds.includes(point.topicId)
188
- ).map((point) => ({ ...point, color: clusterColor(point.topicId) })),
189
- [points, selectedTopicIds]
143
+ type: "search",
144
+ "aria-label": "Search traces",
145
+ placeholder: "Search traces",
146
+ onChange: (event) => {
147
+ setSearch(event.target.value);
148
+ setPage(1);
149
+ }
150
+ }
151
+ )
152
+ ] }),
153
+ /* @__PURE__ */ jsxRuntime.jsxs(
154
+ dataList.DataList,
155
+ {
156
+ columns: "minmax(12rem,1fr)",
157
+ className: "min-h-0 h-full overflow-y-auto rounded-lg border border-border1/60",
158
+ children: [
159
+ /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.Top, { children: /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.TopCells, { children: /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.TopCell, { children: "Trace summary" }) }) }),
160
+ loading ? /* @__PURE__ */ jsxRuntime.jsx(SignalTraceListSkeleton, {}) : visible.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NoMatch, { message: "No traces match this subtopic." }) : visible.map((example) => /* @__PURE__ */ jsxRuntime.jsx(
161
+ dataList.DataList.RowButton,
162
+ {
163
+ featured: selectedTraceId === example.traceId,
164
+ onClick: () => onTraceSelect(example.traceId),
165
+ "aria-pressed": selectedTraceId === example.traceId,
166
+ children: /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.TextCell, { children: example.signalText })
167
+ },
168
+ example.exampleId
169
+ ))
170
+ ]
171
+ }
172
+ ),
173
+ hasMore && !loading ? /* @__PURE__ */ jsxRuntime.jsxs(Button.Button, { variant: "outline", size: "sm", onClick: () => setPage((currentPage) => currentPage + 1), children: [
174
+ "Load more traces (",
175
+ visible.length,
176
+ " of ",
177
+ filtered.length,
178
+ ")"
179
+ ] }) : null
180
+ ]
181
+ }
190
182
  );
191
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full min-w-0 gap-6", children: [
192
- /* @__PURE__ */ jsxRuntime.jsx(
193
- SignalClusterSidebar,
194
- {
195
- topics,
196
- selectedTopicIds,
197
- onTopicSelect: onTopicToggle,
198
- multiple: true,
199
- ariaLabel: "Chart cluster filters"
200
- }
201
- ),
202
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 min-w-0 flex-1 py-4", children: /* @__PURE__ */ jsxRuntime.jsx(
203
- scatterPlotChart.ScatterPlotChart,
204
- {
205
- data: chartData,
206
- xKey: "x",
207
- yKey: "y",
208
- nameKey: "topicId",
209
- colorKey: "color",
210
- height: "100%",
211
- className: "h-full",
212
- xLabel: "X",
213
- yLabel: "Y"
214
- }
215
- ) })
216
- ] });
217
183
  }
218
- function SignalClusterTabs({
184
+ function SignalClusterTraceList({
219
185
  topics,
220
186
  examples,
221
187
  examplesLoading,
222
- points,
223
188
  selectedTopicId,
224
189
  selectedTraceId,
225
- selectedChartTopicIds,
226
- activeTab,
227
- onActiveTabChange,
228
190
  onTopicSelect,
229
- onChartTopicToggle,
230
191
  onTraceSelect
231
192
  }) {
232
- return /* @__PURE__ */ jsxRuntime.jsxs(
233
- tabsTab.Tabs,
234
- {
235
- defaultTab: "trace-list",
236
- value: activeTab,
237
- onValueChange: onActiveTabChange,
238
- className: "flex h-full min-h-0 flex-col overflow-hidden",
239
- children: [
240
- /* @__PURE__ */ jsxRuntime.jsxs(tabsTab.TabList, { variant: "line", children: [
241
- /* @__PURE__ */ jsxRuntime.jsx(tabsTab.Tab, { value: "trace-list", children: "Trace list" }),
242
- /* @__PURE__ */ jsxRuntime.jsx(tabsTab.Tab, { value: "chart", children: "Chart" })
243
- ] }),
244
- /* @__PURE__ */ jsxRuntime.jsx(tabsContent.TabContent, { value: "trace-list", className: "min-h-0 flex-1 overflow-hidden py-0", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full min-w-0 gap-6", children: [
245
- /* @__PURE__ */ jsxRuntime.jsx(SignalClusterSidebar, { topics, selectedTopicIds: [selectedTopicId], onTopicSelect }),
246
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 flex-1 overflow-hidden py-4", children: /* @__PURE__ */ jsxRuntime.jsx(
247
- SignalTraceListTab,
248
- {
249
- examples,
250
- loading: examplesLoading,
251
- selectedTraceId,
252
- onTraceSelect
253
- }
254
- ) })
255
- ] }) }),
256
- /* @__PURE__ */ jsxRuntime.jsx(tabsContent.TabContent, { value: "chart", className: "min-h-0 flex-1 overflow-hidden py-0", children: /* @__PURE__ */ jsxRuntime.jsx(
257
- SignalChartTab,
258
- {
259
- topics,
260
- points,
261
- selectedTopicIds: selectedChartTopicIds,
262
- onTopicToggle: onChartTopicToggle
263
- }
264
- ) })
265
- ]
266
- }
267
- );
193
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full min-w-0 gap-6 overflow-y-auto", children: [
194
+ /* @__PURE__ */ jsxRuntime.jsx(SignalClusterSidebar, { topics, selectedTopicIds: [selectedTopicId], onTopicSelect }),
195
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 flex-1 overflow-y-auto h-full py-4", children: /* @__PURE__ */ jsxRuntime.jsx(
196
+ SignalTraceListTab,
197
+ {
198
+ examples,
199
+ loading: examplesLoading,
200
+ selectedTraceId,
201
+ onTraceSelect
202
+ }
203
+ ) })
204
+ ] });
268
205
  }
269
206
  function SignalDetailsPage({
270
207
  signalId,
@@ -284,24 +221,16 @@ function SignalDetailsPage({
284
221
  const topics = React.useMemo(() => topicsData?.topics ?? [], [topicsData?.topics]);
285
222
  const runId = topicsData?.run?.runId;
286
223
  const topicSelectionScope = `${signalId ?? ""}:${entity?.entityId ?? ""}:${runId ?? ""}:${initialTopicId ?? ""}`;
287
- const chartSelectionScope = `${signalId ?? ""}:${entity?.entityId ?? ""}:${runId ?? ""}`;
288
224
  const topicIds = React.useMemo(() => topics.map((topic) => topic.topicId), [topics]);
289
225
  const topicIdSet = React.useMemo(() => new Set(topicIds), [topicIds]);
290
226
  const [selectedTopic, setSelectedTopic] = React.useState(() => ({
291
227
  scope: topicSelectionScope,
292
228
  topicId: initialTopicId ?? null
293
229
  }));
294
- const [selectedChartTopics, setSelectedChartTopics] = React.useState(() => ({
295
- scope: chartSelectionScope,
296
- topicIds: null
297
- }));
298
- const [activeTab, setActiveTab] = React.useState("trace-list");
299
230
  const requestedTopicId = selectedTopic.scope === topicSelectionScope ? selectedTopic.topicId : initialTopicId ?? null;
300
231
  const resolvedTopicId = requestedTopicId && topicIdSet.has(requestedTopicId) ? requestedTopicId : topics[0]?.topicId;
301
232
  const selectedTopicData = topics.find((topic) => topic.topicId === resolvedTopicId);
302
233
  const examplesEnabled = Boolean(resolvedEntity?.entityId && signalId && runId && selectedTopicData);
303
- const pointsEnabled = Boolean(resolvedEntity?.entityId && signalId && runId);
304
- const chartTopicIds = selectedChartTopics.scope === chartSelectionScope && selectedChartTopics.topicIds ? selectedChartTopics.topicIds.filter((topicId) => topicIdSet.has(topicId)) : topicIds;
305
234
  const {
306
235
  data: examplesData,
307
236
  isLoading: examplesLoading,
@@ -314,11 +243,6 @@ function SignalDetailsPage({
314
243
  );
315
244
  const examples = examplesData?.examples ?? [];
316
245
  const examplesPending = examplesLoading || examplesFetching && examplesData === void 0;
317
- const { data: pointsData, isError: pointsError } = ee_signals_hooks_useEntityLearning.useEntityPoints(
318
- resolvedEntity?.entityId,
319
- pointsEnabled && runId && signalId ? { signalName: signalId, runId, includeOutliers: true } : void 0
320
- );
321
- const points = pointsData?.points ?? [];
322
246
  const handleTraceSelect = (traceId) => {
323
247
  if (!signalId) return;
324
248
  onTraceSelect(signalId, traceId);
@@ -326,53 +250,38 @@ function SignalDetailsPage({
326
250
  const handleTopicSelect = (topicId) => {
327
251
  setSelectedTopic({ scope: topicSelectionScope, topicId });
328
252
  };
329
- const handleChartTopicToggle = (topicId) => {
330
- setSelectedChartTopics((current) => {
331
- const base = current.scope === chartSelectionScope && current.topicIds ? current.topicIds : topicIds;
332
- return {
333
- scope: chartSelectionScope,
334
- topicIds: base.includes(topicId) ? base.filter((id) => id !== topicId) : [...base, topicId]
335
- };
336
- });
337
- };
338
253
  if (entitiesLoading || topicsLoading) {
339
254
  return /* @__PURE__ */ jsxRuntime.jsx(SignalsLayout, { sidebar: null, children: /* @__PURE__ */ jsxRuntime.jsx(SignalDetailsSkeleton, {}) });
340
255
  }
341
- if (entitiesError || topicsError || examplesEnabled && examplesError || pointsEnabled && pointsError) {
256
+ if (entitiesError || topicsError || examplesEnabled && examplesError) {
342
257
  return /* @__PURE__ */ jsxRuntime.jsx(SignalsLayout, { sidebar: null, children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-ui-md text-accent2", children: "Failed to load this signal from the observability endpoint." }) });
343
258
  }
344
259
  if (!resolvedEntity || !selectedTopicData) {
345
260
  return /* @__PURE__ */ jsxRuntime.jsx(SignalsLayout, { sidebar: null, children: "Signal not found" });
346
261
  }
347
262
  const signalName = ee_signals_signalsData.getSignalCatalogEntry(signalId ?? "").name;
348
- return /* @__PURE__ */ jsxRuntime.jsx(SignalsLayout, { sidebar: null, tracePanel: activeTab === "trace-list" ? tracePanel : void 0, children: /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "flex h-full min-w-0 flex-col gap-4", children: [
263
+ return /* @__PURE__ */ jsxRuntime.jsx(SignalsLayout, { sidebar: null, tracePanel, children: /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "flex h-full min-w-0 flex-col gap-4", children: [
349
264
  /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "space-y-1", children: [
350
265
  /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-icon-xl font-semibold text-neutral6", children: signalName }),
351
266
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-ui-sm text-neutral3", children: "Explore trace patterns by cluster." })
352
267
  ] }),
353
268
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 flex-1 overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx(
354
- SignalClusterTabs,
269
+ SignalClusterTraceList,
355
270
  {
356
271
  topics,
357
272
  examples,
358
273
  examplesLoading: examplesPending,
359
- points,
360
274
  selectedTopicId: selectedTopicData.topicId,
361
275
  selectedTraceId,
362
- selectedChartTopicIds: chartTopicIds,
363
- activeTab,
364
- onActiveTabChange: setActiveTab,
365
276
  onTopicSelect: handleTopicSelect,
366
- onChartTopicToggle: handleChartTopicToggle,
367
277
  onTraceSelect: handleTraceSelect
368
278
  }
369
279
  ) })
370
280
  ] }) });
371
281
  }
372
282
 
373
- exports.SignalChartTab = SignalChartTab;
374
283
  exports.SignalClusterSidebar = SignalClusterSidebar;
375
- exports.SignalClusterTabs = SignalClusterTabs;
284
+ exports.SignalClusterTraceList = SignalClusterTraceList;
376
285
  exports.SignalDetailsPage = SignalDetailsPage;
377
286
  exports.SignalTraceDetailsPanel = SignalTraceDetailsPanel;
378
287
  exports.SignalTraceListTab = SignalTraceListTab;
@@ -1 +1 @@
1
- {"version":3,"file":"signal-details-page.cjs.js","sources":["../../../../src/ee/signals/components/signal-details-page.tsx"],"sourcesContent":["import { SearchIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { Button } from '../../../ds/components/Button';\nimport { DataList } from '../../../ds/components/DataList/data-list';\nimport { InputGroup, InputGroupAddon, InputGroupInput } from '../../../ds/components/InputGroup';\nimport { ScatterPlotChart } from '../../../ds/components/ScatterPlotChart';\nimport { Skeleton } from '../../../ds/components/Skeleton';\nimport { Tab, TabContent, TabList, Tabs } from '../../../ds/components/Tabs';\nimport { cn } from '../../../lib/utils';\nimport { TopicTraceDetailsPanel, TopicsLayout } from '../../topics';\nimport { useEntities, useEntityPoints, useEntityTopicExamples, useEntityTopics } from '../hooks';\nimport type { EntityLearningPoint, EntityLearningTopic, EntityLearningTopicExample } from '../services';\nimport { getSignalCatalogEntry } from '../signals-data';\nimport type { SelectedEntity } from '../types';\n\nexport const SignalTraceDetailsPanel = TopicTraceDetailsPanel;\nconst SignalsLayout = TopicsLayout;\n\ntype SignalTab = 'trace-list' | 'chart';\n\nfunction clusterColor(topicId: string) {\n let hash = 0;\n for (let i = 0; i < topicId.length; i++) {\n hash = topicId.charCodeAt(i) + ((hash << 5) - hash);\n hash = hash & hash;\n }\n // Multiply by the golden-angle so close ids (e.g. \"1\",\"2\",\"3\") map to well-separated hues.\n const hue = Math.abs(hash * 137.508) % 360;\n return `hsl(${hue}, 70%, 55%)`;\n}\n\ninterface SignalClusterSidebarProps {\n topics: EntityLearningTopic[];\n selectedTopicIds: string[];\n onTopicSelect: (topicId: string) => void;\n multiple?: boolean;\n ariaLabel?: string;\n}\n\nexport function SignalClusterSidebar({\n topics,\n selectedTopicIds,\n onTopicSelect,\n multiple = false,\n ariaLabel = 'Signal clusters',\n}: SignalClusterSidebarProps) {\n return (\n <aside\n className=\"min-h-0 w-72 shrink-0 overflow-y-auto border-r border-border1/60 pr-4 py-4\"\n aria-label={ariaLabel}\n >\n <ul className=\"space-y-1\" role={multiple ? 'group' : undefined}>\n {topics.map(topic => {\n const selected = selectedTopicIds.includes(topic.topicId);\n return (\n <li key={topic.topicId}>\n <button\n type=\"button\"\n role={multiple ? 'checkbox' : undefined}\n aria-checked={multiple ? selected : undefined}\n aria-pressed={multiple ? undefined : selected}\n className=\"group cursor-pointer w-full rounded-xl px-3 py-2 text-left transition-colors hover:bg-surface3 aria-pressed:bg-surface3 aria-checked:bg-surface3 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent1\"\n onClick={() => onTopicSelect(topic.topicId)}\n >\n <span className=\"flex items-start gap-2\">\n <span\n className={cn('mt-1.5 h-2 w-2 shrink-0 rounded-full', multiple && !selected && 'invisible')}\n style={{ backgroundColor: clusterColor(topic.topicId) }}\n />\n <span className=\"min-w-0 space-y-1\">\n <span\n className={cn(\n 'block text-sm font-medium',\n multiple && !selected ? 'text-neutral3' : 'text-neutral5',\n )}\n >\n {topic.name}\n </span>\n <span\n className={cn(\n 'line-clamp-2 block text-sm',\n multiple && !selected ? 'text-neutral1' : 'text-neutral2',\n )}\n >\n {topic.description}\n </span>\n </span>\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n </aside>\n );\n}\n\nfunction SignalTraceListSkeleton({ rows = 8 }: { rows?: number }) {\n return (\n <div className=\"space-y-1 px-2 py-1\" aria-label=\"Loading traces\" aria-busy=\"true\">\n {Array.from({ length: rows }).map((_, index) => (\n <Skeleton key={index} className=\"h-9 w-full rounded-lg\" />\n ))}\n </div>\n );\n}\n\nfunction SignalClusterSidebarSkeleton({ rows = 5 }: { rows?: number }) {\n return (\n <aside className=\"min-h-0 w-72 shrink-0 overflow-y-auto border-r border-border1/60 pr-4 py-4\" aria-hidden=\"true\">\n <ul className=\"space-y-1\">\n {Array.from({ length: rows }).map((_, index) => (\n <li key={index} className=\"flex items-start gap-2 px-3 py-2\">\n <Skeleton className=\"mt-1.5 h-2 w-2 shrink-0 rounded-full\" />\n <div className=\"min-w-0 flex-1 space-y-1.5\">\n <Skeleton className=\"h-4 w-1/2\" />\n <Skeleton className=\"h-3 w-full\" />\n </div>\n </li>\n ))}\n </ul>\n </aside>\n );\n}\n\nfunction SignalDetailsSkeleton() {\n return (\n <section className=\"flex h-full min-w-0 flex-col gap-4\" aria-label=\"Loading signal\" aria-busy=\"true\">\n <header className=\"space-y-2\">\n <Skeleton className=\"h-7 w-48\" />\n <Skeleton className=\"h-4 w-64\" />\n </header>\n <div className=\"flex gap-6 border-b border-border1/60\">\n <Skeleton className=\"mb-2 h-5 w-20\" />\n <Skeleton className=\"mb-2 h-5 w-16\" />\n </div>\n <div className=\"flex min-h-0 flex-1 gap-6 overflow-hidden\">\n <SignalClusterSidebarSkeleton />\n <div className=\"min-w-0 flex-1 space-y-4 py-4\">\n <Skeleton className=\"h-9 w-full rounded-lg\" />\n <SignalTraceListSkeleton />\n </div>\n </div>\n </section>\n );\n}\n\nexport function SignalTraceListTab({\n examples,\n selectedTraceId,\n onTraceSelect,\n loading = false,\n pageSize = 25,\n}: {\n examples: EntityLearningTopicExample[];\n selectedTraceId: string | null;\n onTraceSelect: (traceId: string) => void;\n loading?: boolean;\n pageSize?: number;\n}) {\n const [search, setSearch] = useState('');\n const [page, setPage] = useState(1);\n\n const filtered = useMemo(() => {\n const query = search.trim().toLowerCase();\n if (!query) return examples;\n return examples.filter(example => example.signalText.toLowerCase().includes(query));\n }, [examples, search]);\n\n const visible = useMemo(() => filtered.slice(0, page * pageSize), [filtered, page, pageSize]);\n const hasMore = visible.length < filtered.length;\n\n return (\n <section className=\"flex min-h-0 flex-1 flex-col gap-4\" aria-label=\"Topic trace summaries\">\n <InputGroup variant=\"outline\">\n <InputGroupAddon align=\"inline-start\">\n <SearchIcon />\n </InputGroupAddon>\n <InputGroupInput\n type=\"search\"\n aria-label=\"Search traces\"\n placeholder=\"Search traces\"\n onChange={event => {\n setSearch(event.target.value);\n setPage(1);\n }}\n />\n </InputGroup>\n\n <DataList\n columns=\"minmax(12rem,1fr)\"\n className=\"min-h-0 flex-1 overflow-hidden rounded-lg border border-border1/60\"\n >\n <DataList.Top>\n <DataList.TopCells>\n <DataList.TopCell>Trace summary</DataList.TopCell>\n </DataList.TopCells>\n </DataList.Top>\n\n {loading ? (\n <SignalTraceListSkeleton />\n ) : visible.length === 0 ? (\n <DataList.NoMatch message=\"No traces match this subtopic.\" />\n ) : (\n visible.map(example => (\n <DataList.RowButton\n key={example.exampleId}\n featured={selectedTraceId === example.traceId}\n onClick={() => onTraceSelect(example.traceId)}\n aria-pressed={selectedTraceId === example.traceId}\n >\n <DataList.TextCell>{example.signalText}</DataList.TextCell>\n </DataList.RowButton>\n ))\n )}\n </DataList>\n\n {hasMore && !loading ? (\n <Button variant=\"outline\" size=\"sm\" onClick={() => setPage(currentPage => currentPage + 1)}>\n Load more traces ({visible.length} of {filtered.length})\n </Button>\n ) : null}\n </section>\n );\n}\n\ninterface SignalChartTabProps {\n topics: EntityLearningTopic[];\n points: EntityLearningPoint[];\n selectedTopicIds: string[];\n onTopicToggle: (topicId: string) => void;\n}\n\nexport function SignalChartTab({ topics, points, selectedTopicIds, onTopicToggle }: SignalChartTabProps) {\n const chartData = useMemo(\n () =>\n points\n // Only show points belonging to a selected cluster.\n .filter(\n (point): point is EntityLearningPoint & { topicId: string } =>\n point.topicId !== undefined && selectedTopicIds.includes(point.topicId),\n )\n .map(point => ({ ...point, color: clusterColor(point.topicId) })),\n [points, selectedTopicIds],\n );\n\n return (\n <div className=\"flex h-full min-w-0 gap-6\">\n <SignalClusterSidebar\n topics={topics}\n selectedTopicIds={selectedTopicIds}\n onTopicSelect={onTopicToggle}\n multiple\n ariaLabel=\"Chart cluster filters\"\n />\n <div className=\"min-h-0 min-w-0 flex-1 py-4\">\n <ScatterPlotChart\n data={chartData}\n xKey=\"x\"\n yKey=\"y\"\n nameKey=\"topicId\"\n colorKey=\"color\"\n height=\"100%\"\n className=\"h-full\"\n xLabel=\"X\"\n yLabel=\"Y\"\n />\n </div>\n </div>\n );\n}\n\ninterface SignalClusterTabsProps {\n topics: EntityLearningTopic[];\n examples: EntityLearningTopicExample[];\n examplesLoading: boolean;\n points: EntityLearningPoint[];\n selectedTopicId: string;\n selectedTraceId: string | null;\n selectedChartTopicIds: string[];\n activeTab: SignalTab;\n onActiveTabChange: (tab: SignalTab) => void;\n onTopicSelect: (topicId: string) => void;\n onChartTopicToggle: (topicId: string) => void;\n onTraceSelect: (traceId: string) => void;\n}\n\nexport function SignalClusterTabs({\n topics,\n examples,\n examplesLoading,\n points,\n selectedTopicId,\n selectedTraceId,\n selectedChartTopicIds,\n activeTab,\n onActiveTabChange,\n onTopicSelect,\n onChartTopicToggle,\n onTraceSelect,\n}: SignalClusterTabsProps) {\n return (\n <Tabs<SignalTab>\n defaultTab=\"trace-list\"\n value={activeTab}\n onValueChange={onActiveTabChange}\n className=\"flex h-full min-h-0 flex-col overflow-hidden\"\n >\n <TabList variant=\"line\">\n <Tab value=\"trace-list\">Trace list</Tab>\n <Tab value=\"chart\">Chart</Tab>\n </TabList>\n <TabContent value=\"trace-list\" className=\"min-h-0 flex-1 overflow-hidden py-0\">\n <div className=\"flex h-full min-w-0 gap-6\">\n <SignalClusterSidebar topics={topics} selectedTopicIds={[selectedTopicId]} onTopicSelect={onTopicSelect} />\n <div className=\"min-w-0 flex-1 overflow-hidden py-4\">\n <SignalTraceListTab\n examples={examples}\n loading={examplesLoading}\n selectedTraceId={selectedTraceId}\n onTraceSelect={onTraceSelect}\n />\n </div>\n </div>\n </TabContent>\n <TabContent value=\"chart\" className=\"min-h-0 flex-1 overflow-hidden py-0\">\n <SignalChartTab\n topics={topics}\n points={points}\n selectedTopicIds={selectedChartTopicIds}\n onTopicToggle={onChartTopicToggle}\n />\n </TabContent>\n </Tabs>\n );\n}\n\nexport interface SignalDetailsPageProps {\n signalId?: string;\n entity: SelectedEntity | null;\n selectedTraceId: string | null;\n initialTopicId?: string | null;\n tracePanel?: ReactNode;\n onTraceSelect: (signalId: string, traceId: string) => void;\n}\n\nexport function SignalDetailsPage({\n signalId,\n entity,\n selectedTraceId,\n initialTopicId,\n tracePanel,\n onTraceSelect,\n}: SignalDetailsPageProps) {\n const { data: entities = [], isLoading: entitiesLoading, isError: entitiesError } = useEntities();\n const resolvedEntity = entities.find(item => item.entityId === entity?.entityId);\n\n // No runId: the API resolves the latest run for this signal (the entity-wide\n // `latestRunId` belongs to a single signal). Examples/points below reuse the\n // run resolved by the topics response so all three queries hit the same run.\n const {\n data: topicsData,\n isLoading: topicsLoading,\n isError: topicsError,\n } = useEntityTopics(resolvedEntity?.entityId, signalId);\n const topics = useMemo<EntityLearningTopic[]>(() => topicsData?.topics ?? [], [topicsData?.topics]);\n const runId = topicsData?.run?.runId;\n\n const topicSelectionScope = `${signalId ?? ''}:${entity?.entityId ?? ''}:${runId ?? ''}:${initialTopicId ?? ''}`;\n const chartSelectionScope = `${signalId ?? ''}:${entity?.entityId ?? ''}:${runId ?? ''}`;\n const topicIds = useMemo(() => topics.map(topic => topic.topicId), [topics]);\n const topicIdSet = useMemo(() => new Set(topicIds), [topicIds]);\n const [selectedTopic, setSelectedTopic] = useState<{ scope: string; topicId: string | null }>(() => ({\n scope: topicSelectionScope,\n topicId: initialTopicId ?? null,\n }));\n const [selectedChartTopics, setSelectedChartTopics] = useState<{ scope: string; topicIds: string[] | null }>(() => ({\n scope: chartSelectionScope,\n topicIds: null,\n }));\n const [activeTab, setActiveTab] = useState<SignalTab>('trace-list');\n\n const requestedTopicId =\n selectedTopic.scope === topicSelectionScope ? selectedTopic.topicId : (initialTopicId ?? null);\n const resolvedTopicId = requestedTopicId && topicIdSet.has(requestedTopicId) ? requestedTopicId : topics[0]?.topicId;\n const selectedTopicData = topics.find(topic => topic.topicId === resolvedTopicId);\n const examplesEnabled = Boolean(resolvedEntity?.entityId && signalId && runId && selectedTopicData);\n const pointsEnabled = Boolean(resolvedEntity?.entityId && signalId && runId);\n const chartTopicIds =\n selectedChartTopics.scope === chartSelectionScope && selectedChartTopics.topicIds\n ? selectedChartTopics.topicIds.filter(topicId => topicIdSet.has(topicId))\n : topicIds;\n\n const {\n data: examplesData,\n isLoading: examplesLoading,\n isFetching: examplesFetching,\n isError: examplesError,\n } = useEntityTopicExamples(\n resolvedEntity?.entityId,\n selectedTopicData?.topicId,\n examplesEnabled && runId && signalId ? { signalName: signalId, runId } : undefined,\n );\n const examples: EntityLearningTopicExample[] = examplesData?.examples ?? [];\n // Show the skeleton on the first load and while switching topics refetches,\n // so the trace list never flashes the empty-state copy between datasets.\n const examplesPending = examplesLoading || (examplesFetching && examplesData === undefined);\n\n const { data: pointsData, isError: pointsError } = useEntityPoints(\n resolvedEntity?.entityId,\n pointsEnabled && runId && signalId ? { signalName: signalId, runId, includeOutliers: true } : undefined,\n );\n const points: EntityLearningPoint[] = pointsData?.points ?? [];\n\n const handleTraceSelect = (traceId: string) => {\n if (!signalId) return;\n onTraceSelect(signalId, traceId);\n };\n\n const handleTopicSelect = (topicId: string) => {\n setSelectedTopic({ scope: topicSelectionScope, topicId });\n };\n\n const handleChartTopicToggle = (topicId: string) => {\n setSelectedChartTopics(current => {\n const base = current.scope === chartSelectionScope && current.topicIds ? current.topicIds : topicIds;\n return {\n scope: chartSelectionScope,\n topicIds: base.includes(topicId) ? base.filter(id => id !== topicId) : [...base, topicId],\n };\n });\n };\n\n if (entitiesLoading || topicsLoading) {\n return (\n <SignalsLayout sidebar={null}>\n <SignalDetailsSkeleton />\n </SignalsLayout>\n );\n }\n\n if (entitiesError || topicsError || (examplesEnabled && examplesError) || (pointsEnabled && pointsError)) {\n return (\n <SignalsLayout sidebar={null}>\n <p className=\"text-ui-md text-accent2\">Failed to load this signal from the observability endpoint.</p>\n </SignalsLayout>\n );\n }\n\n if (!resolvedEntity || !selectedTopicData) {\n return <SignalsLayout sidebar={null}>Signal not found</SignalsLayout>;\n }\n\n const signalName = getSignalCatalogEntry(signalId ?? '').name;\n\n return (\n <SignalsLayout sidebar={null} tracePanel={activeTab === 'trace-list' ? tracePanel : undefined}>\n <section className=\"flex h-full min-w-0 flex-col gap-4\">\n <header className=\"space-y-1\">\n <h1 className=\"text-icon-xl font-semibold text-neutral6\">{signalName}</h1>\n <p className=\"text-ui-sm text-neutral3\">Explore trace patterns by cluster.</p>\n </header>\n <div className=\"min-h-0 flex-1 overflow-hidden\">\n <SignalClusterTabs\n topics={topics}\n examples={examples}\n examplesLoading={examplesPending}\n points={points}\n selectedTopicId={selectedTopicData.topicId}\n selectedTraceId={selectedTraceId}\n selectedChartTopicIds={chartTopicIds}\n activeTab={activeTab}\n onActiveTabChange={setActiveTab}\n onTopicSelect={handleTopicSelect}\n onChartTopicToggle={handleChartTopicToggle}\n onTraceSelect={handleTraceSelect}\n />\n </div>\n </section>\n </SignalsLayout>\n );\n}\n"],"names":["TopicTraceDetailsPanel","TopicsLayout","jsx","jsxs","cn","Skeleton","useState","useMemo","InputGroup","InputGroupAddon","SearchIcon","InputGroupInput","DataList","Button","ScatterPlotChart","Tabs","TabList","Tab","TabContent","useEntities","useEntityTopics","useEntityTopicExamples","useEntityPoints","getSignalCatalogEntry"],"mappings":"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"}
1
+ {"version":3,"file":"signal-details-page.cjs.js","sources":["../../../../src/ee/signals/components/signal-details-page.tsx"],"sourcesContent":["import { SearchIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { Button } from '../../../ds/components/Button';\nimport { DataList } from '../../../ds/components/DataList/data-list';\nimport { InputGroup, InputGroupAddon, InputGroupInput } from '../../../ds/components/InputGroup';\nimport { Skeleton } from '../../../ds/components/Skeleton';\nimport { cn } from '../../../lib/utils';\nimport { TopicTraceDetailsPanel, TopicsLayout } from '../../topics';\nimport { useEntities, useEntityTopicExamples, useEntityTopics } from '../hooks';\nimport type { EntityLearningTopic, EntityLearningTopicExample } from '../services';\nimport { getSignalCatalogEntry } from '../signals-data';\nimport type { SelectedEntity } from '../types';\n\nexport const SignalTraceDetailsPanel = TopicTraceDetailsPanel;\nconst SignalsLayout = TopicsLayout;\n\nfunction clusterColor(topicId: string) {\n let hash = 0;\n for (let i = 0; i < topicId.length; i++) {\n hash = topicId.charCodeAt(i) + ((hash << 5) - hash);\n hash = hash & hash;\n }\n // Multiply by the golden-angle so close ids (e.g. \"1\",\"2\",\"3\") map to well-separated hues.\n const hue = Math.abs(hash * 137.508) % 360;\n return `hsl(${hue}, 70%, 55%)`;\n}\n\ninterface SignalClusterSidebarProps {\n topics: EntityLearningTopic[];\n selectedTopicIds: string[];\n onTopicSelect: (topicId: string) => void;\n multiple?: boolean;\n ariaLabel?: string;\n}\n\nexport function SignalClusterSidebar({\n topics,\n selectedTopicIds,\n onTopicSelect,\n multiple = false,\n ariaLabel = 'Signal clusters',\n}: SignalClusterSidebarProps) {\n return (\n <aside\n className=\"min-h-0 w-72 shrink-0 overflow-y-auto border-r border-border1/60 pr-4 py-4\"\n aria-label={ariaLabel}\n >\n <ul className=\"space-y-1\" role={multiple ? 'group' : undefined}>\n {topics.map(topic => {\n const selected = selectedTopicIds.includes(topic.topicId);\n return (\n <li key={topic.topicId}>\n <button\n type=\"button\"\n role={multiple ? 'checkbox' : undefined}\n aria-checked={multiple ? selected : undefined}\n aria-pressed={multiple ? undefined : selected}\n className=\"group cursor-pointer w-full rounded-xl px-3 py-2 text-left transition-colors hover:bg-surface3 aria-pressed:bg-surface3 aria-checked:bg-surface3 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent1\"\n onClick={() => onTopicSelect(topic.topicId)}\n >\n <span className=\"flex items-start gap-2\">\n <span\n className={cn('mt-1.5 h-2 w-2 shrink-0 rounded-full', multiple && !selected && 'invisible')}\n style={{ backgroundColor: clusterColor(topic.topicId) }}\n />\n <span className=\"min-w-0 space-y-1\">\n <span\n className={cn(\n 'block text-sm font-medium',\n multiple && !selected ? 'text-neutral3' : 'text-neutral5',\n )}\n >\n {topic.name}\n </span>\n <span\n className={cn(\n 'line-clamp-2 block text-sm',\n multiple && !selected ? 'text-neutral1' : 'text-neutral2',\n )}\n >\n {topic.description}\n </span>\n </span>\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n </aside>\n );\n}\n\nfunction SignalTraceListSkeleton({ rows = 8 }: { rows?: number }) {\n return (\n <div className=\"space-y-1 px-2 py-1\" aria-label=\"Loading traces\" aria-busy=\"true\">\n {Array.from({ length: rows }).map((_, index) => (\n <Skeleton key={index} className=\"h-9 w-full rounded-lg\" />\n ))}\n </div>\n );\n}\n\nfunction SignalClusterSidebarSkeleton({ rows = 5 }: { rows?: number }) {\n return (\n <aside className=\"min-h-0 w-72 shrink-0 overflow-y-auto border-r border-border1/60 pr-4 py-4\" aria-hidden=\"true\">\n <ul className=\"space-y-1\">\n {Array.from({ length: rows }).map((_, index) => (\n <li key={index} className=\"flex items-start gap-2 px-3 py-2\">\n <Skeleton className=\"mt-1.5 h-2 w-2 shrink-0 rounded-full\" />\n <div className=\"min-w-0 flex-1 space-y-1.5\">\n <Skeleton className=\"h-4 w-1/2\" />\n <Skeleton className=\"h-3 w-full\" />\n </div>\n </li>\n ))}\n </ul>\n </aside>\n );\n}\n\nfunction SignalDetailsSkeleton() {\n return (\n <section className=\"flex h-full min-w-0 flex-col gap-4\" aria-label=\"Loading signal\" aria-busy=\"true\">\n <header className=\"space-y-2\">\n <Skeleton className=\"h-7 w-48\" />\n <Skeleton className=\"h-4 w-64\" />\n </header>\n <div className=\"flex min-h-0 flex-1 gap-6 overflow-hidden\">\n <SignalClusterSidebarSkeleton />\n <div className=\"min-w-0 flex-1 space-y-4 py-4\">\n <Skeleton className=\"h-9 w-full rounded-lg\" />\n <SignalTraceListSkeleton />\n </div>\n </div>\n </section>\n );\n}\n\nexport function SignalTraceListTab({\n examples,\n selectedTraceId,\n onTraceSelect,\n loading = false,\n pageSize = 25,\n}: {\n examples: EntityLearningTopicExample[];\n selectedTraceId: string | null;\n onTraceSelect: (traceId: string) => void;\n loading?: boolean;\n pageSize?: number;\n}) {\n const [search, setSearch] = useState('');\n const [page, setPage] = useState(1);\n\n const filtered = useMemo(() => {\n const query = search.trim().toLowerCase();\n if (!query) return examples;\n return examples.filter(example => example.signalText.toLowerCase().includes(query));\n }, [examples, search]);\n\n const visible = useMemo(() => filtered.slice(0, page * pageSize), [filtered, page, pageSize]);\n const hasMore = visible.length < filtered.length;\n\n return (\n <section\n className=\"grid grid-rows-[auto_1fr] min-h-0 gap-4 h-full overflow-y-auto\"\n aria-label=\"Topic trace summaries\"\n >\n <InputGroup variant=\"outline\">\n <InputGroupAddon align=\"inline-start\">\n <SearchIcon />\n </InputGroupAddon>\n <InputGroupInput\n type=\"search\"\n aria-label=\"Search traces\"\n placeholder=\"Search traces\"\n onChange={event => {\n setSearch(event.target.value);\n setPage(1);\n }}\n />\n </InputGroup>\n\n <DataList\n columns=\"minmax(12rem,1fr)\"\n className=\"min-h-0 h-full overflow-y-auto rounded-lg border border-border1/60\"\n >\n <DataList.Top>\n <DataList.TopCells>\n <DataList.TopCell>Trace summary</DataList.TopCell>\n </DataList.TopCells>\n </DataList.Top>\n\n {loading ? (\n <SignalTraceListSkeleton />\n ) : visible.length === 0 ? (\n <DataList.NoMatch message=\"No traces match this subtopic.\" />\n ) : (\n visible.map(example => (\n <DataList.RowButton\n key={example.exampleId}\n featured={selectedTraceId === example.traceId}\n onClick={() => onTraceSelect(example.traceId)}\n aria-pressed={selectedTraceId === example.traceId}\n >\n <DataList.TextCell>{example.signalText}</DataList.TextCell>\n </DataList.RowButton>\n ))\n )}\n </DataList>\n\n {hasMore && !loading ? (\n <Button variant=\"outline\" size=\"sm\" onClick={() => setPage(currentPage => currentPage + 1)}>\n Load more traces ({visible.length} of {filtered.length})\n </Button>\n ) : null}\n </section>\n );\n}\n\ninterface SignalClusterTraceListProps {\n topics: EntityLearningTopic[];\n examples: EntityLearningTopicExample[];\n examplesLoading: boolean;\n selectedTopicId: string;\n selectedTraceId: string | null;\n onTopicSelect: (topicId: string) => void;\n onTraceSelect: (traceId: string) => void;\n}\n\nexport function SignalClusterTraceList({\n topics,\n examples,\n examplesLoading,\n selectedTopicId,\n selectedTraceId,\n onTopicSelect,\n onTraceSelect,\n}: SignalClusterTraceListProps) {\n return (\n <div className=\"flex h-full min-w-0 gap-6 overflow-y-auto\">\n <SignalClusterSidebar topics={topics} selectedTopicIds={[selectedTopicId]} onTopicSelect={onTopicSelect} />\n <div className=\"min-w-0 flex-1 overflow-y-auto h-full py-4\">\n <SignalTraceListTab\n examples={examples}\n loading={examplesLoading}\n selectedTraceId={selectedTraceId}\n onTraceSelect={onTraceSelect}\n />\n </div>\n </div>\n );\n}\n\nexport interface SignalDetailsPageProps {\n signalId?: string;\n entity: SelectedEntity | null;\n selectedTraceId: string | null;\n initialTopicId?: string | null;\n tracePanel?: ReactNode;\n onTraceSelect: (signalId: string, traceId: string) => void;\n}\n\nexport function SignalDetailsPage({\n signalId,\n entity,\n selectedTraceId,\n initialTopicId,\n tracePanel,\n onTraceSelect,\n}: SignalDetailsPageProps) {\n const { data: entities = [], isLoading: entitiesLoading, isError: entitiesError } = useEntities();\n const resolvedEntity = entities.find(item => item.entityId === entity?.entityId);\n\n // No runId: the API resolves the latest run for this signal (the entity-wide\n // `latestRunId` belongs to a single signal). Examples below reuse the run\n // resolved by the topics response.\n const {\n data: topicsData,\n isLoading: topicsLoading,\n isError: topicsError,\n } = useEntityTopics(resolvedEntity?.entityId, signalId);\n const topics = useMemo<EntityLearningTopic[]>(() => topicsData?.topics ?? [], [topicsData?.topics]);\n const runId = topicsData?.run?.runId;\n\n const topicSelectionScope = `${signalId ?? ''}:${entity?.entityId ?? ''}:${runId ?? ''}:${initialTopicId ?? ''}`;\n const topicIds = useMemo(() => topics.map(topic => topic.topicId), [topics]);\n const topicIdSet = useMemo(() => new Set(topicIds), [topicIds]);\n const [selectedTopic, setSelectedTopic] = useState<{ scope: string; topicId: string | null }>(() => ({\n scope: topicSelectionScope,\n topicId: initialTopicId ?? null,\n }));\n\n const requestedTopicId =\n selectedTopic.scope === topicSelectionScope ? selectedTopic.topicId : (initialTopicId ?? null);\n const resolvedTopicId = requestedTopicId && topicIdSet.has(requestedTopicId) ? requestedTopicId : topics[0]?.topicId;\n const selectedTopicData = topics.find(topic => topic.topicId === resolvedTopicId);\n const examplesEnabled = Boolean(resolvedEntity?.entityId && signalId && runId && selectedTopicData);\n const {\n data: examplesData,\n isLoading: examplesLoading,\n isFetching: examplesFetching,\n isError: examplesError,\n } = useEntityTopicExamples(\n resolvedEntity?.entityId,\n selectedTopicData?.topicId,\n examplesEnabled && runId && signalId ? { signalName: signalId, runId } : undefined,\n );\n const examples: EntityLearningTopicExample[] = examplesData?.examples ?? [];\n // Show the skeleton on the first load and while switching topics refetches,\n // so the trace list never flashes the empty-state copy between datasets.\n const examplesPending = examplesLoading || (examplesFetching && examplesData === undefined);\n\n const handleTraceSelect = (traceId: string) => {\n if (!signalId) return;\n onTraceSelect(signalId, traceId);\n };\n\n const handleTopicSelect = (topicId: string) => {\n setSelectedTopic({ scope: topicSelectionScope, topicId });\n };\n\n if (entitiesLoading || topicsLoading) {\n return (\n <SignalsLayout sidebar={null}>\n <SignalDetailsSkeleton />\n </SignalsLayout>\n );\n }\n\n if (entitiesError || topicsError || (examplesEnabled && examplesError)) {\n return (\n <SignalsLayout sidebar={null}>\n <p className=\"text-ui-md text-accent2\">Failed to load this signal from the observability endpoint.</p>\n </SignalsLayout>\n );\n }\n\n if (!resolvedEntity || !selectedTopicData) {\n return <SignalsLayout sidebar={null}>Signal not found</SignalsLayout>;\n }\n\n const signalName = getSignalCatalogEntry(signalId ?? '').name;\n\n return (\n <SignalsLayout sidebar={null} tracePanel={tracePanel}>\n <section className=\"flex h-full min-w-0 flex-col gap-4\">\n <header className=\"space-y-1\">\n <h1 className=\"text-icon-xl font-semibold text-neutral6\">{signalName}</h1>\n <p className=\"text-ui-sm text-neutral3\">Explore trace patterns by cluster.</p>\n </header>\n <div className=\"min-h-0 flex-1 overflow-hidden\">\n <SignalClusterTraceList\n topics={topics}\n examples={examples}\n examplesLoading={examplesPending}\n selectedTopicId={selectedTopicData.topicId}\n selectedTraceId={selectedTraceId}\n onTopicSelect={handleTopicSelect}\n onTraceSelect={handleTraceSelect}\n />\n </div>\n </section>\n </SignalsLayout>\n );\n}\n"],"names":["TopicTraceDetailsPanel","TopicsLayout","jsx","jsxs","cn","Skeleton","useState","useMemo","InputGroup","InputGroupAddon","SearchIcon","InputGroupInput","DataList","Button","useEntities","useEntityTopics","useEntityTopicExamples","getSignalCatalogEntry"],"mappings":"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"}