@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.
- package/CHANGELOG.md +20 -0
- package/dist/components/ScatterPlotChart.cjs.js +163 -6
- package/dist/components/ScatterPlotChart.cjs.js.map +1 -1
- package/dist/components/ScatterPlotChart.es.js +162 -1
- package/dist/components/ScatterPlotChart.es.js.map +1 -1
- package/dist/ee/signals/components/signal-details-page.cjs.js +66 -157
- package/dist/ee/signals/components/signal-details-page.cjs.js.map +1 -1
- package/dist/ee/signals/components/signal-details-page.es.js +68 -158
- package/dist/ee/signals/components/signal-details-page.es.js.map +1 -1
- package/dist/ee/signals/components.cjs.js +1 -2
- package/dist/ee/signals/components.cjs.js.map +1 -1
- package/dist/ee/signals/components.es.js +1 -1
- package/dist/ee/signals/hooks/use-entity-learning.cjs.js +0 -17
- package/dist/ee/signals/hooks/use-entity-learning.cjs.js.map +1 -1
- package/dist/ee/signals/hooks/use-entity-learning.es.js +1 -17
- package/dist/ee/signals/hooks/use-entity-learning.es.js.map +1 -1
- package/dist/ee/signals/hooks.cjs.js +0 -1
- package/dist/ee/signals/hooks.cjs.js.map +1 -1
- package/dist/ee/signals/hooks.es.js +1 -1
- package/dist/ee/signals/services/entity-learning-service.cjs.js +0 -10
- package/dist/ee/signals/services/entity-learning-service.cjs.js.map +1 -1
- package/dist/ee/signals/services/entity-learning-service.es.js +0 -10
- package/dist/ee/signals/services/entity-learning-service.es.js.map +1 -1
- package/dist/ee/signals.cjs.js +1 -3
- package/dist/ee/signals.cjs.js.map +1 -1
- package/dist/ee/signals.es.js +2 -2
- package/dist/src/ee/signals/components/signal-details-page.d.ts +3 -16
- package/dist/src/ee/signals/hooks/use-entity-learning.d.ts +1 -3
- package/dist/src/ee/signals/services/entity-learning-service.d.ts +1 -8
- package/dist/src/ee/signals/services/entity-learning-types.d.ts +0 -13
- package/package.json +6 -6
- package/dist/scatter-plot-chart-B3hfFMKS.js +0 -163
- package/dist/scatter-plot-chart-B3hfFMKS.js.map +0 -1
- package/dist/scatter-plot-chart-CFZO31md.cjs +0 -169
- package/dist/scatter-plot-chart-CFZO31md.cjs.map +0 -1
|
@@ -1,17 +1,14 @@
|
|
|
1
|
-
import {
|
|
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
|
|
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(
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
"
|
|
143
|
-
|
|
144
|
-
|
|
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
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
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
|
|
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
|
-
|
|
230
|
-
{
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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 {
|
|
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.
|
|
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 {
|
|
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,
|
|
83
|
+
export { useEntities, useEntityLearning, useEntityOutlierExamples, useEntityOutliers, useEntityRun, useEntityRuns, useEntityTopic, useEntityTopicExamples, useEntityTopics };
|
|
100
84
|
//# sourceMappingURL=use-entity-learning.es.js.map
|