@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
@@ -1,17 +1,14 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { SearchIcon } from 'lucide-react';
3
3
  import { useMemo, useState } from 'react';
4
4
  import { B as Button } from '../../../Button-Bq0VuEbC.js';
5
5
  import { D as DataList } from '../../../data-list-D5uItcj6.js';
6
6
  import { I as InputGroup, a as InputGroupAddon, c as InputGroupInput } from '../../../input-group-DvVwUJwx.js';
7
- import { S as ScatterPlotChart } from '../../../scatter-plot-chart-B3hfFMKS.js';
8
7
  import { S as Skeleton } from '../../../skeleton-CUjhGPAx.js';
9
- import { b as Tabs, a as TabList, T as Tab } from '../../../tabs-tab-1KGOybMG.js';
10
- import { T as TabContent } from '../../../tabs-content--uzXt5ch.js';
11
8
  import { c as cn } from '../../../cn-BakJzhuv.js';
12
9
  import { TopicsLayout } from '../../topics/components/topics-layout.es.js';
13
10
  import { TopicTraceDetailsPanel } from '../../topics/components/topic-trace-details-panel.es.js';
14
- import { useEntities, useEntityTopics, useEntityTopicExamples, useEntityPoints } from '../hooks/use-entity-learning.es.js';
11
+ import { useEntities, useEntityTopics, useEntityTopicExamples } from '../hooks/use-entity-learning.es.js';
15
12
  import { getSignalCatalogEntry } from '../signals-data.es.js';
16
13
 
17
14
  const SignalTraceDetailsPanel = TopicTraceDetailsPanel;
@@ -103,10 +100,6 @@ function SignalDetailsSkeleton() {
103
100
  /* @__PURE__ */ jsx(Skeleton, { className: "h-7 w-48" }),
104
101
  /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-64" })
105
102
  ] }),
106
- /* @__PURE__ */ jsxs("div", { className: "flex gap-6 border-b border-border1/60", children: [
107
- /* @__PURE__ */ jsx(Skeleton, { className: "mb-2 h-5 w-20" }),
108
- /* @__PURE__ */ jsx(Skeleton, { className: "mb-2 h-5 w-16" })
109
- ] }),
110
103
  /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 flex-1 gap-6 overflow-hidden", children: [
111
104
  /* @__PURE__ */ jsx(SignalClusterSidebarSkeleton, {}),
112
105
  /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1 space-y-4 py-4", children: [
@@ -132,135 +125,79 @@ function SignalTraceListTab({
132
125
  }, [examples, search]);
133
126
  const visible = useMemo(() => filtered.slice(0, page * pageSize), [filtered, page, pageSize]);
134
127
  const hasMore = visible.length < filtered.length;
