@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
|
@@ -8,10 +8,7 @@ const React = require('react');
|
|
|
8
8
|
const Button = require('../../../Button-66ghjQV8.cjs');
|
|
9
9
|
const dataList = require('../../../data-list-DDQRmA6L.cjs');
|
|
10
10
|
const inputGroup = require('../../../input-group-CF6DB97L.cjs');
|
|
11
|
-
const scatterPlotChart = require('../../../scatter-plot-chart-CFZO31md.cjs');
|
|
12
11
|
const skeleton = require('../../../skeleton-D5zq7rhk.cjs');
|
|
13
|
-
const tabsTab = require('../../../tabs-tab-DkeS2Iv0.cjs');
|
|
14
|
-
const tabsContent = require('../../../tabs-content-ohtjaVdC.cjs');
|
|
15
12
|
const utils_cn = require('../../../cn-vA5sWo9W.cjs');
|
|
16
13
|
const ee_topics_components_topicsLayout = require('../../topics/components/topics-layout.cjs.js');
|
|
17
14
|
const ee_topics_components_topicTraceDetailsPanel = require('../../topics/components/topic-trace-details-panel.cjs.js');
|
|
@@ -107,10 +104,6 @@ function SignalDetailsSkeleton() {
|
|
|
107
104
|
/* @__PURE__ */ jsxRuntime.jsx(skeleton.Skeleton, { className: "h-7 w-48" }),
|
|
108
105
|
/* @__PURE__ */ jsxRuntime.jsx(skeleton.Skeleton, { className: "h-4 w-64" })
|
|
109
106
|
] }),
|
|
110
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-6 border-b border-border1/60", children: [
|
|
111
|
-
/* @__PURE__ */ jsxRuntime.jsx(skeleton.Skeleton, { className: "mb-2 h-5 w-20" }),
|
|
112
|
-
/* @__PURE__ */ jsxRuntime.jsx(skeleton.Skeleton, { className: "mb-2 h-5 w-16" })
|
|
113
|
-
] }),
|
|
114
107
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-h-0 flex-1 gap-6 overflow-hidden", children: [
|
|
115
108
|
/* @__PURE__ */ jsxRuntime.jsx(SignalClusterSidebarSkeleton, {}),
|
|
116
109
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1 space-y-4 py-4", children: [
|
|
@@ -136,135 +129,79 @@ function SignalTraceListTab({
|
|
|
136
129
|
}, [examples, search]);
|
|
137
130
|
const visible = React.useMemo(() => filtered.slice(0, page * pageSize), [filtered, page, pageSize]);
|
|
138
131
|
const hasMore = visible.length < filtered.length;
|
|
139
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
"
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
setSearch(event.target.value);
|
|
150
|
-
setPage(1);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
)
|
|
154
|
-
] }),
|
|
155
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
156
|
-
dataList.DataList,
|
|
157
|
-
{
|
|
158
|
-
columns: "minmax(12rem,1fr)",
|
|
159
|
-
className: "min-h-0 flex-1 overflow-hidden rounded-lg border border-border1/60",
|
|
160
|
-
children: [
|
|
161
|
-
/* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.Top, { children: /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.TopCells, { children: /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.TopCell, { children: "Trace summary" }) }) }),
|
|
162
|
-
loading ? /* @__PURE__ */ jsxRuntime.jsx(SignalTraceListSkeleton, {}) : visible.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NoMatch, { message: "No traces match this subtopic." }) : visible.map((example) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
163
|
-
dataList.DataList.RowButton,
|
|
132
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
133
|
+
"section",
|
|
134
|
+
{
|
|
135
|
+
className: "grid grid-rows-[auto_1fr] min-h-0 gap-4 h-full overflow-y-auto",
|
|
136
|
+
"aria-label": "Topic trace summaries",
|
|
137
|
+
children: [
|
|
138
|
+
/* @__PURE__ */ jsxRuntime.jsxs(inputGroup.InputGroup, { variant: "outline", children: [
|
|
139
|
+
/* @__PURE__ */ jsxRuntime.jsx(inputGroup.InputGroupAddon, { align: "inline-start", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SearchIcon, {}) }),
|
|
140
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
141
|
+
inputGroup.InputGroupInput,
|
|
164
142
|
{
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
143
|
+
type: "search",
|
|
144
|
+
"aria-label": "Search traces",
|
|
145
|
+
placeholder: "Search traces",
|
|
146
|
+
onChange: (event) => {
|
|
147
|
+
setSearch(event.target.value);
|
|
148
|
+
setPage(1);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
)
|
|
152
|
+
] }),
|
|
153
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
154
|
+
dataList.DataList,
|
|
155
|
+
{
|
|
156
|
+
columns: "minmax(12rem,1fr)",
|
|
157
|
+
className: "min-h-0 h-full overflow-y-auto rounded-lg border border-border1/60",
|
|
158
|
+
children: [
|
|
159
|
+
/* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.Top, { children: /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.TopCells, { children: /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.TopCell, { children: "Trace summary" }) }) }),
|
|
160
|
+
loading ? /* @__PURE__ */ jsxRuntime.jsx(SignalTraceListSkeleton, {}) : visible.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NoMatch, { message: "No traces match this subtopic." }) : visible.map((example) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
161
|
+
dataList.DataList.RowButton,
|
|
162
|
+
{
|
|
163
|
+
featured: selectedTraceId === example.traceId,
|
|
164
|
+
onClick: () => onTraceSelect(example.traceId),
|
|
165
|
+
"aria-pressed": selectedTraceId === example.traceId,
|
|
166
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.TextCell, { children: example.signalText })
|
|
167
|
+
},
|
|
168
|
+
example.exampleId
|
|
169
|
+
))
|
|
170
|
+
]
|
|
171
|
+
}
|
|
172
|
+
),
|
|
173
|
+
hasMore && !loading ? /* @__PURE__ */ jsxRuntime.jsxs(Button.Button, { variant: "outline", size: "sm", onClick: () => setPage((currentPage) => currentPage + 1), children: [
|
|
174
|
+
"Load more traces (",
|
|
175
|
+
visible.length,
|
|
176
|
+
" of ",
|
|
177
|
+
filtered.length,
|
|
178
|
+
")"
|
|
179
|
+
] }) : null
|
|
180
|
+
]
|
|
181
|
+
}
|
|
190
182
|
);
|
|
191
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full min-w-0 gap-6", children: [
|
|
192
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
193
|
-
SignalClusterSidebar,
|
|
194
|
-
{
|
|
195
|
-
topics,
|
|
196
|
-
selectedTopicIds,
|
|
197
|
-
onTopicSelect: onTopicToggle,
|
|
198
|
-
multiple: true,
|
|
199
|
-
ariaLabel: "Chart cluster filters"
|
|
200
|
-
}
|
|
201
|
-
),
|
|
202
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 min-w-0 flex-1 py-4", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
203
|
-
scatterPlotChart.ScatterPlotChart,
|
|
204
|
-
{
|
|
205
|
-
data: chartData,
|
|
206
|
-
xKey: "x",
|
|
207
|
-
yKey: "y",
|
|
208
|
-
nameKey: "topicId",
|
|
209
|
-
colorKey: "color",
|
|
210
|
-
height: "100%",
|
|
211
|
-
className: "h-full",
|
|
212
|
-
xLabel: "X",
|
|
213
|
-
yLabel: "Y"
|
|
214
|
-
}
|
|
215
|
-
) })
|
|
216
|
-
] });
|
|
217
183
|
}
|
|
218
|
-
function
|
|
184
|
+
function SignalClusterTraceList({
|
|
219
185
|
topics,
|
|
220
186
|
examples,
|
|
221
187
|
examplesLoading,
|
|
222
|
-
points,
|
|
223
188
|
selectedTopicId,
|
|
224
189
|
selectedTraceId,
|
|
225
|
-
selectedChartTopicIds,
|
|
226
|
-
activeTab,
|
|
227
|
-
onActiveTabChange,
|
|
228
190
|
onTopicSelect,
|
|
229
|
-
onChartTopicToggle,
|
|
230
191
|
onTraceSelect
|
|
231
192
|
}) {
|
|
232
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
233
|
-
|
|
234
|
-
{
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
/* @__PURE__ */ jsxRuntime.jsx(tabsContent.TabContent, { value: "trace-list", className: "min-h-0 flex-1 overflow-hidden py-0", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full min-w-0 gap-6", children: [
|
|
245
|
-
/* @__PURE__ */ jsxRuntime.jsx(SignalClusterSidebar, { topics, selectedTopicIds: [selectedTopicId], onTopicSelect }),
|
|
246
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 flex-1 overflow-hidden py-4", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
247
|
-
SignalTraceListTab,
|
|
248
|
-
{
|
|
249
|
-
examples,
|
|
250
|
-
loading: examplesLoading,
|
|
251
|
-
selectedTraceId,
|
|
252
|
-
onTraceSelect
|
|
253
|
-
}
|
|
254
|
-
) })
|
|
255
|
-
] }) }),
|
|
256
|
-
/* @__PURE__ */ jsxRuntime.jsx(tabsContent.TabContent, { value: "chart", className: "min-h-0 flex-1 overflow-hidden py-0", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
257
|
-
SignalChartTab,
|
|
258
|
-
{
|
|
259
|
-
topics,
|
|
260
|
-
points,
|
|
261
|
-
selectedTopicIds: selectedChartTopicIds,
|
|
262
|
-
onTopicToggle: onChartTopicToggle
|
|
263
|
-
}
|
|
264
|
-
) })
|
|
265
|
-
]
|
|
266
|
-
}
|
|
267
|
-
);
|
|
193
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full min-w-0 gap-6 overflow-y-auto", children: [
|
|
194
|
+
/* @__PURE__ */ jsxRuntime.jsx(SignalClusterSidebar, { topics, selectedTopicIds: [selectedTopicId], onTopicSelect }),
|
|
195
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 flex-1 overflow-y-auto h-full py-4", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
196
|
+
SignalTraceListTab,
|
|
197
|
+
{
|
|
198
|
+
examples,
|
|
199
|
+
loading: examplesLoading,
|
|
200
|
+
selectedTraceId,
|
|
201
|
+
onTraceSelect
|
|
202
|
+
}
|
|
203
|
+
) })
|
|
204
|
+
] });
|
|
268
205
|
}
|
|
269
206
|
function SignalDetailsPage({
|
|
270
207
|
signalId,
|
|
@@ -284,24 +221,16 @@ function SignalDetailsPage({
|
|
|
284
221
|
const topics = React.useMemo(() => topicsData?.topics ?? [], [topicsData?.topics]);
|
|
285
222
|
const runId = topicsData?.run?.runId;
|
|
286
223
|
const topicSelectionScope = `${signalId ?? ""}:${entity?.entityId ?? ""}:${runId ?? ""}:${initialTopicId ?? ""}`;
|
|
287
|
-
const chartSelectionScope = `${signalId ?? ""}:${entity?.entityId ?? ""}:${runId ?? ""}`;
|
|
288
224
|
const topicIds = React.useMemo(() => topics.map((topic) => topic.topicId), [topics]);
|
|
289
225
|
const topicIdSet = React.useMemo(() => new Set(topicIds), [topicIds]);
|
|
290
226
|
const [selectedTopic, setSelectedTopic] = React.useState(() => ({
|
|
291
227
|
scope: topicSelectionScope,
|
|
292
228
|
topicId: initialTopicId ?? null
|
|
293
229
|
}));
|
|
294
|
-
const [selectedChartTopics, setSelectedChartTopics] = React.useState(() => ({
|
|
295
|
-
scope: chartSelectionScope,
|
|
296
|
-
topicIds: null
|
|
297
|
-
}));
|
|
298
|
-
const [activeTab, setActiveTab] = React.useState("trace-list");
|
|
299
230
|
const requestedTopicId = selectedTopic.scope === topicSelectionScope ? selectedTopic.topicId : initialTopicId ?? null;
|
|
300
231
|
const resolvedTopicId = requestedTopicId && topicIdSet.has(requestedTopicId) ? requestedTopicId : topics[0]?.topicId;
|
|
301
232
|
const selectedTopicData = topics.find((topic) => topic.topicId === resolvedTopicId);
|
|
302
233
|
const examplesEnabled = Boolean(resolvedEntity?.entityId && signalId && runId && selectedTopicData);
|
|
303
|
-
const pointsEnabled = Boolean(resolvedEntity?.entityId && signalId && runId);
|
|
304
|
-
const chartTopicIds = selectedChartTopics.scope === chartSelectionScope && selectedChartTopics.topicIds ? selectedChartTopics.topicIds.filter((topicId) => topicIdSet.has(topicId)) : topicIds;
|
|
305
234
|
const {
|
|
306
235
|
data: examplesData,
|
|
307
236
|
isLoading: examplesLoading,
|
|
@@ -314,11 +243,6 @@ function SignalDetailsPage({
|
|
|
314
243
|
);
|
|
315
244
|
const examples = examplesData?.examples ?? [];
|
|
316
245
|
const examplesPending = examplesLoading || examplesFetching && examplesData === void 0;
|
|
317
|
-
const { data: pointsData, isError: pointsError } = ee_signals_hooks_useEntityLearning.useEntityPoints(
|
|
318
|
-
resolvedEntity?.entityId,
|
|
319
|
-
pointsEnabled && runId && signalId ? { signalName: signalId, runId, includeOutliers: true } : void 0
|
|
320
|
-
);
|
|
321
|
-
const points = pointsData?.points ?? [];
|
|
322
246
|
const handleTraceSelect = (traceId) => {
|
|
323
247
|
if (!signalId) return;
|
|
324
248
|
onTraceSelect(signalId, traceId);
|
|
@@ -326,53 +250,38 @@ function SignalDetailsPage({
|
|
|
326
250
|
const handleTopicSelect = (topicId) => {
|
|
327
251
|
setSelectedTopic({ scope: topicSelectionScope, topicId });
|
|
328
252
|
};
|
|
329
|
-
const handleChartTopicToggle = (topicId) => {
|
|
330
|
-
setSelectedChartTopics((current) => {
|
|
331
|
-
const base = current.scope === chartSelectionScope && current.topicIds ? current.topicIds : topicIds;
|
|
332
|
-
return {
|
|
333
|
-
scope: chartSelectionScope,
|
|
334
|
-
topicIds: base.includes(topicId) ? base.filter((id) => id !== topicId) : [...base, topicId]
|
|
335
|
-
};
|
|
336
|
-
});
|
|
337
|
-
};
|
|
338
253
|
if (entitiesLoading || topicsLoading) {
|
|
339
254
|
return /* @__PURE__ */ jsxRuntime.jsx(SignalsLayout, { sidebar: null, children: /* @__PURE__ */ jsxRuntime.jsx(SignalDetailsSkeleton, {}) });
|
|
340
255
|
}
|
|
341
|
-
if (entitiesError || topicsError || examplesEnabled && examplesError
|
|
256
|
+
if (entitiesError || topicsError || examplesEnabled && examplesError) {
|
|
342
257
|
return /* @__PURE__ */ jsxRuntime.jsx(SignalsLayout, { sidebar: null, children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-ui-md text-accent2", children: "Failed to load this signal from the observability endpoint." }) });
|
|
343
258
|
}
|
|
344
259
|
if (!resolvedEntity || !selectedTopicData) {
|
|
345
260
|
return /* @__PURE__ */ jsxRuntime.jsx(SignalsLayout, { sidebar: null, children: "Signal not found" });
|
|
346
261
|
}
|
|
347
262
|
const signalName = ee_signals_signalsData.getSignalCatalogEntry(signalId ?? "").name;
|
|
348
|
-
return /* @__PURE__ */ jsxRuntime.jsx(SignalsLayout, { sidebar: null, tracePanel
|
|
263
|
+
return /* @__PURE__ */ jsxRuntime.jsx(SignalsLayout, { sidebar: null, tracePanel, children: /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "flex h-full min-w-0 flex-col gap-4", children: [
|
|
349
264
|
/* @__PURE__ */ jsxRuntime.jsxs("header", { className: "space-y-1", children: [
|
|
350
265
|
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-icon-xl font-semibold text-neutral6", children: signalName }),
|
|
351
266
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-ui-sm text-neutral3", children: "Explore trace patterns by cluster." })
|
|
352
267
|
] }),
|
|
353
268
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 flex-1 overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
354
|
-
|
|
269
|
+
SignalClusterTraceList,
|
|
355
270
|
{
|
|
356
271
|
topics,
|
|
357
272
|
examples,
|
|
358
273
|
examplesLoading: examplesPending,
|
|
359
|
-
points,
|
|
360
274
|
selectedTopicId: selectedTopicData.topicId,
|
|
361
275
|
selectedTraceId,
|
|
362
|
-
selectedChartTopicIds: chartTopicIds,
|
|
363
|
-
activeTab,
|
|
364
|
-
onActiveTabChange: setActiveTab,
|
|
365
276
|
onTopicSelect: handleTopicSelect,
|
|
366
|
-
onChartTopicToggle: handleChartTopicToggle,
|
|
367
277
|
onTraceSelect: handleTraceSelect
|
|
368
278
|
}
|
|
369
279
|
) })
|
|
370
280
|
] }) });
|
|
371
281
|
}
|
|
372
282
|
|
|
373
|
-
exports.SignalChartTab = SignalChartTab;
|
|
374
283
|
exports.SignalClusterSidebar = SignalClusterSidebar;
|
|
375
|
-
exports.
|
|
284
|
+
exports.SignalClusterTraceList = SignalClusterTraceList;
|
|
376
285
|
exports.SignalDetailsPage = SignalDetailsPage;
|
|
377
286
|
exports.SignalTraceDetailsPanel = SignalTraceDetailsPanel;
|
|
378
287
|
exports.SignalTraceListTab = SignalTraceListTab;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signal-details-page.cjs.js","sources":["../../../../src/ee/signals/components/signal-details-page.tsx"],"sourcesContent":["import { SearchIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { Button } from '../../../ds/components/Button';\nimport { DataList } from '../../../ds/components/DataList/data-list';\nimport { InputGroup, InputGroupAddon, InputGroupInput } from '../../../ds/components/InputGroup';\nimport { ScatterPlotChart } from '../../../ds/components/ScatterPlotChart';\nimport { Skeleton } from '../../../ds/components/Skeleton';\nimport { Tab, TabContent, TabList, Tabs } from '../../../ds/components/Tabs';\nimport { cn } from '../../../lib/utils';\nimport { TopicTraceDetailsPanel, TopicsLayout } from '../../topics';\nimport { useEntities, useEntityPoints, useEntityTopicExamples, useEntityTopics } from '../hooks';\nimport type { EntityLearningPoint, EntityLearningTopic, EntityLearningTopicExample } from '../services';\nimport { getSignalCatalogEntry } from '../signals-data';\nimport type { SelectedEntity } from '../types';\n\nexport const SignalTraceDetailsPanel = TopicTraceDetailsPanel;\nconst SignalsLayout = TopicsLayout;\n\ntype SignalTab = 'trace-list' | 'chart';\n\nfunction clusterColor(topicId: string) {\n let hash = 0;\n for (let i = 0; i < topicId.length; i++) {\n hash = topicId.charCodeAt(i) + ((hash << 5) - hash);\n hash = hash & hash;\n }\n // Multiply by the golden-angle so close ids (e.g. \"1\",\"2\",\"3\") map to well-separated hues.\n const hue = Math.abs(hash * 137.508) % 360;\n return `hsl(${hue}, 70%, 55%)`;\n}\n\ninterface SignalClusterSidebarProps {\n topics: EntityLearningTopic[];\n selectedTopicIds: string[];\n onTopicSelect: (topicId: string) => void;\n multiple?: boolean;\n ariaLabel?: string;\n}\n\nexport function SignalClusterSidebar({\n topics,\n selectedTopicIds,\n onTopicSelect,\n multiple = false,\n ariaLabel = 'Signal clusters',\n}: SignalClusterSidebarProps) {\n return (\n <aside\n className=\"min-h-0 w-72 shrink-0 overflow-y-auto border-r border-border1/60 pr-4 py-4\"\n aria-label={ariaLabel}\n >\n <ul className=\"space-y-1\" role={multiple ? 'group' : undefined}>\n {topics.map(topic => {\n const selected = selectedTopicIds.includes(topic.topicId);\n return (\n <li key={topic.topicId}>\n <button\n type=\"button\"\n role={multiple ? 'checkbox' : undefined}\n aria-checked={multiple ? selected : undefined}\n aria-pressed={multiple ? undefined : selected}\n className=\"group cursor-pointer w-full rounded-xl px-3 py-2 text-left transition-colors hover:bg-surface3 aria-pressed:bg-surface3 aria-checked:bg-surface3 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent1\"\n onClick={() => onTopicSelect(topic.topicId)}\n >\n <span className=\"flex items-start gap-2\">\n <span\n className={cn('mt-1.5 h-2 w-2 shrink-0 rounded-full', multiple && !selected && 'invisible')}\n style={{ backgroundColor: clusterColor(topic.topicId) }}\n />\n <span className=\"min-w-0 space-y-1\">\n <span\n className={cn(\n 'block text-sm font-medium',\n multiple && !selected ? 'text-neutral3' : 'text-neutral5',\n )}\n >\n {topic.name}\n </span>\n <span\n className={cn(\n 'line-clamp-2 block text-sm',\n multiple && !selected ? 'text-neutral1' : 'text-neutral2',\n )}\n >\n {topic.description}\n </span>\n </span>\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n </aside>\n );\n}\n\nfunction SignalTraceListSkeleton({ rows = 8 }: { rows?: number }) {\n return (\n <div className=\"space-y-1 px-2 py-1\" aria-label=\"Loading traces\" aria-busy=\"true\">\n {Array.from({ length: rows }).map((_, index) => (\n <Skeleton key={index} className=\"h-9 w-full rounded-lg\" />\n ))}\n </div>\n );\n}\n\nfunction SignalClusterSidebarSkeleton({ rows = 5 }: { rows?: number }) {\n return (\n <aside className=\"min-h-0 w-72 shrink-0 overflow-y-auto border-r border-border1/60 pr-4 py-4\" aria-hidden=\"true\">\n <ul className=\"space-y-1\">\n {Array.from({ length: rows }).map((_, index) => (\n <li key={index} className=\"flex items-start gap-2 px-3 py-2\">\n <Skeleton className=\"mt-1.5 h-2 w-2 shrink-0 rounded-full\" />\n <div className=\"min-w-0 flex-1 space-y-1.5\">\n <Skeleton className=\"h-4 w-1/2\" />\n <Skeleton className=\"h-3 w-full\" />\n </div>\n </li>\n ))}\n </ul>\n </aside>\n );\n}\n\nfunction SignalDetailsSkeleton() {\n return (\n <section className=\"flex h-full min-w-0 flex-col gap-4\" aria-label=\"Loading signal\" aria-busy=\"true\">\n <header className=\"space-y-2\">\n <Skeleton className=\"h-7 w-48\" />\n <Skeleton className=\"h-4 w-64\" />\n </header>\n <div className=\"flex gap-6 border-b border-border1/60\">\n <Skeleton className=\"mb-2 h-5 w-20\" />\n <Skeleton className=\"mb-2 h-5 w-16\" />\n </div>\n <div className=\"flex min-h-0 flex-1 gap-6 overflow-hidden\">\n <SignalClusterSidebarSkeleton />\n <div className=\"min-w-0 flex-1 space-y-4 py-4\">\n <Skeleton className=\"h-9 w-full rounded-lg\" />\n <SignalTraceListSkeleton />\n </div>\n </div>\n </section>\n );\n}\n\nexport function SignalTraceListTab({\n examples,\n selectedTraceId,\n onTraceSelect,\n loading = false,\n pageSize = 25,\n}: {\n examples: EntityLearningTopicExample[];\n selectedTraceId: string | null;\n onTraceSelect: (traceId: string) => void;\n loading?: boolean;\n pageSize?: number;\n}) {\n const [search, setSearch] = useState('');\n const [page, setPage] = useState(1);\n\n const filtered = useMemo(() => {\n const query = search.trim().toLowerCase();\n if (!query) return examples;\n return examples.filter(example => example.signalText.toLowerCase().includes(query));\n }, [examples, search]);\n\n const visible = useMemo(() => filtered.slice(0, page * pageSize), [filtered, page, pageSize]);\n const hasMore = visible.length < filtered.length;\n\n return (\n <section className=\"flex min-h-0 flex-1 flex-col gap-4\" aria-label=\"Topic trace summaries\">\n <InputGroup variant=\"outline\">\n <InputGroupAddon align=\"inline-start\">\n <SearchIcon />\n </InputGroupAddon>\n <InputGroupInput\n type=\"search\"\n aria-label=\"Search traces\"\n placeholder=\"Search traces\"\n onChange={event => {\n setSearch(event.target.value);\n setPage(1);\n }}\n />\n </InputGroup>\n\n <DataList\n columns=\"minmax(12rem,1fr)\"\n className=\"min-h-0 flex-1 overflow-hidden rounded-lg border border-border1/60\"\n >\n <DataList.Top>\n <DataList.TopCells>\n <DataList.TopCell>Trace summary</DataList.TopCell>\n </DataList.TopCells>\n </DataList.Top>\n\n {loading ? (\n <SignalTraceListSkeleton />\n ) : visible.length === 0 ? (\n <DataList.NoMatch message=\"No traces match this subtopic.\" />\n ) : (\n visible.map(example => (\n <DataList.RowButton\n key={example.exampleId}\n featured={selectedTraceId === example.traceId}\n onClick={() => onTraceSelect(example.traceId)}\n aria-pressed={selectedTraceId === example.traceId}\n >\n <DataList.TextCell>{example.signalText}</DataList.TextCell>\n </DataList.RowButton>\n ))\n )}\n </DataList>\n\n {hasMore && !loading ? (\n <Button variant=\"outline\" size=\"sm\" onClick={() => setPage(currentPage => currentPage + 1)}>\n Load more traces ({visible.length} of {filtered.length})\n </Button>\n ) : null}\n </section>\n );\n}\n\ninterface SignalChartTabProps {\n topics: EntityLearningTopic[];\n points: EntityLearningPoint[];\n selectedTopicIds: string[];\n onTopicToggle: (topicId: string) => void;\n}\n\nexport function SignalChartTab({ topics, points, selectedTopicIds, onTopicToggle }: SignalChartTabProps) {\n const chartData = useMemo(\n () =>\n points\n // Only show points belonging to a selected cluster.\n .filter(\n (point): point is EntityLearningPoint & { topicId: string } =>\n point.topicId !== undefined && selectedTopicIds.includes(point.topicId),\n )\n .map(point => ({ ...point, color: clusterColor(point.topicId) })),\n [points, selectedTopicIds],\n );\n\n return (\n <div className=\"flex h-full min-w-0 gap-6\">\n <SignalClusterSidebar\n topics={topics}\n selectedTopicIds={selectedTopicIds}\n onTopicSelect={onTopicToggle}\n multiple\n ariaLabel=\"Chart cluster filters\"\n />\n <div className=\"min-h-0 min-w-0 flex-1 py-4\">\n <ScatterPlotChart\n data={chartData}\n xKey=\"x\"\n yKey=\"y\"\n nameKey=\"topicId\"\n colorKey=\"color\"\n height=\"100%\"\n className=\"h-full\"\n xLabel=\"X\"\n yLabel=\"Y\"\n />\n </div>\n </div>\n );\n}\n\ninterface SignalClusterTabsProps {\n topics: EntityLearningTopic[];\n examples: EntityLearningTopicExample[];\n examplesLoading: boolean;\n points: EntityLearningPoint[];\n selectedTopicId: string;\n selectedTraceId: string | null;\n selectedChartTopicIds: string[];\n activeTab: SignalTab;\n onActiveTabChange: (tab: SignalTab) => void;\n onTopicSelect: (topicId: string) => void;\n onChartTopicToggle: (topicId: string) => void;\n onTraceSelect: (traceId: string) => void;\n}\n\nexport function SignalClusterTabs({\n topics,\n examples,\n examplesLoading,\n points,\n selectedTopicId,\n selectedTraceId,\n selectedChartTopicIds,\n activeTab,\n onActiveTabChange,\n onTopicSelect,\n onChartTopicToggle,\n onTraceSelect,\n}: SignalClusterTabsProps) {\n return (\n <Tabs<SignalTab>\n defaultTab=\"trace-list\"\n value={activeTab}\n onValueChange={onActiveTabChange}\n className=\"flex h-full min-h-0 flex-col overflow-hidden\"\n >\n <TabList variant=\"line\">\n <Tab value=\"trace-list\">Trace list</Tab>\n <Tab value=\"chart\">Chart</Tab>\n </TabList>\n <TabContent value=\"trace-list\" className=\"min-h-0 flex-1 overflow-hidden py-0\">\n <div className=\"flex h-full min-w-0 gap-6\">\n <SignalClusterSidebar topics={topics} selectedTopicIds={[selectedTopicId]} onTopicSelect={onTopicSelect} />\n <div className=\"min-w-0 flex-1 overflow-hidden py-4\">\n <SignalTraceListTab\n examples={examples}\n loading={examplesLoading}\n selectedTraceId={selectedTraceId}\n onTraceSelect={onTraceSelect}\n />\n </div>\n </div>\n </TabContent>\n <TabContent value=\"chart\" className=\"min-h-0 flex-1 overflow-hidden py-0\">\n <SignalChartTab\n topics={topics}\n points={points}\n selectedTopicIds={selectedChartTopicIds}\n onTopicToggle={onChartTopicToggle}\n />\n </TabContent>\n </Tabs>\n );\n}\n\nexport interface SignalDetailsPageProps {\n signalId?: string;\n entity: SelectedEntity | null;\n selectedTraceId: string | null;\n initialTopicId?: string | null;\n tracePanel?: ReactNode;\n onTraceSelect: (signalId: string, traceId: string) => void;\n}\n\nexport function SignalDetailsPage({\n signalId,\n entity,\n selectedTraceId,\n initialTopicId,\n tracePanel,\n onTraceSelect,\n}: SignalDetailsPageProps) {\n const { data: entities = [], isLoading: entitiesLoading, isError: entitiesError } = useEntities();\n const resolvedEntity = entities.find(item => item.entityId === entity?.entityId);\n\n // No runId: the API resolves the latest run for this signal (the entity-wide\n // `latestRunId` belongs to a single signal). Examples/points below reuse the\n // run resolved by the topics response so all three queries hit the same run.\n const {\n data: topicsData,\n isLoading: topicsLoading,\n isError: topicsError,\n } = useEntityTopics(resolvedEntity?.entityId, signalId);\n const topics = useMemo<EntityLearningTopic[]>(() => topicsData?.topics ?? [], [topicsData?.topics]);\n const runId = topicsData?.run?.runId;\n\n const topicSelectionScope = `${signalId ?? ''}:${entity?.entityId ?? ''}:${runId ?? ''}:${initialTopicId ?? ''}`;\n const chartSelectionScope = `${signalId ?? ''}:${entity?.entityId ?? ''}:${runId ?? ''}`;\n const topicIds = useMemo(() => topics.map(topic => topic.topicId), [topics]);\n const topicIdSet = useMemo(() => new Set(topicIds), [topicIds]);\n const [selectedTopic, setSelectedTopic] = useState<{ scope: string; topicId: string | null }>(() => ({\n scope: topicSelectionScope,\n topicId: initialTopicId ?? null,\n }));\n const [selectedChartTopics, setSelectedChartTopics] = useState<{ scope: string; topicIds: string[] | null }>(() => ({\n scope: chartSelectionScope,\n topicIds: null,\n }));\n const [activeTab, setActiveTab] = useState<SignalTab>('trace-list');\n\n const requestedTopicId =\n selectedTopic.scope === topicSelectionScope ? selectedTopic.topicId : (initialTopicId ?? null);\n const resolvedTopicId = requestedTopicId && topicIdSet.has(requestedTopicId) ? requestedTopicId : topics[0]?.topicId;\n const selectedTopicData = topics.find(topic => topic.topicId === resolvedTopicId);\n const examplesEnabled = Boolean(resolvedEntity?.entityId && signalId && runId && selectedTopicData);\n const pointsEnabled = Boolean(resolvedEntity?.entityId && signalId && runId);\n const chartTopicIds =\n selectedChartTopics.scope === chartSelectionScope && selectedChartTopics.topicIds\n ? selectedChartTopics.topicIds.filter(topicId => topicIdSet.has(topicId))\n : topicIds;\n\n const {\n data: examplesData,\n isLoading: examplesLoading,\n isFetching: examplesFetching,\n isError: examplesError,\n } = useEntityTopicExamples(\n resolvedEntity?.entityId,\n selectedTopicData?.topicId,\n examplesEnabled && runId && signalId ? { signalName: signalId, runId } : undefined,\n );\n const examples: EntityLearningTopicExample[] = examplesData?.examples ?? [];\n // Show the skeleton on the first load and while switching topics refetches,\n // so the trace list never flashes the empty-state copy between datasets.\n const examplesPending = examplesLoading || (examplesFetching && examplesData === undefined);\n\n const { data: pointsData, isError: pointsError } = useEntityPoints(\n resolvedEntity?.entityId,\n pointsEnabled && runId && signalId ? { signalName: signalId, runId, includeOutliers: true } : undefined,\n );\n const points: EntityLearningPoint[] = pointsData?.points ?? [];\n\n const handleTraceSelect = (traceId: string) => {\n if (!signalId) return;\n onTraceSelect(signalId, traceId);\n };\n\n const handleTopicSelect = (topicId: string) => {\n setSelectedTopic({ scope: topicSelectionScope, topicId });\n };\n\n const handleChartTopicToggle = (topicId: string) => {\n setSelectedChartTopics(current => {\n const base = current.scope === chartSelectionScope && current.topicIds ? current.topicIds : topicIds;\n return {\n scope: chartSelectionScope,\n topicIds: base.includes(topicId) ? base.filter(id => id !== topicId) : [...base, topicId],\n };\n });\n };\n\n if (entitiesLoading || topicsLoading) {\n return (\n <SignalsLayout sidebar={null}>\n <SignalDetailsSkeleton />\n </SignalsLayout>\n );\n }\n\n if (entitiesError || topicsError || (examplesEnabled && examplesError) || (pointsEnabled && pointsError)) {\n return (\n <SignalsLayout sidebar={null}>\n <p className=\"text-ui-md text-accent2\">Failed to load this signal from the observability endpoint.</p>\n </SignalsLayout>\n );\n }\n\n if (!resolvedEntity || !selectedTopicData) {\n return <SignalsLayout sidebar={null}>Signal not found</SignalsLayout>;\n }\n\n const signalName = getSignalCatalogEntry(signalId ?? '').name;\n\n return (\n <SignalsLayout sidebar={null} tracePanel={activeTab === 'trace-list' ? tracePanel : undefined}>\n <section className=\"flex h-full min-w-0 flex-col gap-4\">\n <header className=\"space-y-1\">\n <h1 className=\"text-icon-xl font-semibold text-neutral6\">{signalName}</h1>\n <p className=\"text-ui-sm text-neutral3\">Explore trace patterns by cluster.</p>\n </header>\n <div className=\"min-h-0 flex-1 overflow-hidden\">\n <SignalClusterTabs\n topics={topics}\n examples={examples}\n examplesLoading={examplesPending}\n points={points}\n selectedTopicId={selectedTopicData.topicId}\n selectedTraceId={selectedTraceId}\n selectedChartTopicIds={chartTopicIds}\n activeTab={activeTab}\n onActiveTabChange={setActiveTab}\n onTopicSelect={handleTopicSelect}\n onChartTopicToggle={handleChartTopicToggle}\n onTraceSelect={handleTraceSelect}\n />\n </div>\n </section>\n </SignalsLayout>\n );\n}\n"],"names":["TopicTraceDetailsPanel","TopicsLayout","jsx","jsxs","cn","Skeleton","useState","useMemo","InputGroup","InputGroupAddon","SearchIcon","InputGroupInput","DataList","Button","ScatterPlotChart","Tabs","TabList","Tab","TabContent","useEntities","useEntityTopics","useEntityTopicExamples","useEntityPoints","getSignalCatalogEntry"],"mappings":";;;;;;;;;;;;;;;;;;;;AAgBO,MAAM,uBAAA,GAA0BA;AACvC,MAAM,aAAA,GAAgBC,8CAAA;AAItB,SAAS,aAAa,OAAA,EAAiB;AACrC,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,IAAA,GAAO,OAAA,CAAQ,UAAA,CAAW,CAAC,CAAA,IAAA,CAAM,QAAQ,CAAA,IAAK,IAAA,CAAA;AAC9C,IAAA,IAAA,GAAO,IAAA,GAAO,IAAA;AAAA,EAChB;AAEA,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,OAAO,CAAA,GAAI,GAAA;AACvC,EAAA,OAAO,OAAO,GAAG,CAAA,WAAA,CAAA;AACnB;AAUO,SAAS,oBAAA,CAAqB;AAAA,EACnC,MAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,SAAA,GAAY;AACd,CAAA,EAA8B;AAC5B,EAAA,uBACEC,cAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,4EAAA;AAAA,MACV,YAAA,EAAY,SAAA;AAAA,MAEZ,QAAA,kBAAAA,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,WAAA,EAAY,IAAA,EAAM,WAAW,OAAA,GAAU,MAAA,EAClD,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,KAAS;AACnB,QAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA;AACxD,QAAA,sCACG,IAAA,EAAA,EACC,QAAA,kBAAAA,cAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,IAAA,EAAM,WAAW,UAAA,GAAa,MAAA;AAAA,YAC9B,cAAA,EAAc,WAAW,QAAA,GAAW,MAAA;AAAA,YACpC,cAAA,EAAc,WAAW,MAAA,GAAY,QAAA;AAAA,YACrC,SAAA,EAAU,6NAAA;AAAA,YACV,OAAA,EAAS,MAAM,aAAA,CAAc,KAAA,CAAM,OAAO,CAAA;AAAA,YAE1C,QAAA,kBAAAC,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EACd,QAAA,EAAA;AAAA,8BAAAD,cAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,WAAWE,WAAA,CAAG,sCAAA,EAAwC,QAAA,IAAY,CAAC,YAAY,WAAW,CAAA;AAAA,kBAC1F,OAAO,EAAE,eAAA,EAAiB,YAAA,CAAa,KAAA,CAAM,OAAO,CAAA;AAAE;AAAA,eACxD;AAAA,8BACAD,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EACd,QAAA,EAAA;AAAA,gCAAAD,cAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAWE,WAAA;AAAA,sBACT,2BAAA;AAAA,sBACA,QAAA,IAAY,CAAC,QAAA,GAAW,eAAA,GAAkB;AAAA,qBAC5C;AAAA,oBAEC,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA,iBACT;AAAA,gCACAF,cAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAWE,WAAA;AAAA,sBACT,4BAAA;AAAA,sBACA,QAAA,IAAY,CAAC,QAAA,GAAW,eAAA,GAAkB;AAAA,qBAC5C;AAAA,oBAEC,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA;AACT,eAAA,EACF;AAAA,aAAA,EACF;AAAA;AAAA,SACF,EAAA,EAjCO,MAAM,OAkCf,CAAA;AAAA,MAEJ,CAAC,CAAA,EACH;AAAA;AAAA,GACF;AAEJ;AAEA,SAAS,uBAAA,CAAwB,EAAE,IAAA,GAAO,CAAA,EAAE,EAAsB;AAChE,EAAA,uBACEF,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,YAAA,EAAW,kBAAiB,WAAA,EAAU,MAAA,EACxE,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAM,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,KAAA,qBACpCA,cAAA,CAACG,iBAAA,EAAA,EAAqB,SAAA,EAAU,uBAAA,EAAA,EAAjB,KAAyC,CACzD,CAAA,EACH,CAAA;AAEJ;AAEA,SAAS,4BAAA,CAA6B,EAAE,IAAA,GAAO,CAAA,EAAE,EAAsB;AACrE,EAAA,uBACEH,cAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,4EAAA,EAA6E,aAAA,EAAY,QACxG,QAAA,kBAAAA,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,WAAA,EACX,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI,CAAC,GAAG,KAAA,qBACpCC,eAAA,CAAC,IAAA,EAAA,EAAe,SAAA,EAAU,kCAAA,EACxB,QAAA,EAAA;AAAA,oBAAAD,cAAA,CAACG,iBAAA,EAAA,EAAS,WAAU,sCAAA,EAAuC,CAAA;AAAA,oBAC3DF,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,cAAA,CAACG,iBAAA,EAAA,EAAS,WAAU,WAAA,EAAY,CAAA;AAAA,sBAChCH,cAAA,CAACG,iBAAA,EAAA,EAAS,SAAA,EAAU,YAAA,EAAa;AAAA,KAAA,EACnC;AAAA,GAAA,EAAA,EALO,KAMT,CACD,CAAA,EACH,CAAA,EACF,CAAA;AAEJ;AAEA,SAAS,qBAAA,GAAwB;AAC/B,EAAA,uCACG,SAAA,EAAA,EAAQ,SAAA,EAAU,sCAAqC,YAAA,EAAW,gBAAA,EAAiB,aAAU,MAAA,EAC5F,QAAA,EAAA;AAAA,oBAAAF,eAAA,CAAC,QAAA,EAAA,EAAO,WAAU,WAAA,EAChB,QAAA,EAAA;AAAA,sBAAAD,cAAA,CAACG,iBAAA,EAAA,EAAS,WAAU,UAAA,EAAW,CAAA;AAAA,sBAC/BH,cAAA,CAACG,iBAAA,EAAA,EAAS,SAAA,EAAU,UAAA,EAAW;AAAA,KAAA,EACjC,CAAA;AAAA,oBACAF,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,cAAA,CAACG,iBAAA,EAAA,EAAS,WAAU,eAAA,EAAgB,CAAA;AAAA,sBACpCH,cAAA,CAACG,iBAAA,EAAA,EAAS,SAAA,EAAU,eAAA,EAAgB;AAAA,KAAA,EACtC,CAAA;AAAA,oBACAF,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,cAAA,CAAC,4BAAA,EAAA,EAA6B,CAAA;AAAA,sBAC9BC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,cAAA,CAACG,iBAAA,EAAA,EAAS,WAAU,uBAAA,EAAwB,CAAA;AAAA,uCAC3C,uBAAA,EAAA,EAAwB;AAAA,OAAA,EAC3B;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,kBAAA,CAAmB;AAAA,EACjC,QAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,QAAA,GAAW;AACb,CAAA,EAMG;AACD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIC,eAAS,EAAE,CAAA;AACvC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAAS,CAAC,CAAA;AAElC,EAAA,MAAM,QAAA,GAAWC,cAAQ,MAAM;AAC7B,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,EAAK,CAAE,WAAA,EAAY;AACxC,IAAA,IAAI,CAAC,OAAO,OAAO,QAAA;AACnB,IAAA,OAAO,QAAA,CAAS,OAAO,CAAA,OAAA,KAAW,OAAA,CAAQ,WAAW,WAAA,EAAY,CAAE,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,EACpF,CAAA,EAAG,CAAC,QAAA,EAAU,MAAM,CAAC,CAAA;AAErB,EAAA,MAAM,OAAA,GAAUA,aAAA,CAAQ,MAAM,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,IAAA,GAAO,QAAQ,CAAA,EAAG,CAAC,QAAA,EAAU,IAAA,EAAM,QAAQ,CAAC,CAAA;AAC5F,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,GAAS,QAAA,CAAS,MAAA;AAE1C,EAAA,uBACEJ,eAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,oCAAA,EAAqC,cAAW,uBAAA,EACjE,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAACK,qBAAA,EAAA,EAAW,SAAQ,SAAA,EAClB,QAAA,EAAA;AAAA,sBAAAN,cAAA,CAACO,0BAAA,EAAA,EAAgB,KAAA,EAAM,cAAA,EACrB,QAAA,kBAAAP,cAAA,CAACQ,0BAAW,CAAA,EACd,CAAA;AAAA,sBACAR,cAAA;AAAA,QAACS,0BAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAW,eAAA;AAAA,UACX,WAAA,EAAY,eAAA;AAAA,UACZ,UAAU,CAAA,KAAA,KAAS;AACjB,YAAA,SAAA,CAAU,KAAA,CAAM,OAAO,KAAK,CAAA;AAC5B,YAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,UACX;AAAA;AAAA;AACF,KAAA,EACF,CAAA;AAAA,oBAEAR,eAAA;AAAA,MAACS,iBAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,mBAAA;AAAA,QACR,SAAA,EAAU,oEAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAV,cAAA,CAACU,iBAAA,CAAS,GAAA,EAAT,EACC,QAAA,kBAAAV,cAAA,CAACU,iBAAA,CAAS,QAAA,EAAT,EACC,QAAA,kBAAAV,cAAA,CAACU,iBAAA,CAAS,OAAA,EAAT,EAAiB,QAAA,EAAA,eAAA,EAAa,GACjC,CAAA,EACF,CAAA;AAAA,UAEC,0BACCV,cAAA,CAAC,uBAAA,EAAA,EAAwB,CAAA,GACvB,OAAA,CAAQ,WAAW,CAAA,mBACrBA,cAAA,CAACU,iBAAA,CAAS,OAAA,EAAT,EAAiB,OAAA,EAAQ,gCAAA,EAAiC,CAAA,GAE3D,OAAA,CAAQ,IAAI,CAAA,OAAA,qBACVV,cAAA;AAAA,YAACU,iBAAA,CAAS,SAAA;AAAA,YAAT;AAAA,cAEC,QAAA,EAAU,oBAAoB,OAAA,CAAQ,OAAA;AAAA,cACtC,OAAA,EAAS,MAAM,aAAA,CAAc,OAAA,CAAQ,OAAO,CAAA;AAAA,cAC5C,cAAA,EAAc,oBAAoB,OAAA,CAAQ,OAAA;AAAA,cAE1C,QAAA,kBAAAV,cAAA,CAACU,iBAAA,CAAS,QAAA,EAAT,EAAmB,kBAAQ,UAAA,EAAW;AAAA,aAAA;AAAA,YALlC,OAAA,CAAQ;AAAA,WAOhB;AAAA;AAAA;AAAA,KAEL;AAAA,IAEC,OAAA,IAAW,CAAC,OAAA,mBACXT,eAAA,CAACU,iBAAO,OAAA,EAAQ,SAAA,EAAU,IAAA,EAAK,IAAA,EAAK,SAAS,MAAM,OAAA,CAAQ,CAAA,WAAA,KAAe,WAAA,GAAc,CAAC,CAAA,EAAG,QAAA,EAAA;AAAA,MAAA,oBAAA;AAAA,MACvE,OAAA,CAAQ,MAAA;AAAA,MAAO,MAAA;AAAA,MAAK,QAAA,CAAS,MAAA;AAAA,MAAO;AAAA,KAAA,EACzD,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AASO,SAAS,eAAe,EAAE,MAAA,EAAQ,MAAA,EAAQ,gBAAA,EAAkB,eAAc,EAAwB;AACvG,EAAA,MAAM,SAAA,GAAYN,aAAA;AAAA,IAChB,MACE,MAAA,CAEG,MAAA;AAAA,MACC,CAAC,UACC,KAAA,CAAM,OAAA,KAAY,UAAa,gBAAA,CAAiB,QAAA,CAAS,MAAM,OAAO;AAAA,KAC1E,CACC,GAAA,CAAI,CAAA,KAAA,MAAU,EAAE,GAAG,KAAA,EAAO,KAAA,EAAO,YAAA,CAAa,KAAA,CAAM,OAAO,CAAA,EAAE,CAAE,CAAA;AAAA,IACpE,CAAC,QAAQ,gBAAgB;AAAA,GAC3B;AAEA,EAAA,uBACEJ,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,oBAAAD,cAAA;AAAA,MAAC,oBAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,gBAAA;AAAA,QACA,aAAA,EAAe,aAAA;AAAA,QACf,QAAA,EAAQ,IAAA;AAAA,QACR,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBACAA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,kBAAAA,cAAA;AAAA,MAACY,iCAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAK,GAAA;AAAA,QACL,OAAA,EAAQ,SAAA;AAAA,QACR,QAAA,EAAS,OAAA;AAAA,QACT,MAAA,EAAO,MAAA;AAAA,QACP,SAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAO,GAAA;AAAA,QACP,MAAA,EAAO;AAAA;AAAA,KACT,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAiBO,SAAS,iBAAA,CAAkB;AAAA,EAChC,MAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,qBAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,uBACEX,eAAA;AAAA,IAACY,YAAA;AAAA,IAAA;AAAA,MACC,UAAA,EAAW,YAAA;AAAA,MACX,KAAA,EAAO,SAAA;AAAA,MACP,aAAA,EAAe,iBAAA;AAAA,MACf,SAAA,EAAU,8CAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAZ,eAAA,CAACa,eAAA,EAAA,EAAQ,SAAQ,MAAA,EACf,QAAA,EAAA;AAAA,0BAAAd,cAAA,CAACe,WAAA,EAAA,EAAI,KAAA,EAAM,YAAA,EAAa,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,0BAClCf,cAAA,CAACe,WAAA,EAAA,EAAI,KAAA,EAAM,OAAA,EAAQ,QAAA,EAAA,OAAA,EAAK;AAAA,SAAA,EAC1B,CAAA;AAAA,wBACAf,cAAA,CAACgB,0BAAW,KAAA,EAAM,YAAA,EAAa,WAAU,qCAAA,EACvC,QAAA,kBAAAf,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,cAAA,CAAC,wBAAqB,MAAA,EAAgB,gBAAA,EAAkB,CAAC,eAAe,GAAG,aAAA,EAA8B,CAAA;AAAA,0BACzGA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACb,QAAA,kBAAAA,cAAA;AAAA,YAAC,kBAAA;AAAA,YAAA;AAAA,cACC,QAAA;AAAA,cACA,OAAA,EAAS,eAAA;AAAA,cACT,eAAA;AAAA,cACA;AAAA;AAAA,WACF,EACF;AAAA,SAAA,EACF,CAAA,EACF,CAAA;AAAA,wBACAA,cAAA,CAACgB,sBAAA,EAAA,EAAW,KAAA,EAAM,OAAA,EAAQ,WAAU,qCAAA,EAClC,QAAA,kBAAAhB,cAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,MAAA;AAAA,YACA,MAAA;AAAA,YACA,gBAAA,EAAkB,qBAAA;AAAA,YAClB,aAAA,EAAe;AAAA;AAAA,SACjB,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAWO,SAAS,iBAAA,CAAkB;AAAA,EAChC,QAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,MAAM,EAAE,IAAA,EAAM,QAAA,GAAW,EAAC,EAAG,WAAW,eAAA,EAAiB,OAAA,EAAS,aAAA,EAAc,GAAIiB,8CAAA,EAAY;AAChG,EAAA,MAAM,iBAAiB,QAAA,CAAS,IAAA,CAAK,UAAQ,IAAA,CAAK,QAAA,KAAa,QAAQ,QAAQ,CAAA;AAK/E,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,UAAA;AAAA,IACN,SAAA,EAAW,aAAA;AAAA,IACX,OAAA,EAAS;AAAA,GACX,GAAIC,kDAAA,CAAgB,cAAA,EAAgB,QAAA,EAAU,QAAQ,CAAA;AACtD,EAAA,MAAM,MAAA,GAASb,aAAA,CAA+B,MAAM,UAAA,EAAY,MAAA,IAAU,EAAC,EAAG,CAAC,UAAA,EAAY,MAAM,CAAC,CAAA;AAClG,EAAA,MAAM,KAAA,GAAQ,YAAY,GAAA,EAAK,KAAA;AAE/B,EAAA,MAAM,mBAAA,GAAsB,CAAA,EAAG,QAAA,IAAY,EAAE,CAAA,CAAA,EAAI,MAAA,EAAQ,QAAA,IAAY,EAAE,CAAA,CAAA,EAAI,KAAA,IAAS,EAAE,CAAA,CAAA,EAAI,kBAAkB,EAAE,CAAA,CAAA;AAC9G,EAAA,MAAM,mBAAA,GAAsB,CAAA,EAAG,QAAA,IAAY,EAAE,CAAA,CAAA,EAAI,QAAQ,QAAA,IAAY,EAAE,CAAA,CAAA,EAAI,KAAA,IAAS,EAAE,CAAA,CAAA;AACtF,EAAA,MAAM,QAAA,GAAWA,aAAA,CAAQ,MAAM,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAC3E,EAAA,MAAM,UAAA,GAAaA,cAAQ,MAAM,IAAI,IAAI,QAAQ,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAC9D,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAID,eAAoD,OAAO;AAAA,IACnG,KAAA,EAAO,mBAAA;AAAA,IACP,SAAS,cAAA,IAAkB;AAAA,GAC7B,CAAE,CAAA;AACF,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAIA,eAAuD,OAAO;AAAA,IAClH,KAAA,EAAO,mBAAA;AAAA,IACP,QAAA,EAAU;AAAA,GACZ,CAAE,CAAA;AACF,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAoB,YAAY,CAAA;AAElE,EAAA,MAAM,mBACJ,aAAA,CAAc,KAAA,KAAU,mBAAA,GAAsB,aAAA,CAAc,UAAW,cAAA,IAAkB,IAAA;AAC3F,EAAA,MAAM,eAAA,GAAkB,oBAAoB,UAAA,CAAW,GAAA,CAAI,gBAAgB,CAAA,GAAI,gBAAA,GAAmB,MAAA,CAAO,CAAC,CAAA,EAAG,OAAA;AAC7G,EAAA,MAAM,oBAAoB,MAAA,CAAO,IAAA,CAAK,CAAA,KAAA,KAAS,KAAA,CAAM,YAAY,eAAe,CAAA;AAChF,EAAA,MAAM,kBAAkB,OAAA,CAAQ,cAAA,EAAgB,QAAA,IAAY,QAAA,IAAY,SAAS,iBAAiB,CAAA;AAClG,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,cAAA,EAAgB,QAAA,IAAY,YAAY,KAAK,CAAA;AAC3E,EAAA,MAAM,aAAA,GACJ,mBAAA,CAAoB,KAAA,KAAU,mBAAA,IAAuB,oBAAoB,QAAA,GACrE,mBAAA,CAAoB,QAAA,CAAS,MAAA,CAAO,CAAA,OAAA,KAAW,UAAA,CAAW,GAAA,CAAI,OAAO,CAAC,CAAA,GACtE,QAAA;AAEN,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,YAAA;AAAA,IACN,SAAA,EAAW,eAAA;AAAA,IACX,UAAA,EAAY,gBAAA;AAAA,IACZ,OAAA,EAAS;AAAA,GACX,GAAIe,yDAAA;AAAA,IACF,cAAA,EAAgB,QAAA;AAAA,IAChB,iBAAA,EAAmB,OAAA;AAAA,IACnB,mBAAmB,KAAA,IAAS,QAAA,GAAW,EAAE,UAAA,EAAY,QAAA,EAAU,OAAM,GAAI;AAAA,GAC3E;AACA,EAAA,MAAM,QAAA,GAAyC,YAAA,EAAc,QAAA,IAAY,EAAC;AAG1E,EAAA,MAAM,eAAA,GAAkB,eAAA,IAAoB,gBAAA,IAAoB,YAAA,KAAiB,MAAA;AAEjF,EAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAY,OAAA,EAAS,aAAY,GAAIC,kDAAA;AAAA,IACjD,cAAA,EAAgB,QAAA;AAAA,IAChB,aAAA,IAAiB,SAAS,QAAA,GAAW,EAAE,YAAY,QAAA,EAAU,KAAA,EAAO,eAAA,EAAiB,IAAA,EAAK,GAAI;AAAA,GAChG;AACA,EAAA,MAAM,MAAA,GAAgC,UAAA,EAAY,MAAA,IAAU,EAAC;AAE7D,EAAA,MAAM,iBAAA,GAAoB,CAAC,OAAA,KAAoB;AAC7C,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,aAAA,CAAc,UAAU,OAAO,CAAA;AAAA,EACjC,CAAA;AAEA,EAAA,MAAM,iBAAA,GAAoB,CAAC,OAAA,KAAoB;AAC7C,IAAA,gBAAA,CAAiB,EAAE,KAAA,EAAO,mBAAA,EAAqB,OAAA,EAAS,CAAA;AAAA,EAC1D,CAAA;AAEA,EAAA,MAAM,sBAAA,GAAyB,CAAC,OAAA,KAAoB;AAClD,IAAA,sBAAA,CAAuB,CAAA,OAAA,KAAW;AAChC,MAAA,MAAM,OAAO,OAAA,CAAQ,KAAA,KAAU,uBAAuB,OAAA,CAAQ,QAAA,GAAW,QAAQ,QAAA,GAAW,QAAA;AAC5F,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,mBAAA;AAAA,QACP,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,OAAO,IAAI,IAAA,CAAK,MAAA,CAAO,CAAA,EAAA,KAAM,EAAA,KAAO,OAAO,CAAA,GAAI,CAAC,GAAG,MAAM,OAAO;AAAA,OAC1F;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,IAAI,mBAAmB,aAAA,EAAe;AACpC,IAAA,sCACG,aAAA,EAAA,EAAc,OAAA,EAAS,IAAA,EACtB,QAAA,kBAAApB,cAAA,CAAC,yBAAsB,CAAA,EACzB,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,aAAA,IAAiB,WAAA,IAAgB,eAAA,IAAmB,aAAA,IAAmB,iBAAiB,WAAA,EAAc;AACxG,IAAA,uBACEA,cAAA,CAAC,iBAAc,OAAA,EAAS,IAAA,EACtB,yCAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,6DAAA,EAA2D,CAAA,EACpG,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,CAAC,cAAA,IAAkB,CAAC,iBAAA,EAAmB;AACzC,IAAA,uBAAOA,cAAA,CAAC,aAAA,EAAA,EAAc,OAAA,EAAS,IAAA,EAAM,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,EACvD;AAEA,EAAA,MAAM,UAAA,GAAaqB,4CAAA,CAAsB,QAAA,IAAY,EAAE,CAAA,CAAE,IAAA;AAEzD,EAAA,uBACErB,cAAA,CAAC,aAAA,EAAA,EAAc,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,SAAA,KAAc,YAAA,GAAe,UAAA,GAAa,MAAA,EAClF,QAAA,kBAAAC,eAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,oCAAA,EACjB,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,QAAA,EAAA,EAAO,WAAU,WAAA,EAChB,QAAA,EAAA;AAAA,sBAAAD,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,0CAAA,EAA4C,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,sBACrEA,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0BAAA,EAA2B,QAAA,EAAA,oCAAA,EAAkC;AAAA,KAAA,EAC5E,CAAA;AAAA,oBACAA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACb,QAAA,kBAAAA,cAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,QAAA;AAAA,QACA,eAAA,EAAiB,eAAA;AAAA,QACjB,MAAA;AAAA,QACA,iBAAiB,iBAAA,CAAkB,OAAA;AAAA,QACnC,eAAA;AAAA,QACA,qBAAA,EAAuB,aAAA;AAAA,QACvB,SAAA;AAAA,QACA,iBAAA,EAAmB,YAAA;AAAA,QACnB,aAAA,EAAe,iBAAA;AAAA,QACf,kBAAA,EAAoB,sBAAA;AAAA,QACpB,aAAA,EAAe;AAAA;AAAA,KACjB,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"signal-details-page.cjs.js","sources":["../../../../src/ee/signals/components/signal-details-page.tsx"],"sourcesContent":["import { SearchIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { Button } from '../../../ds/components/Button';\nimport { DataList } from '../../../ds/components/DataList/data-list';\nimport { InputGroup, InputGroupAddon, InputGroupInput } from '../../../ds/components/InputGroup';\nimport { Skeleton } from '../../../ds/components/Skeleton';\nimport { cn } from '../../../lib/utils';\nimport { TopicTraceDetailsPanel, TopicsLayout } from '../../topics';\nimport { useEntities, useEntityTopicExamples, useEntityTopics } from '../hooks';\nimport type { EntityLearningTopic, EntityLearningTopicExample } from '../services';\nimport { getSignalCatalogEntry } from '../signals-data';\nimport type { SelectedEntity } from '../types';\n\nexport const SignalTraceDetailsPanel = TopicTraceDetailsPanel;\nconst SignalsLayout = TopicsLayout;\n\nfunction clusterColor(topicId: string) {\n let hash = 0;\n for (let i = 0; i < topicId.length; i++) {\n hash = topicId.charCodeAt(i) + ((hash << 5) - hash);\n hash = hash & hash;\n }\n // Multiply by the golden-angle so close ids (e.g. \"1\",\"2\",\"3\") map to well-separated hues.\n const hue = Math.abs(hash * 137.508) % 360;\n return `hsl(${hue}, 70%, 55%)`;\n}\n\ninterface SignalClusterSidebarProps {\n topics: EntityLearningTopic[];\n selectedTopicIds: string[];\n onTopicSelect: (topicId: string) => void;\n multiple?: boolean;\n ariaLabel?: string;\n}\n\nexport function SignalClusterSidebar({\n topics,\n selectedTopicIds,\n onTopicSelect,\n multiple = false,\n ariaLabel = 'Signal clusters',\n}: SignalClusterSidebarProps) {\n return (\n <aside\n className=\"min-h-0 w-72 shrink-0 overflow-y-auto border-r border-border1/60 pr-4 py-4\"\n aria-label={ariaLabel}\n >\n <ul className=\"space-y-1\" role={multiple ? 'group' : undefined}>\n {topics.map(topic => {\n const selected = selectedTopicIds.includes(topic.topicId);\n return (\n <li key={topic.topicId}>\n <button\n type=\"button\"\n role={multiple ? 'checkbox' : undefined}\n aria-checked={multiple ? selected : undefined}\n aria-pressed={multiple ? undefined : selected}\n className=\"group cursor-pointer w-full rounded-xl px-3 py-2 text-left transition-colors hover:bg-surface3 aria-pressed:bg-surface3 aria-checked:bg-surface3 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent1\"\n onClick={() => onTopicSelect(topic.topicId)}\n >\n <span className=\"flex items-start gap-2\">\n <span\n className={cn('mt-1.5 h-2 w-2 shrink-0 rounded-full', multiple && !selected && 'invisible')}\n style={{ backgroundColor: clusterColor(topic.topicId) }}\n />\n <span className=\"min-w-0 space-y-1\">\n <span\n className={cn(\n 'block text-sm font-medium',\n multiple && !selected ? 'text-neutral3' : 'text-neutral5',\n )}\n >\n {topic.name}\n </span>\n <span\n className={cn(\n 'line-clamp-2 block text-sm',\n multiple && !selected ? 'text-neutral1' : 'text-neutral2',\n )}\n >\n {topic.description}\n </span>\n </span>\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n </aside>\n );\n}\n\nfunction SignalTraceListSkeleton({ rows = 8 }: { rows?: number }) {\n return (\n <div className=\"space-y-1 px-2 py-1\" aria-label=\"Loading traces\" aria-busy=\"true\">\n {Array.from({ length: rows }).map((_, index) => (\n <Skeleton key={index} className=\"h-9 w-full rounded-lg\" />\n ))}\n </div>\n );\n}\n\nfunction SignalClusterSidebarSkeleton({ rows = 5 }: { rows?: number }) {\n return (\n <aside className=\"min-h-0 w-72 shrink-0 overflow-y-auto border-r border-border1/60 pr-4 py-4\" aria-hidden=\"true\">\n <ul className=\"space-y-1\">\n {Array.from({ length: rows }).map((_, index) => (\n <li key={index} className=\"flex items-start gap-2 px-3 py-2\">\n <Skeleton className=\"mt-1.5 h-2 w-2 shrink-0 rounded-full\" />\n <div className=\"min-w-0 flex-1 space-y-1.5\">\n <Skeleton className=\"h-4 w-1/2\" />\n <Skeleton className=\"h-3 w-full\" />\n </div>\n </li>\n ))}\n </ul>\n </aside>\n );\n}\n\nfunction SignalDetailsSkeleton() {\n return (\n <section className=\"flex h-full min-w-0 flex-col gap-4\" aria-label=\"Loading signal\" aria-busy=\"true\">\n <header className=\"space-y-2\">\n <Skeleton className=\"h-7 w-48\" />\n <Skeleton className=\"h-4 w-64\" />\n </header>\n <div className=\"flex min-h-0 flex-1 gap-6 overflow-hidden\">\n <SignalClusterSidebarSkeleton />\n <div className=\"min-w-0 flex-1 space-y-4 py-4\">\n <Skeleton className=\"h-9 w-full rounded-lg\" />\n <SignalTraceListSkeleton />\n </div>\n </div>\n </section>\n );\n}\n\nexport function SignalTraceListTab({\n examples,\n selectedTraceId,\n onTraceSelect,\n loading = false,\n pageSize = 25,\n}: {\n examples: EntityLearningTopicExample[];\n selectedTraceId: string | null;\n onTraceSelect: (traceId: string) => void;\n loading?: boolean;\n pageSize?: number;\n}) {\n const [search, setSearch] = useState('');\n const [page, setPage] = useState(1);\n\n const filtered = useMemo(() => {\n const query = search.trim().toLowerCase();\n if (!query) return examples;\n return examples.filter(example => example.signalText.toLowerCase().includes(query));\n }, [examples, search]);\n\n const visible = useMemo(() => filtered.slice(0, page * pageSize), [filtered, page, pageSize]);\n const hasMore = visible.length < filtered.length;\n\n return (\n <section\n className=\"grid grid-rows-[auto_1fr] min-h-0 gap-4 h-full overflow-y-auto\"\n aria-label=\"Topic trace summaries\"\n >\n <InputGroup variant=\"outline\">\n <InputGroupAddon align=\"inline-start\">\n <SearchIcon />\n </InputGroupAddon>\n <InputGroupInput\n type=\"search\"\n aria-label=\"Search traces\"\n placeholder=\"Search traces\"\n onChange={event => {\n setSearch(event.target.value);\n setPage(1);\n }}\n />\n </InputGroup>\n\n <DataList\n columns=\"minmax(12rem,1fr)\"\n className=\"min-h-0 h-full overflow-y-auto rounded-lg border border-border1/60\"\n >\n <DataList.Top>\n <DataList.TopCells>\n <DataList.TopCell>Trace summary</DataList.TopCell>\n </DataList.TopCells>\n </DataList.Top>\n\n {loading ? (\n <SignalTraceListSkeleton />\n ) : visible.length === 0 ? (\n <DataList.NoMatch message=\"No traces match this subtopic.\" />\n ) : (\n visible.map(example => (\n <DataList.RowButton\n key={example.exampleId}\n featured={selectedTraceId === example.traceId}\n onClick={() => onTraceSelect(example.traceId)}\n aria-pressed={selectedTraceId === example.traceId}\n >\n <DataList.TextCell>{example.signalText}</DataList.TextCell>\n </DataList.RowButton>\n ))\n )}\n </DataList>\n\n {hasMore && !loading ? (\n <Button variant=\"outline\" size=\"sm\" onClick={() => setPage(currentPage => currentPage + 1)}>\n Load more traces ({visible.length} of {filtered.length})\n </Button>\n ) : null}\n </section>\n );\n}\n\ninterface SignalClusterTraceListProps {\n topics: EntityLearningTopic[];\n examples: EntityLearningTopicExample[];\n examplesLoading: boolean;\n selectedTopicId: string;\n selectedTraceId: string | null;\n onTopicSelect: (topicId: string) => void;\n onTraceSelect: (traceId: string) => void;\n}\n\nexport function SignalClusterTraceList({\n topics,\n examples,\n examplesLoading,\n selectedTopicId,\n selectedTraceId,\n onTopicSelect,\n onTraceSelect,\n}: SignalClusterTraceListProps) {\n return (\n <div className=\"flex h-full min-w-0 gap-6 overflow-y-auto\">\n <SignalClusterSidebar topics={topics} selectedTopicIds={[selectedTopicId]} onTopicSelect={onTopicSelect} />\n <div className=\"min-w-0 flex-1 overflow-y-auto h-full py-4\">\n <SignalTraceListTab\n examples={examples}\n loading={examplesLoading}\n selectedTraceId={selectedTraceId}\n onTraceSelect={onTraceSelect}\n />\n </div>\n </div>\n );\n}\n\nexport interface SignalDetailsPageProps {\n signalId?: string;\n entity: SelectedEntity | null;\n selectedTraceId: string | null;\n initialTopicId?: string | null;\n tracePanel?: ReactNode;\n onTraceSelect: (signalId: string, traceId: string) => void;\n}\n\nexport function SignalDetailsPage({\n signalId,\n entity,\n selectedTraceId,\n initialTopicId,\n tracePanel,\n onTraceSelect,\n}: SignalDetailsPageProps) {\n const { data: entities = [], isLoading: entitiesLoading, isError: entitiesError } = useEntities();\n const resolvedEntity = entities.find(item => item.entityId === entity?.entityId);\n\n // No runId: the API resolves the latest run for this signal (the entity-wide\n // `latestRunId` belongs to a single signal). Examples below reuse the run\n // resolved by the topics response.\n const {\n data: topicsData,\n isLoading: topicsLoading,\n isError: topicsError,\n } = useEntityTopics(resolvedEntity?.entityId, signalId);\n const topics = useMemo<EntityLearningTopic[]>(() => topicsData?.topics ?? [], [topicsData?.topics]);\n const runId = topicsData?.run?.runId;\n\n const topicSelectionScope = `${signalId ?? ''}:${entity?.entityId ?? ''}:${runId ?? ''}:${initialTopicId ?? ''}`;\n const topicIds = useMemo(() => topics.map(topic => topic.topicId), [topics]);\n const topicIdSet = useMemo(() => new Set(topicIds), [topicIds]);\n const [selectedTopic, setSelectedTopic] = useState<{ scope: string; topicId: string | null }>(() => ({\n scope: topicSelectionScope,\n topicId: initialTopicId ?? null,\n }));\n\n const requestedTopicId =\n selectedTopic.scope === topicSelectionScope ? selectedTopic.topicId : (initialTopicId ?? null);\n const resolvedTopicId = requestedTopicId && topicIdSet.has(requestedTopicId) ? requestedTopicId : topics[0]?.topicId;\n const selectedTopicData = topics.find(topic => topic.topicId === resolvedTopicId);\n const examplesEnabled = Boolean(resolvedEntity?.entityId && signalId && runId && selectedTopicData);\n const {\n data: examplesData,\n isLoading: examplesLoading,\n isFetching: examplesFetching,\n isError: examplesError,\n } = useEntityTopicExamples(\n resolvedEntity?.entityId,\n selectedTopicData?.topicId,\n examplesEnabled && runId && signalId ? { signalName: signalId, runId } : undefined,\n );\n const examples: EntityLearningTopicExample[] = examplesData?.examples ?? [];\n // Show the skeleton on the first load and while switching topics refetches,\n // so the trace list never flashes the empty-state copy between datasets.\n const examplesPending = examplesLoading || (examplesFetching && examplesData === undefined);\n\n const handleTraceSelect = (traceId: string) => {\n if (!signalId) return;\n onTraceSelect(signalId, traceId);\n };\n\n const handleTopicSelect = (topicId: string) => {\n setSelectedTopic({ scope: topicSelectionScope, topicId });\n };\n\n if (entitiesLoading || topicsLoading) {\n return (\n <SignalsLayout sidebar={null}>\n <SignalDetailsSkeleton />\n </SignalsLayout>\n );\n }\n\n if (entitiesError || topicsError || (examplesEnabled && examplesError)) {\n return (\n <SignalsLayout sidebar={null}>\n <p className=\"text-ui-md text-accent2\">Failed to load this signal from the observability endpoint.</p>\n </SignalsLayout>\n );\n }\n\n if (!resolvedEntity || !selectedTopicData) {\n return <SignalsLayout sidebar={null}>Signal not found</SignalsLayout>;\n }\n\n const signalName = getSignalCatalogEntry(signalId ?? '').name;\n\n return (\n <SignalsLayout sidebar={null} tracePanel={tracePanel}>\n <section className=\"flex h-full min-w-0 flex-col gap-4\">\n <header className=\"space-y-1\">\n <h1 className=\"text-icon-xl font-semibold text-neutral6\">{signalName}</h1>\n <p className=\"text-ui-sm text-neutral3\">Explore trace patterns by cluster.</p>\n </header>\n <div className=\"min-h-0 flex-1 overflow-hidden\">\n <SignalClusterTraceList\n topics={topics}\n examples={examples}\n examplesLoading={examplesPending}\n selectedTopicId={selectedTopicData.topicId}\n selectedTraceId={selectedTraceId}\n onTopicSelect={handleTopicSelect}\n onTraceSelect={handleTraceSelect}\n />\n </div>\n </section>\n </SignalsLayout>\n );\n}\n"],"names":["TopicTraceDetailsPanel","TopicsLayout","jsx","jsxs","cn","Skeleton","useState","useMemo","InputGroup","InputGroupAddon","SearchIcon","InputGroupInput","DataList","Button","useEntities","useEntityTopics","useEntityTopicExamples","getSignalCatalogEntry"],"mappings":"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"}
|