135
- return /* @__PURE__ */ jsxs("section", { className: "flex min-h-0 flex-1 flex-col gap-4", "aria-label": "Topic trace summaries", children: [
136
- /* @__PURE__ */ jsxs(InputGroup, { variant: "outline", children: [
137
- /* @__PURE__ */ jsx(InputGroupAddon, { align: "inline-start", children: /* @__PURE__ */ jsx(SearchIcon, {}) }),
138
- /* @__PURE__ */ jsx(
139
- InputGroupInput,
140
- {
141
- type: "search",
142
- "aria-label": "Search traces",
143
- placeholder: "Search traces",
144
- onChange: (event) => {
145
- setSearch(event.target.value);
146
- setPage(1);
147
- }
148
- }
149
- )
150
- ] }),
151
- /* @__PURE__ */ jsxs(
152
- DataList,
153
- {
154
- columns: "minmax(12rem,1fr)",
155
- className: "min-h-0 flex-1 overflow-hidden rounded-lg border border-border1/60",
156
- children: [
157
- /* @__PURE__ */ jsx(DataList.Top, { children: /* @__PURE__ */ jsx(DataList.TopCells, { children: /* @__PURE__ */ jsx(DataList.TopCell, { children: "Trace summary" }) }) }),
158
- loading ? /* @__PURE__ */ jsx(SignalTraceListSkeleton, {}) : visible.length === 0 ? /* @__PURE__ */ jsx(DataList.NoMatch, { message: "No traces match this subtopic." }) : visible.map((example) => /* @__PURE__ */ jsx(
159
- DataList.RowButton,
128
+ return /* @__PURE__ */ jsxs(
129
+ "section",
130
+ {
131
+ className: "grid grid-rows-[auto_1fr] min-h-0 gap-4 h-full overflow-y-auto",
132
+ "aria-label": "Topic trace summaries",
133
+ children: [
134
+ /* @__PURE__ */ jsxs(InputGroup, { variant: "outline", children: [
135
+ /* @__PURE__ */ jsx(InputGroupAddon, { align: "inline-start", children: /* @__PURE__ */ jsx(SearchIcon, {}) }),
136
+ /* @__PURE__ */ jsx(
137
+ InputGroupInput,
160
138
  {
161
- featured: selectedTraceId === example.traceId,
162
- onClick: () => onTraceSelect(example.traceId),
163
- "aria-pressed": selectedTraceId === example.traceId,
164
- children: /* @__PURE__ */ jsx(DataList.TextCell, { children: example.signalText })
165
- },
166
- example.exampleId
167
- ))
168
- ]
169
- }
170
- ),
171
- hasMore && !loading ? /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: () => setPage((currentPage) => currentPage + 1), children: [
172
- "Load more traces (",
173
- visible.length,
174
- " of ",
175
- filtered.length,
176
- ")"
177
- ] }) : null
178
- ] });
179
- }
180
- function SignalChartTab({ topics, points, selectedTopicIds, onTopicToggle }) {
181
- const chartData = useMemo(
182
- () => points.filter(
183
- (point) => point.topicId !== void 0 && selectedTopicIds.includes(point.topicId)
184
- ).map((point) => ({ ...point, color: clusterColor(point.topicId) })),
185
- [points, selectedTopicIds]
139
+ type: "search",
140
+ "aria-label": "Search traces",
141
+ placeholder: "Search traces",
142
+ onChange: (event) => {
143
+ setSearch(event.target.value);
144
+ setPage(1);
145
+ }
146
+ }
147
+ )
148
+ ] }),
149
+ /* @__PURE__ */ jsxs(
150
+ DataList,
151
+ {
152
+ columns: "minmax(12rem,1fr)",
153
+ className: "min-h-0 h-full overflow-y-auto rounded-lg border border-border1/60",
154
+ children: [
155
+ /* @__PURE__ */ jsx(DataList.Top, { children: /* @__PURE__ */ jsx(DataList.TopCells, { children: /* @__PURE__ */ jsx(DataList.TopCell, { children: "Trace summary" }) }) }),
156
+ loading ? /* @__PURE__ */ jsx(SignalTraceListSkeleton, {}) : visible.length === 0 ? /* @__PURE__ */ jsx(DataList.NoMatch, { message: "No traces match this subtopic." }) : visible.map((example) => /* @__PURE__ */ jsx(
157
+ DataList.RowButton,
158
+ {
159
+ featured: selectedTraceId === example.traceId,
160
+ onClick: () => onTraceSelect(example.traceId),
161
+ "aria-pressed": selectedTraceId === example.traceId,
162
+ children: /* @__PURE__ */ jsx(DataList.TextCell, { children: example.signalText })
163
+ },
164
+ example.exampleId
165
+ ))
166
+ ]
167
+ }
168
+ ),
169
+ hasMore && !loading ? /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: () => setPage((currentPage) => currentPage + 1), children: [
170
+ "Load more traces (",
171
+ visible.length,
172
+ " of ",
173
+ filtered.length,
174
+ ")"
175
+ ] }) : null
176
+ ]
177
+ }
186
178
  );
187
- return /* @__PURE__ */ jsxs("div", { className: "flex h-full min-w-0 gap-6", children: [
188
- /* @__PURE__ */ jsx(
189
- SignalClusterSidebar,
190
- {
191
- topics,
192
- selectedTopicIds,
193
- onTopicSelect: onTopicToggle,
194
- multiple: true,
195
- ariaLabel: "Chart cluster filters"
196
- }
197
- ),
198
- /* @__PURE__ */ jsx("div", { className: "min-h-0 min-w-0 flex-1 py-4", children: /* @__PURE__ */ jsx(
199
- ScatterPlotChart,
200
- {
201
- data: chartData,
202
- xKey: "x",
203
- yKey: "y",
204
- nameKey: "topicId",
205
- colorKey: "color",
206
- height: "100%",
207
- className: "h-full",
208
- xLabel: "X",
209
- yLabel: "Y"
210
- }
211
- ) })
212
- ] });
213
179
  }
214
- function SignalClusterTabs({
180
+ function SignalClusterTraceList({
215
181
  topics,
216
182
  examples,
217
183
  examplesLoading,
218
- points,
219
184
  selectedTopicId,
220
185
  selectedTraceId,
221
- selectedChartTopicIds,
222
- activeTab,
223
- onActiveTabChange,
224
186
  onTopicSelect,
225
- onChartTopicToggle,
226
187
  onTraceSelect
227
188
  }) {
228
- return /* @__PURE__ */ jsxs(
229
- Tabs,
230
- {
231
- defaultTab: "trace-list",
232
- value: activeTab,
233
- onValueChange: onActiveTabChange,
234
- className: "flex h-full min-h-0 flex-col overflow-hidden",
235
- children: [
236
- /* @__PURE__ */ jsxs(TabList, { variant: "line", children: [
237
- /* @__PURE__ */ jsx(Tab, { value: "trace-list", children: "Trace list" }),
238
- /* @__PURE__ */ jsx(Tab, { value: "chart", children: "Chart" })
239
- ] }),
240
- /* @__PURE__ */ jsx(TabContent, { value: "trace-list", className: "min-h-0 flex-1 overflow-hidden py-0", children: /* @__PURE__ */ jsxs("div", { className: "flex h-full min-w-0 gap-6", children: [
241
- /* @__PURE__ */ jsx(SignalClusterSidebar, { topics, selectedTopicIds: [selectedTopicId], onTopicSelect }),
242
- /* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1 overflow-hidden py-4", children: /* @__PURE__ */ jsx(
243
- SignalTraceListTab,
244
- {
245
- examples,
246
- loading: examplesLoading,
247
- selectedTraceId,
248
- onTraceSelect
249
- }
250
- ) })
251
- ] }) }),
252
- /* @__PURE__ */ jsx(TabContent, { value: "chart", className: "min-h-0 flex-1 overflow-hidden py-0", children: /* @__PURE__ */ jsx(
253
- SignalChartTab,
254
- {
255
- topics,
256
- points,
257
- selectedTopicIds: selectedChartTopicIds,
258
- onTopicToggle: onChartTopicToggle
259
- }
260
- ) })
261
- ]
262
- }
263
- );
189
+ return /* @__PURE__ */ jsxs("div", { className: "flex h-full min-w-0 gap-6 overflow-y-auto", children: [
190
+ /* @__PURE__ */ jsx(SignalClusterSidebar, { topics, selectedTopicIds: [selectedTopicId], onTopicSelect }),
191
+ /* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1 overflow-y-auto h-full py-4", children: /* @__PURE__ */ jsx(
192
+ SignalTraceListTab,
193
+ {
194
+ examples,
195
+ loading: examplesLoading,
196
+ selectedTraceId,
197
+ onTraceSelect
198
+ }
199
+ ) })
200
+ ] });
264
201
  }
265
202
  function SignalDetailsPage({
266
203
  signalId,
@@ -280,24 +217,16 @@ function SignalDetailsPage({
280
217
  const topics = useMemo(() => topicsData?.topics ?? [], [topicsData?.topics]);
281
218
  const runId = topicsData?.run?.runId;
282
219
  const topicSelectionScope = `${signalId ?? ""}:${entity?.entityId ?? ""}:${runId ?? ""}:${initialTopicId ?? ""}`;
283
- const chartSelectionScope = `${signalId ?? ""}:${entity?.entityId ?? ""}:${runId ?? ""}`;
284
220
  const topicIds = useMemo(() => topics.map((topic) => topic.topicId), [topics]);
285
221
  const topicIdSet = useMemo(() => new Set(topicIds), [topicIds]);
286
222
  const [selectedTopic, setSelectedTopic] = useState(() => ({
287
223
  scope: topicSelectionScope,
288
224
  topicId: initialTopicId ?? null
289
225
  }));
290
- const [selectedChartTopics, setSelectedChartTopics] = useState(() => ({
291
- scope: chartSelectionScope,
292
- topicIds: null
293
- }));
294
- const [activeTab, setActiveTab] = useState("trace-list");
295
226
  const requestedTopicId = selectedTopic.scope === topicSelectionScope ? selectedTopic.topicId : initialTopicId ?? null;
296
227
  const resolvedTopicId = requestedTopicId && topicIdSet.has(requestedTopicId) ? requestedTopicId : topics[0]?.topicId;
297
228
  const selectedTopicData = topics.find((topic) => topic.topicId === resolvedTopicId);
298
229
  const examplesEnabled = Boolean(resolvedEntity?.entityId && signalId && runId && selectedTopicData);
299
- const pointsEnabled = Boolean(resolvedEntity?.entityId && signalId && runId);
300
- const chartTopicIds = selectedChartTopics.scope === chartSelectionScope && selectedChartTopics.topicIds ? selectedChartTopics.topicIds.filter((topicId) => topicIdSet.has(topicId)) : topicIds;
301
230
  const {
302
231
  data: examplesData,
303
232
  isLoading: examplesLoading,
@@ -310,11 +239,6 @@ function SignalDetailsPage({
310
239
  );
311
240
  const examples = examplesData?.examples ?? [];
312
241
  const examplesPending = examplesLoading || examplesFetching && examplesData === void 0;
313
- const { data: pointsData, isError: pointsError } = useEntityPoints(
314
- resolvedEntity?.entityId,
315
- pointsEnabled && runId && signalId ? { signalName: signalId, runId, includeOutliers: true } : void 0
316
- );
317
- const points = pointsData?.points ?? [];
318
242
  const handleTraceSelect = (traceId) => {
319
243
  if (!signalId) return;
320
244
  onTraceSelect(signalId, traceId);
@@ -322,49 +246,35 @@ function SignalDetailsPage({
322
246
  const handleTopicSelect = (topicId) => {
323
247
  setSelectedTopic({ scope: topicSelectionScope, topicId });
324
248
  };
325
- const handleChartTopicToggle = (topicId) => {
326
- setSelectedChartTopics((current) => {
327
- const base = current.scope === chartSelectionScope && current.topicIds ? current.topicIds : topicIds;
328
- return {
329
- scope: chartSelectionScope,
330
- topicIds: base.includes(topicId) ? base.filter((id) => id !== topicId) : [...base, topicId]
331
- };
332
- });
333
- };
334
249
  if (entitiesLoading || topicsLoading) {
335
250
  return /* @__PURE__ */ jsx(SignalsLayout, { sidebar: null, children: /* @__PURE__ */ jsx(SignalDetailsSkeleton, {}) });
336
251
  }
337
- if (entitiesError || topicsError || examplesEnabled && examplesError || pointsEnabled && pointsError) {
252
+ if (entitiesError || topicsError || examplesEnabled && examplesError) {
338
253
  return /* @__PURE__ */ jsx(SignalsLayout, { sidebar: null, children: /* @__PURE__ */ jsx("p", { className: "text-ui-md text-accent2", children: "Failed to load this signal from the observability endpoint." }) });
339
254
  }
340
255
  if (!resolvedEntity || !selectedTopicData) {
341
256
  return /* @__PURE__ */ jsx(SignalsLayout, { sidebar: null, children: "Signal not found" });
342
257
  }
343
258
  const signalName = getSignalCatalogEntry(signalId ?? "").name;
344
- return /* @__PURE__ */ jsx(SignalsLayout, { sidebar: null, tracePanel: activeTab === "trace-list" ? tracePanel : void 0, children: /* @__PURE__ */ jsxs("section", { className: "flex h-full min-w-0 flex-col gap-4", children: [
259
+ return /* @__PURE__ */ jsx(SignalsLayout, { sidebar: null, tracePanel, children: /* @__PURE__ */ jsxs("section", { className: "flex h-full min-w-0 flex-col gap-4", children: [
345
260
  /* @__PURE__ */ jsxs("header", { className: "space-y-1", children: [
346
261
  /* @__PURE__ */ jsx("h1", { className: "text-icon-xl font-semibold text-neutral6", children: signalName }),
347
262
  /* @__PURE__ */ jsx("p", { className: "text-ui-sm text-neutral3", children: "Explore trace patterns by cluster." })
348
263
  ] }),
349
264
  /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-hidden", children: /* @__PURE__ */ jsx(
350
- SignalClusterTabs,
265
+ SignalClusterTraceList,
351
266
  {
352
267
  topics,
353
268
  examples,
354
269
  examplesLoading: examplesPending,
355
- points,
356
270
  selectedTopicId: selectedTopicData.topicId,
357
271
  selectedTraceId,
358
- selectedChartTopicIds: chartTopicIds,
359
- activeTab,
360
- onActiveTabChange: setActiveTab,
361
272
  onTopicSelect: handleTopicSelect,
362
- onChartTopicToggle: handleChartTopicToggle,
363
273
  onTraceSelect: handleTraceSelect
364
274
  }
365
275
  ) })
366
276
  ] }) });
367
277
  }
368
278
 
369
- export { SignalChartTab, SignalClusterSidebar, SignalClusterTabs, SignalDetailsPage, SignalTraceDetailsPanel, SignalTraceListTab };
279
+ export { SignalClusterSidebar, SignalClusterTraceList, SignalDetailsPage, SignalTraceDetailsPanel, SignalTraceListTab };
370
280
  //# sourceMappingURL=signal-details-page.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"signal-details-page.es.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":[],"mappings":"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"}
1
+ {"version":3,"file":"signal-details-page.es.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":[],"mappings":"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"}
@@ -8,9 +8,8 @@ const ee_signals_components_signalsOverviewPage = require('./components/signals-
8
8
 
9
9
 
10
10
 
11
- exports.SignalChartTab = ee_signals_components_signalDetailsPage.SignalChartTab;
12
11
  exports.SignalClusterSidebar = ee_signals_components_signalDetailsPage.SignalClusterSidebar;
13
- exports.SignalClusterTabs = ee_signals_components_signalDetailsPage.SignalClusterTabs;
12
+ exports.SignalClusterTraceList = ee_signals_components_signalDetailsPage.SignalClusterTraceList;
14
13
  exports.SignalDetailsPage = ee_signals_components_signalDetailsPage.SignalDetailsPage;
15
14
  exports.SignalTraceDetailsPanel = ee_signals_components_signalDetailsPage.SignalTraceDetailsPanel;
16
15
  exports.SignalTraceListTab = ee_signals_components_signalDetailsPage.SignalTraceListTab;
@@ -1 +1 @@
1
- {"version":3,"file":"components.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"components.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;"}
@@ -1,4 +1,4 @@
1
- export { SignalChartTab, SignalClusterSidebar, SignalClusterTabs, SignalDetailsPage, SignalTraceDetailsPanel, SignalTraceListTab } from './components/signal-details-page.es.js';
1
+ export { SignalClusterSidebar, SignalClusterTraceList, SignalDetailsPage, SignalTraceDetailsPanel, SignalTraceListTab } from './components/signal-details-page.es.js';
2
2
  export { SignalsEntityFilter } from './components/signals-entity-filter.es.js';
3
3
  export { SignalClusterCard, SignalSection, SignalsOverviewPage } from './components/signals-overview-page.es.js';
4
4
  //# sourceMappingURL=components.es.js.map
@@ -67,22 +67,6 @@ function useEntityTopicExamples(entityId, topicId, params) {
67
67
  retry: false
68
68
  });
69
69
  }
70
- function useEntityPoints(entityId, params) {
71
- const { service } = ee_signals_hooks_useEntityLearningConfig.useEntityLearningConfig();
72
- return reactQuery.useQuery({
73
- queryKey: [
74
- KEY,
75
- "points",
76
- entityId,
77
- params?.signalName,
78
- params?.runId,
79
- params?.includeOutliers ?? null,
80
- params?.limit ?? null
81
- ],
82
- queryFn: service && entityId && params?.signalName && params?.runId ? () => service.getEntityPoints(entityId, params) : reactQuery.skipToken,
83
- retry: false
84
- });
85
- }
86
70
  function useEntityOutliers(entityId, signalName, runId) {
87
71
  const { service } = ee_signals_hooks_useEntityLearningConfig.useEntityLearningConfig();
88
72
  return reactQuery.useQuery({
@@ -104,7 +88,6 @@ exports.useEntities = useEntities;
104
88
  exports.useEntityLearning = useEntityLearning;
105
89
  exports.useEntityOutlierExamples = useEntityOutlierExamples;
106
90
  exports.useEntityOutliers = useEntityOutliers;
107
- exports.useEntityPoints = useEntityPoints;
108
91
  exports.useEntityRun = useEntityRun;
109
92
  exports.useEntityRuns = useEntityRuns;
110
93
  exports.useEntityTopic = useEntityTopic;
@@ -1 +1 @@
1
- {"version":3,"file":"use-entity-learning.cjs.js","sources":["../../../../src/ee/signals/hooks/use-entity-learning.ts"],"sourcesContent":["import { skipToken, useQuery } from '@tanstack/react-query';\nimport type {\n EntityLearningPointsParams,\n EntityLearningTopicExamplesParams,\n EntityLearningOutlierExamplesParams,\n} from '../services';\nimport { useEntityLearningConfig } from './use-entity-learning-config';\n\nconst KEY = 'entity-learning';\n\n/** GET /entity-learning/entities */\nexport function useEntities() {\n const { service, isConfigured } = useEntityLearningConfig();\n\n return useQuery({\n queryKey: [KEY, 'entities'],\n queryFn: isConfigured && service ? () => service.getEntities() : skipToken,\n select: data => data.entities,\n retry: false,\n });\n}\n\n/** GET /entity-learning/entities/:entityId/runs?signalName= */\nexport function useEntityRuns(entityId: string | undefined, signalName: string | undefined) {\n const { service } = useEntityLearningConfig();\n\n return useQuery({\n queryKey: [KEY, 'runs', entityId, signalName],\n queryFn: service && entityId && signalName ? () => service.getEntityRuns(entityId, signalName) : skipToken,\n select: data => data.runs,\n retry: false,\n });\n}\n\n/** GET /entity-learning/entities/:entityId/runs/:runId?signalName= */\nexport function useEntityRun(entityId: string | undefined, runId: string | undefined, signalName: string | undefined) {\n const { service } = useEntityLearningConfig();\n\n return useQuery({\n queryKey: [KEY, 'run', entityId, runId, signalName],\n queryFn:\n service && entityId && runId && signalName ? () => service.getEntityRun(entityId, runId, signalName) : skipToken,\n select: data => data.run,\n retry: false,\n });\n}\n\n/** GET /entity-learning/entities/:entityId/learning?signalName=&runId? */\nexport function useEntityLearning(entityId: string | undefined, signalName: string | undefined, runId?: string) {\n const { service } = useEntityLearningConfig();\n\n return useQuery({\n queryKey: [KEY, 'learning', entityId, signalName, runId ?? null],\n queryFn:\n service && entityId && signalName ? () => service.getEntityLearning(entityId, signalName, runId) : skipToken,\n select: data => data.learning,\n retry: false,\n });\n}\n\n/**\n * GET /entity-learning/entities/:entityId/topics?signalName=&runId? — the clusters.\n * Omit `runId` to let the API resolve the latest run for that signal — an\n * entity-level `latestRunId` belongs to a single signal and must not be\n * reused across signals.\n */\nexport function useEntityTopics(entityId: string | undefined, signalName: string | undefined, runId?: string) {\n const { service } = useEntityLearningConfig();\n\n return useQuery({\n queryKey: [KEY, 'topics', entityId, signalName, runId ?? 'latest'],\n queryFn: service && entityId && signalName ? () => service.getEntityTopics(entityId, signalName, runId) : skipToken,\n retry: false,\n });\n}\n\n/** GET /entity-learning/entities/:entityId/topics/:topicId?signalName=&runId= */\nexport function useEntityTopic(\n entityId: string | undefined,\n topicId: string | undefined,\n signalName: string | undefined,\n runId: string | undefined,\n) {\n const { service } = useEntityLearningConfig();\n\n return useQuery({\n queryKey: [KEY, 'topic', entityId, topicId, signalName, runId],\n queryFn:\n service && entityId && topicId && signalName && runId\n ? () => service.getEntityTopic(entityId, topicId, signalName, runId)\n : skipToken,\n select: data => data.topic,\n retry: false,\n });\n}\n\n/** GET /entity-learning/entities/:entityId/topics/:topicId/examples?signalName=&runId=&limit= */\nexport function useEntityTopicExamples(\n entityId: string | undefined,\n topicId: string | undefined,\n params: EntityLearningTopicExamplesParams | undefined,\n) {\n const { service } = useEntityLearningConfig();\n\n return useQuery({\n queryKey: [KEY, 'topic-examples', entityId, topicId, params?.signalName, params?.runId, params?.limit ?? null],\n queryFn:\n service && entityId && topicId && params?.signalName && params?.runId\n ? () => service.getEntityTopicExamples(entityId, topicId, params)\n : skipToken,\n retry: false,\n });\n}\n\n/** GET /entity-learning/entities/:entityId/points?signalName=&runId=&includeOutliers=&limit= */\nexport function useEntityPoints(entityId: string | undefined, params: EntityLearningPointsParams | undefined) {\n const { service } = useEntityLearningConfig();\n\n return useQuery({\n queryKey: [\n KEY,\n 'points',\n entityId,\n params?.signalName,\n params?.runId,\n params?.includeOutliers ?? null,\n params?.limit ?? null,\n ],\n queryFn:\n service && entityId && params?.signalName && params?.runId\n ? () => service.getEntityPoints(entityId, params)\n : skipToken,\n retry: false,\n });\n}\n\n/** GET /entity-learning/entities/:entityId/outliers?signalName=&runId= */\nexport function useEntityOutliers(\n entityId: string | undefined,\n signalName: string | undefined,\n runId: string | undefined,\n) {\n const { service } = useEntityLearningConfig();\n\n return useQuery({\n queryKey: [KEY, 'outliers', entityId, signalName, runId],\n queryFn:\n service && entityId && signalName && runId\n ? () => service.getEntityOutliers(entityId, signalName, runId)\n : skipToken,\n retry: false,\n });\n}\n\n/** GET /entity-learning/entities/:entityId/outliers/examples?signalName=&runId=&limit= */\nexport function useEntityOutlierExamples(\n entityId: string | undefined,\n params: EntityLearningOutlierExamplesParams | undefined,\n) {\n const { service } = useEntityLearningConfig();\n\n return useQuery({\n queryKey: [KEY, 'outlier-examples', entityId, params?.signalName, params?.runId, params?.limit ?? null],\n queryFn:\n service && entityId && params?.signalName && params?.runId\n ? () => service.getEntityOutlierExamples(entityId, params)\n : skipToken,\n retry: false,\n });\n}\n"],"names":["useEntityLearningConfig","useQuery","skipToken"],"mappings":"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"}
1
+ {"version":3,"file":"use-entity-learning.cjs.js","sources":["../../../../src/ee/signals/hooks/use-entity-learning.ts"],"sourcesContent":["import { skipToken, useQuery } from '@tanstack/react-query';\nimport type { EntityLearningTopicExamplesParams, EntityLearningOutlierExamplesParams } from '../services';\nimport { useEntityLearningConfig } from './use-entity-learning-config';\n\nconst KEY = 'entity-learning';\n\n/** GET /entity-learning/entities */\nexport function useEntities() {\n const { service, isConfigured } = useEntityLearningConfig();\n\n return useQuery({\n queryKey: [KEY, 'entities'],\n queryFn: isConfigured && service ? () => service.getEntities() : skipToken,\n select: data => data.entities,\n retry: false,\n });\n}\n\n/** GET /entity-learning/entities/:entityId/runs?signalName= */\nexport function useEntityRuns(entityId: string | undefined, signalName: string | undefined) {\n const { service } = useEntityLearningConfig();\n\n return useQuery({\n queryKey: [KEY, 'runs', entityId, signalName],\n queryFn: service && entityId && signalName ? () => service.getEntityRuns(entityId, signalName) : skipToken,\n select: data => data.runs,\n retry: false,\n });\n}\n\n/** GET /entity-learning/entities/:entityId/runs/:runId?signalName= */\nexport function useEntityRun(entityId: string | undefined, runId: string | undefined, signalName: string | undefined) {\n const { service } = useEntityLearningConfig();\n\n return useQuery({\n queryKey: [KEY, 'run', entityId, runId, signalName],\n queryFn:\n service && entityId && runId && signalName ? () => service.getEntityRun(entityId, runId, signalName) : skipToken,\n select: data => data.run,\n retry: false,\n });\n}\n\n/** GET /entity-learning/entities/:entityId/learning?signalName=&runId? */\nexport function useEntityLearning(entityId: string | undefined, signalName: string | undefined, runId?: string) {\n const { service } = useEntityLearningConfig();\n\n return useQuery({\n queryKey: [KEY, 'learning', entityId, signalName, runId ?? null],\n queryFn:\n service && entityId && signalName ? () => service.getEntityLearning(entityId, signalName, runId) : skipToken,\n select: data => data.learning,\n retry: false,\n });\n}\n\n/**\n * GET /entity-learning/entities/:entityId/topics?signalName=&runId? — the clusters.\n * Omit `runId` to let the API resolve the latest run for that signal — an\n * entity-level `latestRunId` belongs to a single signal and must not be\n * reused across signals.\n */\nexport function useEntityTopics(entityId: string | undefined, signalName: string | undefined, runId?: string) {\n const { service } = useEntityLearningConfig();\n\n return useQuery({\n queryKey: [KEY, 'topics', entityId, signalName, runId ?? 'latest'],\n queryFn: service && entityId && signalName ? () => service.getEntityTopics(entityId, signalName, runId) : skipToken,\n retry: false,\n });\n}\n\n/** GET /entity-learning/entities/:entityId/topics/:topicId?signalName=&runId= */\nexport function useEntityTopic(\n entityId: string | undefined,\n topicId: string | undefined,\n signalName: string | undefined,\n runId: string | undefined,\n) {\n const { service } = useEntityLearningConfig();\n\n return useQuery({\n queryKey: [KEY, 'topic', entityId, topicId, signalName, runId],\n queryFn:\n service && entityId && topicId && signalName && runId\n ? () => service.getEntityTopic(entityId, topicId, signalName, runId)\n : skipToken,\n select: data => data.topic,\n retry: false,\n });\n}\n\n/** GET /entity-learning/entities/:entityId/topics/:topicId/examples?signalName=&runId=&limit= */\nexport function useEntityTopicExamples(\n entityId: string | undefined,\n topicId: string | undefined,\n params: EntityLearningTopicExamplesParams | undefined,\n) {\n const { service } = useEntityLearningConfig();\n\n return useQuery({\n queryKey: [KEY, 'topic-examples', entityId, topicId, params?.signalName, params?.runId, params?.limit ?? null],\n queryFn:\n service && entityId && topicId && params?.signalName && params?.runId\n ? () => service.getEntityTopicExamples(entityId, topicId, params)\n : skipToken,\n retry: false,\n });\n}\n\n/** GET /entity-learning/entities/:entityId/outliers?signalName=&runId= */\nexport function useEntityOutliers(\n entityId: string | undefined,\n signalName: string | undefined,\n runId: string | undefined,\n) {\n const { service } = useEntityLearningConfig();\n\n return useQuery({\n queryKey: [KEY, 'outliers', entityId, signalName, runId],\n queryFn:\n service && entityId && signalName && runId\n ? () => service.getEntityOutliers(entityId, signalName, runId)\n : skipToken,\n retry: false,\n });\n}\n\n/** GET /entity-learning/entities/:entityId/outliers/examples?signalName=&runId=&limit= */\nexport function useEntityOutlierExamples(\n entityId: string | undefined,\n params: EntityLearningOutlierExamplesParams | undefined,\n) {\n const { service } = useEntityLearningConfig();\n\n return useQuery({\n queryKey: [KEY, 'outlier-examples', entityId, params?.signalName, params?.runId, params?.limit ?? null],\n queryFn:\n service && entityId && params?.signalName && params?.runId\n ? () => service.getEntityOutlierExamples(entityId, params)\n : skipToken,\n retry: false,\n });\n}\n"],"names":["useEntityLearningConfig","useQuery","skipToken"],"mappings":"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"}
@@ -63,22 +63,6 @@ function useEntityTopicExamples(entityId, topicId, params) {
63
63
  retry: false
64
64
  });
65
65
  }
66
- function useEntityPoints(entityId, params) {
67
- const { service } = useEntityLearningConfig();
68
- return useQuery({
69
- queryKey: [
70
- KEY,
71
- "points",
72
- entityId,
73
- params?.signalName,
74
- params?.runId,
75
- params?.includeOutliers ?? null,
76
- params?.limit ?? null
77
- ],
78
- queryFn: service && entityId && params?.signalName && params?.runId ? () => service.getEntityPoints(entityId, params) : skipToken,
79
- retry: false
80
- });
81
- }
82
66
  function useEntityOutliers(entityId, signalName, runId) {
83
67
  const { service } = useEntityLearningConfig();
84
68
  return useQuery({
@@ -96,5 +80,5 @@ function useEntityOutlierExamples(entityId, params) {
96
80
  });
97
81
  }
98
82
 
99
- export { useEntities, useEntityLearning, useEntityOutlierExamples, useEntityOutliers, useEntityPoints, useEntityRun, useEntityRuns, useEntityTopic, useEntityTopicExamples, useEntityTopics };
83
+ export { useEntities, useEntityLearning, useEntityOutlierExamples, useEntityOutliers, useEntityRun, useEntityRuns, useEntityTopic, useEntityTopicExamples, useEntityTopics };
100
84
  //# sourceMappingURL=use-entity-learning.es.js.map